$CONTROL USLINIT,MAP,CODE                                               00010000
<<  HIOCDRD0, MODULE 28 - HP2893A CARD READER DRIVER SERIES 33     >>   00012000
<<  HP32033C MPE SOURCE C.00.00 >>                                      00014000
<<  COPYRIGHT     (C) COPYRIGHT HEWLETT-PACKARD CO. 1981.,         >>   00016000
<<    THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A,      >>   00018000
<<    TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR,    >>   00020000
<<    STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION,>>   00022000
<<    OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED,  >>   00024000
<<    WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>   00026000
<<****NOTE - DOLLAR COPYRIGHT CANNOT BE USED WITH THIS MODULE ***  >>   00028000
$TITLE "CARD READER DRIVER  -  HIOCDRD0(28)"                            00030000
$CONTROL PRIVILEGED,UNCALLABLE,MAIN=HIOCDRD0                            00032000
$TP                                                                     00034000
                                                                        00036000
comment                                                                 00038000
                                                                        00040000
            3000 Series 33 Card Reader Driver   - HIOCDRD0              00042000
            ---------------------------------------------               00044000
                                                                        00046000
                                                                        00048000
Structure of HIOCDRD0:                                                  00050000
                                                                        00052000
HIOCDRD0, together with the SIO Device Monitor (SIODM) constitute a     00054000
standard MPE Type 1 I/O Driver/Monitor.  This means that it does not    00056000
run in its own process, but executes on any stack and therefore must    00058000
run to completion.  During initialization it executes on PROGEN's       00060000
stack, during request initiation it executes on the CALLER'S stack      00062000
or the ICS, and during interrupt processing it always executes          00064000
on the ICS (Interrupt Control Stack).                                   00066000
                                                                        00068000
HIOCDRD0 consists of a global area, two procedures, and an "outer       00070000
block" which is really a linkage area for INITIAL.  The global area     00072000
contains an array called INITIAL which is comprised of three parts.     00074000
The first part specifies the size of the other two, the unit extract    00076000
instruction, and various parameters which are used by INITIAL.  This    00078000
section is deleted after INITIAL is through with it.  The other two     00080000
parts are the Device Information Table (DIT) and the Channel Program    00082000
area, which is part of the Interrupt Linkage Table (ILT).  INITIAL      00084000
will put each of these items in the area of memory where it belongs.    00086000
The linkage area specifies the procedure labels (P-labels) of the       00088000
associated monitor (SIODM), the request initiator (CRDRVR), the         00090000
request completor (CRDRVR), the initialization procedure (CRINIT,       00092000
called by PROGEN at system startup), and the interrupt handler (GIP).   00094000
                                                                        00096000
$PAGE                                                                   00098000
Operation of HIOCDRD0:                                                  00100000
                                                                        00102000
The primary working code of HIOCDRD0 is a procedure CRDRVR.  CRDRVR is  00104000
called with five parameters.  Two of these parameters, BANK and         00106000
BUFFADDR, are the absolute buffer address of the data to be processed.  00108000
The other three, DITP, IOQP, and SIOP are pointers to three arrays.     00110000
DITP is a pointer to the Device Information Table which contains        00112000
information about its associated card reader unit.  There is one DIT for00114000
unit on the controller (For the card reader there is only one unit      00116000
per controller.) and they contain information which must be             00118000
saved between I/O requests to the driver.  IOQP is a pointer to the     00120000
Input/Output Queue element.  IOQ elements contain information relevent  00122000
to the current request.  SIOP is a pointer to the first element of the  00124000
Channel Program which is actually part of the Interrupt Linkage Table.  00126000
These three elements are described in more detail elsewhere in this     00128000
document.                                                               00130000
                                                                        00132000
CRDRVR is always called by the SIO device monitor (SIODM).  The driver  00134000
then determines the reason for the call by examining the MSTATE, which  00136000
contains the state of the monitor, the IOQ and the DIT.                 00138000
When a new request is initiated, CRDRVR examines the function code      00140000
and parameter fields contained in the IOQ element to determine the      00142000
task that is desired.  The proper command codes and program branches    00144000
are then placed in the Channel Program and its execution is begun.      00146000
                                                                        00148000
Upon completion of the channel program, an interrupt is                 00150000
generated and CRDRVR is again called.  The code checks for              00152000
a request in progress (an IOQP that is nonzero) and if this             00154000
is the case, branches to the completion section of the                  00156000
driver.  Here several status words are examined for errors or special   00158000
conditions which might have occurred during the execution of the        00160000
Channel Program, during the data transfer, or during the operation of   00162000
the card reader unit.  These condition can cause special status         00164000
returns to be returned to the caller.  A list of the conditions         00166000
and the return codes is provided in this document.                      00168000
If the Driver is called with an IOQP of zero then it will start         00170000
an IDLE channel program.                                                00172000
                                                                        00174000
The initialization procedure CRINIT starts an idle channel              00176000
program which consists of a wait, a DSJ (to clear the power             00178000
up interrupt from the device) and an interrupt halt.                    00180000
                                                                        00182000
                                                                        00184000
                                                                        00186000
                                                                        00188000
        Development and Fix History                                     00190000
        ---------------------------                                     00192000
                                                                        00194000
Development Engineer: Dave Cassafer                                     00196000
8-4-82 Dave Cassafer - fixed problem where bank portion of     <<04623>>00198000
       AUXBUFADDRD was being set to -1.  Solution is to convert<<04623>>00200000
       an expression to LOGICAL before converting it to DOUBLE.<<04623>>00202000
$PAGE                                                                   00204000
                Device Information Table (DIT)                          00206000
                ------------------------------                          00208000
                                                                        00210000
                                                                        00212000
There is one DIT per physical device.  If a physical device represents  00214000
more than one logical device, the logical device number is obtained     00216000
from the IOQ element.  The following diagram shows the DIT used for     00218000
the card reader driver.                                                 00220000
                                                                        00222000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00224000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00226000
  0| 0| 0|AC|RQ| 0|MU| 0|IO|IA|NO|ST| 0|   STATE   |   DFLAG            00228000
   +--+--+--+--+--+--+--+--+--+--+--+--+-----------+                    00230000
  1| SYSDB relative pointer to the DIT for the next|   DLINK            00232000
   | device requesting this resource or service    |                    00234000
   +-----------------------------------------------+                    00236000
  2| SYSDB relative pointer to the first IOQ in    |   DIOQP            00238000
   | request list for this device                  |                    00240000
   +--------+--------------+-----------------------+                    00242000
  3|  IOT   | Phys. unit # | Logical device number |   DLDEV            00244000
   +--------+--------------+-----------------------+                    00246000
  4| SYSDB relative pointer to Device Linkage Table|   DDLTP            00248000
   +-----------------------------------------------+                    00250000
  5| SYSDB relative pntr to Interrupt Linkage Table|   DILTP            00252000
   +-----------------------------------------------+                    00254000
  6|RD|AF|                                         |   DSAVE            00256000
   +-----------------------------------------------+                    00258000
  7| Hardware error status.  Set when the driver   |   DSERR            00260000
   | detects an error.  Whenever <>0, the driver   |                    00262000
   | monitor logs an I/O error and clears this word|                    00264000
   +--+--+--+--+--+--------------------------------+                    00266000
%10| Not Used                                      |   DTIME            00268000
   +--+--+--+--+--+--------------------------------+                    00270000
%11|           Request word count                  |   DWCNT            00272000
   +-----------------------------------------------+                    00274000
%12| Device Status.  Read from device during       |   DSTAT            00276000
   | each execution of the channel program.        |                    00278000
   +-----------------------------------------------+                    00280000
%13! Logging will be done from here.               !  DLOGERROR         00282000
   +-----------------------------------------------+                    00284000
                                                                        00286000
$PAGE                                                                   00288000
DFLAG - Flags and request state                                         00290000
  AC  ACTIVE  - A monitor is currently servicing this device.           00292000
  RQ  REQUEST - A service request is pending while the monitor is       00294000
                active.                                                 00296000
  MU  MUNIT   - This device is on a multi-unit controller.              00298000
  IO  IOPROG  - An I/O Channel Program is running for this device.      00300000
  IA  IAK     - An interrupt or response has occurred for this device.  00302000
  NO  NOTRDY  - Go to state %10 after Idle Channel Program is started.  00304000
  ST  STWAIT  - The device monitor is starting an Idle Channel Program  00306000
                for this device.  There is no IOQ associated with this  00308000
                type of request.                                        00310000
  STATE       - State of the device monitor.  Specifies the next action 00312000
                to be taken in SIODM in servicing the request:          00314000
                  0 - start new request                                 00316000
                  1 - not used                                          00318000
                  2 - call driver initiator procedure                   00320000
                  3 - call driver completor procedure                   00322000
                  4 - not used                                          00324000
                  5 - process request completed                         00326000
                  6 - initiate device recognition sequence              00328000
                  7 - start operator intervention wait                  00330000
                %10 - wait for interrupt (operator intervention)        00332000
                      restart at state 0                                00334000
                %11 - wait for data segment freeze, then state 2        00336000
                %12 - wait for driver initiator to be frozen, then      00338000
                      allocate controller (state 2)                     00340000
                %13 - wait for I/O completion interrupt, then state 3   00342000
                %14 - wait for controller, then call driver initiator   00344000
                %15 - not used                                          00346000
                %16 - wait for initiator make present, then state 2     00348000
                %17 - wait for completor make present, then state 3     00350000
                                                                        00352000
DLDEV - Device logical device number                                    00354000
  IOT  I/O TYPE  -  I/O System type                                     00356000
                    0 = Series II / III  I/O system                     00358000
                    1 = HP-IB                                           00360000
                    2 = unused                                          00362000
                    3 = unused                                          00364000
                                                                        00366000
DSAVE - Device processing flags                                         00368000
  RD  READDONE    - A card has already been read.                       00370000
  AF  ABORTFLAG   - A device clear has already been sent for            00372000
                    this series of aborted IOQs                         00374000
                                                                        00376000
