.TITLE EDI05 .IDENT /X01/ .NLIST BEX .ENABL LC ; ; EDITOR (TEMP FILE VERSION) ; ; VERSION X01 ; ; DAVID G. CONROY 10-APR-78 ; LAST UPDATED: 13-AUG-79 ; MAKE TTY BUFFERS LARGER. ; .GLOBL EDIT .GLOBL GETC .GLOBL TTYC .GLOBL TTYNL .GLOBL TTYNUM .GLOBL TTYSKP .GLOBL TTYSTR .GLOBL ATT .GLOBL DET .MCALL CALL .MCALL CALLR .MCALL RETURN .MCALL OPNT$D .MCALL EXIT$S .MCALL GPRT$S .MCALL WTSE$S .MCALL DIR$ .MCALL QIO$ .MCALL FINIT$ ; ; EQUIVALENCES. ; TS = 128. ;TTY BUFFER SIZE ; ; LOCAL DATA ; LIM: .LIMIT ;TO FIND OUT HOW BIG I AM IOS: .BLKW 2 ;IO STATUS .BLKW 1 ;ALSO FOR GPRT$S CT: .WORD -10000. ;TTYNUM CONVERSION TABLE .WORD -1000. ; .WORD -100. ; .WORD -10. ; CTE: .BLKW 0 ;END ; ; DIRECTIVE BLOCKS ; R: QIO$ IO.RVB,1,1,,IOS,, O: QIO$ IO.WVB,1,1,,IOS,, ATT: QIO$ IO.ATT,1,1 DET: QIO$ IO.DET,1,1 P: QIO$ IO.WVB,1,1,,IOS,, ; ; TTY BUFFER CONTROLS ; THE MAGIC NUMBERS IN THE .BYTE JUST BEFORE THE INPUT BUFFER MAKE A ; GMCR$ DPB INTO THE INPUT BUFFER. ; IC: .WORD 0 ;NUMBER OF CHARACTERS IN TTY BUFFER IP: .BLKW 1 ;INPUT POINTER OPTR: .WORD OB ;OUTPUT POINTER GMCR: .BYTE 127.,41. ;GMCR DIC, DPB SIZE IB: .BLKB TS ;TTY INPUT BUFFER OB: .BLKB TS ;TTY OUTPUT BUFFER ; ; MESSAGES ; NOTEMP: .ASCIZ "Cannot create tempfile"<12> PR: .ASCII "*" .EVEN ;+ ; ** EDIT - STARTUP ; ; THIS ROUTINE IS THE STARTUP CODE FOR THE EDITOR. IT GETS CONTROL ; FROM RSX. ; IT SIZES UP THE PARTITION (TO DETERMINE THE NUMBER OF LINES THE ; USER CAN HAVE IN THE BUFFER) AND OPENS THE TEMP. FILE. ; WHEN DONE, CONTROL GOES OFF TO THE COMMAND LOOP, NEVER TO EVER ; RETURN. ;- EDIT: DIR$ #ATT ;ATTACH THE TERMINAL WTSE$S #1 ; MOV LIM+2,R0 ;COMPUTE BASE OF BUFFER INC R0 ;ROUND UP BIC #1,R0 ; MOV R0,ZERO ;SET NO TEXT IN BUFFER MOV R0,DOT ; MOV R0,DOL ; GPRT$S ,#IOS ;GET SIZE OF PARTITION MOV IOS+G.PRPS,R0 ;IN CLICKS ASL R0 ;IN BYTES ASL R0 ; ASL R0 ; ASL R0 ; ASL R0 ; ASL R0 ; ADD $DSW,R0 ;COMPUTE HIGH ADDRESS MOV R0,TOP ; FINIT$ ;INITIALISE THE FSR. MOV #TMP,R0 ;GET ON THE CORRECT DEVICE !! MOV #DFNB,R1 ; CALL .ASLUN ; OPNT$D ;CREATE TEMP. FILE BCS 80$ ;URK ; ; COMMAND LINE PROCESSING ; DIR$ #GMCR ;READ DOWN COMMAND LINE BCS 40$ ;NOT THERE MOV #GMCR+G.MCRB,R0 ;POINT AT THE COMMAND BUFFER CALL 50$ ;GET FIELD CMP R1,#'- ;EDIT - BNE 10$ ;NO INC OP ;YES, SET PROMPT FLAG CALL 50$ ;AND SCAN OVER THE - 10$: CMP R1,#CR ;A FILE PERHAPS BEQ 40$ ;NO CMP R1,#ESC ; BEQ 40$ ;NO DEC R0 ;FABRICATE AN E COMMAND MOVB #' ,-(R0) ; MOVB #'E,-(R0) ; MOV R0,IP ;SET UP A FAKE COMMAND LINE 20$: CMPB (R0),#CR ;DETERMINE THE SIZE BEQ 30$ ; CMPB (R0),#ESC ; BEQ 30$ ; INC R0 ; BR 20$ ; 30$: MOVB #NL,(R0)+ ;MAKE DELIMITER A NEWLINE SUB IP,R0 ;GET THE SIZE MOV R0,IC ;SAVE IT FOR TTYICH 40$: MOV SP,SPS ;SETEXIT JMP COMMND ;OFF WE GO, INTO THE ... ; ; LOCAL ROUTINE TO SKIP OVER A FIELD. ; 50$: MOVB (R0)+,R1 ;GET CHARACTER CMP R1,#CR ;STOP ON COMMAND END BEQ 70$ ; CMP R1,#ESC ; BEQ 70$ ; CMP R1,#' ;BUT CONTINUE UNTIL A BLANK BNE 50$ ; 60$: MOVB (R0)+,R1 ;SKIP OVER BLANKS CMP R1,#' ; BEQ 60$ ; 70$: RETURN ;DONE ; ; DISASTER, NO TEMP FILE ; 80$: MOV #NOTEMP,R0 ;NO TEMP FILE. CALL TTYSTR ;COMPLAIN, THEN EXIT$S ;DIE ;+ ; ** GETC - GET A CHARACTER ; ; GET A CHARACTER, EITHER FROM THE TTY OR FROM THE SAVED UP GLOBAL ; COMMAND LINE. RETURN EOF ON THE END OF THE GLOBAL LINE, BUT KEEP ; RETURNING IT. ; ; OUTPUTS: ; R0=CHARACTER ;- GETC: MOV PEEK,R0 ;PEEK CHARACTER BMI 10$ ;NONE MOV #-1,PEEK ;MAKE IT GO AWAY BR 40$ ; 10$: MOV GUPTR,R0 ;GET GLOBAL POINTER BEQ 30$ ;NOT IN A GLOBAL MOVB (R0),R0 ;GET CHARACTER BEQ 20$ ;END, RETURN EOF INC GUPTR ;BUMP POINTER BR 40$ ; 20$: MOV #EOF,R0 ;EOF ON GLOBAL BR 40$ ;DONE 30$: CALL TTYICH ;GET CHARACTER FROM TTY 40$: BIC #177600,R0 ;MASK TO 7 BIT ASCII RETURN ;DONE ;+ ; ** TTYICH - GET CHARACTER FROM THE TTY ; ; OUTPUTS: ; R0=CHARACTER ;- TTYICH: DEC IC ;ANY CHARACTERS LEFT BPL 20$ ;YES 10$: TST OP ;PROMPT BEQ 15$ ;NO, NO PROMPTS TST EXECM ;EXECUTING A COMMAND BNE 15$ ;YES, NO PROMPTS DIR$ #P ;ISSUE PROMPT WTSE$S #1 ; 15$: DIR$ #R ;READ A LINE FROM THE TTY WTSE$S #1 ; CMP IOS,#IS.CR ;GOOD STATUS BNE 10$ ;NO, GO AGAIN MOV IOS+2,R0 ;GET BYTE COUNT MOVB #NL,IB(R0) ;APPEND A NEWLINE TO THE BUFFER MOV R0,IC ;RESET COUNT MOV #IB,IP ;RESET POINTER 20$: MOVB @IP,R0 ;GET THE CHARACTER INC IP ; BIC #177600,R0 ;7 BIT ASCII BEQ TTYICH ;EAT NULLS RETURN ;DONE ;+ ; ** TTYSKP - DISCARD REMAINER OF TTY LINE ; ; THIS ROUTINE IS USED BY THE ERROR PROCESSOR TO DISCARD THE REST OF ; THE CURRENT LINE FROM THE TTY. ;- TTYSKP: CLR IC ;EASY MOV #-1,PEEK ;TO DO RETURN ; ;+ ; ** TTYSTR - OUTPUT A STRING TO THE TTY ; ; INPUTS: ; R0=POINTER TO ASCIZ STRING ; ; USES: ; R0 ;- TTYSTR: MOV R1,-(SP) ;SAVE REGISTERS MOV R0,R1 ;GET WORKING COPY OF STRING 10$: MOVB (R1)+,R0 ;FROM STRING BEQ 20$ ;DONE CALL TTYC ;OUT IT GOES BR 10$ ; 20$: MOV (SP)+,R1 ;RETURN RETURN ; ;+ ; ** TTYNL - OUTPUT A NEWLINE TO THE TTY ;- TTYNL: MOV R0,-(SP) ;SAVE R0 MOV #NL,R0 ;PUT OUT THE NEWLINE CALL TTYC ; MOV (SP)+,R0 ;RESTORE R0 RETURN ; ;+ ; ** TTYNUM - OUTPUT A NUMBER TO THE TTY ; ; INPUTS: ; R1=THE NUMBER ; ; USES: ; R0, R1 ;- TTYNUM: MOV R2,-(SP) ;SAVE REGISTERS MOV R3,-(SP) ; TST R1 ;TEST FOR NEGATIVE NUMBERS BPL 10$ ;NO MOV #'-,R0 ;PUT OUT "-" SIGN CALL TTYC ; BR 20$ ; 10$: NEG R1 ;FORCE POSITIVE TO NEGATIVE 20$: MOV #CT,R2 ;GET TABLE POINTER CLR R3 ;CLEAR SUPRESS FLAG 30$: MOV #'0,R0 ;START WITH "0" 40$: CMP R1,(R2) ;GET A DIGIT BGT 50$ ; SUB (R2),R1 ; INC R0 ; BR 40$ ; 50$: CMP R0,#'0 ;IS IT A ZERO BNE 60$ ;NO TST R3 ;ARE WE SUPRESSING BEQ 70$ ;YES 60$: CALL TTYC ;PUT IT OUT INC R3 ;END SUPRESSION 70$: TST (R2)+ ;GET NEXT ENTRY CMP R2,#CTE ;AT THE END BLO 30$ ;NO MOV R1,R0 ;DO THE LAST DIGIT NEG R0 ; ADD #'0,R0 ; CALL TTYC ; MOV (SP)+,R3 ;RETURN MOV (SP)+,R2 ; RETURN ; ;+ ; ** TTYC - TYPE CHARACTER ; ; THE SUPPLIED CHARACTER IS TYPED ON THE CONTROL TTY. THE CHARACTERS ; ARE BUFFERED UNTIL NEWLINE, WHEN THE WHOLE MESS IS PUT OUT. ; FOR SOME UNKNOWN REASON DEC DOES NOT WRITE OUT THE SLEW BYTES ON A ; ZERO BYTE WRITE. SPECIAL CHECKING MUST BE DONE IN THIS CASE. ; ; INPUTS: ; R0=CHARACTER ;- TTYC: MOV R0,-(SP) ;SAVE THE CHARACTER CMP R0,#NL ;TIME TO FLUSH THE BUFFER BNE 30$ ;NO TST OO ;OPTIONS OCTAL ? BEQ 10$ ;NO CALL TTYOCT ;PUT OUT OCTAL NEWLINE 10$: MOV OPTR,R0 ;COMPUTE COUNT SUB #OB,R0 ; BNE 20$ ;NOT A NULL BUFFER MOVB #' ,OB ;PUT OUT 1 BLANK INC R0 ; 20$: MOV R0,O+Q.IOPL+2 ;SET INTO THE DPB DIR$ #O ;OUTPUT THE LINE WTSE$S #1 ; MOV #OB,OPTR ;WIND BACK THE POINTER BR 60$ ; 30$: TST OO ;OPTIONS OCTAL ? BEQ 50$ ;NO CMP R0,#40 ;DOES IT PRINT ? BLO 40$ ;NO CMP R0,#176 ;WELL ? BLOS 50$ ;YES 40$: CALL TTYOCT ;IN OCTAL, PLEASE BR 60$ ; 50$: CMP OPTR,#OB+TS ;DOES IT FIT ? BHIS 60$ ;NO MOVB R0,@OPTR ;PUT IN BUFFER INC OPTR ; 60$: MOV (SP)+,R0 ;DONE RETURN ; ;+ ; ** TTYOCT -- OUTPUT CHARACTER IN OCTAL ; ; INPUTS: ; R0=CHARACTER ;- TTYOCT: MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; MOV R0,R1 ;GET CHAR IN TOP 9 BITS SWAB R1 ; CLC ; ROR R1 ; MOV #'\,R0 ;PUT OUT BACKSLASH CALL TTYC ; CALL 10$ ;DO 3 DIGITS CALL 10$ ; CALL 10$ ; MOV (SP)+,R1 ;DONE MOV (SP)+,R0 ; RETURN ; 10$: MOV #6,R0 ;"0"/8 ASL R1 ;MAKE DIGIT ROL R0 ; ASL R1 ; ROL R0 ; ASL R1 ; ROL R0 ; CALLR TTYC ;OUTPUT IT .END EDIT