.TITLE EDI05 .IDENT /X01/ .NLIST BEX .ENABL LC ; ; EDITOR (TEMP FILE VERSION) ; ; VERSION X01 ; ; DAVID G. CONROY 10-APR-78 ; .GLOBL EDIT .GLOBL GETC .GLOBL TTYC .GLOBL TTYNL .GLOBL TTYNUM .GLOBL TTYSKP .GLOBL TTYSTR .MCALL CALL .MCALL CALLR .MCALL RETURN .MCALL OPNT$D .MCALL EXIT$S .MCALL GPRT$S .MCALL WTSE$S .MCALL DIR$ .MCALL QIO$ .MCALL FINIT$ ; ; 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,, A: QIO$ IO.ATT,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 OP: .WORD OB ;OUTPUT POINTER GMCR: .BYTE 127.,41. ;GMCR DIC, DPB SIZE IB: .BLKB 80. ;TTY INPUT BUFFER OB: .BLKB 80. ;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$ #A ;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. OPNT$D #TMP ;GET SCRATCH 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 OV ;YES, SET VERBOSE 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 OV ;VERBOSE 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 20$ ;NO MOV OP,R0 ;COMPUTE COUNT SUB #OB,R0 ; BNE 10$ ;NOT A NULL BUFFER MOVB #' ,OB ;PUT OUT 1 BLANK INC R0 ; 10$: MOV R0,O+Q.IOPL+2 ;SET INTO THE DPB DIR$ #O ;OUTPUT THE LINE WTSE$S #1 ; MOV #OB,OP ;WIND BACK THE POINTER BR 30$ ; 20$: CMP OP,#OB+80. ;AT THE END OF THE BUFFER BHIS 30$ ;YES, DISCARD MOVB R0,@OP ;SAVE THE CHARACTER INC OP ; 30$: MOV (SP)+,R0 ;RETURN RETURN ; .END EDIT