$PAGE                                                                   00378000
                Interrupt Linkage Table (ILT)                           00380000
                -----------------------------                           00382000
                                                                        00384000
                                                                        00386000
There is one ILT for each device controller configured on the system.   00388000
The card reader controller will support only one unit per controller.   00390000
                                                                        00392000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00394000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00396000
  0|         Channel                               |   ICPVA0           00398000
  1|              Program                          |   ICPVA1           00400000
  2|                  Variable                     |   ICPVA2           00402000
  3|                       Area (ICPVA)            |   ICPVA3           00404000
   +-----------------------------------------------+                    00406000
  4|         DMA Abort                             |   ICPVA4           00408000
  5|              Address                          |   ICPVA5           00410000
   +-----------------------------------------------+                    00412000
  6|                      0                        |   ISRQL            00414000
   +--+-----------------+-----+-----------+--------+                    00416000
  7|LI|     CHANQUE     |     |   CHAN    |  DEV   |   ICNTRL           00418000
   +--+-----------------+-----+-----------+--------+                    00420000
%10| SYSDB relative pointer to Channel Program area|   ISIOP            00422000
   +-----------------------------------------------+                    00424000
%11| SYSDB relative pointer to Status Return area. |   ISTAP            00426000
   +-----------------------------------------------+                    00428000
%12| single instruction that is executed to extract|   IUNIT            00430000
   | the device unit number from the status pointed|                    00432000
   | to by ISTAP.                                  |                    00434000
   +-----------------------------------------------+                    00436000
%13| SYSDB relative DIT pointer of the device      |   ICDP             00438000
   | currently using the channel to perform a      |                    00440000
   | data operation.                               |                    00442000
   +-----------------------+-----------------------+                    00444000
%14|       SIOPSIZE        |        CQUEN          |   IQUEUE           00446000
   +--+--+--+--------------+-----------+-----------+                    00448000
%15|RW|WP|IG|                          |  HCUNIT   |   IFLAG            00450000
   +--+--+--+--------------------------+-----------+                    00452000
%16| SYSDB relative DIT pointer for unit 0         |   IDITP0           00454000
   +-----------------------------------------------+                    00456000
%20|             Card Reader                       |                    00458000
   .               Channel                         .                    00460000
   |                 Program                       |                    00462000
   +-----------------------------------------------+                    00464000
                                                                        00466000
$PAGE                                                                   00468000
ICPVA0 - Channel Program Variable Area                                  00470000
                                                                        00472000
  The first word is used by the channel program processor to store      00474000
  status information after I/O channel aborts.  The next word is used   00476000
  by the driver to indicate if status should be examined for special    00478000
  conditions or errors.  The other two words are not used.              00480000
                                                                        00482000
                                                                        00484000
ICPVA4 - DMA abort address                                              00486000
                                                                        00488000
  If a DMA abort occurs, the absolute address where the abort occurred  00490000
  is stored in this area.                                               00492000
                                                                        00494000
                                                                        00496000
ICNTRL - Contains controller information                                00498000
                                                                        00500000
  LIM     - If this bit is set, the controller is sharing a software    00502000
            channel resource in order to limit bandwidth.               00504000
  CHANQUE - The software channel resource number.                       00506000
  CHAN    - Channel number (four most significant bits of DRTN).        00508000
  DEV     - Device number (three least significant bits of DRTN).       00510000
                                                                        00512000
                                                                        00514000
IQUEUE -                                                                00516000
                                                                        00518000
  SIOPSIZE - (number of words + 1)/2 in the channel program area.       00520000
  CQUEN    - For a multi-unit controller this field contains the        00522000
             software controller resource number.                       00524000
                                                                        00526000
                                                                        00528000
IFLAG - Controller and Channel Program state flags                      00530000
                                                                        00532000
  RUNWAIT  - An Idle Channel Program should be started when there       00534000
             are no active requests to process.                         00536000
  WAITPROG - An Idle Channel Program has been started for this          00538000
             controller.  This bit is reset by an interrupt.            00540000
  IGNOREHI - An HIOP instruction has been issued against this	          00542000
             controller but the channel program was not in a wait       00544000
             statement.  Therefore ignore the interrupt generated by    00546000
             the channel code when this program halts.                  00548000
  HCUNIT   - Highest configured unit number for this controller.        00550000
$PAGE                                                                   00552000
            I/O QUEUE ELEMENT (IOQ)                                     00554000
            -----------------------                                     00556000
                                                                        00558000
                                                                        00560000
     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   MNEMONIC          00562000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00564000
  0|      Request dependent flags (see below)      |   QFLAG            00566000
   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                    00568000
  1| SYSDB relative pointer to next IOQ element.   |   QLINK            00570000
   | Points to first word of element.              |                    00572000
   +-----------------------+-----------------------+                    00574000
  2|                       | Logical device number |   QLDEV            00576000
   +--+--+--+--+--+-----+--+-----+--------+--------+                    00578000
  3|       Auxillary buffer flag.                  |   QMISC            00580000
   +--+--+--+--+--+-----+--------+--------+--------+                    00582000
  4| S| If QFLAG.(3:1) is clear then this is the   |   QDSTN            00584000
   |  | DST number of the target data segment.  If |                    00586000
   |  | S is set, QADDR is DB relative.            |                    00588000
   +--+--------------------------------------------+                    00590000
  5| Offset in the data segment or system buffer   |   QADDR            00592000
   | table to the target data buffer.              |                    00594000
   +-----------------------+-----------------------+                    00596000
  6|                       | Function code for     |   QFUNC            00598000
   |                       | this request.  (See   |                    00600000
   |                       | next section.)        |                    00602000
   +-----------------------+-----------------------+                    00604000
  7| On initiation, specifies the word count (>0)  |   QWBCT            00606000
   | or byte count (<0).  At completion of the     |                    00608000
   | request this location contains the actual     |                    00610000
   | transmission count in the same units (bytes   |                    00612000
   | or words) as in the request.                  |                    00614000
   +-----------------------------------------------+                    00616000
%10| Parameter 1.  Contains the EOF specification  |   QPAR1            00618000
   +-----------------------------------------------+                    00620000
%11| Parameter 2.  Contains the data mode          |   QPAR2            00622000
   | specification in bits (11:2). (See below card |                    00624000
   | reader request codes for detail information)  |                    00626000
   +-----------------------+--------------+--------+                    00628000
%12|         PCBN          |  QUALIFIER   | STATUS |   QSTAT            00630000
   +-----------------------+--------------+--------+                    00632000
                                                                        00634000
$PAGE                                                                   00636000
QFLAG - Request dependent flags                                         00638000
                                                                        00640000
  Bit 0  ABORT     - Abort this request and return an error indication  00642000
                     to the caller.                                     00644000
  Bit 1  SPECIAL   - Apply special handling to this request.  (Not used)00646000
  Bit 2  DIAG      - This is a request from the diagnostic subsystem.   00648000
  Bit 3  SYSBUFF   - Target is an index relative to the SBUF Table of   00650000
                     the data buffer.                                   00652000
  Bit 4  IOWAKE    - Wake caller on completion of request.              00654000
  Bit 5  BLOCKED   - Blocked I/O.  The caller is waited in ATTACHIO     00656000
                     until the request is completed.  Implies IOWAKE.   00658000
  Bit 6  COMPLETED - The request has been completed and the caller      00660000
                     awakened if he had requested (with IOWAKE).        00662000
  Bit 7  DATAFRZN  - Set by the memory management routines (MAM) when a 00664000
                     MAKEPRESENT request is successfully completed and  00666000
                     indicates the data segment is frozen in memory.    00668000
  Bit 8  MAMERRORD - An error has occurred while MAM was trying to      00670000
                     make the target data segment present and freeze    00672000
                     it in memory.                                      00674000
  Bit 9  PREQ      - (Not used)                                         00676000
  Bit 10 SFAIL     - Delayed failure of SIO instruction.  If a call to  00678000
                     STARTIO resulted in the request being added to     00680000
                     the channel queue, this bit indicates that the SIO 00682000
                     instruction failed when the request was selected   00684000
                     for execution.                                     00686000
  Bit 11 PFAIL     - The request was aborted because of a system power  00688000
                     failure.                                           00690000
                                                                        00692000
                                                                        00694000
QMISC - Auxillary buffer flag  used to indicated a read into the        00696000
        driver's buffer and not the user's buffer.                      00698000
                                                                        00700000
                                                                        00702000
QSTAT - PCB number and request completion status.                       00704000
                                                                        00706000
  PCBN    - The Process Control Block (PCB) number of the process       00708000
            which made this request.  If zero, the request is not       00710000
            associated with any process and the IOQ element is to       00712000
            be returned by the system when the request has completed.   00714000
  STATUS  - General status indicating the final state of the request.   00716000
            The following codes are used:                               00718000
              0 - Not started or awaiting completion.                   00720000
              1 - Successful completion.                                00722000
              2 - End-of-file detected.                                 00724000
              3 - Unusual, but recoverable, condition detected.         00726000
              4 - Irrecoverable error has occurred.                     00728000
  QUALIFIER - A code which further defines or qualifies the general     00730000
              status.  (See the section Driver Return Status Codes.)    00732000
                                                                        00734000
$PAGE                                                                   00736000
           CARD READER REQUEST CODES                                    00738000
           ----------------------                                       00740000
                                                                        00742000
                                                                        00744000
   0 - READ                                                             00746000
         P1       - END OF FILE SPECIFICATION                           00748000
         P2(11:2) - DATA MODE                                           00750000
                    0 =  PACKED ASCII. COUNT TRUNCATED TO 80 BYTES      00752000
                         MAXIMUM                                        00754000
                    1 =  COLUMN BINARY. COUNT TRUNCATED TO 160 BYTES    00756000
                         MAXIMUM                                        00758000
                    2 =  UNASSIGNED                                     00760000
                    3 =  UNASSIGNED                                     00762000
         ***NOTE: ODD BYTE COUNTS ARE ROUNDED UP AS THEY WERE           00764000
                  IN THE SERIES III DRIVER.                             00766000
   1 - UNUSED   (INVALID OPCODE FOR THIS DEVICE)                        00768000
   2 - OPEN FILE (NO OPERATION)                                         00770000
   3 - CLOSE FILE (NO OPERATION)                                        00772000
   4 - CLOSE DEVICE (CLEAR EOF STATUS IN LPDT)                          00774000
   5 - 14   - UNUSED  (INVALID OPCODE FOR THIS DEVICE)                  00776000
 %17 - READ STATUS                                                      00778000
