ASMB,R        
      HED * RTE HP2892A CARD READER DRIVER, DVR11  ***
      NAM DVR11      29030-60001 REV 1710    3-1-77     
      ENT I.11,C.11 
      EXT $UPIO 
* 
      SUP 
* 
      SPC 4 
* 
*************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. ALL RIGHTS      * 
* RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
* REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* 
* THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       * 
*************************************************************** 
*        ***HP 2892A RTE DVR 11***
* 
*        SOURCE TAPE: 29030-80001 
*        RELOC. TAPE: 29030-60001 
*        SMALL PROG.MANUAL: 29030-95001 
* 
*             REVISION B
*        JUNE 1974      A.M. WERNICK
* 
*                   REV. 1710   3-1-77      
* 
* 
*  THIS DRIVER CAN CONVERT EITHER EBCDIC OR BCD CARDS:
      SPC 1 
*  WHEN CONFIGURING THIS DRIVER INTO RTE SYSTEM,
*  ASSIGN CARD READER THREE LOGICAL UNIT NUMBERS
*    LU#N = READER,SUBCHANNEL 0 
*    LU#M = READER,SUBCHANNEL 1 
*    LU#L = READER,SUBCHANNEL 2 
*  TO CONVERT EBCDIC PUNCH SET - ADDRESS READER AS SUBCHANNEL 0 
*  TO CONVERT BCD PUNCH SET - ADDRESS READER AS SUBCHANNEL 1
*  TO CONVERT EBCDIC-RDTS PUNCH SET - ADDRS READER AS SUBCHN 2
      SPC 2 
*  THIS CARD READER DRIVER PROCESSES READ AND CONTROL REQ'S.
*  WRITE REQ'S AND ILLEGAL CONTROL REQ'S ARE REJECTED.
      SPC 1 
*  TO PROCESS A READ, STATUS IS FIRST CHECKED.  IF IT IS
*  "OK TO PICK" A PICK COMMAND IS ISSUED AND A DMA TRANSFER 
*  IS BEGUN.  IF STATUS IS NOT "OK TO PICK" A NOT READY 
*  RETURN IS MADE TO THE SYSTEM.
*  THE DMA TRANSFER IS INTO THE DRIVER'S INTERNAL BUFFER. 
*  THE DRIVER IS ENTERED UPON DEVICE CONTROLLER INTERRUPT.
*  THE CARD DATA IS CONVERTED FROM COLUMN IMAGE TO THE FORMAT 
* 
*  SPECIFIED BY THE READ REQUEST AND STORED INTO THE CALLING
*  PROGRAM'S BUFFER.
*  THE THREE FORMATS A READ REQUEST CAN SPECIFY ARE:
*    ASCII           SUBFUNCTION 0
*    PACKED BINARY   SUBFUNCTION 3
*    COLUMN BINARY   SUBFUNCTION 1
      SPC 1 
