; 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           ;<ESC>
       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$IMI!T$ECS>,T.STS(A0)
       RTN

       END