$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOCDRD0 - MODULE 20>>                                                 00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00016000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00018000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00020000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00022000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00024000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00026000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$TITLE "DEC 26,1975   CARD READER DRIVER  -  IOCDRD0(20)"               00030000
$CONTROL PRIVILEGED,UNCALLABLE,MAIN=IOCDRD0                             00032000
$THIRTY                                                                 00034000
                                                                        00036000
  <<                                                                    00038000
     CARD READER  REQUEST CODES -                                       00040000
                                                                        00042000
  OPERATION         FUNC         PARAMETERS                             00044000
                                                                        00046000
    READ             0    P1 - END OF FILE SPECIFICATION                00048000
                                                                        00050000
                          P2.(11:2) - DATA MODE                         00052000
                                                                        00054000
                                0 - PACKED ASCII                        00056000
                                     COUNT TRUNCATED TO 80 BYTES MAX    00058000
                                1 - COLUMN BINARY                       00060000
                                     COUNT TRUNCATED TO 80 WORDS MAX    00062000
                                                                        00064000
  ALL ODD BYTE COUNTS ARE ROUNDED UP TO AN EVEN NUMBER                  00066000
                                                                        00068000
                                                                        00070000
                                                                        00072000
  FILE  OPEN         2    NO OPERATION                                  00074000
  FILE  CLOSE        3    NO OPERATION                                  00076000
  DEVICE CLOSE       4    CLEAR EOF STATUS IN LPDT                      00078000
                                                                        00080000
                                                                        00082000
    STATUS  RETURNS -                                                   00084000
                                                                        00086000
       01  - NORMAL COMPLETION                                          00088000
                                                                        00090000
       33  - REQUEST ABORTED EXTERNALLY                                 00092000
       63  - REQUEST ABORTED BECAUSE OF POWER FAILUE                    00094000
                                                                        00096000
       04  - INVALID REQUEST, FUNCTION OR PARAMETER                     00098000
       44  - START SIO FAILURE                                          00100000
      124  - NO MESSAGE LINK BUFFERS AVAILABLE                          00102000
  >>                                                                    00104000
                                                                        00106000
                                                                        00108000
                                                                        00110000
                                                                        00112000