*  NO CONTROL REQUESTS ARE PROCESSED
* 
* 
*  *****EQT USAGE*****
* 
*     EQT5 STATUS BITS HAVE THE FOLLOWING 
*     MEANINGS WHEN SET TO 1 :
* 
* BIT 0   CARD READER IS ON LINE BUT NOT READY
*         OR CARD READER IS OFF LINE. 
* BIT 1   AN ILLEGAL CARD CODE WAS ENCOUNTERED
*         DURING THE PREVIOUS READ OPERATON OR
*         THE CARD READER HAD HARDWARE TROUBLE. 
* BIT 2   CARD READER IS OFF LINE.
* BIT 3   TIMING ERROR OR PICK FAILURE WAS SENSED 
*         DURING PREVIOUS READ OPERATION. 
* BIT 4   PICK FAILURE OR CARD MOTION ERROR WAS 
*         SENSED DURING PREVIOUS READ OPERATION.
* BIT 5   IF BOTH BITS 3 & 5 ARE ON, NO DATA WAS
*         TRANSMITTED DURING PREVIOUS READ OPERATION. 
*          IF BIT 3 IS OFF & BIT 5 IS ON, THE PREVIOUS
*         READ REQUEST WAS REJECTED BECAUSE THE HOPPER
*         WAS EMPTY OR THE STACKER WAS FULL.
* BIT 6   STACKER IS FULL.
* BIT 7   THE PREVIOUS READ OPERATION LEFT THE INPUT
*         HOPPER EMPTY AND THE END OF FILE SWITCH 
*         WAS ON DURING THE READ OPERATION. 
* 
*     EQT6 FUNCTION BITS HAVE THE FOLLOWING MEANINGS: 
* 
* BIT 6   MODE BIT: 0=ASCII,1=BINARY
* BIT 7   'V' BIT: 0=COLUMN BINARY,1=PACKED BINARY
* 
*     EQT7   USER BUFFER ADDRESS
* 
*     EQT8   USER BUFFER LENGTH 
* 
*     EQT9   CURRENT DMA CHANNEL
* 
*     EQT10  CARD READER STATUS BITS ARE DEFINED AS FOLLOWS:
* 
* BIT 0   CARD READER NOT READY,OFF LINE, OR BUSY 
* BIT 1   TROUBLE DURING READ 
* BIT 2   CARD READER OFF LINE
* BIT 3   DATA LOST 
* BIT 4   NOT USED
* BIT 5   HOPPER EMPTY OR STACKER FULL
* BIT 6   STACKER FULL
* BIT 7   END OF FILE AND HOPPER EMPTY
* BIT 8   PICK STATUS 
* BIT 9   LIGHT/DARK READ ERROR 
* BIT 10  NOT USED
* BIT 11  MOTION/PICK FAILURE 
* BIT 12  COMPUTER POWER TURN-ON/PRESET OR
*         END OF OPERATION INTERRUPT
* BIT 13  NOT USED
* BIT 14  NOT USED
* BIT 15  END OF OPERATION
* 
*     EQT11   SUBCHANNEL FOR CONVERSION:0=STD EBCDIC
*                                       1=BCD 
*                                       2=RDTS EBCDIC 
* 
*     EQT12   END OF FILE/HOPPER EMPTY FLAG 
* 
*     EQT13   CARD READER NOT READY/OFF LINE FLAG 
* 
*     EQT15   DEVICE TIME OUT CLOCK 
* 
      SKP 
*     INITIATION SECTION. 
* 
* 
I.11  NOP           ENTRY POINT.
      LDB CHAN
      STB EQT9,I    STORE CURRENT DMA CHN 
      JSB SETIO     SET I/O INSTRUCTIONS FOR CR.
      STA EQT5,I    SET NEW STATUS IN EQT TABLE 
      LDA EQT4,I    SET UP EQT4 SO THAT DRIVER
      IOR BIT12     CAN HANDLE ITS OWN
      STA EQT4,I    TIME OUTS 
      LDA I.11         SET COMMON EXIT
      STA C.11
      LDA EQT6,I    LOAD THE REQUEST CONTROL WORD.
      AND DEC3      ISOLATE THE REQUEST CODE. 
      CPA DEC3      IS REQUEST A CONTROL REQUEST? 
      JMP I.A.4     YES, EXIT 
      SLA,ARS       NO; IS THE REQUEST TO READ? 
      JMP READ      YES, CONTINUE.
      JMP C.11,I    RETURN TO THE USER. A=1 ILL. R\W 
      SPC 1 
A.2   LDA DEC2     NO, LOAD DECIMAL 2 INTO A REG. 
      JMP C.11,I    RETURN TO THE USER. 
      SPC 1 
READ  LDA EQT12,I   GET EOF/HOPR EMTY FLG 
      AND B200      GET BIT 7 
      SZA           EOF AND HOPR EMTY?
      JMP EOF       YES,EXIT
      STA EQT15,I   CLEAR TO CLOCK
READ0 STB EQT13,I   CR NOT RDY/OFF LINE FLAG
      SLB           IS THE CR NOT READY OR OFF-LINE?
      JMP NR      YES, GO DOWN THE UNIT.
      LDA EQT4,I    SAVE
      AND B100      SUBCHANNEL
      RAR           FOR 
      STA EQT11,I   CONVERSION
      LDA INDEX     LOAD THE CR CHANNEL NUMBER. 
DMA   EQU 06B       STANDARD "DMA" CHANNEL NUMBER.
DMA.0 OTA DMA       ASSIGN THE "DMA" CHANNEL. 
      LDA BUFAD     LOAD THE INTERNAL BUFFER ADDRESS. 
DMA.1 CLC DMA-4     PREPARE THE ADDRESS REGISTER. 
DMA.2 OTA DMA-4     OUTPUT THE BUFFER ADDRESS.
      LDA DM80     LOAD: A-80.