%110 - GET IDENTITY                                                     00780000
%111 - INITIATE SELF TEST                                               00782000
%113 - WRITE LOOPBACK DATA                                              00784000
%114 - READ LOOPBACK DATA                                               00786000
%275 - DEVICE CLEAR                                                     00788000
                                                                        00790000
                       DRIVER RETURN STATUS CODES                       00792000
                       --------------------------                       00794000
                                                                        00796000
                                                                        00798000
 GENERAL STATUS (13:3)       QUALIFYING STATUS (8:5)      OVERALL (8:8) 00800000
  0 - PENDING               1 - WAITING FOR COMPLETION         %10      00802000
                            3 - NOT READY WAIT                 %30      00804000
                                                                        00806000
  1 - SUCCESSFUL            0 - NO ERRORS                        1      00808000
                                                                        00810000
  2 - END OF FILE           [NOT USED]                                  00812000
                                                                        00814000
  3 - UNUSUAL CONDITION     3 - REQUEST ABORTED                %33      00816000
                            6 - POWERFAIL ABORT                %63      00818000
                          %21 - DEVICE POWERED UP             %213      00820000
                                                                        00822000
  4 - IRRECOVERABLE ERROR   0 - INVALID REQUEST                  4      00824000
                            3 - TIMING ERROR                   %34      00826000
                            4 - SIO FAILURE                    %44      00828000
                            5 - UNIT FAILURE                   %54      00830000
                          %12 - SYSTEM ERROR                  %124      00832000
                          %14 - CHANNEL FAILURE               %144      00834000
                                                                        00836000
                                                                        00838000
endcomment;                                                             00840000
$PAGE                                                                   00842000
BEGIN                                                                   00844000
EQUATE                                                                  00846000
                                                                        00848000
               << FUNCTION CODES >>                                     00850000
                                                                        00852000
    DCLEAR          = %275,       <<DEVICE CLEAR>>                      00854000
    DCLOSE          = 4,          <<DEVICE CLOSE FUNCTION CODE>>        00856000
    FCLOSE          = 3,          <<FILE CLOSE FUNCTION CODE>>          00858000
    FOPEN           = 2,          <<FOPEN FUNCTION CODE>>               00860000
    IDENTITY        = %110,       <<"GET IDENTITY" FUNCTION CODE>>      00862000
    INITTEST        = %111,       <<INITIATE SELF TEST FUNCTION>>       00864000
    READ            = 0,                                                00866000
    READSTAT        = %17,        <<RETURN STATUS FUNCTION CODE>>       00868000
    READLOOP        = %114,       <<READ LOOPBACK DATA FUNCTION>>       00870000
    WRITELOOP       = %113,       <<WRITE LOOPBACK DATA FUNCTION>>      00872000
                                                                        00874000
               << CARD READER CHANNEL PROGRAM COMMANDS >>               00876000
                                                                        00878000
    CLEAR           = %4400,                                            00880000
    INIT'SELFTEST   = %4017,                                            00882000
    JUMP            = 0,                                                00884000
    PICKASCII       = %2001,                                            00886000
    PICKBINARY      = %2000,                                            00888000
    READCOMMAND     = %1400,                                            00890000
    READ'SELFTEST   = %3417,      <<READ SELFTEST RESULTS>>             00892000
    READSTATCOMMAND = %1401,                                            00894000
    WAIT            = %1000,                                            00896000
                                                                        00898000
               << QSTAT STATUS RETURNS >>                               00900000
                                                                        00902000
    ABORTED         = %33,        <<REQUEST ABORTED RETURN STATUS>>     00904000
    CHANFAIL        = %144,       <<CHANNEL FAILURE>>                   00906000
    GOODIO          = 1,          <<SUCCESSFUL I/O STATUS RETURN>>      00908000
    INVALIDOP       = 4,          <<INVALID OPERATION REQUESTED>>       00910000
    OFFLINESTAT     = %30,        <<DEVICE IS NOT READY OR OFFLINE>>    00912000
    PENDING         = %10,        <<PENDING/WAITING FOR COMPLETION>>    00914000
    PFABORT         = %63,        <<POWERFAIL ABORT>>                   00916000
    POWERUPSTAT     = %213,       <<DEVICE HAS BEEN POWERED UP>>        00918000
    SIOFAIL         = %44,        <<START SIO FAILURE>>                 00920000
    SYSERROR        = %124,       <<SYSTEM ERROR REQUEST STATUS CODE>>  00922000
    TIMING'ERROR    =  %34,       <<ERROR RETURNED AFTER READ CHECK>>   00924000
    XFER'ERROR      =  %14,       <<ERROR RETURNED AFTER BUS ERROR>>    00926000
$PAGE                                                                   00928000
               << CHANNEL PROGRAM ARRAY POINTERS >>                     00930000
                                                                        00932000
    DEVCLEAR        = 28,         <<CLEAR COMMAND>>                     00934000
    READBANK        = 16,         <<BANK WHERE DATA IS TO GO>>          00936000
    READADDR        = 17,         <<ADDRESS WHERE DATA IS TO GO>>       00938000
    DSJGOOD         = 11,         <<ADDRESS WHERE CONTROL TRANFERS      00940000
                                  IF PREVIOUS OPERATION SUCCESSFULL>>   00942000
    IDENTIFY        = 32,         <<ADDR OF IDENTIFY INSTR>>            00944000
    IDENTSTORE      = 33,         <<CHANNEL STORES IDENTITY HERE>>      00946000
    JMPADDR         = 1,          <<ADDRESS IN CHANNEL PROGRAM OF       00948000
                                    FUNCTION TO BE DONE>>               00950000
    JUMP'OR'WAIT    = 18,         <<JUMP OR WAIT GOES HERE>>            00952000
    JMPADDR2        = 19,         <<JMP ADDR IF JUMP'OR'WAIT=JUMP>>     00954000
    PICKCOUNT       = 43,         <<8/BYTES,8/BURST>>                   00956000
    READORDER       = 13,         <<READ ORDER IN SIO PROGRAM>>         00958000
    READBURST       = 15,         <<BURST LENGTH IN READ COMMAND>>      00960000
    READBYTES       = 14,         <<NUMBER OF BYTES TO READ>>           00962000
    RORDER2         = 20,                                               00964000
    RBYTES2         = 21,         <<NUMBER OF BYTES IN 2ND READ>>       00966000
    RBURST2         = 22,                                               00968000
    RBANK2          = 23,                                               00970000
    RADDR2          = 24,                                               00972000
    READSTATBYTE    = 26,         <<NUMBER OF STATUS BYTES TO READ>>    00974000
    READSTATDEST    = 29,         <<ADDR OF WHERE STATUS TO GO>>        00976000
    STARTIDLE       = 36,         <<START OF IDLE CHANNEL PROG>>        00978000
    TEMPSTORE       = 44, <<TYPE OF SELFTEST OR BYTE OF LOOPBACK DATA>> 00980000
    WRITEADDR       = 6,          <<ADDRESS IN WRITE COMMAND>>          00982000
    WRITEBANK       = 5,          <<BANK IN WRITE COMMAND>>             00984000
    WRITEBURST      = 4,          <<BURST LENGTH IN WRITE COMMAND>>     00986000
    WRITEBYTES      = 3,          <<NUMBER OF BYTES TO WRITE>>          00988000
    WRITEORDER      = 2,          <<COMMAND TO BE DONE>>                00990000
                                                                        00992000
               << PROGRAM CONSTANTS >>                                  00994000
                                                                        00996000
    CALL'COMPLETOR  = %13,                                              00998000
    CHANPROGSIZE    = 46,         <<DOES NOT INCLUDE AUX READ BUFFER>>  01000000
    CRDITSIZE       = 12,         <<CARD READER DIT SIZE>>              01002000
    CRSIOSIZE       = CHANPROGSIZE+40,<<INCLUDES AUXILLARY READ BUFFER>>01004000
    CRSIOSIZED2     = (CRSIOSIZE+1)/2,                                  01006000
                        <<ADDING 1 TO CRSIOSIZE BEFORE DIVIDING         01008000
                          BY 2 INSURES THAT SUFFICIENT SPACE            01010000
                          WILL BE ALLOCATED FOR A CHANNEL               01012000
                          PROGRAM OF ODD LENGTH>>                       01014000
    OPCONSOLE       = 0,          <<OUTPUT MESSAGE TO OPERATOR>>        01016000
    HOPPERMTMSG     = 384,        <<HOPPER EMPTY MESSAGE>>              01018000
    LOGTROUBLE      = %100000,    <<TROUBLE WORTH LOGGING>>             01020000
    MOTPICMSG       = 385,        <<MOTION OR PICK CHECK>>              01022000
    NOTRDYMSG       = 11,         <<NOT READY MESSAGE # TO MESS PROC>>  01024000
    NOTREADY        = 7,          <<NOT READY DRIVER RETURN CODE>>      01026000
    RDCHKMSG        = 17,         <<READ CHECK MESSAGE>>                01028000
    REQUESTDONE     = 5,          <<REQUEST COMPLETED DRIVER RETURN>>   01030000
    START'REQUEST   = 2,          <<SIODM STATE FOR NEW REQUEST>>       01032000
    STKFULLMSG      = 383,        <<STACKER FULL MESSAGE>>              01034000
    SUB             = %32,        <<ASCII SUB-INDICATES BAD HOLLERITH>> 01036000
    SYSDB           = %1000,                                            01038000
    SYSLPDT         = %10,        <<LOGICAL PHYSICAL DEVICE TABLE>>     01040000
    TROUBLEBITS     = %177000,    <<MASK FOR HARDWARE STATUS>>          01042000
    UFAILMSG        = 208,        <<UNIT FAILURE MSG. NO.>>             01044000
               << TABLE ARRAY POINTERS >>                               01046000
    DILTP           = 5,          <<INTERRUPT LINKAGE TABLE PTR>>       01048000
    DLDEV           = 3,          <<LOGICAL DEVICE AND UNIT NUMBERS>>   01050000
    DLOGERROR       = %13,        <<LOGGING WILL BE DONE FROM HERE>>    01052000
    DSAVE           = 6,          <<DRIVER TEMP STORAGE>>               01054000
    DSTAT           = %12,         <<DEVICE STATUS READ TO HERE>>       01056000
    DSERR           = 7,          <<HARDWARE I/O ERROR STATUS IN DIT>>  01058000
    DTIME           = %10,        <<TIMER REQUEST>>                     01060000
    DWCNT           = 9,          <<HOLDS REQUESTED WORD COUNT>>        01062000
    ISIOP           = %10,        <<ILT POINTER TO SIOP>>               01064000
    QFLAG           = 0,          <<REQUEST DEPENDENT FLAGS>>           01066000
    QFUNC           = 6,          <<FUNCTION >>                         01068000
    QMISC           = 3,          <<MISCELLANEOUS STORAGE>>             01070000
    QPAR1           = 8,          <<CONTAINS EOF SPEC>>                 01072000
    QPAR2           = 9,          <<READ STOP CHAR;WRITE PRESPACE FLAG>>01074000
    QWBCT           = 7,          <<WORD (+) OR BYTE (-) COUNT>>        01076000
    QSTAT           = 10;         <<REQUEST STATUS AND PCB NUMBER>>     01078000