BEGIN                                                                   00114000
$PAGE                                                                   00116000
                                                                        00118000
  EQUATE                                                                00120000
    BANKN     = 3,         << BANK NUMBER IN SIO PROGRAM >>             00122000
    BUFADR    = 5,         << BUFFER ADDRESS IN SIO PROGRAM >>          00124000
    BUFBASE   =%1010,      << OFFSET TO ADDRESS AUX READ BUFFER >>      00126000
    DWCNT     = 8,         << HOLDS REQUESTED WORD COUNT >>             00128000
    CRDITSIZE = 10,        << CARD READER DIT SIZE >>          <<01340>>00130000
    CRSIOSIZE = 48,        << INCLUDES AUXILLARY READ BUFFER >>         00132000
    CRSIOSIZED2 = CRSIOSIZE/2,  << SIOSIZE/2 FOR INITIAL >>    <<01300>>00134000
    OPCONSOLE = 0,         << OUTPUT MESSAGE TO OPERATOR >>             00136000
    ABORTED   =%33,        << REQUEST ABORTED RETURN STATUS >>          00138000
    CNTRL     =%40000,     << SIO CONTROL ORDER >>                      00140000
    DCLOSE    = 4,         << DEVICE CLOSE FUNCTION CODE >>             00142000
    DDP       = 9,         << DIT DRIVER DEPENDENT WORD >>     <<01383>>00144000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00146000
    DLOGERROR =  9,        << ERROR LOG STATUS >>              <<01340>>00148000
    DSERR     = 7,         << HARDWARE I/O ERROR STATUS IN DIT >>       00150000
    DSTAT     = 6,         << LAST HARDWARE INTERRUPT STATUS >>         00152000
    FOPEN     = 2,         << FOPEN FUNCTION CODE >>                    00154000
    GOODIO    = 1,         << SUCCESSFUL I/O STATUS RETURN >>           00156000
    INTRPTWAIT=%13,        << WAIT FOR COMPLETION DRIVER RETURN >>      00158000
    INVALIDOP = 4,         << INVALID OPERATION REQUESTED >>            00160000
    NOTRDYMSG = 11,        << NOT READY MESSAGE NUMBER TO MESS PROC >>  00162000
    NOTREADY  = 7,         << NOT READY DRIVER RETURN CODE >>           00164000
    PFABORT   =%63,        << REQUEST ABORTED BECAUSE OF POWERFAIL >>   00166000
    QFUNC     = 6,         << FUNCTION  >>                              00168000
    QMISC     = 3,         << MISCELLANEOUS STORAGE >>                  00170000
    QPAR2     = 9,         << READ STOP CHAR; WRITE PRESPACE FLAG >>    00172000
    QWBCT     = 7,         << WORD (+) OR BYTE (-) COUNT >>             00174000
    QSTAT     =10,         << REQUEST STATUS AND PCB NUMBER >>          00176000
    RDCHKMSG  = 17,        <<READ CHECK MSG. NO.>>             <<00430>>00178000
    READORDER = 4,         << READ ORDER IN SIO PROGRAM >>              00180000
    REQUESTDONE= 5,        << REQUEST COMPLETED DRIVER RETURN CODE >>   00182000
    SETBANK   =%14000,     << SIO SET BANK ORDER >>                     00184000
    SIOFAIL   =%44,        << START SIO FAILURE >>                      00186000
    SIOENDI   =%34000,     << SIO END ORDER WITH INTERRUPT >>           00188000
    SIOREAD1  =%77777,     << SIO READ OF ONE WORD >>                   00190000
    SYSERROR  =%124,       << SYSTEM ERROR REQUEST STATUS RETURN CODE >>00192000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00194000
    UFAILMSG  = 208,       <<UNIT FAILURE MSG. NO.>>           <<00430>>00196000
  ENDEQ       = 0;                                                      00198000
                                                                        00200000
                                                                        00202000
  DEFINE                                                                00204000
    ASMB      = ASSEMBLE#,                                              00206000
    ASCII     =NOT LOGICAL(DATAMODE)#, << ASCII READ MODE REQUESTED >>  00208000
    BADHOLLERITH=(11:1)#,  << INVAILD HOLLERITH STATUS >>               00210000
    DLDEVN    =(8:8)#,     << LOGICAL DEVICE NUMBER OF DIT >>           00212000
    EOFBIT    =( 8:1)#,    << END OF FILE STATUS BIT >>                 00214000
    EOF       =( 7:3)#,    << EOF STATE IN LPDT >>                      00216000
    FUNC      =( 8:8)#,    << QFUNC, FUNCTION CODE >>                   00218000
    HESF     =(10:1)#,    <<HOPPER EMPTY OR STACKER FULL>>     <<00523>>00220000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          00222000
    LOADMEMORY=ASSEMBLE( LSEA )#,                                       00224000
    NRDY     =(15:1)#,    <<NOT READY OR OFFLINE>>             <<00523>>00226000
    NRMESSAGE = (9:1)#,<< DIT0.(9:1) NOT READY MESSAGE ISSUED ><<01383>>00228000
    PFAIL     =(11:1)#,    << ABORT SET BECAUSE OF POWER FAIL >>        00230000
    RDCHK     =(4:1)#,     <<LIGHT/DARK CHECK STATUS BIT>>     <<00430>>00232000
    READDONE  =( 9:1)#,    << AUX BUF HOLDS CARD AFTER EOF RETURNED >>  00234000
    SFAIL     =(10:1)#,    << FAILURE ON DELAYED START SIO >>           00236000
    SUBTYPE   =(12:4)#,                                        <<00877>>00238000
    TROUBLE   =(14:1)#,   <<TIMING,LIGHT,COMPARE,HOPPER,HOLLERITH,PICK>>00240000
    ENDDEF    = 0#;                                                     00242000
$PAGE                                                                   00244000
                                                                        00246000
    LOGICAL LS0 = S-0,  LX = X;                                         00248000
    INTEGER S0 = S-0, S1 = S-1, X = X;                                  00250000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               00252000
                                                                        00254000
                                                                        00256000
                                                                        00258000
                                                                        00260000
     << DIT DEFINITION AND DRIVER LINKAGE AREA  >>                      00262000
                                                                        00264000