DMA.3 STC DMA-4     PREPARE DMA FOR WORD COUNT
DMA.6 OTA DMA-4     OUTPUT THE NEGATIVE WORD LENGTH.
CR.0  STC CR,C      ISSUE A PICK COMMAND TO THE CR. 
DMA.7 STC DMA,C     ACTIVATE THE "DMA" CHANNEL. 
* 
DMA10 CLC DMA       INHIBIT DMA INTERRUPT 
A.0   CLA,RSS       CLEAR A REG.
A.3   LDA DEC3      LOAD: A3. 
      JMP C.11,I    RETURN TO THE USER. 
      SPC 1 
NR    LDB DM80      SET UP TIME OUT 
      STB EQT15,I 
      LDB EQT11     BYPASS TIMEOUT
      STB EQT15     CLEAR 
      JMP A.3       EXIT
      SPC 1 
EOF   IOR EQT5,I    UPDATE STATUS BIT 7 
      STA EQT5,I    STORE NEW STATUS
      CLB 
      STB EQT12,I   CLEAR EOF/HOPR EMTY FLG 
**
      JMP ON1 
I.A.4 LDA EQT12,I   GET EOF FLAG
      AND B200      LOOK AT BIT 7 (EOF) 
      XOR EQT5,I    IF SET WE HAVE NOT YET ISSUED NEXT READ TO RETURN 
      STA EQT5,I    EOF. IF NOT SET LEAVE STATUS AS IS
ON1   LDA DEC4
      JMP C.11,I    RETURN
**
      SPC 2 
BIT12 OCT 10000 
      SPC 2 
SETIO NOP           ENTRY POINT.
      STA INDEX     STORE THE CR CHANNEL NUMBER.
      IOR LIA.0         MAKE LIA INSTRUCTION
      STA LIA.1 
      STA CR.3
      ADA B100               OTA CARD READER
      STA CR.2
      STA OTA.2 
      IOR B1100              STC,C  CARD READER 
      STA CR.0
**
      LDA INDEX     SET CLC ON CR FLAG
      IOR CLC.0 
      STA CLCCR 
**
      LDA STF.0       CONFIGURE DMA STF INSTRUCTION 
      IOR EQT9,I
      STA DMA.8 
CR.2  OTA CR        UPDATE THE CR STATUS REGISTER.
      ADA B500               OTA DMA
      STA DMA.0 
      IOR B1100             STC,C  DMA
      STA DMA.7 
      ADA B3000       CLC DMA    (10670D - 4 )
      STA DMA10 
      LDA EQT9,I          GET  DMA CHANNEL
      ADA N4
      IOR LIA.0             LIA DMA-4 
      STA DMA.9 
      ADA B100                 OTA DMA-4
      STA DMA.2 
      STA DMA.6 
      ADA B100
      STA DMA.3                  STC DMA-4
      IOR CLC.0                CLC DMA-4
      STA DMA.1 
CR.3  LIA CR        LOAD THE CR STATUS REGISTER.
      STA EQT10,I    SAVE STATUS WORD 
      AND M377      GET BITS 0 - 7 ONLY 
      CPA DEC3      ARE BITS 0 AND 1 0N , OTHERS OFF
      LDA B50      YES, SET BITS 3 AND 5 ON 
      IOR EQT10,I    ADD ORIGINAL STATUS BACK IN
      ALF           PUT BIT 11 IN BIT 15
      SSA           PICK OR MOTION CHECK??
      IOR B1400    YES, SET BITS 4 AND 5 TO 1 
      RAL           PUT BIT 10 TO BIT 15
      SSA           COMPARE CHECK 
      IOR B40      YES, SET BIT ZERO TO 1 
      ALF,ALF       RESET STATUS WORD 
      ALF,RAR         TO ITS NORMAL CONFIGURATION 
      ELA,RAR       SHIFT THE "EOP" BIT TO "E". 
      AND M377      ISOLATE BITS 7-0. 
      LDB A         SAVE THE STATUS IN "B". 
      LDA EQT5,I    LOAD THE STATUS WORD. 
      AND M1774     REMOVE THE OLD STATUS.
      IOR B         INCLUDE THE NEW STATUS. 
      JMP SETIO,I   RETURN. 
STF.0 STF 0 
CLC.0 CLC 0 
LIA.0 LIA 0 
      SPC 2 
B100  OCT 100 
B200  OCT 200 
B700  OCT 700 
CRSET NOP           LAST EBCDIC CHAR SET
      SPC 2 
*   STD HP EBCDIC CHARS 
HWPTB DEF *+1 
      ASC 1,!$
      ASC 1,;]
      ASC 1,+^
      SPC 1 
*   RDTS EBCDIC CHARS 
      OCT 56444      RDTS CHAR = VERT BAR,$ 
      OCT 35536      RDTS CHAR = ;,]
      OCT 25441      RDTS CHAR = +,UNDERSCORE 
      SPC 2 
