TITLE PTYSRF - FULL DUPLEX PSEUDO TELETYPE SERVICE ROUTINES SUBTTL M. FREDRIKSEN/RCC TS 06 DEC 68 V006 XP VPTYSF,006 ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP ENTRY PTYSRF ;DUMMY GLOBAL FOR FULL DUPLEX PTY PTYSRF: ;ACCUMULATOR ASSIGNMENTS DDB=DEVDAT LINE=TAC1 CHREC=TEM PIOS=13 PDDB=14 ;FOLLOWING BITS, AND LINE AND CHREC ASSIGMENTS ; MUST AGREE WITH THOSE IN SCNSRF BREAKB=20000 FCSBRK=4000 TOIP=400000 ;SIGN OF TTYPTR IN TTY DDB SYNC=20000 ;BREAK CHARACTER SEEN---FROM SCNSER ;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS) IOPTW=4000 ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT) IOPTRE=2000 ;PTY RESPONSE IS READY MONMOD=1000 ;PTY IS IN MONITOR MODE INTERNAL FTTTYSER FTTTYSER=-1 ;FORCE MULT DEF GLOBAL IF WRONG APRSER INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL PTYDDB,PIOSAV,PTYSAC,PTYDNB,PTYBM1,PTYDDS,PIOSAV,PDDSAV EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV INTERNAL PTYSA0,PTYRE0,ACSAV0 > IFE FTCHECK+FTMONP,< ;PSEUDO CONSOLE DEVICE DATA BLOCK ;REMAINING PTY DDB'S ARE GENERATED ;OUT OF LINE AT BUILD TIME INTERN PTYDDB ZZ=. PTYDDB: SIXBIT /PTY0/ XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC. Z EXP PTYDSP XWD DVIN+DVOUT,3 Z Z XWD PROG,0 XWD PROG,0 Z XP PTYDDS,.-ZZ ;SIZE OF PTY DDB > INTERNAL PTYDSP EXTERNAL OUT POPJ PDP, ;INITIALIZE POPJ PDP, ;PRINT ERROR, STOP JOB PTYDSP: JRST PTYREL JRST OUT JRST PTYOUT JRST PTYIN EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL,PUNIT PTYREL: LDB LINE,PUNIT ADDI LINE,TCONLN SKIPN TTYTAB(LINE) POPJ PDP, PUSH PDP,DDB HRRZ DDB,TTYTAB(LINE) PUSHJ PDP,TTYKIL POP PDP,DDB LDB LINE,PUNIT SETZM PTYTAB(LINE) POPJ PDP, ;PTY OUTPUT ;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, ONE IS CREATED ;IF A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE, ;IODERR IS SET IN PTY STATUS AND OUTPUT IS TERMINATED. ;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE ;PLACED IN THE TTY INPUT BUFFER, THE PTY OUTPUT BUFFER IS ;ADVANCED, IOPTW IS CLEARED IN PTY STATUS, AND CONTROL RETURNS ;TO THE OUPTUT UUO AND THENCE TO THE USER. ;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE ;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS ;UNTIL THEY ARE EMPTY. ;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB) ;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES ;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH ;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO. ;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON ;SET IN THE OF IOS) EXTERNAL TCONLN,TTYTAB,TPYTAB,PTYTAB,SETIOD EXTERNAL ADVBFF,PUNIT,RECIN3,PUTCHI EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL PTYOUT: LDB LINE,PUNIT HRRZM DDB,PTYTAB(LINE) ADDI LINE,TCONLN HLL LINE,LINTAB(LINE) SKIPE PDDB,TTYTAB(LINE) JRST PTYOU1 PUSHJ PDP,PTEXCH PUSHJ PDP,DDBSRC TROA PIOS,IODERR JRST PTYOU2 MOVEM PIOS,DEVIOS(PDDB) PTEXCH: EXCH IOS,PIOS EXCH DDB,PDDB POPJ PDP, PTYOU1: MOVE PIOS,DEVIOS(PDDB) PUSHJ PDP,PTEXCH PTYOU2: MOVEI AC2,@DEVOAD(PDDB) MOVE AC2,1(AC2) IMULI AC2,5 HRRZ AC1,DEVOAD(PDDB) ADD AC1,[XWD 700+PROG,1] MOVEI DAT,TTIBUF(DDB) PTYOU3: ILDB CHREC,AC1 JUMPE CHREC,PTYOU5 PUSHJ PDP,SPCHEK JRST PTYOU4 CAIE CHREC,176 CAIN CHREC,33 MOVEI CHREC,175 MOVEI IOS,0 TLNE TAC,BREAKB+FCSBRK MOVSI IOS,SYNC IORB IOS,DEVIOS(DDB) CAIN CHREC,3 ;CONTROL C PUSHJ PDP,CNCTST ;SEE IF SECOND, STOP JOB IF SO PTYOU4: MOVEI DAT,TTIBUF(DDB) ;MAY HAVE SWITCHED TO TIOBUF PUSHJ PDP,PUTCHI JRST PTYOUW MOVE TAC,TIFCTR(DDB) ;SEE IF BUFFER FILLING UP CAIL TAC,10 ;WAKE JOB IF SO TLNE IOS,SYNC PUSHJ PDP,RECIN3 ;CLOBBERS DAT AND TAC PTYOU5: SOJG AC2,PTYOU3 PTYOU6: PUSHJ PDP,PTEXCH PUSHJ PDP,ADVBFE JFCL TRZ IOS,IOPTW TLO IOS,IOFST MOVEM IOS,DEVIOS(DDB) POPJ PDP, PTYOUW: PUSHJ PDP,INBFUL ;TURN OFF SYNC, CHECK FOR ; PANIC CONTROL C. TRO PIOS,IOBKTL ;CANT PUT BATCH IN IOW JRST PTYOU6 ;ABORT BUFFER AND RETURN TO BATCH EXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFE,ADRERR,TTYPTR EXTERNAL BUFCLR,XMTINT,PTYGET,TTYCHR,TTOBUF PTYIN: LDB DAT,PUNIT SKIPE PDDB,TPYTAB(DAT) ;TTY DDB ADDRESS JRST PTYIN1 TRO IOS,IOIMPM ;YES, THAT'S ALL. JRST PTYIN3 PTYIN1: MOVE PIOS,DEVIOS(PDDB) TRZA IOS,IOPTRE PTYIN4: TRO IOS,IOPTRE HRRZ TAC,DEVIAD(DDB) PUSHJ PDP,BUFCLR JRST ADRERR MOVEI LINE,TCONLN(DAT) PUSHJ PDP,PTEXCH MOVEI AC2,TTYCHR MOVEI AC1,@DEVIAD(PDDB) ADD AC1,[XWD 700,1] MOVEM IOS,DEVIOS(DDB) MOVSI IOS,TOIP ;MARK TYPE-OUT ACTIVE IORM IOS,TTYPTR(DDB) PUSHJ PDP,XMTINT SKIPA PTYIN2: PUSHJ PDP,PTYGET ;SHOULD BE XMITIN1+1 SKIPL TTYPTR(DDB) ;STILL GOING? JRST PTYIN5 ;NO. END OF STRING FROM TTY IDPB CHREC,AC1 SOJG AC2,PTYIN2 PTYIN5: PUSHJ PDP,PTEXCH MOVEI AC3,@DEVIAD(DDB) SUBI AC1,1(AC3) HRRM AC1,1(AC3) ;WORD COUNT TO BATCH PUSHJ PDP,ADVBFF JRST PTYIN3 SKIPGE TTYPTR(PDDB) ;STILL MORE TO COME? JRST PTYIN6 ;YES. SEE IF ROOM PTYIN3: MOVEM IOS,DEVIOS(DDB) POPJ PDP, PTYIN6: MOVSI TAC,TOIP ;CLEAR ACTIVE BIT IN CASE STOPPED ANDCAM TAC,TTYPTR(PDDB) SOJG AC2,PTYIN4 ;COUNT, GO ON IF ROOM JRST PTYIN3 ;NO ROOM, STOP ;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE ;TTY OUTPUT WITH PTY INPUT INTERNAL PTYPE EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE PTYPE: PUSH PDP,PDDB MOVE PDDB,LINE SUBI PDDB,TCONLN HRRZ PDDB,PTYTAB(PDDB) PUSH PDP,PIOS MOVEM IOS,DEVIOS(DDB) MOVEI PIOS,IOPTRE IORB PIOS,DEVIOS(PDDB) PUSHJ PDP,PTWAKE POP PDP,PIOS POP PDP,PDDB POPJ PDP,0 PTWAKE: PUSH PDP,TAC1 ;SAVE LINE PUSH PDP,TEM LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS JRST PTWAK1 ;YES, WAS NOT SLEEPING HLRZ TEM,(TAC1) ;SLEEPING JOB? CAIE TEM,WAKE SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE CAME TEM,TAC ;IS IT THIS ONE? SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP TRZ TEM,7777 AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0 MOVEM TEM,(TAC1) PTWAK1: POP PDP,TEM POP PDP,TAC1 ;RESTORE LINE POPJ PDP, ;ROUTINES TO SET VARIOUS BITS ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE INTERNAL PTYOW,PTMNMD,PTMNMZ PTMNMD: PUSH PDP,PIOS MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE JRST PTYSET PTMNMZ: PUSH PDP,PIOS HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE JRST PTYSET PTYOW: PUSH PDP,PIOS MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT PTYSET: PUSH PDP,PDDB MOVE PDDB,LINE SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO HRRZ PDDB,PTYTAB(PDDB) JUMPE PDDB,PTYST1 ;PREVENT CATASTROPHE TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED IORB PIOS,DEVIOS(PDDB) TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT? PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB PTYST1: POP PDP,PDDB POP PDP,PIOS POPJ PDP,0 PTYEND: END