TITLE CDRSR6 - CARD READER SERVICE FOR PDP-6 CARD READER SUBTTL /TH TS3.17 18 OCT 67 V001 XP VCDRS6,001 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP ;PARAMETERS ;HARDWARE CRDONE=10 CRBUSY=20 CRBIN=40 CRALL=100 CRMISS=200 CREOC=400 CREOFF=1000 CRERR=2000 CRNRED=4000 CRCONO=CRBUSY+CRBIN+CRALL CDR=114 COD029=5252 ;029 CONTROL CARD IS 12-0-2-4-6-8! ;IOS CRMFST=40000 ;LH CRMIMG=100000 ;LH CRMBIN=200000 ;LH CRM029=100 ;RH MINHNG=^D15 ;NO. OF TIMES TO OBEY HUNG CODE BEFORE REALLY BECOMING HUNG CDRHNG: CONSO CDR,CRERR ;POWER OFF OR OTHER SUCH CATASTOPHE? TLNN IO,IOFST ;NO - CARD JAMMED? JRST CDRINI ;YES - PRINT HUNG MSG. AOS (PDP) ;NEVER ERROR RETURN CONSZ CDR,CRMISS ;FEEDCHECK? CONSZ CDR,CRNRED ;YES - READER READY? SOSA TAC,LOPCNT ;NO - PICK UP HUNG LOOP COUNTER JRST CDRSTR ;YES - GIVE ANOTHER CONO JUMPGE TAC,STOIOS ;COUNT NOT EXPIRED - LEAVE ACTIVE SOS (PDP) ;EXPIRED - PRINT HUNG MSG. CDRINI: CONO CDR,0 ;CLEAR HARDWARE HLLZS CDRCON ;CLEAR CONSO BITS POPJ PDP,0 ;RETURN INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL CDRDDB,CRDIS,CRTEM,CDRCON,LOPCNT > IFE FTCHECK+FTMONP,< ;CDR DEVICE DATA BLOCK INTERN CDRDDB CDRDDB: CDRDAT: SIXBIT /CDR/ XWD 2*HUNGST,34 ;BUFFER LONG ENOUGH FOR BINARY CARDS 0 EXP CDRDSP XWD DVCDR+DVIN,14403 0 0 XWD PROG,0 0 0 CRDIS: JRST . CRTEM: 0 ;TEMP FOR PARTIAL WORDS CDRCON: 0 ;CONSO FLAGS LOPCNT: 0 > ENTRY CDRSR6 EXTERN CPOPJ1,ILLOUT,PIOMOD,SETACT,SETBYT,CDRCHN,PIOFF,PION,HNGSTP INTERN CDRDSP ;CDR SERVICE DISPATCH TABLE (SHORT) JRST CDRINI ;INITILIZATION JRST CDRHNG ;HUNG DEVICE IS CHECKED CDRSR6: CDRDSP: JRST CDRINI ;RELEASE - CLEAR DEVICE POPJ PDP,0 ;CLOSE - NOTHING SPECIAL JRST ILLOUT ;OUTPUT WON'T WORK ;INPUT IS OK TLZN IOS,IOBEG ;BEGINNING OF FILE? (NO MORE). CONSO CDR,CREOFF ;BUTTON PUSHED? TLZA IOS,CRMBIN+CRMIMG ;CLEAR TRASH JRST CREOF ;END OF FILE PUSHED WHILE IOACT WAS 0 CDRIN1: CONO CDR,0 ;CLEAR ANY SPURIOUS FLAGS CONSO CDR,CRERR!CRMISS!CRNRED ;POWER OFF,LEFT OVER FEED-CHECK OR NOT READY JRST .+3 ;NO - OK PUSHJ PDP,HNGSTP ;YES - PRINT REMINDER & HALT JOB JRST CDRIN1 ;GO TRY AGAIN WHEN USER TYPES 'CONT' TLO IOS,IOFST+CRMFST ;NEW OPERATION LDB TAC,PIOMOD ;SPEED UP TESTING OF MODE CAIN TAC,B ;.. TLO IOS,CRMBIN ;BINARY MODE CAIN TAC,I TLO IOS,CRMIMG ;IMAGE MODE PUSHJ PDP,SETBYT ;LH(TAC):=700+PROG OR 4400+PROG MOVEM TAC,DEVPTR(DEVDAT) ;SAVE BYTE SIZE CDRSTR: MOVEI TAC,MINHNG ;HERE TO RESTART CDR ON FEED-CHECK MOVEM TAC,LOPCNT ;RESET HUNG LOOP COUNTER PUSHJ PDP,SETACT MOVE TAC,[XWD CRDONE,CRCONO] CONO PI,PIOFF CONO CDR,CDRCHN(TAC) ;START CDR HLRM TAC,CDRCON ;AND LOOK FOR IT CONO PI,PION POPJ PDP,0 ;RETURN TO UUOCON INTERN CDRINT EXTERN CDRSAV,IOSET,SETIOD,STOIOS,CDRCHN CDRINT: CONSO CDR,@CDRCON JRST CDRINT JSR CDRSAV MOVEI DEVDAT,CDRDDB MOVE IOS,DEVIOS(DEVDAT) PUSHJ PDP,IOSET CONSZ CDR,CRMISS TRO IOS,IODERR ;DEVICE ERROR CONSO CDR,CRERR+CREOFF+CREOC JRST CRDATA ;JUST A DATA INTERRUPT CONSZ CDR,CRERR ;HARDWARE LOSS? JRST CDRERR ;YES JRST CDREOC ;NO. MUST BE END OF CARD CREOF: TLOA IOS,IOEND ;MARK END,SKIP TO CROFF CDRERR: TRO IOS,IODERR ;CDR DEVICE ERROR HERE CROFF: PUSHJ PDP,CDRINI ;STOP THE DEVICE TRZ IOS,IOACT CRLST1: MOVEI TAC,MINHNG MOVEM TAC,LOPCNT ;RESET HNG. LOOP CNT. TLO IOS,IOFST+CRMFST TLZE IOS,IOW ;JOB WAITING FOR CDR? PUSHJ PDP,SETIOD ;YES. WAKE IT UP CREXIT: MOVEM ITEM,DEVCTR(DEVDAT) JRST STOIOS CRCONT: MOVEI TAC,CDRCHN ;PI CHANNEL CONO CDR,CRCONO(TAC) ;MAKE IT GO AGAIN TLO IOS,CRMFST ;FIRST COLUMN, BUT NOT FIRST IN BUFFER JRST CREXIT ;AND RETURN CRDATA: DATAI CDR,DAT TLZN IOS,CRMFST ;COLUMN 1? XCT CRDIS ;NO. SUBROUTINE HAS BEEN SET UP TRNE IOS,IODERR ;POSSIBLE FEED CHECK? CONSO CDR,CRNRED ;YES - READER READY? JRST .+4 ;YES - GENUINE DATA ERROR TLO IOS,CRMFST ;RESET 1ST COL. FLG. TRZ IOS,IODERR ;CLEAR ERROR INDICATION JRST STOIOS ;AND LET HUNG LOGIC SORT THINGS OUT TLNE IOS,CRMIMG ;IMAGE MODE? JRST CRFSTI ;YES, DON'T CHECK FOR EOF CARD TRC DAT,7400 TRCN DAT,7400 ;12,11,0 AND 1 PUNCH? JRST CREOF1 ;YES. AN EOF CARD. TLNE IOS,CRMBIN JRST CRFSTB ;BINARY CARD FIRST COLUMN MOVEI TAC,CRASCI ;HERE ON ASCII FIRST COLUMN HRRM TAC,CRDIS ;FOR SUCCEEDING COLUMN INTERRUPTS CAIE DAT,COD029 ;029 CONTROL CARD? JRST CRASCI ;NO. PROCESS THE CARD. TDO IOS, [XWD IOBEG,CRM029] ;FLAG FOR EOC AND TRANSLATOR JRST CRIGNOR ;FLUSH REST OF THIS CARD CRASCI: MOVEI TAC,0 ;CLEAR TAC CAIN DAT,5000 MOVEI DAT,4202 ;12-0 => 12-8-2 CAIN DAT,3000 MOVEI DAT,2202 ;11-0 => 11-8-2 LDB TAC1,[XWD 110300,DAT] ;12,11,0 ROWS TO TAC1 TRNE DAT,3 ;8 ZONE? TRC TAC1,7 ;YES, PERMUTE TAC1 TRNE DAT,74 ;4 BIT? TRO TAC1,10 ;YES TRNE DAT,314 ;2 BIT? TRO TAC,2 ;YES TRNE DAT,525 ;1 BIT? TRO TAC,1 ;YES TRNN IOS,CRM029 ;HAS 029 CODE BEEN IMPLIED? TRO TAC1,20 ;NO. MOVE UP TO 026 CODE TABLE LDB DAT,CRCV2(TAC) ;GET THE ASCII CHARACTER PUSHJ PDP,CRSTOD ;STORE IT JRST CREXIT ;AND RETURN CRCV2: POINT 7,CRCNV(TAC1),6 POINT 7,CRCNV(TAC1),13 POINT 7,CRCNV(TAC1),20 POINT 7,CRCNV(TAC1),27 EXTERN CDRCHN CRFSTI: LSH DAT,30 MOVEM DAT,CRTEM ;SAVE AS LEFT 12 BITS JSP TAC,CREXI1 ;GET ANOTHER COLUMN LSH DAT,14 IORM DAT,CRTEM ;THROW IN MIDDLE 12 BITS JSP TAC,CREXI1 ;ANOTHER COLUMN IORB DAT,CRTEM ;RIGHT 12. SAVE IN CRTEM FOR DEBUG CRBIN2: PUSHJ PDP,CRSTOD ;ENTRY HERE FROM BIN CARDS MOVEI TAC,CRFSTI ;ANOTHER 3 COLUMNS COME NEXT CREXI1: HRRM TAC,CRDIS ;WHERE TO GO FOR NEXT COLUMN JRST CREXIT ;RETURN FROM INTERRUPT CDREOC: CONSO CDR,CREOFF TLNE IOS,IOEND ;END OF FILE? JRST CREOF ;YES. SHUT OFF CDR TLNN IOS,CRMIMG+CRMBIN ;IMAGE OR BIN? JRST CRENDA ;ASCII TLNN IOS,CRMIMG ;IMAGE? JRST CRENDB ;BINARY. MOVE DAT,CRTEM ;HERE ON EOC AND IMAGE PUSHJ PDP,CRSTOD ;STORE LAST 2 COLUMNS IN BUFFER CRENDB: PUSHJ PDP,CRADV1 ;ADVANCE BUFFER CRENDC: MOVEI TAC,CDRCHN ;PI CHANNEL CONO CDR,CRCONO(TAC) ;GO FOR NEXT CARD JRST CRLST1 ;SET UP FOR NEXT CARD,DISMISS INTERRUPT, ;ALSO WAKE UP JOB IF IN IOW CRFSTB: MOVEI TAC,-5(DAT) TRNE TAC,17 ;ROWS 6-9=5? TRO IOS,IOIMPM ;NO. NOT A BIN CARD LSH DAT,-4 ;GET COLUMNS 1-5 JUMPE DAT,CRIGNOR ;IGNORE BINARY CARDS WITH 0 WORD COUNT MOVEM DAT,CRTEM ;SAVE AS WORD COUNT JSP TAC,CREXI1 ;GET COLUMN 2 HRL DAT,CRTEM ;(COUNT)CKSUM MOVSS DAT ;(CKSUM)COUNT JRST CRBIN2 ;STORE DAT AND GET REST OF CARD EXTERN STOSQD,STODAT,ADVBFF CRENDA: TLZE IOS,IOBEG ;WAS THIS A 029 CONTROL CARD? JRST CRCONT ;YES. NO CRLF. MOVEI DAT,15 ;CARRIAGE RETURN PUSHJ PDP,CRSTOD ;STORE MOVEI DAT,12 ;LINE FEED PUSHJ PDP,CRSTOD ;STORE LDB TAC1,PIOMOD ;GET MODE CAIN TAC1,AL ;ASCII LINE? JRST CRENDC ;YES -WORD COUNT WILL HAVE BEEN COMPUTED & BUFFERS ADVANCED CAIL ITEM,^D82 ;ROOM FOR ANOTHER CARD + CRLF? JRST CRCONT ;YES. DO SO PUSHJ PDP,STOSQD ;NO. STORE WORD COUNT JRST CROFF ;CAN'T RETURN HERE, BUT ... JRST CRENDB ;PROCEED TO ANOTHER BUFFER CREOF1: TLO IOS,IOEND ;HERE ON EOF CARD. MARK FOR EOC CRIGNOR: JSP TAC,CREXI1 ;GET MORE COLUMNS JRST .-1 ;AND IGNORE THEM. CRSTOD: PUSHJ PDP,STODAT ;STORE DAT IN BUFFER JRST CRPOFF ;ADDRESS CHECK,IOBKTL,IODTER (CKSUM) JRST CRADV ;BUFFER FULL OR BUFFER DONE POPJ PDP,0 ;SIMPLE OK STORED RETURN CRADV: TLNE IOS,CRMBIN ;BINARY? JRST CRIGNOR ;WAIT FOR END OF CARD CRADV1: TLNE IOS,IOFST ;VIRGIN BUFFER? POPJ PDP,0 ;YES. KEEP THIS ONE PUSHJ PDP,ADVBFF ;ADVANCE TO ANOTHER BUFFER SKIPA ;NO BUFFER AVAILABLE POPJ PDP,0 ;OK. RETURN CRPOFF: POP PDP,TAC JRST CROFF ;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 CRCNV: 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 END