READ2 RBR,SLB       WERE THERE ANY I/O ERRORS?
      JMP OPERR     YES, GO FLAG OPERATOR ATTENTION.
      CPA EQT8,I   NO; WAS A RECORD BEING SKIPPED?
      JMP R.ERR     YES, GO INITIALIZE ONLINE FLAG. 
      STA DMA.7     NO, INITIALIZE THE WORD COUNTER.
DMA.9 LIA DMA-4     LOAD THE WORD COUNT REGISTER. 
      CPA DM80     WAS ANY DATA TRANSMITTED?
      JMP NREDY     NO, GO SET I/O ERROR STATUS.
      CMA,INA       YES, WORD COUNT RESIDUE POSITIVE. 
      ADA DM80     "SUBTRACT": 80 - RESIDUE.
      STA DMA.9     STORE THE WORD COUNT INDEX. 
      LDB BUF       LOAD INTERNAL BUFFER ADDRESS. 
      STB DMA.8     STORE BUFFER ADDRESS INDEX. 
      LDB EQT6,I    LOAD THE FUNCTION REQUEST CODE. 
      BLF,BLF       SHIFT "M-BIT" TO BIT 15.
      RBL           SHIFT "M-BIT" TO BIT 15.
      SSB           IS THE MODE BINARY? 
      JMP BINRY     YES, GO PROCESS BINARY CARD.
      CLB           NO, ENTER: B0.
      STB DMA.2     INITIALIZE THE COLUMN COUNTER.
      STB DMA.1     INITIALIZE THE CHARACTER COUNTER. 
      LDA EQT4,I    GET THE SUBCHANNEL NO.
      AND B700
      CPA B100      BCD?
      JMP OUTS      YES-DONT FUSS WITH TABLE
      AND B200      STD EBCDIC OR RDTS EBCDIC?
      CPA CRSET      SAME AS LAST CHAR SET? 
      JMP OUTS      YES, DONT OVERLAY TABLE 
      STA CRSET      STORE LAST CHAR SET FLG
      LDB HWPTB     ADDRESS OF STD EBCDIC TABLE 
      CPA B200      RDTS EBCDIC?
      ADB DEC3      YES, USE RDTS CHARS 
      LDA 1,I       GET 1ST CHAR FOR OVERLAY
      STA LASC1     OVERLAY 1ST CHAR
      INB           ADDRESS OF NEXT CHAR
      LDA 1,I       GET 2ND CHAR FOR OVERLAY
      STA LASC2 
      INB 
      LDA 1,I 
      STA LASC3 
OUTS  LDA DMA.9     RESTORE A REG 
      SPC 1 
      LDB EQT8,I   LOAD THE ORIGINAL REQUEST LENGTH.
      SSB           IS THE REQUEST IN WORDS?
      CMB,INB,RSS   NO, COMPLEMENT CHARACTER COUNT. 
      RBL           YES, CONVERT WORDS TO CHARACTERS. 
      SSB           CHARACTER LENGTH OVERFLOW?
      JMP .16K      YES, CONTINUE.
      ADA B         "SUBTRACT": REQUEST- CARD LENGTH. 
      CMB,INB       NEGATE THE CHARACTER COUNT. 
      SSA           IS THE REQUEST LESS THAN CARD?
      STB DMA.9     YES, STORE THE WORD COUNT INDEX.
.16K  LDA EQT7,I   LOAD THE USER BUFFER ADDRESS.
      CLE,ELA       SHIFT TO FORM CHARACTER ADDRESS.
      STA DMA.6     SAVE THE CHARACTER ADDRESS. 
LOOP  LDA DMA.8,I   LOAD THE DATA COLUMN. 
      ISZ DMA.2     INCREMENT THE COLUMN COUNTER. 
      SZA,RSS     IF CHARACTER IS BLANK, MAKE IT ONE. 
      JMP ZERO     SET CHARACTER A BLANK. 
      LDB DMA.2     LOAD THE CURRENT COLUMN COUNTER.
      STB DMA.1     UPDATE RETURN COLUMN COUNT. 
* 
      AND B7000         MASK OFF ALL BUT BITS 12,11,0 
      CLB               CLEAR B FOR LATER 
      SZA,RSS           ANY HIGH PUNCHES ?
      JMP NOHI          NO, TEST FOR LOW PUNCHES