$PAGE                                                                   01080000
DEFINE                                                                  01082000
                                                                        01084000
             <<DSTAT BIT DEFINITIONS>>                                  01086000
                                                                        01088000
    BADHOLLERITH = (3:1)#,     <<INVAILD HOLLERITH STATUS>>             01090000
    BUSERROR     = (0:1)#,     <<BUSS ERROR>>                           01092000
    RDCHK        = (2:1)#,     <<READ CHECK>>                           01094000
    EOFBIT       = (10:1)#,    <<END OF FILE STATUS BIT>>               01096000
    HOPPERMT     = (5:1)#,     <<HOPPER EMPTY>>                         01098000
    MPCHK        = (7:1)#,     <<MOTION OR PICK CHECK>>                 01100000
    NRDY         = (1:1)#,     <<NOT READY OR OFFLINE>>                 01102000
    OFFLINE      = (6:1)#,                                              01104000
    POWERUP      = (11:1)#,                                             01106000
    STACKERFULL  = (4:1)#,     <<STACKER FULL>>                         01108000
                                                                        01110000
               << DSAVE BIT DEFINITIONS >>                              01112000
                                                                        01114000
    READDONE     = (0:1)#,     <<AUX BUF FOR CARD AFTER EOF RETURNED>>  01116000
    ABORTFLAG    = (1:1)#,     <<DEVICE CLEAR ALREADY SENT>>            01118000
                                                                        01120000
               << MISCELLANEOUS BIT DEFINITIONS >>                      01122000
                                                                        01124000
    ASCII        = NOT LOGICAL(DATAMODE)#, <<ASCII READ MODE REQUESTED>>01126000
    BINARY       = LOGICAL(DATAMODE)#,  <<BINARY READ MODE REQUESTED>>  01128000
    DIAG         = (2:1)#,     <<THIS BIT SIGNIFIES DIAGNOSTIC>>        01130000
    DLDEVN       = (8:8)#,     <<LOGICAL DEVICE NUMBER OF DIT>>         01132000
    EOF          = (7:3)#,     <<EOF STATE IN LPDT>>                    01134000
    ERRORCODE    = (0:3)#,     <<CPVAP, ERROR CODE>>                    01136000
    FUNC         = (8:8)#,     <<QFUNC, FUNCTION CODE>>                 01138000
    IOSTAT       = (8:8)#,     <<TOTAL REQUEST STATUS RETURNED>>        01140000
    PFAIL        = (11:1)#,    <<ABORT SET BECAUSE OF POWER FAIL>>      01142000
    SFAIL        = (10:1)#,    <<FAILURE ON DELAYED START SIO>>         01144000
    STATUS       = DITPL(DSTAT)#,  <<STATUS WORD IN DIT>>               01146000
    SUBTYPE      = (12:4)#;       <<TYPE OF SELFTEST>>                  01148000
$PAGE                                                                   01150000
LOGICAL LS0 = S-0,                                                      01152000
        LX  = X;                                                        01154000
                                                                        01156000
INTEGER S0 = S-0,                                                       01158000
        S1 = S-1,                                                       01160000
        X  = X;                                                         01162000
                                                                        01164000
DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                                   01166000
                                                                        01168000
                                                                        01170000
                                                                        01172000
                                                                        01174000
     << DIT DEFINITION AND DRIVER LINKAGE AREA  >>                      01176000
                                                                        01178000
ARRAY  INITIAL(0:3) = DB :=                                             01180000
   [8/CRDITSIZE, 8/%21],   <<DITSIZE/RUN IDLE CHANP,MONITOR TYPE>>      01182000
   0,                      <<NOT USED>>                                 01184000
   0,                      <<UNIT EXTRACT INSTRUCTION>>                 01186000
   [8/CRSIOSIZED2, 8/0];   <<CHANPROGSIZE/2,STATUSLENGTH IN ILT>>       01188000
                                                                        01190000
ARRAY DIT(1:CRDITSIZE) = DB :=                                          01192000
  0,    <<DFLAG>>                                                       01194000
  0,    <<DLINK>>                                                       01196000
  0,    <<DIOQP>>                                                       01198000
%40000, <<DLDEV - HPIB DEVICE>>                                         01200000
  0,    <<DDLTP>>                                                       01202000
  0,    <<DILTP>>                                                       01204000
  0,    <<DRQST>>                                                       01206000
  0,    <<DSERR>>                                                       01208000
  0,    <<DSAVE>>                                                       01210000
  0,    <<DWCNT>>                                                       01212000
  0,    <<DSTAT>>                                                       01214000
  0;    <<DLOGERROR>>                                                   01216000
$PAGE                                                                   01218000
ARRAY SIOA(1:CRSIOSIZE) = DB :=                                         01220000
<< CHANNEL PROGRAM>>                                                    01222000
<< 0>>                    0, <<JUMP TO APPROPRIATE STARTING POINT>>     01224000
<< 1>><<JMPADDR>>         0, <<FILL IN ADDRESS>>                        01226000
                                                                        01228000
<< 2>><<WRITEORDER>>      0, <<FILL IN COMMAND>>                        01230000
<< 3>><<WRITEBYTES>>      0, <<BYTE COUNT>>                             01232000
<< 4>>                    0, <<BURST LENGTH>>                           01234000
<< 5>><<WRITEBANK>>       0, <<BANK>>                                   01236000
<< 6>><<WRITEADDR>>       0, <<ADDRESS>>                                01238000
                                                                        01240000
<< 7>>                %1000, <<WAIT>>                                   01242000
<< 8>>                    0,                                            01244000
                                                                        01246000
<< 9>>                %2401, <<DSJ>>                                    01248000
<<10>>                    0, <<DSJ BYTE>>                               01250000
<<11>><<DSJGOOD   >>      0, <<FILL IN ADDRESS>>                        01252000
<<12>>                   12, <<GOTO READ STATUS>>                       01254000
                                                                        01256000
<<THIS IS THE READ COMMAND>>                                            01258000
                                                                        01260000
<<13>><<READORDER>>       0, <<FILL IN COMMAND>>                        01262000
<<14>><<READBYTES>>       0, <<BYTE COUNT>>                             01264000
<<15>>                    0, <<BURST LENGTH>>                           01266000
<<16>><<READBANK>>        0, <<BANK >>                                  01268000
<<17>><<READADDR>>        0, <<ADDRESS>>                                01270000
                                                                        01272000
<<18>><<JUMP'OR'WAIT>> %1000,<<JUMP OR WAIT>>                           01274000
<<19>>                    0,                                            01276000
                                                                        01278000
<<THIS IS THE SECOND READ IF BINARY CARD>>                              01280000
  <<OR READSTATUS DIRECT TO USERS BUFFER>>                              01282000
                                                                        01284000
<<20>><<RORDER2>>     %1400,                                            01286000
<<21>><<RBYTES2>>         0,                                            01288000
<<22>>                    0, <<BURST LENGTH>>                           01290000
<<23>><<RBANK2>>          0, <<BANK>>                                   01292000
<<24>><<RADDR2 >>         0,                                            01294000
                                                                        01296000
<<THIS IS A STATUS READ FOR THE DRIVER, OR THE CLEAR COMMAND>>          01298000
                                                                        01300000
<<25>><<READSTATUS>>  %1401,                                            01302000
<<26>>                    2, <<BYTE COUNT>>                             01304000
<<27>>                    0, <<BURST>>                                  01306000
<<28>><<DEVCLEAR>>    %2000,<<BANK 0,BIT 5 MEANS DONT UPDATE >>         01308000
<<29>><<READSTATDEST>>    0, <<ADDRESS>>          <<THE COUNT>>         01310000
                                                                        01312000
                                                                        01314000
<<30>>                 %601, <<INTERRUPT/HALT>>                         01316000
<<31>>                    1, <<CODE OF 1 IN CPVA(1)>>                   01318000
                                                                        01320000
<<32>><<IDENTIFY>>    %3000, <<GET IDENTITY>>                           01322000
<<33>><<IDENTSTORE>>      0, <<IDENTITY WILL BE PUT HERE>>              01324000
                                                                        01326000
<<34>>                    0, <<JUMP TO READ STATUS>>                    01328000
<<35>>                  -11,                                            01330000
$PAGE                                                                   01332000
<<36>><<STARTIDLE>>   %1000, <<WAIT>>                                   01334000
<<37>>                    0,                                            01336000
                                                                        01338000