BYTE ARRAY  DLT(0:7) = DB :=                                            00266000
 CRDITSIZE, 1, 0, 0, 0, 0, CRSIOSIZED2, 0; << TYPE 1 MONITOR >><<01300>>00268000
                                                                        00270000
ARRAY DIT( 1:CRDITSIZE) = DB :=                                         00272000
  0, 0, 0, 0, 0, 0, 0, 0, 0,                                   <<01340>>00274000
  0;   <<DLOGERROR>>                                           <<01340>>00276000
                                                                        00278000
ARRAY SIOA(1:CRSIOSIZE) = DB :=                                         00280000
  CNTRL,     0, SETBANK,0,    << SET DATA MODE AND BUFFER BANK >>       00282000
  SIOREAD1,  0,    << MAIN BLOCK READ >>                                00284000
  SIOENDI,   0;                                                         00286000
                                                                        00288000
                                                                        00290000
    <<------------ EXTERNAL PROCEDURE DECLARATIONS -------------->>     00292000
                                                                        00294000
PROCEDURE EOFCHECK(IOQP,BUFR,COUNT,BLANK);                              00296000
  VALUE IOQP, BUFR, COUNT, BLANK;   POINTER IOQP;                       00298000
  INTEGER COUNT;  LOGICAL BLANK;                                        00300000
  DOUBLE  BUFR;      OPTION EXTERNAL;                                   00302000
                                                                        00304000
PROCEDURE  GIP;   OPTION EXTERNAL;                                      00306000
                                                                        00308000
PROCEDURE HELP;   OPTION EXTERNAL;                                      00310000
                                                                        00312000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<0U.EB>>00314000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<0U.EB>>00316000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<0U.EB>>00318000
   IOTYPE;                                                     <<0U.EB>>00320000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<0U.EB>>00322000
   IOTYPE;                                                     <<0U.EB>>00324000
INTEGER POINTER DITP;                                          <<0U.EB>>00326000
OPTION VARIABLE,EXTERNAL;                                      <<0U.EB>>00328000
                                                                        00330000
PROCEDURE MASTERCLEAR(DITP);                                            00332000
  ARRAY DITP;  OPTION EXTERNAL;                                         00334000
                                                                        00336000
PROCEDURE SIODM(DITP,FLAGS);                                            00338000
  VALUE DITP, FLAGS;   LOGICAL FLAGS;                                   00340000
  POINTER DITP;    OPTION  EXTERNAL;                                    00342000
                                                                        00344000
PROCEDURE STARTIO(DITP,SIOP,QFLAG);                                     00346000
  VALUE  DITP, SIOP, QFLAG;     LOGICAL QFLAG;                          00348000
  POINTER DITP, SIOP;    OPTION EXTERNAL;                               00350000
$PAGE  "CARD READER DRIVER PROCEDURE - CRDRVR"                          00352000
                                                                        00354000