* 
      CPA B1000         BIT 0 PUNCHED ? 
      LDB B40           YES, LOAD 32
      CPA B2000         BIT 11 PUNCHED ?
      LDB DEC16         YES, LOAD 16
      CPA B4000         BIT 12 PUNCHED ?
      LDB DEC48         YES, LOAD 48
      SZB,RSS           WAS ONLY ONE COLUMN PUNCHED ? 
      JMP BAD           NO, ILLEGAL PUNCH 
* 
NOHI  STB DMA.0         SET HIGH FIELD WEIGHT 
      XOR DMA.8,I       ISOLATE LOWER BITS OF COLUMN
      SZA,RSS           ANY LOW BITS PUNCHED ?
      JMP NOLOW         NO, CHARACTER COMPLETED.
* 
      CCE,SLA             BIT 9 SET ? 
      LDB DEC9          YES, LOAD WEIGHT
      SLA,ARS             BIT 9 SET ? 
      JMP SET             YES, TEST FOR MORE BITS.
* 
      SLA,ARS             BIT 8 SET ? 
      CLB,RSS             YES,CLEAR B FOR LATER 
      JMP CONTN           BIT 8 WAS NOT SET.
      CLE,SZA,RSS         WAS ONLY BIT 8 SET ?
      JMP BIT8          YES, EXIT TO FORM CHARACTER.
* 
CONTN BSS 0 
* 
      LDB DEC7           LOAD WEIGHT COUNTER
      SLA,ARS           IS BIT 7 SET ?
      JMP SET           YES, CHECK FOR OTHER PUNCHES
* 
      LDB DEC6              SIX 
      SLA,ARS           IS BIT 6 SET ?
      JMP SET           YES 
      LDB DEC5              FIVE
      SLA,ARS           IS BIT 5 SET ?
      JMP SET           YES 
      LDB DEC4              FOUR
      SLA,ARS           IS BIT 4 SET ?
      JMP SET           YES 
      LDB DEC3              THREE 
      SLA,ARS           IS BIT 3 SET ?
      JMP SET           YES 
      LDB DEC2              TWO 
      SLA,ARS           IS BIT 2 SET ?
      RSS               YES,SKIP JUMP.
      JMP ONE           NO, BIT 1 MUST BE.
SET   SZA               ANY OTHER PUNCHES ? 
      JMP BAD.1         YES, ILLEGAL COMBINATION
      SEZ,RSS           IS THE BIT 8 FLAG ON ?
BIT8  ADB D8            YES, ADD WEIGHT FOR IT. 
BIT1  ADB DMA.0         ADD WEIGHT FOR FIELD BITS.
NOLOW SLB,BRS           PLACE ODD BIT IN A-REG. 
      CLA,INA        SET ODD CHARACTER FLAG 
      ADB TABLE         FIND PLACE IN TABLE.
      ADB EQT11,I       ADDS 40 FOR BCD IF REQUESTED
      CLE,SZA        ODD CHARACTER ?
      CCE 
      LDA B,I           GET WORD WITH TWO CHARS.
      SEZ,RSS           ODD CHARACTER ? 
      ALF,ALF           YES, PUT IT INTO BOTTOM.
      AND M377          ISOLATE THE CHARACTER.
LEGAL BSS 0 
      ISZ DMA.8     INCREMENT BUFFER ADDRESS POINTER. 
      LDB DMA.6     LOAD CHARACTER BUFFER ADDRESS.
      CLE,ERB       SHIFT, FORM WORD BUFFER ADDRESS.
      SEZ,RSS       IS NEW CHARACTER TO BE LOWER? 
      ALF,SLA,ALF   NO, SHIFT TO HIGH ORDER; SKIP.
      IOR B,I       YES, INCLUDE THE HIGH ORDER PART. 
      STA B,I       STORE THE WORD IN USER BUFFER.
      ISZ DMA.6     INCREMENT BUFFER ADDRESS POINTER. 
      ISZ DMA.9     IS THE BUFFER EXHAUSTED?
      JMP LOOP      NO, GO PROCESS NEXT COLUMN. 
      LDB DMA.1     YES, LOAD # NON-BLANK CHARACTERS. 
      LDA EQT8,I   LOAD THE ORIGINAL REQUEST TYPE.
      CLE,SSA,RSS   WAS THE REQUEST IN CHARACTERS?
      ERB           NO, CONVERT CHARACTERS TO WORDS.
END   CLA,SEZ       WAS THE CHARACTER COUNT ODD?
      INB           YES, INCREMENT THE WORD COUNT.
      JMP C.11,I    GO TO COMPLETION RETURN.
