;***************************************************************************; ; 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 ;universals SEARCH SYS SEARCH SYSSYM SEARCH TRM SEARCH MACLIB ;ASCII chars BS=10 TAB=11 LF=12 CR=15 ESC=33 DEL=177 ;XCALL offsets .OFINI .OFDEF XC.ARG,2 ;argument count .OFDEF XC.TY1,2 ;parameter string (type) .OFDEF XC.AD1,4 ;parameter string (addr) .OFDEF XC.SZ1,4 ;parameter string (size) .OFDEF XC.TY2,2 ;string variable (type) .OFDEF XC.AD2,4 ;string variable (addr) .OFDEF XC.SZ2,4 ;string variable (size) .OFDEF XC.TY3,2 ;return variable (type) .OFDEF XC.AD3,4 ;return variable (addr) .OFDEF XC.SZ3,4 ;return variable (size) .OFDEF XC.TY4,2 ;status line text (type) .OFDEF XC.AD4,4 ;status line text (addr) .OFDEF XC.SZ4,4 ;status line text (size) .OFSIZ XC.SIZ ;variable type codes XC$STR=2 XC$BIN=6 ;impure area .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 ;get data type from parameter string GETTYP: BYP MOVB (A2)+,D1 UCS LEA A0,TYPTBL MOV #-2,D0 10$: TSTB @A0 JEQ TYPERR ADD #2,D0 CMMB (A0)+,D1 BNE 10$ MOVW D0,TYPE(A4) RTN TYPTBL: ASCIZ /*A@IF$Y/ EVEN ;get min size from parameter string 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 ;**** ;INIT ;**** ;initialize storage INIT: MOV XC.AD3(A3),A6 ;index return code CLRW @A6 ;clear return code CLRW SIZE(A4) CLRW POS(A4) CLR FLAGS(A4) 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.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 ;index start of field POSBEG: CRT ROW(A4),COL(A4) MOV XC.AD2(A3),A2 BR GETCHR ;index end of field POSEND: MOVW ROW(A4),D1 ROLW D1,#8. ADDW COL(A4),D1 ADDW SIZE(A4),D1 TCRT MOVW SIZE(A4),POS(A4) MOV XC.AD2(A3),A2 ADDW SIZE(A4),A2 GETCHR: KBD ;get char 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 ;^^ CHRTBL: BYTE 'A-'@ ;^A BYTE 'B-'@ ;^B BYTE 'C-'@ ;^C BYTE 'D-'@ ;^D BYTE 'E-'@ ;^E BYTE 'F-'@ ;^F BYTE BS ;backspace BYTE TAB ;tab BYTE LF ;LF BYTE 'K-'@ ;^K BYTE 'L-'@ ;^L BYTE CR ;CR BYTE 'N-'@ ;^N BYTE 'R-'@ ;^R BYTE 'T-'@ ;^T BYTE 'U-'@ ;^U BYTE 'V-'@ ;^V BYTE 'W-'@ ;^W BYTE 'Y-'@ ;^Y BYTE 'Z-'@ ;^Z BYTE '\-'@ ;^\ BYTE ESC ;ESC BYTE '_ ;_ BYTE DEL ;DEL BYTE '^-'@ ;^^ BYTE 0 EVEN ;^A ;back word BCKWRD: TSTW POS(A4) JEQ GETCHR BR 20$ 10$: TSTW POS(A4) JEQ GETCHR CMMB @A2,#40 BNE 30$ 20$: CRT #5 DEC A2 DECW POS(A4) BR 10$ 30$: TSTW POS(A4) JEQ GETCHR CMMB -1(A2),#40 JEQ GETCHR CRT #5 DEC A2 DECW POS(A4) BR 30$ ;^F ;insert char INSCHR: CMMW SIZE(A4),MAXSIZ(A4) JEQ GETCHR CMMW POS(A4),SIZE(A4) JEQ GETCHR TYPESP CLR D0 MOVW SIZE(A4),D0 SUBW POS(A4),D0 SAVE A2 10$: MOVB (A2)+,D1 CALL TTY ; 101 SOB D0,10$ MOVW SIZE(A4),D0 SUBW POS(A4),D0 INC D0 MOV XC.AD2(A3),A2 ADDW SIZE(A4),A2 INC A2 20$: MOVB -(A2),1(A2) SOB D0,20$ REST A2 MOVB #40,@A2 INCW SIZE(A4) MOVW ROW(A4),D1 ROLW D1,#8. ADDW COL(A4),D1 ADDW POS(A4),D1 TCRT JMP GETCHR ;^H ;move back one char BCKCHR: TSTW POS(A4) JEQ GETCHR CRT #5 DECW POS(A4) DEC A2 JMP GETCHR ;^K ;back field BCKFLD: MOV XC.AD3(A3),A6 MOVW #2,@A6 JMP ENDFLD ;^I, TAB ;end screen TABSCR: MOV XC.AD3(A3),A6 MOVW #4,@A6 JMP CHKFLD ;^J, LF ;next field FWDFLD: MOV XC.AD3(A3),A6 MOVW #3,@A6 JMP CHKFLD ;^L ;forward char FWDCHR: CMMW POS(A4),SIZE(A4) JEQ GETCHR CRT #6 INCW POS(A4) INC A2 JMP GETCHR ;^M, CR ;end of field RETURN: MOV XC.AD3(A3),A6 CLRW @A6 ;check for valid end of field CHKFLD: CMMW POS(A4),MINSIZ(A4) JGE ENDFLD TSTW POS(A4) JNE GETCHR CMMW SIZE(A4),MINSIZ(A4) JGE ENDFLD BIT #F.REQ,FLAGS(A4) JEQ ENDFLD JMP GETCHR ;^U ;beginning of field BEGFLD: TSTW POS(A4) JEQ GETCHR CLRW POS(A4) MOV XC.AD2(A3),A2 CRT ROW(A4),COL(A4) JMP GETCHR ;^N ;end of field ENDLIN: CMMW POS(A4),SIZE(A4) JEQ GETCHR MOVW SIZE(A4),POS(A4) MOV XC.AD2(A3),A2 ADDW SIZE(A4),A2 MOVW ROW(A4),D1 ROLW D1,#8. ADDW COL(A4),D1 ADDW SIZE(A4),D1 TCRT JMP GETCHR ;^W ;forward word FWDWRD: ;CMMW POS(A4),SIZE(A4) ;JEQ GETCHR ;BR 20$ 10$: CMMW POS(A4),SIZE(A4) JEQ GETCHR CMMB @A2,#40 BEQ 30$ 20$: CRT #6 INC A2 INCW POS(A4) BR 10$ 30$: CMMW POS(A4),SIZE(A4) JEQ GETCHR CMMB @A2,#40 JNE GETCHR CRT #6 INC A2 INCW POS(A4) BR 30$ ;^Y ;delete to end of line DELEOL: TSTW SIZE(A4) JEQ GETCHR CLR D0 MOVW SIZE(A4),D0 SUBW POS(A4),D0 ;D0 := chars to right of cursor JEQ GETCHR ;nothing to delete MOVW POS(A4),SIZE(A4) CLRB @A2 CRT #11. CALL PADCHR ; 105 10$: TTY SOB D0,10$ CRT #12. MOVW ROW(A4),D1 ROLW D1,#8. ADDW COL(A4),D1 ADDW SIZE(A4),D1 TCRT JMP GETCHR ;^Z ;delete field DELFLD: CRT ROW(A4),COL(A4) CLRW POS(A4) CLRW SIZE(A4) MOV XC.AD2(A3),A2 CLR D0 MOVW MAXSIZ(A4),D0 CRT #11. CALL PADCHR ; 105 10$: TTY SOB D0,10$ CRT #12. CRT ROW(A4),COL(A4) JMP GETCHR ;^\ ;toggle namefold TOGGLE: TTYI BYTE 7,0 XOR #F.NAM,FLAGS(A4) JMP GETCHR ;^C CTRL.C: BIT #F.CTC,FLAGS(A4) JNE GETCHR MOV JOBCUR,A0 ORW #,JOBSTS(A0) BR ENDFLD ;^E ;End of file CTRL.E: MOV XC.AD3(A3),A6 MOVW #8.,@A6 JMP ENDFLD ;^^ ;HOME HOME: MOV XC.AD3(A3),A6 MOVW #9.,@A6 JMP ENDFLD ;^B ; New line CTRL.B: MOV XC.AD3(A3),A6 MOVW #7,@A6 JMP ENDFLD ;^T ; turn a page TRNPGE: MOV XC.AD3(A3),A6 MOVW #5,@A6 JMP CHKFLD ;^R ; return a page RTNPGE: MOV XC.AD3(A3),A6 MOVW #6,@A6 JMP CHKFLD ;ESC ;back screen ESCAPE: MOV XC.AD3(A3),A6 MOVW #1,@A6 ;end of field processing ENDFLD: ;TSTW POS(A4) 104 ;BNE 10$ 104 MOVW SIZE(A4),POS(A4) 10$: MOV JOBCUR,A0 MOV JOBTRM(A0),A0 ANDW #^C,T.STS(A0) CMMW POS(A4),MAXSIZ(A4) BEQ 20$ MOV XC.AD2(A3),A2 MOVW POS(A4),D7 ADDW D7,A2 CLRB @A2 20$: MOVW POS(A4),SIZE(A4) CMMW XC.ARG(A3),#4 ;status line specified? 103 ; BLT 30$ ; no 103 ; MOVW #-1_8.+41.,D1 ;status line 103 ; TCRT ; off 103 30$: RTN ; 103 ;^D, DEL ;delete char DELCHR: TSTW SIZE(A4) JEQ GETCHR CMMW POS(A4),SIZE(A4) BLT DELMID CRT #11. TTYI BYTE 10,0 CALL PADCHR TTY TTYI BYTE 10,0 CRT #12. DECW POS(A4) DECW SIZE(A4) DEC A2 JMP GETCHR ;delete char in middle of string DELMID: CLR D0 MOVW SIZE(A4),D0 SUBW POS(A4),D0 ; INC D0 SAVE A2 INC A2 10$: MOVB (A2)+,D1 CALL TTY ; 101 MOVB D1,-2(A2) SOB D0,10$ CRT #11. CALL PADCHR TTY CRT #12. REST A2 MOVW ROW(A4),D1 ROLW D1,#8. ADDW COL(A4),D1 ADDW POS(A4),D1 TCRT DECW SIZE(A4) JMP GETCHR PAGE ;check char against data type CHECK: CMPB D1,#40 JLT GETCHR CMPB D1,#125. JGT GETCHR TJMP TYPE(A4) OFFSET CHKSTR OFFSET CHKALF OFFSET CHKANM OFFSET CHKINT OFFSET CHKFLT OFFSET CHKAMT OFFSET CHKYNO ;string CHKSTR: CALL SPACE JEQ VALID JMP VALID ;alphabetic CHKALF: CALL SPACE JEQ VALID CALL ALPHA JEQ VALID JMP GETCHR ;alphanumeric CHKANM: CALL SPACE JEQ VALID CALL ALPHA JEQ VALID CALL NUMBER JEQ VALID JMP GETCHR ;integer CHKINT: CALL SPACE JEQ VALID CALL MINUS JEQ VALID CALL NUMBER JEQ VALID JMP GETCHR ;floating point CHKFLT: CALL MINUS JEQ VALID CALL NUMBER JEQ VALID JMP GETCHR ;dollar amount CHKAMT: CALL MINUS JEQ VALID CALL NUMBER JEQ VALID JMP GETCHR ;yes/no CHKYNO: CMPB D1,#'Y BEQ 10$ CMPB D1,#'N BEQ 10$ CMPB D1,#'y BEQ 10$ CMPB D1,#'n BEQ 10$ JMP GETCHR 10$: JMP VALID ;return Z=1 if alphabetic char ALPHA: CMPB D1,#'A BLT 10$ CMPB D1,#'z BGT 10$ CMPB D1,#'Z BLE 20$ CMPB D1,#'a BGE 20$ 10$: LCC #0 RTN 20$: LCC #4 RTN ;return Z=1 if numeric char NUMBER: CMPB D1,#'0 BLT 20$ CMPB D1,#'9 BGT 20$ 10$: LCC #4 RTN 20$: LCC #0 RTN ;return Z=1 if char is a space, and F.NSP is not set SPACE: CMPB D1,#40 BNE 20$ BIT #F.NSP,FLAGS(A4) BNE 20$ 10$: LCC #4 RTN 20$: LCC #0 RTN ;return Z=1 if char is a minus, and F.NEG set MINUS: CMPB D1,#'- BNE 20$ BIT #F.NEG,FLAGS(A4) BEQ 20$ TSTW POS(A4) BNE 20$ 10$: LCC #4 RTN 20$: LCC #0 RTN 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 CHKNAM: BIT #F.NAM,FLAGS(A4) REQ TSTW POS(A4) BEQ 10$ CMMB -1(A2),#40 RNE 10$: UCS RTN PAGE ;****** ;REDISP ;****** ;redisplay field after edit REDISP: CRT #12. CMMW TYPE(A4),#T.AMT ;amount field? BEQ DISAMT ; yes - right justify field CLR D0 MOVW MAXSIZ(A4),D0 SUBW SIZE(A4),D0 RTN REQ MOVW SIZE(A4),D7 ADDW D7,COL(A4) CRT ROW(A4),COL(A4) MOV #40,D1 10$: TTY SOB D0,10$ RTN ;Dollar-amount fields are displayed right-justified, and formatted w/a ;decimal point and a dollar sign DISAMT: CRT ROW(A4),COL(A4) CRT #5 CRT #5 CLR D0 MOVW MAXSIZ(A4),D0 SUBW SIZE(A4),D0 BEQ 20$ MOV #40,D1 10$: TTY SOB D0,10$ 20$: TYPE $ MOVW SIZE(A4),D0 BEQ 50$ MOV XC.AD2(A3),A2 30$: CMPB D0,#2 BNE 40$ TYPE . 40$: MOVB (A2)+,D1 CALL TTY ; 101 SOB D0,30$ 50$: RTN TTY: BIT #F.CHR,FLAGS(A4) BNE 20$ BIT #F.PSW,FLAGS(A4) BNE 10$ TTY RTN 10$: TYPE $ 20$: RTN PADCHR: BIT #F.UND,FLAGS(A4) BEQ 10$ MOV #40,D1 RTN 10$: MOV #' ,D1 RTN PAGE DEFINE ERROR TEXT TYPE JMP ABORT ENDM ARGERR: ERROR improper number of arguments VARERR: ERROR argument type error SIZERR: ERROR argument size error MISERR: ERROR missing numeric parameter TYPERR: ERROR invalid field type ABORT: TYPECR < in EDIT.SBR> OR #F.ERR,FLAGS(A4) MOV JOBCUR,A6 ORW #J.CCC,JOBSTS(A6) RTN END .