INTEGER PROCEDURE CRDRVR(IOQP,DITP,BANK,BUFADDR,SIOP,DRTNUMB);          00356000
  <<                                                                    00358000
     THIS PROCEDURE INITIATES AND COMPLETES I/O FOR CARD READERS        00360000
                                                                        00362000
    MODE RETURNS IN CRDRVR -                                            00364000
                                                                        00366000
        5  - REQUEST COMPLETED                                          00368000
        7  - NOT READY WAIT                                             00370000
      %13  - INTERRUPT WAIT OR WAIT FOR COMPLETION                      00372000
  >>                                                                    00374000
                                                                        00376000
  VALUE  DRTNUMB, BANK, BUFADDR;                                        00378000
  INTEGER  BANK, BUFADDR, DRTNUMB;                                      00380000
  INTEGER  ARRAY IOQP, DITP, SIOP;                                      00382000
  OPTION PRIVILEGED, UNCALLABLE;                                        00384000
  BEGIN                                                                 00386000
    INTEGER LDEV      = Q+1;  << LOGICAL DEVICE NUMBER >>               00388000
    INTEGER DATAMODE  = LDEV+1;  << HOLDS DATA READ MODE >>             00390000
    DOUBLE AUXBUFADDR = DATAMODE+1;  << CARD SAVING BUF ADDRESS >>      00392000
    INTEGER WCNT      = AUXBUFADDR+2;  << WORD CNT FOR CONV. >><<00877>>00394000
         INTEGER MODE = CRDRVR;  << CURRENT REQUEST STATE >>            00396000
                                                                        00398000
                                                                        00400000
    DOUBLE POINTER SIOPD = Q-5;                                         00402000
                                                                        00404000
    LOGICAL ARRAY                                                       00406000
      DITPL(*)           = DITP,                                        00408000
      IOQPL(*)           = IOQP;                                        00410000
                                                                        00412000
    DOUBLE BUFADDRD      = Q- 7;  << BANK AND OFFSET >>                 00414000
                                                                        00416000
    ARRAY MAXCOUNT(0:1) = PB := 40,80;  << MAX TRANSFER ALLOWED >>      00418000
    ARRAY CONTROLWORD(0:1) =PB := %12,5; << ASCII/COL BINARY CNTRL >>   00420000
                                                                        00422000
    INTEGER ARRAY KARDIN(0:255)= PB :=                         <<00877>>00424000
      << KARD TO JIS8 CONVERSION TABLE >>                      <<00877>>00426000
      %000,%001,%002,%003,%004,%005,%006,%007,                 <<00877>>00428000
      %010,%011,%012,%013,%014,%015,%016,%017,                 <<00877>>00430000
      %020,%021,%022,%023,%024,%025,%026,%027,                 <<00877>>00432000
      %030,%031,%032,%033,%034,%035,%036,%037,                 <<00877>>00434000
      %040,%041,%042,%043,%044,%045,%046,%047,                 <<00877>>00436000
      %050,%051,%052,%053,%054,%055,%056,%057,                 <<00877>>00438000
      %060,%061,%062,%063,%064,%065,%066,%067,                 <<00877>>00440000
      %070,%071,%072,%073,%074,%075,%076,%077,                 <<00877>>00442000
      %100,%101,%102,%103,%104,%105,%106,%107,                 <<00877>>00444000
      %110,%111,%112,%113,%114,%115,%116,%117,                 <<00877>>00446000
      %120,%121,%122,%123,%124,%125,%126,%127,                 <<00877>>00448000
      %130,%131,%132,%133,%134,%135,%136,%137,                 <<00877>>00450000
      %140,%261,%262,%263,%264,%265,%266,%267,                 <<00877>>00452000
      %270,%271,%300,%301,%302,%303,%304,%305,                 <<00877>>00454000
      %306,%307,%310,%315,%316,%317,%320,%321,                 <<00877>>00456000
      %322,%323,%324,%173,%174,%175,%176,%177,                 <<00877>>00458000
      %200,%201,%202,%203,%204,%205,%206,%207,                 <<00877>>00460000
      %210,%211,%212,%213,%214,%215,%216,%217,                 <<00877>>00462000
      %220,%221,%222,%223,%224,%225,%226,%227,                 <<00877>>00464000
      %230,%231,%232,%233,%234,%235,%236,%237,                 <<00877>>00466000
      %241,%242,%243,%244,%245,%246,%247,%250,                 <<00907>>00468000
      %251,%252,%253,%254,%255,%256,%257,%240,                 <<00907>>00470000
      %260,%141,%142,%143,%144,%145,%146,%147,                 <<00877>>00472000
      %150,%151,%156,%160,%161,%162,%165,%164,                 <<00877>>00474000
      %152,%153,%154,%155,%272,%157,%273,%274,                 <<00877>>00476000
      %275,%276,%277,%311,%166,%163,%312,%313,                 <<00877>>00478000
      %314,%167,%325,%171,%326,%327,%330,%331,                 <<00877>>00480000
      %172,%170,%342,%343,%344,%345,%346,%347,                 <<00877>>00482000
      %340,%341,%332,%333,%334,%335,%336,%337,                 <<00877>>00484000
      %350,%351,%352,%353,%354,%355,%356,%357,                 <<00877>>00486000
      %360,%361,%362,%363,%364,%365,%366,%367,                 <<00877>>00488000
      %370,%371,%372,%373,%374,%375,%376,%377;                 <<00877>>00490000
                                                               <<00877>>00492000
                                                                        00494000
                                                                        00496000
   <<------------ BEGIN CARD READER DRIVER -------------->>             00498000
                                                                        00500000
    TOS := DITP(DLDEV).DLDEVN;   << SET LDEV >>                         00502000
    TOS := IOQP(QPAR2).(11:2);   << SET DATA MODE >>                    00504000
    TOS := DOUBLE(@SIOP+BUFBASE);   << SET AUXBUFADDR >>                00506000
    TOS := 0;                        << SET WORD COUNTER >>    <<00877>>00508000
                                                                        00510000
    TOS := IOQP;    << GET QFLAGS >>                                    00512000
    IF < THEN   << REQUEST ABORTED >>                                   00514000
      BEGIN                                                             00516000
        MASTERCLEAR(DITP);                                              00518000
                                                                        00520000
        TOS := IF IOQPL.PFAIL THEN PFABORT ELSE ABORTED;                00522000
        GOTO CLEARCOUNT;                                                00524000
        HELP;   << FOR LINKAGE ******************************>>         00526000
      END;                                                              00528000
                                                                        00530000
    IF DITPL.NRMESSAGE AND NOT DITPL(DSTAT) THEN                        00532000
      DITP.NRMESSAGE := 0;   << CARD READER READY >>                    00534000
                                                                        00536000
    IF MODE<>2 THEN GOTO COMPLETOR;                                     00538000
                                                                        00540000
    X := IOQP(QFUNC).FUNC;                                              00542000
    IF <> THEN  << NOT A READ REQUEST >>                                00544000
      BEGIN                                                             00546000
        IF NOT(FOPEN<=X<=DCLOSE) THEN GOTO BADCALL; << BAD FUNCTION >>  00548000
        X := X - DCLOSE;                                                00550000
        IF = THEN   << DCLOSE, CLEAR EOF STATE >>                       00552000
          BEGIN                                                         00554000
            TOS := LPDTD(LDEV);                                         00556000
            TOS.EOF := 0;                                               00558000
            LPDTD( X ) := TOS;                                          00560000
          END;                                                          00562000
        GOTO GOODDONE;                                                  00564000
      END;                                                              00566000
                                                                        00568000
    IF DITPL(DSTAT).EOFBIT THEN  << HARDWARE EOF >>                     00570000
      BEGIN                                                             00572000
        TOS := LPDTD(LDEV);                                             00574000
        TOS.EOF := 1;                                                   00576000
        LPDTD( X ) := TOS;                                              00578000
      END;                                                              00580000
                                                                        00582000
    EOFCHECK(IOQP, 0D, 0, 0);                                           00584000
    IF <> THEN GOTO IODONE;   << END OF FILE >>                         00586000
                                                                        00588000
    IF DATAMODE>1 THEN   << INVALID MODE SPECIFICATION >>               00590000
      BEGIN                                                             00592000