* 
ZERO  LDA B40        LOAD ASCII BLANK 
      JMP LEGAL      STORE LEGAL CHARACTER
* 
BAD   LDB EQT11,I       DO EXTRA
      SZB,RSS          BCD TESTS? 
      JMP BAD.1        NO 
* 
* 
      CPA B3000       11 - 0  PUNCH ? 
      JMP BCDEX       YES, MAY BE ! 
      CPA B5000       12 - 0  PUNCH ? 
      JMP BCDQU       YES, MAY BE ? 
* 
BAD.1 LDA EQT5,I      SET ILLEGAL PUNCH STATUS
      IOR DEC2
      STA EQT5,I
QUES  LDA M77         LOAD ASCII QUESTION MARK. 
      JMP LEGAL      STORE CHARACTER
* 
ONE CLB,SEZ,INB,RSS  SET WEIGHT, TEST BIT 8 FLAG ON ? 
      JMP BAD.1     BIT 8 FLAG WAS ON, ILLEGAL PUNCH. 
      JMP BIT1          JUST BIT 1 PUNCHED
* 
DEC5  DEC 5 
DEC6  DEC 6 
B3000 OCT 3000
* 
* 
BCDEX XOR DMA.8,I     TEST FOR OTHER BITS 
      SZA 
      JMP BAD.1       ILLEGAL PUNCHES 
      LDA B41         LOAD !
      JMP LEGAL       STORE SPECIAL CHARACTER 
* 
BCDQU XOR DMA.8,I     TEST FOR OTHER PUNCHES
      SZA 
      JMP BAD.1 
      JMP QUES        GO LOAD AND STORE  ?
* 
B41   OCT 41         !
B5000 OCT 5000
      SKP 
BINRY CCE,SLB       CONVERT FROM PACKED BINARY? 
      JMP PAK.B     YES, GO PROCESS PACKED BINARY.
      JSB INDEX     NO, GO COMPUTE WORD COUNT INDEX.
COL.B LDA DMA.8,I   LOAD THE DATA COLUMN. 
      ISZ DMA.8     INCREMENT BUFFER ADDRESS POINTER. 
      STA DMA.6,I   STORE THE WORD IN USER BUFFER.
      ISZ DMA.6     INCREMENT BUFFER ADDRESS POINTER. 
      ISZ DMA.7     INCREMENT THE WORD COUNTER. 
      ISZ DMA.9     IS THE BUFFER EXHAUSTED?
      JMP COL.B     NO, CONTINUE. 
TLOG  LDA EQT8,I   LOAD THE ORIGINAL REQUEST TYPE.
      LDB DMA.7     LOAD THE TRANSMISSION LOG.
      CLE,SSA       WAS THE REQUEST IN CHARACTERS?
      BLS           YES, CONVERT WORDS TO CHARACTERS. 
      JMP END       GO ISSUE A COMPLETION RETURN. 
      SPC 2 
INDEX NOP           ENTRY POINT.
      LDB EQT7,I   LOAD THE USER BUFFER ADDRESS.
      STB DMA.6     SAVE THE USER BUFFER ADDRESS. 
      LDB EQT8,I   LOAD THE ORIGINAL REQUEST LENGTH.
      SSB,RSS       IS THE REQUEST IN WORDS?
      CMB,INB,RSS   YES, COMPLEMENT WORD COUNT; SKIP. 
      BRS           NO, CONVERT CHARACTERS TO WORDS.
      CMA,INA       MAKE THE RECORD LENGTH POSITIVE.
      ADA B         "SUBTRACT": RECORD COUNT-REQUEST. 
      SSA,RSS       IS THE REQUEST LESS THAN RECORD?
      STB DMA.9     YES, STORE THE REQUEST LENGTH.
      JMP INDEX,I   RETURN. 
      SPC 1 
PAK.B LDA DMA.8,I   LOAD THE FIRST DATA COLUMN. 
      RAR,RAR       SHIFT ROWS 12-5 TO LOWER. 
      RAR,RAR       SHIFT ROWS 12-5 TO LOWER. 
      AND M377      ISOLATE THE RECORD WORD LENGTH. 
      CMA,INA,SZA,RSS IS THE RECORD LENGTH ZERO(0)? 
      JMP NREDY     YES, GO FLAG WORD COUNT ERROR.
      STA DMA.9     NO, SAVE THE RECORD WORD LENGTH.
      JSB INDEX     GO COMPUTE THE WORD COUNT INDEX.
      LDA DMA.9     LOAD THE WORD COUNT INDEX.
      ADA D60      "SUBTRACT": 60- WORD COUNT INDEX.
      SSA           IS THE WORD COUNT > 60? 
      JMP NREDY     YES, GO FLAG WORD COUNT ERROR.
      LDB DMA.8,I   NO, LOAD DATA COLUMN 1 OF 4.
      ISZ DMA.8     INCREMENT BUFFER ADDRESS POINTER. 
