home *** CD-ROM | disk | FTP | other *** search
- BINPUT.ML
-
- ;;==========================================================================
- ; NOTE:
- ; THE `|' VERTICAL BAR IS USED AS A CONTINUATION MARK.
- ; DOCUMENTATION ABREVIATIONS:
- ; S/L = STRING VARIABLE OR LITERAL ENCLOSED WITH DOUBLE QUOTES.
- ; N/L = NUMERIC VARIABLE OR LITERAL.
- ; S = STRING VARIABLE ONLY.
- ; N = NUMERIC VARIABLE ONLY.
- ; S/N = STRING OR NUMERIC VARIABLE.
- ;
- ==========================================================================
- ;**
- ::INPUT (Macro)
- ;** FUNCTION:
- ;** Standard Terminal Input Subroutine.
- ;** USAGE:
- ;** Twelve parameters required.
- ;** Calling:
- ;** [1] N/L - input order index.
- ;** [2] S - input/display buffer.
- ;** [3] N/L - cursor row to input-display on.
- ;** [4] N/L - cursor column to input-display on.
- ;** [5] N/L - maximum number of input characters.
- ;** [6] S/L - Editing method:
- ;** A - any printable character.
- ;** N - numbers & minus sign.
- ;** D - dates with verification.
- ;** Y - allows yes/no with conversion.
- ;** V - validate input using [10].
- ;** U - convert to upper case.
- ;** [7] S/L - allowable exit method:
- ;** E - <End> key = abort.
- ;** [8] S/L - display format, eg.`??/??/??'.
- ;** [9] S/L - default for [2] on carriage return.
- ;** [10] S/L - optional input editing feature:
- ;** R - required input if no default.
- ;** if [6] = "V" [10] must have
- ;** a valid string.
- ;** [11] S/L - lower limit for range of numeric input.
- ;** [12] S/L - upper limit for range of numeric input.
- ;** Returning:
- ;** [2] - has unformatted entry.
- ;** ABORTFLAG% - entry has been aborted if non-zero.
- ;** XFK% - if non-zero a cursor flag will be set
- ;** Cursor Flags:
- ;** XU.% - up arrow = prior field.
- ;** XD.% - down arrow = next field.
- ;**
- ;** EXAMPLE:
- ;** $input 1,a$,8,8,1,"Y","E","","Y","","",""
- ;** a$ ="1" if a `Y' or <CR> was entered.
- ;** NOTE:
- ;** Modes:
- ;** The variable ENTRYFLAG% controls the function mode.
- ;**
- ;** Input: ENTRYFLAG% = 1 : input from keyboard.
- ;** EDITFLAG% = 1 : edit - change the contents of [2].
- ;** : WHO% controls which item to edit,
- ;** the contents of [2] is formatted
- ;** and displayed on line 24.
- ;** Display: ENTRYFLAG% = 0 : display the contents of [2].
- ;**
- ;** This macro requires the _INPUT subroutine.
- ;**
- ;**
- MACRO INPUT
- Unless EDITFLAG%=1 And WHO%<>[1]
- XWH%=[1]|
- XEE$=[2]|
- XRW%=[3]|
- XCL%=[4]|
- XLG%=[5]|
- XTY$=[6]|
- XCT$=[7]|
- XFT$=[8]|
- XDF$=[9]|
- XOP$=[10]|
- XLW$=[11]|
- XHI$=[12]|
- Gosub _Input|
- If(ENTRYFLAG%=1)Then If((XAB%+XU.%)<>0)Then Return Else [2]=XEE$
- Endu
- ;**
- ;** Include _INPUT subroutine
- $$_INPUT
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::_INPUT (Subroutine)
- ;** FUNCTION:
- ;** Subroutine for support of the INPUT macro.
- ;**
- MACRO _INPUT
- Proc _Input
- XED%=EDITFLAG%
- Unless ENTRYFLAG%<>1
- Gosub _Input_1:If(XAB%<>0)Then Return
- XED%=Abs((XED%+XU.%+XD.%)<>0):If(XED%)Then WHO%=XWH%+(XU.%=1)+ABS(XD.%=1)
- EDITFLAG%=XED%
- Endu
- XTX$=XEE$:If(XTY$="Y")Then If(XEE$="1")Then XTX$="Y"Else XTX$="N"
- $DISPLAY XRW%,XCL%,XTX$,XFT$
- Endp
- Proc _Input_1
- XFK%=0|
- XU.%=0|
- XD.%=0|
- XAB%=0|
- XLN%=0|
- XH.!=Val(XHI$)|
- XL.!=Val(XLW$)
- Unless XED%=0 Or Len(XEE$)=0
- $DISPLAY 24,XCL%,XEE$,XFT$
- Endu
- XTX$=XEE$
- Unless Len(XEE$)=0
- XTX$="."+XEE$:While(Right$(XTX$,1)=" "):XTX$=Left$(XTX$,Len(XTX$)-1):Wend|
- XTX$=Mid$(XEE$,1,Len(XTX$)-1):XLN%=Len(XTX$)
- Endu
- If(Len(XTX$)<XLG%)Then XTX$=XTX$+String$(XLG%-Len(XTX$),176)
- XK$=XEE$:If(Len(XEE$)=0)Then XK$=Space$(XLG%)
- Gosub Locate_Input:Gosub _Input_2:ABORTFLAG%=XAB%
- If(XAB%)Then Return Else If(XLN%>0)Then XEE$=XK$
- XEE$=XEE$+Space$(XLG%-Len(XEE$))
- Endp
- Proc _Input_2
- XZ.%=0|
- XA.%=0|
- While XA.%+XAB%+XFK%=0
- Gosub _InKey
- When XFK%=0
- When XI.%=8 And XZ.%>0
- Print Chr$(29);Chr$(176);Chr$(29);|
- Mid$(XK$,XZ.%,1)=" "|
- XZ.%=XZ.%-1:XLN%=XLN%-1
- Else Unless XI.%<32 Or XI.%>126
- When XTY$="A" Or XI.%=45 Or (XI.%>47 And XI.%<58)
- Gosub _Input_3
- Else Unless Instr("UVY",XTY$)=0
- XI.$=Chr$(XI.%+(32*(XI.%>96 And XI.%<123)))
- When XTY$="V" And (Instr(XOP$,XI.$)=0)
- $MSG "Invalid Entry!"
- Else
- Gosub _Input_3
- Endw
- Else
- Beep
- Endw
- Else Unless XI.%<>13
- Gosub Test_Input
- Else
- Beep
- Endw
- Else
- When XFK%=79 And XCT$="E"
- XAB%=1
- Else
- FK%=XFK%
- Switch XFK%
- Case 82
- XFK%=0:X.$=Mid$(XK$,1,XZ.%)+" ":XLN%=XLN%+1|
- X.$=X.$+Mid$(XK$,XZ.%+1,XLG%):XK$=Mid$(X.$,1,XLG%)|
- Gosub New_Display
- Break
- Case 83
- XFK%=0:XK$=Mid$(XK$,1,XZ.%)+Mid$(XK$,XZ.%+2,XLG%)+" ":XLN%=XLN%-1|
- Gosub New_Display
- Break
- Case 72
- XZ.%=0:Gosub Test_Input:XU.%=XK.%
- Break
- Case 75
- XFK%=0:If(XZ.%>0)Then Print Chr$(29);:XZ.%=XZ.%-1:Else Beep
- Break
- Case 77
- XFK%=0:If(XZ.%<XLG%)Then Print Chr$(28);:XZ.%=XZ.%+1:Else Beep
- Break
- Case 80
- XZ.%=0:Gosub Test_Input:XD.%=XK.%
- Break
- Case FK%
- XFK%=0|
- Beep
- Endc
- Endw
- Endw
- Wend
- Endp
- Proc Locate_Input
- If(Len(XFT$)<XLG%)Then XFT%=XLG%-Len(XFT$) Else XFT%=1
- Locate XRW%,XCL%,0:Print Space$(Len(XFT$)+XFT%);:Locate XRW%,XCL%|
- Print XTX$;:Locate XRW%,XCL%
- Endp
- Proc Test_Input
- XK.%=1
- When XZ.%=0 And XOP$="R" And Len(XEE$)=0 And Len(XDF$)=0
- $MSG "Required Entry!"
- XK.%=0:XFK%=0
- Else
- Gosub _Input_4
- Endw
- Endp
- Proc New_Display
- XR.%=Csrlin:XC.%=Pos(0):Locate XRW%,XCL%,0:Print Space$(XLG%);|
- Locate XRW%,XCL%:Print Mid$(XK$,1,XLN%);String$(XLG%-XLN%,176);:Locate XR.%,XC.%
- Endp
- Proc _Input_3
- If(XZ.%+1<=XLG%)Then XZ.%=Pos(0)-XCL%+1:Print XI.$;:Mid$(XK$,XZ.%,1)=XI.$:Else Beep
- If(XZ.%>XLN%)Then XLN%=XZ.%
- Endp
- Proc _Input_4
- When XZ.%=0 And XED%=0 And Len(XDF$)>0
- XK$=XDF$:XZ.%=Len(XDF$)
- Endw
- XE!=Val(XK$)
- When XTY$="N" Or XTY$="#"
- XE.%=((XL.!<>0 And XE!<XL.!) Or (XH.!<>0 And XE!>XH.!))
- When XE.%<>0
- $MSG "Out of Range!"
- Else
- XA.%=1:If(XE!=0)Then XK$="00":XZ.%=2
- Endw
- Else
- When XTY$="Y"
- XA.%=1:If(XK$="Y" Or XK$="y")Then XK$="1"Else XK$="2"
- Else When XTY$="D"
- Unless Val(XK$)<>0
- X.$=Date$|
- XM$=Left$(X.$,2)|
- XD$=Mid$(X.$,4,2)|
- XY$=Right$(X.$,2)|
- XK$=XM$+XD$+XY$
- Endu
- XM%=Val(Left$(XK$,2))|
- XD%=Val(Mid$(XK$,3,2))|
- When XM%<1 Or XM%>12 Or XD%<1 Or XD%>31
- $MSG "Enter Date Format MMDDYY"
- Else
- XA.%=1
- Endw
- Else
- XA.%=1
- Endw
- Endw
- Unless XA.%+XFK%=0
- $MSG ""
- Locate 24,1:Print Space$(79);
- Endu
- Endp
- ;**
- ;** Here are additional supporting subroutines.
- $$_FORMAT
- $$_INKEY
- ENDM
- ;;==========================================================================
- ;**
- ::_INKEY (Subroutine)
- ;** FUNCTION:
- ;** Get keyboard input one character at a time.
- ;** USAGE:
- ;** Cursor should be positioned before calling.
- ;** The variable XI.% is returned as decimal value or zero
- ;** if control/function key was entered,
- ;** in which case the XFK% variable will be the decimal
- :** value of entry.
- ;** NOTE:
- ;** Basic's INKEY$ function is used to return input from keyboard.
- ;** Time display will be updated if the variable timeflag%
- ;** is non-zero.
- ;**
- MACRO _INKEY
- Proc _InKey
- ;* call the time display subroutine if non-zero.
- Unless timeflag%=0
- ;* the following three variables control time display only.
- XU%=0|
- XS%=0|
- Gosub _Time
- Endu
- ;* turn on block cursor
- Locate ,,1,0,13|
- XI.$=""|
- ;* loop here waiting for input and updating the time every second.
- While XI.$=""|
- If(timeflag%)Then XU%=XU%+1:If(XU%>GT.%)Then Gosub _Time:XU%=0
- XI.$=Inkey$
- Wend|
- XI.%=Asc(XI.$)|
- ;* return control or function key if first byte=null.
- If(XI.%=0)Then XFK%=Asc(Right$(XI.$,1)) Else XFK%=0
- Endp
- ;**
- ;** Include _TIME subroutine.
- $$_TIME
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::_TIME (Subroutine)
- ;** FUNCTION:
- ;** Display time-of-day.
- ;** USAGE:
- ;** The display location is controlled by the variables
- ;** T.r% (row) and T.c% (column).
- ;** T.r% and T.c% are set prior to calling.
- ;** NOTE:
- ;** GT.% is used by _INKEY to control update frequency.
- ;** GT.% = 60 - for interpreter.
- ;** GT.% = 1000 - for compiled.
- ;**
- MACRO _TIME
- Proc _Time
- XR.%=Csrlin|
- XC.%=Pos(0)|
- XT.$=Time$|
- XH.%=Val(Left$(XT.$,2))|
- XM.$=" am"
- Unless XH.%<12
- XM.$=" pm":XH%=XH.%+(12*(XH.%>12))|
- XT.$=Str$(XH%)+Right$(XT.$,Len(XT.$)-Len(Str$(XH.%))+1)|
- If(XH%=12)Then XM.$=" am"
- Endu
- Locate ,,0|
- Locate T.R%,T.C%|
- Print XT.$;XM.$;|
- Locate XR.%,XC.%,1|
- XS.%=Val(Right$(XT.$,2))|
- ;* adjust update frequency if compiled.
- GT.%=60+(940*ABS(XS.%-XS%=0 And XS%>0))|
- XS%=XS.%
- Endp
- ENDM
- ;;==========================================================================
- ;**
- ::MSG (Macro)
- ;** FUNCTION:
- ;** Display message on line 25 and ding the bell.
- ;** USAGE:
- ;** One parameter required.
- ;** [1] - S/L
- ;** EXAMPLE:
- ;** $msg "HELLO WORLD"
- ;** NOTE:
- ;** The current cursor location is saved and then restored after
- ;** message has been displayed.
- ;**
- MACRO MSG
- X.$=[1]:Gosub _MSG
- ;**
- ;** Include the _MSG subroutine.
- $$_MSG
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::_MSG (Subroutine)
- ;** FUNCTION: Subroutine for the MSG macro.
- ;**
- ;** NOTE:
- ;** If X.$ is NULL, line 25 is cleared.
- ;**
- MACRO _MSG
- Proc _MSG
- XR.%=Csrlin|
- XC.%=Pos(0)|
- Locate 25,1,0|
- Print Space$(79);:If Len(X.$)>0 Then Beep:Locate 25,1:Print X.$;
- Locate XR.%,XC.%
- Endp
- ENDM
- ;;==========================================================================
- ;**
- ::FORMAT (Macro)
- ;** FUNCTION:
- ;** Format a string using a format description.
- ;** USAGE:
- ;** Two parameters are required.
- ;** Calling:
- ;** [1] - S - containing characters to be formatted.
- ;** [2] - S/L - containing a format description.
- ;** Optional:
- ;** [3] - L - L = left justify
- ;** Returning:
- ;** [1] - formatted string.
- ;**
- ;** EXAMPLE:
- ;** $format NUMBER$,"###,###.##"
- ;** $format ACCOUNT$,"????-???",L
- ;**
- ;** NOTE:
- ;** Format description characters:
- ;** # - digit (0..9).
- ;** default to "0" if right of decimal point.
- ;** default to " " if left of decimal point.
- ;** Z - digit (0..9).
- ;** default to "0" always.
- ;** ? - wild card.
- ;** default to " " always.
- MACRO FORMAT
- XTF$=[1]:XFF$=[2]:XJ.$="[3]":Gosub _Format:[1]=XTF$
- ;** Include _FORMAT subroutine
- ;**
- $$_FORMAT
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::_FORMAT (Subroutine)
- ;** FUNCTION:
- ;** Supporting subroutine for FORMAT macro.
- ;**
- ;**
- MACRO _FORMAT
- Proc _Format
- Unless Len(XFF$)=0 Or Len(XTF$)=0
- XF1%=Len(XTF$)|
- XF2%=Len(XFF$)|
- XXF$=Space$(XF2%)|
- XF3%=Instr(XFF$,".")|
- XF4%=(XF3%>0 And Instr(XFF$,"#"))
- While XF2%+XF1%>0
- When XF2%>0
- XF.$=Mid$(XFF$,XF2%,1):XF.%=Instr("?#Z",XF.$)
- Unless XF.%=0
- When XF1%>0
- XF.$=Mid$(XTF$,XF1%,1)|
- If(XF.%>1 And Val(XF.$)=0 And XF.$<>"0")Then XF.$="0" Else XF1%=XF1%-1
- Else
- If(XF.%=3)Then XF.$="0"Else XF.$=" "
- Endw
- Endu
- If(XF.$=" " And XF4% And XF3%>0 And XF2%=>XF3%)Then XF.$="0"
- Mid$(XXF$,XF2%,1)=XF.$:XF2%=XF2%-1
- Else
- XXF$=Mid$(XTF$,XF1%,1)+XXF$:XF1%=XF1%-1
- Endw
- Wend
- While Left$(XXF$,1)=" " And XJ.$="L"
- XXF$=Right$(XXF$,Len(XXF$)-1)
- Wend
- XTF$=XXF$
- Endu
- Endp
- ENDM
- ;;==========================================================================
- ;**
- ::DISPLAY (Macro)
- ;** FUNCTION:
- ;** Display on CRT.
- ;** USAGE:
- ;** Three parameters are required.
- ;** One optional parameter.
- ;** Calling:
- ;** [1] - N/L - display row (1..24).
- ;** [2] - N/L - display column (1..80).
- ;** [3] - S/L - containing characters to be displayed.
- ;** [4] - S/L - optional format description.
- ;**
- ;** EXAMPLE:
- ;** $display 10,20,"HELLO WORLD"
- ;** $display RW.%,CL.%,SSN$,"???-??-????"
- ;** $display 11,25,TODAY$,"??/??/??"
- MACRO DISPLAY
- XD.$=[3]
- ;** if the [4] parameter is used
- $IF [4]
- ;** formatting is required.
- $FORMAT XD.$,[4]
- $END
- XR.%=[1]:XC.%=[2]
- Gosub _Display
- ;** Include _DISPLAY subroutine
- $$_DISPLAY
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::_DISPLAY (Subroutine)
- ;** FUNCTION:
- ;** Supporting subroutine for DISPLAY macro.
- ;**
- ;**
- MACRO _DISPLAY
- Proc _Display
- Locate XR.%,XC.%,0|
- Print Space$(Len(XD.$)+1);|
- Locate XR.%,XC.%|
- Print XD.$;
- Endp
- ENDM
- ;;==========================================================================
- ;**
- ::PROMPT (Macro)
- ;** FUNCTION:
- ;** Display a prompt on line 25 and get input from keyboard.
- ;** USAGE:
- ;** Two parameters required.
- ;** Two optional parameters.
- ;** Calling:
- ;** [1] - S/L - display message.
- ;** [2] - S/L - input validation string.
- ;** Returning:
- ;** Optional- [3] - N - index value of input in validation string.
- ;** Optional- [4] - S - input character.
- ;**
- ;** EXAMPLE:
- ;** $prompt "Any Change","YN",ask.%
- ;** ask.% = 1 if `Y' entered.
- ;** ask.% = 2 if `N' entered.
- ;** NOTE:
- ;** The current cursor location is saved and restored.
- ;**
- MACRO PROMPT
- $IF [3]
- PROMPT$=[1]:XX.$=[2]:Gosub _Prompt:[3]=XX.%
- $ELSE
- PROMPT$=[1]:XX.$=[2]:Gosub _Prompt
- $END
- $IF [4]
- [4]=XI.$
- $END
- ;** Include supporting subroutine.
- $$_PROMPT
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::_PROMPT (Subroutine)
- ;** FUNCTION:
- ;** Supporting subroutine for PROMPT macro.
- ;**
- MACRO _PROMPT
- Proc _Prompt
- XR.%=Csrlin|
- XC.%=Pos(0)|
- locate 25,1,0:Print PROMPT$;:Locate 25,Pos(0)+1,1,0,13:XI.$=""
- While(XI.$="")
- Gosub _InKey|
- XI.$=Chr$(XI.%+(32*(XI.%>96 And XI.%<123)))|
- XX.%=Instr(XX.$,XI.$)|
- If(Len(XX.$)>0)Then If(XX.%=0)Then Beep:XI.$=""
- Wend
- Locate 25,1,0|
- Print Space$(79);|
- Locate XR.%,XC.%
- Endp
- ;** Include supporting subroutine.
- $$_INKEY
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::FRAME (Macro)
- ;** FUNCTION:
- ;** Draws a block graphic frame on screen.
- ;** USAGE:
- ;** Four parameters required.
- ;** Calling:
- ;** [1] - N/L - top row (1..24).
- ;** [2] - N/L - bottom row (1..24).
- ;** [3] - N/L - left column (1..80).
- ;** [4] - N/L - right column (1..80).
- ;** EXAMPLE:
- ;** $frame 4,10,20,60
- ;** $frame TR%,BR%,LC%,RC%
- ;**
- MACRO FRAME
- X1.%=[1]:X2.%=[2]:X3.%=[3]:X4.%=[4]:Gosub _Frame
- ;** Include supporting subroutine.
- $$_FRAME
- ;**
- ENDM
- ;;==========================================================================
- ;**
- ::_FRAME (Subroutine)
- ;** FUNCTION:
- ;** Called by FRAME macro to do the work.
- ;**
- MACRO _FRAME
- Proc _Frame
- Locate X1.%,X3.%,0|
- Print Chr$(201);String$(X4.%-X3.%-1,205);Chr$(187);
- For X5.%=X1.%+1 To X2.%-1|
- Locate X5.%,X3.%:Print Chr$(186);:Locate X5.%,X4.%:Print Chr$(186);|
- Next
- Locate X2.%,X3.%|
- Print Chr$(200);String$(X4.%-X3.%-1,205);Chr$(188);
- Endp
- ENDM
- ;;==========================================================================
- ;**
- ::VIDEO (Macro)
- ;** FUNCTION:
- ;** Routine to get CRT memory offset for color or monochrome,
- ;** and reset screen and color, and clear screen.
- ;** Screen:
- ;** text mode.
- ;** color burst set non-zero (if color monitor).
- ;** active page zero.
- ;** visual page zero.
- ;** Width:
- ;** 80.
- ;** Color:
- ;** foreground = yellow (14).
- ;** background = blue (1).
- ;** border = blue (1).
- ;** Monochrome:
- ;** foreground = white (7).
- ;** background = black (0).
- ;** border = black (0).
- ;** USAGE:
- ;** No parameter required.
- ;** Returning:
- ;** VIDEO% - offset to CRT memory.
- ;** MONO% - true (-1) if monochrome.
- ;** ADPT% - true (-1) if color adapter.
- ;** FG.% - foreground: 7=monochrome, 14=color.
- ;** BG.% - background: 0=monochrome, 1=color.
- ;** BD.% - border: same as background (BG.%).
- ;** NOTE:
- ;** &HB000=monochrome offset, &HB800=Color offset.
- ;** If you call this more than once in a program,
- ;** you should change it to a procedure subroutine,
- ;** ie..(_VIDEO).
- ;**
- ;** **(DEF SEG is set to zero by VIDEO).
- ;**
- MACRO VIDEO
- Def Seg=0:VIDEO%=&HB000-(&H800*(((Peek(1040) And 48)/16)<3))|
- MONO%=((Peek(&H410) And &H30)=&H30)|
- ADPT%=Not MONO%|
- Screen 0,Abs(ADPT%),0,0|
- Width 80|
- FG.%=FG.%+(7*ABS(FG.%=0))|
- FG.%=(FG.%*(1+ABS(ADPT% And FG.%=7)))|
- BG.%=BG.%+(1*ABS(BG.%=0))|
- BG.%=(BG.%+(MONO%*ABS(BG.%=1)))|
- BD.%=BG.%|
- Color FG.%,BG.%,BD.%:Cls
- ENDM
- ;;==========================================================================
- ;**
- ::CRT (Macro)
- ;** FUNCTION:
- ;** Screen display.
- ;** USAGE:
- ;** Three parameters required.
- ;** [1] - N/L - screen row.
- ;** [2] - N/L - screen column.
- ;** [3] - S/L - display buffer.
- ;** [4] - L - optional reverse video.
- ;** EXAMPLE:
- ;** $crt 12,25,"HELP"
- ;** $crt RW.%,CL.%,HELP$,1
- ;**
- MACRO CRT
- $IF [4]
- Color BG.%,FG.%
- $END
- Locate [1],[2]:Print [3];
- $IF [5]
- Color FG.%,BG.%
- $END
- ENDM
- ;