BADCALL:                                                                00594000
        TOS := INVALIDOP;                                               00596000
        GOTO CLEARCOUNT;                                                00598000
      END;                                                              00600000
                                                                        00602000
FORMCOUNT:                                                              00604000
    TOS := MAXCOUNT(DATAMODE);                                          00606000
    TOS := IOQP(QWBCT);                                                 00608000
    IF < THEN TOS := -(TOS&ASR(1));  << CONVERT TO WORDS >>             00610000
                                                                        00612000
    ASMB(DDUP,CMP );                                                    00614000
    IF < THEN  << MAXIMUM < REQUESTED >>                                00616000
      BEGIN   << ROUND DOWN TO MAXIMUM >>                               00618000
        TOS := IOQP(X);  DDEL;  << GET SIGN OF ORGINAL COUNT >>         00620000
        IF < THEN TOS := -TOS&ASL(1);  << FORM BYTE COUNT >>            00622000
        IOQP(X) := TOS;   << SET UPDATED COUNT >>                       00624000
        GOTO FORMCOUNT;    << GO FORM WORD COUNT >>                     00626000
      END;                                                              00628000
                                                                        00630000
    DITP(DWCNT) := S0;  << SAVE REQUESTED WORD COUNT >>                 00632000
                                                                        00634000
    DITP(DDP).READDONE := 0;                                   <<01383>>00636000
    IF <> THEN     << CARD ALREADY READ & ASCII REQUESTED >>            00638000
      BEGIN                                                             00640000
        IF LOGICAL(DATAMODE) THEN   << BINARY AND CARD READ IN ASCII >> 00642000
          GOTO BADCALL;                                                 00644000
        TOS := 1;   << TO INDICATE AUX BUFFER READ >>                   00646000
        GOTO CHECKDATA;   << MOVE DATA TO USER FROM AUXILLARY BUFFER >> 00648000
      END;                                                              00650000
                                                                        00652000
    TOS := -TOS;   << MAKE WORD COUNT NEGATIVE >>                       00654000
    IF S0>-40 THEN                                                      00656000
      BEGIN   << READ 40 WORDS INTO AUXILLARY FOR BACKUP >>             00658000
        IOQP(QMISC) := 1;   << SET AUXILLARY BUFFER FLAG >>             00660000
        TOS := -40;                                                     00662000
        TOS := AUXBUFADDR;   << ADDRESS OF SAVE BUFFER >>               00664000
      END                                                               00666000
    ELSE TOS := BUFADDRD;                                               00668000
                                                                        00670000
    SIOP(BUFADR) := TOS;     << BUFFER ADDRESS >>                       00672000
    SIOP(BANKN) := TOS;     << SET MAIN BLOCK BANK NUMBER >>            00674000
                                                                        00676000
    TOS.(0:1) := 0;     << FORM READ ORDER FROM NEG WORD COUNT >>       00678000
    SIOP(READORDER) := TOS;     << SET MAIN BLOCK READ ORDER >>         00680000
                                                                        00682000
    SIOP(1) := CONTROLWORD(DATAMODE);  << ASCII/BINARY READ >>          00684000
    STARTIO(DITP,SIOP,TRUE);                                            00686000
    IF > THEN        << READER NOT READY? >>                            00688000