UNPAK BLF           SHIFT COLUMN TO BITS 15-4.
      STB DMA.1     SAVE THE DATA COLUMN. 
      LDA DMA.8,I   LOAD DATA COLUMN 2 OF 4.
      ISZ DMA.8     INCREMENT BUFFER ADDRESS POINTER. 
      ALF,ALF       SHIFT ROW 12 TO BIT 3.
      LDB A         SAVE THE DATA COLUMN. 
      AND M17       ISOLATE ROWS 12-1.
      IOR DMA.1     INCLUDE COLUMN #1.
      JSB STORE     GO STORE DATA WORD 1 OF 3.
      AND M1774     ISOLATE ROWS 2-9. 
      STA DMA.1     SAVE THE PARTIAL DATA COLUMN. 
      BLF,BLF       SHIFT ROW 12 TO BIT 7.
      BLF           SHIFT ROW 12 TO BIT 7.
      LDA B         LOAD DATA COLUMN 3 OF 4.
      AND M377      ISOLATE ROWS 12-5.
      IOR DMA.1     INCLUDE COLUMN #2.
      JSB STORE     GO STORE DATA WORD 2 OF 3.
      AND B17       ISOLATE ROWS 6-9. 
      IOR B         INCLUDE DATA COLUMN 4 OF 4. 
      JSB STORE     GO STORE DATA WORD 3 OF 3.
      JMP UNPAK     GO PROCESS THE NEXT 4 COLUMNS.
      SPC 2 
STORE NOP           ENTRY POINT.
      STA DMA.6,I   STORE THE BINARY DATA WORD. 
      ISZ DMA.6     INCREMENT BUFFER ADDRESS POINTER. 
      ISZ DMA.7     INCREMENT THE WORD COUNTER. 
      LDA B         LOAD THE PREVIOUS DATA COLUMN.
      LDB DMA.8,I   LOAD THE NEXT DATA COLUMN.
      ISZ DMA.8     INCREMENT BUFFER ADDRESS POINTER. 
      ISZ DMA.9     IS THE BUFFER EXHAUSTED?
      JMP STORE,I   NO, RETURN. 
      JMP TLOG      YES, GO LOAD TRANSMISSION LOG.
      SPC 1 
OPERR LDA DEC3      LOAD: A3. 
      JMP R.ERR     GO INITIALIZE THE ONLINE FLAG.
      SPC 1 
NREDY LDA EQT5,I    LOAD THE STATUS WORD. 
      IOR DEC2      INCLUDE THE I/O ERROR STATUS. 
      STA EQT5,I    UPDATE THE STATUS WORD. 
      JMP R.ERR     NO, GO INITIALIZE ONLINE FLAG.
      SPC 1 
NEOF  OCT 177537        BIT 7 MASK
      SKP 
*     COMPLETION SECTION. 
      SPC 1 
C.11  NOP           ENTRY POINT.
* 
*       A REG CONTAINS INTERRUPT SLOT 
* 
      LDB EQT13,I      IS AN INTERRUPT EXPECTED ? 
      SLB 
      JMP EXTRA        NO, SET UP TIMEOUT & EXIT. 
**
      LDB EQT1,I    CHECK FOR SPURIOUS INTERRUPT. I.E 
      SZB,RSS       WHEN POWER TURNED OFF 
      JMP EXTRA     SPURIOUS INTERRUPT
**
      JSB SETIO     SET I/O INSTRUCTIONS FOR CR.
      STA EQT12,I   SAVE STATUS WORD IN EQT12 
      ALF,ALF       PUT BIT 7 TO BIT 15 
      SSA           IF BIT 7 NOT SET SKIP 
      JMP BY        IF SET THEN SKIP OTHER TESTS
      RAL,RAL       SET BIT 5 TO 15 POSITION
      SSA,RSS       IF NOT SET THEN NO CHANGE 
      JMP BY        CONTINUE
      RAL,RAL       SET BIT 3 TO 15 POSITION
      SSA           IS BIT 3 SET  1 
      JMP BY        YES, SKIP CHANGE
      CLB           NO,SET EQT10,I
      STB EQT10,I    FOR HOP MTY/STACK FUL
      LDA EQT12,I   RESTORE STATUS TO A-REGISTER
      AND BIT51   CLEAR BITS 5 AND 1
      RSS           SKIP NEXT LOAD
