.TITLE TECOIO ; H.J. FROM EARLIER VERSION .IF NDF HELP VT11=1 ;DO THE SCOPE VERSION VT52=1 ;AND THE VT52 VERSION VT52WS=1 ;WITH WINDOW SUPPORT .ENDC .SBTTL GLOBALS, MACROS, DEFINITIONS .CSECT TECOIO .GLOBL CLSFIL, CURFRE, DATE, EOFLAG, GETBUF, GETFLS, INPNTR .GLOBL GEXIT, INPSAV, KILFIL, LISTEN, NWATCH, TECOJP, OUPNTR .GLOBL NOCTLO, OUTSAV, P, PDL, PRINT, PUTBUF, QMAX .GLOBL QRSTOR, QZ, RWSIZE, SCHBUF, SIZER, SWITCH, FILBUF .GLOBL TECO, TECOCH, TECOPD, TECOSP, TEXIT, TIME, TXSTOR .GLOBL TYPE, WATCH, XITNOW, ZMAX, ZZ, .VVV.V, FFFLAG .GLOBL ETYPE, ALLERR, SIZERB, PRINTF, TYPEF, SIZE, TLISTN .GLOBL EUFLAG, TFLG, CLSOUT, STOPON, DELLIN, DELCHR, CRLFNO .GLOBL FLAGRW, INDIR, PRTLIN .MCALL .CSISPC,.DATE, .DSTAT, .EXIT, .FETCH, .PRINT, .RCTRLO .MCALL .SETTOP,.SRESET,.TTINR, .TTYOUT,..V2.., .SCCA, .HERR, .SERR .MCALL .LOOKUP,.ENTER, .READW, .WRITW, .CLOSE, .PURGE, .RENAME,.PROTECT .ENABL LC ..V2.. .MACRO ERROR R50COD,TEXT .CSECT $TIOER $$$=. .RAD50 /R50COD/ .ASCIZ TEXT .EVEN .CSECT TECOIO JSR R4,ERR .WORD $$$ .ENDM ERROR .MACRO ERRORI R50COD,TEXT .CSECT $TIOER $$$=. .RAD50 /R50COD/ .ASCIZ TEXT .EVEN .CSECT TECOIO MOV #$$$,R2 MOV (R2)+,R0 SEC RTS PC .ENDM ERRORI .SBTTL DEFINITIONS ; RT-11 PARAMETERS USTART = 40 ;START ADDRESS OF PROGRAM STACK = 42 ;START OF USER STACK JSW = 44 ;JOB STATUS WORD TTCBIT = 100 ;TTYIN AND TTYOUT DO INDEED RETURN CARRY IN F/B CHAIN = 400 ;TECO ENTERED VIA CHAIN, DO CCL CMDEX = 4000 ;EXECUTE COMMAND AT 512 ON EXITS TTYUSR = 10000 ;TELETYPE I/O IN USER MODE REENTR = 20000 ;PROGRAM IS REENTERABLE LCASE = 40000 ;ENABLE LOWER CASE INPUT PGMTOP = 50 ;POINTER TO TOP OF LOADED PROGRAM ERRBYT = 52 ;EMT ERROR CONDITION RMON = 54 ;POINTER TO START OF RMON USRBUF = 266 ;OFFSET INTO RMON OF USR START CONFIG = 300 ;OFFSET TO CONFIG WORD VT11HW = 4 ;GT-40 HARDWARE IS AVAILABLE SCROLL = 302 ;RESIDENT GT-40 SCROLLER SCMAX = 4 ;OFFSET IN SCROLLER TO LINE COUNT SCLINK = 10 ;OFFSET IN SCROLLER TO LINK-UP ; TECO SIZE PARAMETERS SCHSIZ = 132. ;SIZE OF SEARCH BUFFER PDLSIZ = 100 ;PUSH DOWN SIZE FILSIZ = 40. ;SIZE OF FILE NAME BUFFER SIZERB = 10000 ;WE CAN GIVE TECO A ONE TIME SHOT OF 2K ; VARIOUS ASCII CHARACTERS BELL = 7 BS = 10 TAB = 11 LF = 12 VT = 13 FF = 14 CR = 15 ESC = 33 SPACE = 40 RUBOUT = 177 DEL = RUBOUT ; ETYPE VALUES - EDIT TYPE MODES BOUT = 1 ;ALLOWS CHARS TO BE OUTPUT UNEDITED VIDEO = 2 ;HANDLE TERMINAL AS VT52 ULCASE = 4 ;ACCEPTS LOWER CASE INPUT TECHO = 10 ;DISABLES ECHO FOR ^T INPUT ECHON = 20 ;FORCE ECHO ON ON PRINTS NOWAIT = 40 ;MAKES ^T NOT WAIT FOR CHAR TRUNC = 400 ;MAKES TECO TRUNCATE >80 LINES ON VT52 .SBTTL MEMORY ORGANIZATION ; THE MEMORY OBTAINED BY TECOIO AND GIVEN TO TECO IS ; ORGANIZED AS FOLLOWS: ; ; ********************************* ; * READ/WRITE AREA * ; * SIZE = RWSIZE * ; * * ; * CLEARED BY TECOIO * ; ********************************* ; * PUSH DOWN LIST * ; * POINTED TO BY TECOPD * ; * SIZE = SIZEPD (GLOBAL) * ; ********************************* ; * SEARCH BUFFER * ; * POINTED TO BY SCHBUF * ; * SIZE = SCHSIZ (GLOBAL) * ; ********************************* ; * DEVICE HANDLERS * ; * * ; * THIS AREA IS OPTIONAL * ; * AND ONLY EXISTS IF USER * ; * REQUESTS NON-RESIDENT * ; * DEVICE HANDLERS * ; ********************************* ; * TEXT STORAGE AREA * ; * POINTED TO BY TXSTOR * ; * SIZE IN ZMAX(RW AREA) * ; ********************************* ; * Q-REGISTER STORAGE * ; * POINTED TO BY QRSTOR * ; * SIZE IN QMAX(RW AREA) * ; ********************************* ; * FREE STORAGE * ; * SIZE IN CURFRE -NO POINTER * ; * USR -DOWN FROM TOP FOR 2K * ; ********************************* ; ; ALL POINTERS IN TECOIO ARE RELATIVE TO THE BEGINNING OF ; THE IMPURE AREA, WHICH IS POINTED TO BY FREEST IN TECOIO. ; THE TEXT STORAGE AREA AND Q-REGISTER STORAGE AREAS ; ALSO HAVE AN ASSOCIATED WORD IN THE R/W AREA TELLING HOW ; MUCH OF THE ALLOCATED STORAGE IS IN USE. ; THE POINTERS ARE ARRANGED AS: ; TXSTOR, ZZ, ZMAX ; AND QRSTOR, QZ, QMAX .SBTTL SAVE, RESTORE, ERROR SAVREG: MOV R3,-(SP) ;PRESERVE R1,R3, AND R4 FOR ALL RETURNS MOV R1,-(SP) ;(R4 SAVED BY JSR R4) MOV SP,SPSAVE ;SAVE FOR ERROR RETURNS MOV R0,-(SP) ;SAVE FOR NON ERROR RETURNS MOV R2,-(SP) MOV R4,-(SP) ;RETURN ADDRESS MOV 5*2(SP),R4 ;RESTORE R4 TO ORIGINAL VALUE JSR PC,@(SP)+ ;EXCHANGE HIM FOR US MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R0 ; AND R0 CLC ;SAY NORMAL RETURN REGRET: MOV (SP)+,R1 MOV (SP)+,R3 MOV (SP)+,R4 MOV FREEST,R5 ;ALWAYS POINT R5 BACK TO WORK AREA RTS PC ERR: SEC ;TELL TECO THINGS ARE NO GOOD MOV (R4)+,R2 ;POINT TO RAD50 CODE MOV (R2)+,R0 ;GET CODE IN R0, POINTER TO TEXT IN R2 MOV SPSAVE,SP ;RESTORE STACK BR REGRET ;AND EXIT .IF NDF VT01 .SBTTL LISTEN FOR TTY GETCHR: MOV #JSW,R0 ;JSW IS REFERENCED A LOT BIC #LCASE+TTCBIT,@R0 ;ASSUME UPPER CASE AND SUSPEND INPUT BIT #ULCASE,ETYPE(R5) ;IS INPUT TO BE LOWER CASE? BEQ 1$ ;BRANCH IF UPPER CASE INPUT BIS #LCASE,@R0 ;SET ACCEPT LOWER CASE 1$: BIS #TTYUSR,@R0 ;MAKE SURE WE ARE IN SPECIAL MODE JSR PC,@(SP)+ ;CO-ROUTINE FOR MORE SETUP 2$: .TTINR ;READ THE CHAR WITH NO WAIT BIC #177600,R0 ;GET RID OF PARITY BLOS 5$ ;BRANCH IF NO CHAR CMP #175,R0 ;CHECK FOR ALTMODES BEQ 3$ CMP #176,R0 ;OF ALL SORTS BNE 4$ 3$: MOV #ESC,R0 ;AND FIX THEM 4$: RTS PC 5$: BIT #TTCBIT,@#JSW ;WAS THIS A NO WAIT CALL? BEQ 2$ ;BRANCH TO WAIT FOR CHAR MOV #-1,R0 ;INDICATE NO CHAR AVAILABLE RETPOP: TST (SP)+ ;REMOVE RETURN ADDRESS RTS PC ;RETURN WITHOUT ECHO TLISTN: JSR PC,GETCHR ;SET UP FOR GETTING TT INPUT BIT #NOWAIT,ETYPE(R5) ;DOES USER WANT IMMEDIATE RETURN? BEQ 1$ ;BRANCH IF STANDARD READ BIS #TTCBIT,@R0 ;SET NO SUSPEND BIT IN JSW 1$: JSR PC,@(SP)+ ;TRY TO GET A CHAR CMPB #'C-100,R0 ;IS CHAR AN ^C? BNE 2$ ;BRANCH IF NOT CMPB R0,UPCFLG ;WAS LAST CHAR ALSO A ^C? BNE 2$ ;BRANCH IF NOT, RETURN IT AS NORMAL CHAR BIS #100000,TFLG(R5);SIGNAL ABORT ON 2ND ^C 2$: MOVB R0,UPCFLG ;SAVE CHAR FOR NEXT TIME BIT #TECHO,ETYPE(R5);ECHO ^T CHARS? BEQ TYPE ;BRANCH TO ECHO IT RTS PC ;RETURN WITHOUT ECHO RETCHR: MOV (SP)+,CHAINF ;SAVE NEW DISPATCH ADDRESS BR RETPOP ;RETURN FROM FUDGED LISTEN .ENABL LSB 1$: MOVB #'B,R0 ;ASSUME EDIT BACKUP TST @#510 ;ARE WE RIGHT? BEQ 3$ ;BRANCH IF YES BMI 2$ ;BRANCH IF CREATE MOVB #'R,R0 ;WAS INSPECT BR 3$ ;GO TO FALL THRU 2$: MOVB #'W,R0 ;SET EW FOR CREATE 3$: MOV #511,CHPTR ;SET UP FOR RETURNING FILENAME CHARS BR 5$ ;RETURN THE FILE NAME STRING LISTEN: JSR PC,GETCHR ;GET A CHAR FROM TERMINAL JMP @CHAINF ;DISPATCH TO ROUTINE (NORMALLY GETTT) 4$: CLRB @#540 ;SET UP LIKE /INSPECT MOV #200,@#510 ;SET INSPECT CHINIT: MOV #600,CHPTR ;ASSUME MUNG COMMAND CMP #100200,@#510 ;IS THIS EXECUTE ENTRY? BEQ 6$ ;BRANCH IF YES,JUST GIVE TECO THE STRING MOVB #'E,R0 ;RETURN START OF E- COMMAND JSR PC,RETCHR ;RETURN TO NEXT INSTR AND RETURN CHAR TSTB @#540 ;IS THERE AN EXPLICIT OUT SPEC? BEQ 1$ ;BRANCH IF NOT MOVB #'W,R0 ;RETURN A W FOR EW MOV #537,CHPTR ;SET UP FOR RETURNING CHARS 5$: INC CHPTR ;BUMP TO NEXT POSITION JSR PC,RETCHR 6$: MOVB @CHPTR,R0 ;GET NEXT CHAR BNE 5$ ;BRANCH IF NOT AT END OF FILESPEC MOVB #ESC,R0 ;RETURN AN ALTMODE JSR PC,RETCHR TSTB @#540 ;WERE WE WORKING ON 1ST NAME? BNE 4$ ;BRANCH IF NOT CMPB #-1,@#510 ;IS THIS MUNG WITH FILE? BNE 7$ ;BRANCH IF NOT MOV #100200,@#510 ;FORCE EXECUTE STRING TO BE TAKEN BR CHINIT ;GO THROUGH CODE AGAIN 7$: TST @#510 ;NO YANK FOR CREATE BMI 8$ ;BRANCH IF CREATE OPERATION MOVB #'Y,R0 ;RETURN A Y JSR PC,RETCHR MOVB #ESC,R0 ;AND AN ESCAPE JSR PC,RETCHR 8$: CLR INDIR(R5) ;ENABLE TECO '*' PROMPT MOVB #ESC,R0 ;AND AN ESCAPE JSR PC,RETCHR ;END INPUT CHAIN SEQUENCE GETTT: .IF DF HELP ;DON'T ALLOW PROMPT IF THIS IS HELP.SAV .PRINT #HLPMSG BR TEXIT ;EXIT .ENDC JSR PC,@(SP)+ ;LISTEN USES ALL DEFAULTS CLRB UPCFLG ;MAKE DOUBLE ^C CHECK ONLY WORK FOR ^T BIC #100000,TFLG(R5);MAKE SURE 2 IN A ROW IS OK AS REGULAR ;TERMINAL INPUT AND FALL INTO ECHO CODE .DSABL LSB .NLIST .IFF .SBTTL LISTEN FOR TTY AND KEEP CURSOR BLINKING ONCTR = 200 ;LOOP COUNT FOR CURSOR ON OFFCTR = 2000 ;LOOP COUNT FOR CURSOR OFF CURSOR: TST NWATCH(R5) ;IS THE SCOPE ON? BLE LISTEN DEC (PC)+ ;COUNT FLICKERER FLICKR: .WORD 1 BGT LISTEN ;IF > 0, LEAVE IT OFF BEQ 1$ ;IF = 0, TURN IT ON BVC 2$ ;IF < 0 BUT NOT DONE, GO DISPLAY IT MOV #100000+OFFCTR-ONCTR,FLICKR ;TURN IT OFF 1$: ADD #100000+ONCTR,FLICKR ;TURN IT ON BR CURSOR ;LOOP 2$: MOV #YPOS,R0 ;POINT TO STATUS REGS MOV CURSY,@R0 ;PUT IN Y CURSOR MOV CURSX,-(R0) ; AND X CURSOR POSITION MOV #4,-(R0) ;SET UP COMMAND MOV #9.,5$ ;SET UP COUNT 3$: INC @R0 ;INTENSIFY! 4$: TSTB @R0 ;WAIT FOR COMPLETION BPL 4$ ADD #6,4(R0) ;INCREMENT YPOS DEC (PC)+ ;DONE YET? 5$: .WORD 9. BNE 3$ ;NO, INTENSIFY ANOTHER LISTEN: BIS #TTYUSR+TTCBIT,@#JSW ;MAKE SURE WE ARE IN SPECIAL MODE .TTINR BCS CURSOR ;GO DISPLAY CURSOR IF NOT READY BIC #177600,R0 BEQ LISTEN ;IGNORE NULLS CMP R0,#175 ;CHECK FOR ALTMODES BLO 1$ CMP R0,#176 ;OF ALL SORTS BHI 1$ MOV #ESC,R0 ;AND FIX THEM 1$: ;FALL INTO ECHO ROUTINE .ENDC .LIST .SBTTL TYPE CHARACTER TYPE: MOV R0,-(SP) ;SAVE A REG TYPE1: BIT #BOUT,ETYPE(R5) ;OUTPUT CHAR AS IS? BNE 2$ ;BRANCH TO DO SO CMP #RUBOUT,R0 ;PRINT IT AL ALL? BEQ 4$ ;NO CMP #SPACE,R0 ;NEED WE EDIT IT? BLOS 2$ ;NOT IF 40 < CHAR CMP #ESC,R0 ;ALTMODE? BEQ 5$ CMP #TAB,R0 ;TAB? BEQ 2$ CMP #CR,R0 ;RETURN? BEQ 2$ CMP #LF,R0 ;LINE FEED? BEQ 2$ CMP #FF,R0 ;FORM FEED? BEQ 6$ CMP #BELL,R0 ;BELL? BNE 1$ ;NO, SPECIAL ECHOS AS ^.. .TTYOUT ;BELL ECHOS AS DING ^G 1$: MOV #'^,R0 .TTYOUT MOV @SP,R0 BIS #100,R0 2$: .TTYOUT 3$: MOVB #1,OUTDNE ;FLAG OUTPUT SENT TO TERMINAL 4$: MOV (SP)+,R0 RTS PC 5$: MOV #'$,R0 ;HERE FOR ALTMODE BR 2$ 6$: MOV #4.,-(SP) ;HERE FOR FORM FEED 7$: MOV #LF,R0 ;ECHO AS FOUR LINE FEEDS .TTYOUT DEC @SP BNE 7$ INC (SP)+ BR 3$ TYPEF: MOV R0,-(SP) ;SAVE THE CHAR FOR RETURN CMP #100,R0 ;SHOULD CHAR BE CONSIDERED FOR FLAGING? BGT TYPE1 ;BRANCH IF NOT TST EUFLAG(R5) ;WHAT KIND OF FLAGGING? BMI TYPE1 ;BRANCH IF NONE BEQ 1$ ;BRANCH IF FLAG LOWER BIT #40,R0 ;IS CHAR UPPER BEQ 2$ ;BRANCH IF YES TO FLAG THE CHAR BR 3$ ;MAKE CHAR UPPER CASE BUT DONT FLAG 1$: BIT #40,R0 ;IS CHAR LOWER? BEQ TYPE1 ;BRANCH IF UPPER, DO NOTHING 2$: MOV #'',R0 ;SET UP TO OUTPUT A QUOTE .TTYOUT 3$: MOV @SP,R0 ;RETRIEVE THE CHAR BIC #40,R0 ;MAKE SURE ITS UPPER CASE BR TYPE1 ;GO OUTPUT IT DELLIN: JMP @DLIN ;DO PROPER LINE DELETE FOR TERMINAL DELCHR: JMP @DCHR ;SAME FOR CHARACTER DELETE DLIN: .WORD CRLFNO ;DEFAULT TO HARDCOPY TERMINAL DCHR: .WORD TYPE ;SAME FOR CHARACTER DELETES FLAGRW: .IF DF VT52 CMP #ETYPE,R2 ;IS THIS TERMINAL FLAG BNE 1$ ;BRANCH IF NOT CMP #-1,R3 ;IS THIS A NEW VALUE? BNE 1$ ;BRANCH IF NOT JSR R4,SAVREG ;PRESERVE THE REGISTERS BIC #^C