10 ! *********************************************************************
20 ! Example: Calculator
30 !
40 ! This program creates a calculator using PUSHBUTTON widgets.
50 !
60 ! **********************************************************
70 !
80 COM /Stack_com/ INTEGER Max_stack,Stack_ptr,REAL Stack(100)
90 ASSIGN @Calc TO WIDGET "PANEL";SET ("TITLE":" Example: Calculator","X":20,"Y":20,"WIDTH":300,"HEIGHT":400)
100 STATUS @Calc;RETURN ("INSIDE WIDTH":Iw)
110 CONTROL @Calc;SET ("SYSTEM MENU":"Quit")
120 ON EVENT @Calc,"SYSTEM MENU" GOTO Finis
130 ASSIGN @Display TO WIDGET "LABEL";SET ("X":5,"Y":5,"WIDTH":Iw-10,"HEIGHT":40,"BACKGROUND":0,"PEN":2,"VALUE":0,"JUSTIFICATION":"RIGHT"),PARENT @Calc
140 Xpos=5
150 Ypos=80
160 Item=1
170 RAD
180 ON EVENT @Calc,"RESIZED" GOSUB Resized
190 DIM Val$[64],Tmp$[64]
200 DIM Modes$(1:2)[80]
210 REAL Mem(10)
220 Modes$(1)="DEGREES"
230 Modes$(2)="RADIANS"
240 Val$=""
250 Fkey=0
260 Max_stack=100
270 Stack_ptr=0
280 Base=10
290 Store_mode=0
300 Recall_mode=0
310 !
320 ASSIGN @Button10 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+0*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
330 ASSIGN @Label10 TO WIDGET "LABEL";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+0*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
340 CONTROL @Button10;SET ("BACKGROUND":6,"PEN":1,"LABEL":"7","VISIBLE":1)
350 CONTROL @Label10;SET ("PEN":0,"VALUE":"A")
360 ASSIGN @Button11 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+1*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
370 ASSIGN @Label11 TO WIDGET "LABEL";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+1*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
380 CONTROL @Button11;SET ("BACKGROUND":6,"PEN":1,"LABEL":"4","VISIBLE":1)
390 CONTROL @Label11;SET ("PEN":0,"VALUE":"D")
400 ASSIGN @Button12 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+2*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
410 ASSIGN @Label12 TO WIDGET "LABEL";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+2*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
420 CONTROL @Button12;SET ("BACKGROUND":6,"PEN":1,"LABEL":"1","VISIBLE":1)
430 CONTROL @Label12;SET ("PEN":0,"VALUE":"","VISIBLE":1)
440 ASSIGN @Button13 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+3*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
450 ASSIGN @Label13 TO WIDGET "LABEL";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+3*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
460 CONTROL @Button13;SET ("BACKGROUND":6,"PEN":1,"LABEL":"0","VISIBLE":1)
470 CONTROL @Label13;SET ("PEN":0,"VALUE":"STO","VISIBLE":1)
480 ASSIGN @Button14 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+4*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
490 ASSIGN @Label14 TO WIDGET "LABEL";SET ("X":Xpos+0*(Iw-10)/5,"Y":Ypos+4*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
500 CONTROL @Button14;SET ("WIDTH":(Iw-20)/2.5-10)
510 CONTROL @Label14;SET ("WIDTH":(Iw-20)/2.5-10)
520 CONTROL @Button14;SET ("BACKGROUND":6,"PEN":1,"LABEL":"ENTER","VISIBLE":1)
530 CONTROL @Label14;SET ("PEN":0,"VALUE":"QUIT","VISIBLE":1)
540 ASSIGN @Button15 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+0*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
550 ASSIGN @Label15 TO WIDGET "LABEL";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+0*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
560 CONTROL @Button15;SET ("BACKGROUND":6,"PEN":1,"LABEL":"8","VISIBLE":1)
570 CONTROL @Label15;SET ("PEN":0,"VALUE":"B")
580 ASSIGN @Button16 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+1*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
590 ASSIGN @Label16 TO WIDGET "LABEL";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+1*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
600 CONTROL @Button16;SET ("BACKGROUND":6,"PEN":1,"LABEL":"5","VISIBLE":1)
610 CONTROL @Label16;SET ("PEN":0,"VALUE":"E")
620 ASSIGN @Button17 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+2*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
630 ASSIGN @Label17 TO WIDGET "LABEL";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+2*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
640 CONTROL @Button17;SET ("BACKGROUND":6,"PEN":1,"LABEL":"2","VISIBLE":1)
650 CONTROL @Label17;SET ("PEN":0,"VALUE":"e","VISIBLE":1)
660 ASSIGN @Button18 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+3*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
670 ASSIGN @Label18 TO WIDGET "LABEL";SET ("X":Xpos+1*(Iw-10)/5,"Y":Ypos+3*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
680 CONTROL @Button18;SET ("BACKGROUND":6,"PEN":1,"LABEL":".","VISIBLE":1)
690 CONTROL @Label18;SET ("PEN":0,"VALUE":"RCL","VISIBLE":1)
700 ASSIGN @Button20 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+0*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
710 ASSIGN @Label20 TO WIDGET "LABEL";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+0*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
720 CONTROL @Button20;SET ("BACKGROUND":6,"PEN":1,"LABEL":"9","VISIBLE":1)
730 CONTROL @Label20;SET ("PEN":0,"VALUE":"C")
740 ASSIGN @Button21 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+1*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
750 ASSIGN @Label21 TO WIDGET "LABEL";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+1*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
760 CONTROL @Button21;SET ("BACKGROUND":6,"PEN":1,"LABEL":"6","VISIBLE":1)
770 CONTROL @Label21;SET ("PEN":0,"VALUE":"F")
780 ASSIGN @Button22 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+2*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
790 ASSIGN @Label22 TO WIDGET "LABEL";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+2*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
800 CONTROL @Button22;SET ("BACKGROUND":6,"PEN":1,"LABEL":"3","VISIBLE":1)
810 CONTROL @Label22;SET ("PEN":0,"VALUE":"PI","VISIBLE":1)
820 ASSIGN @Button23 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+3*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
830 ASSIGN @Label23 TO WIDGET "LABEL";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+3*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
840 CONTROL @Button23;SET ("BACKGROUND":6,"PEN":1,"LABEL":"CHS","VISIBLE":1)
850 CONTROL @Label23;SET ("PEN":0,"VALUE":"ANGL","VISIBLE":1)
860 ASSIGN @Button24 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+4*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
870 ASSIGN @Label24 TO WIDGET "LABEL";SET ("X":Xpos+2*(Iw-10)/5,"Y":Ypos+4*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
880 CONTROL @Button24;SET ("BACKGROUND":6,"PEN":1,"LABEL":"CLX","VISIBLE":1)
890 CONTROL @Label24;SET ("PEN":0,"VALUE":"","VISIBLE":1)
900 ASSIGN @Button25 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+0*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
910 ASSIGN @Label25 TO WIDGET "LABEL";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+0*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
920 CONTROL @Button25;SET ("BACKGROUND":6,"PEN":1,"LABEL":"/","VISIBLE":1)
930 CONTROL @Label25;SET ("PEN":0,"VALUE":"HEX","VISIBLE":1)
940 ASSIGN @Button26 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+1*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
950 ASSIGN @Label26 TO WIDGET "LABEL";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+1*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
960 CONTROL @Button26;SET ("BACKGROUND":6,"PEN":1,"LABEL":"*","VISIBLE":1)
970 CONTROL @Label26;SET ("PEN":0,"VALUE":"DEC","VISIBLE":1)
980 ASSIGN @Button27 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+2*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
990 ASSIGN @Label27 TO WIDGET "LABEL";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+2*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1000 CONTROL @Button27;SET ("BACKGROUND":6,"PEN":1,"LABEL":"-","VISIBLE":1)
1010 CONTROL @Label27;SET ("PEN":0,"VALUE":"OCT","VISIBLE":1)
1020 ASSIGN @Button28 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+3*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
1030 ASSIGN @Label28 TO WIDGET "LABEL";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+3*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1040 CONTROL @Button28;SET ("BACKGROUND":6,"PEN":1,"LABEL":"+","VISIBLE":1)
1050 CONTROL @Label28;SET ("PEN":0,"VALUE":"BIN","VISIBLE":1)
1060 ASSIGN @Button29 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+4*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
1070 ASSIGN @Label29 TO WIDGET "LABEL";SET ("X":Xpos+3*(Iw-10)/5,"Y":Ypos+4*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1080 CONTROL @Button29;SET ("BACKGROUND":6,"PEN":1,"LABEL":"f","VISIBLE":1)
1090 CONTROL @Label29;SET ("PEN":0,"VALUE":"","VISIBLE":1)
1100 CONTROL @Button29;SET ("BACKGROUND":3,"PEN":0)
1110 ASSIGN @Button30 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+0*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
1120 ASSIGN @Label30 TO WIDGET "LABEL";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+0*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1130 CONTROL @Button30;SET ("BACKGROUND":6,"PEN":1,"LABEL":"SIN","VISIBLE":1)
1140 CONTROL @Label30;SET ("PEN":0,"VALUE":"ASN","VISIBLE":1)
1150 ASSIGN @Button31 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+1*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
1160 ASSIGN @Label31 TO WIDGET "LABEL";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+1*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1170 CONTROL @Button31;SET ("BACKGROUND":6,"PEN":1,"LABEL":"COS","VISIBLE":1)
1180 CONTROL @Label31;SET ("PEN":0,"VALUE":"ACS","VISIBLE":1)
1190 ASSIGN @Button32 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+2*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
1200 ASSIGN @Label32 TO WIDGET "LABEL";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+2*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1210 CONTROL @Button32;SET ("BACKGROUND":6,"PEN":1,"LABEL":"TAN","VISIBLE":1)
1220 CONTROL @Label32;SET ("PEN":0,"VALUE":"ATN","VISIBLE":1)
1230 ASSIGN @Button33 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+3*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
1240 ASSIGN @Label33 TO WIDGET "LABEL";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+3*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1250 CONTROL @Button33;SET ("BACKGROUND":6,"PEN":1,"LABEL":"10^X","VISIBLE":1)
1260 CONTROL @Label33;SET ("PEN":0,"VALUE":"LOG","VISIBLE":1)
1270 ASSIGN @Button34 TO WIDGET "PUSHBUTTON";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+4*(250-20)/4,"WIDTH":(Iw-20)/5-10,"HEIGHT":30,"VISIBLE":0),PARENT @Calc
1280 ASSIGN @Label34 TO WIDGET "LABEL";SET ("X":Xpos+4*(Iw-10)/5,"Y":Ypos+4*(250-20)/4-25,"WIDTH":(Iw-20)/5-10,"HEIGHT":25,"BORDER":0,"VISIBLE":0),PARENT @Calc
1290 CONTROL @Button34;SET ("BACKGROUND":6,"PEN":1,"LABEL":"EEX","VISIBLE":1)
1300 CONTROL @Label34;SET ("PEN":0,"VALUE":"LN","VISIBLE":1)
1310 ON ERROR GOTO Process_error
1320 ON EVENT @Button10,"ACTIVATED" GOSUB Button10
1330 CONTROL @Label16;SET ("VISIBLE":1)
1340 ON EVENT @Button11,"ACTIVATED" GOSUB Button11
1350 ON EVENT @Button12,"ACTIVATED" GOSUB Button12
1360 ON EVENT @Button13,"ACTIVATED" GOSUB Button13
1370 ON EVENT @Button14,"ACTIVATED" GOSUB Button14
1380 ON EVENT @Button15,"ACTIVATED" GOSUB Button15
1390 ON EVENT @Button16,"ACTIVATED" GOSUB Button16
1400 ON EVENT @Button17,"ACTIVATED" GOSUB Button17
1410 ON EVENT @Button18,"ACTIVATED" GOSUB Button18
1420 ON EVENT @Button20,"ACTIVATED" GOSUB Button20
1430 ON EVENT @Button21,"ACTIVATED" GOSUB Button21
1440 ON EVENT @Button22,"ACTIVATED" GOSUB Button22
1450 ON EVENT @Button23,"ACTIVATED" GOSUB Button23
1460 ON EVENT @Button24,"ACTIVATED" GOSUB Button24
1470 ON EVENT @Button25,"ACTIVATED" GOSUB Button25
1480 ON EVENT @Button26,"ACTIVATED" GOSUB Button26
1490 ON EVENT @Button27,"ACTIVATED" GOSUB Button27
1500 ON EVENT @Button28,"ACTIVATED" GOSUB Button28
1510 ON EVENT @Button29,"ACTIVATED" GOSUB Button29
1520 ON EVENT @Button30,"ACTIVATED" GOSUB Button30
1530 ON EVENT @Button31,"ACTIVATED" GOSUB Button31
1540 ON EVENT @Button32,"ACTIVATED" GOSUB Button32
1550 ON EVENT @Button33,"ACTIVATED" GOSUB Button33
1560 ON EVENT @Button34,"ACTIVATED" GOSUB Button34
1570 LOOP
1580 WAIT FOR EVENT
1590 END LOOP
1600 Button10: !
1610 Number=7
1620 GOSUB Check_storcl
1630 IF Store_mode=0 AND Recall_mode=0 THEN
1640 GOSUB Getval
1650 IF Fkey=0 OR Base<>16 THEN
1660 Modval(Val$,Number)
1670 ELSE
1680 Modval(Val$,0,"A")
1690 END IF
1700 CONTROL @Display;SET ("VALUE":Val$)
1710 ELSE
1720 GOSUB Enable_base
1730 END IF
1740 GOSUB Check_fkey
1750 RETURN
1760 Button11: !
1770 Number=4
1780 GOSUB Check_storcl
1790 IF Store_mode=0 AND Recall_mode=0 THEN
1800 GOSUB Getval
1810 IF Fkey=0 OR Base<>16 THEN
1820 Modval(Val$,Number)
1830 ELSE
1840 Modval(Val$,0,"D")
1850 END IF
1860 CONTROL @Display;SET ("VALUE":Val$)
1870 ELSE
1880 GOSUB Enable_base
1890 END IF
1900 GOSUB Check_fkey
1910 RETURN
1920 Button12: !
1930 Number=1
1940 GOSUB Check_storcl
1950 IF Store_mode=0 AND Recall_mode=0 THEN
1960 GOSUB Getval
1970 Modval(Val$,Number)
1980 CONTROL @Display;SET ("VALUE":Val$)
1990 ELSE
2000 GOSUB Enable_base
2010 END IF
2020 GOSUB Check_fkey
2030 RETURN
2040 Button13: !
2050 Number=0
2060 GOSUB Check_storcl
2070 IF Store_mode=0 AND Recall_mode=0 THEN
2080 GOSUB Getval
2090 IF Fkey=0 THEN
2100 Modval(Val$,Number)
2110 ELSE
2120 Store_mode=1
2130 GOSUB Enable_all
2140 GOSUB Clear_fn_keys
2150 GOSUB Clear_hex_keys
2160 RETURN
2170 END IF
2180 CONTROL @Display;SET ("VALUE":Val$)
2190 ELSE
2200 GOSUB Enable_base
2210 END IF
2220 GOSUB Check_fkey
2230 RETURN
2240 Button14: !
2250 IF Fkey=0 THEN
2260 Get_dispval(@Display,Base,Val)
2270 Push_val(Val,@Display)
2280 Restart=1
2290 ELSE
2300 STOP
2310 END IF
2320 GOSUB Check_fkey
2330 RETURN
2340 Button15: !
2350 Number=8
2360 GOSUB Check_storcl
2370 IF Store_mode=0 AND Recall_mode=0 THEN
2380 GOSUB Getval
2390 IF Fkey=0 OR Base<>16 THEN
2400 Modval(Val$,Number)
2410 ELSE
2420 Modval(Val$,0,"B")
2430 END IF
2440 CONTROL @Display;SET ("VALUE":Val$)
2450 ELSE
2460 GOSUB Enable_base
2470 END IF
2480 GOSUB Check_fkey
2490 RETURN
2500 Button16: !
2510 Number=5
2520 GOSUB Check_storcl
2530 IF Store_mode=0 AND Recall_mode=0 THEN
2540 GOSUB Getval
2550 IF Fkey=0 OR (Base<>16 AND Base<>10) THEN
2560 Modval(Val$,Number)
2570 ELSE
2580 IF Base=10 THEN
2590 GOSUB Process_e
2600 ELSE
2610 Modval(Val$,0,"E")
2620 END IF
2630 END IF
2640 CONTROL @Display;SET ("VALUE":Val$)
2650 ELSE
2660 GOSUB Enable_base
2670 END IF
2680 GOSUB Check_fkey
2690 RETURN
2700 Button17: !
2710 Number=2
2720 GOSUB Check_storcl
2730 IF Store_mode=0 AND Recall_mode=0 THEN
2740 GOSUB Getval
2750 IF Fkey=0 THEN
2760 Modval(Val$,Number)
2770 ELSE
2780 Tentobase(Base,EXP(1),Val$,Error)
2790 END IF
2800 CONTROL @Display;SET ("VALUE":Val$)
2810 ELSE
2820 GOSUB Enable_base
2830 END IF
2840 GOSUB Check_fkey
2850 RETURN
2860 Button18: !
2870 IF Fkey=0 THEN
2880 STATUS @Display;RETURN ("VALUE":Val$)
2890 IF (POS(Val$,".")=0) THEN Val$=Val$&"."
2900 CONTROL @Display;SET ("VALUE":Val$)
2910 ELSE
2920 Recall_mode=1
2930 GOSUB Enable_all
2940 GOSUB Clear_fn_keys
2950 GOSUB Clear_hex_keys
2960 END IF
2970 GOSUB Check_fkey
2980 RETURN
2990 Button19: !
3000 Button20: !
3010 Number=9
3020 GOSUB Check_storcl
3030 IF Store_mode=0 AND Recall_mode=0 THEN
3040 GOSUB Getval
3050 IF Fkey=0 OR Base<>16 THEN
3060 Modval(Val$,Number)
3070 ELSE
3080 Modval(Val$,0,"C")
3090 END IF
3100 CONTROL @Display;SET ("VALUE":Val$)
3110 ELSE
3120 GOSUB Enable_base
3130 END IF
3140 GOSUB Check_fkey
3150 RETURN
3160 Button21: !
3170 Number=6
3180 GOSUB Check_storcl
3190 IF Store_mode=0 AND Recall_mode=0 THEN
3200 GOSUB Getval
3210 IF Fkey=0 OR Base<>16 THEN
3220 Modval(Val$,Number)
3230 ELSE
3240 Modval(Val$,0,"F")
3250 END IF
3260 CONTROL @Display;SET ("VALUE":Val$)
3270 ELSE
3280 GOSUB Enable_base
3290 END IF
3300 GOSUB Check_fkey
3310 RETURN
3320 Button22: !
3330 Number=3
3340 GOSUB Check_storcl
3350 IF Store_mode=0 AND Recall_mode=0 THEN
3360 GOSUB Getval
3370 IF Fkey=0 THEN
3380 Modval(Val$,Number)
3390 ELSE
3400 Tentobase(Base,PI,Val$,Error)
3410 END IF
3420 CONTROL @Display;SET ("VALUE":Val$)
3430 ELSE
3440 GOSUB Enable_base
3450 END IF
3460 GOSUB Check_fkey
3470 RETURN
3480 Button23: !
3490 IF Fkey=0 THEN
3500 STATUS @Display;RETURN ("VALUE":Val$)
3510 IF Base=10 THEN
3520 IF Val$[1;1]="-" THEN
3530 Val$=Val$[2]
3540 ELSE
3550 Val$="-"&Val$
3560 END IF
3570 ELSE
3580 Twos_comp(Base,Val$)
3590 END IF
3600 CONTROL @Display;SET ("VALUE":Val$)
3610 ELSE
3620 !* DIALOG "LIST","Trigonometric Mode",Button;SET ("ITEMS":Modes$(*),"SELECTED ITEM":Item),
3630 IF Button=0 AND Item<>-1 THEN
3640 IF Item=0 THEN DEG
3650 IF Item=1 THEN RAD
3660 END IF
3670 END IF
3680 GOSUB Check_fkey
3690 RETURN
3700 Button24: !
3710 CONTROL @Display;SET ("VALUE":0)
3720 GOSUB Check_fkey
3730 RETURN
3740 Button25: !
3750 IF Fkey=0 THEN
3760 Get_dispval(@Display,Base,Val1)
3770 Val2=FNPop_val(@Display)
3780 Val$=VAL$(Val2/Val1)
3790 Set_dispval(@Display,Base,VAL(Val$))
3800 Push_val(VAL(Val$),@Display)
3810 Restart=1
3820 ELSE
3830 Get_dispval(@Display,Base,Val1)
3840 Base=16
3850 Set_dispval(@Display,Base,Val1)
3860 CONTROL @Label10;SET ("VISIBLE":1)
3870 CONTROL @Label11;SET ("VISIBLE":1)
3880 CONTROL @Label15;SET ("VISIBLE":1)
3890 CONTROL @Label16;SET ("VISIBLE":1)
3900 CONTROL @Label20;SET ("VISIBLE":1)
3910 CONTROL @Label21;SET ("VISIBLE":1)
3920 GOSUB Enable_all
3930 END IF
3940 GOSUB Check_fkey
3950 RETURN
3960 Button26: !
3970 IF Fkey=0 THEN
3980 Get_dispval(@Display,Base,Val1)
3990 Val2=FNPop_val(@Display)
4000 Val$=VAL$(Val2*Val1)
4010 Set_dispval(@Display,Base,VAL(Val$))
4020 Push_val(VAL(Val$),@Display)
4030 Restart=1
4040 ELSE
4050 Get_dispval(@Display,Base,Val1)
4060 Base=10
4070 Set_dispval(@Display,Base,Val1)
4080 GOSUB Enable_all
4090 GOSUB Clear_hex_keys
4100 CONTROL @Label16;SET ("VISIBLE":1)
4110 END IF
4120 GOSUB Check_fkey
4130 RETURN
4140 Button27: !
4150 IF Fkey=0 THEN
4160 Get_dispval(@Display,Base,Val1)
4170 Val2=FNPop_val(@Display)
4180 Val$=VAL$(Val2-Val1)
4190 Set_dispval(@Display,Base,VAL(Val$))
4200 Push_val(VAL(Val$),@Display)
4210 Restart=1
4220 ELSE
4230 Get_dispval(@Display,Base,Val1)
4240 Base=8
4250 Set_dispval(@Display,Base,Val1)
4260 GOSUB Enable_all
4270 GOSUB Clear_nonoct
4280 END IF
4290 GOSUB Check_fkey
4300 RETURN
4310 Button28: !
4320 IF Fkey=0 THEN
4330 Get_dispval(@Display,Base,Val1)
4340 Val2=FNPop_val(@Display)
4350 Val$=VAL$(Val1+Val2)
4360 Push_val(VAL(Val$),@Display)
4370 Set_dispval(@Display,Base,VAL(Val$))
4380 Restart=1
4390 ELSE
4400 Get_dispval(@Display,Base,Val1)
4410 Base=2
4420 Set_dispval(@Display,Base,Val1)
4430 GOSUB Enable_all
4440 GOSUB Clear_nonbin
4450 END IF
4460 GOSUB Check_fkey
4470 RETURN
4480 Button29: !
4490 Fkey=(Fkey+1) MOD 2
4500 IF Fkey=1 THEN
4510 CONTROL @Display;SET ("PEN":3)
4520 GOSUB Enable_pi
4530 ELSE
4540 CONTROL @Display;SET ("PEN":2)
4550 GOSUB Enable_base
4560 END IF
4570 RETURN
4580 Button30: !
4590 Get_dispval(@Display,Base,Val1)
4600 IF Fkey=0 THEN
4610 Val$=VAL$(SIN(Val1))
4620 ELSE
4630 Val$=VAL$(ASN(Val1))
4640 END IF
4650 Set_dispval(@Display,Base,VAL(Val$))
4660 Push_val(VAL(Val$),@Display)
4670 Restart=1
4680 GOSUB Check_fkey
4690 RETURN
4700 Button31: !
4710 Get_dispval(@Display,Base,Val1)
4720 IF Fkey=0 THEN
4730 Val$=VAL$(COS(Val1))
4740 ELSE
4750 Val$=VAL$(ACS(Val1))
4760 END IF
4770 Set_dispval(@Display,Base,VAL(Val$))
4780 Push_val(VAL(Val$),@Display)
4790 Restart=1
4800 GOSUB Check_fkey
4810 RETURN
4820 Button32: !
4830 Get_dispval(@Display,Base,Val1)
4840 IF Fkey=0 THEN
4850 Val$=VAL$(TAN(Val1))
4860 ELSE
4870 Val$=VAL$(ATN(Val1))
4880 END IF
4890 Set_dispval(@Display,Base,VAL(Val$))
4900 Push_val(VAL(Val$),@Display)
4910 Restart=1
4920 GOSUB Check_fkey
4930 RETURN
4940 Button33: !
4950 Get_dispval(@Display,Base,Val1)
4960 IF Fkey=0 THEN
4970 Val$=VAL$(10^Val1)
4980 ELSE
4990 Val$=VAL$(LGT(Val1))
5000 END IF
5010 Set_dispval(@Display,Base,VAL(Val$))
5020 Push_val(VAL(Val$),@Display)
5030 Restart=1
5040 GOSUB Check_fkey
5050 RETURN
5060 Button34: !
5070 Get_dispval(@Display,Base,Val1)
5080 IF Fkey=0 THEN
5090 Val$=VAL$(EXP(Val1))
5100 ELSE
5110 Val$=VAL$(LOG(Val1))
5120 END IF
5130 Set_dispval(@Display,Base,VAL(Val$))
5140 Push_val(VAL(Val$),@Display)
5150 Restart=1
5160 GOSUB Check_fkey
5170 RETURN
5180 Clear_nonbin: !
5190 CONTROL @Button17;SET ("SENSITIVE":0)
5200 CONTROL @Button22;SET ("SENSITIVE":0)
5210 CONTROL @Button11;SET ("SENSITIVE":0)
5220 CONTROL @Button16;SET ("SENSITIVE":0)
5230 CONTROL @Button21;SET ("SENSITIVE":0)
5240 CONTROL @Button10;SET ("SENSITIVE":0)
5250 Clear_nonoct: !
5260 CONTROL @Button15;SET ("SENSITIVE":0)
5270 CONTROL @Button20;SET ("SENSITIVE":0)
5280 Clear_hex_keys: !
5290 CONTROL @Label10;SET ("VISIBLE":0)
5300 CONTROL @Label11;SET ("VISIBLE":0)
5310 CONTROL @Label15;SET ("VISIBLE":0)
5320 CONTROL @Label16;SET ("VISIBLE":0)
5330 CONTROL @Label20;SET ("VISIBLE":0)
5340 CONTROL @Label21;SET ("VISIBLE":0)
5350 RETURN
5360 Clear_fn_keys: !
5370 CONTROL @Button29;SET ("SENSITIVE":0)
5380 CONTROL @Button23;SET ("SENSITIVE":0)
5390 CONTROL @Button30;SET ("SENSITIVE":0)
5400 CONTROL @Button32;SET ("SENSITIVE":0)
5410 CONTROL @Button31;SET ("SENSITIVE":0)
5420 CONTROL @Button24;SET ("SENSITIVE":0)
5430 CONTROL @Button34;SET ("SENSITIVE":0)
5440 CONTROL @Button33;SET ("SENSITIVE":0)
5450 CONTROL @Button26;SET ("SENSITIVE":0)
5460 CONTROL @Button14;SET ("SENSITIVE":0)
5470 CONTROL @Button28;SET ("SENSITIVE":0)
5480 CONTROL @Button27;SET ("SENSITIVE":0)
5490 CONTROL @Button18;SET ("SENSITIVE":0)
5500 CONTROL @Button25;SET ("SENSITIVE":0)
5510 RETURN
5520 Enable_all: !
5530 CONTROL @Button13;SET ("SENSITIVE":1)
5540 CONTROL @Button12;SET ("SENSITIVE":1)
5550 CONTROL @Button17;SET ("SENSITIVE":1)
5560 CONTROL @Button22;SET ("SENSITIVE":1)
5570 CONTROL @Button11;SET ("SENSITIVE":1)
5580 CONTROL @Button16;SET ("SENSITIVE":1)
5590 CONTROL @Button21;SET ("SENSITIVE":1)
5600 CONTROL @Button10;SET ("SENSITIVE":1)
5610 CONTROL @Button15;SET ("SENSITIVE":1)
5620 CONTROL @Button20;SET ("SENSITIVE":1)
5630 CONTROL @Button29;SET ("SENSITIVE":1)
5640 CONTROL @Button23;SET ("SENSITIVE":1)
5650 CONTROL @Button30;SET ("SENSITIVE":1)
5660 CONTROL @Button32;SET ("SENSITIVE":1)
5670 CONTROL @Button31;SET ("SENSITIVE":1)
5680 CONTROL @Button24;SET ("SENSITIVE":1)
5690 CONTROL @Button34;SET ("SENSITIVE":1)
5700 CONTROL @Button33;SET ("SENSITIVE":1)
5710 CONTROL @Button26;SET ("SENSITIVE":1)
5720 CONTROL @Button14;SET ("SENSITIVE":1)
5730 CONTROL @Button28;SET ("SENSITIVE":1)
5740 CONTROL @Button27;SET ("SENSITIVE":1)
5750 CONTROL @Button18;SET ("SENSITIVE":1)
5760 CONTROL @Button25;SET ("SENSITIVE":1)
5770 RETURN
5780 Enable_e: !
5790 CONTROL @Label16;SET ("VISIBLE":1)
5800 RETURN
5810 Enable_pi: !
5820 CONTROL @Button22;SET ("SENSITIVE":1)
5830 CONTROL @Button17;SET ("SENSITIVE":1)
5840 RETURN
5850 Enable_base: !
5860 Recall_mode=0
5870 Store_mode=0
5880 GOSUB Enable_all
5890 IF Base=2 THEN GOSUB Clear_nonbin
5900 IF Base=8 THEN GOSUB Clear_nonoct
5910 IF Base=10 THEN
5920 GOSUB Clear_hex_keys
5930 GOSUB Enable_e
5940 END IF
5950 RETURN
5960 Check_storcl: !
5970 IF Store_mode THEN
5980 Get_dispval(@Display,Base,Val1)
5990 Mem(Number)=Val1
6000 ELSE
6010 IF Recall_mode THEN
6020 Val1=Mem(Number)
6030 Set_dispval(@Display,Base,Val1)
6040 END IF
6050 END IF
6060 RETURN
6070 Resized: RETURN
6080 Process_e: !
6090 IF (POS(Val$,"E")=0) THEN Val$=Val$&"E"
6100 RETURN
6110 Process_error: !
6120 IF Fkey=1 THEN CONTROL @Display;SET ("PEN":2)
6130 Fkey=0
6140 STATUS @Display;RETURN ("VALUE":Tmp$)
6150 CONTROL @Display;SET ("VALUE":ERRM$)
6160 WAIT 2
6170 CONTROL @Display;SET ("VALUE":Tmp$)
6180 RETURN
6190 Getval: !
6200 IF Restart THEN
6210 Restart=0
6220 Val$="0"
6230 ELSE
6240 STATUS @Display;RETURN ("VALUE":Val$)
6250 END IF
6260 RETURN
6270 Check_fkey: !
6280 IF Fkey=1 THEN
6290 CONTROL @Display;SET ("PEN":2)
6300 GOSUB Enable_base
6310 END IF
6320 Fkey=0
6330 RETURN
6340 Finis: END
6350 !
6360 SUB Push_val(REAL Val,@Disp)
6370 COM /Stack_com/ INTEGER Max_stack,Stack_ptr,REAL Stack(*)
6380 Stack(Stack_ptr)=Val
6390 IF Stack_ptr<=Max_stack THEN
6400 Stack_ptr=Stack_ptr+1
6410 ELSE
6420 BEEP
6430 STATUS @Disp;RETURN ("VALUE":Tmpval$)
6440 CONTROL @Disp;SET ("VALUE":"ERROR: STACK OVERFLOW!!!")
6450 WAIT 2
6460 CONTROL @Disp;SET ("VALUE":Tmpval$)
6470 SUBEXIT
6480 END IF
6490 SUBEND
6500 DEF FNPop_val(@Disp)
6510 COM /Stack_com/ INTEGER Max_stack,Stack_ptr,REAL Stack(*)
6520 IF Stack_ptr>0 THEN
6530 Stack_ptr=Stack_ptr-1
6540 ELSE
6550 BEEP
6560 STATUS @Disp;RETURN ("VALUE":Tmpval$)
6570 CONTROL @Disp;SET ("VALUE":"ERROR: STACK UNDERFLOW!!!")
6580 WAIT 2
6590 CONTROL @Disp;SET ("VALUE":Tmpval$)
6600 RETURN 0
6610 END IF
6620 RETURN Stack(Stack_ptr)
6630 FNEND
6640 DEF FNGetval(A$)
6650 IF NUM(A$)>=NUM("0") AND NUM(A$)<=NUM("9") THEN
6660 RETURN VAL(A$)
6670 ELSE
6680 RETURN NUM(A$)-55
6690 END IF
6700 FNEND
6710 DEF FNGetval$(A)
6720 IF A>=10 THEN
6730 RETURN CHR$(A+NUM("A")-10)
6740 ELSE
6750 RETURN VAL$(A)
6760 END IF
6770 FNEND
6780 SUB Basetoten(Base,Value,Str$)
6790 IF Base=10 THEN
6800 Value=VAL(Str$)
6810 SUBEXIT
6820 END IF
6830 Sign=0
6840 IF LEN(Str$)=MAXLEN(Str$) AND FNGetval$(Base-1)=Str$[1;1] THEN
6850 Sign=1
6860 Twos_comp(Base,Str$)
6870 END IF
6880 Value=0.
6890 Max=LEN(Str$)
6900 IF POS(Str$,".")<>0 THEN Max=POS(Str$,".")-1
6910 FOR I=1 TO Max
6920 Value=Base*Value+FNGetval(Str$[I;1])
6930 NEXT I
6940 IF POS(Str$,".")<>0 THEN
6950 J=0
6960 FOR I=Max+2 TO LEN(Str$)
6970 J=J+1
6980 Value=Value+FNGetval(Str$[I;1])*Base^(-J)
6990 NEXT I
7000 END IF
7010 IF Sign=1 THEN
7020 Value=-Value
7030 Twos_comp(Base,Str$)
7040 END IF
7050 SUBEND
7060 SUB Tentobase(Base,Value,Str$,Error)
7070 Error=0
7080 Str$=""
7090 IF Base=10 THEN
7100 Str$=VAL$(Value)
7110 SUBEXIT
7120 END IF
7130 Sign=0
7140 IF Value<0 THEN
7150 Sign=1
7160 Value=-Value
7170 END IF
7180 Divisor1=Value DIV 1
7190 I=1
7200 WHILE Divisor1<>0
7210 IF I>=MAXLEN(Str$) THEN GOTO Length_err
7220 Str$[I;1]=FNGetval$(Divisor1 MOD Base)
7230 I=I+1
7240 Divisor1=Divisor1 DIV Base
7250 END WHILE
7260 Str$=REV$(Str$)
7270 Divisor2=(Value-Value DIV 1)
7280 I=1
7290 IF Divisor2<>0 THEN
7300 Str2$[I;1]="."
7310 I=I+1
7320 END IF
7330 WHILE Divisor2<>0
7340 Divisor2=Divisor2*Base
7350 Str2$[I;1]=FNGetval$(Divisor2 DIV 1)
7360 Divisor2=Divisor2-Divisor2 DIV 1
7370 I=I+1
7380 IF I>MAXLEN(Str2$) THEN Divisor2=0
7390 END WHILE
7400 IF LEN(Str$)+LEN(Str2$)>MAXLEN(Str$) THEN GOTO Length_err
7410 Str$=Str$&Str2$
7420 IF Sign=1 THEN
7430 Value=-Value
7440 Twos_comp(Base,Str$)
7450 END IF
7460 IF Value=0 THEN Str$="0"
7470 SUBEXIT
7480 Length_err: !
7490 Error=1
7500 IF Sign=1 THEN Value=-Value
7510 SUBEND
7520 SUB Get_dispval(@Disp,Src_base,Value)
7530 DIM Str$[64]
7540 STATUS @Disp;RETURN ("VALUE":Str$)
7550 IF Dest_base<>10 THEN
7560 Basetoten(Src_base,Value,Str$)
7570 ELSE
7580 Value=VAL(Str$)
7590 END IF
7600 SUBEND
7610 SUB Set_dispval(@Disp,Dest_base,Value)
7620 DIM Value$[64]
7630 IF Dest_base<>10 THEN
7640 Tentobase(Dest_base,Value,Value$,Error)
7650 ELSE
7660 Value$=VAL$(Value)
7670 END IF
7680 IF Error=0 THEN
7690 CONTROL @Disp;SET ("VALUE":Value$)
7700 ELSE
7710 CONTROL @Disp;SET ("VALUE":"ERROR: Value out of range.")
7720 WAIT 3
7730 CONTROL @Disp;SET ("VALUE":0)
7740 END IF
7750 SUBEND
7760 SUB Twos_comp(Base,Str$)
7770 DIM Tmpstr$[64]
7780 Tmpstr$=RPT$(FNGetval$(Base-1),64)
7790 FOR I=1 TO LEN(Str$)
7800 IF Str$[I;1]<>"." THEN
7810 Tmpstr$[MAXLEN(Str$)-LEN(Str$)+I]=FNGetval$(Base-FNGetval(Str$[I;1])-1)
7820 ELSE
7830 Tmpstr$[MAXLEN(Str$)-LEN(Str$)+I]=Str$[I;1]
7840 END IF
7850 NEXT I
7860 Carry=1
7870 Str$=""
7880 FOR I=MAXLEN(Tmpstr$) TO 1 STEP -1
7890 IF Tmpstr$[I;1]<>"." THEN
7900 Num=FNGetval(Tmpstr$[I;1])
7910 Nextnum=(Num+Carry) MOD Base
7920 Str$=FNGetval$(Nextnum)&Str$
7930 Carry=(Num+Carry) DIV Base
7940 IF Carry=0 THEN GOTO Bail_out
7950 ELSE
7960 Str$="."&Str$
7970 END IF
7980 NEXT I
7990 SUBEXIT
8000 Bail_out: Str$=Tmpstr$[1,I-1]&Str$
8010 SUBEND
8020 SUB Modval(Val$,Value,OPTIONAL Str$)
8030 IF NPAR>2 THEN
8040 IF Val$="0" THEN Val$=""
8050 Val$=Val$&Str$
8060 ELSE
8070 IF Val$="0" THEN Val$=""
8080 Val$=Val$&VAL$(Value)
8090 END IF
8100 SUBEND