BY    LDA EQT12,I   RESTORE STATUS TO A-REGISTER
      AND NEOF      INCLUDE EOF/HOPR EMTY STATUS
      STA EQT5,I    RESET EQT WORD TO NEW STATUS
      CLA,CME       ENTER: A0; COMPLEMENT "EOP".
DMA.8 STF DMA       SET FLAG
      ELA,SLA       IS THE END-OF-OPERATION FLAG ON?
R.ERR CLB,RSS       ENTER: B0; SKIP.
      JMP READ2     YES, GO PROCESS THE CARD IMAGE. 
      LDA EQT10,I    LOAD HE/SF FLAG WORD 
      SZA,RSS       IF SET  0 
      JMP A.2       THEN HE/SF, EXIT A  2 
      LDA EQT5,I    GET STATUS WORD 
      SLA,RSS       IS BIT 0 SET TO 1 
      JMP A.0       YES, NO TROUBLE, EXIT A  0
      RAR           PUT BIT 1 TO 0 POSITION 
D8    SLA           IS BIT 1 SET TO 0 ? 
      JMP A.3       EXIT A - 3
      CLA,INA       IF NONE OF ABOVE EXIT A - 1 
      JMP C.11,I
      SPC 1 
EXTRA ISZ C.11      ADVANCE TO CONT. RETURN 
      CLA           CLEAR TO CLOCK
      STA EQT15,I 
**
OTA.2 OTA CR         UPDATE CR STATUS 
LIA.1 LIA CR        IF STILL NOT
      SLA,RSS       READY IF BIT ZERO CLR 
      JMP $UPIO     GO UP CR
CLCCR CLC CR        INHIBIT ANY MORE SPURIOUS INTERRUPTS
      JMP NR        NOW SET FOR NOT READY 
**
      SKP 
CR    EQU 11B       FAKE CARD READER SELECT CODE
BUF   DEF I.BUF     INPUT BUFFER ADDRESS DEFINITION.
BUFAD DEF I.BUF,I   "DMA" BUFFER ADDRESS FOR INPUT. 
B17   OCT 170000
N4    DEC -4
DEC2  DEC 2 
DEC3  DEC 3 
DEC4  DEC 4 
DEC7  DEC 7 
DEC9  DEC 9 
DEC16 DEC 16
DEC48 DEC 48
M17   OCT 17
M377  OCT 000377
M1774 OCT 177400
D60   DEC 60
B40   OCT 40
B1400 OCT 1400
B50   OCT 50
B1000 OCT 1000
B2000 OCT 2000
B4000 OCT 4000
B7000 OCT 7000
B1100 OCT 1100
B500  OCT 500 
M77   OCT 77      ASCII QUESTION MARK 
BIT51 OCT 177735    MASK FOR BITS 5 AND 1 
DM80  DEC -80 
I.BUF BSS 80        INTERNAL DATA BUFFER. 
LAST  BSS 0 
      SPC 1 
TABLE DEF *+1       ASCII LOOKUP TABLE START
* 
*                    EBCDIC CARD PUNCH CHARACTER SET
* 
      ASC 13, 123456789:#@'="-JKLMNOPQR 
LASC1 ASC 1,!$
      ASC 1,*)
LASC2 ASC 1,;]
      ASC 15,0/STUVWXYZ\,%_>?&ABCDEFGHI[.<( 
LASC3 ASC 1,+^
      SKP 
*                    BCD CARD PUNCH CHARACTER SET 
* 
      ASC 16, 123456789?=':>?-JKLMNOPQR?$*];] 
      ASC 16,0/STUVWXYZ?,(_\?+ABCDEFGHI[.)[<^ 
      SKP 
      SPC 2 
EQT1  EQU 1660B 
EQT4  EQU 1663B 
EQT5  EQU 1664B 
EQT6  EQU 1665B 
EQT7  EQU 1666B 
EQT8  EQU 1667B 
EQT9  EQU 1670B 
EQT10 EQU 1671B 
EQT11 EQU 1672B      EBCDIC OR BCD
CHAN  EQU 1673B     CURRENT "DMA" CHANNEL NUMBER. 
EQT12 EQU 1771B     EOF/HOPR EMTY FLAG
EQT13 EQU EQT12+1   CR NOT RDY/OFF LINE FLAG
EQT15 EQU EQT12+3 
A     EQU 0 
B     EQU 1 
      END 
                                                                                                                                                            