<<38>>                %2400, <<DSJ TO CLEAR POWERUP INTERRUPT>>         01340000
<<39>>                    0,                                            01342000
<<40>>                    0, <<VECTOR ADDR FOR DSJ= 0>>                 01344000
                             <<FALL THRU IF DSJ=1 OR 2>>                01346000
<<41>>                 %601, <<INTERRUPT/HALT>>                         01348000
<<42>>                    2, <<CODE OF 2 IN CPVA(1)>>                   01350000
                                                                        01352000
<<43>><<PICKCOUNT>>       0, <<8/BYTES,8/BURST>>                        01354000
<<44>><<TEMPSTORE>>       0; <<SUBTEST FOR SELF TEST OR LOOPBACK DATA>> 01356000
                                                                        01358000
                                                                        01360000
<<*** 40 WORDS FOR AUXILLARY BUFFER ***>>                               01362000
$PAGE                                                                   01364000
    <<------------ EXTERNAL PROCEDURE DECLARATIONS -------------->>     01366000
                                                                        01368000
PROCEDURE DEBUG;                                                        01370000
   OPTION EXTERNAL;                                                     01372000
                                                                        01374000
                                                                        01376000
PROCEDURE EOFCHECK (IOQP,BUFR,COUNT,BLANK);                             01378000
   VALUE IOQP, BUFR, COUNT, BLANK;                                      01380000
   POINTER IOQP;                                                        01382000
   INTEGER COUNT;                                                       01384000
   LOGICAL BLANK;                                                       01386000
   DOUBLE  BUFR;                                                        01388000
   OPTION EXTERNAL;                                                     01390000
                                                                        01392000
PROCEDURE  GIP;                                                         01394000
   OPTION EXTERNAL;                                                     01396000
                                                                        01398000
PROCEDURE HELP;                                                         01400000
   OPTION EXTERNAL;                                                     01402000
                                                                        01404000
LOGICAL PROCEDURE IOMESSAGE (SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,           01406000
                               DEST,REPLY,OFFSET,DITP,IOTYPE);          01408000
   VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,        01410000
         IOTYPE;                                                        01412000
   INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,           01414000
           IOTYPE;                                                      01416000
   INTEGER POINTER DITP;                                                01418000
   OPTION VARIABLE,EXTERNAL;                                            01420000
                                                                        01422000
PROCEDURE MASTERCLEAR (DITP);                                           01424000
   ARRAY DITP;                                                          01426000
   OPTION EXTERNAL;                                                     01428000
                                                                        01430000
PROCEDURE SIODM (DITP,FLAGS);                                           01432000
   VALUE DITP, FLAGS;                                                   01434000
   LOGICAL FLAGS;                                                       01436000
   POINTER DITP;                                                        01438000
   OPTION EXTERNAL;                                                     01440000
                                                                        01442000
PROCEDURE STARTIO (DITP,SIOP,QFLAG);                                    01444000
   VALUE  DITP, SIOP, QFLAG;                                            01446000
   LOGICAL QFLAG;                                                       01448000
   POINTER DITP, SIOP;                                                  01450000
   OPTION EXTERNAL;                                                     01452000
$PAGE  "CARD READER INITIALIZATION PROCEDURE - CRINIT"                  01454000
<<******************************************************                01456000
  **    CARD READER INITIALIZATION PROCEDURE          **                01458000
  ******************************************************>>              01460000
                                                                        01462000
<<THIS PROCEDURE STARTS AN IDLE CHANNEL PROGRAM WHEN CALLED>>           01464000
                                                                        01466000
PROCEDURE CRINIT(DITP);                                                 01468000
  INTEGER ARRAY DITP;                                                   01470000
  OPTION PRIVILEGED, UNCALLABLE;                                        01472000
                                                                        01474000
  BEGIN                                                                 01476000
    INTEGER POINTER ILTP;                                               01478000
    INTEGER POINTER SIOP;                                               01480000
                                                                        01482000
    @ILTP:=DITP(DILTP);                                                 01484000
    @SIOP:=ILTP(ISIOP);                                                 01486000
                                                                        01488000
    SIOP(JMPADDR):=STARTIDLE-2;                                         01490000
    STARTIO(DITP,SIOP,FALSE);                                           01492000
                                                                        01494000
  END;                                                                  01496000
$PAGE  "CARD READER DRIVER PROCEDURE - CRDRVR"                          01498000
INTEGER PROCEDURE CRDRVR (IOQP,DITP,BANK,BUFADDR,SIOP,DRTNUMB);         01500000
   VALUE  BANK, BUFADDR,DRTNUMB;                                        01502000
   INTEGER  BANK, BUFADDR, DRTNUMB;                                     01504000
   INTEGER  ARRAY IOQP, DITP, SIOP;                                     01506000
   OPTION PRIVILEGED, UNCALLABLE;                                       01508000
BEGIN                                                                   01510000
                                                                        01512000
  <<                                                                    01514000
     THIS PROCEDURE INITIATES AND COMPLETES I/O FOR CARD READERS        01516000
                                                                        01518000
    MODE RETURNS IN CRDRVR -                                            01520000
                                                                        01522000
        5  - REQUEST COMPLETED                                          01524000
        7  - NOT READY WAIT                                             01526000
      %13  - INTERRUPT WAIT OR WAIT FOR COMPLETION                      01528000
  >>                                                                    01530000
                                                                        01532000
                                                                        01534000
INTEGER LDEV      = Q+1;           <<LOGICAL DEVICE NUMBER>>            01536000
INTEGER DATAMODE  = LDEV+1;        <<HOLDS DATA READ MODE>>             01538000
DOUBLE  AUXBUFADDRD= DATAMODE+1;    <<CARD SAVING BUFFER ADDRESS>>      01540000
INTEGER WCNT      = AUXBUFADDRD+2; <<WORD COUNT FOR CONVERT>>           01542000
INTEGER MSGTYPE   = WCNT+1;        <<TYPE OF ERROR MESSAGE>>            01544000
INTEGER POINTER  CPVAP = MSGTYPE+1;<<HOLDS CHANNEL I/O STATUS>>         01546000
INTEGER BADCOLUMN = CPVAP+1;       <<COLUMN WHERE BAD HOLLERITH FOUND>> 01548000
INTEGER SUBTEST   = BADCOLUMN+1;   <<THIS WILL BE SET TO TEST TYPE>>    01550000
INTEGER MSTATE    = CRDRVR;        <<CURRENT REQUEST STATE>>            01552000
                                                                        01554000
LOGICAL ARRAY   DITPL(*)  =  DITP,                                      01556000
                IOQPL(*)  =  IOQP;                                      01558000
                                                                        01560000
DOUBLE BUFADDRD  =  Q-7;              <<BANK AND OFFSET>>               01562000
                                                                        01564000
ARRAY MAXCOUNT(0:1) = PB := 40,80;    <<MAX TRANSFER ALLOWED>>          01566000
$PAGE                                                                   01568000
INTEGER ARRAY KARDIN(0:255)= PB :=    <<KARD TO JIS8 CONVERSION TABLE>> 01570000
      %000,%001,%002,%003,%004,%005,%006,%007,                          01572000
      %010,%011,%012,%013,%014,%015,%016,%017,                          01574000
      %020,%021,%022,%023,%024,%025,%026,%027,                          01576000
      %030,%031,%032,%033,%034,%035,%036,%037,                          01578000
      %040,%041,%042,%043,%044,%045,%046,%047,                          01580000
      %050,%051,%052,%053,%054,%055,%056,%057,                          01582000
      %060,%061,%062,%063,%064,%065,%066,%067,                          01584000
      %070,%071,%072,%073,%074,%075,%076,%077,                          01586000
      %100,%101,%102,%103,%104,%105,%106,%107,                          01588000
      %110,%111,%112,%113,%114,%115,%116,%117,                          01590000
      %120,%121,%122,%123,%124,%125,%126,%127,                          01592000
      %130,%131,%132,%133,%134,%135,%136,%137,                          01594000
      %140,%261,%262,%263,%264,%265,%266,%267,                          01596000
      %270,%271,%300,%301,%302,%303,%304,%305,                          01598000
      %306,%307,%310,%315,%316,%317,%320,%321,                          01600000
      %322,%323,%324,%173,%174,%175,%176,%177,                          01602000
      %200,%201,%202,%203,%204,%205,%206,%207,                          01604000
      %210,%211,%212,%213,%214,%215,%216,%217,                          01606000
      %220,%221,%222,%223,%224,%225,%226,%227,                          01608000
      %230,%231,%232,%233,%234,%235,%236,%237,                          01610000
      %241,%242,%243,%244,%245,%246,%247,%250,                          01612000
      %251,%252,%253,%254,%255,%256,%257,%240,                          01614000
      %260,%141,%142,%143,%144,%145,%146,%147,                          01616000
      %150,%151,%156,%160,%161,%162,%165,%164,                          01618000
      %152,%153,%154,%155,%272,%157,%273,%274,                          01620000
      %275,%276,%277,%311,%166,%163,%312,%313,                          01622000
      %314,%167,%325,%171,%326,%327,%330,%331,                          01624000
      %172,%170,%342,%343,%344,%345,%346,%347,                          01626000
      %340,%341,%332,%333,%334,%335,%336,%337,                          01628000
      %350,%351,%352,%353,%354,%355,%356,%357,                          01630000
      %360,%361,%362,%363,%364,%365,%366,%367,                          01632000
      %370,%371,%372,%373,%374,%375,%376,%377;                          01634000
                                                                        01636000
                                                                        01638000
                                                                        01640000
$PAGE                                                                   01642000
SUBROUTINE FORM'KATAKANA;                                               01644000
                                                                        01646000
<<  CONVERTS FROM ASCII TO KATAKANA CHARACTER SET FOR JIS8  >>          01648000
                                                                        01650000
