TITLE PTYSRH - HALF DUPLEX PSEUDO TELETYPE SERVICE ROUTINES SUBTTL D. WITCRAFT/RAP TS3.19 24 SEP 68 V004 XP VPTYSF,004 ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP ENTRY PTYSRH ;DUMMY GLOBAL FOR FULL DUPLEX PTY PTYSRH: ;ACCUMULATOR ASSIGNMENTS DDB=DEVDAT LINE=TAC1 CHREC=TEM SCNHAC=12 PIOS=13 PDDB=14 RPTB=400 SP=2000 ;SPECIAL TTY CHARACTER T37=10000 ;MODEL 37-FULL CHARACTER SET SYNC=40000 ;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 FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL PTYDDB,PTYCSV,PTYSAC,PTYBND,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 PTYCSV,.-ZZ Z XP PTYSAC,.-ZZ BLOCK 13 XP PTYBND,PTYSAC+12 XP PTYBM1,PTYBND-1 XP PTYDDS,.-ZZ ;SIZE OF PTY DDB PTYSA2: BLT SCNHAC,0 PIOSAV: 0 PDDSAV: 0 > 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 PTYREL: LDB LINE,[POINT 6,DEVCHR(DDB),23] SETZM PTYTAB(LINE) ADDI LINE,TCONLN SKIPN TTYTAB(LINE) POPJ PDP, PUSH PDP,DDB HRRZ DDB,TTYTAB(LINE) PUSHJ PDP,TTYKIL POP PDP,DDB POPJ PDP, ;PTY OUTPUT ;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, A SPACE IS ;SENT TO SCNSER (TCOMM) CAUSING AN ENTRY TO BE MADE IF ;A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE, ;AN "X" IS RETURNED IN WHICH CASE IODERR IS SET IN PTY STATUS ;AND OUTPUT IS TERMINATED. ;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE ;TRANSMITTED TO TCOMM. IF A RESPONSE IS RECIEVED AS INDICATED ;BY THE SP BIT IN TTY STATUS, THE PTY OUTPUT BUFFER IS ;ADVANCED IOPTRE IS SET 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 TCOMLN,TTYTAB,TCOMM,TPYTAB,PTYTAB,ITMCNT,SETIOD EXTERNAL ADVBFE,PUNIT PTYOUT: LDB LINE,PUNIT JSR PTYSAV SKIPN PTYTAB(LINE) HRRZM DDB,PTYTAB(LINE) SKIPE TPYTAB(LINE) ;HAS A TTY DDB BEEN ASSIGNED? JRST PTYOU0-1 ;YES ADDI LINE,TCONLN MOVEI CHREC,240 ;NO PUSHJ PDP,TCOMM CAIE CHREC,"X" ;ANY AVAILABLE? JRST PTYOU6 ;YES JSR PTYRET TRO IOS,DEVIOS(DDB) ;NO MOVEM IOS,DEVIOS(DDB) POPJ PDP, PTYOU6: TLO IOS,T37+IOFST ;FORCE BUFFER RESET ;T37 SO TABS, ETC NOT TRNSLATED (TIMING ERROR OTHERWISE) MOVEM IOS,DEVIOS(DDB) JSR PTYRET ;RESTORE ACS PTYOU0: TRNE IOS,IOPTRE POPJ PDP, TLZE IOS,IOBEG ;FIRST IO TLO IOS,IOFST ;YES TLZN IOS,IOFST ;FIRST ITEM IN BUFFER? JRST PTYOU1 ;NO TLO IOS,IO ;YES. INITIALIZE POINTER & COUNT HRRZ TAC,DEVOAD(DDB) ADD TAC,[XWD 700,1] ADDI TAC,(PROG) MOVEM TAC,DEVOAD(DDB) HRRZ ITEM,@TAC JUMPE ITEM,PTYOU8 ;BUFFER EMPTY> PUSHJ PDP,ITMCNT MOVEM ITEM,DEVCTR(DDB) PTYOU1: TRO IOS,IOACT TRZ IOS,IOPTRE JSR PTYSAV ;SAVE ACS LDB LINE,PUNIT ADDI LINE,TCONLN EXCH IOS,PIOS PTYOU2: SOSGE DEVCTR(PDDB) ;BUFFER EMTY? JRST PTYOU3 ;YES ILDB CHREC,DEVOAD(PDDB) ;NO PTYOU7: PUSHJ PDP,TCOMM ;SEND NEXT CHARACTER TLNE IOS,IOFST JRST PTYOU3 TLNE IOS,SP ;SPECIAL CHARACTER ECHO? JRST PTYOU4 ;YES, SEE IF CONTROL CHAR ECHO TLNE IOS,SYNC ;NO. BREAK CHARACTER SEEN IF OBJ. JOB SWAPPED OUT? JRST PTYOU3 ;YES, BUFFER NOT MOVED INTO OBJECT ;JOB TTY IN BUFFER JRST PTYOU2 ;NO PTYOU4: CAIE CHREC,"^" JRST PTYOU7 MOVEM CHREC,PTYCSV(PDDB);YES. FLUSH OUTPUT MOVEM IOS,DEVIOS(DDB) ;SAVE TTY STATE TRO PIOS,IOPTRE ;LET USER KNOW PTYOU3: JSR PTYRET ;RESTORE ACS EXCH IOS,PIOS PTYOU8: TLZE IOS,IOW PUSHJ PDP,SETIOD ;START PTY JOB HRLI TAC,PROG HRL TAC,DEVBUF(DDB) HRR TAC,@TAC MOVEM TAC,DEVOAD(DDB) PUSHJ PDP,ADVBFE ;ADVANCE PTY OUTPUT BUFFER JRST PTYOU5 ;NEXT BUFFER IS EMPTY. TRNN PIOS,IOPTRE ;RESPONSE? JRST PTYOU0 ;NO TRO IOS,IOPTRE ;YES, SET RESPONSE FLAG AND RETURN TO USER PTYOU5: TRZ IOS,IOACT+IOPTW ;CONSIDER OUTPUT COMPLETED TLO IOS,IOFST MOVEM IOS,DEVIOS(DDB) POPJ PDP, EXTERNAL TCONLN,TTYTAB,SETIOD,STODAT,ADVBFF,STOSQD,ADRERR PTYIN: LDB LINE,[POINT 6,DEVCHR(DDB),23] ADDI LINE,TCONLN HRRZ PDDB,TTYTAB(LINE) ;TTY DDB ADDRESS JUMPN PDDB,PTYIN1 ;HAS TTY DDB BEEN LOST? TRO IOS,IOIMPM ;YES, THAT'S ALL. JRST PTYIN8 PTYIN1: PUSH PDP,LINE TLO IOS,IOFST TDZ IOS,[XWD IO,IOPTRE] MOVEI TAC,440700+PROG HLLM TAC,DEVPTR(DDB) TRO IOS,IOACT MOVE PIOS,DEVIOS(PDDB) TLNN PIOS,IO+SP JRST PTYI10 SETZM CHREC EXCH CHREC,PTYCSV(DDB) ;HAS FIRST CHAR BEEN REC? JUMPE CHREC,PTYIN5+1 ;NO ;YES,SAVE LINE NO. PTYIN4: TLNN PIOS,IO+SP ;IS TTY DONE? JRST PTYI3B ;YES. THATS ALL MOVE DAT,CHREC PUSHJ PDP,STODAT ;STORE CHARACTER JRST ADRERR JRST PTYIN6 ;BUFFER FULL PTYIN5: JUMPE ITEM,PTYI3A ;IF COUNT RUNS OUT EXCH PIOS,IOS ;NO. GET NEXT CHAR. EXCH PDDB,DDB ;SET IOS AND DBD FOR TTY POP PDP,LINE ;RESTORE LINE NO. PUSH PDP,ITEM ;SAVE ITEM COUNT PUSH PDP,PROG PUSHJ PDP,TCOMM POP PDP,PROG POP PDP,ITEM ;RESTORE ITEM COUNT EXCH PIOS,IOS EXCH PDDB,DDB PUSH PDP,LINE JRST PTYIN4 PTYI3A: TRZ IOS,IOBKTL TRO IOS,IOPTRE ;INPUT READY PTYI3B: PUSHJ PDP,STOSQD JRST ADRERR TLOA IOS,IOFST PTYIN6: TRO IOS,IOPTRE+RPTB PUSHJ PDP,ADVBFF ;ADVANCE PTY BUFFER JRST PTYI10 ;NEXT BUFFER IS FULL. TLO IOS,IOFST TRZE IOS,RPTB JRST PTYIN5+1 PTYI10: TLZE IOS, IOW PUSHJ PDP, SETIOD TRZ IOS,IOACT+RPTB POP PDP, LINE PTYIN8: MOVEM IOS, DEVIOS(DDB) POPJ PDP, ;SAVE ACCUMULATORS ;CALL MOVEI DDB,ADDRESS OF PTYDB ; JSR PTYSAV IFE FTCHECK+FTMONP,< PTYSAV: 0 > PTYSA0: MOVEM SCNHAC,PTYBND(DDB) ;SAVE HIGH AC HRRZ SCNHAC,DDB ADDI SCNHAC,PTYBM1 HRRM SCNHAC,PTYSA2 SUBI SCNHAC,SCNHAC-1 XCT PTYSA2 ;DO BLT SCNHAC MOVE PDDB,DDB JRST @PTYSAV ;RESTORE ACCUMULATORS ;CALL MOVEI PDDB,PTY DATA BLOCK ADDRESS ; JSR PTYRET IFE FTCHECK+FTMONP,< PTYRET: 0 > PTYRE0: HRRZ SCNHAC,PDDB ADDI SCNHAC,PTYSAC HRLZS SCNHAC BLT SCNHAC,SCNHAC JRST @PTYRET ;SAVE ONLY PIOS AND PDDB IFE FTCHECK+FTMONP,< PACSAV: 0 > ACSAV0: MOVEM PIOS,PIOSAV MOVEM PDDB,PDDSAV JRST @PACSAV ACRET: MOVE PIOS,PIOSAV MOVE PDDB,PDDSAV POPJ PDP, ;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE ;TTY OUTPUT WITH PTY INPUT INTERNAL PTYPE EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE PTYPE: MOVE PDDB,LINE SUBI PDDB,TCONLN HRRZ PDDB,PTYTAB(PDDB) TRO IOS,IOACT ;FORCE RESCHED TO CONTROL JOB MOVEM IOS,DEVIOS(DDB) MOVEI TAC,IOPTRE IORB TAC,DEVIOS(PDDB) MOVEM CHREC,PTYCSV(PDDB) ;SAVE CHARACTER PTWAKE: PUSH PDP,TEM PUSH PDP,TAC1 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,TAC1 POP PDP,TEM POPJ PDP, ;ROUTINES TO SET VARIOUS BITS ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE INTERNAL PTYOW,PTMNMD,PTMNMZ PTMNMD: JSR PACSAV ;SAVE 2 AC'S MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE JRST PTYSET PTMNMZ: JSR PACSAV ;SAVE AC'S HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE JRST PTYSET PTYOW: JSR PACSAV MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT PTYSET: MOVE PDDB,LINE SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO HRRZ PDDB,PTYTAB(PDDB) 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 JRST ACRET END