GOTO INPTEND
ASK'YN:
R$="S": R3=1: R4=2: R5$="YN": CALL INPT: RETURN
!
! New INPT.BSI that supports VUE-like control characters
! Hytek Amplifier Inc / PO Box 670 / Joplin MO 64802
! Copyright (c) 1986 by Brad Horine. All Rights Reserved to Author.
!
! Notes: This routine exits with "protected fields enabled". If your
! application does not disable protected fields before exiting,
! your CRT screen may behave strangely (no scrolling, unable to
! move cursor into "dim" areas, etc.) Issuing a clear-screen
! command will also disable protected fields on most CRTs.
!
! See accompanying INPT.MAP file for variable useage. Note
! that all variable names are in the format Rn or Rn$, and that
! all labels begin with INPT. It may be wise to refrain from
! using these variables within your application program.
!
! See accompanying file INPT.DOC for actions performed by
! keyboard control characters, and for theory of operation,
! explanations, and other necessary, boring stuff.
!
! This routine assumes an 80-column CRT. If your CRT supports
! 132 columns, and you wish to begin an input field past
! column 99 of the CRT, you will need to use the 'longhand'
! method of specifying the coordinates (ie, R$="S": R1=102:
! R2=18: R3=15 instead of R$="S,102,18,15".)
!
INPT:
IF LEN(R$) > 1 THEN &
R1 = VAL(R$[3;2]) : R2 = VAL(R$[6;2]) : &
R3 = VAL(R$[9;2]) : R$ = R$[1;1] ! handle long format of R$
!
IF R9$ = "" THEN GOTO INPT6 ! bypass if no prompt
IF R9 = 0 OR R10 = 0 THEN &
R9 = 1 : R10 = 24 ! setup prompt coords
PRINT TAB(R10,R9); R9$; ! display prompt
INPT6:
!
PRINT TAB(-1,14); ! disable protected fields
CALL INPT2 ! get input
!
IF R12 THEN R8$ = R6$ + SPACE(R3) ! handle defualt input
!
IF R$="N" THEN GOTO INPT1 ! branch if numeric input
!
IF R3 > 1 OR R5$ = "" THEN GOTO INPT9 ! if not single char, pad
! with blanks and go to
! final processing
IF R8$ = "END" THEN GOTO INPT9
IF INSTR(1,R5$[1;R4],R8$[1;1]) &
THEN GOTO INPT9 ! if ok, do final procs
PRINT CHR(7);: GOTO INPT ! else redo
!
INPT1: ! Numeric entry processing
IF R8$ = "END" THEN GOTO INPT9 ! if numeric and "END" then
! go to final processing
! Check for invalid numeric characters
R7 = 1
INPT7:
IF INSTR(1," 0123456789.,-",R8$[R7;1]) = 0 &
THEN PRINT CHR(7);: GOTO INPT ! if invalid chars in
! numeric then retry
IF R7 < R13 THEN &
R7 = R7 + 1 : GOTO INPT7 ! test next char
!
INPT8: ! Filter out any commas
R0 = INSTR(1,R8$,",") ! find next comma
IF R0 = 0 THEN GOTO INPT8A ! but forget it if none
IF R0 = R3 THEN R8$[R3;1] = " " ELSE &
R8$[R0,R3-1] = R8$[R0+1,R3] : &
R8$[R3;1] = " " : GOTO INPT8 ! delete comma if found
INPT8A:
! Process decimal positioning
IF INSTR(1,R8$,".") THEN &
R8 = VAL(R8$): GOTO INPT3 ! if explicit decimal then
! bypass "." processing
XCALL STRIP, R3$
R11 = INSTR(1,R3$,".") ! find "." in mask
IF R11 = 0 THEN R8 = VAL(R8$): &
GOTO INPT3 ! bypass if none
IF R3$[-1;1] = "-" THEN R11 = R11 + 1 ! ajdust for trailing sign
R8 = VAL(R8$) / 10^(LEN(R3$)-R11) ! adjust decimal in R8
IF R8 < R5 OR R8 > R6 THEN &
PRINT CHR(7);: GOTO INPT ! if < min or > max then
! start over
!
INPT3:
IF R8$ <> "" THEN R8$ = R8 USING R3$ ! reassign R8$ to formatted
! result unless null
!
INPT9: ! Final processing & return to calling program
IF R8$ <> "" AND R8$ <> "END" &
THEN R8$ = R8$[1;R3] ! chop R8$ to proper length
PRINT TAB(R2,R1); R8$[1;R3]; ! print final value
IF R9$ <> " " THEN &
PRINT TAB(R10,R9); SPACE(LEN(R9$)); ! clear prompt
R3$ = "" : R4 = 0 : R5$ = "" ! reset all control
R5 = 0 : R6 = 0 : R6$ = "" : R9$ = "" ! variables to
R9 = 0 : R10 = 0 : R11 = 0 ! zero & nulls
PRINT TAB(-1,13); ! reenable protected fields
RETURN ! string in R8$, number in R8
!
!
INPTPOS: ! Position cursor on CRT
PRINT TAB(R2,R1+R7-1);
GOTO INPT0
!
! Actual keyboard input routines
! Text and control characters are handled here
!
INPT2:
! Fall-through to ^Z first time through to
! display default
!
INPTZ: ! ^Z -- Erase input & start over
R4$ = R6$: XCALL STRIP, R4$ ! remove trailing blanks
PRINT TAB(R2,R1); TAB(-1,11); R4$[1;R3];! and print default
IF LEN(R4$) < R3 THEN PRINT R7$[LEN(R4$)+1,R3];
PRINT TAB(-1,12); ! value in dim video,
! padded with _'s
PRINT TAB(R2,R1); ! reposition cursor
R8$ = SPACE(R3) : R7 = 1 : R12 = -1 ! initialize variables
R13 = 0 : R8 = 0
!
INPTB: ! all
INPTC: ! of
INPTG: ! these
INPTP: ! control
INPTT: ! chars
INPT28: ! are to
INPT29: ! be
INPT31: ! ignored
INPT0:
XCALL GET, R0$: R0 = ASC(R0$) ! get a char from keybd
IF R0 = 0 THEN GOTO INPT0 ! ignore if null
IF R12 AND R0 <> 24 AND R0 <> 13 THEN &
PRINT TAB(R2,R1); R7$[1;R3]; TAB(R2,R1);: &
R12 = 0 ! disable ^X if not ^X
IF R0 < 31 THEN GOTO INPT4 ! branch if ctrl char
IF R0 = 127 THEN GOTO INPT5 ! branch if DEL
!
IF R7 > R3 OR (R8 AND R3 = R13) &
THEN PRINT CHR(7);: GOTO INPT0 ! ignore if at max length
IF R8 THEN R8$[R7+1,R3] = R8$[R7,R3-1] ! if ^Q on, move chars up one
R8$[R7;1] = R0$ : R7 = R7 + 1 ! assign char & incr pointer
PRINT R0$; ! print char
IF R8 THEN R13 = R13 + 1 &
ELSE R13 = R13 MAX (R7 - 1) ! adj length
IF R8 AND R13 <> R7 - 1 &
THEN PRINT R8$[R7,R13];: &
GOTO INPTPOS ! if ^Q on, print remainder
! of line & reposn cursor
GOTO INPT0 ! get another char
!
!
INPT5: ! Handle <DEL>
IF R7 = 1 THEN GOTO INPT0 ! ignore if beg of line
IF R7 = R13 + 1 THEN R0$ = R7$[1;1] : R13 = R13 - 1 &
ELSE R0$ = " " ! get replacement char and
! adj len if at end
R7 = R7 - 1 : R8$[R7;1] = " " ! replace char with blank
PRINT CHR(8); R0$; CHR(8); ! clean up CRT
GOTO INPT0 ! get another char
!
!
INPT4: ! Handle control chars 1-31
ON R0 GOTO INPTA, INPTB, INPTC, INPTD, INPTE, INPTF, INPTG, INPTH, &
INPTI, INPTJ, INPTK, INPTL, INPTM, INPTN, INPTO, INPTP, &
INPTQ, INPTR, INPTS, INPTT, INPTU, INPTV, INPTW, INPTX, &
INPTY, INPTZ, INPT27, INPT28, INPT29, INPT30, INPT31
GOTO INPT0
!
INPTA: ! ^A - Beginning of Word
IF R7 = 1 THEN GOTO INPT0 ! ignore if beg of line
INPTA2:
IF R7 = 2 THEN R7 = 1 : GOTO INPTPOS ! if pos=2 then pos=1
R7 = R7 - 1
IF R8$[R7-1;1] = " " AND R8$[R7;1] <> " " &
THEN GOTO INPTPOS ! if prev char blank then
! this is it
GOTO INPTA2 ! else backup & try again
!
INPTD: ! ^D -- Delete char at cursor
R8$[R7,R3-1] = R8$[R7+1,R3] ! move chars down one
R8$[R13;1] = " " ! blank out end char
GOTO INPTR ! fix CRT display
!
INPTE: ! ^E -- Cursor to end of line
INPTN: ! ^N -- Cursor to end of line
R7 = R13 + 1 ! cursor to last + 1
GOTO INPTPOS ! position cursor on CRT
!
INPTF: ! ^F -- Insert space at cursor
IF R13 = R3 THEN PRINT CHR(7): &
GOTO INPT0 ! ignore if line is full
R8$[R7+1,R3] = R8$[R7,R3-1] ! move chars up one
R8$[R7;1] = " " ! blank this char
R13 = R13 + 1 ! increase max
GOTO INPTR ! fix CRT display
!
INPTH: ! ^H -- Cursor left one char
IF R7 = 1 AND R13 = 0 THEN R8$ = "END": &
RETURN ! if cursor was at 1,
! then return "END"
IF R7 = 1 THEN GOTO INPT0 ! ignore if beg of line
R7 = R7 - 1 : PRINT CHR(8); ! move cursor back
GOTO INPT0 ! thats it
!
INPTI: ! ^I -- Cursor to beg of next word
INPTW: ! ^W -- Cursor to beg of next word
IF R7 => R13 THEN GOTO INPT0 ! ignore if end of line
IF R8$[R7;1] = " " THEN GOTO INPTW2
R0 = INSTR(R7,R8$," ") ! locate next blank
IF R0 = 0 THEN GOTO INPTN &
ELSE R7 = R0 ! if no blank, end of line
! else set cursor to blank
INPTW2:
R7 = R7 + 1 ! increment char
IF R7 => R13 THEN GOTO INPTN ! stop if end of line
IF R8$[R7;1] <> " " THEN GOTO INPTPOS &
ELSE GOTO INPTW2 ! if non-blank then stop
! else loop back
!
INPTJ: ! ^J -- Fold character to lower case
R8$[R7;1] = LCS(R8$[R7;1]) ! fold character
PRINT R8$[R7;1]; CHR(8); ! display it
GOTO INPT0 ! thats it
!
INPTK: ! ^K -- Fold character to upper case
R8$[R7;1] = UCS(R8$[R7;1]) ! fold character
PRINT R8$[R7;1]; CHR(8); ! display it
GOTO INPT0 ! thats it
!
INPTL: ! ^L -- Move cursor right one char
IF R7 = R13 + 1 THEN GOTO INPT0 ! ignore if end of line
PRINT R8$[R7;1];: R7 = R7 + 1 ! print current char
GOTO INPT0 ! thats it
!
INPTM: ! ^M -- End input and return
RETURN ! return & do final procs
!
INPTO: ! ^O -- Delete blanks at & ahead of cursor
IF R8$[R7;1] <> " " THEN GOTO INPTR ! ignore if not blank
R8$[R7,R3-1] = R8$[R7+1,R3] ! move chars down one
R8$[R13;1] = " " : R13 = R13 - 1 ! blank last char
GOTO INPTO ! play it again sam
!
INPTQ: ! ^Q -- Toggle insert-char mode
IF R8 = -1 THEN R8 = 0 : GOTO INPTQ2 ! if on then turn off
IF R8 = 0 THEN R8 = -1 ! if off then turn on
INPTQ2:
PRINT CHR(7);: GOTO INPT0 ! ring bell & return
!
INPTR: ! ^R -- Retype current line
R4$ = R8$ : XCALL STRIP, R4$ ! strip trailing blanks
R13 = LEN(R4$) ! and reset max length
PRINT TAB(R2,R1); R8$[1;R13]; ! print current line
IF R13 <> R3 THEN PRINT R7$[R13+1,R3] ! and pad with _'s
R8 = 0 : GOTO INPTPOS ! thats it
!
INPTS: ! ^S -- Swap this char with following char
IF R7 = R13 THEN GOTO INPT0 ! ignore if end of line
R4$ = R8$[R7;1] : R8$[R7;1] = R8$[R7+1;1] : R8$[R7+1;1] = R4$
GOTO INPTR ! swap & redraw line
!
INPTU: ! ^U -- Cursor to position 1
INPT30: ! ^^ -- Cursor to position 1
R7 = 1 : GOTO INPTPOS ! point to pos 1
!
INPTV: ! ^V -- Delete this word (from cursor to next blank)
IF R7 = R13 THEN GOTO INPT0 ! ignore if end of line
R0 = INSTR(R7,R8$," ") ! find next blank
IF R0 = 0 THEN GOTO INPTY ! goto ^Y if appropriate
R8$[R7,R0] = SPACE(R0-R7+1) ! force data to blanks
GOTO INPTO ! and delete them
!
INPTX: ! ^X -- Accept displayed default and allow editing
IF NOT R12 THEN GOTO INPT0 ! ignore if any text input
! has occurred
R8$ = R6$ : R12 = 0 : GOTO INPTR ! assign default value &
! redisplay line
!
INPTY: ! ^Y -- Erase from cursor to end of line
IF R7 = R13 + 1 THEN GOTO INPT0 ! ignore if end of line
R8$[R7,R3] = SPACE(R3-R7+1) ! force data to blanks
GOTO INPTR ! and retype line
!
INPT27: ! <ESC> -- Force "END" into R8$ (like ^H at beg of line)
! Will force END at any point within line
R8$ = "END" : RETURN ! force END
!
INPTEND: