$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOPRPN0 - MODULE 24>>                                                 00015000
<< HP32002C MPE SOURCE C.00.00 >>                                       00020000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00025000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00030000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00035000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00040000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00045000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00050000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00055000
                                                                        00060000
                                                                        00065000
                                                                        00070000
                                                                        00075000
                                                                        00080000
$CONTROL PRIVILEGED,UNCALLABLE                                          00085000
$THIRTY                                                                 00090000
$CONTROL MAIN=IOPRPN0                                          <<02698>>00095000
$TITLE "2894A PRINTING READER PUNCH DRIVER"                             00100000
$PAGE                                                          <<02698>>00105000
COMMENT                                                        <<02698>>00110000
            HP 3000 Printing Reader Punch Driver - IOPRPN0     <<02698>>00115000
            ----------------------------------------------     <<02698>>00120000
                                                               <<02698>>00125000
                                                               <<02698>>00130000
Operation of IOPRPN0:                                          <<02698>>00135000
                                                               <<02698>>00140000
IOPRPN0, together with the I/O  Device  Monitor  (SIODM)       <<02698>>00145000
constitute a standard MPE Type 1 I/O Driver/Monitor.           <<02698>>00150000
This means that it does not run in its own process, but        <<02698>>00155000
executes on any stack (including the Interrupt Control Stack)  <<02698>>00160000
and therefore must run to completion.  During initialization   <<02698>>00165000
it executes on PROGEN's stack, during request initiation it    <<02698>>00170000
executes on ATTACHIO's (user's) stack, and during interrupt    <<02698>>00175000
processing it executes on the Interrupt Control Stack (ICS).   <<02698>>00180000
                                                               <<02698>>00185000
IOPRPN0 consists of a global area, two procedure, and an       <<02698>>00190000
"outer block" which is really a linkage area for INITIAL.  The <<02698>>00195000
global area contains an array called INITIAL which is comprised<<02698>>00200000
of three parts. The first part specifies the size of the other <<02698>>00205000
two, the unit extract instruction, and various parameters which<<02698>>00210000
are used by INITIAL.  This section  is  deleted after INITIAL  <<02698>>00215000
is through with it.  The other two parts are the Device        <<02698>>00220000
Information Table (DIT) and the SIO Program area (SIOP),  which<<02698>>00225000
is part of the Interrupt Linkage Table (ILT).  INITIAL will put<<02698>>00230000
each of these items in the area of memory where it belongs. The<<02698>>00235000
linkage area specifies the procedure labels (P-labels) of the  <<02698>>00240000
associated monitor (SIODM), the request initiator (PRPCHDVR),  <<02698>>00245000
the  request completor (PRPCHDVR), and the interrupt handler   <<02698>>00250000
(GIP).                                                         <<02698>>00255000
                                                               <<02698>>00260000
The primary working code of IOPRPN0 is a procedure PRPCHDVR.   <<02698>>00265000
PRPCHDVR is called with six parameters. Two of these           <<02698>>00270000
parameters, BANK and BUFADR, are the absolute buffer address of<<02698>>00275000
the data to be processed. DRTN is the hardware address and     <<02698>>00280000
interrupt information area for the device. The other three,    <<02698>>00285000
DITP, IOQP, and SIOP are pointers to three tables. DITP is a   <<02698>>00290000
pointer to the Device Information Table which contains         <<02698>>00295000
information about its associated printing reader punch unit.   <<02698>>00300000
There is one DIT for unit on the controller and they contain   <<02698>>00305000
information which must be saved between I/O requests to the    <<02698>>00310000
driver. IOQP is a pointer to the Input/Output Queue element.   <<02698>>00315000
IOQ elements contain information relevant to the current       <<02698>>00320000
request. SIOP is a pointer to the first element of the SIO     <<02698>>00325000
program which is actually part of the Interrupt Linkage Table. <<02698>>00330000
PRPCHDVR utilizes the SIO program area as an auxiliary buffer  <<02698>>00335000
for read operation.                                            <<02698>>00340000
                                                               <<02698>>00345000
PRPCHDVR is always called by the I/O device monitor (SIODM)    <<02698>>00350000
and it determines the reason for the call by examining the IOQ <<02698>>00355000
and the DIT.  There are three basic parts of the driver, the   <<02698>>00360000
Common area, the Initiator and the Completor.                  <<02698>>00365000
The operation of each is discussed below.                      <<02698>>00370000
$PAGE                                                          <<02698>>00375000
IOPRPN0 Commom area:                                           <<02698>>00380000
                                                               <<02698>>00385000
This code is at the beginning of the driver and is executed any<<02698>>00390000
time the driver is "called." It performs housekeeping functions<<02698>>00395000
(sets up local variables, checks for abort or timeout          <<02698>>00400000
conditions).                                                   <<02698>>00405000
                                                               <<02698>>00410000
                                                               <<02698>>00415000
IOPRPN0 Initiator:                                             <<02698>>00420000
                                                               <<02698>>00425000
Execution begins here for either a new request or a retry/     <<02698>>00430000
continuation of the last request. If the request is a new one  <<02698>>00435000
counts and buffer offsets are initialized.  The main purpose of<<02698>>00440000
the Initiator is to initiate a card feed for READ, or,         <<02698>>00445000
to output PRINT/PUNCH data then feed a card for WRITE.         <<02698>>00450000
                                                               <<02698>>00455000
                                                               <<02698>>00460000
IOPRPN0 Completor:                                             <<02698>>00465000
                                                               <<02698>>00470000
The Completor section of the driver is entered as a result of  <<02698>>00475000
an external interrupt. The status condition of the last        <<02698>>00480000
interrupt is taken and then an analysis of this status is      <<02698>>00485000
performed and appropriate actions are taken. Finally either the<<02698>>00490000
request is completed and special notation is sent back to the  <<02698>>00495000
user or execution is resumed back at the Initiator to retry or <<02698>>00500000
complete the request. Actual data input will be done by this   <<02698>>00505000
section on read.                                               <<02698>>00510000
                                                               <<02698>>00515000
                                                               <<02698>>00520000
Default settings:                                              <<02698>>00525000
                                                               <<02698>>00530000
  READ:  Hopper#1 --> Stacker#1 --> Full                       <<02698>>00535000
                                                               <<02698>>00540000
  WRITE: Hopper#2 --> Stacker#2 --> Full                       <<02698>>00545000
                                                               <<02698>>00550000
  Spooler Header/Trailer WRITE                                 <<02698>>00555000
        Hopper#2 --> Stacker#2 -->                             <<02698>>00560000
                                                               <<02698>>00565000
  CLOSE (Eject card)                                           <<02698>>00570000
         Waiting Station --> Stacker#1                         <<02698>>00575000
                                                               <<02698>>00580000
                                                               <<02698>>00585000
                                                       /-------<<02698>>00590000
                                                       |Hopper|<<02698>>00595000
                                                       | #1   |<<02698>>00600000
                                                       --------<<02698>>00605000
                      ---------  --------- ---------       V   <<02698>>00610000
    ------------------|Print  |--|Punch  | |Waiting|--------   <<02698>>00615000
    V          V      |Station|  |Station| |Station|       ^   <<02698>>00620000
/--------  /--------  ---------  --------- ---------   /-------<<02698>>00625000
|Stacker|  |Stacker|                                   |Hopper|<<02698>>00630000
| #2    |  | #1    |                                   | #2   |<<02698>>00635000
---------  ---------                                   --------<<02698>>00640000
$PAGE                                                          <<02698>>00645000
                                                               <<02698>>00650000
THE FOLLOWING INFORMATION IS PERTINENT TO CONFIGURING THE      <<02698>>00655000
DEVICE INTO AN HP3000 COMPUTER SYSTEM.                         <<02698>>00660000
                                                               <<02698>>00665000
DEVICE TYPE    = 22                                            <<02698>>00670000
DEVICE SUBTYPE = 0 (80 column card)                            <<02698>>00675000
                 1 (96 column card - Not supported!)           <<02698>>00680000
RECORD WIDTH   = 40 words (80 column card)                     <<02698>>00685000
                 48 words (96 column card - Not supported!)    <<02698>>00690000
                                                                        00695000
                                                                        00700000
                                                                        00705000