BEGIN                                                                   01652000
WCNT:= 0;                      <<WCNT INITIALIZE>>                      01654000
WHILE WCNT < INTEGER (DITP(DWCNT)) DO                                   01656000
    BEGIN                      <<START CONVERT AND MOVE>>               01658000
    TOS:= BUFADDRD;            <<LOAD BUFADDRD>>                        01660000
    TOS:= TOS+WCNT;            <<ADDRRESS OF CONVERT DATA>>             01662000
    ASSEMBLE(LSEA);            <<LOAD DATA>>                            01664000
    ASSEMBLE(DELB,DELB);       <<CLEAR ADDRRESS ON STACK>>              01666000
    ASSEMBLE(DUP);                                                      01668000
    ASSEMBLE(ANDI 255);        <<RIGHT BYTE>>                           01670000
    X:= TOS;                                                            01672000
    TOS:= KARDIN(X);           <<CONVERT TO JIS8>>                      01674000
    ASSEMBLE(XCH);             <<NEXT BYTE>>                            01676000
    TOS:= TOS & LSR(8);        <<LEFT BYTE>>                            01678000
    X:= TOS;                                                            01680000
    TOS:= KARDIN(X);           <<CONVERT TO JIS8>>                      01682000
    TOS:= TOS & LSL(8);        <<SHIFT TO LEFT>>                        01684000
    ASSEMBLE(OR);              <<MERGE RIGHT AND LEFT BYTE>>            01686000
    TOS:= BUFADDRD;                                                     01688000
    TOS:= TOS+WCNT;            <<CONVERTED DATA ADRRESS>>               01690000
    ASSEMBLE(CAB;SSEA;DDEL);   <<MOVE AND CLEAR ADDRRESS>>              01692000
    WCNT:= WCNT+1;             <<UPDATE WORD COUNTER>>                  01694000
    END;                                                                01696000
END;                                                                    01698000
$PAGE  "DRIVER INITIATOR AND COMPLETOR COMMON AREA"                     01700000
   <<------------ BEGIN CARD READER DRIVER -------------->>             01702000
   <<---- DRIVER INITIATOR AND COMPLETOR COMMON AREA ---->>             01704000
                                                                        01706000
TOS:= DITP(DLDEV).DLDEVN;                 <<SET LDEV>>                  01708000
TOS:= IOQP(QPAR2).(11:2);                 <<SET DATA MODE>>             01710000
TOS:= DOUBLE(LOGICAL(@SIOP(CHANPROGSIZE)+SYSDB));              <<04623>>01712000
      <<AUXBUFADDRD is now initialized with the bank word set>><<04623>>01714000
      <<to zero and the offset word set to the address of the>><<04623>>01716000
      <<first location following the channel program         >><<04623>>01718000
TOS:= 0;                                  <<SET WORD COUNTER>>          01720000
TOS:= 0;                                  <<SAVE PLACE FOR MSGTYPE>>    01722000
TOS:= DITP(DILTP);                        <<CPVAP>>                     01724000
TOS:= 0;                                  <<SAVE PLACE FOR BADCOLUMN>>  01726000
TOS:= 0;                                  <<SAVE PLACE FOR SUBTEST>>    01728000
                                                                        01730000
IF @IOQP=0 THEN                           <<START IDLE CHANNEL PROG>>   01732000
BEGIN                                                                   01734000
  SIOP(JMPADDR):=STARTIDLE-2;             <<DISPLACEMENT=ADDR-2>>       01736000
  STARTIO(DITP,SIOP,FALSE);                                             01738000
  CPVAP:=0;                                                             01740000
  CRDRVR:=REQUESTDONE;                                                  01742000
  RETURN;                                                               01744000
END;                                                                    01746000
                                                                        01748000
TOS:= IOQP;                               <<GET QFLAGS>>                01750000
IF < THEN                                 <<REQUEST ABORTED>>           01752000
BEGIN                                                                   01754000
   MASTERCLEAR (DITP);                                                  01756000
   IOQP(QWBCT):= 0;                       <<CLEAR WORD COUNT>>          01758000
   <<If I/O is aborted we will do a CLEAR to put the device>>           01760000
   <<in a known state.  We will keep a flag(ABORTFLAG) so  >>           01762000
   <<that we will only do 1 clear for each series of       >>           01764000
   <<aborted IOQs.  This flag will be reset after the first>>           01766000
   <<IOQ which does not have the abort bit set.            >>           01768000
                                                                        01770000
   IF DITP(DSAVE).ABORTFLAG=1 THEN                                      01772000
   BEGIN                                                                01774000
       TOS:=IF IOQPL.PFAIL THEN PFABORT ELSE ABORTED;                   01776000
       GOTO SETSTATUS;                                                  01778000
     END                                                                01780000
   ELSE                                                                 01782000
     BEGIN                                                              01784000
       DITPL(DSAVE).ABORTFLAG:=1;                                       01786000
       GOTO DEVICECLEAR;                                                01788000
     END                                                                01790000
END                                                                     01792000
ELSE DITP(DSAVE).ABORTFLAG:=0;                                          01794000
$PAGE "DRIVER INITIATOR"                                                01796000
IF MSTATE = START'REQUEST  THEN                                         01798000
BEGIN   <<THIS BEGIN END PAIR ENCLOSES THE INITIATOR>>                  01800000
   SIOP(DEVCLEAR):=%2000; <<RESTORE PART OF READSTATUS>>                01802000
                       <<ALSO USED FOR CLEAR COMMAND>>                  01804000
   IF IOQP(QFUNC).FUNC=READ THEN GOTO READREQ                           01806000
      ELSE IF IOQP(QFUNC).FUNC=FOPEN THEN GOTO CONVERTDONE              01808000
      ELSE IF IOQP(QFUNC).FUNC=FCLOSE THEN GOTO CONVERTDONE             01810000
      ELSE IF IOQP(QFUNC).FUNC=DCLOSE THEN GOTO DEVICECLOSE             01812000
      ELSE IF IOQP(QFUNC).FUNC=READSTAT THEN GOTO READSTATUS            01814000
      ELSE IF IOQP(QFUNC).FUNC=IDENTITY THEN GOTO GET'IDENTITY          01816000
      ELSE IF IOQP(QFUNC).FUNC=WRITELOOP THEN GOTO WRTLOOPBACK          01818000
      ELSE IF IOQP(QFUNC).FUNC=READLOOP THEN GOTO READLOOPBACK          01820000
      ELSE IF IOQP(QFUNC).FUNC=INITTEST THEN GOTO INITSELFTEST          01822000
      ELSE IF IOQP(QFUNC).FUNC=DCLEAR THEN GOTO CLEARCOMMAND            01824000
      ELSE GO TO BADCALL;                                               01826000
   HELP;                                  <<FOR LINKAGE>>               01828000
                                                                        01830000
DEVICECLOSE:                                                            01832000
      TOS:= LPDTD(LDEV);                                                01834000
      TOS.EOF:= 0;                        <<CLEAR EOF STATE>>           01836000
      LPDTD(LDEV):= TOS;                  <<IN LPDT>>                   01838000
      GO TO CONVERTDONE;                                                01840000
                                                                        01842000
CLEARCOMMAND:                                                           01844000
      IF IOQP(QFLAG).DIAG=0 THEN GOTO BADCALL;                          01846000
DEVICECLEAR:                                                            01848000
      SIOP(DEVCLEAR):=CLEAR;       <<CLEAR COMMAND>>                    01850000
      SIOP(DEVCLEAR+1):=0;                                              01852000
      SIOP(JMPADDR):=DEVCLEAR-2;                                        01854000
      GOTO BEGINIO;                                                     01856000
                                                                        01858000
INITSELFTEST:                                                           01860000
      IF IOQP(QFLAG).DIAG=0 THEN GOTO BADCALL;    <<NOT DIAGNOSTIC REQ>>01862000
      TOS:=BUFADDRD;                      <<USER BANK&ADDR>>            01864000
      ASSEMBLE (LSEA;DELB,DELB);          <<GET CONTENTS OF BANK&ADDR>> 01866000
      SUBTEST:=TOS;                                                     01868000
      IF SUBTEST<0 OR SUBTEST>5 THEN GOTO BADCALL;  <<INVALID TEST>>    01870000
      SIOP(JMPADDR):=0;                                                 01872000
      SIOP(WRITEORDER):=INIT'SELFTEST;    <<INITIATE SELF TEST>>        01874000
      SIOP(WRITEBYTES):=1;                                              01876000
      SIOP(WRITEBANK):=0;                                               01878000
      SIOP(WRITEADDR):=@SIOP(TEMPSTORE)+SYSDB;                          01880000
      SIOP(TEMPSTORE):=SUBTEST&LSL(8);                                  01882000
      SIOP(DSJGOOD):=0;                   <<GO ON TO READ RESULTS>>     01884000
      SIOP(READORDER):=READ'SELFTEST;     <<SEND RESULTS>>              01886000
      SIOP(READBYTES):=1;                                               01888000
      SIOP(READBANK):=BANK;                                             01890000
      SIOP(READBANK).(1:1):=1;  <<BIT 1 MEANS READ INTO THE             01892000
                                  RIGHT, NOT LEFT BYTE OF THE           01894000
                                  DESTINATION ADDRESS>>                 01896000
      SIOP(READADDR):=BUFADDR;                                          01898000
      SIOP(JUMP'OR'WAIT):=JUMP;                                         01900000
      SIOP(JMPADDR2):=5;                  <<JUMP AROUND READ2>>         01902000
      GOTO BEGINIO;                                                     01904000
$PAGE                                                                   01906000
WRTLOOPBACK:                                                            01908000
      IF IOQP(QFLAG).DIAG=0 THEN GOTO BADCALL;                          01910000
      TOS:=BUFADDRD;                                                    01912000
      ASSEMBLE (LSEA;DELB,DELB);          <<GET BYTE FOR LOOPBACK>>     01914000
      SIOP(TEMPSTORE):=TOS;                                             01916000
      IF SIOP(TEMPSTORE).(0:8)<>0 THEN GOTO BADCALL;                    01918000
                                          <<VALUE MUST BE < 256 >>      01920000
      SIOP(TEMPSTORE).(0:8):=6;   <<6 IN HIGH BYTE IS CODE TO DEVICE    01922000
                                    TO ACCEPT BYTE OF LOOPBACK DATA>>   01924000
      SIOP(JMPADDR):=0;                                                 01926000
      SIOP(WRITEORDER):=INIT'SELFTEST;                                  01928000
      SIOP(WRITEBYTES):=2;                                              01930000
      SIOP(WRITEBANK):=0;                                               01932000
      SIOP(WRITEADDR):=@SIOP(TEMPSTORE)+SYSDB;                          01934000
      SIOP(DSJGOOD):=12;                  <<GO TO READ STATUS >>        01936000
      GOTO BEGINIO;                                                     01938000
                                                                        01940000
