;***************************************************************************;
; STUVUE.M68
; for use with STUVUE.BAS
; ;
; ORIGINALLY EDIT.M68 by David F. Pallmann ;
; CRT-oriented type-checked field input routine ;
; ;
; Author: David F. Pallmann ;
; Copyright (C) 1984 by LMS Technical Services, Inc. ;
; modified for STUVUE.M68 ;
; 22-may-86
; James A. Jarboe IV
;***************************************************************************;
;
; Calling Format--.
;
; XCALL STUVUE, "row col type minsiz maxsiz flags ", field, key
;
; Where--.
; row = CRT row (1-24)
; col = CRT column (1-80)
; type = one of the following--.
; * = string
; A = alphabetic
; @ = alphanumeric
; I = integer
; F = floating point
; $ = dollar amount
; Y = yes/no
; minsiz = minimum field size
; maxsiz = maximum field size
; flags = zero or more of the following--.
; R = required field
; A = automatic field
; U = upper-case field
; L = lower-case field
; F = folded field
; N = no blanks allowed
; - = leading minus allowed
; E = position at end of field
; T = trap ^Cs
; P = password field
;
; field = string variable to edit
; key = 2 byte binary return code--.
; 0 = standard end of field
; 1 = ESCape
; 2 = up-arrow (^K)
; 3 = down-arrow (^J)
; 4 = TAB
; 5 = ^T
; 6 = ^R
; 7 = ^B
; 8 = ^E
; 9 = ^^ (home)
; 1xx = function code xx
; 2xx = shifted function code xx
OBJNAM STUVUE.SBR
VMAJOR=1
;edit history
; VEDIT=0 ;22-Jun-84 DFP created from CRT.M68
VEDIT=1 ;22-May-86 JAJ modified for STUVUE
.OFINI
.OFDEF ROW,2 ;cursor row
.OFDEF COL,2 ;cursor column
.OFDEF TYPE,2 ;field type--.
T.STR=0 ; string
T.ALF=2 ; alphabetic
T.ANM=4 ; alphanumeric
T.INT=6 ; integer
T.FLT=10 ; floating point
T.AMT=12 ; dollar amount
T.YNO=14 ; yes/no
.OFDEF MINSIZ,2 ;min. field size
.OFDEF MAXSIZ,2 ;max. field size
.OFDEF FLAGS,4 ;flags--.
F.REQ=1 ; required field
F.AUT=2 ; automatic field
F.UCS=4 ; upper-case field
F.LCS=10 ; lower-case field
F.NAM=20 ; namefold field
F.NSP=40 ; spaces invalid
F.NEG=100 ; leading minus valid
F.END=200 ; position cursor at end of field
F.CTC=400 ; trap ^Cs 101
F.PSW=1000 ; password field 101
F.UND=20000
F.CHR=40000
F.ERR=100000 ; an error has occurred
.OFDEF SIZE,2 ;field size
.OFDEF POS,2 ;position within field
.OFSIZ IMPSIZ
PAGE
;entry point from AlphaBASIC
;A3 indexes argument list
ENTRY: PHDR -1,0,PH$REE!PH$REU ;program header
CALL INIT ;initialize storage
CALL CHKPRM ;check parameters
RNE ; errors
CALL DISFLD ;display field
CALL EDTFLD ;edit field
CALL REDISP ;re-display field
RTN ;return to BASIC
PAGE
;******
;CHKPRM
;******
;check paramters
CHKPRM: CALL CHKARG ;check argument types and sizes
CALL GETROW ;get row
CALL GETCOL ;get column
CALL GETTYP ;get data type
CALL GETMIN ;get min size
CALL GETMAX ;get max size
CALL GETFLG ;get flags
CALL GETSTS ;get status line
BIT #F.ERR,FLAGS(A4) ;set Z according to errors
RTN
;check types and sizes of arguments
CHKARG: CMMW XC.ARG(A3),#3 ;3 arguments (or more) present? 103
JLT ARGERR ; no - error 103
CMMW XC.TY1(A3),#XC$STR ;1st argument a string?
JNE VARERR ; no - error
CMMW XC.TY2(A3),#XC$STR ;2nd argument a string?
JNE VARERR ; no - error
CMMW XC.TY3(A3),#XC$BIN ;3rd argument binary?
JNE VARERR ; no - error
CMM XC.SZ3(A3),#2 ;3rd argument 2 bytes in length?
JNE SIZERR ; no - error
MOV XC.AD1(A3),A2 ;index parameter string
RTN
;get row from parameter string
GETROW: BYP
NUM
JNE MISERR
GTDEC
MOVW D1,ROW(A4)
RTN
;get column from parameter string
GETCOL: BYP
NUM
JNE MISERR
GTDEC
MOVW D1,COL(A4)
RTN
GETMIN: BYP
NUM
JNE MISERR
GTDEC
MOVW D1,MINSIZ(A4)
RTN
;get max size from parameter string
GETMAX: BYP
NUM
JNE MISERR
GTDEC
MOVW D1,MAXSIZ(A4)
RTN
;get flags from parameter string
GETFLG: BYP ;bypass leading spaces
10$: MOVB (A2)+,D1 ;get char
UCS ;fold to upper case
LEA A0,FLGTBL ;index flag table
MOV #1,D0 ;set bit flag
20$: TSTB @A0 ;end of table?
REQ ; yes - end of flag processing
CMMB (A0)+,D1 ;char match?
BEQ 30$ ; yes
ASL D0 ; no - shift to next bit
BR 20$ ;try again
30$: OR D0,FLAGS(A4) ;set bit flag
BR 10$ ;process next flag char
FLGTBL: ASCIZ /RAULFN-ETP/
EVEN
;get status line (if specified) 103
GETSTS: CMMW XC.ARG(A3),#4 ;status line specified? 103
BGE 10$ ; yes - branch 103
RTN ; no 103
10$: MOV XC.AD4(A3),A0 ; 103
MOV XC.SZ4(A3),D0 ; 103
MOVW #-1_8.+38.,D1 ;start 103
TCRT ; status line 103
20$: MOVB (A0)+,D1 ; 103
TTY ; 103
SOB D0,20$ ; 103
MOVW #-1_8.+39.,D1 ;end 103
TCRT ; status line 103
; MOVW #-1_8.+40.,D1 ;status line 103
; TCRT ; on 103
RTN
PAGE
;******
;DISFLD
;******
;display field for editing
DISFLD: CRT ROW(A4),COL(A4) ;position cursor at start of field
BIT #F.UND,FLAGS(A4) ; 105
BEQ 4$ ; 105
CRT #5 ; 105
CRT #30. ; 105
4$: CRT #12. ;high intensity
MOV XC.AD2(A3),A2 ;index start of buffer
CLR D0
MOVW MAXSIZ(A4),D0 ;D0 ::= max size
BEQ 40$ ;if zero return
10$: MOVB (A2)+,D1 ;get next char
BEQ 20$ ;branch if NUL
CALL TTY ;display char 101
INCW SIZE(A4) ;update size
SOB D0,10$ ;loop till all chars output
BR 40$ ;if full bufferm branch
20$:; CRT #11. ;low intensity
; CALL PADCHR ; 105
30$:; TTY ;output pad char
; SOB D0,30$ ;loop till full size displayed
40$: BIT #F.UND,FLAGS(A4) ; 105
BEQ 44$ ; 105
CRT #31. ; 105
44$: RTN ;return
PAGE
;******
;EDTFLD
;******
;edit field
EDTFLD: MOV JOBCUR,A0 ;index own JCB
MOV JOBTRM(A0),A0 ;index own TRMDEF block
ORW #<T$DAT!T$ECS>,T.STS(A0);set data mode, no echo
CRT #12. ;high intensity
BIT #F.END,FLAGS(A4) ;end-of-field bit set?
BNE POSEND ; yes - special processing
FKEY: CMPB D1,#'@ ;simulated function key?
BEQ SIMFKY ; yes
TSTB D1 ;function key sequence? 102
BPL CHKCTL ; no 102
CMPB D1,#240 ;shifted function key? 102
BHIS 10$ ; yes 102
SUB #28.,D1 ;unshifted keys return 100. up 102
BR 20$ ; 102
10$: SUB #<40+8.>,D1 ;shifted keys return 200. up 102
20$: MOV XC.AD3(A3),A6 ; yes - return code 102
MOVW D1,@A6 ; 102
JMP ENDFLD ; 102
SIMFKY: KBD
CMPB D1,#'1
BLE CHKCTL
AND #177,D1
SUBW #'1,D1
MOV XC.AD3(A3),A6
MOVW D1,@A6
JMP ENDFLD
CHKCTL: AND #177,D1 ;mask to 7-bit ASCII
BIT #F.CHR,FLAGS(A4) ;single char?
JNE VALID ; yes - valid
LEA A0,CHRTBL ;index char table
MOV #-2,D0 ;pre-set jump index
10$: TSTB @A0 ;end of table?
JEQ CHECK ; yes - process as a text char
ADD #2,D0 ;update jump index
CMMB (A0)+,D1 ;char match?
BNE 10$ ; no - try next char in table
TJMP D0 ; yes - branch on index
OFFSET BCKWRD ;^A - back word
OFFSET CTRL.B ;^B -
OFFSET CTRL.C ;^C - abort
OFFSET DELCHR ;^D - delete char
OFFSET CTRL.E ;^E
OFFSET INSCHR ;^F - insert char
OFFSET BCKCHR ;BS - char left
OFFSET TABSCR ;TAB - forward screen
OFFSET FWDFLD ;^J - forward field
OFFSET BCKFLD ;^K - back field
OFFSET FWDCHR ;^L - char right
OFFSET RETURN ;CR - end of field
OFFSET ENDLIN ;^N - end of field
OFFSET RTNPGE ;^R - same as ESC
OFFSET TRNPGE ;^T - same as TAB
OFFSET BEGFLD ;^U - beginning of field
OFFSET FWDFLD ;^V - forward field
OFFSET FWDWRD ;^W - forward word
OFFSET DELEOL ;^Y - delete to end of line
OFFSET DELFLD ;^Z - delete field
OFFSET TOGGLE ;^\ - namefold toggle
OFFSET ESCAPE ;ESC - back screen
OFFSET DELCHR ;_ - delete char
OFFSET DELCHR ;DEL - delete char
OFFSET HOME ;^^
PAGE
;character has been determined to be a valid text character for this field.
VALID: CMMW POS(A4),MAXSIZ(A4) ;is field full?
JGE GETCHR ; yes - must reject char
CALL CASE ;perform special case checking
CALL TTY ;display the char 101
MOVB D1,(A2)+ ;store the char
INCW POS(A4) ;update position
CMMW POS(A4),SIZE(A4) ;do we need to update size?
BLE 10$ ; no - get next char
INCW SIZE(A4) ; yes - update size
10$: BIT #F.CHR,FLAGS(A4) ;single char?
JNE RETURN ; yes
BIT #F.AUT,FLAGS(A4) ;automatic field?
JEQ GETCHR ; no - get next char
CMMW POS(A4),MAXSIZ(A4) ; yes - end of field?
JNE GETCHR ; no - get next char
JMP RETURN ; yes - end of edit
;special case fold checking
CASE: CALL CHKUCS ;check for upper case folding
CALL CHKLCS ;check for lower case folding
CALL CHKNAM ;check for namefolding
RTN
;if F.UCS set, fold to upper case
CHKUCS: BIT #F.UCS,FLAGS(A4)
REQ
UCS
RTN
;if F.LCS set, fold to lower case
CHKLCS: BIT #F.LCS,FLAGS(A4)
REQ
LCS
RTN
;if F.NAM set, fold chars at the beginnings of words to upper case