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