SIOFAILURE:                                                             00690000
      IF DITPL(DSTAT) THEN GOTO NOTRDY ELSE                             00692000
        BEGIN  << SIO FAILURE >>                                        00694000
          TOS := SIOFAIL;                                               00696000
          GOTO BADIO;                                          <<00.05>>00698000
        END;                                                            00700000
                                                                        00702000
    TOS := INTRPTWAIT;                                                  00704000
    GOTO OUT;                                                           00706000
                                                                        00708000
                                                                        00710000
COMPLETOR:                                                              00712000
    IF TOS.SFAIL THEN GOTO SIOFAILURE; << START SIO FAIL ELSEWH<<00.05  00714000
                                                               <<00.05>>00716000
    IF DITPL(DSTAT).TROUBLE THEN                                        00718000
      BEGIN                                                             00720000
        IF DITPL(X).BADHOLLERITH THEN                                   00722000
          BEGIN                                                         00724000
            TOS := SIOP(BANKN);                                         00726000
            TOS := SIOP(BUFADR);  << GET BANK AND OFFSET >>             00728000
                                                                        00730000
            X := 0;                                                     00732000
            WHILE (X:=X+1)<=80 DO                                       00734000
              BEGIN                                                     00736000
                LOADMEMORY;                                             00738000
                IF LX THEN TOS := TOS&LSR(8)  << GET LEFT BYTE >>       00740000
                  ELSE ASMB(INCB     );  << BUMP WORD ADDRESS >>        00742000
                                                                        00744000
                IF TOS.(8:8)=%32 THEN  << INVALID CODE FOUND >>         00746000
                  IF IOMESSAGE(1,12,%11000,LDEV,X,,,,          <<0U.EB>>00748000
                     OPCONSOLE) THEN                           <<0U.EB>>00750000
                    GOTO NRWAIT << INVALID HOLLERITH MESSAGE ISSUED >>  00752000
                      ELSE GOTO SYSERR;                                 00754000
              END;                                                      00756000
          END;                                                          00758000
                                                                        00760000
        TOS := DITPL(X) LAND %14400; <<CHECK TIMING,LIGHT/DARK,COMPARE>>00762000
        IF <> THEN     <<ERROR, SET UP MESSAGE>>               <<00430>>00764000
          BEGIN                                                         00766000
            DITP(DSERR):= [8/1,8/DLOGERROR];                   <<01340>>00768000
            DITP(DLOGERROR):= DITP(DSTAT);  <<LOG ERROR>>      <<01340>>00770000
            IF TOS.RDCHK = 1   THEN  X := RDCHKMSG             <<00430>>00772000
                               ELSE  X := UFAILMSG;            <<00430>>00774000
          END                                                           00776000
        ELSE                                                            00778000
