home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AMOS PD CD
/
amospdcd.iso
/
326-350
/
apd345
/
evaluator.amos
/
evaluator.amosSourceCode
< prev
next >
Wrap
AMOS Source Code
|
1992-09-02
|
80KB
|
2,693 lines
'
Rem *** Evaluator1200 ***
Rem *** Bill Currie 1991/93 ***
'
Set Buffer 20
Hot Spot 2,8,5
Change Mouse 5
'
Global F$
'
Dim LQZ$(200),MITQZ$(70)
Global LQZ$(),FLEQZ$,MITQZ$(),LLQZ$
Global DRECTORYQZ$,MESSAGE1QZ$,MESSAGE2QZ$
Global NQZ,XQZ,IQZ,CRQZ
CRQZ=0
'
Rem ** End **
'
'
Rem AMOS copyright notice
AMOSC
Procedure AMOSC
Screen Open 0,320,256,32,Lowres
Curs Off : Paper 0 : Cls 0 : Print
Get Icon Palette
Locate 0,1
Centre ">>> Program by Bill Currie <<<"
Flash Off : Colour 3,$FF0
Pen 3 : Ink 3 : Box 50,40 To 270,150
Locate 0,11
Centre Border$("Evaluator",1)
Ink 0 : Pen 2
Paste Icon 230,20,2
_SMALL_COPYRIGHT[225]
End Proc
Procedure _SMALL_COPYRIGHT[YDISPLAY]
'
Auto View Off
'
Screen Open 7,320,24,16,0 : Curs Off : Flash Off : Cls 0
Screen Display 7,,-100,,
Paste Bob 260,3,1
Paper 0 : Pen 7 : Print At(1,1);"This program was written using"
Get Sprite Palette
View : Wait Vbl
'
For Y=1 To Screen Height/2
Screen Display 7,,YDISPLAY+Screen Height/2-Y,,Y*2
Screen Offset 7,,Screen Height/2-Y
View : Wait Vbl
Next
'
Do
If Mouse Key=1 Then Exit
Loop
'
For Y=Screen Height/2 To 0 Step -1
Screen Display 7,,YDISPLAY+Screen Height/2-Y,,Y*2
Screen Offset 7,,Screen Height/2-Y
View : Wait Vbl
Next
'
Screen Close 7
Auto View On
'
End Proc
'
INFO
Procedure INFO
Cls
Locate 0,10
Centre "Evaluator"
Print : Centre "***********"
Print : Print : Print : Print : Pen 1 : Centre "Other AMOS Program Disks available :"
Print : Print : Pen 3 :
Centre "NoteBook: Loose-leaf Notebook "
Print : Centre "ScrapBook: Loose-leaf Scrapbook"
Locate 0,15
Do
If Mouse Key=1 Then Exit
Loop
End Proc
'
Limit Mouse
'
Dim K$(181)
Global K$()
Global TRY$
'Global X,N,I,TP,K1$
X#=0 : Y#=0 : Z#=0 : T#=0
X$=""
SIGFIGS=0
Goto BEGIN
Rem **************************
Rem ********* EVAL *********
Rem **************************
'
Rem By Bill Currie - 1991/93
'
Rem Written with AMOS (Version 1.35)
'
Rem Unfold USERHELP for information on Eval
'
Procedure USERHELP
Rem
Rem This program allows functions to be INPUT and EVALuated in an AMOS
Rem program, or used in an AMOS program. All letters from A to Z may be
Rem used as variables (case insensitive), allowing a total of 26
Rem variables (if required !)
Rem
Rem If X$ is a number as a string, and FV$ is a function of X
Rem then EVAL will work out EVAL$, the value of FV$ for X$.
Rem
Rem The program allows trigonometric functions etc. to be used.
Rem
Rem The program first replaces X$ by the corresponding number
Rem using the routine AZREPLACEVQ, and then procedes to work out EVAL$.
Rem
Rem EVAL has many uses where a function is required to be INPUT.
Rem
Rem Letters VQ are appended to EVAL Parameters to avoid program clashes.
Rem
Rem See the Simple Program.
End Proc
'
Rem Unfold SIMPLEPROGRAM for example of usage
'
Procedure SIMPLEPROGRAM
Rem Remove Rem ' s for program
Rem
Rem Screen Open 0,320,200,16,Lowres
Rem Global EVAL$,X$
Rem Degree
Rem Do
Rem Input 'x = (* to finish) ';X$
Rem If X$="*" Then Exit
Rem Input 'y = ';FUNCTION$
Rem Input 'Sig Figs (0 for none) ';SIGFIGS
Rem
Rem EVAL[FUNCTION$,SIGFIGS]
Rem
Rem Print 'y = ';EVAL$
Rem Print 'y = ';Param$
Rem Print
Rem Loop
Rem End
End Proc
Rem
Rem ****************
Rem ********************* Procedure for EVAL ***************************
'
Rem Global or Shared Variables (as used) : Eval,Eval#,Eval$
Rem A to Z or A# to Z# or A$ to Z$
Rem All Local Variables end in VQ to avoid program clashes
Rem IDS$="" or "#" or "$" for Integer,Decimal or String Variables
Rem FUNCTION$ is the function to be Evaluated
Rem SIGFIGS is the accuracy 'worked to' (Significant Figures),0 for none.
'
Rem The procedure has (obviously?) been folded !
'
Procedure EVAL[IDS$,FUNCTION$,SIGFIGS]
On Error Goto ER
Goto OK
ER:
EVAL$="Error"
Resume XITC
OK:
Shared EVAL,EVAL#,EVAL$
Rem All Local Variables and Labels end in VQ
If IDS$="$"
Shared A$,B$,C$,D$,E$,F$,G$,H$,I$,J$,K$,L$,M$,N$,O$,P$,Q$,R$,S$,T$,U$,V$,W$,X$,Y$,Z$
AVQVQ$=A$ : BVQVQ$=B$ : CVQVQ$=C$ : DVQVQ$=D$ : EVQVQ$=E$ : FVQVQ$=F$ : GVQVQ$=G$
HVQVQ$=H$ : IVQVQ$=I$ : JVQVQ$=J$ : KVQVQ$=K$ : LVQVQ$=L$ : MVQVQ$=M$
NVQVQ$=N$ : OVQVQ$=O$ : PVQVQ$=P$ : QVQVQ$=Q$ : RVQVQ$=R$ : SVQVQ$=S$ : TVQVQ$=T$
UVQVQ$=U$ : VVQVQ$=V$ : WVQVQ$=W$ : XVQVQ$=X$ : YVQVQ$=Y$ : ZVQVQ$=Z$
End If
If IDS$="#"
Shared A#,B#,C#,D#,E#,F#,G#,H#,I#,J#,K#,L#,M#,N#,O#,P#,Q#,R#,S#,T#,U#,V#,W#,X#,Y#,Z#
AVQVQ$=Str$(A#) : BVQVQ$=Str$(B#) : CVQVQ$=Str$(C#) : DVQVQ$=Str$(D#) : EVQVQ$=Str$(E#) : FVQVQ$=Str$(F#) : GVQVQ$=Str$(G#)
HVQVQ$=Str$(H#) : IVQVQ$=Str$(I#) : JVQVQ$=Str$(J#) : KVQVQ$=Str$(K#) : LVQVQ$=Str$(L#) : MVQVQ$=Str$(M#)
NVQVQ$=Str$(N#) : OVQVQ$=Str$(O#) : PVQVQ$=Str$(P#) : QVQVQ$=Str$(Q#) : RVQVQ$=Str$(R#) : SVQVQ$=Str$(S#) : TVQVQ$=Str$(T#)
UVQVQ$=Str$(U#) : VVQVQ$=Str$(V#) : WVQVQ$=Str$(W#) : XVQVQ$=Str$(X#) : YVQVQ$=Str$(Y#) : ZVQVQ$=Str$(Z#)
End If
If IDS$=""
Shared A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
AVQVQ$=Str$(A) : BVQVQ$=Str$(B) : CVQVQ$=Str$(C) : DVQVQ$=Str$(D) : EVQVQ$=Str$(E) : FVQVQ$=Str$(F) : GVQVQ$=Str$(G)
HVQVQ$=Str$(H) : IVQVQ$=Str$(I) : JVQVQ$=Str$(J) : KVQVQ$=Str$(K) : LVQVQ$=Str$(L) : MVQVQ$=Str$(M)
NVQVQ$=Str$(N) : OVQVQ$=Str$(O) : PVQVQ$=Str$(P) : QVQVQ$=Str$(Q) : RVQVQ$=Str$(R) : SVQVQ$=Str$(S) : TVQVQ$=Str$(T)
UVQVQ$=Str$(U) : VVQVQ$=Str$(V) : WVQVQ$=Str$(W) : XVQVQ$=Str$(X) : YVQVQ$=Str$(Y) : ZVQVQ$=Str$(Z)
End If
FVQ$=FUNCTION$
Gosub EVALLVQ
EVAL$=EVAL$
Goto XITC
EVALLVQ:
GVQ$="" : HVQ$="" : EVAL$=""
KEEPFVQ$=FVQ$ : KEEPGVQ$=GVQ$ : KEEPHVQ$=HVQ$
FVQ$=Upper$(FVQ$)
FVQ$="dummy"+FVQ$+"dummy"
Gosub SPACEREPLACEVQ
Gosub PIREPLACEVQ
Gosub AZREPLACEVQ
Do
Gosub BRACKETSVQ
If GVQ$="Error" Then Exit
Exit If FVQ$='end'
Gosub ARITHVQ
If GVQ$="Error" Then Exit
Gosub TRIGVQ
If GVQ$="Error" Then Exit
Loop
'
Rem Avoid two .'s or two E's
If Instr(Mid$(GVQ$,Instr(GVQ$,".")+1),".")>0 Then EVAL$="Error" : Goto XITC
If Instr(Mid$(GVQ$,Instr(GVQ$,"E")+1),"E")>0 Then EVAL$="Error" : Goto XITC
'If(Instr(GVQ$,"E")>0) and(Instr("123456789",Mid$(GVQ$,Instr(GVQ$,"E")-1,1))=0) Then EVAL$="Error" : Goto XITC
'
If GVQ$="Error" Then EVAL$="Error" : Goto XITC
'
Rem Insert a space in front of an E
'
IVQ=Instr(GVQ$,"E")
If IVQ=0 Then Goto OKEVAL
GVQ$=Left$(GVQ$,IVQ-1)+" "+Mid$(GVQ$,IVQ)
OKEVAL:
'
Rem -0 is not really required as an answer
If GVQ$="-0" Then GVQ$="0"
'
FINALCHECK:
IVQ=0
Do
IVQ=IVQ+1
If IVQ>Len(GVQ$) Then Exit
If Instr(" 1234567890.E+-",Mid$(GVQ$,IVQ,1))=0 Then GVQ$="Error" : Exit
Loop
'
Gosub ROUNDINGVQ
'
EVAL$=GVQ$
'
FVQ$=KEEPFVQ$ : GVQ$=KEEPGVQ$ : HVQ$=KEEPHVQ$
'
Return
ROUNDINGVQ:
MARKERVQ=0
NVQ=Int(SIGFIGS)
If(NVQ<=0) or(GVQ$="0") Then Gosub ROUNDVQ : Goto XIT3
'
Rem Remove Tail End
IVQ=Instr(GVQ$," E")
FVQ$=GVQ$ : HVQ$=""
If IVQ<>0 Then FVQ$=Left$(GVQ$,IVQ-1) : HVQ$=Mid$(GVQ$,IVQ)
'
Rem Get any - sign
SVQ$=""
If Left$(FVQ$,1)="-" Then SVQ$="-" : FVQ$=Mid$(FVQ$,2)
'
Rem Remove D.Pt.
IVQ=Instr(FVQ$,".")
If IVQ<>0 Then FVQ$=Left$(FVQ$,IVQ-1)+Mid$(FVQ$,IVQ+1)
'
Rem Remove leading zeros
KVQ=0
Do
If Left$(FVQ$,1)<>"0" Then Exit
FVQ$=Mid$(FVQ$,2)
Inc KVQ
Loop
'
Rem MARKERVQ=0
LVQ=Len(FVQ$)
If LVQ<=NVQ Then Goto XIT
Rem Chop off unwanted end
FVQ$=Left$(FVQ$,NVQ+1)
If Instr("01234",Right$(FVQ$,1))<>0 Then FVQ$=Left$(FVQ$,NVQ) : Goto XIT
FVQ$=Left$(FVQ$,NVQ) : JVQ=0
Do
If Right$(FVQ$,1)=Chr$(48+JVQ) Then FVQ$=Left$(FVQ$,NVQ-1)+Chr$(48+JVQ+1) : Goto XIT
Inc JVQ
If JVQ=9 Then Exit
Loop
Rem Two 9's at end
JVQ=1
Do
If Mid$(FVQ$,NVQ-JVQ,1)<>"9" Then FVQ$=Left$(FVQ$,NVQ-JVQ-1)+Chr$(Asc(Mid$(FVQ$,NVQ-JVQ,1))+1) : Goto XIT
Inc JVQ
If JVQ=NVQ Then Exit
Loop
FVQ$="1"+String$("0",LVQ) : MARKERVQ=1
XIT:
If MARKERVQ=0 Then FVQ$=FVQ$+String$("0",LVQ-Len(FVQ$))
Rem Replace leading zeros
FVQ$=String$("0",KVQ)+FVQ$
Rem Replace D.Pt.
If IVQ=0 Then Goto XIT2
If MARKERVQ=0 Then FVQ$=Left$(FVQ$,IVQ-1)+"."+Mid$(FVQ$,IVQ)
If MARKERVQ=1 Then FVQ$=Left$(FVQ$,IVQ)+"."+Mid$(FVQ$,IVQ+1)
MARKERVQ=0
Rem Remove unwanted zeros at right
Do
If Right$(FVQ$,1)<>"0" Then Exit
If Right$(FVQ$,2)=".0" Then Exit
FVQ$=Left$(FVQ$,Len(FVQ$)-1)
Loop
XIT2:
GVQ$=FVQ$+HVQ$
Rem Remove unwanted zeros at left
Do
If Left$(GVQ$,1)<>"0" Then Exit
If Left$(GVQ$,2)="0." Then Exit
GVQ$=Right$(GVQ$,Len(GVQ$)-1)
Loop
Rem Replace sign
GVQ$=SVQ$+GVQ$
XIT3:
Return
ROUNDVQ:
Rem Rounding
'
IVQ=Instr(GVQ$," E")
FVQ$=GVQ$ : HVQ$=""
If IVQ<>0 Then FVQ$=Left$(GVQ$,IVQ-1) : HVQ$=Mid$(GVQ$,IVQ)
'
IVQ=Instr(FVQ$,".")
AVQ$=FVQ$
If IVQ<>0 Then AVQ$=Left$(FVQ$,IVQ-1)+Mid$(FVQ$,IVQ+1)
Rem Primitive rounding for eg .98! ,default - number of significant figures unspecified
KVQ=Len(AVQ$)
If KVQ<6 Then Goto XITB
If Right$(AVQ$,6)="899999" Then AVQ$=Left$(AVQ$,KVQ-6)+"900000"
If Right$(AVQ$,6)="799999" Then AVQ$=Left$(AVQ$,KVQ-6)+"800000"
If Right$(AVQ$,6)="699999" Then AVQ$=Left$(AVQ$,KVQ-6)+"700000"
If Right$(AVQ$,6)="599999" Then AVQ$=Left$(AVQ$,KVQ-6)+"600000"
If Right$(AVQ$,6)="499999" Then AVQ$=Left$(AVQ$,KVQ-6)+"500000"
If Right$(AVQ$,6)="399999" Then AVQ$=Left$(AVQ$,KVQ-6)+"400000"
If Right$(AVQ$,6)="299999" Then AVQ$=Left$(AVQ$,KVQ-6)+"300000"
If Right$(AVQ$,6)="199999" Then AVQ$=Left$(AVQ$,KVQ-6)+"200000"
If Right$(AVQ$,6)="099999" Then AVQ$=Left$(AVQ$,KVQ-6)+"100000"
If Right$(AVQ$,6)="899998" Then AVQ$=Left$(AVQ$,KVQ-6)+"900000"
If Right$(AVQ$,6)="799998" Then AVQ$=Left$(AVQ$,KVQ-6)+"800000"
If Right$(AVQ$,6)="699998" Then AVQ$=Left$(AVQ$,KVQ-6)+"700000"
If Right$(AVQ$,6)="599998" Then AVQ$=Left$(AVQ$,KVQ-6)+"600000"
If Right$(AVQ$,6)="499998" Then AVQ$=Left$(AVQ$,KVQ-6)+"500000"
If Right$(AVQ$,6)="399998" Then AVQ$=Left$(AVQ$,KVQ-6)+"400000"
If Right$(AVQ$,6)="299998" Then AVQ$=Left$(AVQ$,KVQ-6)+"300000"
If Right$(AVQ$,6)="199998" Then AVQ$=Left$(AVQ$,KVQ-6)+"200000"
If Right$(AVQ$,6)="299998" Then AVQ$=Left$(AVQ$,KVQ-6)+"100000"
If Right$(AVQ$,6)="199998" Then AVQ$=Left$(AVQ$,KVQ-6)+"200000"
If Right$(AVQ$,6)="099998" Then AVQ$=Left$(AVQ$,KVQ-6)+"100000"
If IVQ=0 Then FVQ$=AVQ$ : Goto XIT2A
FVQ$=Left$(AVQ$,IVQ-1)+"."+Mid$(AVQ$,IVQ)
Do
If Right$(FVQ$,1)<>"0" Then Exit
If Right$(FVQ$,2)=".0" Then Exit
FVQ$=Left$(FVQ$,Len(FVQ$)-1)
Loop
XIT2A:
GVQ$=FVQ$+HVQ$
Rem Remove unwanted zeros at left
Do
If Left$(GVQ$,1)<>"0" Then Exit
If Left$(GVQ$,2)="0." Then Exit
GVQ$=Right$(GVQ$,Len(GVQ$)-1)
Loop
XITB:
Return
SPACEREPLACEVQ:
Do
IVQ=Instr(FVQ$," ")
If IVQ=0 Then Exit
FVQ$=Left$(FVQ$,IVQ-1)+Right$(FVQ$,Len(FVQ$)-IVQ)
Loop
Return
PIREPLACEVQ:
Do
IVQ=Instr(FVQ$,'PI')
Exit If IVQ=0
FVQ$=Left$(FVQ$,IVQ-1)+Str$(Pi#)+Mid$(FVQ$,IVQ+2)
Loop
Return
AZREPLACEVQ:
'
Rem Functions to lower case
'
Restore NWDT
For JVQ=1 To 19
Read AVQ$
BVQ$=Lower$(AVQ$)
L=Len(AVQ$)
Do
IVQ=Instr(FVQ$,AVQ$)
If IVQ=0 Then Exit
FVQ$=Left$(FVQ$,IVQ-1)+BVQ$+Mid$(FVQ$,IVQ+L)
Loop
Next JVQ
'
Rem Replace upper case letters by 'numbers'
For JVQ=65 To 90
Read XVQ$
'
If Instr(FVQ$,Chr$(JVQ))<>0
For IVQ=1 To Len(XVQ$)
If Instr("0123456789+-*/^eE. ",Mid$(XVQ$,IVQ,1))=0
EVAL$="Error" : Goto XITC
End If
Next IVQ
End If
'
If(Instr(XVQ$,".")=0) and(Instr(XVQ$,"e")=0) and(Instr(XVQ$,"E")=0) and Len(XVQ$)>10 Then XVQ$=XVQ$+".0"
'
Do
XINVQ$=XVQ$
IVQ=Instr(FVQ$,Chr$(JVQ))
If IVQ=0 Then Exit
For J2VQ=48 To 57
If Mid$(FVQ$,IVQ+1,1)=Chr$(J2VQ) Then EVAL$="Error" : Goto XITC
Next J2VQ
If Mid$(FVQ$,IVQ+1,1)="." Then EVAL$="Error" : Goto XITC
For J2VQ=48 To 57
If Mid$(FVQ$,IVQ-1,1)=Chr$(J2VQ) Then XINVQ$="*"+XINVQ$
Next J2VQ
If Mid$(FVQ$,IVQ-1,1)="." Then XINVQ$="*"+XINVQ$
For J2VQ=65 To 90
If Mid$(FVQ$,IVQ-1,1)=Chr$(J2VQ) Then XINVQ$="*"+XINVQ$
Next J2VQ
For J2VQ=65 To 90
If Mid$(FVQ$,IVQ+1,1)=Chr$(J2VQ) Then XINVQ$=XINVQ$+"*"
Next J2VQ
Rem pi
If Mid$(FVQ$,IVQ+1,1)=" " Then XINVQ$=XINVQ$+"*"
'
FVQ$=Left$(FVQ$,IVQ-1)+XINVQ$+Mid$(FVQ$,IVQ+1)
Loop
Next JVQ
'
FVQ$=Upper$(FVQ$)
'
NWDT:
Data "ASIN","ACOS","ATAN","HSIN","HCOS","HTAN","SINH","COSH","TANH"
Data "SIN","COS","TAN","LOG","EXP","SQR","ABS","INT","SGN","LN"
Data AVQVQ$,BVQVQ$,CVQVQ$,DVQVQ$,EVQVQ$
Data FVQVQ$,GVQVQ$,HVQVQ$,IVQVQ$,JVQVQ$
Data KVQVQ$,LVQVQ$,MVQVQ$,NVQVQ$,OVQVQ$
Data PVQVQ$,QVQVQ$,RVQVQ$,SVQVQ$,TVQVQ$
Data UVQVQ$,VVQVQ$,WVQVQ$,XVQVQ$,YVQVQ$,ZVQVQ$
'
Return
BRACKETSVQ:
IVQ=Instr(FVQ$,')')
If IVQ=0 Then GVQ$=Mid$(FVQ$,6,(Len(FVQ$)-10)) : FVQ$='end' : HVQ$='end' : Gosub ARITHVQ : Goto FINBR
HVQ$=Mid$(FVQ$,IVQ+1) : FVQ$=Left$(FVQ$,IVQ-1)
''''''''''''''
If Instr("0123456789. ",Left$(HVQ$,1))<>0 Then EVAL$="Error" : Goto XITC
''''''''''''''
JVQ=0
Do
JVQ=JVQ+1
IVQ=Instr(Right$(FVQ$,JVQ),"(")
If IVQ<>0 Then Exit
If JVQ=Len(FVQ$) Then GVQ$="Error" : Goto FINBR
Loop
GVQ$=Mid$(FVQ$,Len(FVQ$)-JVQ+2) : FVQ$=Left$(FVQ$,Len(FVQ$)-JVQ)
FINBR:
Return
ARITHVQ:
Gosub POWERSVQ
Gosub COMPRESS_SIGNSVQ
Gosub MULT_DIVVQ
If GVQ$="error" Then Goto ARERR
Gosub COMPRESS_SIGNSVQ
Gosub AD_SUBVQ
Gosub COMPRESS_SIGNSVQ
ARERR:
Return
SPACEREMOVEVQ:
Do
IVQ=Instr(GVQ$," ")
If IVQ=0 Then Exit
GVQ$=Left$(GVQ$,IVQ-1)+Right$(GVQ$,Len(GVQ$)-IVQ)
Loop
Return
TRIGVQ:
On Error Goto ERROUTINE
IVQ=Len(FVQ$) : CVQ#=Val(GVQ$)
DUMMYVQ$=Right$(FVQ$,1) : If Instr('+-*/^(Y',DUMMYVQ$)<>0 Then Goto NEWFX
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='ASIN' Then CVQ#=Acos(Sqr(1-CVQ#^2)) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='ACOS' Then CVQ#=Acos(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='ATAN' Then CVQ#=Atan(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='HSIN' Then CVQ#=(Exp(CVQ#)-Exp(-CVQ#))/2 : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='SINH' Then CVQ#=(Exp(CVQ#)-Exp(-CVQ#))/2 : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='HCOS' Then CVQ#=(Exp(CVQ#)+Exp(-CVQ#))/2 : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='COSH' Then CVQ#=(Exp(CVQ#)+Exp(-CVQ#))/2 : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='HTAN' Then CVQ#=(Exp(CVQ#)-Exp(-CVQ#))/(Exp(CVQ#)+Exp(-CVQ#)) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,4) : If DUMMYVQ$='TANH' Then CVQ#=(Exp(CVQ#)-Exp(-CVQ#))/(Exp(CVQ#)+Exp(-CVQ#)) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-4) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='SIN' Then CVQ#=Sin(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='COS' Then CVQ#=Cos(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='TAN' Then CVQ#=Tan(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='LOG' Then CVQ#=Log(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='EXP' Then CVQ#=Exp(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='SQR' Then CVQ#=Sqr(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='ABS' Then CVQ#=Abs(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='INT' Then CVQ#=Int(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,3) : If DUMMYVQ$='SGN' Then CVQ#=Sgn(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-3) : Goto NEWFX2
DUMMYVQ$=Right$(FVQ$,2) : If DUMMYVQ$='LN' Then CVQ#=Ln(CVQ#) : SVQ$=Str$(CVQ#) : GVQ$=SVQ$ : FVQ$=Left$(FVQ$,IVQ-2) : Goto NEWFX2
NEWFX2:
DUMMYVQ$=Right$(FVQ$,1)
If Instr('+-*/^(Y',DUMMYVQ$)<>0 Then Goto NEWFX
FVQ$=FVQ$+"*"
NEWFX:
FVQ$=FVQ$+GVQ$+HVQ$
Goto NERR
ERROUTINE:
GVQ$="Error"
Resume NERR
NERR:
Return
POWERSVQ:
POWERTEST:
Gosub SPACEREMOVEVQ
IVQ=Instr(GVQ$,'^')
If IVQ=0 Then Goto NPRS
Rem g$ = lef1vq$ + lefvq$ ^ rigvq$ +rig1vq$
Rem first get rid of any first sequences of +'s or -'s after the ^
FULLRVQ$=Right$(GVQ$,Len(GVQ$)-IVQ)
Do
If Left$(FULLRVQ$,1)="+" Then FULLRVQ$=Mid$(FULLRVQ$,2) : Goto RETRY1
If Len(FULLRVQ$)>1 Then If Left$(FULLRVQ$,2)="--" Then FULLRVQ$=Mid$(FULLRVQ$,3) : Goto RETRY1
If Len(FULLRVQ$)>1 Then If Left$(FULLRVQ$,2)="-+" Then FULLRVQ$="-"+Mid$(FULLRVQ$,3) : Goto RETRY1
Exit
RETRY1:
Loop
GVQ$=Left$(GVQ$,IVQ)+FULLRVQ$
Rem ******
Rem get right hand side
Rem remember ^ is at position ivq
JVQ=IVQ+1
RIGVQ$=Mid$(GVQ$,JVQ,1)
Do
If JVQ=Len(GVQ$) Then Exit
JVQ=JVQ+1
DUMMYVQ$=Mid$(GVQ$,JVQ,1) : DUMMY1VQ$=Mid$(GVQ$,JVQ-1,1)
If Instr("0123456789.E",DUMMYVQ$)<>0 Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto RETRY2
If DUMMYVQ$="-" Then If DUMMY1VQ$="E" Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto RETRY2
If DUMMYVQ$="+" Then If DUMMY1VQ$="E" Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto RETRY2
Exit
RETRY2:
Loop
Rem Avoid two .'s or two E's
If Instr(Mid$(RIGVQ$,Instr(RIGVQ$,".")+1),".")>0 Then EVAL$="Error" : Goto XITC
If Instr(Mid$(RIGVQ$,Instr(RIGVQ$,"E")+1),"E")>0 Then EVAL$="Error" : Goto XITC
'If(Instr(RIGVQ$,"E")>0) and(Instr("123456789",Mid$(RIGVQ$,Instr(RIGVQ$,"E")-1,1))=0) Then EVAL$="Error" : Goto XITC
If JVQ=Len(GVQ$) Then RIG1VQ$='' : Else RIG1VQ$=Mid$(GVQ$,JVQ)
'
Rem Now get the left hand side
Rem Remember ^ is still at position ivq
Rem Use KVQ this time, instead of JVQ
Rem The left hand side should be easier
KVQ=IVQ-1
LEFVQ$=Mid$(GVQ$,KVQ,1)
Do
KVQ=KVQ-1
Exit If KVQ=0
DUMMYVQ$=Mid$(GVQ$,KVQ,1)
DUMMY1VQ$=""
If KVQ>1 Then DUMMY1VQ$=Mid$(GVQ$,KVQ-1,1)
If Instr("0123456789.E",DUMMYVQ$)<>0 Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto RETRY3
If DUMMYVQ$="-" Then If DUMMY1VQ$="E" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto RETRY3
If DUMMYVQ$="+" Then If DUMMY1VQ$="E" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto RETRY3
If DUMMYVQ$="-" Then If DUMMY1VQ$="+" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : KVQ=KVQ-1 : Exit
If DUMMYVQ$="-" Then If DUMMY1VQ$="-" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : KVQ=KVQ-1 : Exit
If DUMMYVQ$="-" Then If DUMMY1VQ$="" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : KVQ=KVQ-1 : Exit
Exit
RETRY3:
Loop
Rem Avoid two .'s or two E's
If Instr(Mid$(LEFVQ$,Instr(LEFVQ$,".")+1),".")>0 Then EVAL$="Error" : Goto XITC
If Instr(Mid$(LEFVQ$,Instr(LEFVQ$,"E")+1),"E")>0 Then EVAL$="Error" : Goto XITC
'If(Instr(LEFVQ$,"E")>0) and(Instr("123456789",Mid$(LEFVQ$,Instr(LEFVQ$,"E")-1,1))=0) Then EVAL$="Error" : Goto XITC
If KVQ=0 Then LEF1VQ$='' : Else LEF1VQ$=Mid$(GVQ$,1,KVQ) :
Rem *****
LLVQ#=Val(LEFVQ$) : RRVQ#=Val(RIGVQ$)
If(Abs(LLVQ#)<>LLVQ#) and(RRVQ#<>Int(RRVQ#)) Then EVAL$="Error" : Goto XITC
MIVQ#=LLVQ#^RRVQ#
'
Rem Try -1^5 in AMOS? Are odd powers of - nos OK? Assumed not!
Rem If Left$(LEFVQ$,1)="-" and 2*Int(RRVQ#/2)<>RRVQ# and RRVQ#=Int(RRVQ#) Then MIDDVQ$="-"+Mid$(MIDDVQ$,2)
Rem Possible correction for powers that are odd integers. Leave??! Unsure! Making matters worse ?
Rem I don't like this. However...?Complex Numbers?... ... ...
Rem Look at later. See line two from here !
'
MIDDVQ$=Str$(MIVQ#)
'
If Left$(LEFVQ$,1)="-" and 2*Int(RRVQ#/2)<>RRVQ# and RRVQ#=Int(RRVQ#) Then MIDDVQ$="-"+Mid$(MIDDVQ$,2)
'
If Left$(MIDDVQ$,1)<>"-" Then MIDDVQ$=Mid$(MIDDVQ$,2) : Rem NB Removing a space
GVQ$=LEF1VQ$+MIDDVQ$+RIG1VQ$
Goto POWERTEST
NPRS:
Return
PPREMOVEVQ:
Do
IVQ=Instr(GVQ$,"++")
If IVQ=0 Then Exit
GVQ$=Left$(GVQ$,IVQ-1)+"+"+Mid$(GVQ$,IVQ+2)
PMVQ$="Y"
Loop
Return
PMREMOVEVQ:
Do
IVQ=Instr(GVQ$,"+-")
If IVQ=0 Then Exit
GVQ$=Left$(GVQ$,IVQ-1)+"-"+Mid$(GVQ$,IVQ+2)
PMVQ$="Y"
Loop
Return
MPREMOVEVQ:
Do
IVQ=Instr(GVQ$,"-+")
If IVQ=0 Then Exit
GVQ$=Left$(GVQ$,IVQ-1)+"-"+Mid$(GVQ$,IVQ+2)
PMVQ$="Y"
Loop
Return
MMREMOVEVQ:
Do
IVQ=Instr(GVQ$,"--")
If IVQ=0 Then Exit
GVQ$=Left$(GVQ$,IVQ-1)+"+"+Mid$(GVQ$,IVQ+2)
PMVQ$="Y"
Loop
Return
COMPRESS_SIGNSVQ:
Do
PMVQ$="N"
Gosub PPREMOVEVQ
Gosub PMREMOVEVQ
Gosub MPREMOVEVQ
Gosub MMREMOVEVQ
If PMVQ$="N" Then Exit
Loop
Return
MULT_DIVVQ:
On Error Goto ERROUTINEMD
LEFTMOSTMD:
Gosub SPACEREMOVEVQ
IVQ=Instr(GVQ$,'*')
IIVQ=Instr(GVQ$,'/')
If IIVQ>1 and(IIVQ<IVQ or IVQ=0) Then IVQ=IIVQ : LVQ$="/" : Goto WORKOUT1
If IVQ>1 Then LVQ$="*" : Goto WORKOUT1
Goto NMRMD
WORKOUT1:
Rem gv$ = lef1vq$ lefvq$ # rigvq$ rig1vq$ , where # is * or /
Rem find right number
JVQ=IVQ+1
RIGVQ$=Mid$(GVQ$,JVQ,1)
Do
If JVQ=Len(GVQ$) Then Exit
JVQ=JVQ+1
DUMMYVQ$=Mid$(GVQ$,JVQ,1) : DUMMY1VQ$=Mid$(GVQ$,JVQ-1,1)
If Instr("0123456789.E",DUMMYVQ$)<>0 Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto KEEP_ON
If DUMMYVQ$="-" Then If DUMMY1VQ$="E" Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto KEEP_ON
If DUMMYVQ$="+" Then If DUMMY1VQ$="E" Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto KEEP_ON
Exit
KEEP_ON:
Loop
Rem Avoid two .'s or two E's
If Instr(Mid$(RIGVQ$,Instr(RIGVQ$,".")+1),".")>0 Then EVAL$="Error" : Goto XITC
If Instr(Mid$(RIGVQ$,Instr(RIGVQ$,"E")+1),"E")>0 Then EVAL$="Error" : Goto XITC
'If(Instr(RIGVQ$,"E")>0) and(Instr("123456789",Mid$(RIGVQ$,Instr(RIGVQ$,"E")-1,1))=0) Then EVAL$="Error" : Goto XITC
If JVQ=Len(GVQ$) Then RIG1VQ$='' : Else RIG1VQ$=Mid$(GVQ$,JVQ)
Rem **********
Rem Find left number
KVQ=IVQ-1
LEFVQ$=Mid$(GVQ$,KVQ,1)
Do
KVQ=KVQ-1
Exit If KVQ=0
DUMMYVQ$=Mid$(GVQ$,KVQ,1)
DUMMY1VQ$=""
If KVQ-1>0 Then DUMMY1VQ$=Mid$(GVQ$,KVQ-1,1)
If Instr("0123456789.E",DUMMYVQ$)<>0 Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto REWORK
If DUMMYVQ$="-" Then If DUMMY1VQ$="E" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto REWORK
If DUMMYVQ$="+" Then If DUMMY1VQ$="E" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto REWORK
Exit
REWORK:
Loop
Rem Avoid two .'s or two E's
If Instr(Mid$(LEFVQ$,Instr(LEFVQ$,".")+1),".")>0 Then EVAL$="Error" : Goto XITC
If Instr(Mid$(LEFVQ$,Instr(LEFVQ$,"E")+1),"E")>0 Then EVAL$="Error" : Goto XITC
'If(Instr(LEFVQ$,"E")>0) and(Instr("123456789",Mid$(LEFVQ$,Instr(LEFVQ$,"E")-1,1))=0) Then EVAL$="Error" : Goto XITC
If KVQ=0 Then LEF1VQ$='' : Else LEF1VQ$=Mid$(GVQ$,1,KVQ)
Rem
Rem now work out lef1vq$ lefvq$ # rigvq$ rig1vq$
Rem
LLVQ#=Val(LEFVQ$) : RRVQ#=Val(RIGVQ$)
If LVQ$="*" Then MIVQ#=LLVQ#*RRVQ#
If LVQ$="/" Then MIVQ#=LLVQ#/RRVQ#
MIDDVQ$=Str$(MIVQ#)
If Left$(MIDDVQ$,1)<>"-" Then MIDDVQ$=Right$(MIDDVQ$,Len(MIDDVQ$)-1) : Rem NB Removing a space
GVQ$=LEF1VQ$+MIDDVQ$+RIG1VQ$
Goto LEFTMOSTMD
Rem
NMRMD:
Goto NERRMD
ERROUTINEMD:
GVQ$="Error"
Resume NERRMD
NERRMD:
Return
AD_SUBVQ:
LEFTMOSTADSUB:
Gosub SPACEREMOVEVQ
Gosub COMPRESS_SIGNSVQ
'
Rem Avoiding E+
Do
I2VQ=Instr(GVQ$,"E+")
If I2VQ=0 Then Exit
GVQ$=Left$(GVQ$,I2VQ-1)+"EE"+Mid$(GVQ$,I2VQ+2)
Loop
'
Rem Avoid possible initial - sign, starting from 2nd character
IVQ=Instr(Mid$(GVQ$,2),'+')
'
Rem Now replacing E+
Do
I2VQ=Instr(GVQ$,"EE")
If I2VQ=0 Then Exit
GVQ$=Left$(GVQ$,I2VQ-1)+"E+"+Mid$(GVQ$,I2VQ+2)
Loop
Rem Having avoided E+ now continue
'
Rem Avoiding E-
Do
I2VQ=Instr(GVQ$,"E-")
If I2VQ=0 Then Exit
GVQ$=Left$(GVQ$,I2VQ-1)+"EE"+Mid$(GVQ$,I2VQ+2)
Loop
'
Rem Avoid possible initial - sign, starting from 2nd character
IIVQ=Instr(Mid$(GVQ$,2),'-')
'
Rem Now replacing E-
Do
I2VQ=Instr(GVQ$,"EE")
If I2VQ=0 Then Exit
GVQ$=Left$(GVQ$,I2VQ-1)+"E-"+Mid$(GVQ$,I2VQ+2)
Loop
Rem Having avoided E- now continue
'
Rem Find which is leftmost, + or -
'
If IIVQ>0 and(IIVQ<IVQ or IVQ=0) Then IVQ=IIVQ : LVQ$="-" : Goto WORKOUT2
If IVQ>0 Then LVQ$="+" : Goto WORKOUT2
Goto NMRADSUB
'
WORKOUT2:
Rem Remember to adjust IVQ since search began with 2nd item
IVQ=IVQ+1
Rem gvq$ = lef1vq$ lefvq$ # rigvq$ rig1vq$ , where # is + or -
Rem find right number
JVQ=IVQ+1
RIGVQ$=Mid$(GVQ$,JVQ,1)
Do
If JVQ=Len(GVQ$) Then Exit
JVQ=JVQ+1
DUMMYVQ$=Mid$(GVQ$,JVQ,1) : DUMMY1VQ$=Mid$(GVQ$,JVQ-1,1)
If Instr("0123456789.E",DUMMYVQ$)<>0 Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto KEEP_ON2
If DUMMYVQ$="-" Then If DUMMY1VQ$="E" Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto KEEP_ON2
If DUMMYVQ$="+" Then If DUMMY1VQ$="E" Then RIGVQ$=RIGVQ$+DUMMYVQ$ : Goto KEEP_ON2
Exit
KEEP_ON2:
Loop
Rem Avoid two .'s or two E's
If Instr(Mid$(RIGVQ$,Instr(RIGVQ$,".")+1),".")>0 Then EVAL$="Error" : Goto XITC
If Instr(Mid$(RIGVQ$,Instr(RIGVQ$,"E")+1),"E")>0 Then EVAL$="Error" : Goto XITC
'If(Instr(RIGVQ$,"E")>0) and(Instr("123456789",Mid$(RIGVQ$,Instr(RIGVQ$,"E")-1,1))=0) Then EVAL$="Error" : Goto XITC
If JVQ=Len(GVQ$) Then RIG1VQ$='' : Else RIG1VQ$=Mid$(GVQ$,JVQ)
Rem **********
Rem Find left number
KVQ=IVQ-1
LEFVQ$=Mid$(GVQ$,KVQ,1)
Do
KVQ=KVQ-1
Exit If KVQ=0
DUMMYVQ$=Mid$(GVQ$,KVQ,1)
DUMMY1VQ$=""
If KVQ-1>0 Then DUMMY1VQ$=Mid$(GVQ$,KVQ-1,1)
If Instr("0123456789.E",DUMMYVQ$)<>0 Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto REWORK2
If DUMMYVQ$="-" Then If DUMMY1VQ$="E" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto REWORK2
If DUMMYVQ$="+" Then If DUMMY1VQ$="E" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : Goto REWORK2
Rem Don't forget negative numbers, working left to right
If DUMMYVQ$="-" Then LEFVQ$=DUMMYVQ$+LEFVQ$ : KVQ=KVQ-1 : Exit
Exit
REWORK2:
Loop
Rem Avoid two .'s or two E's
If Instr(Mid$(LEFVQ$,Instr(LEFVQ$,".")+1),".")>0 Then EVAL$="Error" : Goto XITC
If Instr(Mid$(LEFVQ$,Instr(LEFVQ$,"E")+1),"E")>0 Then EVAL$="Error" : Goto XITC
'If(Instr(LEFVQ$,"E")>0) and(Instr("123456789",Mid$(LEFVQ$,Instr(LEFVQ$,"E")-1,1))=0) Then EVAL$="Error" : Goto XITC
If KVQ=0 Then LEF1VQ$='' : Else LEF1VQ$=Mid$(GVQ$,1,KVQ)
Rem
Rem now work out lef1vq$ lefvq$ # rigvq$ rig1vq$
Rem
LLVQ#=Val(LEFVQ$) : RRVQ#=Val(RIGVQ$)
If LVQ$="+" Then MIVQ#=LLVQ#+RRVQ#
If LVQ$="-" Then MIVQ#=LLVQ#-RRVQ#
MIDDVQ$=Str$(MIVQ#)
'
Rem NB Removing a space
If Left$(MIDDVQ$,1)<>"-" Then MIDDVQ$=Right$(MIDDVQ$,Len(MIDDVQ$)-1)
'
GVQ$=LEF1VQ$+MIDDVQ$+RIG1VQ$
Goto LEFTMOSTADSUB
Rem
NMRADSUB:
If Left$(GVQ$,1)="+" Then GVQ$=Mid$(GVQ$,2)
Return
XITC:
EVAL$=EVAL$
EVAL=Val(EVAL$)
EVAL#=Val(EVAL$)
End Proc[EVAL$]
Procedure HELPNEW
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,640,256,4,Hires
Curs Off : Flash Off : Colour 3,$FF0
Cls 0
Paper 0
Print
Print : Centre "****** HELP ******"
Print
Print : Centre " PAD "
Print : Print : Print : Print
Pen 3
'Print : Print : Centre "To include PAD in an AMOS program"
'Print : Print : Centre "merge Pad.AMOS"
'Print : Print : Centre "Procedure Pad may then be used"
Print : Print : Centre "Pad consists of a NotePad to put in a short reminder,"
Print : Print : Centre "and a superb Calculator"
Print : Print : Centre "which can handle arithmetic"
Print : Print : Centre "and algebraic & trigonometric formulae"
Print : Print : Centre "using all the letters of the alphabet"
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
Cls 0
Paper 0
Home
Print
Centre "* CALCULATOR HELP *"
Print
Print
Pen 3
Centre " Functions and Trigonometric Expressions Allowed"
Pen 2
Print
Print
Centre "SIN"
Print
Centre "COS"
Print
Centre "TAN"
Print
Centre "ASIN"
Print
Centre "ACOS"
Print
Centre "ATAN"
Print
Centre "HSIN or SINH"
Print
Centre "HCOS or COSH"
Print
Centre "HTAN or TANH"
Print
Centre "LOG for base 10"
Print
Centre "EXP"
Print
Centre "LN Naperian,ie for base e"
Print
Centre "SQR for square roots"
Print
Centre "ABS"
Print
Centre "INT"
Print
Centre "SGN returns +1,-1 or for a zero,0"
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
Cls 0 : Home
Pen 3
Print : Centre "* CALCULATOR HELP *"
Print
Pen 2
Print : Centre "Calculator Error Reports"
Print
Print : Centre '"Error" is generated for'
Print
Print : Centre "Errors in the input function"
Print
Print : Centre "Division by zero"
Print
Print : Centre "Errors in evaluating functions"
Print
Centre "E.G"
Print
Centre "Tan(90)"
Print
Centre "LOG, -ve nos generate error report"
Print
Centre "LN, -ve nos generate error report"
Print
Centre "SQR, -ve nos generate error report"
Print
Centre "Non-integer powers of -ve nos generate error report"
Print
Pen 3
Print : Centre "*"
Pen 2
Print : Print : Centre "Range -10^18 to 10^18"
Pen 3
Print : Print : Centre "*"
Pen 2
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
Clear Key
Screen Close 1
XIT:
End Proc
'
Rem *************************************************************
'
Rem ********** MAIN PROGRAM ************
Rem ************
Rem EVALUATOR
Rem ************************************
BEGIN:
Screen Open 0,320,256,16,Lowres
Curs Off : Paper 0
'
Rem Eval Globals
'
Rem Declared by Shared in Eval Procedure.
Rem Declared as Global to avoid checking 'nesting' of procedures.
Global IDS$,FUNCTION$,SIGFIGS,EVAL,EVAL#,EVAL$
Global A$,B$,C$,D$,E$,F$,G$,H$,I$,J$,K$,L$,M$,N$,O$,P$,Q$,R$,S$,T$,U$,V$,W$,X$,Y$,Z$
'
Rem Other Globals
'
Global X,N,I,TP,K1$
Global FV$,RETAINFV$,FR,HP,NDIR$
Global F$,G$,FF$,GG$
Global XOGO$
'
FF$=Dir$ : GG$=Dir$
'
EVAL$="" : SIGFIGS=0
Cls 0
Degree
'
EVALUATOR
Procedure EVALUATOR
BEGINLARGE:
XOGO$="L"
Goto BEG
BEGINSMALL:
XOGO$="S"
BEG:
OGO[XOGO$]
THEMENU
Menu On
Do
If Key State(95)=True Then HELP : OGO[XOGO$]
If Choice=0 Then Goto NOCHOICE
If Choice=-1 Then
If Choice(1)=1 and Choice(2)=1 and Choice(3)=1 Then Goto BEGINLARGE
If Choice(1)=1 and Choice(2)=1 and Choice(3)=2 Then Goto BEGINSMALL
If Choice(1)=1 and Choice(2)=2 Then HELP : OGO[XOGO$]
'If Choice(1)=1 and Choice(2)=2 and Choice(3)=1 Then HELP : OGO[XOGO$]
'If Choice(1)=1 and Choice(2)=2 and Choice(3)=2 Then HELPEVAL : OGO[XOGO$]
If Choice(1)=1 and Choice(2)=3 Then Cls 0 : AMOSC : End
If Choice(1)=2 and Choice(2)=1 Then X : OGO[XOGO$]
If Choice(1)=2 and Choice(2)=2 Then XY : OGO[XOGO$]
If Choice(1)=2 and Choice(2)=3 Then XYZ : OGO[XOGO$]
If Choice(1)=2 and Choice(2)=4 Then XYZT : OGO[XOGO$]
If Choice(1)=2 and Choice(2)=5 Then QF : OGO[XOGO$]
If Choice(1)=2 and Choice(2)=6 Then GTSIGFIGS : OGO[XOGO$]
If Choice(1)=3 and Choice(2)=1 Then FLOAD : ANSDIS : N=0 : OGO[XOGO$]
Rem For Files Menu
If Choice(1)=3 and Choice(2)=2 Then RUBOUT
If Choice(1)=3 and Choice(2)=3 Then RETITLE
If Choice(1)=3 and Choice(2)=4 Then CPY
If Choice(1)=3 and Choice(2)=5 Then Cls 0 : MDIR : OGO[XOGO$]
If Choice(1)=3 and Choice(2)=6 Then Cls 0 : ERASDIR : OGO[XOGO$]
If Choice(1)=3 and Choice(2)=8 Then Cls 0 : BYFREE : OGO[XOGO$]
NOCHOICE:
Loop
End Proc
Procedure THEMENU
Menu$(1)=" Options "
Menu$(1,1)=" Write "
Menu$(1,1,1)=" Large "
Menu$(1,1,2)=" Small "
Menu$(1,2)=" Help "
'Menu$(1,2,1)=" Evaluator "
'Menu$(1,2,2)=" EVAL "
Menu$(1,3)=" Quit "
Menu$(2)=" Functions "
Menu$(2,1)=" f{x} "
Menu$(2,2)=" f{x,y} "
Menu$(2,3)=" f{x,y,z} "
Menu$(2,4)=" f{x,y,z,t} "
Menu$(2,5)=" Quick Formula "
Menu$(2,6)="(IN1,1) Sig Figs (IN1,0)"
Menu$(3)=" Files "
Menu$(3,1)=" Display "
Menu$(3,2)="Delete"
Menu$(3,3)="ReName"
Menu$(3,4)="Copy"
Menu$(3,5)="MakeDir"
Menu$(3,6)="EraseDir"
Menu$(3,7)="(IN1,1)(SS6)A(SS0)(LO10,0)A><WB(IN1,0)"
Menu$(3,8)="Free"
End Proc
'
Procedure OGO[XOGO$]
'
If XOGO$="S" Then Goto SMALLOGO
'
LARGOGO:
Screen Open 0,320,256,4,Lowres
Curs Off : Paper 0 : Cls : FR=1 : HP=1 : Flash Off
Colour 3,$FF0 : Colour 1,$800
Goto ALLOGO
'
SMALLOGO:
Screen Open 0,640,256,4,Hires
Curs Off : Paper 0 : Cls : FR=2 : HP=1 : Flash Off
Colour 3,$FF0 : Colour 1,$800
'
ALLOGO:
Limit Mouse 128,44 To 768,300
Cls 0
Locate 0,10
Centre Border$("EVALUATOR",1)
Ink 1
Ellipse 155*FR,84,50*FR,20
Ink 3
Ellipse 155*FR,84,60*FR,30
Rem Zeroise parapeters
For I=1 To 181
K$(I)=""
Next I
K1$=""
N=0
End Proc
Procedure HELP
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,640,256,4,Hires
Curs Off : Flash Off : Colour 3,$FF0
Cls 0
Paper 0
Print
Print : Centre "****** HELP ******"
Print
Print : Centre " A program to input and evaluate formulas"
Print
Pen 3
Print : Centre " Examples of use of Evaluator :"
Print
Print : Centre "1.Find VAT of 15%"
Print : Centre "QuickFormula"
Print : Centre "a*15/100"
Print : Centre "Input amounts as a"
Print
Print : Centre "2.Add pairs of numbers"
Print : Centre "QuickFormula"
Print : Centre "a+b"
Print
Print : Centre " 3.Distance for a (sinusoidally) accelerating particle "
Print : Centre " f(x,y,z,t)=x*t+(y/2)*sin(z*t)*t^2"
Print : Centre " {x=initial velocity,y=acceleration,t=time,z=constant}"
Print
Print : Centre "4.Height of a building"
Print : Centre "QuickFormula"
Print : Centre "d*tan(a)"
Print : Centre "where d=distance and a=angle of elevation"
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
HELP1A
HELP2
XIT:
End Proc
Procedure HELP1A
Cls 0
Paper 0
Home
Print : Print
Centre "****** HELP ******"
Print : Pen 3 : Print : Centre " Files"
Print : Print : Pen 2 : Centre "Use menu for"
Print : Centre "Display"
Print : Centre "Delete"
Print : Centre "Rename to same disk"
Print : Centre "Copy"
Print : Centre "Make Directory"
Print : Centre "Delete 'empty' Directory"
Print : Centre "Query Free Space"
Print
Print : Pen 3 : Print : Centre "WorkBench"
Print : Centre "Press Left Amiga A to toggle WorkBench"
Print : Pen 2 : Print : Centre "Right Mouse for Menu"
Print
Centre "Select Initialise to Format a Disk"
Print
Centre "/!\ All data will be IRRETRIEVABLY lost"
Print
Print
Centre "To Copy a disk"
Print
Centre "/!\ WRITE PROTECT"
Print
Centre "Move its Icon onto the new disk"
Print : Print : Pen 3 : Centre "Printer"
Print : Centre "Press Left Amiga A to toggle WorkBench"
Print : Print : Pen 2 : Centre "Select Preferences to alter Printer Settings"
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
Clear Key
End Proc
Procedure HELP1B
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,640,256,4,Hires
Curs Off : Flash Off : Colour 3,$FF0
Cls 0
Paper 0
Home
Print
Print : Centre "****** HELP ******"
Print
Pen 3
Print : Centre "use < and > to scroll "
Print
Print : Centre 'left and right'
Print
Pen 2
Print : Centre "TO ALIGN"
Print
Print : Centre "(in display mode)"
Print
Pen 3
Print : Centre "Left mouse key"
Print
Print : Centre "inserts one space "
Print
Print : Centre "at start of line"
Print
Print : Centre "only if a space exists already"
Print
Print
Print : Centre "Right mouse key"
Print
Print : Centre "removes one space"
Print
Print : Centre "from a double space"
Print
Print : Centre "at start of line"
Print
Print : Print : Centre "************************"
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
HP=1
HELP2
XIT:
End Proc
Procedure HELP2
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
If HP=2 Then Screen Open 1,640,256,4,Hires
Curs Off : Flash Off : Colour 3,$FF0
Cls 0
Paper 0
Home
Print
Pen 3
Print : Centre "****** HELP ******"
Print
Pen 2
Print : Centre "Error Reports"
Print
Print : Centre '"Error" is generated for'
Print
Print : Centre "Errors in the input function"
Print
Print : Centre "Division by zero"
Print
Print : Centre "Errors in evaluating functions"
Print
Centre "E.G"
Print
Centre "Tan(90)"
Print
Centre "LOG, -ve nos generate error report"
Print
Centre "LN, -ve nos generate error report"
Print
Centre "SQR, -ve nos generate error report"
Print
Centre "Non-integer powers of -ve nos generate error report"
Print
Pen 3
Print : Centre "*"
Pen 2
Print
Print : Centre "Maximum number of evaluations per function = 170."
Print : Centre "For Display with 170 evaluations:"
Print : Centre "No Insert allowed - delete a line first"
Pen 3
Print : Print : Centre "*"
Pen 2
Print : Print : Centre "Range -10^18 to 10^18"
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
HELP3
XIT:
End Proc
Procedure HELP3
Cls 0
Paper 0
Home
Print
Centre "****** HELP ******"
Print
Print
Pen 3
Centre " Functions and Trigonometric Expressions Allowed"
Pen 2
Print
Print
Centre "SIN"
Print
Centre "COS"
Print
Centre "TAN"
Print
Centre "ASIN"
Print
Centre "ACOS"
Print
Centre "ATAN"
Print
Centre "HSIN or SINH"
Print
Centre "HCOS or COSH"
Print
Centre "HTAN or TANH"
Print
Centre "LOG for base 10"
Print
Centre "EXP"
Print
Centre "LN Naperian,ie for base e"
Print
Centre "SQR for square roots"
Print
Centre "ABS"
Print
Centre "INT"
Print
Centre "SGN returns +1,-1 or for a zero,0"
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
Clear Key
Screen Close 1
End Proc
Procedure HELPEVAL
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,640,256,4,Hires
Curs Off : Flash Off : Colour 3,$FF0
Cls 0
Paper 0
Home
Centre "**** Using EVAL in AMOS Programs ****"
Print : Print : Pen 3 : Centre "Merge Eval.AMOS"
Print : Centre "from the Evaluator Disk"
Print : Centre "to obtain Procedure EVAL[IDS$,FUNCTION$,SIGFIGS]"
Print : Print : Pen 2 : Centre "Try the following program"
Print : Pen 3 : Centre 'Global X$,Y$,Eval$'
Print : Centre "Degree"
Print : Centre 'SIGFIGS=0 : IDS$=""'
Print : Centre 'Rem IDS$ = "" or "#" or "$"'
Print : Centre "Rem for Integer,Decimal or String"
Print : Centre 'Do'
Print : Centre 'Input "x = {* to exit}";X$'
Print : Centre 'If X$="*" then Exit'
Print : Centre 'Input "y = ";Y$'
Print : Centre 'Input "f(x,y) = ";FUNCTION$'
Print : Centre "EVAL[IDS$,FUNCTION$,SIGFIGS]"
Print : Centre "Print EVAL$"
Print : Centre 'Loop'
Print : Centre "End"
Print : Centre "Procedure EVAL[IDS$,FUNCTION$,SIGFIGS]"
Print : Print : Pen 2 : Centre "Note EVAL Local parameters"
Print : Centre 'end in "VQ" to avoid program clashes'
Print : Print : Centre "Shared Variables used are"
Print : Centre "IDS$,FUNCTION$,SIGFIGS,EVAL,EVAL#,EVAL$"
Print : Centre "A-Z or A#-Z# or A$-Z$ as required."
Print : Print
Wait 50
Do
If(Mouse Key=1) or(Key State(95)=True) or(Key State(37)=True) Then Exit
Loop
Clear Key
Screen Close 1
XIT:
End Proc
Procedure X
N=1
Cls 0
Border 3,3,0
Title Top Space$(17*FR)+"Evaluator"
Paper 1 : Pen 2
Wind Open 1,20*FR,40,35*FR,1,0
Wind Open 2,50*FR,60,25*FR,1,0
Wind Open 3,50*FR,80,25*FR,1,0
Window 1
Input "f(x) = ";FV$; : K1$="f(x)="+FV$
RETAINFV$=FV$
Do
FV$=RETAINFV$
Window 2
Input "x = ";X$; : K$(N)=" x="+X$
'
EVAL["$",FV$,SIGFIGS]
'
Window 3
Print "f(x) = ";EVAL$; : K$(N)=K$(N)+" f(x)="+EVAL$
Wait Vbl
Window 0
Paper 0
Locate 0,22
Centre "[space] next number"
STPX:
Locate 0,24 : Pen 3 : Centre "[S]ave [P]rint [D]isplay [Q]uit"
Locate 0,26 : Pen 3 : Centre "[H]elp" : Pen 2
Do
A$=Inkey$
FRR=26*FR+7*(FR-1)
If(A$="S") or(A$="s") Then ANSAVE
If(A$="P") or(A$="p") Then ANSPT
If(A$="D") or(A$="d") Then Cls 0 : ANSDIS : Exit
If(A$="Q") or(A$="q") Then Exit
If(A$="H") or(A$="h") Then HP=2 : HELP2 : HP=1
If A$=" " and N<171 Then Goto NXT
Loop
Goto FINA
NXT:
N=N+1
Paper 1
Window 2 : Clw
If N=171 Then Centre "170 Evaluations"
Window 3 : Clw
If N=171 Then Centre "Restart for more"
If N=171 Then Window 0 : Paper 0 : Locate 0,22 : Cline : Goto STPX
Loop
FINA:
End Proc
Procedure XY
N=1
Cls 0
Border 3,3,0
Title Top Space$(17*FR)+"Evaluator"
Paper 1 : Pen 2
Wind Open 1,20*FR,40,35*FR,1,0
Wind Open 2,50*FR,60,25*FR,1,0
Wind Open 3,50*FR,80,25*FR,1,0
Wind Open 4,50*FR,100,25*FR,1,0
Window 1
Input "f(x,y) = ";FV$; : K1$="f(x,y)="+FV$
RETAINFV$=FV$
Do
K$(N)=""
FV$=RETAINFV$
Window 2
Input "x = ";X$; : K$(N)=" x="+X$
Window 3
Input "y = ";Y$; : K$(N)=K$(N)+" y="+Y$
'
EVAL["$",FV$,SIGFIGS]
'
Window 4
Print "f(x,y) = ";EVAL$; : K$(N)=K$(N)+" f(x,y)="+EVAL$
Wait Vbl
Window 0
Paper 0
Locate 0,22
Centre "[space] next numbers"
STPXY:
Locate 0,24 : Pen 3 : Centre "[S]ave [P]rint [D]isplay [Q]uit"
Locate 0,26 : Pen 3 : Centre "[H]elp" : Pen 2
Do
A$=Inkey$
FRR=24*FR+9*(FR-1)
If A$="S" Then ANSAVE
If A$="s" Then ANSAVE
If A$="P" Then ANSPT
If A$="p" Then ANSPT
If A$="D" Then Cls 0 : ANSDIS : Exit
If A$="d" Then Cls 0 : ANSDIS : Exit
If A$="Q" Then Exit
If A$="q" Then Exit
If A$="H" Then HP=2 : HELP2 : HP=1
If A$="h" Then HP=2 : HELP2 : HP=1
If A$=" " and N<171 Then Goto NXTXY
Loop
Goto FINAXY
NXTXY:
N=N+1
Paper 1
Window 2 : Clw
Window 3 : Clw
If N=171 Then Centre "170 Evaluations"
Window 4 : Clw
If N=171 Then Centre "Restart for more"
If N=171 Then Window 0 : Paper 0 : Locate 0,22 : Cline : Goto STPXY
Loop
FINAXY:
End Proc
Procedure XYZ
N=1
Cls 0
Border 3,3,0
Title Top Space$(17*FR)+"Evaluator"
Paper 1 : Pen 2
Wind Open 1,20*FR,40,35*FR,1,0
Wind Open 2,50*FR,60,25*FR,1,0
Wind Open 3,50*FR,80,25*FR,1,0
Wind Open 4,50*FR,100,25*FR,1,0
Wind Open 5,50*FR,120,25*FR,1,0
Window 1
Input "f(x,y,z) = ";FV$; : K1$="f(x,y,z)="+FV$
RETAINFV$=FV$
Do
FV$=RETAINFV$
Window 2
Input "x = ";X$; : K$(N)=" x="+X$
Window 3
Input "y = ";Y$; : K$(N)=K$(N)+" y="+Y$
Window 4
Input "z = ";Z$; : K$(N)=K$(N)+" z="+Z$
'
EVAL["$",FV$,SIGFIGS]
'
Window 5
Print "f(x,y,z) = ";EVAL$; : K$(N)=K$(N)+" f(x,y,z)="+EVAL$
Wait Vbl
Window 0
Paper 0
Locate 0,22
Centre "[space] next numbers"
STPXYZ:
Locate 0,24 : Pen 3 : Centre "[S]ave [P]rint [D]isplay [Q]uit"
Locate 0,26 : Pen 3 : Centre "[H]elp" : Pen 2
Do
A$=Inkey$
FRR=22*FR+11*(FR-1)
If A$="S" Then ANSAVE
If A$="s" Then ANSAVE
If A$="P" Then ANSPT
If A$="p" Then ANSPT
If A$="D" Then Cls 0 : ANSDIS : Exit
If A$="d" Then Cls 0 : ANSDIS : Exit
If A$="Q" Then Exit
If A$="q" Then Exit
If A$="H" Then HP=2 : HELP2 : HP=1
If A$="h" Then HP=2 : HELP2 : HP=1
If A$=" " and N<171 Then Goto NXTXYZ
Loop
Goto FINAXYZ
NXTXYZ:
N=N+1
Paper 1
For I=2 To 4 : Window I : Clw : Next I
If N=171 Then Centre "170 Evaluations"
Window 5 : Clw
If N=171 Then Centre "Restart for more"
If N=171 Then Window 0 : Paper 0 : Locate 0,22 : Cline : Goto STPXYZ
Loop
FINAXYZ:
End Proc
Procedure XYZT
N=1
Cls 0
Border 3,3,0
Title Top Space$(17*FR)+"Evaluator"
Paper 1 : Pen 2
Wind Open 1,20*FR,40,35*FR,1,0
Wind Open 2,50*FR,60,25*FR,1,0
Wind Open 3,50*FR,80,25*FR,1,0
Wind Open 4,50*FR,100,25*FR,1,0
Wind Open 5,50*FR,120,25*FR,1,0
Wind Open 6,50*FR,140,25*FR,1,0
Window 1
Input "f(x,y,z,t) = ";FV$; : K1$="f(x,y,z,t)="+FV$
RETAINFV$=FV$
Do
FV$=RETAINFV$
Window 2
Input "x = ";X$; : K$(N)=" x="+X$
Window 3
Input "y = ";Y$; : K$(N)=K$(N)+" y="+Y$
Window 4
Input "z = ";Z$; : K$(N)=K$(N)+" z="+Z$
Window 5
Input "t = ";T$; : K$(N)=K$(N)+" t="+T$
'
EVAL["$",FV$,SIGFIGS]
'
Window 6
Print "f(x,y,z,t) = ";EVAL$; : K$(N)=K$(N)+" f(x,y,z,t)="+EVAL$
Wait Vbl
Window 0
Paper 0
Locate 0,22
Centre "[space] next numbers"
STPXYZT:
Locate 0,24 : Pen 3 : Centre "[S]ave [P]rint [D]isplay [Q]uit"
Locate 0,26 : Pen 3 : Centre "[H]elp" : Pen 2
Do
A$=Inkey$
FRR=20*FR+13*(FR-1)
If A$="S" Then ANSAVE
If A$="s" Then ANSAVE
If A$="P" Then ANSPT
If A$="p" Then ANSPT
If A$="D" Then Cls 0 : ANSDIS : Exit
If A$="d" Then Cls 0 : ANSDIS : Exit
If A$="Q" Then CODE$="From input" : Exit
If A$="q" Then CODE$="From input" : Exit
If A$="H" Then HP=2 : HELP2 : HP=1
If A$="h" Then HP=2 : HELP2 : HP=1
If A$=" " and N<171 Then Goto NXTXYZT
Loop
Goto FINAXYZT
NXTXYZT:
N=N+1
Paper 1
For I=2 To 5 : Window I : Clw : Next I
If N=171 Then Centre "170 Evaluations"
Window 6 : Clw
If N=171 Then Centre "Restart for more"
If N=171 Then Window 0 : Paper 0 : Locate 0,22 : Cline : Goto STPXYZT
Loop
FINAXYZT:
End Proc
Procedure GTSIGFIGS
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 2,320,64,4,Hires
Screen Display 2,200,93,320,64
Curs Off : Cls 1 : Flash Off
Colour 3,$99
Print : Centre "Select Significant figures"
Print
Reserve Zone 8
Reset Zone
Reserve Zone 8
For I=1 To 6
Paper 3
IG$=" "+Chr$(48+I)+" "
Locate 4*I,3 : Print Zone$(IG$,I)
Next I
Locate 15,5 : Print Zone$("other",7)
Locate 29,5 : Print Zone$("none",8)
While Mouse Key<>0 : Wend
Do
M=Mouse Zone
For I=1 To 6
If M=I and Mouse Key=1 Then SIGFIGS=M : Goto XIT
Next I
If M=7 and Mouse Key Then Paper 1 : Cls 1 : Home : Print : Print : Input " No of Sig Figs ";SIGFIGS : Exit
If M=8 and Mouse Key Then SIGFIGS=0 : Exit
Loop
XIT:
While Mouse Key<>0 : Wend
Screen Close 2
End Proc
'
Procedure QF
ZEROIZE
Cls 0
Border 3,3,0
Title Top Space$(17*FR)+"Evaluator"
Paper 1 : Pen 2
Wind Open 1,20*FR,40,35*FR,1,0
Wind Open 2,50*FR,60,25*FR,1,0
Wind Open 3,50*FR,80,25*FR,1,0
Window 1
Input "Formula: ";FV$; : FV$=Lower$(FV$) : K1$=FV$
Clw
Centre Left$(K1$,35*FR-2)
RETAINFV$=K1$
N=1
Do
FV$=RETAINFV$
Window 2
'
Rem Functions to lower case
'
FV$=Upper$(FV$)
Restore NWDT
For J=1 To 20
Read AV$
BV$=Lower$(AV$)
L=Len(AV$)
Do
I=Instr(FV$,AV$)
If I=0 Then Exit
FV$=Left$(FV$,I-1)+BV$+Mid$(FV$,I+L)
Loop
Next J
'
Rem Replace upper case letters by 'numbers'
For J=65 To 90
Do
I=Instr(FV$,Chr$(J))
If I=0 Then Exit
Clw
If J=65 Then Input "a = ";A$ : Exit
If J=66 Then Input "b = ";B$ : Exit
If J=67 Then Input "c = ";C$ : Exit
If J=68 Then Input "d = ";D$ : Exit
If J=69 Then Input "e = ";E$ : Exit
If J=70 Then Input "f = ";F$ : Exit
If J=71 Then Input "g = ";G$ : Exit
If J=72 Then Input "h = ";H$ : Exit
If J=73 Then Input "i = ";I$ : Exit
If J=74 Then Input "j = ";J$ : Exit
If J=75 Then Input "k = ";K$ : Exit
If J=76 Then Input "l = ";L$ : Exit
If J=77 Then Input "m = ";M$ : Exit
If J=78 Then Input "n = ";N$ : Exit
If J=79 Then Input "o = ";O$ : Exit
If J=80 Then Input "p = ";P$ : Exit
If J=81 Then Input "q = ";Q$ : Exit
If J=82 Then Input "r = ";R$ : Exit
If J=83 Then Input "s = ";S$ : Exit
If J=84 Then Input "t = ";T$ : Exit
If J=85 Then Input "u = ";U$ : Exit
If J=86 Then Input "v = ";V$ : Exit
If J=87 Then Input "w = ";W$ : Exit
If J=88 Then Input "x = ";X$ : Exit
If J=89 Then Input "y = ";Y$ : Exit
If J=90 Then Input "z = ";Z$ : Exit
Loop
Next J
Paper 3 : Clw : Paper 1
'
FV$=Upper$(FV$)
'
NWDT:
Data "ASIN","ACOS","ATAN","HSIN","HCOS","HTAN","SINH","COSH","TANH"
Data "SIN","COS","TAN","LOG","EXP","SQR","ABS","INT","SGN","LN","PI"
'
EVAL["$",FV$,SIGFIGS]
'
Window 3
Centre EVAL$
Wait Vbl
Window 0
Paper 0
Locate 0,22
Centre "[space] next number(s)"
Locate 0,24 : Pen 3 : Centre "[V]ariables [D]isplay [Q]uit"
Locate 0,26 : Pen 3 : Centre "[P]rint [S]ave"
Pen 2
KAY
STPX:
Do
AB$=Inkey$
If(AB$="V") or(AB$="v") Then VRBLES
If(AB$="S") or(AB$="s") Then ANSAVE
If(AB$="P") or(AB$="p") Then ANSPT
If(AB$="D") or(AB$="d") Then Cls 0 : ANSDIS : Exit
If(AB$="Q") or(AB$="q") Then Exit
If AB$=" " and N<171 Then Goto NXT
Loop
Goto FINA
NXT:
N=N+1
Paper 1
Window 2 : Clw
If N=171 Then Centre "170 Evaluations"
Window 3 : Clw
If N=171 Then Centre "Restart for more"
If N=171 Then Window 0 : Paper 0 : Locate 0,22 : Cline : Goto STPX
Loop
FINA:
End Proc
Procedure ZEROIZE
A$="" : B$="" : C$="" : D$="" : E$="" : F$="" : G$="" : H$="" : I$="" : J$="" : K$="" : L$="" : M$=""
N$="" : O$="" : P$="" : Q$="" : R$="" : S$="" : T$="" : U$="" : V$="" : W$="" : X$="" : Y$="" : Z$=""
End Proc
Procedure VRBLES
Screen Open 1,320,256,4,Lowres
Flash Off : Curs Off : Colour 1,777 : Colour 3,$FF0 : Paper 1 : Pen 3
Print : Print : Centre Left$(Lower$(FV$),40)
Print
For I=65 To 90
Read AA$
If AA$<>"" Then Print : Centre Left$(Chr$(I+32)+" : "+AA$,40)
Next I
Print : Print : Centre Left$(EVAL$,40)
Wait 50
Do
If Mouse Key Then Exit
BB$=Inkey$
If(BB$="V") or(BB$="v") Then Exit
Loop
Screen Close 1
Wait 50
Clear Key
Data A$,B$,C$,D$,E$,F$,G$,H$,I$,J$,K$,L$,M$,N$,O$,P$,Q$,R$,S$,T$,U$,V$,W$,X$,Y$,Z$
End Proc
Procedure KAY
K$(N)=""
For I=65 To 90
Read AA$
If AA$<>"" Then K$(N)=K$(N)+Chr$(I+32)+" = "+AA$+" "
Next I
K$(N)=K$(N)+RETAINFV$+" = "+EVAL$
Wait 50
Clear Key
Data A$,B$,C$,D$,E$,F$,G$,H$,I$,J$,K$,L$,M$,N$,O$,P$,Q$,R$,S$,T$,U$,V$,W$,X$,Y$,Z$
End Proc
'
Procedure ANSDIS
Cls 0 : Y=1 : XL=1 : TP=0
Screen Open 0,640,256,4,Hires
Menu Off
Flash Off
Limit Mouse 128,44 To 768,300
Curs Off : Paper 0 : Cls : Colour 3,$FF0 : Colour 1,$F00 : Colour 2,$FFF
Double Buffer :
REASY:
Autoback 1
Cls 0
Curs Off
Locate 0,28 : Centre "Control slider with the mouse"
Pen 3 : Locate 0,1 : Centre "*** "+K1$+" ***" : Pen 2
If TP=2 Then Locate 0,29 : Centre "Select line to delete"
If TP=1 Then Locate 0,29 : Centre "Select line to insert,after"
If TP=0 Then Locate 0,29 : Centre "Display"
MAKEZONES
Autoback 0
Rem main loop
Do
X=1+Int((N*Y)/170)
Rem Read mouse
If Mouse Zone=1 and Mouse Key Then Y=Y Screen(Y Mouse) : Y=Y-16
For I=2 To 11
If Mouse Zone=I and Mouse Key=1 and TP=0 Then WHAT$=Mid$(K$(X+I-2),XL,1) : If WHAT$=" " Then K$(X+I-2)=Left$(K$(X+I-2),XL-1)+" "+Mid$(K$(X+I-2),XL)
If Mouse Zone=I and Mouse Key=2 and TP=0 Then WHAT$=Mid$(K$(X+I-2),XL,2) : If WHAT$=" " Then K$(X+I-2)=Left$(K$(X+I-2),XL-1)+Mid$(K$(X+I-2),XL+1)
If Mouse Zone=I and Mouse Key and TP=2 and X+I-2<N+1 Then DLNE : While Mouse Key<>0 : Wend : Goto REASY
If Mouse Zone=I and Mouse Key and TP=1 and X+I-2<N+1 Then ILINE : Goto REASY
Next I
Rem TP 0-display, 1-insert, 2-delete
If Mouse Zone=12 and Mouse Key and TP=0 Then HELP1B : HP=1
If Mouse Zone=12 and Mouse Key and TP<>0 Then HP=2 : HELP2 : HP=1
If Mouse Zone=13 and Mouse Key Then ANSAVE
If Mouse Zone=14 and Mouse Key Then ANSPT
If Mouse Zone=15 and Mouse Key Then TP=0 : Goto REASY
If Mouse Zone=16 and Mouse Key Then TP=1 : Goto REASY
If Mouse Zone=17 and Mouse Key Then TP=2 : Goto REASY
If Mouse Zone=18 and Mouse Key Then Goto FIN
If Mouse Zone=19 and Mouse Key Then XL=XL+1
If Mouse Zone=20 and Mouse Key and XL>0 Then XL=XL-1
If Y>170 Then Y=170
If Y<0 Then Y=0
Rem If slider has moved change it
If Y<>YM and Mouse Key=1 : YM=Y : End If
Rem Update display
For I=1 To 10
Locate 5,2*I+1 : Cline
Print Mid$(K$(X+I-1),XL,70);
Next I
VSLIDE[Y]
Rem Double buffering smooths the effect
Screen Swap : Wait Vbl
For I=1 To 10
Locate 5,2*I+1
Print Mid$(K$(X+I-1),XL,70);
Next I
VSLIDE[Y]
Loop
FIN:
Screen Close 0
Menu On
End Proc
Procedure MAKEZONES
Reserve Zone 20
Set Zone 1,0,16 To 10,186
For I=2 To 11
Locate 5,(I-1)*2+1
Print Zone$(" ",I)
Next I
Pen 3
Locate 5,26 : Print Zone$(Border$("Help",1),12)
Locate 15,26 : Print Zone$(Border$("Save",1),13)
Locate 25,26 : Print Zone$(Border$("Print",1),14)
Locate 35,26 : Print Zone$(Border$("Display",1),15)
Locate 45,26 : Print Zone$(Border$("Insert",1),16)
Locate 55,26 : Print Zone$(Border$("Delete",1),17)
Locate 65,26 : Print Zone$(Border$("Finish",1),18)
Locate 2,28 : Print Zone$(Border$("<",1),19)
Locate 73,28 : Print Zone$(Border$(">",1),20)
Pen 2
End Proc
Procedure VSLIDE[Y]
Set Slider 1,1,3,1,3,3,3,1
Rem Display a slider bar using the Vslider command
Vslider 0,16 To 10,186,170,Y,5
End Proc
Procedure ANSAVE
On Error Goto ERRTRAP
AA$="{Use | for /} Save as ..."
IX=Instr(K1$,"=")
RETAINFV$=Mid$(K1$,IX+1)
BB$=Lower$(RETAINFV$)
L=Len(BB$)
Do
C=Instr(BB$,"/")
If C=0 Then Exit
BB$=Left$(BB$,C-1)+"|"+Right$(BB$,L-C)
Loop
BB$=Left$(BB$,38)
RETRYSAVE:
FILESELECTQZ[Dir$,"SWITCH",BB$,AA$]
If F$="" Then Goto NSV
EXCLUDE_FROM_SAVE[F$]
If TRY$="not ok"
AA$="Disallowed ! Try Again ! Save as ..." : Goto RETRYSAVE
End If
If Exist(F$) Then OVERWRITE
If TRY$="not ok"
AA$="Already Exists ! Try Again !" : Goto RETRYSAVE
End If
Open Out 1,F$
Print #1,K1$
For IR=1 To N
Print #1,K$(IR)
Next IR
Close 1
Goto NSV
ERRTRAP:
AA$="Save Error: Quit|Retry "
Resume RETRYSAVE
NSV:
End Proc
Procedure EXCLUDE_FROM_SAVE[F$]
IX=Instr(F$,":")
If IX=0 Then TRY$="not ok" : Goto XIT
FX$=Mid$(F$,IX+1)
Restore NEWDATA
Read NX
IX=0
Do
IX=IX+1
Read A$
If FX$=A$ Then TRY$="not ok" : Exit
If IX=NX Then TRY$="ok" : Exit
Loop
NEWDATA:
Data 53
Data ".info","Disk.info","CLI","CLI.info"
Data "Prefs.info","PrReadMe","PrReadMe.info"
Data "Evaluator","Evaluator.info","Evaluator.AMOS","EvReadMe","EvReadMe.info"
Data "Selector","Selector.info","Selector.AMOS","SeReadMe","SeReadMe.info"
Data "c/endcli","c/LoadWB","c/path","c/ppmore","c/Run"
Data "devs/clipboard.device","devs/Mountlist","devs/narrator.device"
Data "devs/parallel.device","devs/printer.device","devs/ramdrive.device"
Data "devs/serial.device","devs/system-configuration"
Data "devs/printers/custom","devs/printers/generic"
Data "l/Disk-Validator","l/FastFileSystem","l/Port-Handler"
Data "l/ram-handler","l/Speak-Handler"
Data "libs/diskfont.library","libs/icon.library","libs/info.library"
Data "libs/mathieeedoubbas.library","mathtrans.library","translator.library"
Data "Prefs/.info","Prefs/Pointer.info","Prefs/Preferences"
Data "Prefs/Preferences.info","Prefs/Printer.info","Prefs/Serial.info"
Data "s/startup-sequence"
Data "System/DiskCopy","System/FastMemFirst","System/Format"
XIT:
End Proc
Procedure OVERWRITE
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 2,320,56,4,Hires
Screen Display 2,200,100,320,56
Curs Off : Cls 1 : Colour 0,$A5
If Len(F$)>43 Then Locate 0,1 : Centre "..."+Right$(F$,40)
If Len(F$)<=43 Then Locate 0,1 : Centre F$
Print : Print : Centre "/!\ file already exits /!\"
Reserve Zone
Reserve Zone 2
Paper 0
Locate 5,5 : Print Zone$("Overwrite",1)
Locate 25,5 : Print Zone$(" Retry ",2)
Do
If Mouse Zone=1 and Mouse Key Then TRY$="ok" : Exit
If Mouse Zone=2 and Mouse Key Then TRY$="not ok" : Exit
Loop
Screen Close 2
XIT:
End Proc
Procedure ANSPT
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Lprint
Lprint K1$
Lprint
For IR=1 To N
Lprint K$(IR)
Next IR
Lprint
XIT:
End Proc
Procedure FLOAD
On Error Goto ERTRAP
A$="Select file" : B$="to display"
RETRYLOAD:
FILESELECTQZ[Dir$,"SWITCH",A$,B$]
If F$="" Then Goto NSL
Open In 1,F$
Line Input #1,K1$
I=0
Do
If Eof(1) Then Exit
I=I+1
Line Input #1,K$(I)
If I=170 Then Exit
Loop
N=I
Close 1
Goto NSL
ERTRAP:
A$="Select Error!" : B$="Retry, or Quit"
Close 1
Resume RETRYLOAD
NSL:
End Proc
Procedure DLNE
On Error Goto ER
Goto OK
ER:
ERR
Rem Cannot stop deleting lines if ilack of memory for Screen 3
Resume XIT2
OK:
Screen Open 3,320,48,4,Hires
Screen Display 3,200,100,320,48
Curs Off : Cls 1 : Flash Off : Colour 3,$73
Print : Centre "Confirm Delete"
Print
Reserve Zone 2
Reset Zone
Reserve Zone 2
Paper 3
Locate 15,3 : Print Zone$("Yes",1)
Locate 23,3 : Print Zone$("No",2)
Wait 50
While Mouse Key<>0 : Wend
Do
If Mouse Key=1 and Mouse Zone=1 Then Exit
If Mouse Key=1 and Mouse Zone=2 Then Screen Close 3 : Goto XIT
Loop
Screen Close 3
XIT2:
LINMBR=X+I-2
If N=1 Then Goto SPECCASE
If LINMER=N Then Goto SPECCASE
For IR=LINMBR To N-1
K$(IR)=K$(IR+1)
Next IR
SPECCASE:
K$(N)=""
N=N-1
XIT:
End Proc
Procedure ILINE
Rem If N>169 Then Goto XIT
If N<170 Then Goto OK
Autoback 1
Locate 0,26 : Cline : Centre "No more lines - 170 max.... RIGHT mouse key to continue"
While Mouse Key<>2 : Wend
Wait 50
Autoback 0
Goto XIT
OK:
FDL=Instr(K1$,"=")
If FDL=0 Then FRMULA : Goto XIT
K11$=Left$(K1$,FDL)
LINMER=X+I-2
If LINMER=N Then Goto SPECIALCASE
If N=1 Then Goto SPECIALCASE
For IR=N+1 To LINMER+2 Step -1
K$(IR)=K$(IR-1)
Next IR
SPECIALCASE:
K$(LINMER+1)=""
Autoback 1
Locate 0,26 : Cline
Locate 10,26
If Instr(K11$,"x")<>0 Then Input "x = ";X$ : K$(LINMER+1)=" x="+X$
Locate 0,26 : Cline
Locate 10,26
If Instr(K11$,"y")<>0 Then Input "y = ";Y$ : K$(LINMER+1)=K$(LINMER+1)+" y="+Y$
Locate 0,26 : Cline
Locate 10,26
If Instr(K11$,"z")<>0 Then Input "z = ";Z$ : K$(LINMER+1)=K$(LINMER+1)+" z="+Z$
Locate 0,26 : Cline
Locate 10,26
If Instr(K11$,"t")<>0 Then Input "t = ";T$ : K$(LINMER+1)=K$(LINMER+1)+" t="+T$
Locate 0,26 : Cline
FV$=Mid$(K1$,6)
If Instr(K11$,"y")<>0 Then FV$=Mid$(K1$,8)
If Instr(K11$,"z")<>0 Then FV$=Mid$(K1$,10)
If Instr(K11$,"t")<>0 Then FV$=Mid$(K1$,12)
'
EVAL["$",FV$,SIGFIGS]
'
If Instr(K11$,"t")<>0 Then K$(LINMER+1)=K$(LINMER+1)+" f(x,y,z,t)="+EVAL$ : Goto XXXX
If Instr(K11$,"z")<>0 Then K$(LINMER+1)=K$(LINMER+1)+" f(x,y,z)="+EVAL$ : Goto XXXX
If Instr(K11$,"y")<>0 Then K$(LINMER+1)=K$(LINMER+1)+" f(x,y)="+EVAL$ : Goto XXXX
If Instr(K11$,"x")<>0 Then K$(LINMER+1)=K$(LINMER+1)+" f(x)="+EVAL$
XXXX:
N=N+1
Autoback 0
XIT:
End Proc
Procedure FRMULA
LINMER=X+I-2
If LINMER=N Then Goto SPECIALCASE
If N=1 Then Goto SPECIALCASE
For IR=N+1 To LINMER+2 Step -1
K$(IR)=K$(IR-1)
Next IR
SPECIALCASE:
K$(LINMER+1)=""
FV$=Upper$(K1$)
Autoback 1
RETAINFV$=FV$
'
Rem Functions to lower case
'
Restore NWDT
For J=1 To 26
Read AV$
BV$=Lower$(AV$)
L=Len(AV$)
Do
I=Instr(FV$,AV$)
If I=0 Then Exit
FV$=Left$(FV$,I-1)+BV$+Mid$(FV$,I+L)
Loop
Next J
'
Rem Replace upper case letters by 'numbers'
For J=65 To 90
Do
I=Instr(FV$,Chr$(J))
If I=0 Then Exit
Locate 0,26 : Cline
Locate 10,26
If J=65 Then Input "a = ";A$ : K$(LINMER+1)=K$(LINMER+1)+"a = "+A$+" " : Exit
If J=66 Then Input "b = ";B$ : K$(LINMER+1)=K$(LINMER+1)+"b = "+B$+" " : Exit
If J=67 Then Input "c = ";C$ : K$(LINMER+1)=K$(LINMER+1)+"c = "+C$+" " : Exit
If J=68 Then Input "d = ";D$ : K$(LINMER+1)=K$(LINMER+1)+"d = "+D$+" " : Exit
If J=69 Then Input "e = ";E$ : K$(LINMER+1)=K$(LINMER+1)+"e = "+E$+" " : Exit
If J=70 Then Input "f = ";F$ : K$(LINMER+1)=K$(LINMER+1)+"f = "+F$+" " : Exit
If J=71 Then Input "g = ";G$ : K$(LINMER+1)=K$(LINMER+1)+"g = "+G$+" " : Exit
If J=72 Then Input "h = ";H$ : K$(LINMER+1)=K$(LINMER+1)+"h = "+H$+" " : Exit
If J=73 Then Input "i = ";I$ : K$(LINMER+1)=K$(LINMER+1)+"i = "+I$+" " : Exit
If J=74 Then Input "j = ";J$ : K$(LINMER+1)=K$(LINMER+1)+"j = "+J$+" " : Exit
If J=75 Then Input "k = ";K$ : K$(LINMER+1)=K$(LINMER+1)+"k = "+K$+" " : Exit
If J=76 Then Input "l = ";L$ : K$(LINMER+1)=K$(LINMER+1)+"l = "+L$+" " : Exit
If J=77 Then Input "m = ";M$ : K$(LINMER+1)=K$(LINMER+1)+"m = "+M$+" " : Exit
If J=78 Then Input "n = ";N$ : K$(LINMER+1)=K$(LINMER+1)+"n = "+N$+" " : Exit
If J=79 Then Input "o = ";O$ : K$(LINMER+1)=K$(LINMER+1)+"o = "+O$+" " : Exit
If J=80 Then Input "p = ";P$ : K$(LINMER+1)=K$(LINMER+1)+"p = "+P$+" " : Exit
If J=81 Then Input "q = ";Q$ : K$(LINMER+1)=K$(LINMER+1)+"q = "+Q$+" " : Exit
If J=82 Then Input "r = ";R$ : K$(LINMER+1)=K$(LINMER+1)+"r = "+R$+" " : Exit
If J=83 Then Input "s = ";S$ : K$(LINMER+1)=K$(LINMER+1)+"s = "+S$+" " : Exit
If J=84 Then Input "t = ";T$ : K$(LINMER+1)=K$(LINMER+1)+"t = "+T$+" " : Exit
If J=85 Then Input "u = ";U$ : K$(LINMER+1)=K$(LINMER+1)+"u = "+U$+" " : Exit
If J=86 Then Input "v = ";V$ : K$(LINMER+1)=K$(LINMER+1)+"v = "+V$+" " : Exit
If J=87 Then Input "w = ";W$ : K$(LINMER+1)=K$(LINMER+1)+"w = "+W$+" " : Exit
If J=88 Then Input "x = ";X$ : K$(LINMER+1)=K$(LINMER+1)+"x = "+X$+" " : Exit
If J=89 Then Input "y = ";Y$ : K$(LINMER+1)=K$(LINMER+1)+"y = "+Y$+" " : Exit
If J=90 Then Input "z = ";Z$ : K$(LINMER+1)=K$(LINMER+1)+"z = "+Z$+" " : Exit
Loop
Next J
'
FV$=Upper$(FV$)
'
NWDT:
Data "ACOS","ATAN","HSIN","HCOS","HTAN","SIN","COS","TAN","LOG","EXP","SQR","ABS","INT","SGN","LN"
Data "0E","1E","2E","3E","4E","5E","6E","7E","8E","9E","PI"
'
EVAL["$",FV$,SIGFIGS]
'
K$(LINMER+1)=K$(LINMER+1)+K1$+" = "+EVAL$
XXXX:
N=N+1
Autoback 0
XIT:
End Proc
'
Rem Files
'
Procedure RUBOUT
RBOUT:
A$="Delete a File" : B$="IRREVERSIBLE - Quit to leave"
On Error Goto ER
Goto OK
ER:
A$="/!\Error! Delete a File"
Resume OK
OK:
Do
FILESELECTQZ[FF$,"SWITCH","Delete a File","IRREVERSIBLE - Quit to leave"] : SD
If F$="" Then Goto XIT
Kill F$
Loop
Goto RBOUT
XIT:
End Proc
Procedure RETITLE
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
FG$=FF$
Dir$=FF$
RETIT:
FILESELECTQZ[FG$,"SWITCH"," Select File to Retitle"," Quit to Leave "]
If F$="" Then Goto XIT
'
Rem Temp Dir Change
FG$=Flip$(Dir$)
If Instr(FG$,"/")<>0
FG$=Mid$(FG$,Instr(FG$,"/")) : FG$=Flip$(FG$) : Goto OK2
End If
If Instr(FG$,":")<>0
FG$=Mid$(FG$,Instr(FG$,":")) : FG$=Flip$(FG$) : Goto OK2
End If
OK2:
'
L=Len(F$)
If L<=28 Then A$=" ReName: "+F$
If L>28 Then A$=" ReName: ... "+Right$(F$,25)
KEEPKEEPF$=F$
FILESELECTQZ[FG$,"SWITCH",A$," as . . ."]
G$=F$
F$=KEEPKEEPF$
If G$="" Then Goto XIT
Rename F$ To G$
Goto RETIT
XIT:
Curs Off
End Proc
Procedure CPY
Clear Key
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Do
Erase 6
FILESELECTQZ[FF$,"SWITCH","Select File to Copy",""] : SD
If F$="" Then Goto XIT
KEEPKEEPF$=F$
FILESELECTQZ[GG$,"SWITCH",Right$(F$,38),"Copy to"]
G$=F$
F$=KEEPKEEPF$
SDG
If G$="" Then Goto XIT
Open In 1,F$ : LFILE=Lof(1) : Close 1
Reserve As Work 6,LFILE
Bload F$,Start(6)
Bsave G$,Start(6) To Start(6)+LFILE
Loop
XIT:
Erase 6
End Proc
Procedure MDIR
Clear Key
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,320,56,4,Hires
Screen Display 1,200,100,320,56
Curs Off : Cls 1
Print : Centre "Make Directory"
Print : Print : Centre "Enter new directory {eg df0:new}"
Print : Print
Input " ";NDIR$
Curs Off
On Error Goto ER2
Goto OK2
ER2:
Screen Close 1
ERR
Resume XIT
OK2:
Mkdir NDIR$
Screen Close 1
XIT:
End Proc
Procedure ERASDIR
Clear Key
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,320,48,4,Hires
Screen Display 1,200,100,320,48
Curs Off : Cls 1
Print : Centre "Enter EMPTY directory {eg df0:new}"
Print : Print
Input " Erase ";NDIR$
Curs Off
Dreg(1)=Varptr(NDIR$)
H=Doscall(-72)
If H<>0 Then Goto XIT2
If H=0 Then Centre "Not Done."
Do : Exit If Mouse Key=1 : Loop
XIT2:
Wait 50
Screen Close 1
XIT:
End Proc
Procedure BYFREE
Clear Key
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,320,64,4,Hires
Screen Display 1,200,100,320,64
Curs Off : Cls 1
Print : Centre " Free Memory (bytes) "
Print
Print : Centre " Disk "+Str$(Dfree)
Print : Centre "{"+"Chip:"+Str$(Chip Free)+" "+"Fast:"+Str$(Fast Free)+"}"
Print
Print : Centre "Press Left Mouse Key"
Wait 50
Do : Exit If Mouse Key=1 : Loop
Screen Close 1
XIT:
End Proc
Procedure SD
Rem Automatic Directory Setter
Rem Global FF$ : FF$=Dir$ needed at start
Rem After file selector {using Fsel$...} append : SD
If F$="" Then Goto XIT
KEEPFF$=FF$
FF$=F$
I10=Instr(FF$,":")
FF2$=Right$(FF$,Len(FF$)-I10)
If Instr(FF2$,":")<>0 Then FF$=KEEPFF$ : Goto XIT
FF$=Flip$(FF$)
I11=Instr(FF$,"/")
If I11=0 Then FF$=Left$(Flip$(FF$),I10) : Goto XIT
FF$=Left$(Flip$(FF$),(Len(FF$)-I11+1))
XIT:
End Proc
Procedure SDG
If G$="" Then Goto XIT
KEEPGG$=GG$
GG$=G$
I10=Instr(GG$,":")
GG2$=Right$(GG$,Len(GG$)-I10)
If Instr(GG2$,":")<>0 Then GG$=KEEPGG$ : Goto XIT
GG$=Flip$(GG$)
I11=Instr(GG$,"/")
If I11=0 Then GG$=Left$(Flip$(GG$),I10) : Goto XIT
GG$=Left$(Flip$(GG$),(Len(GG$)-I11+1))
XIT:
End Proc
'
Rem
Procedure ERRING
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
XIT:
End Proc
Rem
Procedure ERR
On Error Goto ER
Goto OK
ER:
Resume XIT
OK:
Screen Open 3,320,48,4,Hires
Screen Display 3,200,100,320,48
Curs Off : Cls 1
Print : Centre "Error - Out of Memory/Range?"
Print
Print : Centre "Press Left Mouse Key"
Wait 50
Do : Exit If Mouse Key=1 : Loop
Screen Close 3
XIT:
End Proc
Rem
'
'
Rem Own File Selector
'
'Global F$
'
'Dim LQZ$(200),MITQZ$(70)
'Global LQZ$(),FLEQZ$,MITQZ$(),LLQZ$
'Global DRECTORYQZ$,MESSAGE1QZ$,MESSAGE2QZ$
'Global NQZ,XQZ,IQZ
'
'FILESELECTQZ[Dir$,"SWITCH","Please Select","a File"]
Procedure FILESELECTQZ[DRECTORYQZ$,SWITCH$,MESSAGE1QZ$,MESSAGE2QZ$]
''''''''''''''''''''''''''''''''''''''''''''''
If Not Exist(DRECTORYQZ$) Then ERR : Goto XIT5
If SWITCH$="-AMOS-"
F$=Fsel$(DRECTORYQZ$,"",MESSAGE1QZ$,MESSAGE2QZ$) : Goto XIT5
End If
If SWITCH$="CUSTOM"
Goto FRESH
End If
MARKQZ$=""
On Error Goto ER3
Goto OK3
ER3:
ERR
MARKQZ$="SP"
Resume XIT4
OK3:
Screen Open 1,320,56,4,Hires
Screen Display 1,200,100,320,56
Curs Off : Cls 1 : Colour 0,$70
Locate 0,1 : Centre "Single File Selector"
Locate 0,5 : Centre "Choose Preferred"
Reserve Zone
Reserve Zone 2
Paper 0
Locate 12,3 : Print Zone$("-AMOS-",1);
Locate 22,3 : Print Zone$("CUSTOM",2)
Do
If Mouse Zone=1 and Mouse Key Then Screen Close 1 : F$=Fsel$(DRECTORYQZ$,"",MESSAGE1QZ$,MESSAGE2QZ$) : Goto XIT5
If Mouse Zone=2 and Mouse Key Then Exit
Loop
Screen Close 1
'''''''''''''''''''''''''''''''''''''''''''''''''''''
FRESH:
If Right$(DRECTORYQZ$,1)="/" Then DRECTORYQZ$=Left$(DRECTORYQZ$,Len(DRECTORYQZ$)-1)
NQZ=0
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
FLEQZ$=""
Gosub WN1DIR
Screen Open 2,640,192,4,Hires
Flash Off : Curs Off
If CRQZ=0 : Colour 0,$7A : End If
If CRQZ=1 : Colour 0,$390 : End If
If CRQZ=2 : Colour 0,$A77 : End If
If CRQZ=3 : Colour 0,$BB5 : End If
Colour 1,$700 : Paper 0 : Cls 0 : Colour 3,$FF0
Screen Display 2,140,65,320,192
Wind Open 1,0,0,40,24 : Paper 0 : Curs Off
' Wind Open 2,320,0,40,24 : Paper 0 : Curs Off
Wind Open 2,320,0,40,24 : Paper 0 : Curs Off
Gosub SELECTOR_WINDOWS
WN1DIR:
Gosub RESET
NQZ=1
FFQZ$=DRECTORYQZ$
LQZ$(1)=Dir First$(DRECTORYQZ$)
Do
NQZ=NQZ+1
LQZ$(NQZ)=Dir Next$
If LQZ$(NQZ)="" Then NQZ=NQZ-1 : Exit
Loop
Return
SELECTOR_WINDOWS:
RESTART:
Y Mouse=Y Hard(0)
WN1:
XQZ=1
REASYLOOK:
Window 2 : Pen 1
Locate 0,0 : Cline : Pen 1 : Centre "Single File Selector"
Locate 0,2 : Cline : Centre MESSAGE1QZ$
Locate 0,3 : Cline : Centre MESSAGE2QZ$
Window 1 : Pen 1
Locate 0,0 : Cline : Centre "Source" : Ink 3 : Box 1,1 To 30,3
WN12:
XQZ=1
MESSAGEQZ$=Left$(DRECTORYQZ$,30)+"..."
Locate 0,22 : Cline : Pen 1 : Centre MESSAGEQZ$
REASYLOOK2:
XKQZ=0
PLQZ=0 : Gosub MAKEFSZONES
Pen 2
Rem main loop
Do
For IQZ=2 To 21
'
If Mouse Zone=IQZ and Mouse Key and Instr(LQZ$(XQZ+IQZ-2)," ")=1 Then Gosub GTFILE : Gosub SEEFILE : Goto REASYLOOK2
If Mouse Zone=IQZ and Mouse Key and Instr(LQZ$(XQZ+IQZ-2),"*")=1 Then Gosub GTDIREC : Gosub RESET : Gosub SEEFILE : Gosub WN1DIR : Y Mouse=Y Hard(0) : Goto WN12
Next IQZ
If Mouse Zone=22 and Mouse Key Then While Mouse Key<>0 : Screen Display 2,140,Y Mouse,320,192 : Wend
If Mouse Zone=23 and Mouse Key
CRQZ=(CRQZ+1) mod 4
If CRQZ=0 : Colour 0,$7A : End If
If CRQZ=1 : Colour 0,$390 : End If
If CRQZ=2 : Colour 0,$A77 : End If
If CRQZ=3 : Colour 0,$BB5 : End If
While Mouse Key<>0 : Wend
End If
If Mouse Zone=24 and Mouse Key Then PLQZ=24 : Gosub MAKEFSZONES : Gosub GTPAR : Gosub RESET : Gosub SEEFILE : Gosub WN1DIR : Goto WN12
If Mouse Zone=25 and Mouse Key Then PLQZ=25 : Gosub MAKEFSZONES : GTNEWDRECTORYQZ : Gosub RESET : Gosub SEEFILE : Gosub WN1DIR : Y Mouse=Y Hard(0) : Goto WN12
If Mouse Zone=26 and Mouse Key Then PLQZ=26 : Gosub MAKEFSZONES : GTANOTHERFILEQZ : PLQZ=0 : Gosub MAKEFSZONES : Gosub SEEFILE : Goto REASYLOOK2
If Mouse Zone=27 and Mouse Key Then F$=FLEQZ$ : Goto XIT
If Mouse Zone=28 and Mouse Key Then F$="" : Goto XIT
If Mouse Zone=29 and Mouse Key and XQZ<NQZ-15 Then XQZ=XQZ+1
If Mouse Zone=30 and Mouse Key and XQZ>1 Then XQZ=XQZ-1
Rem Update display
If XQZ<>XKQZ
XKQZ=XQZ
For IQZ=1 To 20
Locate 2,IQZ : Cline
If Mouse Zone=IQZ+1
Inverse On
End If
Print Left$(LQZ$(XQZ+IQZ-1),38);
Inverse Off
Next IQZ
End If
Loop
Return
MAKEFSZONES:
MITQZ$(24)=" Parent "
MITQZ$(25)="New Directory"
MITQZ$(26)=" New File "
MITQZ$(27)=" Ok "
MITQZ$(28)=" Quit "
Reserve Zone
Reserve Zone 30
Set Zone 22,0,0 To 25,5
Writing 1
For IQZ=2 To 21
Locate 3,IQZ-1
Print Zone$(" ",IQZ)
Next IQZ
Writing 0
Window 2
For IIQZ=24 To 28
Pen 3 : Ink 3
If IIQZ=PLQZ Then Pen 1 : Ink 1
Locate 14,(IIQZ-24)*2+6 : Print Zone$(MITQZ$(IIQZ),IIQZ);
L=Len(MITQZ$(IIQZ))
XB1QZ=X Graphic(X Curs-L) : YB1QZ=Y Graphic(Y Curs)
XB2QZ=X Graphic(X Curs) : YB2QZ=Y Graphic(Y Curs+1)-1
Box XB1QZ-2,YB1QZ To XB2QZ+2,YB2QZ
Next IIQZ
Window 1
Pen 3
Locate 5,0 : Print Zone$(Chr$(147)+Chr$(148),29);
Locate 8,0 : Print Zone$(Chr$(149)+Chr$(150),30);
Locate 12,0 : Print Zone$("*",23);
Pen 2
Return
RESET:
For IQZ=1 To 200 : LQZ$(IQZ)="" : Next IQZ
FLEQZ$="" : LLQZ$=""
Return
SEEFILE:
Window 2
Pen 2
Locate 0,22 : Autoback 1 : Cline
Centre LLQZ$ : F$=FLEQZ$
Pen 3
Window 1
Return
GTFILE:
Rem Assuming file {lqz$(xqz+iqz-2)} has no 'double-space' !
POSN=Instr(LQZ$(XQZ+IQZ-2)," ")
LLQZ$=Left$(LQZ$(XQZ+IQZ-2),POSN-1)
POSN=Instr(LLQZ$," ") : LLQZ$=Mid$(LLQZ$,POSN+1)
If(Right$(DRECTORYQZ$,1)=":") Then FLEQZ$=DRECTORYQZ$+LLQZ$ : Goto XITGTFILE
If(Right$(DRECTORYQZ$,1)="/") Then FLEQZ$=DRECTORYQZ$+LLQZ$ : Goto XITGTFILE
If(Right$(DRECTORYQZ$,1)<>":") Then FLEQZ$=DRECTORYQZ$+"/"+LLQZ$ : Goto XITGTFILE
XITGTFILE:
Return
GTPAR:
If Right$(DRECTORYQZ$,1)=":" Then Goto XITGTPAR
POSIONQZ=Instr(Flip$(DRECTORYQZ$),"/")
POSION2QZ=Instr(Flip$(DRECTORYQZ$),":")
If POSIONQZ<>0 Then DRECTORYQZ$=Left$(DRECTORYQZ$,Len(DRECTORYQZ$)-POSIONQZ)
If POSIONQZ=0 Then DRECTORYQZ$=Left$(DRECTORYQZ$,Len(DRECTORYQZ$)-POSION2QZ+1)
XITGTPAR:
Return
GTDIREC:
Rem Assuming directory has no 'double space' !
POSN=Instr(LQZ$(XQZ+IQZ-2)," ")
If Right$(DRECTORYQZ$,1)=":" Then DRECTORYQZ$=DRECTORYQZ$+Mid$(LQZ$(XQZ+IQZ-2),2,POSN-2) : Goto XITGTDIREC
If Right$(DRECTORYQZ$,1)<>":" Then DRECTORYQZ$=DRECTORYQZ$+"/"+Mid$(LQZ$(XQZ+IQZ-2),2,POSN-2)
XITGTDIREC:
Return
XIT:
If Not Exist(DRECTORYQZ$) Then ERR : Goto RESTART
While Mouse Key<>0 : Wend
Screen Close 2
XIT4:
If MARKQZ$="SP"
On Error Goto ER5
Goto OK5
ER5:
ERR
Resume XIT5
OK5:
F$=Fsel$(DRECTORYQZ$,"",MESSAGE1QZ$,MESSAGE2QZ$)
End If
XIT5:
While Mouse Key<>0 : Wend
End Proc
Procedure GTANOTHERFILEQZ
Clear Key
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,320,48,4,Hires
Screen Display 1,200,100,320,48
Curs Off : Cls 1 : Colour 0,$70
Print : Centre "Enter file name required"
Print : Print
Wind Open 1,32,32,30,1 : Paper 2 : Pen 1 : Clw
Input " ";LLQZ$
Curs Off
' Wait 50
If LLQZ$="" Then Goto XIT2
If(Right$(DRECTORYQZ$,1)=":") Then FLEQZ$=DRECTORYQZ$+LLQZ$ : Goto XIT2
If(Right$(DRECTORYQZ$,1)<>":") Then FLEQZ$=DRECTORYQZ$+"/"+LLQZ$ : Goto XIT2
XIT2:
Screen Close 1
XIT:
End Proc
Procedure GTNEWDRECTORYQZ
Dim DITQZ$(11)
On Error Goto ER
Goto OK
ER:
ERR
Resume XIT
OK:
Screen Open 1,320,56,4,Hires
Screen Display 1,200,100,320,56
Curs Off : Cls 1 : Colour 0,$70
Print : Centre "Select New Directory"
DITQZ$(1)="DF0:"
DITQZ$(2)="DF1:"
DITQZ$(3)="DH0:"
DITQZ$(4)="DH1:"
DITQZ$(5)="DH2:"
DITQZ$(6)="DH3:"
DITQZ$(7)="DH4:"
DITQZ$(8)="DH5:"
DITQZ$(9)="DH6:"
DITQZ$(10)="DH7:"
DITQZ$(11)="Other"
Reserve Zone
Reserve Zone 11
Paper 0 : Locate 0,3
For IIQZ=1 To 6
If Exist(DITQZ$(IIQZ)) Then Cright : Print Zone$(DITQZ$(IIQZ),IIQZ);
Next IIQZ
Locate 0,5
For IIQZ=7 To 10
If Exist(DITQZ$(IIQZ)) Then Cright : Print Zone$(DITQZ$(IIQZ),IIQZ);
Next IIQZ
Locate 30,5
Print Zone$(DITQZ$(11),11)
Do
For IQZ=1 To 10
If Mouse Zone=IQZ and Mouse Key
If Exist(DITQZ$(IQZ))
DRECTORYQZ$=DITQZ$(IQZ) : Dir$=DITQZ$(IQZ) : Goto XIT
End If
End If
Next IQZ
If Mouse Zone=11 and Mouse Key Then Exit
Loop
Cls 1 : Paper 1 : Home
Locate 0,2 : Centre "Directory Change"
RETRY:
Locate 0,4 : Input " Enter New Directory ";DRECTORY3QZ$
If(DRECTORY3QZ$="") or(DRECTORY3QZ$=":") Then Goto XIT
If Instr(DRECTORY3QZ$,":")=0 Then Cls : Locate 0,1 : Centre "Error - No ':' detected" : Goto RETRY
If Right$(DRECTORY3QZ$,1)="/" Then DRECTORY3QZ$=Left$(DRECTORY3QZ$,Len(DRECTORY3QZ$)-1)
If Not Exist(DRECTORY3QZ$) Then Cls : Locate 0,1 : Centre "Directory Not Found" : Goto RETRY
DRECTORYQZ$=DRECTORY3QZ$
XIT:
Screen Close 1
End Proc
'
Rem ***********
Rem **** End ****
Rem ***************************************************