;CMDMUN ; MUNGE UP COMMAND LINES TO HANDLE ESCAPE SEQUENCES. ; (ALSO CONVERT TO UPPER CASE) .TITLE CMDMUN .GLOBL CMDMUN ;PDP11 VERSION .PSECT IOLVL,D IOLVL: .WORD 0 ;LUN NUMBER FOR TTY INPUT .PSECT CMDM,I CMDMUN:: ;2(R5) ENTERS WITH ADDRESS OF STRING. ; KNOW STRING IS 128 CHARS LONG OR SO... ONLY MUNGE UP FIRST ; 120 .ENABLE LC MOV 2(R5),R0 ;GRAB ADDRESS OF STRING MOV R0,R1 CMPB #33,@R1 ;DOES THIS LINE START WITH ESCAPE? BEQ ESCSQ ;YES, HANDLE AS ESCAPE SEQUENCE CMPB #'%,@R1 ;GOT A % CHAR? BEQ PCNT MOV #120.,R2 ;COUNT CHARS MOV R1,R3 MOV R2,R4 ;CHECK FOR " CHARACTER AND CONVERT CASE ON ONLY 2 CHARS IF SEEN 77$: CMPB #'",(R3)+ BEQ 78$ ;IF WE SEE A DBL QUOTE, SKIP OUT DEC R4 BGT 77$ BR 1$ 78$: MOV #2,R2 ;CONVERT CASE ON 2 CHARS ONLY (POSSIBLE ED) 1$: CMPB @R1,#'a ;AT OR ABOVE L.C. A? BLO 2$ CMPB @R1,#'z ;and below z BHI 2$ BICB #40,@R1 ;CONVERT TO UPPER CASE 2$: INC R1 ;PASS THIS CHARACTER DEC R2 BGT 1$ ;LOOP OVER 1ST 80 CHARS (OUGHT TO BE ENOUGH) CMPB #'M,(R0) ;WAS IT A M COMMAND? (ALLOW M) BNE GENRT CMPB #33,1(R0) BNE 7$ INC R0 ;GO TRY TO RECOGNIZE THE ESC SEQ. BR ESCSQ 7$: BR GENRT ESCSQ: ;HANDLE ESCAPE SEQUENCES HERE. ; CONVERT AS FOLLOWS: ; ESC A OR ESC [ A BECOMES 1 ; ESC B OR ESC [ B BECOMES 2 ; ESC C OR ESC [ C BECOMES 3 ; ESC D OR ESC [ D BECOMES 4 ; ESC Q OR ESC O Q BECOMES H (HELP) ; THUS IF 2ND CHAR IS ? OR O IGNORE, GET 3RD. MOVB 1(R0),R2 ;GET 2ND CHAR CMPB R2,#'? BEQ 3$ CMPB R2,#'O BEQ 3$ CMPB R2,#'[ BEQ 3$ BR 4$ 3$: MOVB 2(R0),R2 4$: CMPB R2,#'Q ;PF2 KEY (HELP)? BNE 5$ ;GENERATE HELP COMMAND MOVB #'H,@R0 ;FILL IN HELP CMD BR GENRT 5$: CMPB R2,#'P BLT 77$ CMPB R2,#'S BGT 77$ ;R2 IS P,Q,R, OR S ; ON PF1 THRU PF4 (EXCEPT PF2 HANDLED ABOVE) ; GENERATE INDIRECT CALLS TO INDIRECT FILES KYP.CMD THRU KYS.CMD ;(SORT OF A HACK BUT ALLOWS LOCAL IMPLEMENTATION OF THOSE KEYS) MOVB #100,(R0)+ ;STASH @KYP THRU @KYS MOVB #'K,(R0)+ MOVB #'Y,(R0)+ MOVB R2,(R0)+ MOVB #'.,(R0)+ MOVB #'C,(R0)+ MOVB #'M,(R0)+ MOVB #'D,(R0)+ CLRB @R0 BR GENRT 77$: SUB #'A,R2 ;ADJUST TO 0-3 RANGE BLT GENRT ;IF NEGATIVE, IGNORE... ILLEGAL CMPB R2,#3 ;SEE IF TOO LARGE BGT GENRT CMPB R2,#3 BNE 10$ ;SAW 3 (=D). MAKE 2 ;ESC D = LEFTARROW (CMD 3) MOV #2,R2 BR 12$ 10$: CMPB R2,#2 BNE 12$ ;SAW 2, MAKE 3 ;ESC C = RIGHTARROW (CMD 4) MOV #3,R2 ;INVERT 2 AND 3 TO CORRESPOND TO CMDS ; BR 12$ 12$: ADD #61,R2 ;MAKE IT ASCII 1 TO 4 MOVB R2,@R0 ;STASH AS COMMAND AND LEAVE. GENRT: RTS PC ; HANDLE PERCENT CHARS PCNT: RTS PC .END