READLOOPBACK:                                                           01942000
      IF IOQP(QFLAG).DIAG=0 THEN GOTO BADCALL;                          01944000
      SIOP(JMPADDR):=READORDER-2;                                       01946000
      SIOP(READORDER):=READ'SELFTEST;     <<SEND RESULTS>>              01948000
      SIOP(READBYTES):=1;                                               01950000
      SIOP(READBANK):=BANK;                                             01952000
      SIOP(READBANK).(1:1):=1;  <<BIT 1 MEANS READ INTO THE             01954000
                                  RIGHT, NOT LEFT BYTE OF THE           01956000
                                  DESTINATION ADDRESS>>                 01958000
      SIOP(READADDR):=BUFADDR;                                          01960000
      SIOP(JUMP'OR'WAIT):=JUMP;                                         01962000
      SIOP(JMPADDR2):=5;                  <<JUMP AROUND READ2>>         01964000
      GOTO BEGINIO;                                                     01966000
                                                                        01968000
GET'IDENTITY:                                                           01970000
      IF ((IOQP(QFLAG).DIAG)=0) THEN GOTO BADCALL;<<NOT DIAGNOSTIC REQ>>01972000
      SIOP(JMPADDR):=IDENTIFY-2;          <<JUMP TO GET IDENTITY>>      01974000
      SIOP(IDENTSTORE):=0;                <<INITIALIZE STORAGE>>        01976000
      GOTO BEGINIO;                                                     01978000
                                                                        01980000
                                                                        01982000
READSTATUS:                                                             01984000
      SIOP(JMPADDR):=RORDER2-2;           <<JUMP TO COMMAND>>           01986000
      SIOP(RORDER2):=READSTATCOMMAND;     <<READSTATUS COMMAND>>        01988000
      SIOP(RADDR2):=BUFADDR;                                            01990000
      SIOP(RBANK2):=BANK;          <<BANK & ADDR PASSED TO US>>         01992000
      SIOP(RBYTES2):=2;                                                 01994000
      GOTO BEGINIO;                                                     01996000
$PAGE                                                                   01998000
READREQ:                                                                02000000
      EOFCHECK (IOQP,0D,0,0);                                           02002000
      IF <> THEN  GO TO IODONE;           <<END OF FILE>>               02004000
                                                                        02006000
      IF DATAMODE>1 OR DATAMODE<0 THEN                                  02008000
      BEGIN                               <<INVALID MODE SPECIFICATION>>02010000
BADCALL:                                                                02012000
            IOQP(QWBCT):= 0;              <<CLEAR WORD COUNT>>          02014000
            TOS:=INVALIDOP;                                             02016000
            GO TO SETSTATUS;                                            02018000
      END;                                                              02020000
                                                                        02022000
      TOS:= IOQP(QWBCT);                                                02024000
      IF < THEN BEGIN                                                   02026000
                  TOS:=  -(TOS & ASR(1)); <<CONVERT TO WORDS, IF>>      02028000
                END;                      <<BYTE COUNT IS ODD ROUND UP>>02030000
      IF LS0 > MAXCOUNT(DATAMODE) THEN    <<REQUESTED > MAXIMUM >>      02032000
      BEGIN                                                             02034000
            DEL;                                                        02036000
            TOS:= MAXCOUNT(DATAMODE);     <<TRUNCATE TO MAXCOUNT>>      02038000
            IOQP(QWBCT):=IF IOQP(QWBCT)<0 THEN -(S0*2) ELSE S0;         02040000
              <<QWBCT MUST REMAIN A BYTE COUNT OR WORD COUNT            02042000
                DEPENDING ON ITS ORIGINAL VALUE>>                       02044000
      END;                                                              02046000
      DITP(DWCNT):= S0;                   <<SAVE REQUESTED WORD COUNT>> 02048000
                                                                        02050000
      DITP(DSAVE).READDONE:= 0;                                         02052000
      IF <> THEN                <<CARD ALREADY READ & ASCII REQUESTED>> 02054000
      BEGIN                                                             02056000
            IF BINARY THEN      <<BINARY & CARD READ IN ASCII>>         02058000
                  GOTO BADCALL;                                         02060000
            TOS:= 1;            <<TO INDICATE AUX BUFFER READ>>         02062000
            GOTO CHECKDATA;     <<MOVE DATA TO USER FROM AUX. BUFFER>>  02064000
      END;                                                              02066000
                                                                        02068000
      IF S0< 40 THEN                                                    02070000
      BEGIN                     <<READ 40 WORDS INTO AUX. FOR BACKUP>>  02072000
           DEL;                           <<DELETE WORD COUNT>>         02074000
           IOQP(QMISC):= 1;               <<SET AUXILLARY BUFFER FLAG>> 02076000
           TOS:= 40;                      <<NEW WORD COUNT >>           02078000
           TOS:= AUXBUFADDRD;             <<AUXILLARY BANK AND ADDRESS>>02080000
      END                                                               02082000
      ELSE TOS:= BUFADDRD;                <<USER BANK AND ADDRESS>>     02084000
                                                                        02086000
      SIOP(READADDR):= TOS;               <<BUFFER ADDRESS>>            02088000
      SIOP(READBANK):=TOS;                                              02090000
      TOS:=TOS*2;               <<CHANGE WORDCOUNT TO BYTE COUNT>>      02092000
      SIOP(READBYTES):=TOS;                                             02094000
      SIOP(READORDER):=READCOMMAND;                                     02096000
                                                                        02098000
<<NOW FORM PICK COMMAND>>                                               02100000
                                                                        02102000
      SIOP(WRITEORDER):=IF ASCII THEN PICKASCII ELSE PICKBINARY;        02104000
                                <<PICK ASCII OR BINARY>>                02106000
      SIOP(WRITEBYTES):=2;                                              02108000
      SIOP(WRITEBANK):=0;                                               02110000
      SIOP(WRITEADDR):=@SIOP(PICKCOUNT)+SYSDB;                          02112000
                                                                        02114000
      TOS:=80;                                                          02116000
      TOS:=TOS CAT SIOP(READBYTES)(0:8:8);                              02118000
      SIOP(PICKCOUNT):=TOS; <<HIGH BYTE=BYTE COUNT,LOW BYTE=BURST OF80>>02120000
      SIOP(JMPADDR):=0;         <<START CHANNEL PROG WITH PICK COMMAND>>02122000
      SIOP(DSJGOOD):=0;         <<IF PICK WAS GOOD THEN READ BUFFER>>   02124000
                                                                        02126000
<< IF BYTECOUNT IS GREATER THAN 80, AS IN A BINARY READ THEN            02128000
   THE READ MUST BE DONE IN TWO STEPS>>                                 02130000
                                                                        02132000
      IF SIOP(READBYTES)>80 THEN BEGIN                                  02134000
        SIOP(RORDER2):=READCOMMAND;                                     02136000
        SIOP(RBYTES2):=SIOP(READBYTES)-80;                              02138000
        SIOP(READBYTES):=80;                                            02140000
        SIOP(RBANK2):=SIOP(READBANK);                                   02142000
        SIOP(RADDR2):=SIOP(READADDR)+40;                                02144000
        SIOP(JUMP'OR'WAIT):=WAIT;                                       02146000
        SIOP(JMPADDR2):=0;                                              02148000
      END ELSE BEGIN                                                    02150000
        SIOP(JUMP'OR'WAIT):=JUMP;                                       02152000
        SIOP(JMPADDR2):=5;                                              02154000
      END;                                                              02156000
                                                                        02158000
BEGINIO:                                                                02160000
      SIOP(READSTATDEST):=@DITP(DSTAT)+SYSDB;                           02162000
      CPVAP:=0;                                                         02164000
      STARTIO (DITP,SIOP,TRUE);                                         02166000
      IF < THEN                                                         02168000
SIOFAILURE:                                                             02170000
      BEGIN                               <<SIO FAILURE>>               02172000
         DITP(DLOGERROR):=CPVAP;                                        02174000
         DITP(DSERR):=[8/1,8/DLOGERROR];                                02176000
         TOS:= SIOFAIL;                                                 02178000
         GOTO BADIO;                                                    02180000
      END;                                                              02182000
      IOQP(QSTAT).IOSTAT:=PENDING;                                      02184000
      CRDRVR:= CALL'COMPLETOR;                                          02186000
      RETURN;                                                           02188000
END;   <<END OF INITIATOR>>                                             02190000
$PAGE  "DRIVER COMPLETOR"                                               02192000
COMPLETOR:                                                              02194000
    IF TOS.SFAIL THEN GOTO SIOFAILURE;    <<SIO FAILURE BIT IN IOQ>>    02196000
    IF (CPVAP.ERRORCODE=6) LOR            <<DMA ABORT>>                 02198000
       (CPVAP.ERRORCODE=7) THEN  GOTO CHANERROR;<<CHANNEL ERROR>>       02200000
                                                                        02202000
    IF STATUS.POWERUP THEN                                              02204000
    BEGIN                                                               02206000
       TOS:=POWERUPSTAT;                                                02208000
       GOTO SETSTATUS;                                                  02210000
    END;                                                                02212000
                                                                        02214000
    IF IOQP(QFUNC).FUNC=IDENTITY THEN                                   02216000
    BEGIN                                                               02218000
      TOS:=BUFADDRD;                                                    02220000
      TOS:=SIOP(IDENTSTORE);                                            02222000
      ASSEMBLE(SSEA;DDEL);<<STORE IDENTITY IN USER BUFFER,DELETE ADDR>> 02224000
      GOTO CONVERTDONE;                                                 02226000
    END;                                                                02228000
                                                                        02230000
    IF IOQP(QFUNC).FUNC<>0 THEN GOTO CONVERTDONE;                       02232000
