--- /dev/null
+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
+
+\fINTERNAL 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
+>
+\f
+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
+
+\f
+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
+
+\f
+
+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
+
+\f
+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
+
+\f
+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
+
+\f
+;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 /)]<!/ ;12,8/4-7
+ ASCII /DEFG/ ;12/4-7
+ ASCII /*[>&/ ;11,8/4-7
+ ASCII /("#%/ ;0,8/4-7
+ ASCII /@^'\/ ;8/4-7
+
+
+ END
+\f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file