DRIVER REQUEST CODES:                                                   00710000
                                                                        00715000
    0 - READ                                                            00720000
      This function reads the "count" data requested by the    <<02698>>00725000
      user from 2894A. P1/P2 parameters are used to specify the<<02698>>00730000
      EOF check level and data mode respectively.              <<02698>>00735000
        P1(13:3) - END OF FILE SPECIFICATION                            00740000
                   0 - RESET EOF AND READ                               00745000
                   1 - CHECK FOR HARDWARE EOF                           00750000
                   2 - CHECK FOR SUPERCOLON EOF                         00755000
                   3 - CHECK FOR COLON EOF                              00760000
       P2.(11:2) - ASCII/BINARY MODE                           <<00597>>00765000
                   0 - ASCII                                   <<00597>>00770000
                   1 - COLUMN BINARY                           <<00597>>00775000
                                                               <<02698>>00780000
    1 - WRITE                                                           00785000
      This function writes the "count" data requested by the   <<02698>>00790000
      user to 2894A. P2 parameter is used to specify the data  <<02698>>00795000
      mode.                                                    <<02698>>00800000
       P2.(10:1) - SYSTEM WRITE                                <<00597>>00805000
                   0 - USER INITIATED WRITE                    <<00597>>00810000
                   1 - SYSTEM INITIATED WRITE  (HEADER CARD)   <<00597>>00815000
          (11:2) - ASCII/BINARY MODE                           <<00597>>00820000
                   0 - ASCII                                            00825000
                   1 - COLUMN BINARY                                    00830000
                                                               <<02698>>00835000
    2 - OPEN FILE                                                       00840000
      This function sets up the initial condition for          <<02698>>00845000
      successive read/write. P2 parameter is used to designate <<02698>>00850000
      the type of access. Driver first initializes             <<02698>>00855000
      the 2894A then selects the default hopper/stacker        <<02698>>00860000
      (hopper #1 & stacker #1).                                <<02698>>00865000
        P2(13:3) - TYPE OF ACCESS                                       00870000
                   0 - OPEN FOR READ ONLY                               00875000
                   1 - OPEN FOR WRITE ONLY                              00880000
                   2 - OPEN FOR READ AND WRITE                          00885000
                                                               <<02698>>00890000
    3 - CLOSE FILE                                                      00895000
      P1/P2 parameters are not used by this function.          <<02698>>00900000
                                                               <<02698>>00905000
    4 - CLOSE DEVICE                                                    00910000
      P1/P2 parameters are not used by this function.          <<02698>>00915000
      This function resets the EOF condition then selects the  <<02698>>00920000
      default hopper/stacker (hopper #1 & stacker #1).         <<02698>>00925000
                                                               <<02698>>00930000
  %34 - CONTROL                                                <<02698>>00935000
        P1(6:1)    0 - SELECT NO INHIBIT FEED ON WRITE                  00940000
                   1 - SELECT INHIBIT FEED ON WRITE                     00945000
          (7:1)    0 - SELECT PUNCH ON WRITE                            00950000
                   1 - SELECT NO PUNCH ON WRITE                         00955000
          (8:1)    0 - SELECT PRINT ON WRITE                            00960000
                   1 - SELECT NO PRINT ON WRITE                         00965000
          (9:1)    0 - SELECT PRINT AND PUNCH SAME DATA                 00970000
                   1 - SELECT PRINT AND PUNCH SEPARATE DATA             00975000
          (10:1)   0 - SELECT PRIMARY STACKER                           00980000
                   1 - SELECT SECONDARY STACKER                         00985000
          (11:1)   0 - SELECT PRIMARY HOPPER                            00990000
                   1 - SELECT SECONDARY HOPPER                          00995000
$PAGE                                                          <<02698>>01000000
STATUS  RETURNS -                                              <<02698>>01005000
                                                               <<02698>>01010000
PENDING (WAITING).                                             <<02698>>01015000
 % 10  - WAITING FOR COMPLETION INTERRUPT.                     <<02698>>01020000
   30  - NOT READY WAIT.                                       <<02698>>01025000
                                                               <<02698>>01030000
SUCCESSFUL (COMPLETION).                                       <<02698>>01035000
   01  - NORMAL COMPLETION.                                    <<02698>>01040000
                                                               <<02698>>01045000
END OF FILE                                                    <<02698>>01050000
 % 12  - PHYSICAL END OF FILE.                                 <<02698>>01055000
   22  - DATA                                                  <<02698>>01060000
   32  - END OF DATA                                           <<02698>>01065000
   42  - HELLO                                                 <<02698>>01070000
   52  - BYE                                                   <<02698>>01075000
   62  - JOB                                                   <<02698>>01080000
   72  - END OF JOB                                            <<02698>>01085000
                                                               <<02698>>01090000
UNUSUAL COMPLETION (DATA MAY NOT TRANSFERRED TO/FROM DEVICE).  <<02698>>01095000
 % 33  - REQUEST ABORTED EXTERNALLY.                           <<02698>>01100000
   63  - SYSTEM POWER FAIL.(BUT NOT NECESSARILY 2894A PFAIL!)  <<02698>>01105000
                                                               <<02698>>01110000
IRRECOVERABLE (CATASTROPHIC TERMINATION).                      <<02698>>01115000
 % 04  - INVALID REQUEST, FUNCTION OR PARAMETER.               <<02698>>01120000
   14  - TRANSFER ERROR.                                       <<02698>>01125000
   24  - I/O TIMED OUT BEFORE COMPLETION.                      <<02698>>01130000
   54  - 2894A UNIT FAILURE.                                   <<02698>>01135000
  124  - NO MESSAGE LINK BUFFERS AVAILABLE.                    <<02698>>01140000
                                                               <<02698>>01145000
$PAGE                                                          <<02698>>01150000
                                                               <<02698>>01155000
                     Device Reference Table (DRT)              <<02698>>01160000
                     ----------------------------              <<02698>>01165000
                                                               <<02698>>01170000
                                                               <<02698>>01175000
There is one DRT for each device controller configured on the  <<02698>>01180000
system.                                                        <<02698>>01185000
                                                               <<02698>>01190000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC <<02698>>01195000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+           <<02698>>01200000
  0|      SIO Program Pointer      (SIOP)          |   DRT0    <<02698>>01205000
   |-----------------------------------------------|           <<02698>>01210000
  1|      Interrupt Handler Program Label          |   DRT1    <<02698>>01215000
   |-----------------------------------------------|           <<02698>>01220000
  2|    Interrupt Linkage Table Pointer (ILTP)     |   DRT2    <<02698>>01225000
   |-----------------------------------------------|           <<02698>>01230000
  3|               RESERVED                        |   DRT3    <<02698>>01235000
   +-----------------------------------------------+           <<02698>>01240000
$PAGE                                                          <<02698>>01245000
                                                               <<02698>>01250000
                Interrupt Linkage Table (ILT)                  <<02698>>01255000
                -----------------------------                  <<02698>>01260000
                                                               <<02698>>01265000
                                                               <<02698>>01270000
There is one ILT for each device controller configured on the  <<02698>>01275000
system.                                                        <<02698>>01280000
                                                               <<02698>>01285000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC <<02698>>01290000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+           <<02698>>01295000
  0|                       0                       |   ICPVA0  <<02698>>01300000
   .                       .                       .           <<02698>>01305000
  5|                       0                       |   ICPVA5  <<02698>>01310000
   |-----------------------------------------------|           <<02698>>01315000
  6|                       0                       |   ISRQL   <<02698>>01320000
   |--+-----------------+--------+-----------------|           <<02698>>01325000
  7|M |     CHANQUE     |        |   DRT number    |   IDRTN   <<02698>>01330000
   |--+-----------------+--------+-----------------|           <<02698>>01335000
%10|   SYSDB relative pointer to SIO Program area  |   ISIOP   <<02698>>01340000
   |-----------------------------------------------|           <<02698>>01345000
%11|                       0                       |   ISTAP   <<02698>>01350000
   |-----------------------------------------------|           <<02698>>01355000
%12| single instruction that is executed to extract|   IUNIT   <<02698>>01360000
   | the device unit number from the status.       |           <<02698>>01365000
   |-----------------------------------------------|           <<02698>>01370000
%13|                       0                       |   ICDP    <<02698>>01375000
   |-----------------------+-----------------------|           <<02698>>01380000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE  <<02698>>01385000
   |-----------------------+-----------------------|           <<02698>>01390000
%15|                       0                       |   IFLAG   <<02698>>01395000
   |-----------------------------------------------|           <<02698>>01400000
%16|        SYSDB relative DIT pointer             |   IDITP0  <<02698>>01405000
   |-----------------------------------------------|           <<02698>>01410000
%17| Printing Reader Punch SIO program area        |           <<02698>>01415000
   . used as a buffer for read operation.          .           <<02698>>01420000
   | 48 words: Buffer / 5 words: 96 col EOF check  |           <<02698>>01425000
   +-----------------------------------------------+           <<02698>>01430000
                                                               <<02698>>01435000
                                                               <<02698>>01440000
                                                               <<02698>>01445000
IDRTN - CONTAINS CONTROLLER INFORMATION                        <<02698>>01450000
                                                               <<02698>>01455000
  M       - IF THIS BIT IS SET, THE CONTROLLER IS SHARING A    <<02698>>01460000
            SOFTWARE CHANNEL RESOURCE IN ORDER TO LIMIT        <<02698>>01465000
            BANDWIDTH.                                         <<02698>>01470000
  CHANQUE - THE SOFTWARE CHANNEL RESOURCE NUMBER.              <<02698>>01475000
  DRTN    - THE DRT NUMBER FOR A PRINTING READER PUNCH.        <<02698>>01480000
                                                               <<02698>>01485000
                                                               <<02698>>01490000
IQUEUE - RESOURCE QUEUING INFORMATION.                         <<02698>>01495000
                                                               <<02698>>01500000
  SIOPSIZE - (NUMBER OF WORDS + 1)/2 IN THE SIO PROGRAM AREA.  <<02698>>01505000
  CQUEN    - FOR A MULTI-UNIT CONTROLLER THIS FIELD CONTAINS   <<02698>>01510000
             THE SOFTWARE CONTROLLER RESOURCE NUMBER.          <<02698>>01515000
$PAGE                                                          <<02698>>01520000
  2894A DIT -                                                  <<02698>>01525000
                                                               <<02698>>01530000
    0   1   2   3   4  5  6  7  8   9   10 11 12 13 14 15      <<02698>>01535000
  +---+---+---+---+--+--+--+--+---+---+---+--+-----------+     <<02698>>01540000
 0| 0 | 0 |ACT|REQ|0 |0 |SP|0 |IAK| 0 | 0 |  |  MSTATE   |DFLAG<<02698>>01545000
  |---+---+---+---+--+--+--+--+---+---+---+--+-----------|     <<02698>>01550000
 1|               POINTER TO NEXT DIT                    |DLINK<<02698>>01555000
  |------------------------------------------------------|     <<02698>>01560000
 2|             POINTER TO ACTIVE IOQ OR ZERO            |DIOQP<<02698>>01565000
  |-------+-------------------+--------------------------|     <<02698>>01570000
 3|   0   |         0         |  LOGICAL DEVICE NUMBER   |DLDEV<<02698>>01575000
  |-------+-------------------+--------------------------|     <<02698>>01580000
 4|             DRIVER LINKAGE TABLE POINTER             |DDLTP<<02698>>01585000
  |------------------------------------------------------|     <<02698>>01590000
 5|             INTERRUPT LINKAGE TABLE POINTER          |DILTP<<02698>>01595000
  |------------------------------------------------------|     <<02698>>01600000
 6|             CONTROLLER INTERRUPT STATUS              |DSTAT<<02698>>01605000
  |------------------------------------------------------|     <<02698>>01610000
 7|                 ERROR LOGGING INFORMATION            |DSERR<<02698>>01615000
  |---+--------------------------------------------------|     <<02698>>01620000
 8| T |         TIMEOUT INDICATION IN BIT 0              |DTIME<<02698>>01625000
  |---+---+---+---+--+--+--+--+---+---+---+--+-----+--+--|     <<02698>>01630000
 9|CBF|SC |SS |HS |IF|EO|IB|PR|PN |SPD|EC |SM|MODE |CO|TR|DACCP<<02698>>01635000
  |---+---+---+---+--+--+--+--+---+---+---+--+-----+--+--|     <<02698>>01640000
10|               TIMER REQUEST LIST INDEX               |DTRLX<<02698>>01645000
  +------------------------------------------------------+     <<02698>>01650000
                                                               <<02698>>01655000
   DFLAG - DEVICE RELATIVE FLAGS.                              <<02698>>01660000
         ACT   ACTIVE BIT. 1 IMPLIES A MONITOR CURRENTLY       <<02698>>01665000
               SERVICING THIS DEVICE.                          <<02698>>01670000
         REQ   REQUEST BIT. 1 IMPLIES SERVICE REQUESTED        <<02698>>01675000
               WHILE MONITOR IS ACTIVE.                        <<02698>>01680000
         SP    SIO PREEMPTION. IF SET THEN A PREEMPTIVE        <<02698>>01685000
               REQUEST HAS BEEN QUEUED FOR THIS DEVICE.        <<02698>>01690000
               PREEMPT CODE IS SET IN IOQ ELEMENT.             <<02698>>01695000
         IAK   IF SET, AN INTERRUPT OR RESPONSE HAS OCCURED.   <<02698>>01700000
$PAGE                                                          <<02698>>01705000
         MSTATE  CURRENT DRIVER STATE AS DEFINED BY THE MONITOR<<02698>>01710000
                 ALLOWABLE STATES ARE:                         <<02698>>01715000
              0 - START NEW REQUEST                            <<02698>>01720000
              1 - NOT USED(BUT RESERVED)                       <<02698>>01725000
              2 - CALL DRIVER INITIATOR                        <<02698>>01730000
              3 - CALL DRIVER COMPLETOR                        <<02698>>01735000
              4 - UNUSED(BUT RESERVED)                         <<02698>>01740000
              5 - COMPLETE REQUEST..PERHAPS RETURN TO USER.    <<02698>>01745000
              6 - UNEXPECTED INTERRUPT OCCURRED. (DEVREC)      <<02698>>01750000
              7 - START OPERATOR INTERVENTION WAIT. THEN %10.  <<02698>>01755000
            %10 - WAITING (ON OPERATOR). RESTART AT 0.         <<02698>>01760000
             11 - WAITING (DATA MAKEPRESENT/FREEZING) THEN 2.  <<02698>>01765000
             12 - WAITING (INITIATOR CODE MAKEPRESENT/FREEZE)  <<02698>>01770000
             13 - WAITING (FOR COMPLETION INTERRUPT)           <<02698>>01775000
             14 - WAITING (FOR DEVICE CONTROLLER AVAILABILITY) <<02698>>01780000
             15 - UNUSED(BUT RESERVED)                         <<02698>>01785000
             16 - WAITING (INITIATOR CODE MAKEPRESENT)         <<02698>>01790000
             17 - WAITING (COMPLETOR CODE MAKEPRESENT)         <<02698>>01795000
                                                               <<02698>>01800000
   DLDEV - LOGICAL DEVICE NUMBER.                              <<02698>>01805000
                                                               <<02698>>01810000
   DACCP - ACCESS CONTROL PARAMETER.                           <<02698>>01815000
                                                               <<02698>>01820000
    .CBF - Clear Buffer Full. (Currently not used)             <<02698>>01825000
           0 - The next card leaving the hopper will be read   <<02698>>01830000
               by the device.                                  <<02698>>01835000
           1 - The read buffer will be cleared when next card  <<02698>>01840000
               leaves the hopper.                              <<02698>>01845000
                                                               <<02698>>01850000
    .SC  - Stacker Control.                                    <<02698>>01855000
           0 - All cards are stacked in right stacker(#1) until<<02698>>01860000
               device goes not ready.                          <<02698>>01865000
           1 - Cards are stacked per SS.                       <<02698>>01870000
                                                               <<02698>>01875000
    .SS  - Stacker Select.                                     <<02698>>01880000
           0 - Right stacker (stacker #1)                      <<02698>>01885000
           1 - Left stacker (stacker #2)                       <<02698>>01890000
                                                               <<02698>>01895000
    .HS  - Hopper Select.                                      <<02698>>01900000
           0 - Pick from rear hopper (primary hopper)          <<02698>>01905000
           1 - Pick from front hopper(secondary hopper)        <<02698>>01910000
                                                               <<02698>>01915000
    .IF  - Inhibit Input Feed. (Currently not used)            <<02698>>01920000
           1 - Inhibit picking a card when card currently      <<02698>>01925000
               in wait station is eject to a stacker.          <<02698>>01930000
                                                               <<02698>>01935000
    .EO  - End Of File has been detected on a read operation.  <<02698>>01940000
                                                               <<02698>>01945000
    .IB  - Internal Buffer flag.                               <<02698>>01950000
           1 - An internal buffer is being used. The buffer    <<02698>>01955000
               is the SIO program area in the ILT.             <<02698>>01960000
                                                               <<02698>>01965000
    .PR  - No Print on the next card to pass the print station <<02698>>01970000
                                                               <<02698>>01975000
    .PN  - No Punch on the next card to pass the punch station.<<02698>>01980000
                                                               <<02698>>01985000
    .SPD - Separate Print Data.                                <<02698>>01990000
           Print data other than that being punched on the     <<02698>>01995000
           next card to pass the punch and print station.      <<02698>>02000000
                                                               <<02698>>02005000
    .EC  - Eject Card - Eject on a write after read. (Not used)<<02698>>02010000
           Used when reading one card then punching one card   <<02698>>02015000
           (last card was read).                               <<02698>>02020000
                                                               <<02698>>02025000
    .SM  - Stacker Mode:Saved stacker mode on last read.       <<02698>>02030000
           (Currently Not used)                                <<02698>>02035000
                                                               <<02698>>02040000
    .MODE- Access Mode (Currently not used)                    <<02698>>02045000
           0 - File opened for read only                       <<02698>>02050000
           1 - File opened for write only                      <<02698>>02055000
           2 - File opened for read write                      <<02698>>02060000
                                                               <<02698>>02065000
    .CO  - COntrol.                                            <<02698>>02070000
           0 - No control has occured for this devide          <<02698>>02075000
               (Use default settings)                          <<02698>>02080000
           1 - Control is in effect                            <<02698>>02085000
               (Use settings in this DIT word)                 <<02698>>02090000
                                                               <<02698>>02095000
    .TR  - Timer Request.                                      <<02698>>02100000
           Timer request is pending. Index is in DTRLX.        <<02698>>02105000
                                                               <<00597>>02110000
DEFINITION OF DIT WORD 9(DACESS AND DACCP)                              02115000
      BITS (0:5) ARE HOPPER/STACKER RELATED. THEIR MEANING FOLLOWS      02120000
                                                                        02125000
           (0:1) =0 80 COLS OF DATA FROM NEXT CARD LEAVING THE          02130000
                    HOPPER WILL BE STORED IN THE MEMORY OF DEVICE       02135000
                 =1 DATA IN MEMORY OF DEVICE IS CLEARED WHEN THE        02140000
                    NEXT CARD PASSES THE READ STATION.                  02145000
           (1:1) =0 STACKER CONTROL. CARDS ARE DISCHARGED TO THE        02150000
                    STACKER #1(RIGHT HAND-STACKER).                     02155000
                 =1 STACKER CONTROL. CARDS ARE DISCHARGED TO THE        02160000
                    STACKER AS SPECIFIED BY BIT (2:1) BELOW.            02165000
           (2:1)    SELECT STACKER BIT.  THIS BIT IS EFFECTIVE FOR      02170000
                    STACKING WHEN BIT (1:1) IS A 1.  THE STACKER        02175000
                    SELECTED IS AS FOLLOWS:                             02180000
                 =0 SELECT STACKER #1(RIGHT HAND-STACKER).              02185000
                 =1 SELECT STACKER #2(LEFT HAND-STACKER).               02190000
           (3:1) =0 HOPPER SELECT.  WHEN 0, SELECT FROM PRIMARY HOPPER  02195000
                    (HOPPER#1, ALSO KNOWN AS THE REAR HOPPER).          02200000
                 =1 HOPPER SELECT. WHEN 1, SELECT FROM SECONDARY        02205000
                    HOPPER.(HOPPER#2, OR FRONT HOPPER).                 02210000
           (4:1) =0 INHIBIT INPUT FEED. WHEN 0, ALLOWS A CARD TO BE     02215000
                    FED FROM THE HOPPER TO THE WAIT STATION WHEN THE    02220000
                    CURRENT CARD IN WAIT STATION IS SENT TO STACKER     02225000
                 =1 INHIBIT INPUT FEED. WHEN 1, NO CARD CAN BE FED      02230000
                    FROM EITHER HOPPER TO THE WAIT STATION. HOWEVER,    02235000
                    A CARD CURRENTLY IN THE WAIT STATION MAY BE FED     02240000
                    TO A STACKER.                                       02245000
            (5:1)=0 DRIVER INTERNAL FLAG. WHEN 0,NO EOF HAS BEEN        02250000
                    DETECTED.                                           02255000
                 =1 AN EOF HAS BEEN DETECTED ON A READ OPERATION.       02260000
            (6:1)=0 INTERNAL BUFFER FLAG.  WHEN 0, NO INTERNAL          02265000
                    BUFFER IS BEING USED.                               02270000
                 =1 AN INTERNAL AUXILLARY BUFFER(AT END OF SIO AREA     02275000
                    IS BEING USED.                                      02280000
            (7:3)   SEE PRINT/PUNCH OPTIONS IN DRIVER REQUEST CODES     02285000
                    UNDER (5-CONTROL, P1.(7:3)).                        02290000
           (10:4) - UNUSED.                                    <<00597>>02295000
           (14:1)=0 NO FCONTROL HAS OCCURED FOR THIS FILE. USE          02300000
                    DEFAULT SETTINGS.                                   02305000
                 =1 FCONTROL HAS OCCURRED. USE SETTINGS IN THIS         02310000
                    DIT WORD TO INDICATE HOW TO OPERATE DEVICE.         02315000
           (15:1)=0 NO TIMER REQUEST IS PENDING(SEE DIT WORD %12).      02320000
                 =1 A TIMER REQUEST INDEX IS IN WORD %12 OF DIT AND     02325000
                    IS CURRENT(AN ABORTTIMEREQ MUST BE DONE ON INTRPT)  02330000
$PAGE                                                          <<02698>>02335000
                                                               <<02698>>02340000
     THE DRIVER IS CONCERNED WITH THE I/O STATUS.              <<02698>>02345000
THE I/O STATUS CONTAINS INFO ABOUT THE ACTUAL 2894A HARDWARE   <<02698>>02350000
AND ITS CURRENT STATE.  THE DRIVER READS I/O STATUS INTO THE   <<02698>>02355000
DIT STATUS AREA.                                               <<02698>>02360000
THE FORMAT OF THE STATUS IS SHOWN BELOW.                       <<02698>>02365000
EACH WORD AND BIT IN THE TABLE IS DEFINED AS FOLLOWS:          <<02698>>02370000
                                                               <<02698>>02375000
                                                               <<02698>>02380000
I/O STATUS WORDS                                               <<02698>>02385000
                                                               <<02698>>02390000
Interrupt status word                                          <<02698>>02395000
                                                               <<02698>>02400000
  0   1   2   3 4   5   6   7   8   9   10  11  12  13  14  15 <<02698>>02405000
+---+---+---+-----+---+---+---+---+---+---+---+---+---+---+---+<<02698>>02410000
| 1 |RWK|INP| SEQ |DFS|IDS| 0 |RCI|RIN|NRI|DTI|IBI|ISI|   |TOI|<<02698>>02415000
+---+---+---+-----+---+---+---+---+---+---+---+---+---+---+---+<<02698>>02420000
                                                               <<02698>>02425000
     RWK - RIO or WIO OK.                                      <<02698>>02430000
                                                               <<02698>>02435000
     INP - Interrupt Pending.                                  <<02698>>02440000
                                                               <<02698>>02445000
     SEQ - Sequence counter.                                   <<02698>>02450000
                                                               <<02698>>02455000
           Bits  Counter  Meaning                              <<02698>>02460000
           3  4  State                                         <<02698>>02465000
           ----  -------  -------------------                  <<02698>>02470000
           0  0     0     No data transfer in progress         <<02698>>02475000
           1  0     1     DEV CMD sent to initiate data xfer   <<02698>>02480000
           1  1     2     DEV FLAG received and xfer completed <<02698>>02485000
           0  1     3     Never attained except passing state  <<02698>>02490000
                                                               <<02698>>02495000
     DFS - Device Flag Status                                  <<02698>>02500000
                                                               <<02698>>02505000
     IDS - Interrupt Status = 0.                               <<02698>>02510000
                                                               <<02698>>02515000
     RCI - Ready for Command Interrupt.                        <<02698>>02520000
                                                               <<02698>>02525000
     RIN - Ready INterrupt.                                    <<02698>>02530000
                                                               <<02698>>02535000
     NRI - Not Ready Interrupt.                                <<02698>>02540000
                                                               <<02698>>02545000
     DTI - Data Transfer Interrupt.                            <<02698>>02550000
                                                               <<02698>>02555000
     IBI - Input Buffer full Interrupt.                        <<02698>>02560000
                                                               <<02698>>02565000
     ISI - I/O System Interrupt.                               <<02698>>02570000
                                                               <<02698>>02575000
     TOI - Time Out Interrupt.                                 <<02698>>02580000
$PAGE                                                          <<02698>>02585000
Device status word                                             <<02698>>02590000
                                                               <<02698>>02595000
     0   1   2   3   4   5   6   7   8   9   10  11  12    15  <<02698>>02600000
   +---+---+---+-------+---+---+---+---+-------+---+---+-----+ <<02698>>02605000
   | 1 |RWK|INP|  SEQ  |DFS|IDS| 0 |RFC|  REA  |CWS|SHE|     | <<02698>>02610000
   +---+---+---+-------+---+---+---+---+-------+---+---+-----+ <<02698>>02615000
                                                               <<02698>>02620000
     IDS - Device Status = 1.                                  <<02698>>02625000
                                                               <<02698>>02630000
     RFC - Ready For Command.                                  <<02698>>02635000
                                                               <<02698>>02640000
     REA - Ready.                                              <<02698>>02645000
           Both bits are on  - READY and ON-LINE               <<02698>>02650000
           Bothe bits are off - Not READY or OFF-LINE          <<02698>>02655000
                                                               <<02698>>02660000
     CWS - Card in Wait Station.                               <<02698>>02665000
                                                               <<02698>>02670000
     SHE - Secondary Hopper Empty.                             <<02698>>02675000
                                                               <<02698>>02680000
                                                               <<02698>>02685000
6-Bit status word (Not stored in DIT)                          <<02698>>02690000
                                                               <<02698>>02695000
       0   1   2   3   4   5   6   7   8                    15 <<02698>>02700000
     +---+-------+---+---+---+---+---+------------------------+<<02698>>02705000
     |IBF|       |RCH|ICH|OCH|PHE|STF|                        |<<02698>>02710000
     +---+-------+---+---+---+---+---+------------------------+<<02698>>02715000
                                                               <<02698>>02720000
     IBF - Input Buffer Full.                                  <<02698>>02725000
                                                               <<02698>>02730000
     RCH - Read CHeck.                                         <<02698>>02735000
                                                               <<02698>>02740000
     ICH - Input CHeck.                                        <<02698>>02745000
                                                               <<02698>>02750000
     OCH - Output CHeck.                                       <<02698>>02755000
                                                               <<02698>>02760000
     PHE - Primary Hopper Empty.                               <<02698>>02765000
                                                               <<02698>>02770000
     STF - STacker Full.                                       <<02698>>02775000
$PAGE                                                          <<02698>>02780000
    2894A IOQ -                                                <<02698>>02785000
                                                               <<02698>>02790000
                                                               <<02698>>02795000
         0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15       <<02698>>02800000
        +--+-----+--+--+--+--+--+--+--+--+--+-----+--+--+      <<02698>>02805000
   IOQ0 |AB|     |SB|WA|BL|C |FR|ME|PR|SF|PF|PRMPT|  |MD| QFLAG<<02698>>02810000
        |--+-----+--+--+--+--+--+--+--+--+--+-----+--+--|      <<02698>>02815000
   IOQ1 |       IOQ POINTER TO NEXT NEW REQUEST         | QLINK<<02698>>02820000
        |-----------------------+-----------------------|      <<02698>>02825000
   IOQ2 |                       | LOGICAL DEVICE NUMBER | QLDEV<<02698>>02830000
        |-----------------------+-----------------------|      <<02698>>02835000
   IOQ3 |          MISCELLANEOUS PARAMETER              | QMISC<<02698>>02840000
        |--+--------------------------------------------|      <<02698>>02845000
   IOQ4 |S |               DST NUMBER                   | QDSTN<<02698>>02850000
        |--+--------------------------------------------|      <<02698>>02855000
   IOQ5 |        TARGET DATA BUFFER ADDRESS             | QADDR<<02698>>02860000
        |-----------------------+-----------------------|      <<02698>>02865000
   IOQ6 |                       |     FUNCTION CODE     | QFUNC<<02698>>02870000
        |-----------------------+-----------------------|      <<02698>>02875000
   IOQ7 |      WORD (+) OR BYTE (-) COUNT               | QWBCT<<02698>>02880000
        |-----------------------------------------------|      <<02698>>02885000
   I0Q8 |              PARAMETER 1                      | QPAR1<<02698>>02890000
        |-----------------------------------------------|      <<02698>>02895000
   I0Q9 |              PARAMETER 2                      | QPAR2<<02698>>02900000
        |-----------------------+--------------+--------|      <<02698>>02905000
   IOQ1 |     PCB NUMBER        |   QUALIFIER  |RSTATUS | QSTAT<<02698>>02910000
        +-----------------------+--------------+--------+      <<02698>>02915000
                                                               <<02698>>02920000
   QFLAG -                                                     <<02698>>02925000
        * AB      REQUEST ABORTED EXTERNALLY.                  <<02698>>02930000
          DI      DIAGNOSTIC FUNCTION REQUESTED.               <<02698>>02935000
          SB      REQUEST IS USING SYSTEM BUFFERS.             <<02698>>02940000
          WA      WAKE CALLER ON COMPLETION OF REQUEST.        <<02698>>02945000
          BL      BLOCKED IO. CALLER IS WAITING COMPLETION.    <<02698>>02950000
          C       REQUEST HAS BEEN COMPLETED & USER AWAKENED.  <<02698>>02955000
          FR      DATA SEG. IS PRESENT IN CORE AND FROZEN.     <<02698>>02960000
          ME      MAM ERROR ON DATA SEGMENT MAKE PRESENT.      <<02698>>02965000
          PR      THIS REQUEST STARTED-BUT PREEMPTED BY MAM.   <<02698>>02970000
          SF      SIO FAILURE IN GIP.                          <<02698>>02975000
        * PF      THE IO IS BEING ABORTED DUE TO POWER FAIL.   <<02698>>02980000
          PRMPT   PREEMPTIVE TYPE CODE: 1 - SOFT, 2 - HARD.    <<02698>>02985000
          MD      A MESSAGE REQUEST REPLY HAS COMPLETED.       <<02698>>02990000
                                                               <<02698>>02995000
        * denotes the information which 2894A driver uses.     <<02698>>03000000
$PAGE                                                          <<02698>>03005000
   QMISC -                                                     <<02698>>03010000
                                                               <<02698>>03015000
         0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15       <<02698>>03020000
        +-----------+-----------------------------------+      <<02698>>03025000
   IOQ3 |  WSTATE   |           UNUSED                  | QMISC<<02698>>03030000
        +-----------+-----------------------------------+      <<02698>>03035000
                                                               <<02698>>03040000
   WSTATE - Waiting state                                      <<02698>>03045000
                                                               <<02698>>03050000
                                                                        03055000
IOQ(QMISC) WORD DEFINITION FOLLOWS NEXT:                                03060000
           (0:1) =0 NULL. NO FUNCTION                                   03065000
                 =1 I/O INITIATED,WAITING FOR COMPLETION INTERRUPT      03070000
           (1:1) =0 NULL. NO FUNCTION                                   03075000
                 =1 WAITING ON A "NOT READY" INTERRUPT TO BRING         03080000
                    DEVICE BACK ONLINE.                                 03085000
           (2:1) =0 CURRENT OPERATION IS NOT A WRITE OPERATION.         03090000
                 =1 CURRENT OPERATION IS A WRITE OPERATION.             03095000
           (3:1) =0 NORMAL.                                    <<00597>>03100000
                 =1 WAITING FOR THE OPERATOR TO CLEAR THE      <<00597>>03105000
                    CARD PATH AFTER A READ CHECK OR INVALID    <<00597>>03110000
                    CODE.                                      <<00597>>03115000
           (4:12)   NOT USED AT PRESENT.                       <<00597>>03120000
$PAGE                                                          <<02698>>03125000
Special situations.                                            <<02698>>03130000
                                                               <<02698>>03135000
Auxilialy buffer.                                              <<02698>>03140000
                                                               <<02698>>03145000
  We have to read 80/96 columns data even if there is only less<<02698>>03150000
80/96 columns data required. For this reason, there is an      <<02698>>03155000
auxiliary buffer to hold the original contents of card columns <<02698>>03160000
in which at first the card contents will be read.              <<02698>>03165000
However, if the user's buffer is large enough to hold 80/96    <<02698>>03170000
columns data, the auxilialy buffer will not be used. The       <<02698>>03175000
exception is that when a :EOF: was read, we have to return EOF <<02698>>03180000
condition right away, therefore, the last card                 <<02698>>03185000
(which caused EOF condition) will be saved in auxiliary buffer.<<02698>>03190000
                                                               <<02698>>03195000
Buffer length.                                                 <<02698>>03200000
                                                               <<02698>>03205000
  If the buffer length is specified by negative number the     <<02698>>03210000
  following condition will occur if it was an odd number.      <<02698>>03215000
  ASCII mode : "count" columns will be read but will be        <<02698>>03220000
               truncated if auxiliary buffer in use.           <<02698>>03225000
  BINARY mode: truncated "count" columns will be read.         <<02698>>03230000
                                                               <<02698>>03235000
Column binary.                                                 <<02698>>03240000
                                                               <<02698>>03245000
  Only read first 40/48 columns.                               <<02698>>03250000
                                                               <<02698>>03255000
                                                               <<02698>>03260000
                                                               <<02698>>03265000
Card Jams.                                                     <<02698>>03270000
                                                               <<02698>>03275000
  If the last card in hopper causes a card jam, it will be     <<02698>>03280000
  damaged and will not be re-produced.                         <<02698>>03285000
                                                               <<02698>>03290000
                                                               <<02698>>03295000
                                                               <<02698>>03300000
                                                               <<02698>>03305000
                                                               <<02698>>03310000
;  << End of comments >>                                       <<02698>>03315000
$PAGE                                                          <<02698>>03320000
                                                                        03325000
                                                                        03330000
                                                                        03335000
BEGIN                                                                   03340000
    EQUATE                                                              03345000
         ASCII        = 0,       <<MODE>>                               03350000
         COLBIN       = 1,       <<MODE>>                               03355000
         QDSTN        = 4,       <<INDEX INTO IOQ-DST#>>                03360000
         QFUNC        = 6,       <<INDEX INTO IOQ-FUNCT CODE>>          03365000
         QPAR1        = 8,       <<INDEX INTO IOQ-PARAM #1>>            03370000
         QPAR2        = 9,       <<INDEX INTO IOQ-PARAM #2>>            03375000
         QMISC        = 3,       <<INDEX INTO IOQ-INTERNAL FLAGS>>      03380000
         QWBCNT       = 7,       <<INDEX INTO IOQ-WORD/BYTE CNT>>       03385000
         QFLAG        = 0,       <<INDEX INTO IOQ-FLAGS>>               03390000
         QLDEV        = 2,       <<INDEX INTO IOQ-LOG DEV#>>            03395000
         QSTAT        =10,       <<INDEX INTO IOQ-STATUS>>              03400000
         DFLAG        = 0,       <<INDEX INTO DIT-FLAGS>>               03405000
         DLDEV        = 3,       <<INDEX INTO DIT-LOG DEV#>>            03410000
         DSTAT        = 6,       <<INDEX INTO DIT-STATUS>>              03415000
         DACCESS      = 9,       <<INDEX INTO DIT-ACCESS TYPE>>         03420000
         DTRLX        = 10,      <<INDEX INTO DIT-TIMER>>               03425000
         DTIMER       = 8,       <<INDEX INTO DIT-TICK>>                03430000
         ICNTRL       = 7,       <<INDEX IN ILT OF DRT>>       <<01300>>03435000
         READ         = 0,       <<FUNCTION-READ>>                      03440000
         WRITE        = 1,       <<FUNCTION-WRITE>>                     03445000
         OPEN         = 2,       <<FUNCTION-FILE OPEN>>                 03450000
         CLOSE        = 3,       <<FUNCTION-FILE CLOSE>>                03455000
         DEVCLOSE     = 4,       <<FUNCTION-DEVICE CLOSE>>              03460000
         CONTROL      = 28,      <<FUNCTION-CONTROL>>                   03465000
         COMPLETION   = 3,       <<MONITOR STATE-COMPLETION>>           03470000
         ENDIO        = 5,       <<MONITOR STATE-END OF REQUEST>>       03475000
         REINIT       = %7,      <<MONITOR STATE-REINIT ON INTRP>>      03480000
         UNITFAIL     = %54,     <<STATUS RETURN=UNIT FAILURE>>         03485000
         INVALID      = %40,     <<STATUS RETURN-INVALID FUNC>>         03490000
         PUNCHERR     = %203,     <<STATUS RETURN-WR NO CARD IN WAIT>>  03495000
         MACC         = %123,    <<STATUS RETURN-MULTIPLE ACCESS>>      03500000
         ABORTED      = %33,     <<STATUS RETURN-I/0 ABORTED>>          03505000
         PFABORT      = %63,     <<STATUS RETURN-PWR FAIL ABORT>>       03510000
         CLEAR        = %040000, <<CLEAR ALL INTERRUPTS>>               03515000
         MSTRCLEAR    = %100000, <<MASTER CLEAR>>                       03520000
         SYSDB        = %1000,   <<SYSTEM DB>>                          03525000
         WNEW         = %7,      <<REINITIATE ON INTERRUPT>>            03530000
         CALLCMPLT    = %13,     <<CALL CMPLTR ON INTRPT>>              03535000
         BADCNTRL     = %3,      <<INVALID CONTROL FUNCTION>>           03540000
         BADFUNC      = %5,      <<INVALID FUNCTION CODE>>              03545000
         XFERERR      = %14,     <<TRANSFERR ERROR-STATUS>>             03550000
         SYSLPDT      = %10,     <<LPDT POINTER INDEX>>                 03555000
         CRPDITSZ     = 11,       <<DIT SIZE FOR CD/RDR/PCH>>           03560000
         SIOSIZE      = 54,      <<SIO PGM SIZE-USED AS BUFFER>>        03565000
         SIOSIZED2    = SIOSIZE/2,  <<SIOSIZE/2 FOR INITIAL>>  <<01300>>03570000
         CIOFEED      = %040010; <<CIO-FEED CARD>>                      03575000
                                                                        03580000
                                                                        03585000
  DEFINE                                                                03590000
       DISABLE        = ASSEMBLE(SED 0)#,                               03595000
       ENABLE         = ASSEMBLE(SED 1)#,                               03600000
       PFAILB         = (11:1)#,                                        03605000
       IAK            = (8:1)#,                                         03610000
       EOF            = (8:2)#,   <<EOF FIELD IN LPDT>>                 03615000
       DRT            = (8:8)#,   <<DRT FIELD IN ILT >>        <<01300>>03620000
       DEOF           =DITP(DACCESS).(12:1)#,                  <<00597>>03625000
       STATUS         =IOQP(QSTAT).(8:8)#,                              03630000
       DACCP          =DITP(DACCESS)#,                                  03635000
       AXBFLG         =DITP(DACCESS).(6:1)#,                            03640000
       SBUF           =IOQP(QFLAG).(3:1)#,                              03645000
       QMISCP         =IOQP(QMISC)#;                                    03650000
                                                                        03655000
                                                                        03660000
                                                                        03665000
                                                                        03670000
<< DIT DEFINITION AND DRIVER LINKAGE AREA >>                            03675000
                                                                        03680000
BYTE ARRAY CONFIG(0:7)=DB:=                                             03685000
CRPDITSZ,1,0,0,0,0,SIOSIZED2,0;                                <<01300>>03690000
                                                                        03695000
ARRAY DITAB(1:CRPDITSZ)=DB:=                                            03700000
0,0,0,0,0,0,0,0,0,%40000,0;                                    <<01.02>>03705000
                                                                        03710000
ARRAY SIOA(1:SIOSIZE)=DB:=0;                                            03715000
                                                                        03720000
                                                                        03725000
PROCEDURE DELAY(TIME);                                                  03730000
  VALUE TIME;                                                           03735000
  DOUBLE TIME;                                                          03740000
  OPTION EXTERNAL;                                                      03745000
                                                                        03750000
                                                                        03755000
PROCEDURE EOFCHECK(IOQP,BUFR,CNT,HARDCHK);                              03760000
  VALUE IOQP,BUFR,CNT,HARDCHK;                                          03765000
  DOUBLE BUFR;                                                          03770000
  POINTER IOQP;                                                         03775000
  INTEGER CNT,HARDCHK;                                                  03780000
  OPTION EXTERNAL;                                                      03785000
                                                                        03790000
PROCEDURE GIP;                                                          03795000
  OPTION EXTERNAL;                                                      03800000
                                                                        03805000
PROCEDURE HELP;                                                         03810000
  OPTION EXTERNAL;                                                      03815000
                                                                        03820000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<0U.EB>>03825000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<0U.EB>>03830000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<0U.EB>>03835000
   IOTYPE;                                                     <<0U.EB>>03840000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<0U.EB>>03845000
   IOTYPE;                                                     <<0U.EB>>03850000
INTEGER POINTER DITP;                                          <<0U.EB>>03855000
OPTION VARIABLE,EXTERNAL;                                      <<0U.EB>>03860000
                                                                        03865000
                                                                        03870000
PROCEDURE SIODM(DITP,FLAGS);                                            03875000
  VALUE DITP,FLAGS;                                                     03880000
  LOGICAL FLAGS;                                                        03885000
  POINTER DITP;                                                         03890000
  OPTION EXTERNAL;                                                      03895000
                                                                        03900000
                                                                        03905000
PROCEDURE MASTERCLEAR(DITP);                                            03910000
  ARRAY DITP;                                                           03915000
  OPTION EXTERNAL;                                                      03920000
                                                                        03925000
                                                                        03930000
PROCEDURE IOFAILURE(DRTN,DITP);                                         03935000
  VALUE DRTN;                                                           03940000
  INTEGER DRTN;                                                         03945000
  ARRAY DITP;                                                           03950000
  OPTION EXTERNAL;                                                      03955000
                                                                        03960000
                                                                        03965000
                                                                        03970000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               03975000
  VALUE CODE,REQ,TIME;                                                  03980000
  INTEGER CODE,REQ;                                                     03985000
  DOUBLE TIME;                                                          03990000
  OPTION EXTERNAL;                                                      03995000
                                                                        04000000
                                                                        04005000
PROCEDURE ABORTTIMEREQ(TRLX);                                           04010000
  VALUE TRLX;                                                           04015000
  INTEGER TRLX;                                                         04020000
     OPTION EXTERNAL;                                                   04025000
                                                                        04030000
                                                                        04035000
PROCEDURE INITZ(IDITP);                                                 04040000
   INTEGER ARRAY IDITP;                                                 04045000
   BEGIN                                                                04050000
     POINTER PS0=S-0;                                                   04055000
     MASTERCLEAR(IDITP);                                                04060000
     TOS:=IDITP(5);     <<GET DRT NIMBER>>                              04065000
     TOS:=PS0(ICNTRL).DRT;                                     <<01300>>04070000
     TOS:=2;          <<ENABLE INTERRUPTS>>                             04075000
     ASSEMBLE (CIO 1);                                                  04080000
     IF <> THEN ASSEMBLE(DEL);                                          04085000
   END;                                                                 04090000
$PAGE                                                          <<02698>>04095000
INTEGER PROCEDURE PRPCHDVR(IOQP,DITP,BANK,BUFADR,SIOP,DRTN);            04100000
  VALUE IOQP,DITP,BANK,BUFADR,SIOP,DRTN;                                04105000
  INTEGER BANK,BUFADR,DRTN;                                             04110000
  INTEGER POINTER IOQP,DITP,SIOP;                                       04115000
                                                                        04120000
                                                                        04125000
                                                                        04130000
  BEGIN                                                                 04135000
                                                                        04140000
    DOUBLE UBUF=BANK;                                                   04145000
    DOUBLE ABUF;                                                        04150000
    INTEGER MSTATE=PRPCHDVR,                                            04155000
            S0=S-0,                                                     04160000
            S1=S-1,                                                     04165000
            S2=S-2,                                                     04170000
            S3=S-3,                                                     04175000
            S4=S-4,                                                     04180000
            S5=S-5,                                                     04185000
            X=X,                                                        04190000
            FUNC,                                                       04195000
            P1,                                                         04200000
            P2,                                                         04205000
            MODE,                                                       04210000
            I,J,K,L,M,N,                                                04215000
            INDEX,                                                      04220000
            MAXBUFSIZE,                                                 04225000
            BNKNO,                                                      04230000
            TEMP,                                                       04235000
            FCNT,                                                       04240000
            HCNT,                                                       04245000
            WBCNT;                                                      04250000
    DEFINE LDEV   = IOQP(QLDEV).(8:8)#;                                 04255000
    DEFINE SIOPBASE=@SIOP+SYSDB#;                                       04260000
                                                                        04265000
                                                                        04270000
                                                                        04275000
$PAGE "ASCII TO HOLLERITH CONVERSION TABLE"                    <<02698>>04280000
    INTEGER ARRAY AHOLL(0:255)=PB:=                                     04285000
<<         0     1     2     3     4     5     6     7  >>              04290000
<<00>> %5403,%4401,%4201,%4101,%0005,%1023,%1013,%1007,                 04295000
<<01>> %2011,%4021,%1021,%4103,%4043,%4023,%4013,%4007,                 04300000
<<02>> %6403,%2401,%2201,%2101,%0043,%0023,%0201,%1011,                 04305000
<<03>> %2003,%2403,%0007,%1005,%2043,%2023,%2013,%2007,                 04310000
<<04>> %0000,%4006,%0006,%0102,%2102,%1042,%4000,%0022,                 04315000
<<05>> %4022,%2022,%2042,%4012,%1102,%2000,%4102,%1400,                 04320000
<<06>> %1000,%0400,%0200,%0100,%0040,%0020,%0010,%0004,                 04325000
<<07>> %0002,%0001,%0202,%2012,%4042,%0012,%1012,%1006,                 04330000
<<10>> %0042,%4400,%4200,%4100,%4040,%4020,%4010,%4004,                 04335000
<<11>> %4002,%4001,%2400,%2200,%2100,%2040,%2020,%2010,                 04340000
<<12>> %2004,%2002,%2001,%1200,%1100,%1040,%1020,%1010,                 04345000
<<13>> %1004,%1002,%1001,%4202,%1202,%2202,%2006,%1022,                 04350000
<<14>> %0402,%5400,%5200,%5100,%5040,%5020,%5010,%5004,                 04355000
<<15>> %5002,%5001,%6400,%6200,%6100,%6040,%6020,%6010,                 04360000
<<16>> %6004,%6002,%6001,%3200,%3100,%3040,%3020,%3010,                 04365000
<<17>> %3004,%3002,%3001,%5000,%6000,%3000,%3400,%4005,                 04370000
<<20>> %3403,%1401,%1201,%1101,%1041,%2021,%4011,%2005,                 04375000
<<21>> %1003,%1403,%1203,%1103,%1043,%4403,%4203,%2103,                 04380000
<<22>> %7403,%0401,%2203,%0101,%0041,%0021,%0011,%4003,                 04385000
<<23>> %0003,%0403,%0203,%0103,%4041,%2041,%0013,%3401,                 04390000
<<24>> %5401,%5201,%5101,%5041,%5021,%5011,%5005,%5003,                 04395000
<<25>> %4402,%6401,%6201,%6101,%6041,%6021,%6011,%6005,                 04400000
<<26>> %6003,%2402,%3201,%3101,%3041,%3021,%3011,%3005,                 04405000
<<27>> %3003,%1402,%7000,%7401,%7201,%7101,%7041,%7021,                 04410000
<<30>> %7011,%7005,%7003,%5402,%5202,%5102,%5042,%5022,                 04415000
<<31>> %5012,%5006,%6402,%6202,%6102,%6042,%6022,%6012,                 04420000
<<32>> %6006,%3402,%3202,%3102,%3042,%3022,%3012,%3006,                 04425000
<<33>> %7402,%7400,%7200,%7100,%7040,%7020,%7010,%7004,                 04430000
<<34>> %7002,%7001,%7202,%7102,%7042,%7022,%7012,%7006,                 04435000
<<35>> %5203,%5103,%5043,%5023,%5013,%5007,%6203,%6103,                 04440000
<<36>> %6043,%6023,%6013,%6007,%3203,%3103,%3043,%3023,                 04445000
<<37>> %3013,%3007,%7203,%7103,%7043,%7023,%7013,%7007;                 04450000
                                                                        04455000
$PAGE "HOLLERITH TO ASCII CONVERSION TABLE"                    <<02698>>04460000
INTEGER ARRAY HOLLASS(0:255)=PB :=                                      04465000
   %040, %061, %062, %063, %064, %065, %066, %067,                      04470000
   %070, %140, %072, %043, %100, %047, %075, %042,                      04475000
   %071, %221, %026, %223, %224, %225, %226, %004,                      04480000
   %230, %231, %232, %233, %024, %025, %236, %032,                      04485000
   %060, %057, %123, %124, %125, %126, %127, %130,                      04490000
   %131, %271, %134, %054, %045, %137, %076, %077,                      04495000
   %132, %201, %202, %203, %204, %012, %027, %033,                      04500000
   %210, %211, %212, %213, %214, %005, %006, %007,                      04505000
   %055, %112, %113, %114, %115, %116, %117, %120,                      04510000
   %121, %261, %135, %044, %052, %051, %073, %136,                      04515000
   %122, %021, %022, %023, %235, %205, %010, %207,                      04520000
   %030, %031, %222, %217, %034, %035, %036, %037,                      04525000
   %175, %176, %163, %164, %165, %166, %167, %170,                      04530000
   %171, %321, %322, %323, %324, %325, %326, %327,                      04535000
   %172, %237, %262, %263, %264, %265, %266, %267,                      04540000
   %270, %200, %364, %365, %366, %367, %370, %371,                      04545000
   %046, %101, %102, %103, %104, %105, %106, %107,                      04550000
   %110, %250, %133, %056, %074, %050, %053, %041,                      04555000
   %111, %001, %002, %003, %234, %011, %206, %177,                      04560000
   %227, %215, %216, %013, %014, %015, %016, %017,                      04565000
   %173, %141, %142, %143, %144, %145, %146, %147,                      04570000
   %150, %303, %304, %305, %306, %307, %310, %311,                      04575000
   %151, %240, %241, %242, %243, %244, %245, %246,                      04580000
   %247, %000, %350, %351, %352, %353, %354, %355,                      04585000
   %174, %152, %153, %154, %155, %156, %157, %160,                      04590000
   %161, %312, %313, %314, %315, %316, %317, %320,                      04595000
   %162, %251, %252, %253, %254, %255, %256, %257,                      04600000
   %260, %020, %356, %357, %360, %361, %362, %363,                      04605000
   %272, %331, %332, %333, %334, %335, %336, %337,                      04610000
   %340, %330, %342, %343, %344, %345, %346, %347,                      04615000
   %341, %273, %274, %275, %276, %277, %300, %301,                      04620000
   %302, %220, %372, %373, %374, %375, %376, %377;                      04625000
COMMENT                                                        <<02698>>04630000
Above table is indexed by the pattern of hollerith code as     <<02698>>04635000
follows:                                                       <<02698>>04640000
                                                               <<02698>>04645000
    8   9   10  11  12  13  14  15                             <<02698>>04650000
  +---+---+---+---+---+-----------+                            <<02698>>04655000
  |R12|R11|R0 |R9 |R8 | ROW#(1-7) |                            <<02698>>04660000
  +---+---+---+---+---+-----------+                            <<02698>>04665000
                                                               <<02698>>04670000
  R12,R11,R0,R9,R8 : Status of each ROW.                       <<02698>>04675000
                                                               <<02698>>04680000
  ROW#             : Value between 1 to 7 corresponds to ROW # <<02698>>04685000
                     which has a hole.                         <<02698>>04690000
                                                               <<02698>>04695000
  For example: "A" has holes on R11 and R1 and resulting index <<02698>>04700000
               is 10000001(%201).                              <<02698>>04705000
  ;                                                            <<02698>>04710000
                                                                        04715000
$PAGE "6 BIT CODE TO/FROM ASCII CONVERSION TABLE FOR 96 COLUMN"<<02698>>04720000
INTEGER ARRAY SIXA(%40:%141)=PB:=                                       04725000
<<%40>> %00,%52,%17,%13,%53,%34,%32,%15,                                04730000
<<%50>> %75,%55,%54,%76,%33,%40,%73,%21,                                04735000
<<%60>> %20,%01,%02,%03,%04,%05,%06,%07,                                04740000
<<%70>> %10,%11,%12,%56,%74,%16,%36,%37,                                04745000
<<%100>>%14,%61,%62,%63,%64,%65,%66,%67,                                04750000
<<%110>>%70,%71,%41,%42,%43,%44,%45,%46,                                04755000
<<%120>>%47,%50,%51,%22,%23,%24,%25,%26,                                04760000
<<%130>>%27,%30,%31,%00,%00,%57,%72,%35,                                04765000
<<%140>>%77,%60;                                                        04770000
                                                                        04775000
INTEGER ARRAY A6(%0:%77)=PB:=                                           04780000
<<%00>> %40,%61,%62,%63,%64,%65,%66,%67,                                04785000
<<%10>> %70,%71,%72,%43,%100,%47,%75,%42,                               04790000
<<%20>> %60,%57,%123,%124,%125,%126,%127,%130,                          04795000
<<%30>> %131,%132,%46,%54,%45,%137,%76,%77,                             04800000
<<%40>> %55,%112,%113,%114,%115,%116,%117,%120,                         04805000
<<%50>> %121,%122,%41,%44,%52,%51,%73,%135,                             04810000
<<%60>> %175,%101,%102,%103,%104,%105,%106,%107,                        04815000
<<%70>> %110,%111,%136,%56,%74,%50,%53,%174;                            04820000
$PAGE "2894A PRINTING READER PUNCH DRIVER"                     <<02698>>04825000
LOGICAL INHIBIT:=FALSE,                                                 04830000
        NOPUNCH:=FALSE,                                                 04835000
        NOPRINT:=FALSE,                                                 04840000
        PPSEPAR:=FALSE,                                                 04845000
        SECSTACK:=FALSE,                                                04850000
        SECHOPP:=FALSE,                                                 04855000
        STACKCONT:=FALSE,                                               04860000
        WRITEWORD:=%040000,                                             04865000
        SCRATCH,                                                        04870000
        BFILL;                                                          04875000
        INTEGER POINTER BUF;                                            04880000
        INTEGER POINTER CTAB;                                           04885000
        DOUBLE POINTER LPDTD = DB+SYSLPDT;                              04890000
                                                                        04895000
$PAGE                                                          <<02698>>04900000
SUBROUTINE SETFLAGS;                                                    04905000
  BEGIN                                                                 04910000
    TOS:=0;                                                             04915000
    TOS:=SIOPBASE;  <<SET UP AUX BUFFER>>                               04920000
    ABUF:=TOS;                                                          04925000
    TOS:=LPDTD(LDEV);                                                   04930000
    IF TOS.(12:4)=1 THEN  <<96 COL>>                                    04935000
    BEGIN                                                               04940000
      FCNT:=96;                                                         04945000
      HCNT:=48;                                                         04950000
    END                                                                 04955000
    ELSE                                                                04960000
    BEGIN                                                               04965000
      FCNT:=80;                                                         04970000
      HCNT:=40;                                                         04975000
    END;                                                                04980000
    DEL;                                                                04985000
    FUNC:=IOQP(QFUNC);     <<GET FUNCTION CODE>>                        04990000
    P1:=IOQP(QPAR1);       <<GET PARAMETER 1>>                          04995000
    P2:=IOQP(QPAR2);       <<GET PARAMETER 2>>                          05000000
    IF FUNC <> CONTROL  THEN MODE := P2.(11:2);                <<00597>>05005000
    IF DACCP.(14:1)=0 THEN   <<IF NO FCONTROL SET DEFAULTS>>   <<00597>>05010000
      IF FUNC = WRITE                                          <<00597>>05015000
        THEN DACCP.(0:5):=%16   <<SCM, HOPR 2, STKR 2>>        <<00597>>05020000
        ELSE DACCP.(0:5):=%10;  <<SCM, HOPR1, STKR1>>          <<00597>>05025000
    WRITEWORD.(0:5):=DACCP.(0:5);                                       05030000
    NOPUNCH:=DACCP.(7:1);     <<NO PUNCH OPTION>>                       05035000
    NOPRINT:=DACCP.(8:1);     <<NOPRINT OPTION>>                        05040000
    PPSEPAR:=DACCP.(9:1);     <<SEPARATE PRINT OPTION>>                 05045000
    IF FUNC=WRITE AND P2.(10:1)=1  THEN   <<IF SYSTEM WRITE>>  <<00597>>05050000
    BEGIN    <<SET DEFAULTS FOR HEADER/TRAILER>>               <<00597>>05055000
      WRITEWORD.(1:4):=%17;   <<HOPR2 -> STKR 2, IIF>>         <<00597>>05060000
      NOPUNCH:=FALSE;   <<PUNCH>>                              <<00597>>05065000
      NOPRINT:=FALSE;   <<PRINT>>                              <<00597>>05070000
    END;                                                       <<00597>>05075000
    SECHOPP:=WRITEWORD.(3:1);   <<HOPPER SELECT FLAG>>         <<00597>>05080000
    SECSTACK:=WRITEWORD.(2:1);  <<STACKER SELECT FLAG>>        <<00597>>05085000
  END;     <<SET FLAGS>>                                                05090000
                                                                        05095000
$PAGE                                                          <<02698>>05100000
SUBROUTINE FEEDCARD;                                                    05105000
  BEGIN                                                                 05110000
    QMISCP:=0;                                                          05115000
    TOS:=DRTN;                                                          05120000
    ASSEMBLE(TIO 0);                                                    05125000
    IF < THEN GO UFAIL;                                                 05130000
    IF S0.(9:1) <> 1 THEN                                               05135000
    BEGIN     <<DEVICE NOT READY>>                                      05140000
      DITP(DSTAT):=TOS;  <<SAVE STATUS>>                                05145000
      IOMESSAGE(1,11,%10000,LDEV,,,,,0);                       <<00597>>05150000
      QMISCP := %40000;   <<WAITING FOR READY>>                <<00597>>05155000
      TOS := %30;                                              <<00597>>05160000
      TOS := REINIT;   <<CALL INITIATOR ON IRPT>>              <<00597>>05165000
      GO BEND;                                                 <<00597>>05170000
    END;                                                                05175000
    DITP(DSTAT):=TOS;  <<DRTN NOW ON TOS>>                              05180000
    TOS := MSTRCLEAR;                                          <<00597>>05185000
    ASSEMBLE(CIO 1);    <<MASTERCLEAR>>                        <<00597>>05190000
    IF <> THEN GO UFAIL;                                       <<00597>>05195000
    TOS:=WRITEWORD LAND %73777;      <<TURN OFF IFF>>                   05200000
    ASSEMBLE(WIO 1);                                                    05205000
    IF < THEN GO UFAIL;                                                 05210000
    IF > THEN GO NOTRDY;                                                05215000
    TOS:= %1000;     <<SET DEV END>>                                    05220000
    ASSEMBLE(CIO 1);                                                    05225000
    IF <> THEN GO UFAIL;                                                05230000
    DISABLE;                                                   <<00597>>05235000
    TOS:=%40;     <<FRQ>>                                               05240000
    ASSEMBLE(CIO 1);                                                    05245000
    IF <> THEN GO UFAIL;                                                05250000
    TOS:=%3;      <<EIR,STT>>                                           05255000
    ASSEMBLE(CIO 1);                                                    05260000
    IF  <> THEN GO UFAIL;                                               05265000
    ASSEMBLE(DEL);  <<CLEAN OFF STACK>>                                 05270000
    IF FUNC=WRITE THEN                                                  05275000
    QMISCP:=%20000;                                                     05280000
    TOS:=1;                                                             05285000
    TOS:=CALLCMPLT;                                                     05290000
    GO BEND;                                                            05295000
  <<**NOTE--WE ARE NOT RETURNING TO CALLER**>>                 <<00597>>05300000
  END;     <<FEEDCARD>>                                                 05305000
                                                                        05310000
                                                                        05315000
$PAGE                                                          <<02698>>05320000
SUBROUTINE SETWBCOUNT;                                                  05325000
<<FIGURE OUT ACTUAL W/B COUNT AND SET MAXSIZE>>                         05330000
  BEGIN                                                                 05335000
    TOS:=IOQP(QWBCNT);                                                  05340000
    IF MODE = ASCII THEN                                                05345000
    BEGIN                                                               05350000
      IF S0.(0:1) =0 THEN                                               05355000
      TOS:=-(TOS&ASL(1));     <<SET TO BYTE COUNT>>                     05360000
      WBCNT:=TOS;                                                       05365000
      IF WBCNT< -FCNT THEN WBCNT:=-FCNT;                                05370000
      IF PPSEPAR THEN WBCNT:=-FCNT;  <<FULL CARD ON SEP PRINT>>         05375000
      IF IOQP(QWBCNT) <0 THEN IOQP(QWBCNT):=WBCNT                       05380000
      ELSE IOQP(QWBCNT) := -(WBCNT&ASR(1));                    <<01.03>>05385000
    END     <<ASCII COUNT>>                                             05390000
    ELSE                                                                05395000
    BEGIN     <<COL BIN COUNT>>                                         05400000
      IF S0.(0:1)=1 THEN                                                05405000
      TOS:=-(TOS&ASR(1));     <<SET TO WORD COUNT>>                     05410000
      WBCNT:=TOS;                                                       05415000
      IF WBCNT>FCNT THEN WBCNT:=FCNT;                                   05420000
      IF IOQP(QWBCNT) < 0 THEN IOQP(QWBCNT) := -(WBCNT&ASL(1)) <<01.03>>05425000
      ELSE IOQP(QWBCNT):=WBCNT;                                         05430000
    END;                                                                05435000
  END;     <<SET WORD BYTE COUNT>>                                      05440000
                                                                        05445000
                                                                        05450000
$PAGE                                                          <<02698>>05455000
SUBROUTINE WRITECARD;                                                   05460000
<<  J= # WRITES NECCESSARY(#COLUMNS TO BE PUNCHED)  >>                  05465000
<<  I= WRITE COUNTER(0 TO J-1)                      >>                  05470000
<<  K= INDEX OF BUFFER WORD CURRENTLY BEING REFERENCED >>               05475000
<<  BFILL= TRUE MEANS WRITE BLANKS(TO FILL OUT CARD)  >>                05480000
  BEGIN                                                                 05485000
    I:=-1;                                                              05490000
    K:=0;                                                               05495000
    TOS:=DRTN;                                                          05500000
    TOS:=BANK;                                                          05505000
    TOS:=BUFADR;                                                        05510000
    TOS:=TOS-1;                                                         05515000
    WHILE (I:=I+1)  <J DO                                               05520000
    BEGIN     <<WRITE LOOP>>                                            05525000
      IF BFILL THEN TOS:=0 ELSE                                         05530000
      BEGIN     <<DATA>>                                                05535000
        IF I.(15:1)=0 OR MODE=COLBIN THEN                      <<00140>>05540000
        TOS:=TOS+1;                                                     05545000
        ASSEMBLE(LSEA);                                                 05550000
        IF MODE = ASCII THEN                                            05555000
        BEGIN  <<ASCII>>                                                05560000
          IF LOGICAL(I) THEN                                            05565000
          K:=K+1 ELSE     <<R.H. BYTE>>                                 05570000
          TOS:=TOS&LSR(8);     <<L.H. BYTE>>                            05575000
          X:=TOS LAND %377;     <<ASCII CODE>>                          05580000
          IF FCNT=96 THEN                                               05585000
          BEGIN     <<SET UP 6 BIT CHAR>>                               05590000
            IF X>%40 THEN IF X<%140 THEN GO OUTA;                       05595000
            IF X=%174 THEN                                              05600000
            BEGIN                                                       05605000
              X:=%140;                                                  05610000
              GO OUTA;                                                  05615000
            END;                                                        05620000
            IF X= %175 THEN X:=%141                                     05625000
            ELSE X:=%133;                                               05630000
OUTA:                                                                   05635000
            TOS:=SIXA(X);                                               05640000
          END     <<6 BIT SET UP>>                                      05645000
          ELSE                                                          05650000
          TOS:=AHOLL(X);     <<HOLLERITH CODE>>                         05655000
        END;                                                            05660000
      END;  <<DATA>>                                                    05665000
      L := 1;      <<TIMEOUT COUNTER>>                         <<00597>>05670000
      DO   <<LOOP UNTIL WIO ALLOWED>>                          <<00597>>05675000
      BEGIN                                                    <<00597>>05680000
        ASSEMBLE(TIO 3);                                       <<00597>>05685000
        IF < THEN GO UFAIL;                                    <<00597>>05690000
        IF (L:=L+1)=0 THEN GO FAIL;  <<TIMED OUT>>             <<00597>>05695000
      END                                                      <<00597>>05700000
      UNTIL TOS.(5:1)=1;   <<DFS SET = WIO OK>>                <<00597>>05705000
      ASSEMBLE (WIO 3);                                                 05710000
      IF < THEN GO UFAIL;                                               05715000
      IF > THEN ASSEMBLE(DEL);                                          05720000
    END;  <<WRITE LOOP>>                                                05725000
    ASSEMBLE(DEL; DDEL);                                                05730000
  END;  <<WRITECARD SUBROUTINE>>                                        05735000
                                                                        05740000
                                                                        05745000
$PAGE                                                          <<02698>>05750000
SUBROUTINE CLBFULLSUB;                                                  05755000
  BEGIN                                                                 05760000
    IF DACCP.(15:1)=1 THEN GO BAGIN;                                    05765000
    TOS:=DRTN;                                                          05770000
      TOS:=WRITEWORD LOR %140000; <<CLEAR BUF FULL>>           <<01.02>>05775000
    ASSEMBLE(WIO 1);                                                    05780000
    IF < THEN GO UFAIL;                                                 05785000
    TOS:=%1000;     <<SDE>>                                             05790000
    ASSEMBLE(CIO 1);                                                    05795000
    IF <> THEN GO UFAIL;                                                05800000
    IF FUNC=WRITE THEN <<SET UP DELAY>>                                 05805000
    BEGIN                                                               05810000
      DITP(DTRLX):=TIMEREQ(%20,@DITP,100D);                    <<01.02>>05815000
      DACCP.(15:1):=1;                                                  05820000
      STATUS:=1;                                                        05825000
      MSTATE:=CALLCMPLT;                                                05830000
      GO TO FASOUT;                                                     05835000
BAGIN:                                                                  05840000
      ABORTTIMEREQ(DITP(DTRLX));                                        05845000
      DACCP.(15:1):=0;                                                  05850000
    TOS:=DRTN;                                                          05855000
    END;                                                                05860000
    TOS:=CLEAR;                                                         05865000
    ASSEMBLE(CIO 1);                                                    05870000
    IF <> THEN GO UFAIL;                                                05875000
    ASSEMBLE(DEL);                                                      05880000
  IF FUNC=WRITE THEN                                                    05885000
  BEGIN                                                                 05890000
    IF QMISCP=%20000 THEN GO BAG2                                       05895000
      ELSE GO WELLDONE;                                        <<01.02>>05900000
  END;                                                                  05905000
END;  <<CLEAR BUFFER FULL SUBROUTINE>>                                  05910000
$PAGE                                                                   05915000
<<  I  N  I  T  I  A  T  O  R    >>                                     05920000
                                                                        05925000
     DISABLE;     <<DISABLE INTERRUPTS>>                                05930000
     DITP(0).IAK:=0;  <<RESET IAK>>                                     05935000
     TOS:=IOQP;                                                         05940000
     DEL;                                                               05945000
     IF < THEN                                                          05950000
     BEGIN     <<I/O HAS BEEN ABORTED>>                                 05955000
       ENABLE;                                                          05960000
       MASTERCLEAR(DITP);                                               05965000
       IF IOQP.PFAILB =1 THEN TOS:=PFABORT ELSE TOS:=ABORTED;           05970000
       TOS:=ENDIO;                                                      05975000
       GO TO OUT;                                                       05980000
     END;                                                               05985000
     ENABLE;                                                            05990000
     IF MSTATE = COMPLETION THEN GO COMPLETOR;                          05995000
WIN:                                                                    06000000
     ENABLE;                                                   <<01.02>>06005000
     TOS:=DRTN;     <<ENABLE DEV STATUS,CLEAR INTERRUPTS>>              06010000
     TOS:=CLEAR LOR %10;                                                06015000
     ASSEMBLE (CIO 1; DEL);                                             06020000
     IF <> THEN                                                         06025000
     BEGIN                                                              06030000
UFAIL:                                                                  06035000
       ENABLE;                                                 <<01.02>>06040000
       IOFAILURE(DRTN,DITP);   <<NON RESPONDING DEVICE>>                06045000
FAIL:                                                                   06050000
       ENABLE;                                                 <<01.02>>06055000
      IOMESSAGE(1,208,%10000,LDEV,,,,,0);                      <<0U.EB>>06060000
      TOS:=DRTN;                                                        06065000
      TOS:=MSTRCLEAR;                                                   06070000
      ASSEMBLE(CIO 1; DEL);                                             06075000
      IF <> THEN ASSEMBLE(DEL);                                         06080000
      TOS:=UNITFAIL;                                                    06085000
      TOS:=ENDIO;                                                       06090000
      GO TO BEND;                                                       06095000
    END;                                                                06100000
    SETFLAGS;                                                           06105000
    IF FUNC = READ THEN                                                 06110000
$PAGE                                                                   06115000
<<I N I T I A T O R    R E A D                  >>                      06120000
    BEGIN                                                               06125000
      EOFCHECK(IOQP,0D,0,0);    <<PRE-READ EOF CHECK>>                  06130000
      IF <> THEN                                                        06135000
      BEGIN                                                             06140000
        MSTATE:=ENDIO;                                                  06145000
        RETURN;                                                         06150000
      END;                                                              06155000
      IF DEOF=1 THEN  <<LAST RD EOF.SWAP BUFFERS>>                      06160000
      BEGIN                                                             06165000
        IF MODE=ASCII THEN GO SWPBUF;                                   06170000
        TOS:=BADFUNC;     <<INVALID FUNCTION>>                          06175000
        TOS:=ENDIO;                                                     06180000
        GO TO BEND;                                                     06185000
      END;                                                              06190000
      AXBFLG:=0;                                                        06195000
      IF -(FCNT-1)<=IOQP(QWBCNT)<=(HCNT-1) THEN                         06200000
      AXBFLG:=1;     <<USE AUXILLARY BUFFER>>                           06205000
      SETWBCOUNT;                                                       06210000
      FEEDCARD;                                                         06215000
    END;  <<READ INITIAL>>                                              06220000
    IF FUNC = WRITE THEN                                                06225000
$PAGE                                                                   06230000
<<  I N I T I A T O R    W R I T E               >>                     06235000
                                                                        06240000
    BEGIN                                                               06245000
      TOS:=DRTN;                                                        06250000
      ASSEMBLE(TIO 0);                                                  06255000
      IF < THEN GO UFAIL;                                               06260000
      IF S0.(9:1)<> 1 THEN                                              06265000
      BEGIN     <<DEVICE NOT READY>>                                    06270000
NOTRDY:                                                                 06275000
        IOMESSAGE(1,11,%10000,LDEV,,,,,0);                     <<0U.EB>>06280000
        TOS:=DRTN;     <<CLEAR>>                                        06285000
        TOS:=CLEAR;                                            <<00597>>06290000
        ASSEMBLE(CIO 1);                                                06295000
        IF <> THEN GO UFAIL;                                            06300000
        TOS:=2;     <<EIR>>                                             06305000
        ASSEMBLE(CIO 1);                                                06310000
        IF <> THEN GO UFAIL;                                            06315000
        ASSEMBLE(DEL);                                                  06320000
        TOS:=0;                                                         06325000
        TOS:=REINIT;                                                    06330000
        GO BEND;                                                        06335000
      END;                                                              06340000
      IF TOS.(11:1) <> 1  THEN FEEDCARD;                       <<00597>>06345000
       <<IF NO CARD IN VWS, FEED ONE>>                         <<00597>>06350000
      TOS:=WRITEWORD;                                                   06355000
      ASSEMBLE(WIO 1);  <<HOPP,STACKER,INHIBIT OPTIONS>>                06360000
      IF < THEN GO UFAIL;                                               06365000
      IF > THEN GO NOTRDY;                                              06370000
      TOS:=%1000;     <<SET DEVICE END>>                                06375000
      IF NOT NOPRINT THEN                                               06380000
      TOS.(7:1):=1;     <<SET PRINT OPTION>>                            06385000
      IF NOT NOPUNCH THEN                                               06390000
      TOS.(8:1):=1;     <<SET PUNCH OPTION>>                            06395000
      IF PPSEPAR THEN                                                   06400000
      TOS.(9:1):=1;     <<SET SEPARATE PRINT OPTION>>                   06405000
      ASSEMBLE(DUP);     <<DUPLICATE COMMAND>>                          06410000
      ASSEMBLE(CIO 2);   <<PRINT,PUNCH OPTIONS>>                        06415000
      IF <> THEN GO UFAIL;                                              06420000
      TOS:=(TOS LAND %700) LOR %40;  <<ADD IN FEED REQ>>                06425000
      ASSEMBLE(CIO 1);                                                  06430000
      IF <> THEN GO UFAIL;                                              06435000
      SETWBCOUNT;                                                       06440000
      IF WBCNT < 0 THEN                                                 06445000
      J:=-(WBCNT)   <<#WRITES REQUIRED ASCII>>                          06450000
      ELSE J:=WBCNT;<<#WRITER REQUIRED COL BINARY>>                     06455000
      BFILL:=FALSE;                                                     06460000
      WRITECARD;                                                        06465000
      IF J<FCNT THEN                                                    06470000
      BEGIN     <<ZERO FILL>>                                           06475000
        J:=FCNT-J;     <<#COLS REMAINING>>                              06480000
        BFILL:=TRUE;                                                    06485000
        WRITECARD;                                                      06490000
      END;     <<ZERO FILL>>                                            06495000
      IF PPSEPAR THEN                                                   06500000
      BEGIN     <<SEPARATE PRINT DATA>>                                 06505000
        MODE:=ASCII;     <<ALL PRINTING IS IN ASCII>>                   06510000
        J:=FCNT;     <<ALWAYS PRINT FCNT CHARACTERS>>                   06515000
        BUFADR:=BUFADR+HCNT;    <<START OF PRINT BUFFER>>               06520000
        BFILL:=FALSE;                                                   06525000
        WRITECARD;                                                      06530000
        BUFADR:=BUFADR-HCNT;    <<RESET BUFFER>>                        06535000
      END;     <<SEPARATE PRINT>>                                       06540000
      TOS:=DRTN;                                                        06545000
      TOS:=%1003;     <<SET DEV END,ENAB INT,START TIMER>>              06550000
      DISABLE;                                                 <<01.02>>06555000
      ASSEMBLE(CIO 1);                                                  06560000
      IF <> THEN GO UFAIL;                                              06565000
      TOS:=1;                                                           06570000
      TOS:=CALLCMPLT;     <<CALL COMPLETOR>>                            06575000
      GO OUT;                                                           06580000
    END;     <<WRITE>>                                                  06585000
    IF FUNC = OPEN THEN                                                 06590000
$PAGE                                                                   06595000
<<  I N I T I A T O R    O P E N                  >>                    06600000
    BEGIN     <<FILE OPEN>>                                             06605000
      MASTERCLEAR(DITP);                                                06610000
      DACCP:=%40000;   <<SET STACKER CONTROL MODE>>            <<00597>>06615000
      GO WELLDONE;                                                      06620000
    END;                                                                06625000
    IF FUNC = CLOSE THEN                                                06630000
$PAGE                                                                   06635000
<<  I N I T I A T O R    C L O S E                 >>                   06640000
    BEGIN     <<FILE CLOSE>>                                            06645000
      TOS:=DRTN;                                                        06650000
      ASSEMBLE(TIO 0);                                                  06655000
      IF < THEN GO UFAIL;                                               06660000
      IF S0.(11:1)=1 THEN                                               06665000
      BEGIN     <<CARD IN WAIT STAT-MUST BE CLEARED>>                   06670000
        ASSEMBLE(DEL);                                                  06675000
         TOS:=WRITEWORD LOR %44000;<<INHIBIT INPUT FEED>>      <<01.02>>06680000
        ASSEMBLE(WIO 1);                                                06685000
        IF < THEN GO UFAIL;                                             06690000
        IF > THEN GO NOTRDY;                                            06695000
        TOS:=%1000;     <<SET DEV END>>                                 06700000
        ASSEMBLE(CIO 1);                                                06705000
        IF <> THEN GO UFAIL;                                            06710000
        TOS:=%43;   <<FRQ,EIR,STT>>                                     06715000
      DISABLE;                                                 <<01.02>>06720000
        ASSEMBLE(CIO 1);                                                06725000
        IF <> THEN GO UFAIL;                                            06730000
         QMISCP:=%100000;                                      <<01.02>>06735000
         TOS:=1;                                               <<01.02>>06740000
         TOS:=CALLCMPLT;                                       <<01.02>>06745000
         GO OUT;                                               <<01.02>>06750000
      END;                                                              06755000
      GO TO WELLDONE;                                                   06760000
    END;    <<FILE CLOSE>>                                              06765000
    IF FUNC = DEVCLOSE THEN                                             06770000
$PAGE                                                                   06775000
<<  I N I T I A T O R    D E V I C E   C L O S E   >>                   06780000
    BEGIN     <<DEVICE CLOSE>>                                          06785000
      TOS:=LPDTD(LDEV);                                                 06790000
      TOS.EOF:=0;  <<RESET EOF FIELD IN LPDT>>                          06795000
      LPDTD(X):=TOS;                                                    06800000
      DACCP:=%40000;   <<RESET DEFAULT CONTROL SETTINGS>>      <<00597>>06805000
      GO TO WELLDONE;                                                   06810000
    END;    <<DEVICE CLOSE>>                                            06815000
    IF FUNC = CONTROL THEN                                              06820000
$PAGE                                                                   06825000
<<  I N I T I A T O R    C O N T R O L               >>                 06830000
    BEGIN     <<CONTROL>>                                               06835000
      TOS:=%40000;   <<SET UP CONTROL OPTIONS>>                         06840000
      TOS.(4:1):=P1.(6:1);  <<INHIBIT FEED OPTION>>                     06845000
      TOS.(2:1):=P1.(10:1);  <<STACKER OPTION>>                         06850000
      TOS.(3:1):=P1.(11:1);  <<HOPPER OPTION>>                          06855000
      TOS:=TOS.(0:5);                                                   06860000
      DACCP.(0:5):=TOS;                                                 06865000
      WRITEWORD := DACCP;                                      <<00597>>06870000
      IF P1.(7:2) > 0   <<NO PRINT OR NO PUNCH?>>              <<00597>>06875000
        THEN P1.(9:1) := 0;   <<THEN NO SEPARATE BUFFER>>      <<00597>>06880000
      DACCP.(7:3):=P1.(7:3);  <<PRINT/PUNCH OPTIONS>>                   06885000
      DACCP.(14:1):=1; <<TURN ON CONTROL FLAG>>                         06890000
      GO TO WELLDONE;                                                   06895000
    END;     <<CONTROL>>                                                06900000
    IF FUNC > 5 THEN                                                    06905000
$PAGE                                                                   06910000
<<  I N I T I A T O R    I N V A L I D                >>                06915000
    BEGIN                                                               06920000
      TOS:=INVALID;                                                     06925000
      TOS:=ENDIO;                                                       06930000
      GO BEND;                                                          06935000
WELLDONE:                                                               06940000
      TOS:=1;     <<ENDING STAT OK>>                                    06945000
      TOS:=ENDIO;                                                       06950000
BEND:                                                                   06955000
      TOS:=DRTN;     <<EIR>>                                            06960000
      TOS:=2;                                                           06965000
      ASSEMBLE(CIO 1; DEL);                                             06970000
      IF <> THEN GO UFAIL;                                              06975000
OUT:                                                                    06980000
      MSTATE:=TOS;     <<SET MONITOR STATE>>                            06985000
      STATUS:=TOS;     <<SET STATUS>>                                   06990000
FASOUT:                                                                 06995000
      ENABLE;                                                  <<01.02>>07000000
      RETURN;                                                           07005000
    END;     <<INITIATOR>>                                              07010000
                                                                        07015000
                                                                        07020000
                                                                        07025000
$PAGE                                                                   07030000
<<        C  O  M  P  L  E  T  O  R        >>                           07035000
                                                                        07040000
                                                                        07045000
COMPLETOR:                                                              07050000
<< GET HERE IF MONITOR STATE = 3.  SHOULD ONLY GET HERE IF >>           07055000
<< FUNCTION CODE = READ,WRITE,FILE CLOSE,OR OPEN FOR       >>           07060000
<< WRITE ONLY.                                             >>           07065000
                                                                        07070000
   TOS:=DRTN;                                                           07075000
   IF DACCP.(15:1)=1 THEN                                      <<00219>>07080000
     BEGIN                                                     <<00219>>07085000
        FUNC := IOQP(QFUNC);                                   <<00219>>07090000
        CLBFULLSUB;                                            <<00219>>07095000
     END;                                                      <<00219>>07100000
   TOS:=CLEAR ;  <<CLEAR INTERRUPTS>>                                   07105000
   ASSEMBLE(CIO 1);                                                     07110000
   IF <> THEN GO UFAIL;                                                 07115000
   TOS:=DITP(DSTAT);  <<GET STATUS>>                                    07120000
   << STATUS NOW ON TOS>>                                               07125000
   TOS:=TOS&CSR(2);     <<TRANSFER ERROR BIT>>                          07130000
   IF < THEN                                                            07135000
   BEGIN     <<TRANSFER ERROR INTERRUPT>>                               07140000
     TOS:=XFERERR;                                                      07145000
     TOS:=ENDIO;                                                        07150000
     GO BEND;                                                           07155000
   END;                                                                 07160000
   TOS:=TOS&CSL(1);  <<WATCHDOG TIMER BIT>>                             07165000
   IF < THEN GO FAIL;     <<TIMED OUT>>                                 07170000
   TOS:=TOS&CSL(9);  <<READY FOR COMMAND BIT>>                          07175000
   IF < THEN GO CONT;                                                   07180000
   TOS:=TOS&CSL(4);  <<INPUT BUFFER FULL BIT>>                          07185000
   IF < THEN GO CONT;                                                   07190000
   TOS:=TOS&CSR(2);  <<BIT 0 = NOT RDY BIT>>                            07195000
   IF < THEN                                                            07200000
   BEGIN                                                                07205000
     MASTERCLEAR(DITP);                                                 07210000
      IF IOQP(QFUNC).(8:8) = WRITE  THEN GO CONT;              <<00288>>07215000
        <<HANDLE IN WRITE COMPLETOR IF WRITE>>                 <<00288>>07220000
     GO NOTRDY;                                                         07225000
   END;                                                                 07230000
   GO NOTRDY;                                                  <<01.02>>07235000
CONT:                                                                   07240000
   ASSEMBLE(DEL);     <<DRTN ON TOS>>                                   07245000
   SETFLAGS;                                                            07250000
   IF QMISCP=%20000 THEN                                                07255000
   BEGIN                                                                07260000
     CLBFULLSUB;                                                        07265000
BAG2:                                                                   07270000
     QMISCP:=0;                                                         07275000
     MSTATE:=2;                                                         07280000
     GO WIN;                                                            07285000
   END;                                                                 07290000
   IF FUNC = READ THEN                                                  07295000
$PAGE                                                                   07300000
<<  C O M P L E T O R  R E A D  >>                                      07305000
                                                                        07310000
   BEGIN     <<READ COMPLETION>>                                        07315000
     IF QMISCP.(3:1)=1 THEN    <<SEE IF OP. CLEARED CARD>>     <<00597>>07320000
     BEGIN  <<NOTE - DRTN IS ON TOS>>                          <<00597>>07325000
       TOS := %10;  <<ENABLE DEVICE STATUS>>                   <<00597>>07330000
       ASSEMBLE(CIO 1);                                        <<00597>>07335000
       IF <> THEN GO UFAIL;                                    <<00597>>07340000
       ASSEMBLE(TIO 0);   <<GET DEVICE STATUS>>                <<00597>>07345000
       IF < THEN GO UFAIL;                                     <<00597>>07350000
       IF TOS.(11:1) = 1 THEN   <<CARD IN VWS>>                <<00597>>07355000
       BEGIN   <<DEVICE NOT CLEARED--WAIT AGAIN>>              <<00597>>07360000
         TOS := 1;                                             <<00597>>07365000
         TOS := CALLCMPLT;  <<WAIT FOR IRPT>>                  <<00597>>07370000
         GO BEND;                                              <<00597>>07375000
       END                                                     <<00597>>07380000
       ELSE   <<OPERATOR CLEARED THE BAD CARD>>                <<00597>>07385000
       BEGIN                                                   <<00597>>07390000
         QMISCP := 0;                                          <<00597>>07395000
         MSTATE := 2;                                          <<00597>>07400000
         GO WIN;                                               <<00597>>07405000
       END;                                                    <<00597>>07410000
     END;                                                      <<00597>>07415000
     TOS:=HCNT;                                                         07420000
     IF MODE=ASCII THEN TOS:=TOS&LSL(1);                                07425000
     ASSEMBLE(DUP);                                                     07430000
     J:=TOS;      <<#READS REQUIRED>>                                   07435000
     M:=TOS;      <<#REQUEST READS REQUIRED>>                           07440000
     SCRATCH:=FALSE;                                                    07445000
     I:=-1;                                                             07450000
     K:=0;                                                              07455000
     IF AXBFLG=1 THEN                                                   07460000
     BEGIN     <<SET FOR AUX BUFFER>>                                   07465000
       TOS:=0;     <<BANK ALWAYS 0>>                                    07470000
       TOS:=@SIOP+%1000;                                                07475000
     END                                                                07480000
     ELSE                                                               07485000
     BEGIN     <<SET FOR USER BUFFER>>                                  07490000
       TOS:=BANK;                                                       07495000
       TOS:=BUFADR;                                                     07500000
     END;                                                               07505000
     << DRTN ON TOS -2>>                                                07510000
     WHILE (I:=I+1) < J DO                                              07515000
     BEGIN     <<READ LOOP>>                                            07520000
       L := 1;        <<TIMEOUT COUNTER>>                      <<00597>>07525000
       DO             <<LOOP UNTIL RIO ALLOWED>>               <<00597>>07530000
       BEGIN                                                   <<00597>>07535000
         ASSEMBLE(TIO 2);                                      <<00597>>07540000
         IF < THEN GO UFAIL;                                   <<00597>>07545000
         IF (L:=L+1)=0 AND I>0  THEN GO FAIL;  <<TIMED OUT>>   <<00597>>07550000
       END                                                     <<00597>>07555000
       UNTIL TOS.(5:1)=1   <<DFS SET = RIO ALLOWED>>           <<00597>>07560000
           OR L=0 AND I=0;  <<TIME OUT ON FIRST COL.>>         <<00597>>07565000
       ASSEMBLE(RIO 2);                                                 07570000
       IF < THEN GO UFAIL;                                              07575000
       IF > THEN GO NOTRDY;                                             07580000
       TOS:=%2000;     <<IDT>>                                          07585000
       IF I+1=J THEN ASSEMBLE(DEL)                                      07590000
       ELSE ASSEMBLE(CIO 4);                                            07595000
       IF <> THEN GO UFAIL;                                             07600000
       TOS:=CLEAR;                                                      07605000
       ASSEMBLE(CIO 4);                                                 07610000
       IF <> THEN GO UFAIL;                                             07615000
       IF I=0 THEN                                                      07620000
       BEGIN    <<DO THIS FIRST TIME ONLY>>                             07625000
         TOS:=TOS&CSL(3);                                               07630000
         IF < THEN                                                      07635000
         BEGIN     <<READ CHECK>>                                       07640000
           I:=1;                                                        07645000
           IF SECHOPP THEN I:=I+1;                                      07650000
           IOMESSAGE(1,217,%11000,LDEV,I,,,,0);                <<0U.EB>>07655000
           QMISCP:=0;                                                   07660000
           CLBFULLSUB;                                                  07665000
           QMISCP.(3:1) := 1;  <<WAIT FOR OP. TO CLEAR CARD>>  <<00597>>07670000
           TOS := 1;                                           <<00597>>07675000
           TOS := CALLCMPLT;  <<WAIT FOR INTERRUPT>>           <<00597>>07680000
           GO BEND;                                            <<00597>>07685000
         END;     <<READ CHECK>>                                        07690000
         TOS:=TOS&CSL(1);                                               07695000
         IF < THEN IF S0.(12:1)=0 THEN <<IBF=0,INPUT CHECK>>            07700000
         BEGIN                                                          07705000
           TOS:=DRTN;                                                   07710000
           TOS:=%1000;     <<SDE>>                                      07715000
           ASSEMBLE(CIO 1;DEL);                                         07720000
           IF <> THEN GO UFAIL;                                         07725000
           GO NOTRDY;                                                   07730000
         END;                                                           07735000
         TOS:=TOS&CSR(4);                                               07740000
       END;     <<FIRST TIME>>                                          07745000
ARND:                                                                   07750000
       TOS:=TOS LAND %7777;                                             07755000
       IF I < 5 THEN                                                    07760000
       SIOP(I+48):=S0;  <<SAVE FOR EOFCHECK (96COLBIN)>>                07765000
       IF I<M THEN                                                      07770000
       BEGIN   <<TRANSLATE AND CRAM INTO BUFFER>>                       07775000
         IF MODE = COLBIN THEN                                          07780000
         BEGIN     <<COLUMN BINARY>>                                    07785000
           ASSEMBLE(SSEA);                                              07790000
           TOS:=TOS+1;     <<BUMP BUFFER INDX>>                         07795000
           K:=K+1;                                                      07800000
         END                                                            07805000
         ELSE                                                           07810000
         BEGIN     <<ASCII>>                                            07815000
           IF FCNT=96 THEN                                              07820000
           BEGIN                                                        07825000
             X:=TOS;                                                    07830000
             TOS:=A6(X);                                                07835000
             GO TO FC96;                                                07840000
           END;                                                         07845000
           ASSEMBLE(TEST);                                              07850000
           IF = THEN INDEX:=TOS                                         07855000
           ELSE                                                         07860000
           BEGIN                                                        07865000
             TOS:=S0.(7:8)&LSL(7);  <<ROWS 1-8>>                        07870000
             TOS.(8:1):=0;          <<TEST ROW 8>>                      07875000
             INDEX:= IF = THEN 0 ELSE 8;                                07880000
             ASSEMBLE (SCAN);                                           07885000
             IF X < 8 THEN INDEX:=INDEX+X;                              07890000
             IF TOS <> 0 THEN                                           07895000
             BEGIN    <<INVALID HOLLERITH>>                             07900000
              DEL;                                             <<01.03>>07905000
               INDEX:=0;                                                07910000
               IOMESSAGE(1,218,%11100,LDEV,I+1,IF SECHOPP THEN <<0U.EB>>07915000
                  2 ELSE 1,,,0);                               <<0U.EB>>07920000
               J:=0;  <<TO GET OUT OF LOOP>>                            07925000
               SCRATCH:=TRUE;                                           07930000
               QMISCP:=0;                                               07935000
             END                                                        07940000
             ELSE                                                       07945000
             BEGIN                                                      07950000
               TOS:=(TOS CAT S0(7:15:1))&LSR(8);                        07955000
               INDEX:=TOS&LSL(4) LOR LOGICAL(INDEX);                    07960000
             END;                                                       07965000
           END;                                                         07970000
           TOS:=HOLLASS(INDEX);                                         07975000
FC96:                                                                   07980000
           IF LOGICAL (I) THEN                                          07985000
           BEGIN                                                        07990000
             TOS.(0:8):=TEMP;                                           07995000
             ASSEMBLE(SSEA);                                            08000000
             TOS:=TOS+1;     <<BUMP BUFFER INDX>>                       08005000
             K:=K+1;                                                    08010000
           END                                                          08015000
           ELSE                                                         08020000
           BEGIN                                                        08025000
             TEMP:=TOS;  <<SAVE FIRST HALF>>                            08030000
           END;                                                         08035000
         END;     <<ASCII>>                                             08040000
       END      <<TRANSLATE>>                                           08045000
       ELSE ASSEMBLE(DEL);                                              08050000
     END;     <<READ LOOP>>                                             08055000
     ASSEMBLE(DDEL; DEL);     <<CLEAR OUT BUFFER POINTERS>>             08060000
     IF SCRATCH THEN                                                    08065000
     BEGIN     <<INVALID HOLLERITH>>                                    08070000
       CLBFULLSUB;                                                      08075000
       QMISCP.(3:1) := 1;     <<WAIT FOR OP. TO CLEAR CARD>>   <<00597>>08080000
       TOS := 1;                                               <<00597>>08085000
       TOS := CALLCMPLT;  <<WAIT FOR INTERRUPT>>               <<00597>>08090000
       GO BEND;                                                <<00597>>08095000
     END;                                                               08100000
    CLBFULLSUB;                                                         08105000
           IF MODE=COLBIN AND FCNT=96 THEN                              08110000
           BEGIN  <<CHECK FOR 6 BIT :EOF:>>                             08115000
             IF SIOP(48)=%12 AND SIOP(49)=%65 AND                       08120000
             SIOP(50)=%46 AND SIOP(51)=%66 AND SIOP(52)=%12             08125000
             THEN                                                       08130000
             BEGIN  <<6 BIT :EOF: FOUND>>                               08135000
               TOS:=LPDTD(LDEV);                                        08140000
               TOS.EOF:=1; <<SET HARDWARE EOF>>                         08145000
               LPDTD(X):=TOS;                                           08150000
             END;                                                       08155000
         END;  <<CHECK FOR 6 BIT :EOF:>>                                08160000
         EOFCHECK(IOQP,IF LOGICAL(AXBFLG) THEN ABUF ELSE UBUF,          08165000
         HCNT,IF MODE=ASCII THEN 1 ELSE -1);                            08170000
         IF <> THEN                                                     08175000
         BEGIN     <<EOF FOUND>>                                        08180000
           IF < THEN IF AXBFLG=0 THEN                                   08185000
           BEGIN     <<ON EOF SAVE DATA IN AUX BUFFER>>                 08190000
             TOS:=ABUF;                                                 08195000
             TOS:=UBUF;                                                 08200000
             TOS:=HCNT;                                                 08205000
             ASSEMBLE(MABS);                                            08210000
             DEOF:=1;                                                   08215000
           END;                                                         08220000
           IF AXBFLG=1 THEN DEOF:=1;                                    08225000
           MSTATE:=ENDIO;                                               08230000
           RETURN;                                                      08235000
         END                                                            08240000
         ELSE                                                           08245000
         BEGIN     <<EOF NOT FOUND>>                                    08250000
           IF AXBFLG=1 THEN                                             08255000
           BEGIN     <<MOVE DATA FROM AUX BUFFER TO USERS>>             08260000
SWPBUF:                                                                 08265000
             TOS:=UBUF;                                                 08270000
             TOS:=ABUF;                                                 08275000
             TOS:=IOQP(QWBCNT);                                         08280000
             IF S0.(0:1)=1 THEN                                         08285000
             BEGIN                                                      08290000
             TOS:=-TOS;  TOS:=TOS&ASR(1); <<SET TO WORD CNT>>           08295000
             END;                                                       08300000
             IF S0 > HCNT THEN S0:=HCNT;                                08305000
             ASSEMBLE(MABS);                                            08310000
             AXBFLG:=0;                                                 08315000
           END;                                                         08320000
           DEOF:=0;     <<RESET EOF FLAG IN DIT>>                       08325000
         END;                                                           08330000
       GO WELLDONE;                                                     08335000
   END;      <<READ COMPLETION>>                                        08340000
   IF FUNC = WRITE THEN                                                 08345000
$PAGE                                                                   08350000
<<  C O M P L E T O R  W R I T E  >>                                    08355000
                                                                        08360000
   BEGIN     <<WRITE COMPLETION>>                                       08365000
     IF WRITEWORD.(4:1)=1 THEN GO WELLDONE;                             08370000
     <<IF INHIBIT FEED, NO CHECK FOR CARD AT VWS>>             <<00597>>08375000
     QMISCP:=0;                                                         08380000
     TOS:=%10;                                                          08385000
     ASSEMBLE(CIO 1);     <<DSE>>                                       08390000
     IF <> THEN GO UFAIL;                                               08395000
     ASSEMBLE(TIO 0);                                                   08400000
     IF < THEN GO UFAIL;                                                08405000
     IF S0.(11:1)=0 THEN                                       <<00288>>08410000
     BEGIN  <<NO CARD IN WAIT STATION SHOULD BE>>                       08415000
         << FIRST SEE IF DUE TO HOPPER EMPTY>>                 <<00288>>08420000
         << IF SO, SKIP MESSAGE...IT WILL BE CAUGHT >>         <<00288>>08425000
         << DURING WRITE INITIATOR FOR NEXT CARD >>            <<00288>>08430000
                                                               <<00288>>08435000
         IF TOS.(12:1) = 1 AND WRITEWORD.(3:1) = 1             <<00288>>08440000
          THEN GO WELLDONE;                                    <<00288>>08445000
         IF WRITEWORD.(3:1) = 0  THEN  <<SEE IF HOPR 1 EMPTY>> <<00288>>08450000
         BEGIN                                                 <<00288>>08455000
            TOS := DRTN;                                       <<00288>>08460000
            ASSEMBLE (RIO 0);                                  <<00288>>08465000
            ASSEMBLE (DELB);     <<DELETE DRTN>>               <<00288>>08470000
            IF <  THEN  GO UFAIL;                              <<00288>>08475000
            IF S0.(0:1) = 1  THEN GO FAIL;                     <<00288>>08480000
            IF TOS.(6:1) = 1  THEN GO WELLDONE;                <<00288>>08485000
         END;                                                  <<00288>>08490000
       IOMESSAGE(1,11,%10000,LDEV,,,,,0);                      <<0U.EB>>08495000
         QMISCP:=%40000;                                       <<01.02>>08500000
       TOS:=2;                                                          08505000
         DISABLE;                                              <<01.02>>08510000
       ASSEMBLE (CIO 1);     <<EIR>>                                    08515000
       IF <> THEN GO UFAIL;                                             08520000
       TOS:=0;                                                          08525000
       TOS:=WNEW;                                                       08530000
       GO BEND;                                                         08535000
     END                                                                08540000
     ELSE                                                               08545000
     BEGIN                                                              08550000
         DEL;      <<DELETE STATUS WORD>>                      <<00288>>08555000
CLEARB:                                                                 08560000
       CLBFULLSUB;                                                      08565000
                                                                        08570000
       GO WELLDONE;                                                     08575000
     END;                                                               08580000
   END;      <<WRITE COMPLETION>>                                       08585000
   IF FUNC = CLOSE THEN GO WELLDONE;                                    08590000
$PAGE                                                                   08595000
   IF FUNC=OPEN THEN                                                    08600000
   BEGIN                                                                08605000
     IF P2.(13:3)=1 THEN GO CLEARB;                                     08610000
   END;                                                                 08615000
$PAGE                                                                   08620000
<<  C O M P L E T O R  I N V A L I D  >>                                08625000
                                                                        08630000
<< IF YOU GET HERE FUNCTION IS INVALID.SHOULD NOT HAPPEN>>              08635000
   TOS:=INVALID;                                                        08640000
   TOS:=ENDIO;                                                          08645000
   GO BEND;                                                             08650000
                                                                        08655000
HELP;   <<***PROVIDE LINKAGE FOR HELP DEBUGGER***>>            <<00597>>08660000
                                                               <<00597>>08665000
END;     <<PRPCHDVR>>                                                   08670000
<< D R I V E R  L I N K A G E  A R E A >>                               08675000
                                                                        08680000
ASSEMBLE(                                                               08685000
         PCAL SIODM;          <<MONITOR>>                               08690000
         PCAL PRPCHDVR;       <<INITIATOR>>                             08695000
         PCAL PRPCHDVR;       <<COMPLETOR>>                             08700000
         CON 0;               <<NO I/O PROCESS>>                        08705000
         PCAL INITZ;          <<INITIALIZATION>>                        08710000
         CON 1;               <<1 INTERRUPT HANDLER>>                   08715000
         PCAL GIP);           <<INTERRUPT HANDLER>>                     08720000
END.                                                           <<02698>>08725000