<<FOLLOWING CODE ONLY APPLIES WHEN READING A CARD, NOT FOR              02234000
  READING STATUS,SELFTEST,WRITE&READLOOPBACK,GETIDENTITY,               02236000
  OR DEVICE OPEN>>                                                      02238000
    IF (STATUS LAND LOGTROUBLE) <> 0 THEN                               02240000
    BEGIN      <<LOG THE ERROR>>                                        02242000
      DITP(DLOGERROR):=DITP(DSTAT);  <<MOVE DATA TO LOGGING BUFFER>>    02244000
      DITP(DSERR):= [8/1,8/DLOGERROR];    <<LOG ERROR>>                 02246000
    END;                                                                02248000
                                                                        02250000
    IF (STATUS LAND TROUBLEBITS) <> 0 THEN                              02252000
    BEGIN                                                               02254000
      IF STATUS.BUSERROR=1 THEN                                         02256000
      BEGIN                                                             02258000
        TOS:=XFER'ERROR;     <<The most probable cause of this          02260000
                      is an unrecognized secondary address>>            02262000
        GOTO SETSTATUS;                                                 02264000
      END;                                                              02266000
      IF STATUS.BADHOLLERITH THEN                                       02268000
      BEGIN                                                             02270000
            TOS:=IF IOQP(QMISC)=1 THEN AUXBUFADDRD ELSE BUFADDRD;       02272000
            <<BANK&ADDR OF DATA>>                                       02274000
            X:= 0;                                                      02276000
            BADCOLUMN:=81;                                              02278000
            <<If message INVALID HOLLERITH IN COLUMN 81 is              02280000
              ever sent to console this means that hardware             02282000
              status indicated an invalid hollerith, but                02284000
              the hardware failed to replace that char with             02286000
              an ascii SUB (%32)>>                                      02288000
            WHILE (X:=X+1)<=80 DO                                       02290000
            BEGIN                                                       02292000
              ASSEMBLE( LSEA );                  <<LOADMEMORY>>         02294000
              IF LX THEN TOS:= TOS&LSR(8)        <<GET LEFT BYTE>>      02296000
                    ELSE ASSEMBLE( INCB );       <<BUMP WORD ADDRESS>>  02298000
              IF TOS.(8:8)=SUB THEN BADCOLUMN:=X;<<INVALID CODE FOUND>> 02300000
            END;                                                        02302000
            IF IOMESSAGE (1,12,%11000,LDEV,BADCOLUMN,,,,OPCONSOLE)      02304000
               THEN GOTO NRWAIT  <<INVALID HOLLERITH MESS SENT>>        02306000
               ELSE GOTO SYSERR;                                        02308000
      END;                                                              02310000
$PAGE                                                                   02312000
                                                                        02314000
      <<THE NEXT STATEMENT CHECKS FOR HARDWARE EOF BY CHECKING          02316000
        IF THE EOF LAMP IS ON AND THE HOPPER IS EMPTY.                  02318000
        HOWEVER IF THERE WAS A MOTION CHECK ON THE LAST                 02320000
        CARD, WE MUST NOT RETURN EOF BECAUSE THE CARD                   02322000
        MUST BE RE-READ.>>                                              02324000
                                                                        02326000
      IF (STATUS.EOFBIT) LAND (STATUS.HOPPERMT) LAND                    02328000
         (NOT(STATUS.MPCHK)) THEN                                       02330000
      BEGIN                               <<HARDWARE EOF>>              02332000
            TOS:= LPDTD(LDEV);                                          02334000
            TOS.EOF:= 1;                                                02336000
            LPDTD(LDEV):= TOS;                                          02338000
            EOFCHECK (IOQP,0D,0,0);                                     02340000
            IF <> THEN  GO TO IODONE;     <<END OF FILE>>               02342000
      END;                                                              02344000
                                                                        02346000
      IF STATUS.MPCHK=1 THEN MSGTYPE:=MOTPICMSG                         02348000
      ELSE IF STATUS.RDCHK=1 THEN MSGTYPE:=RDCHKMSG                     02350000
      ELSE IF STATUS.STACKERFULL=1 THEN MSGTYPE:=STKFULLMSG             02352000
      ELSE IF STATUS.HOPPERMT=1 THEN MSGTYPE:=HOPPERMTMSG               02354000
      ELSE                                                              02356000
NOTRDY:    MSGTYPE:= NOTRDYMSG;                                         02358000
                                                                        02360000
           IF IOMESSAGE (1,MSGTYPE,%10000,LDEV,,,,,OPCONSOLE)           02362000
           THEN  BEGIN                                                  02364000
NRWAIT:             SIOP(JMPADDR):=STARTIDLE-2;                         02366000
                    CPVAP:=0;                                           02368000
                    STARTIO(DITP,SIOP,FALSE);                           02370000
                    IF < THEN                                           02372000
                    BEGIN                                               02374000
                      TOS:=SIOFAIL;                                     02376000
                      GOTO BADIO;                                       02378000
                    END;                                                02380000
                    IOQP(QSTAT).IOSTAT:=OFFLINESTAT;                    02382000
                    TOS:= NOTREADY;                                     02384000
                    GOTO OUT;                                           02386000
                 END;                                                   02388000
                                                                        02390000
SYSERR:    TOS:= SYSERROR;                <<NO MESSAGE LINK BUFFERS>>   02392000
           GOTO BADIO;                                                  02394000
                                                                        02396000
CHANERROR:                                                              02398000
           DITP(DLOGERROR):=CPVAP;                                      02400000
           DITP(DSERR):=[8/1,8/DLOGERROR];                              02402000
           TOS:=CHANFAIL;                                               02404000
$PAGE                                                                   02406000
BADIO:     MASTERCLEAR (DITP);            <<CLEAR WORD COUNT>>          02408000
           IOQP(QWBCT):= 0;                                             02410000
           GOTO SETSTATUS;                                              02412000
    END; <<OF "IF STATUS LAND TROUBLEBITS"  STATMENT>>                  02414000
$PAGE                                                                   02416000
    TOS:= IOQP(QMISC);                    <<AUXILLARY BUFFER FLAG>>     02418000
                                                                        02420000
CHECKDATA:                                                              02422000
    EOFCHECK(IOQP,IF LS0 THEN AUXBUFADDRD ELSE BUFADDRD,40,             02424000
                  IF ASCII THEN 1 ELSE -1);                             02426000
                                                                        02428000
    IF TOS THEN                 <<READ INTO AUXILLARY BUFFER>>          02430000
    BEGIN                                                               02432000
         IF = THEN BEGIN        <<NO EOF, MOVE DATA TO USER BUFFER>>    02434000
                   TOS:= BUFADDRD;                                      02436000
                   TOS:= AUXBUFADDRD;                                   02438000
                   TOS:= DITP(DWCNT);     <<WORD COUNT TO MOVE>>        02440000
                   ASSEMBLE( MABS );                                    02442000
                   GOTO GOODDONE;                                       02444000
                   END;                                                 02446000
         IF < THEN GOTO SETREADDONE;      <<BACK UP CARD>>              02448000
    END                                                                 02450000
                                                                        02452000
    ELSE IF < THEN              <<DATA WAS READ INTO USER BUFFER AND>>  02454000
         BEGIN                  <<MUST BE MOVED TO AUX BUFFER>>         02456000
              TOS:= AUXBUFADDRD;                                        02458000
              TOS:= BUFADDRD;                                           02460000
              TOS:= 40;                                                 02462000
              ASSEMBLE( MABS 1 );     <<LEAVE SOURCE ADDRESS ON TOS>>   02464000
              X:= DITP(DWCNT);                                          02466000
              DO BEGIN                <<BLANK USER'S BUFFER>>           02468000
                 TOS:= TOS-1;   TOS:= 0;                                02470000
                 ASSEMBLE( SSEA );                                      02472000
                 END                                                    02474000
              UNTIL DXBZ;                                               02476000
SETREADDONE:  IF ASCII THEN DITP(DSAVE).READDONE:= 1;                   02478000
         END                                                            02480000
                                                                        02482000
         ELSE IF = THEN         <<READ INTO USER BUFFER AND NO BACK UP>>02484000
              BEGIN             <<NO EOF>>                              02486000
GOODDONE:          X:= IOQP(QFUNC).FUNC;          <<I/O REQUEST TYPE>>  02488000
                   IF <> THEN GOTO CONVERTDONE;   <<NOT READ REQUEST>>  02490000
                   TOS:= LPDTD(LDEV);             <<GET SUBTYPE>>       02492000
                   DELB;                          <<STACK ERASE>>       02494000
                   IF TOS.SUBTYPE=1 AND ASCII                           02496000
                   THEN FORM'KATAKANA;    <<KATAKANA CHARACTER SET>>    02498000
                                                                        02500000
CONVERTDONE:       TOS:= GOODIO;                                        02502000
                                                                        02504000
SETSTATUS:         IOQP(QSTAT).IOSTAT:= TOS;                            02506000
              END;                                                      02508000
                                                                        02510000
IODONE:                                                                 02512000
    TOS:= REQUESTDONE;                                                  02514000
                                                                        02516000
OUT:                                                                    02518000
    CRDRVR:= TOS;                                                       02520000
                                                                        02522000
                                                                        02524000
    END;      <<----  C R D R V R ------->>                             02526000
$PAGE                                                                   02528000
  <<*************** DRIVER LINKAGE AREA ******************>>            02530000
                                                                        02532000
ASSEMBLE(                                                               02534000
    PCAL SIODM;    << MONITOR >>                                        02536000
    PCAL CRDRVR;   << INITIATOR >>                                      02538000
    PCAL CRDRVR;   << COMPLETOR >>                                      02540000
    CON  0;        << NO I/O PROCESS >>                                 02542000
    PCAL CRINIT;   << INITIALIZATION >>                                 02544000
    CON  1;        << ONE INTERRUPT HANDLER >>                          02546000
    PCAL GIP);     << INTERRUPT HANDLER >>                              02548000
                                                                        02550000
END.   << CARD READER DRIVER - HIOCDRD0 >>                              02552000
