TITLE CDRSRX - CARD READER SERVICE FOR PDP-10(CR-10) SUBTTL T. WACHS/RCC TS 17 OCT 68 V004 XP VCDRSX,004 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP CDRDDB: SIXBIT /CDR/ XWD 36*HUNGST,34 CDRIOS: 0 CDRDSP XWD DVCDR+DVIN,10403 0 0 CDRIAD: XWD PROG,0 CDRPTR: 0 CDRCTR: 0 CDRSUM: 0 CDRCHK: 0 EXTERN ADVBFF,CDRCHN,CDRRET,CDRSAV,CPOPJ,CDRBTS EXTERN ILLOUT,NEWBF1,SETIOD,STOIOS,CLRACT,SETACT,ADRERR CDR=150 ;CDRBTS=1670+CDRCHN.... CONO TO READ A CARD COD029=5252 ;12-0-2-4-6-8 CODEOF=7400 ;12-11-0-1 ;BITS IN LH OF IOS COLUM1=100 COLUM2=200 CR029=400 FORGET=1000 IGNRBT=2000 ENTRY CDRSRX ;THIS NAME LETS BUILD PICK BETWEEN 2 CDRSER'S INTERN CDRDDB,CDRINT,CDRDSP ;DISPATCH TABLE JRST CDROFF+1 ;INITIALIZATION JRST CDRREL ;HUNG DEVICE CDRDSP: JRST CDRREL ;RELEASE POPJ PDP, ;CLOSE JRST ILLOUT ;OUTPUT IS ILLEGAL CDRSRX: TLZN IOS,IOBEG ;FIRST TIME THROUGH? JRST CDRGO ;NO TLZ IOS,CR029+FORGET+IGNRBT ;YES. SET UP FOR 1ST TIME TRNE IOS,10 ;ASCII MODE? JRST .+4 ;NO MOVEI TAC,CDRASC ;YES. SET UP FOR CODE CONVERSION MOVSI TAC1,700 ;BYTE SIZE =7 JRST SETPTR MOVEI TAC,CDRBIN ;SET UP FOR BINARY TRNE IOS,3 ;REALLY BINARY? MOVEI TAC,CPOPJ ;IMAGE - NO PROCESSING MOVSI TAC1,1400 ;BYTE SIZE = 12 SETPTR: MOVEM TAC1,CDRPTR ;SET BYTE SIZE HRRM TAC,CDRDIS ;AND PROCESSING LOC MOVEI TAC,770 ;SET UP INTERRUPT LOC HRRM TAC,CDRINT CDRGO: PUSHJ PDP,NEWBF1 ;INITIALIZE NEW BUFFER JRST ADRERR ;ADRESS ERROR MOVEI TAC,(PROG) ;SET TO RELOCATE ADDRESS ADDM TAC,CDRPTR MOVEM PROG,USEPRG ;SAVE PROG FOR INTERRUPT ROUTINE CDRGO1: TLNE IOS,IOEND ;EOF? JRST EOF ;YES. SHUT DOWN CDR TLO IOS,COLUM1+COLUM2 ;NO. INIT FOR COLUMN 1 MOVEI TAC,1670 ;SET UP CONO FOR NEXT CARD CONSO CDR,400100 ;WAS TROUBLE ENCOUNTERED OR CARD READY? MOVEI TAC,370 ;YES. SET CONO FOR READY-TO-READ CONO CDR,CDRCHN(TAC) ;START CARD READER TRO IOS,IOACT ;CANT USE SETACT AS IT ZEROES IOW JRST STOIOS ;WHICH MAY BE ON AFTER IGNORING A CARD EXTERN CDRCHL CDRINT: CONSO CDR,0 ;INTERRUPT FOR CDR? JRST .-1 ;NO. GO AWAY CONSZ CDR,270 ;MAYBE. A TRANSIENT INTERRUPT JRST CDINT1 ;YES. DEFINATELY FOR CDR CONSZ CDR,200000 ;NO. RDY-TO-RD ENABLED? CONSO CDR,100 ;AND READY-TO-READ ON? JRST CHKTRB ;NO. CHECK FOR TROUBLE CONO CDR,CDRBTS ;YES. TELL CDR TO START READING JEN @CDRCHL ;AND DISMISS THE INTERRUPT CHKTRB: CONSZ CDR,400000 ;ENABLE FOR TROUBLE? CONSO CDR,400 ;AND TROUBLE OCCURRING? JRST CDRINT+1 ;NO. INTERRUPT IS NOT FOR CDR CDINT1: JSR CDRSAV ;YES. SAVE ACS MOVE IOS,CDRIOS ;RESTORE IOS CONSO CDR,10 ;DATA INTERRUPT? JRST NTDATA ;NO DATAI CDR,DAT ;YES. READ DATA TLNE IOS,FORGET+IGNRBT ;PROCESS IT? JRST CDRRET ;NO. DISMISS INTERRUPT TLZE IOS,COLUM1 ;FIRST COLUMN? JRST FSTCOL ;YES. MAKE SPECIAL CHECKS CDRDIS: PUSHJ PDP,. ;NO. PROCESS PIECE OF DATA IDPB DAT,CDRPTR ;STORE IT IN BUFFER SOSLE CDRCTR ;ROOM FOR MORE? POPJ PDP, ;YES. EXIT IGNORE: TLO IOS,IGNRBT ;NO. IGNORE REST OF CARD STODIS: MOVEM IOS,CDRIOS ;SAVE IOS POPJ PDP, ;EXIT THE INTERRUPT ;HERE TO PROCESS A BINARY BYTE CDRBIN: ADDM DAT,CDRSUM ;ADD 12 BITS TO CHECKSUM POPJ PDP, ;HERE WHEN AN ASCII CHARACTER IS READ CDRASC: SETZB TAC,TAC1 JUMPE DAT,CDRAS2 ;0-PICK UP AN ASCII BLANK CAIN DAT,5000 MOVEI DAT,4202 CAIN DAT,3000 MOVEI DAT,2202 LDB TAC1,[XWD 110300,DAT] TRNE DAT,3 TRC TAC1,7 TRNE DAT,74 TRO TAC1,10 TRNE DAT,314 TRO TAC,2 TRNE DAT,525 TRO TAC,1 TLNN IOS,CR029 ;AN 029 CARD READ? TRO TAC1,20 ;NO. BUMP TAC1 TO 026 TABLE CDRAS2: LDB DAT,CRCVPT(TAC) ;PICK UP ASCCII CHAR FROM TABLE POPJ PDP, ;AND RETURN ;HERE WHEN THE 1ST COLUMN OF A CARD HES BEEN READ FSTCOL: CAIN DAT,CODEOF ;AN EOF CARD? JRST EOFCRD ;YES. HANDLE IT TRNE IOS,10 ;NO. ASCII CARD? JRST NOTASC ;NO CAIN DAT,COD029 ;YES. IS IT AN 029 CARD? TLO IOS,CR029+FORGET ;TES. SET A BIT SETIOS: MOVEM IOS,CDRIOS ;SAVE IOS TLNN IOS,FORGET ;FORGET REST OF CARD? JRST CDRDIS ;NO. PROCESS IT JRST CDRRET ;YES. DISMISS INTERRUPT SETFRG: TLOA IOS,FORGET ;SET BIT TO FORGET ABOUT CARD NOTASC: TRNN IOS,7 ;COL 1 OF A NOT ASCII CARD JRST SETIOS ;IMAGE MODE - NO PROCESSING TLZN IOS,COLUM2 ;COLUMN1? JRST COL2IN ;NO. COLUMN2 JUST READ MOVEI TAC,-5(DAT) ;COL1 - IS THERE A 7-9 PUNCH? TRNE TAC,17 TRO IOS,IOIMPM ;NO. SET ERROR BIT LSH DAT,-6 ;COLUMNS 12-3 ARE WORD COUNT JUMPE DAT,SETFRG ;FORGET CARD IF WRDCNT=0 PUSH PDP,DAT ;SAVE DAT IMULI DAT,3 ;COMPUTE ITEM COUNT CAMGE DAT,CDRCTR ;MORE THAN THE BUFFER CAN HOLD? MOVEM DAT,CDRCTR ;NO. SAVE AS REAL COUNT POP PDP,DAT ;GET WRDCNT HRRM DAT,@CDRPTR ;IN R.H. OF 1ST DATA WORD OF BUFFER TLO IOS,COLUM1 ;SET TO PICK UP COLUMN2 JRST STODIS ;STORE IOS AND RETURN ;HERE WHEN COL 2 OF A BINARY CARD WAS READ COL2IN: MOVEM DAT,CDRCHK ;COLUMN2 IS CHECKSUM HRLM DAT,@CDRPTR ;ALSO IN L.H. OF 1ST DATA WORD SETZM CDRSUM ;ZERO COMPUTED CHKSUM JRST STODIS ;STORE IOS AND RETURN ;HERE ON A NON-DATA CDR INTERRUPT NTDATA: MOVEI DEVDAT,CDRDDB ;NO. SET DEVDAT MOVE PROG,USEPRG ;RESTORE PROG CONSO CDR,20 ;END OF CARD? JRST NOTEOC ;NO TLZE IOS,FORGET ;YES. FORGET ABOUT CARD? JRST CDRGO1 ;YES. START READ NEXT CARD TRNE IOS,10 ;BINARY? JRST BINEOC ;YES. CHECK CHKSUM MOVEI DAT,15 ;NO. INSERT IDPB DAT,CDRPTR MOVEI DAT,12 ;INSERT IDPB DAT,CDRPTR NXTCRD: TLZ IOS,IGNRBT ;SET UP TO READ NEXT CARD HRRZ TAC,CDRPTR ;LAST ADDRESS MOVEI TAC1,@CDRIAD ;FIRST ADDRESS (-1) SUBI TAC,1(TAC1) ;COMPUTE NUMBER OF WORDS STORED HRRM TAC,1(TAC1) ;STORE IN 1ST WORD OF BUFFER TLZE IOS,IOW ;IN IO WAIT? PUSHJ PDP,SETIOD ;YES. TAKE OUT PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS JRST CDROFF ;NEXT BUFFER NOT EMPTY JRST CDRGO ;AVAILABLE - START READ INTO IT ;HERE ON THE END OF A BINARY CARD BINEOC: TRNN IOS,4 ;REALLY BINARY? JRST NXTCRD ;IMAGE MODE MOVE DAT,[POINT 12,CDRSUM,] ;COMPUTE CHKSUM ILDB TAC,DAT ;BITS 0-11 ILDB TAC1,DAT ;PLUS 12-23 ADD TAC,TAC1 ILDB TAC1,DAT ;PLUS 24-35 ADD TAC,TAC1 TRZE TAC,770000 ;OVERFLOW? AOS TAC ;YES. ADD 1 CAME TAC,CDRCHK ;COMPARE WITH CARD'S CHKSUM? TRO IOS,IODTER ;NO. LIGHT A BIT JRST NXTCRD ;START READ OF NEXT CARD EOFCRD: TLO IOS,IOEND ;EOF - LIGHT BIT JRST SETFRG ;FORGET REST OF CARD NOTEOC: CONSZ CDR,40 ;EOF BUTTON PRESSED? JRST EOF ;YES. CONSZ CDR,400 ;TROUBLE? CONO CDR,CDRCHN ;YES.TURN OFF TROUBLE ENABLE CONSO CDR,60200 ;ERROR EXCEPT PICK OR STOP BUTTON? JRST SETRDY ;NO. GO SET READY-TO-READ INTERRUPT TRO IOS,IODERR ;YES. SET ERROR BIT JRST NXTCRD ;ADVANCE BUFFERS, SET RDY-TO-READ EOF: TLO IOS,IOEND+IOBEG ;EOF - LIGHT BIT CDRREL: HLLZS CDRINT ;RESET INTERUPT LOC CDROFF: CONO CDR,10000 ;TURN OFF CDR TLZE IOS,IOW PUSHJ PDP,SETIOD ;TAKE OUT OF IO WAIT JRST CLRACT ;ZERO IOACT, STORE IOS AND RETURN SETRDY: CONO CDR,10000 ;RESET READ-A-CARD FLOP JRST CDRGO ;ENABLE FOR READY TO READ USEPRG: 0 CRCVPT: XWD 350700+TAC1,CRCVTB XWD 260700+TAC1,CRCVTB XWD 170700+TAC1,CRCVTB XWD 100700+TAC1,CRCVTB ;CODE CONVERSION FOR THE 029 KEYPUNCH ;THE FOLLOWING EQUIVALENCES ARE ARTIFICIALLY DEFINED ;029 KEYTOP ;ASCII 35 ;ASCII 37 ;CENT [ [ ;0-8-2 ] ] ;VERT BAR ^ HAT = L.C. VERT BAR ;UNDERBAR _ UNDERBAR ;NEGATION \ TILDE = L.C. NEGATION ;CHARACTERS ;ZONE/DIGITS CRCVTB: ASCII / 123/ ;N/N-3 ASCII .0/ST. ;0/N-3 ASCII /-JKL/ ;11/N-3 ASCII /HI[./ ;12,8/N-3 ASCII /&ABC/ ;12/N-3 ASCII /QR!$/ ;11,8/N-3 ASCII /YZ],/ ;0,8/N-3 ASCII /89:#/ ;8/N-3 ASCII /4567/ ;N/4-7 ASCII /UVWX/ ;0/4-7 ASCII /MNOP/ ;11/4-7 ASCII /<(+^/ ;12,8/4-7 ASCII /DEFG/ ;12/4-7 ASCII /*);\/ ;11,8/4-7 ASCII /%_>?/ ;0,8/4-7 ASCII /@'="/ ;8/4-7 ;CODE FOR THE 026 KEYPUNCH A LA H HYMAN ASCII / 123/ ;N/N-3 ASCII .0/ST. ;0/N-3 ASCII /-JKL/ ;11/N-3 ASCII /HI?./ ;12,8/N-3 ASCII /+ABC/ ;12/N-3 ASCII /QR:$/ ;11,8/N-3 ASCII /YZ;,/ ;0,8/N-3 ASCII /89_=/ ;8/N-3 ASCII /4567/ ;N/4-7 ASCII /UVWX/ ;0/4-7 ASCII /MNOP/ ;11/4-7 ASCII /)]&/ ;11,8/4-7 ASCII /("#%/ ;0,8/4-7 ASCII /@^'\/ ;8/4-7 CDREND: END