NOTRDY:                                                                 00780000
          X := NOTRDYMSG;                                               00782000
                                                                        00784000
        DITP.NRMESSAGE := 1;  << SET MESSAGE ISSUED FLAG >>             00786000
        IF <> OR IOMESSAGE(1,X,%10000,LDEV,,,,,OPCONSOLE) THEN <<0U.EB>>00788000
          BEGIN  << ISSUE MESSAGE OR ALREADY ISSUED >>                  00790000
NRWAIT:                                                                 00792000
            TOS := NOTREADY;                                            00794000
            GOTO OUT;                                                   00796000
          END;                                                          00798000
                                                                        00800000
SYSERR:                                                                 00802000
        TOS := SYSERROR;  << NO MESSAGE LINK BUFFERS >>                 00804000
                                                                        00806000
BADIO:                                                         <<00.05>>00808000
       DITP(DSERR):= [8/1,8/DLOGERROR];                        <<01340>>00810000
       DITP(DLOGERROR):= DITP(DSTAT);    << LOG ERROR >>       <<01340>>00812000
        MASTERCLEAR(DITP);                                     <<00.05>>00814000
                                                                        00816000
CLEARCOUNT:                                                             00818000
        IOQP(QWBCT) := 0;                                               00820000
        GOTO SETSTATUS;                                                 00822000
      END;                                                              00824000
                                                                        00826000
      <<IF HOPPER EMPTY/STACKER FULL AND DEVICE READY>>        <<00523>>00828000
      <<THEN STACKER FULL OR HOPPER EMPTY MICROSWITCH>>        <<00523>>00830000
      <<IS STICKING.  NOTIFY THE OPERATOR.>>                   <<00523>>00832000
    IF DITPL(DSTAT).HESF LAND NOT DITPL(DSTAT).NRDY  THEN      <<00523>>00834000
    BEGIN                                                      <<00523>>00836000
      IOMESSAGE(1,209,%10000,LDEV,,,,,OPCONSOLE);              <<00523>>00838000
       DITP(DSERR):= [8/1,8/DLOGERROR];                        <<01340>>00840000
       DITP(DLOGERROR):= DITP(DSTAT);    << LOG ERROR >>       <<01340>>00842000
    END;                                                       <<00523>>00844000
                                                               <<00523>>00846000
    TOS := IOQP(QMISC);   << AUXILLARY BUFFER FLAG >>                   00848000
                                                                        00850000
CHECKDATA:                                                              00852000
    EOFCHECK(IOQP,IF LS0 THEN AUXBUFADDR ELSE BUFADDRD,40,              00854000
                  IF ASCII THEN 1 ELSE -1);                             00856000
                                                                        00858000
    IF TOS THEN     << READ INTO AUXILLARY BUFFER >>                    00860000
      BEGIN                                                             00862000
        IF = THEN  << NO EOF >>                                         00864000
          BEGIN  << MOVE DATA TO USERS BUFFER >>                        00866000
            TOS := BUFADDRD;                                            00868000
            TOS := AUXBUFADDR;                                          00870000
            TOS := DITP(DWCNT);  << WORD COUNT TO MOVE >>               00872000
            ASMB( MABS );                                               00874000
            GOTO GOODDONE;                                              00876000
          END;                                                          00878000
                                                                        00880000
        IF < THEN GOTO SETREADDONE;     << BACK UP CARD >>              00882000
      END                                                               00884000
                                                                        00886000
    ELSE IF < THEN   << READ TO USER BUFFER AND BACK UP >>              00888000
      BEGIN  << BACK UP, SO SAVE DATA IN AUX BUFFER >>                  00890000
        TOS := AUXBUFADDR;                                              00892000
        TOS := BUFADDRD;                                                00894000
        TOS := 40;                                                      00896000
        ASMB( MABS 1 );  << LEAVE SOURCE ADDRESS ON TOS >>              00898000
                                                                        00900000
        X := DITP(DWCNT);                                               00902000
        DO BEGIN  << BLANK USER'S BUFFER >>                             00904000
             TOS := TOS-1;   TOS := 0;                                  00906000
             ASMB( SSEA );                                              00908000
           END                                                          00910000
        UNTIL DXBZ;                                                     00912000
                                                                        00914000
