;*************************** AMUS Program Label ****************************** ; Filename: VUESCR.M68 Date: 12/13/90 ; Category: SBR Hash Code: 514-165-416-177 Version: 1.1(2) ; Initials: GR/AM Name: JAMES A. JARBOE IV ; Company: EDUCATIONAL FILMSTRIPS & VIDEO Telephone #: 4092955767 ; Related Files: VUESCR.BAS - a Basic program example to use vuescr ; Min. Op. Sys.: 1.3? Expertise Level: INT ; Special: Be sure to LNKLIT VUESCR to get externs ; Description: Basic subroutine to that works like VUE to edit data. ; ;***************************************************************************** ;**************************************************************************** ;* * ;* VUESCR.M68 * ;* * ;* Written By: James A. Jarboe IV * ;* 1401 19th Street * ;* Huntsville, TX 77340 * ;* 409-295-5767 * ;* * ;* 13-Dec-90 * ;* GR/AM * ;**************************************************************************** ; Description: A Basic subroutine that allows screen editing of a ; variable in a VUE-like fashion. ; Modified version of VUE.SBR by David F. Pallmann ; 1. Prints the mapped ARRAY on entry to VUESCR ; 2. Allows editing of mapped STRING in a VUE-like manner ; 3. Returns the STRING with EDIT changes made ; 4. Displays null data or unprintable data as low intensity *'s ; 5. Exits with an ESCAPE key ; ; Get: ; VUESCR.DOC - Documentation ; VUESCR.M68 - Assembly subroutine listing ; VUESCR.BAS - Basic program to demonstrate VUESCR.SBR ; VUESCR.INC - Help file used by VUESCR.RUN ; WINDOW.M68 - Draws boxes in VUESCR.RUN ; ; Notes: ; [102] 13-Dec-90 - Updated by JAJ/EVN ; Fixed ^F on last row (did not work). ; Made PRTTAB macro more efficient. ; ; [101] 31-Dec-88 - updated ; fixed ^D on last row & col ; fixed ^F on last row & col ; return value of ^T,^R in rtncde if there ; trap ^C ; took dependence off of CRT.UNV ; (below as requested by Steve Orange) ; added TAB to tab over 8 characters ; fixed ^N to stop on last char > space ; fixed ^E to end of file ; ; [100] 18-Sep-87 - original ; ; MAP1 array(rows), s, columns ; . . . ; XCALL VUESCR, array, rows, columns, startrow, startcol,rtncde ; ; Notes: ; If the 6th variable is not added (rtncde) then VUESCR will not ; return the value of ^R or ^T or exit the routine. ; If the 6th variable is added (rtncde) as a binary variable then ; ^T and ^R and ^] and ^C will exit the routine and return the ; value of the key pressed in the variable rtncde. ; ; ^C is now trapped and will not kill the basic program ; ; ; Be Sure and LNKLIT VUESCR OBJNAM VUESCR.SBR ASMMSG " " ASMMSG "( VUESCR.M68 )" ASMMSG "( By James A. Jarboe IV )" ASMMSG "( Be sure to )" ASMMSG "( LNKLIT VUESCR )" ASMMSG " " EXTERN $GTARG SEARCH SYS SEARCH SYSSYM SEARCH TRM VMAJOR =1 VMINOR =1 VEDIT =2. ; 13-Dec-90 by JAJ/EVN VSUB =0 VWHO =0 DEFINE PRTTAB AA,BB PUSH D1 MOVW #, D1 TCRT POP D1 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 .OFDEF XC.TY6,2 ;type code - arg 6 .OFDEF XC.AD6,4 ;abs addr - arg 6 .OFDEF XC.SZ6,4 ;size - arg 6 .OFSIZ XC.SIZ XC$UNF=0 XC$STR=2 XC$FLT=4 XC$BIN=6 .OFINI .OFDEF MAXROW,2 ; Maximum rows. .OFDEF MAXCOL,2 ; Maximum columns. .OFDEF ROWOFF,2 ; Row offset. .OFDEF COLOFF,2 ; Column offset. .OFDEF HOME,4 ; Beginning of array. .OFDEF RETFLG,2 ; Return flag. .OFSIZ MEMSIZ ; Size of impure area. ROW=D2 COL=D3 INDEX=A1 START: PHDR -1,0,PH$REE!PH$REU ;program header ARG.6: MOVW XC.ARG(A3),RETFLG(A4) ; Get number of arguments CMPW RETFLG(A4),#5. JEQ ARG.2 CMPW RETFLG(A4),#5. ; Must have 6 for rtncde JLT NOTENF ; Set not enough CMMW XC.TY6(A3),#6. ; Check for binary number JNE BINERR ; Tell binary error ARG.2: MOV #XC.TY2,D1 ;get second argument (# of rows) CALL $GTARG MOVW D1,MAXROW(A4) ARG.3: MOV #XC.TY3,D1 ;get third argument (# of columns) CALL $GTARG MOVW D1,MAXCOL(A4) ARG.4: MOV #XC.TY4,D1 ;get fourth arg (starting row) CALL $GTARG MOVW D1,ROWOFF(A4) ARG.5: MOV #XC.TY5,D1 ;get fifth arg (starting column) CALL $GTARG MOVW D1,COLOFF(A4) 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 SUBW #1,ROWOFF(A4) ; so startrow starts right SUBW #1,COLOFF(A4) ; so startcol starts right SETCRT: JOBIDX A0 MOV JOBTRM(A0),A0 ORW #T$IMI!T$ECS,T.STS(A0) PRTTAB -1.,29. 5$: MOVW #1,ROW ;clear row offset MOVW #1,COL ;clear column offset CLR D1 MOVW ROW,D1 ADDW ROWOFF(A4),D1 ROLW D1,#8. ADDW COL,D1 ADDW COLOFF(A4),D1 TCRT PUSH INDEX ; save index 10$: MOVB (INDEX)+,D1 AND #177,D1 ;mask to 7-bit ASCII CMPB D1,#37 ;printable char? BGE 20$ ; no CMPB D1,#200 ;printable char? BLE 20$ ; no ; If you don't like low intenstiy stars for unprintable characters ; then comment out the PRTTAB lines, and change the #'* to whatever ; character you wish to display instead of the unprintable character. ; PRTTAB -1.,11. ; low intensity MOVB #'*,D1 ; give it a start TTY ; ok printit PRTTAB -1.,12. ; normal print BR 25$ 20$: TTY ; print it. 25$: INC COL ; next column CMPW COL,MAXCOL(A4) ; are we at maxcolumn BLE 10$ ; no INC ROW ; yes..then next row MOV #1,COL ; set to column one CMPW ROW,MAXROW(A4) ; are we at maximum row BGT 30$ ; yes.. CALL FIGIDX CLR D1 MOVW ROW,D1 ADDW ROWOFF(A4),D1 ROLW D1,#8. ADDW COL,D1 ADDW COLOFF(A4),D1 TCRT BR 10$ 30$: POP INDEX PRTTAB -1.,28. MOVW #1,ROW MOVW #1,COL 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.I-JMPTBL ;^I (TAB) over 8 bytes [101] 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 CTRL.A-JMPTBL ; ^A WORD CTRL.W-JMPTBL ; ^W WORD CTRL.D-JMPTBL ; ^D WORD CTRL.E-JMPTBL ; ^E WORD CTRL.V-JMPTBL ; ^V WORD CTRL.Z-JMPTBL ; ^Z WORD CTRL.F-JMPTBL ; ^F WORD SNDCTL-JMPTBL ; ^T WORD SNDCTL-JMPTBL ; ^R WORD DEL-JMPTBL ; DEL WORD HME-JMPTBL ; ^^ WORD RETURN-JMPTBL ; BYTE 0 EVEN HME: MOV #1,COL ; column 1 MOV #1,ROW ; row 1 JMP GETIDX CTRL.A: CMPW COL,#1 BGT 20$ CMPW ROW,#1 JLE 99$ MOVW MAXCOL(A4),COL DEC ROW DEC INDEX BR 10$ 5$: JMP GETIDX 10$: CMPW COL,#1 BEQ 5$ CMMB @INDEX,#40 BNE 30$ 20$: DEC COL DEC INDEX PRTTAB -1,5. BR 10$ 30$: CMPW COL,#1 BEQ 5$ CMMB -1(INDEX),#40 JEQ 5$ DEC COL DEC INDEX PRTTAB -1,5. BR 30$ 99$: JMP GETIDX CTRL.D: MOV INDEX,A0 ; move index to A0 MOV COL,D0 ; move column to d0 CMPW COL,MAXCOL(A4) JEQ 20$ 10$: PUSH A0 INC A0 MOVB @A0,D1 POP A0 MOVB D1,@A0 TTY INC D0 INC A0 CMPW D0,MAXCOL(A4) BNE 10$ 20$: MOVB #40,D1 MOVB #40,@A0 TTY JMP GETIDX CTRL.F: CMPW ROW,MAXROW(A4) ; JHI GETIDX ; Fixes ^F on last row. [102] CMPW COL,MAXCOL(A4) ; Would zap screen without this[101] JGE GETIDX ; 5$: MOV INDEX,A0 ; move index to A0 MOV COL,D0 ; move column to d0 MOVB @A0,D1 PUSH D1 MOVB #40,@A0 MOVB #40,D1 TTY POP D1 PUSH D2 10$: INC A0 MOVB @A0,D2 MOVB D1,@A0 TTY MOVB D2,D1 INC D0 CMPW D0,MAXCOL(A4) BNE 10$ POP D2 JMP GETIDX DEL: MOV INDEX,A0 MOV COL,D0 MOVB #40,D1 MOVB #40,@A0 TTY CMPW COL,#1 BGT 10$ CMPW ROW,#1 JEQ ADRESS MOVW MAXCOL(A4),COL DEC ROW DEC INDEX JMP ADRESS 10$: DEC COL DEC INDEX PRTTAB -1,5. JMP ADRESS CTRL.E: MOVW MAXROW(A4),ROW MOVW MAXCOL(A4),COL CALL FIGIDX 10$: CMPB @INDEX,#32. BGE 30$ DEC INDEX DEC COL CMPB COL,#1 BGE 10$ MOVW MAXCOL(A4),COL DEC ROW BR 10$ 30$: JMP GETIDX CTRL.V: 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) JGT GETIDX ; CMMB @A0,#40 ;end of line? BNE 10$ ; no JMP GETIDX CTRL.Z: MOV #1,COL CALL FIGIDX CLR D1 MOVW ROW,D1 ADDW ROWOFF(A4),D1 ROLW D1,#8. ADDW COL,D1 ADDW COLOFF(A4),D1 TCRT MOV INDEX,A0 MOV COL,D0 MOVB #40,D1 10$: MOVB #40,(A0)+ TTY INC D0 CMPW D0,MAXCOL(A4) BLE 10$ JMP ADRESS 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 PRTTAB -1,5. JMP GETKEY CTRL.I: ADD #8.,COL CMPW COL,MAXCOL(A4) BLT 20$ CMPW ROW,MAXROW(A4) JNE 10$ MOV #8.,COL MOV #1,ROW JMP GETIDX 10$: MOV #8.,COL INC ROW JMP GETIDX 20$: ADD #8.,INDEX JMP GETIDX 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 PRTTAB -1,6. 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 SNDCTL: CMMW RETFLG(A4),#6. BEQ 10$ JMP GETIDX 10$: MOV XC.AD6(A3),A6 MOVW D1,@A6 JMP BACKTO CTRL.N: MOVW MAXCOL(A4),COL CALL FIGIDX BR 10$ 5$: CMPW COL,#1 JEQ GETIDX DEC COL DEC INDEX 10$: CMMB @INDEX,#40 BLE 5$ CMPW COL,MAXCOL(A4) BEQ 20$ INC COL INC INDEX 20$: JMP GETIDX CTRL.W: CMPW COL,MAXCOL(A4) BLT 10$ CMPW ROW,MAXROW(A4) JEQ 99$ MOVW #1.,COL INC ROW INC INDEX CMMB @INDEX,#40 BEQ 10$ JMP GETIDX 5$: CMPW COL,MAXCOL(A4) BEQ CTRL.W INC COL INC INDEX PRTTAB -1,6. 10$: CMMB @INDEX,#40 BNE 5$ 20$: CMPW COL,MAXCOL(A4) BEQ CTRL.W INC COL INC INDEX PRTTAB -1,6. CMMB @INDEX,#40 BEQ 20$ 99$: 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 FIGIDX: MOV ROW,D0 DEC D0 MUL D0,MAXCOL(A4) AND #177777,D0 ADD COL,D0 DEC D0 MOV HOME(A4),INDEX ADD D0,INDEX RTN GETIDX: CALL FIGIDX 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 'I-'@ ; ^I tab [101] BYTE 'L-'@ BYTE 'K-'@ BYTE 'J-'@ BYTE 'M-'@ BYTE 'U-'@ BYTE 'N-'@ BYTE 'Y-'@ BYTE 'A-'@ BYTE 'W-'@ BYTE 'D-'@ BYTE 'E-'@ BYTE 'V-'@ BYTE 'Z-'@ BYTE 'F-'@ BYTE 'T-'@ BYTE 'R-'@ BYTE 177 BYTE '^-'@ BYTE '[-'@ BYTE 0 EVEN CTRL.C: JOBIDX A0 MOVW #J.CCC,D7 COMW D7 ANDW D7,@A0 CMMW RETFLG(A4),#6. BNE BACKTO MOV XC.AD6(A3),A6 MOVW #3.,@A6 JMP BACKTO RETURN: CMMW RETFLG(A4),#6. BNE BACKTO MOV XC.AD6(A3),A6 MOVW #27.,@A6 BACKTO: JOBIDX A0 MOV JOBTRM(A0),A0 ANDW #^C,T.STS(A0) RTN NOTENF: PRTTAB 24.,1 MOVB #7,D1 TTY TYPE <%Not enough variables passed in VUESCR.SBR> RTN BINERR: PRTTAB 24.,1 MOVB #7,D1 TTY TYPE <%Variable #6 must be a binary variable in VUESCR.SBR> RTN END END .