; VUE.SBR by David F. Pallmann ; screen editing routine ; ; MAP1 array(rows), s, columns ; . . . ; XCALL VUE, array, rows, columns, start-row, end-row OBJNAM VUE.SBR EXTERN $GTARG SEARCH SYS SEARCH SYSSYM SEARCH TRM SEARCH CRT DEFINE PRINT X TYPESP X = MOV X,D1 DCVT 0,OT$TRM CRLF ENDM .OFINI .OFDEF XC.ARG,2 ;number of arguments .OFDEF XC.TY1,2 ;type code - arg 1 .OFDEF XC.AD1,4 ;abs addr - arg 1 .OFDEF XC.SZ1,4 ;size - arg 1 .OFDEF XC.TY2,2 ;type code - arg 2 .OFDEF XC.AD2,4 ;abs addr - arg 2 .OFDEF XC.SZ2,4 ;size - arg 2 .OFDEF XC.TY3,2 ;type code - arg 3 .OFDEF XC.AD3,4 ;abs addr - arg 3 .OFDEF XC.SZ3,4 ;size - arg 3 .OFDEF XC.TY4,2 ;type code - arg 4 .OFDEF XC.AD4,4 ;abs addr - arg 4 .OFDEF XC.SZ4,4 ;size - arg 4 .OFDEF XC.TY5,2 ;type code - arg 5 .OFDEF XC.AD5,4 ;abs addr - arg 5 .OFDEF XC.SZ5,4 ;size - arg 5 .OFSIZ XC.SIZ XC$UNF=0 XC$STR=2 XC$FLT=4 XC$BIN=6 .OFINI .OFDEF MAXROW,2 .OFDEF MAXCOL,2 .OFDEF ROWOFF,2 .OFDEF COLOFF,2 .OFDEF HOME,4 .OFSIZ MEMSIZ ROW=D2 COL=D3 INDEX=A1 START: PHDR -1,0,PH$REE!PH$REU ;program header ARG.2: MOV #XC.TY2,D1 ;get second argument (# of rows) CALL $GTARG MOVW D1,MAXROW(A4) ;set max row D5 ARG.3: MOV #XC.TY3,D1 ;get third argument (# of columns) CALL $GTARG MOVW D1,MAXCOL(A4) ;set max column D4 ARG.4: MOV #XC.TY4,D1 ;get fourth arg (starting row) CALL $GTARG MOVW D1,ROWOFF(A4) ;set max row D5 ARG.5: MOV #XC.TY5,D1 ;get fifth arg (starting column) CALL $GTARG MOVW D1,COLOFF(A4) ;set max column D4 ARG.1: MOV XC.AD1(A3),HOME(A4) ;set home index A5 SETUP: MOV HOME(A4),INDEX ;set editing index (home) MOV #1,ROW ;clear row offset MOV #1,COL ;clear column offset SETCRT: JOBIDX A0 MOV JOBTRM(A0),A0 ORW #T$IMI!T$ECS,T.STS(A0) POSCUR: JMP ADRESS ;position cursor GETKEY: KBD CTRL.C ;get char (branch on ^C) AND #177,D1 ;mask to 7-bit ASCII CMPB D1,#40 ;printable char? BLT CONTRL ; no CMPB D1,#177 ;printable char? BGE CONTRL ; no TEXT: TTY MOVB D1,(INDEX)+ ;store char, increment index INC COL CMPW COL,MAXCOL(A4) BLE GETKEY INC ROW MOV #1,COL CMPW ROW,MAXROW(A4) JLE GETIDX MOV #1,ROW JMP GETIDX CONTRL: LEA A0,CMDTBL MOV #-2,D0 10$: TSTB @A0 BEQ GETKEY ADD #2,D0 CMMB (A0)+,D1 BNE 10$ MOVW JMPTBL[~D0],D0 JMP JMPTBL[~D0] JMPTBL: WORD CTRL.H-JMPTBL ;^H (BACKSPACE, LEFT-ARROW) WORD CTRL.L-JMPTBL ;^L (RIGHT ARROW) WORD CTRL.K-JMPTBL ;^K (UP-ARROW) WORD CTRL.J-JMPTBL ;^J (LINE FEED, DOWN-ARROW) WORD CTRL.M-JMPTBL ;^M (RETURN) WORD CTRL.U-JMPTBL ;^U WORD CTRL.N-JMPTBL ;^N WORD CTRL.Y-JMPTBL ;^Y WORD RETURN-JMPTBL ; 0 CTRL.H: CMPW COL,#1 BGT 10$ CMPW ROW,#1 JLE GETKEY MOVW MAXCOL(A4),COL DEC ROW JMP GETIDX 10$: DEC COL DEC INDEX LEFT JMP GETKEY CTRL.L: CMPW COL,MAXCOL(A4) BLT 10$ CMPW ROW,MAXROW(A4) JGE GETKEY MOV #1,COL INC ROW JMP GETIDX 10$: INC COL INC INDEX RIGHT JMP GETKEY CTRL.K: CMPW ROW,#1 JLE GETKEY DEC ROW JMP GETIDX CTRL.J: CMPW ROW,MAXROW(A4) JGE GETKEY INC ROW JMP GETIDX CTRL.M: MOV #1,COL CMPW ROW,MAXROW(A4) JGE GETIDX INC ROW JMP GETIDX CTRL.U: MOV #1,COL JMP GETIDX CTRL.N: MOVW MAXCOL(A4),COL JMP GETIDX CTRL.Y: MOV INDEX,A0 MOV COL,D0 MOVB #40,D1 ;put space in D1 10$: MOVB #40,(A0)+ ;store space TTY ;print space INC D0 ;add one to temp. column!!! CMPW D0,MAXCOL(A4) ;end of line? BLE 10$ ; no JMP ADRESS ;re-address cursor and continue NOP ;Set INDEX using ROW, COL, MAXROW, MAXCOL GETIDX: MOV ROW,D0 DEC D0 MUL D0,MAXCOL(A4) AND #177777,D0 ADD COL,D0 DEC D0 MOV HOME(A4),INDEX ADD D0,INDEX ADRESS: CLR D1 MOVW ROW,D1 ADDW ROWOFF(A4),D1 ROLW D1,#8. ADDW COL,D1 ADDW COLOFF(A4),D1 TCRT JMP GETKEY CMDTBL: BYTE 'H-'@ BYTE 'L-'@ BYTE 'K-'@ BYTE 'J-'@ BYTE 'M-'@ BYTE 'U-'@ BYTE 'N-'@ BYTE 'Y-'@ BYTE '[-'@ BYTE 0 EVEN CTRL.C: RETURN: JOBIDX A0 MOV JOBTRM(A0),A0 ANDW #^C,T.STS(A0) RTN END .