SETREADDONE:                                                            00916000
        IF ASCII THEN DITP(DDP).READDONE := 1;                 <<01383>>00918000
      END                                                               00920000
    ELSE IF = THEN   << NO EOF >>                                       00922000
      BEGIN                                                             00924000
GOODDONE:                                                               00926000
        X := IOQP(QFUNC).FUNC;       << I/O REQUEST TYPE >>    <<00877>>00928000
        IF <> THEN GOTO CONVERTDONE; << NOT READ REQUEST >>    <<00877>>00930000
        TOS := LPDTD(LDEV);          << GET SUBTYPE >>         <<00877>>00932000
        DELB;                        << STACK ERASE >>         <<00877>>00934000
        IF TOS.SUBTYPE=1 AND ASCII THEN                        <<00877>>00936000
        BEGIN                        << KATAKANA CHAR >>       <<00877>>00938000
           WCNT := 0;                << WCNT INITIALIZE >>     <<00877>>00940000
           WHILE WCNT < INTEGER (DITP(DWCNT)) DO               <<00877>>00942000
           BEGIN                     << START CONVERT & MOVE >><<00877>>00944000
              TOS := BUFADDRD;       << LOAD BUFADDRD >>       <<00877>>00946000
              TOS := TOS+WCNT;       << ADDR OF CONVERT DATA >><<00877>>00948000
              ASMB(LSEA);            << LOAD DATA >>           <<00877>>00950000
              ASMB(DELB,DELB);       << CLEAR ADDR ON STACK >> <<00877>>00952000
              ASMB(DUP);                                       <<00877>>00954000
              ASMB(ANDI 255);        << RIGHT BYTE >>          <<00877>>00956000
              X := TOS;                                        <<00877>>00958000
              TOS := KARDIN(X);      << CONVERT TO JIS8 >>     <<00877>>00960000
              ASMB(XCH);             << NEXT BYTE >>           <<00877>>00962000
              TOS := TOS & LSR(8);   << LEFT BYTE >>           <<00877>>00964000
              X := TOS;                                        <<00877>>00966000
              TOS := KARDIN(X);      << CONVERT TO JIS8 >>     <<00877>>00968000
              TOS := TOS & LSL(8);   << SHIFT TO LEFT >>       <<00877>>00970000
              ASMB(OR);              << MERGE R. AND L. BYTE >><<00877>>00972000
              TOS := BUFADDRD;                                 <<00877>>00974000
              TOS := TOS+WCNT;       << CONVERTED DATA ADR >>  <<00877>>00976000
              ASMB(CAB;SSEA;DDEL);   << MOVE AND CLEAR ADDR >> <<00877>>00978000
              WCNT := WCNT+1;        << UPDATE WORD COUNTER >> <<00877>>00980000
           END;                                                <<00877>>00982000
        END;                                                   <<00877>>00984000
CONVERTDONE:                                                   <<00877>>00986000
                                                               <<00877>>00988000
                                                               <<00877>>00990000
        TOS := GOODIO;                                                  00992000
                                                                        00994000
SETSTATUS:                                                              00996000
        IOQP(QSTAT).IOSTAT := TOS;                                      00998000
      END;                                                              01000000
                                                                        01002000
IODONE:                                                                 01004000
    TOS := REQUESTDONE;                                                 01006000
                                                                        01008000
OUT:                                                                    01010000
    CRDRVR := TOS;                                                      01012000
                                                                        01014000
  END;      <<----  C R D R V R ------- >>                              01016000
                                                                        01018000
                                                                        01020000
                                                                        01022000
                                                                        01024000
  <<*************** DRIVER LINKAGE AREA ******************>>            01026000
                                                                        01028000
                                                                        01030000
ASMB(                                                                   01032000
    PCAL SIODM;   << MONITOR   >>                                       01034000
    PCAL CRDRVR;  << INITIATOR >>                                       01036000
    PCAL CRDRVR;  << AND COMPLETOR >>                                   01038000
                                                                        01040000
    CON  0;       << NO IO PROCESS >>                                   01042000
                                                                        01044000
    CON  0;       << NO INITIALIZATION >>                               01046000
                                                                        01048000
    CON  1;       << ONE INTERRUPT HANDLER >>                           01050000
    PCAL GIP);    << INTERRUPT HANDLER >>                               01052000
                                                                        01054000
END.   << CARD READER DRIVER - IOCDRD0 >>                               01056000
