TITLE SCNSER - SCANNER SERVICE SUBTTL TOM EGGERS 8-9-65 EXTERN SETIOD, ADVBFE, ADVBFF, JBTADR, CLRBYT,STTYB1 EXTERN SCNCHN, COMCNT, SCNSAV, SCNRET,STOP1, DEVLST,TTYTAB INTERN SCNINI ;TTYPTR=DEVOAD+1 ;TTYCTR=TTYPTR+1 ;TTYBUF=TTYCTR+1 PION=200 ;TURN PI ON BIT PIOFF=400 ;TURN PI OFF BIT ;SCNDDB ;NUMBER OF DEVICE DATA BLOCKS ;STTYBF7 ;SIZE OF TELETYPE BUFFER CHREC=TEM ;AC FOR CHARACTER VPOS=ITEM ;VERITICAL POSITION OF TELETYPE HPOS=VPOS+1 ; HORIZONTAL POS. DDB=DEVDAT LINE=TAC1 ;AC THAT HOLDS SCANNER LINE NUMBER SYNC=40000 ;1 WHEN A BUFFER IS READY TO TRANSFER DETH=10000 ;1 IF TTY DETACHED AND OUTPUT WAITING NIO=20000 ;STOP ALL IO TOUT=IO ;OUTPUT IN PROGRESS NCERR=IOBKTL ;CHARACTER LOST ON TYPE IN DCHAR=177 ;DELETE CHARACTER ECHOF=IODTER ;ECHO FAILURE OCCURED TPMON=1000 ;IO IS FROM MONITOR SP=2000 ;SPECIAL TELETYPE CHAR. IS BEING INTERPRETED DDTM=100000 ;DDT MODE T35=4000 ;TELETYPE HAS TAB,FF,VT,ETC. MECHANISM USRB=100 ;TURN OFF TPMON WHEN OUTPUT IS FINISHED USRBC=20000 ;RT HALF MONITOR IOS WORD. REMAIN IN MONITOR MODE INTERNAL SCNINT,CTYINT,TTYUSR,TTYURC ENTRY TTYDSP EXTERN TSCNLN,TCONLN,MTTYLN,CPOPJ1 EXTERN CPOPJ EXTERN FSNCHN,SCNCHL,OUT,PUUOAC,PJOBN,PUNIT,PIOMOD INTERNAL DDTGT,DDTRL,DDTIN,DDTOUT,TTYFND,TTYSTR,TTYFNU EXTERNAL WAIT1,WSYNC,CLRBYT,JOB,CLDS,CLEN,TTYBFE,TTYBM1 EXTERNAL UXIT,ADRCK,TTYSAV,DEVPHY,DEVOPR EXTERNAL TTYCTR,TTYPTR,TTYBUF,TTYLST,MLTTYL,SETRUN,STTYBF,TTY0DB PHPOS: POINT 7,DEVIAD(DEVDAT),12 ;POINTER HORIZONTAL POSITION PVPOS: POINT 5,DEVOAD(DEVDAT),12 ;POINTER VERITICAL POSITION PLASTC: POINT 7,DEVOAD(DEVDAT),7 ;POINTER TO LAST CHARACTER OU PSCHAR: POINT 6,DEVIAD(DEVDAT),5 ;POINTER TO ^C OR ^O TPCJOBN: POINT 9,TTYTAB(LINE),9 ;CONSOLE NUMBER FOR TTY SCNINI: MOVEI TAC,100000 CONO TTY,0 ;SHUT DOWN CONSOLE TTY CONO DCSA,4010 ;RELEASE XMITTER,RECEIVER CONSZ DCSA, 1000 CONO DCSA, 4000 CONSZ DCSA, 10 DATAI DCSB, TAC1 SOJG TAC,.-4 MOVEI TAC,SCNCHN CONO TTY,3600(TAC) ;CLEAR TTY, ASSIGN CHANNEL CONO DCSA,FSNCHN ;ASSIGN INTERRUPT CHANNELS MOVSI TAC,MLTTYL ;NO. OF TTY DEV. DATA BLOCKS MOVSI DAT,TTYUSE ;TTY DDB IN USE BIT MOVSI IOS,TPMON+IOFST ;VIRGIN STATUS MOVEI DDB,TTYLST ;FIRST TTY DDB ADDRESS SCN1: TDNN DAT,DEVMOD(DDB) ;IS THIS TTY DDB IN USE? SETZM DEVNAM(DDB) ;NO. SET NAME TO 0 MOVEM IOS,DEVIOS(DDB) SETZM TTYSAV(DDB) ;CLEAR USER MODE TTY STATUS WORD ANDCAM DAT,DEVMOD(DDB) ;CLEAR USE BIT HLRZ DDB,DEVSER(DDB) ;GET NEXT TTY DDB AOBJN TAC,SCN1 MOVSI TAC,MTTYLN ;SET DDB USE BITS FROM TRANSLATOR TABLE MOVSI TAC1,TTYUSE SCN2: SKIPE DDB,TTYTAB(TAC) IORM TAC1,DEVMOD(DDB) AOBJN TAC,SCN2 POPJ PDP, ;ROUTINE TO RETURN TTY TO VIRGIN STATE ;CALL: MOVE DDB, ADDRESS OF DEVICE DATA BLOCK ; PUSHJ PDP,TTYKIL INTERNAL TTYKIL TTYKIL: MOVE TAC,[XWD TTYUSE+TTYATC,ASSCON+ASSPRG] ANDCAM TAC,DEVMOD(DEVDAT) ;CLEAR DDB USE BIT SETZM DEVNAM(DEVDAT) ;CLEAR PHYSICAL NAME SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME JRST TTYDT1 ;ROUTINE TO DETACH TTY FROM JOB ;CALL: MOVE DEVDAT,ADDRESS OF TTY DDB TO BE DETACHED INTERNAL TTYDET TTYDET: MOVE TAC,DEVMOD(DEVDAT) TLZN TAC,TTYATC ;WAS TTY ATTACHED? JRST TTYKIL ;NO, SO RETURN DDB TO POOL MOVEM TAC,DEVMOD(DEVDAT) ;YES, JUST CLEAR ATTACH BIT TTYDT1: LDB LINE,PUNIT SETM TTYTAB(LINE) POPJ PDP, CCHAR: 0 ;HOLDS CHARACTER FOR CONSOLE TELETYPE ;CONTROL C - GO BACK TO MONITOR ;CONTROL 0 - SUPPRESS OUTPUT TTYURC: SKIPA TAC,[XWD USRB,USRBC] ;START JOB BUT REMAIN IN MON1 TTYUSR: MOVSI TAC,USRB ;CAUSE TTY TO GO INTO IORM TAC,DEVIOS(DEVDAT) ;USER MODE WHEN POPJ PDP, ;OUTPUT FINISHES INTERNAL TTYSET TTYSET: MOVSI TAC,IOFST ;INITIALIZE USER TTY IOS WORD MOVEM TAC,TTYSAV(DEVDAT) ;FOR START COMMAND JRST TTYUSR ;ROUTINE TO ATTACH TTY TO A JOB ;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK ; MOVE ITEM,JOB NUMBER ; PUSHJ PDP,TTYATT ; ERROR ;DEVDAT=DDB ADR OF OTHER TTY ;IF ANOTHER ALREADY IS ATTACHED. ; OK RETURN ;DEVDAT, DAT AND TRANSLATOR TABLE SET INTERNAL TTYATT TTYATT: LDB LINE,PUNIT ;LINE NO. OF THIS TTY MOVEI DEVDAT,TTYLST ;SEARCH FOR DDB THAT IS ATTACHED SKIPA TTYAT2: HLRZ DEVDAT,DEVSER(DEVDAT) JUMPE DEVDAT,TTYAT4 LDB TAC,PJOBN ;JOB NUMBER HLL TAC,DEVMOD(DEVDAT) ;ATTACH AND USE BITS TLNN TAC,DVTTY ;IS THIS STILL A TTY DDB? JRST TTYAT4 ;NO, THIS MUST BE IJOB CAIN ITEM,(TAC) ;JOB NUMBER THE ONE TO ATTACH? TLNN TAC,TTYUSE ;YES, IS IT THE DETACHED ONE? JRST TTYAT2 ;NO, KEEP LOOKING TLNE TAC,TTYATC ;IS SOME TTY ALREADY ATTACHED? POPJ PDP, ;YES, ERROR RETURN WITH DEVDAT SET PUSH PDP,DEVDAT ;SAVE NEW DDB ADDRESS MOVE DEVDAT,TTYTAB(LINE) MOVE TAC,DEVMOD(DEVDAT) PUSHJ PDP,TTYDET ;DETACH DDB FROM TTY POP PDP,DEVDAT TTYAT3: DPB ITEM,TPCJOBN ;STORE ATTACHED JOB NO. DPB ITEM,PJOBN ;SET JOB NUMBER MOVSI TAC,TTYATC ;SET ATTACHED BIT PUSHJ PDP,TTYDAT ;SETUP OUTPUT BYTE JRST SCNIN ;GO INITIALIZE DDB TTYAT4: MOVE DEVDAT,TTYTAB(LINE) ;RESTORE OLD DDB ADDRESS JRST TTYAT3 ;ROUTINE TO SETUP AC DEVDAT TO ADDRESS OF TTY WHICH HAS TYPED A COMMA ;AC DAT TO BYTE POINTER TO OUTPUT BUFFER FOR COMMAND MESSAGE ;AC TAC TO BYTE POINTER TO COMMAND STRING ;AC ITEM TO JOB NUNMBER TTY IS ATTACHED TO ;CALL: PUSHJ PDP,TTYCOM ; NONE FOUND ; ACS SETUP INTERNAL TTYCOM TTYCOM: MOVSI LINE,MTTYLN SKIPL TTYTAB(LINE) AOBJN LINE,.-1 JUMPG LINE,CPOPJ MOVSI DEVDAT,400000 ANDCAB DEVDAT,TTYTAB(LINE) MOVSI DAT,440700 ADDI DAT,TTYBUF(DEVDAT) MOVE TAC,DAT ;FALL INTO TTYJOB ;ROUTINE TO RETURN IN AC ITEM JOB NUMBER WHICH TTY IS ATTACHED TO ;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK INTERNAL TTYJOB TTYJOB: LDB LINE, PUNIT LDB ITEM,TPCJOBN JRST CPOPJ1 ;TELETYPE SCANNER UUO ROUTINES ;FOR DDT ;DDTGT WAITS FOR OUTPUT TO COMPLETE THEN PUTS ;TELETYPE INTO DDT MODE DDTGT: PUSHJ PDP,TTYSR1 ;FIND DEVICE DATA BLOCK MOVE IOS,DEVIOS(DEVDAT) TLNN IOS,DDTM TLNN IOS,IO ;OUTPUT IN PROGRESS JRST DDTGT2 ;NO ; PUSHJ PDP,OUT ;MAKE SURE OUTPUT STARTED PUSHJ PDP,WAIT1 ;WAIT FOR OUTPUT TO FINISH DDTGT2: TLO IOS,DDTM ;SET DDT MODE BIT MOVEM IOS,DEVIOS(DEVDAT) JRST UXIT ;RELEASE TELETYPE FROM DDT MODE ;MAKE SURE OUPUT IS FINISHED FIRST DDTRL: PUSHJ PDP,TTYSR1 ;FIND DEVICE DATA BLOCK MOVE IOS,DEVIOS(DEVDAT) TLNE IOS,IO ;OUTPUT IN PROGRESS? PUSHJ PDP,WAIT1 ;YES, WAIT MOVSI IOS,DDTM+SYNC ANDCAM IOS,DEVIOS(DEVDAT) ;TURN OFF DDT BIT JRST UXIT ;INPUT TO DDT ;CALL AC,[SIXBIT /DDTIN/] AC CONTAINS POINTER TO BUFFER AREA ;BUFFER AREA MUST BE 21 WORDS LONG DDTIN: PUSHJ PDP,TTYSR1 ;SET UP DEVDAT MOVE IOS,DEVIOS(DEVDAT) TLNE IOS,IO ;OUTPUT IN PROGRESS PUSHJ PDP,WAIT1 ;YES, WAIT DDTIN2: MOVE IOS,DEVIOS(DEVDAT) TLNE IOS,IOEND ;BUFFER ALREADY? JRST DDTIN3 ;YES MOVEI IOS,IOACT IORM IOS,DEVIOS(DDB) PUSHJ PDP,WSYNC ;NO, WAIT JRST DDTIN2 DDTIN3: MOVSI TAC,NIO+IOFST+DDTM IORM TAC,DEVIOS(DEVDAT) ;STOP ALL IO MOVE TAC,TTYPTR(DEVDAT) PUSHJ PDP,CLRBYT ;CLEAR OUT REMAINING BYTES SUBI TAC,TTYBM1(DEVDAT) ;NUMBER OF WORDS LDB TAC1,PUUOAC ;PICK UP AC NUMBER ADDI TAC1,(PROG) ;FIND REAL ADDRESS MOVE TAC1,(TAC1) ;PICK UP POINTER ADDI TAC1,(PROG) ;FIND REAL ADDRESS OF BUFFER HRLI TAC1,TTYBUF(DEVDAT) ADDI TAC,(TAC1) BLT TAC1,(TAC) ;TRANSFER MONITOR BUFFER TO U CLEARM 1(TAC) ;MAKE SURE THERE ARE SOME NUL MOVSI TAC,NIO+IOEND ANDCAM TAC,DEVIOS(DEVDAT) JRST UXIT ;OUTPUT FROM DDT ;CALL AC,[SIXBIT /DDTOUT/] AC HAS POINTER TO DDT OUTPUT BUFFER DDTOUT: PUSHJ PDP,TTYSR1 MOVE IOS,DEVIOS(DEVDAT) TLNE IOS,IO ;OUTPUT IN PROGRESS? PUSHJ PDP,WAIT1 ;YES, WAIT MOVE IOS,[XWD NIO+TOUT+DDTM,IOACT] IORB IOS,DEVIOS(DEVDAT) LDB TAC,PUUOAC ;PICK UP AC NUMBER HRLI TAC,JDAT ;CALC REAL ADDRESS OF AC HRR TAC,@TAC ;PICK UP AC HRLI TAC,@TAC ;CALC REAL ADDRESS OF DDT BUF HRRI TAC,TTYBUF(DEVDAT) HRRZM TAC,TTYCTR(DDB) ;A SUITABLY LARGE NUMBER MOVE TAC1,TAC BLT TAC,20(TAC1) ;MOVE DDT BUFFER TO MONITOR HRLI TAC1,440700 MOVEM TAC1,TTYPTR(DEVDAT) TLZ IOS,IOS+IOFST PUSHJ PDP,TTYOU0 JRST UXIT TTYSR1: MOVE ITEM,JOB TTYSRC: MOVSI LINE,MTTYLN HRRZ DEVDAT,TTYTAB(LINE) JUMPE DEVDAT,TTYF0 LDB TAC,TPCJOBN CAIN TAC,(ITEM) POPJ PDP, ;FOUND TTYF0: AOBJN LINE,TTYSRC+1 MOVSI TAC,576062 ;SIXBIT /OPR/ JRST DEVPHY ;SEARCH PHYSICAL DEVICE NAMES ;AND RETURN OPERATOR TTY. ;ROUTINE TO FIND A TTY FOR A JOB ;CALL: MOVE ITEM,JOB NUMBER ; PUSHJ PDP, TTYFND ; ERROR RETURN ; RETURN WITH DEVDAT SET TO ADR OF DDB ; AND DAT SET TO BYTE POINTER TO MONITOR OUTPUT BUFFER TTYFNU: MOVE ITEM,JOB TTYFND: PUSHJ PDP,TTYSRC ;CALLED BY PUSHJ PDP,TTYFND ; PUSHJ PDP,WSYNC MOVSI TAC,NIO ;JOB NUMBER IN TAC1 IORM TAC,DEVIOS(DEVDAT) TTYDAT: MOVEI DAT,TTYBUF(DEVDAT) ;SETUP OUTPUT BYTE POINTER HRLI DAT,440700 POPJ PDP, TTYSTR: MOVE TAC,DAT PUSHJ PDP,CLRBYT SUBI TAC,TTYBM1(DEVDAT) ANDI TAC,-1 IMULI TAC,5 MOVEM TAC,TTYCTR(DEVDAT) MOVEI TAC,TTYBUF(DEVDAT) HRLI TAC,440700 MOVEM TAC,TTYPTR(DEVDAT) MOVE IOS,DEVIOS(DEVDAT) IOR IOS,[XWD NIO+IOFST,IODTER+IOBKTL] ANDCM IOS,[XWD NIO+IOFST,IODTER+IOBKTL] PUSHJ PDP,GCHAR POPJ PDP, ;NOTHING TO TYPE JRST TTYOU2 ;START OUTPUT ;DISPATCH TABLE; TTYDSP: POPJ PDP, ;RELEASE JRST OUT ;CLOSE JRST TTYOUT TDZ IOS,[XWD TPMON,ECHOF+NCERR] ;INPUT TRO IOS,IOACT TLZE IOS, IOBEG TLO IOS, IOFST JRST MIS1 TTYOUT: TDO IOS,[XWD TOUT+IOFST,IOACT] TDZ IOS,[XWD TPMON,ECHOF+NCERR] TTYOU0: LDB HPOS,PHPOS LDB VPOS,PVPOS PUSHJ PDP, GCHAR POPJ PDP, DPB HPOS,PHPOS DPB VPOS,PVPOS TTYOU2: LDB LINE,PUNIT CONO CLDS ;DISABLE CLOCK CAIN LINE,TCONLN JRST CTYOUT CONO DCSA,0 ;DISABLE SCANNER CONO DCSB, (LINE) DATAO DCSA, CHREC CONO DCSA,FSNCHN DPB CHREC,PLASTC TTYOU1: CONO CLEN ;RE-ENABLE CLOCK MOVEM IOS,DEVIOS(DEVDAT) POPJ PDP, CTYOUT: CONO TTY,0 ;DISABLE TTY DATAO TTY,CHREC MOVEM CHREC,CCHAR CONO TTY,SCNCHN ;RE-ENABLE JRST TTYOUT1 CTYINT: CONSO TTY,50 JRST . CONSO TTY,40 JRST CTYOU1 MOVEM TAC, CCHAR ;DONT ECHO RUBOUT DATAI TTY, TAC ANDI TAC, 177 CAIN TAC, 177 JRST CTYRUB ;IS A RUBOUT DATAO TTY, TAC ;NOT, SO ECHO EXCH TAC, CCHAR JRST 12,@SCNCHL ;DISMISS INTERRUP CTYRUB: EXCH TAC, CCHAR CTYOU1: JSR SCNSAV MOVEI CHREC,SCNCHN CONO TTY,200(CHREC) MOVE CHREC,CCHAR MOVEI LINE,TCONLN JRST TCOMM SCNINT: CONSO DCSA,1010 JRST . JSR SCNSAV CONSO DCSA,10 ;RECEIVER FLAG? JRST SCNIN1 ;NO,XMITTER FLAG CONI DCSB, LINE DATAI DCSB, CHREC TCOMM: ANDI CHREC, 177 CAILE LINE,TCONLN ;CTY LINE OR LESS JRST TYPX ;NO SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED? JRST INUSE ;YES PUSHJ PDP,DDBSRC ;SEARCH FOR FREE TTY DEV. DATA BLOCK JRST TYPX ;NONE FOUND, TYPE X CLEARB HPOS,VPOS ;ASSUME TTY IS AT BEGIN OF FORM CONSZ DCSA,700 ;FULL DUPLEX? CAIN LINE,TCONLN ;CTY? JRST INJEST ;NO, SWALLOW CHAR JRST TYP1 ;ROUTINE TO SEARCH FOR FREE TTY DEV DATA BLOCK ;CALL: MOVE LINE,TTY LINE NO ; PUSHJ PDP,DDBSRC ; NONE FOUND ; RETURN DEVDAT, LINE SET DDBSRC: MOVSI IOS,MLTTYL ;NO. OF TTY DDB MOVEI DEVDAT,TTYLST ;ADDRESS OF FIRST DDB SKIPA TAC,[XWD TTYUSE+TTYATC,ASSPRG+ASSCON] HLRZ DEVDAT,DEVSER(DEVDAT) TDNE TAC,DEVMOD(DEVDAT) ;USE.ATTACH, AND BOTH ASSIGN AOBJN IOS,.-2 JUMPGE IOS,CPOPJ ;DDB FOUND? MOVE IOS,[XWD TPMON+IOFST,IOACT] MOVE TAC,[XWD TTYUSE,ASSCON] ;INITIALIZE TTY DEVICE DATA BLOCK(CALLED FROM TTYATT TOO) SCNIN: IORM TAC,DEVMOD(DEVDAT) DPB LINE,PUNIT ;SET LINE NO. IN DDB MOVSI TAC,646471 ;SIXBIT /TTY/ MOVEM TAC,DEVNAM(DEVDAT) MOVE TAC,[POINT 6,DEVNAM(DEVDAT),17] PUSH PDP,LINE ;SAVE LINE NO. TRNN LINE,70 ;IS THERE A HIGH ORDER OCTAL DIGIT? JRST SCNIN0 ;NO ROT LINE,-3 ;YES,CONVERT TO SIXBIT ADDI LINE,20 IDPB LINE,TAC ;STORE HIGH ORDER SIXBIT DIGIT LSH LINE,20 ;IN PHYSICAL NAME SCNIN0: ADDI LINE,20 IDPB LINE,TAC ;STORE LOW ORDER DIGIT POP PDP,LINE HRRM DEVDAT,TTYTAB(LINE) ;SET LINE NO. IN TRANSLATOR T MOVSI TAC,436471 ;SIXBIT /CTY/ CAIN LINE,TCONLN ;IS THIS CONSOLE TTY? MOVEM TAC,DEVNAM(DEVDAT) ;YES, SET NAME TO CTY MOVE TAC,DEVNAM(DEVDAT) SKIPN DEVOPR ;IS THIS FIRST CHAR. TYPED BY ANYONE? MOVEM TAC,DEVOPR ;YES,SET THIS TTY AS OPERATOR TTY JRST CPOPJ1 ;SUCCESSFUL RETURN SCNIN1: DATAI DCSA,LINE ;GET LINE NO. FROM FULL DUPLEX MOVEI TAC,FSNCHN CONO DCSA,4000(TAC) ;RELEASE XMITTER SCANNER SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED? CAIL LINE,TCONLN ;LINE NO. TOO LARGE? JRST SCNRET ;GO AWAY LDB CHREC,PLASTC JRST INUS1 TYPX: CAIN CHREC,"X" ;CHARACTER RECEIVED AN X? JRST SCNRET ;YES, GO AWAY MOVEI CHREC,"X" CAIE LINE,TCONLN JRST TYPX1 DATAO TTY,CHREC JRST SCNRET TYPX1: CONSO DCSB,(LINE) DATAO DCSA,CHREC ;TYPE AN X JRST SCNRET INUSE: CONSZ DCSA,700 ;FULL DUPLEX? CAIN LINE,TCONLN JRST INUS1 CONO DCSB,(LINE) DATAO DCSA,CHREC DPB CHREC,PLASTC JRST SCNRET INUS1: MOVE IOS,DEVIOS(DDB) LDB PROG,PJOBN HRRZ PROG,JBTADR(PROG) LDB HPOS,PHPOS LDB VPOS,PVPOS LDB TAC, TTYPTR(DDB) TLNE IOS, SP JRST SIM35 INUS2: TLNN IOS,TOUT JRST INJEST CAME TAC, CHREC JRST ECHO INUS3: PUSHJ PDP, GCHAR JRST LEAV0 TYPE: CAIN LINE,TCONLN JRST CTSER3 TYP1: CONO DCSB,(LINE) DATAO DCSA, CHREC DPB CHREC,PLASTC ;SAVE CHARACTER FOR FULL DUPLEX LEAVE: MOVEM IOS, DEVIOS(DDB) LEAV1: DPB HPOS,PHPOS DPB VPOS,PVPOS JRST SCNRET LEAV0: MOVEM TAC,DEVMOD(DEVDAT) ;IS TTY ATTCHED? TLNN TAC,TTYATC PUSHJ PDP,TTYKIL ;NO,RETURN TO POOL JRST LEAV1 CTSER3: DATAO TTY,CHREC MOVEM CHREC,CCHAR JRST LEAVE ECHO: TDO IOS,[XWD SP,ECHOF] TLZ IOS,TOUT MOVEI CHREC,177 ;SEND A RUBOUT AFTER ECHO CHE JRST TYPE SIM35: MOVSI TAC,-SCTABL MOVE HPOS, SCTAB(TAC) CAIE CHREC,(HPOS) AOBJN TAC, .-2 LDB HPOS,PHPOS JUMPGE TAC, ECHO MOVS TAC, SCTAB(TAC) TLNE TAC, 140 ;SPACING CHARACTER AOJA HPOS,(TAC) ;YES JRST (TAC) ;NO SCTAB: XWD SPACE," " XWD SIMLF,12 XWD SIMRO,177 ;RUBOUT XWD SIMRO,134 ;BACK SLASH XWD ASC3,15 ;CR XWD SIMVA,"^" XWD DELET1,"C" XWD DELET1,"O" XWD SIM4,"Z" XWD DELET1,"U" SCTABL=.-SCTAB SPACE: TRNN HPOS,7 ;FINISHED SIMULATING TABS(8) JRST SIM4 ;YES JRST TYPE ;NO, SEND ANOTHER SPACE SIMVA: LDB CHREC,PSCHAR TRO CHREC, 100 JRST TYPE SIMLF: SOJG VPOS,TYPE ;SEND ANOTHER LINE-FEED SIM4: TLZ IOS,SP TLNN IOS,TOUT JRST INJ4 JRST INUS3 SIMRO: TLZA IOS, SP MOD35: TRC IOS,T35 JRST LEAVE INJEST: CAIN CHREC,3 ;CONTROL C? JRST INJ5 TLZE IOS,IOFST ;IF FIRST CHARACTER IN, INITIALIZE PUSHJ PDP,SETMB1 TLNE IOS,DDTM ;1 DDT CHAR RESTARTS PROGRAM TLO IOS,SYNC+IOEND ;YES, TERMINATE BUFFER CAIN CHREC,17 ;COTNROL O? JRST INJ6 ;YES, FLUSH OUTPUT TRZE IOS,ECHOF ;ECHO HAS OCCURRED? JRST INJ7 ;YES, NOW RESUME OUTPUT TRNE IOS,NCERR JRST LEAVE CAIE CHREC,033 ;NEW NEW ALT-MODE? CAIN CHREC,176 ;NEW ALT-MODE? MOVEI CHREC,175 ;CHANGE TO OLD CAIN CHREC,20 ;CONTROL P TAB SIMULATION FLIP FLOP SWI JRST MOD35 TLNE IOS,DDTM JRST INJ25 ;SENT RUBOUTS ON TO DDT CAIN CHREC,177 ;RUBOUT JRST DELET INJ25: DPBI CHREC, TTYPTR(DDB) SOS TAC, TTYCTR(DDB) CAIL CHREC, 40 CAILE CHREC, 137 JRST SPCIN ADDI HPOS,1 INJ4: PUSHJ PDP, MOVBUF JRST LEAVE SETMB1: HRRI TAC, TTYBUF(DDB) HRLI TAC, 440700 MOVEM TAC, TTYPTR(DDB) HRLS TAC AOS TAC SETZM TTYBUF(DDB) BLT TAC,TTYBFE(DDB) ;CLEAR OUT MONITOR BUFFER MOVEI TAC, 111 MOVEM TAC, TTYCTR(DDB) POPJ PDP, INJ5: PUSHJ PDP,SETMB1 PUSH PDP,ITEM ;^C LDB ITEM,TPCJOBN ;YES, GET USER CONSOLE NUMBER SKIPE ITEM PUSHJ PDP,STOP1 ;SHUT OFF JOB POP PDP,ITEM TLNN IOS,TPMON ;SAVE STATUS OF TTY MOVEM IOS,TTYSAV(DDB) ;WHEN IT WAS IN USER MODE MOVE IOS,[XWD TPMON+IOFST,IOACT] MOVEI TAC,"C" JRST INJ61 INJ6: PUSH PDP,TAC1 ;^O TLZE IOS,IOW PUSHJ PDP,SETIOD POP PDP,TAC1 TLNE IOS,TPMON+DDTM JRST INJ6A TLNE IOS,TOUT PUSHJ PDP,ADVBFE INJ6A: TLOA IOS,IOFST JRST .-2 TRZ IOS,ECHOF TRO IOS,IODEND MOVEI TAC,"0" INJ61: DPB TAC,PSCHAR MOVEI CHREC,"^" JRST SPC21 INJ7: TLO IOS,TOUT JRST INUS3 SPCIN: MOVSI TAC,-SCITL ;SEARCH FOR SPECIAL INPUT CHAR MOVE TAC1,SCITAB(TAC) CAIE CHREC,(TAC1) ;FOUND? AOBJN TAC,.-2 ;NO HLR TAC,TAC1 ;SAVE DISPATCH ADDRESS LDB LINE,PUNIT ;RESTORE TAC1 JUMPL TAC,(TAC) JRST INJ4 ;CHARACTER NOT FOUND SCITAB: XWD SPCCR,15 ;CR XWD ASC1,12 ;LF XWD SPC2,11 ;HORIZ TAB XWD SPVT,13 ;VT XWD SPFF,14 ;FF XWD SPC4A,25 ;^U XWD SPC7,32 ;^Z XWD ASC1, 175 ;ALT MODE SCITL=.-SCITAB SPCCR: MOVEI HPOS,0 JRST ASC3 SPFF: SKIPA VPOS,[10] SPVT: MOVEI VPOS,4 TLNN IOS,T35 ;DONT SIMULATE FOR A MOD 35 TLO IOS,SP ASC1: LDB TAC,PIOMOD TLNN IOS,TPMON CAIN TAC,AL TLO IOS,SYNC ASC2: TLNN IOS,SP JRST INJ4 ASC3: MOVEI CHREC,12 ;LINE FEED JRST TYPE SPC4A: PUSHJ PDP,SETMB1 MOVEI TAC,"U" JRST INJ61 SPC2: TRNE IOS,T35 JRST LEAVE MOVEI CHREC," " SPC21: TLO IOS,SP JRST TYPE SPC7: TLO IOS,SYNC+IOEND+SP ;^Z MOVEI TAC,"Z" JRST INJ61 ;ECHO ^Z DELET: MOVE TAC,TTYCTR(DDB) CAIL TAC,111 JRST DELET1 MOVSI TAC,070000 ADD TAC,TTYPTR(DDB) TLNE TAC,400000 ADD TAC,[XWD 347777,-1] MOVEM TAC,TTYPTR(DDB) AOS TTYCTR(DDB) MOVEI CHREC,334 ;BACK SLASH DELET2: TLO IOS,SP JRST TYPE DELET1: MOVEI VPOS,1 MOVEI CHREC,15 JRST DELET2 ;ROUTINE TO GET NEXT CHARACTER FROM OUTPUT BUFFER ;CALL: PUSHJ PDP,GCHAR ; NO MORE LEFT ; RETURN WITH CHAR. IN CHREC GCHAR: TLZN IOS, IOFST JRST GCHAR3 GCHAR1: HRRZ TAC,DEVOAD(DDB) ADD TAC, [XWD 000700+PROG,1] MOVEM TAC, TTYPTR(DDB) HRRZ TAC, @TAC IMULI TAC, 5 MOVEM TAC,TTYCTR(DDB) GCHAR3: SOSGE TTYCTR(DDB) JRST GCHAR5 LDBI CHREC, TTYPTR(DDB) JUMPE CHREC, GCHAR7 CAIN CHREC, 11 JRST HT CAIN CHREC, 12 AOJA VPOS,GCH3 CAIE CHREC, 13 CAIN CHREC, 14 JRST VTFF ADDI HPOS,1 CAIN CHREC,15 MOVEI HPOS,0 GCH3: AOSA (PDP) GCH3A: MOVE IOS,TTYSAV(DDB) ;RESTORE STATUS TO USER GCHAR4: MOVEM IOS,DEVIOS(DDB) POPJ PDP, GCHAR7: TLNN IOS,DDTM ;DDT BUFFER TERMINATED WITH NULL JRST GCHAR3 GCHAR5: PUSH PDP,TAC1 TLZE IOS, IOW PUSHJ PDP, SETIOD POP PDP,TAC1 TLNN IOS,TPMON+DDTM PUSHJ PDP, ADVBFE TLOA IOS,IOFST JRST GCHAR1 TDZ IOS,[XWD IO,IOACT] TLZN IOS,USRB JRST GCHAR4 TLZ IOS,TPMON LDB LINE,PUNIT ;GET LINE NO. PUSH PDP,ITEM LDB ITEM,TPCJOB PUSHJ PDP,SETRUN POP PDP,ITEM TRZN IOS,USRBC JRST GCH3A MOVSI IOS,TPMON+IOFST JRST GCHAR4 HT: TRNE IOS,T35 AOJA HPOS,GCH3 TLO IOS,SP SPOUT: MOVEI CHREC,240 JRST GCH3 VTFF: TRNE IOS,T35 AOJA VPOS,GCH3 MOVEI CHREC,12 TLO IOS,SP JRST GCH3 MOVBUF: TLNE IOS,DDTM JRST MOV3 ;DONT ADVANCE BUFFERS FOR DDT MODE TLZN IOS,SYNC SKIPG TTYCTR(DDB) JRST .+2 JRST MIS1 TLNE IOS, TPMON JRST MOVMON MOVE TAC,DEVIAD(DDB) ;IS TTY EXPECTING INPUT? TRNE TAC,-1 SKIPGE @TAC ;OR IS NEXT BUFFER READY? JRST MIS ;NO PUSH PDP,TAC1 MOVE TAC,TTYPTR(DDB) PUSHJ PDP,CLRBYT MOVE TAC,DEVIAD(DDB) PUSHJ PDP,ADRCK ;MAKE SURE BUFFER WILL FIT HRRZI TAC,STTYB1(TAC) ;LENGTH+1 MOVEI TAC,@DEVIAD(DDB) ADDI TAC,2 HRR CHREC,TAC ADDI TAC,STTYBF HRLI CHREC,TTYBUF(DDB) BLT CHREC,-1 (TAC) MOVEI TAC,111 SUB TAC, TTYCTR(DDB) ADDI TAC,4 IDIVI TAC,5 MOVEI CHREC,@DEVIAD(DDB) MOVEM TAC,1(CHREC) PUSHJ PDP, ADVBFF JRST .+1 TLOA IOS,IOFST MOV3: PUSH PDP,TAC1 TLZE IOS, IOW PUSHJ PDP, SETIOD POP PDP,TAC1 TRZA IOS,NCERR+IOACT MIS: TRO IOS, NCERR MIS1: MOVEM IOS, DEVIOS(DDB) POPJ PDP, MOVMON: MOVSI TAC,400000 IORM TAC,TTYTAB(LINE) ;SET BIT FOR MONITOR TLO IOS,IOFST MOVEI TAC,15 DPB TAC,TTYPTR(DDB) ;FORCE A CARRIAGE RET INTO MONITOR COMM AOS COMCNT POPJ PDP, END,