TITLE PTRSER - PAPER TAPE READER SERVICE ROUTINE FOR BOTH PDP-6 AND PDP-10 SUBTTL /GBH/TNM TS 14 APR 69 V004 XP VPTRSR,004 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP EXTERNAL STOSQD,ILLOUT EXTERNAL STODAT, IOSET, SETBYT, ADVBFF EXTERNAL SETIOD, PTRSAV, PTRCHN,PIOMOD EXTERNAL SETACT,STOIOS,CPOPJ1,PTRMSK INTERNAL PTRINT,PTRDSP ;PTR DEVICE DATA BLOCK LINKAGE ENTRY PTRSER PTRSER: ,PARAMETER ASSIGNMENTS , PTR CONTROL REGISTER PTRDON=10 ;DONE FLAG PTRBSY=20 ;BUSY FLAG PTRBIN=40 ;BINARY READ MODE POW=400 ;POWER, ON=1 , SPECIAL IO STATUS WORD ASSIGNMENTS IODISC=400000 PTRFCI=200000 PTRPOW=100000 , SPECIAL ASCII CHARACTERS RUBOUT=177 INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL PTRDDB,PTRIOS,PTRADR,PTRPTR,PTRCTR,PTRSVC,PTRSV1,PTRCON > IFE FTCHECK+FTMONP,< ;PTR DEVICE DATA BLOCK INTERN PTRDDB PTRDDB: PTRDAT: SIXBIT /PTR/ XWD ^D30*HUNGST,41 PTRIOS: 0 EXP PTRDSP XWD DVPTR+DVIN,14403 0 0 PTRADR: XWD PROG,0 PTRPTR: 0 PTRCTR: 0 PTRSVC: 0 PTRSV1: 0 PTRCON: 0 > ,PTR SERVICE DISPATCH TABLE JRST PTRINI ;INITILIZE JRST PTRREL ;HUNG DEVICE TIME-OUT ERROR. PTRDSP: JRST PTRREL ;RELEASE POPJ PDP, ;CLOSE JRST ILLOUT ;OUTPUT TLNN IOS,IOBEG ;INPUT, VIRGIN DEVICE? JRST PTRIN1 ;NO TLO IOS,IOFST ;IOFST:=1. NEXT ITEM WILL BE FIRST ITEM OF A BUFFER TLZ IOS,PTRPOW+PTRFCI+IODISC PUSHJ PDP,SETBYT ;TAC0-5:=TAC12-13:=0,TAC6-11:=BYTE SIZE ;TAC14-17:=PROG MOVEM TAC,PTRPTR ;PTRPTR:=C(TAC) CONSZ PTR,POW ;IS POWER ON? TLO IOS,PTRPOW ;YES. PTRPOW:=1 PTRIN1: MOVEI TAC1,PTRBSY TLZN IOS,IOBEG ;VIRGIN? MOVEI TAC1,PTRDON ;NO TLNN IOS,PTRPOW ANDI TAC1,PTRMSK ;PTRMSK IS DEFINED IN BUILD AS -1 PDP-6 AND 0 PDP-10 PUSHJ PDP,SETACT ;IOACT:=1 MOVEI TAC,PTRCHN(TAC1) LDB TAC1,PIOMOD CAIE TAC1,IB ;IMAGE BINARY? CAIN TAC1,B ;OR BINARY IORI TAC,PTRBIN HRLI TAC,PTRDON STARTDV PTR POPJ PDP, PTRINT: CONSO PTR,@PTRCON JRST PTRINT SKIPL PTRIOS ;DISCONNECT REQUEST? (IODISC=1?) DATAI PTR,PTRSV1 ;PTRSV1:=DATA ITEM. JSR PTRSAV ;SAVE ACCUMULATORS AND ESTABLISH PDP MOVEI DEVDAT,PTRDDB ;SET UP DEVDAT PUSHJ PDP,IOSET ;PROG:=C(JBTADR18-35),ITEM:=C(DEVCTR) ;IOS=C(PTRIOS) MOVE DAT,PTRSV1 ;DAT:=DATA ITEM CONSO PTR,POW ;PTR POWER ON? JRST PTREND ;NO TLON IOS,PTRPOW ;PTRPOW=1? PTRPOW:=1 JRST PTREX1 ;NO TLZE IOS,IODISC ;DISCONNECT REQUEST? JRST PTREX ;YES TLZE IOS,PTRFCI ;IS PTRFCI=1? MOVE DAT,PTRSVC ;YES. DAT:=C(PTRSVC) PTRIN0: TRNE IOS,B ;MODE=BINARY? JRST PTRI0 ;YES ANDI DAT,177 ;MASK OUT PARITY BIT CAIN DAT,RUBOUT ;LAST CHAR A RUBOUT? JRST PTREX1 ;YES JUMPE DAT,PTREX1 ;DAT=0? PTRI0: PUSHJ PDP,STODAT ;NO STORE DATA WORD. JFCL ;CHECKSUM ERROR JRST PTRI1 ;BLOCK FULL OR BLOCK COMPLETE JRST PTREX1 ;DATA STORED CORRECTLY. PTRI1: PUSHJ PDP,ADVBFF ;ADVANCE BUFFER TLO IOS,IODISC ;NEXT BUFFER IS FULL. IODISC:=1 PTRI2: TLO IOS,IOFST ;IOFST:=1, NEXT ITEM IS FIRST ITEM OF A BUFFER. TLZE IOS,IOW ;IN A WAIT? IOW:=0 PUSHJ PDP,SETIOD ;IOWS:=1 JRST PTREX1 ,COME HERE WHEN THE READER IS SHUT OFF PTREND: TDZ IOS,[XWD PTRPOW,IOACT] ;PTRPWO:=0,IOACT:=0 PUSHJ PDP,PTRREL ;CLEAR PTR AND CONSO FLAG LDB TAC,PIOMOD TLO IOS,IOEND+IOBEG CAIE TAC,B ;CHECKSUM BINARY BLOCK ..OF? JRST PTREI ;NO TLNN IOS,IOFST ;IOFST=1? TRO IOS,IOIMPM ;NO. BINARY BLOCK INCOMPLETE. JRST PTRI2 PTREI: PUSHJ PDP,STOSQD ;FINISH THE BUFFERE, STORE WORD COUNT JFCL PUSHJ PDP,ADVBFF ;ADVANCE BUFFERE JFCL JRST PTRI2 ,DISCONNECT PTR PTREX: SKIPG @PTRADR ;IOUSE=1? JRST PTREX0 ;YES. DATAI PTR,DAT JRST PTRIN0 PTREX0: DATAI PTR,PTRSVC ;SAVE LAST DATA WORD FROM PTR TLZE IOS,IOW ;JOB IN AN IO WAIT FOR PTR? PUSHJ PDP,SETIOD ;YES, WAKE UP JOB PUSHJ PDP,PTRREL ;CLEAR PTR AND CONSO FLAG TLO IOS,PTRFCI ;PTRFCI:=1 TRZ IOS,IOACT ;IOACT:=0 PTREX1: MOVEM ITEM,PTRCTR ;PTRCTR:=C(ITEM) JRST STOIOS ;STORE IOS,RESET HUNG DEVICE ;TIMEOUT COUNT AND DISMISS PTRINI: PTRREL: CONO PTR,0 ;CLEAR PTR CONTROL HLLZS PTRCON ;CLEAR CONSO FLAG POPJ PDP, END