Home » Archimedes archive » Archimedes World » AW Readers Services Special FebMar 92.adf » !ArcWorld/Goodies/Graphs/!Graphs/!runimage
!ArcWorld/Goodies/Graphs/!Graphs/!runimage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Archimedes World » AW Readers Services Special FebMar 92.adf |
Filename: | !ArcWorld/Goodies/Graphs/!Graphs/!runimage |
Read OK: | ✔ |
File size: | 14AAE bytes |
Load address: | FFFFFB42 |
Exec address: | 48B31875 |
File contents
10REM >:graphs.$.versions.v1 20REM Plots mathmatical graphs 30REM Cartesian, Polar, Parametric 40REM Version 1 + FUNCTION EVALUATOR A.F.Lane 1990 50 60ON ERROR MODE 0:REPORT:PRINTERL:END 70PROCinitialise_variables 80ON ERROR PROCerror 90PROCload_sprites 100PROCload_templates 110PROCcreate_menu 120PROCinitialise_functions 130graph_icon% =FNiconbar 140ON ERROR PROCerror 150PROCassemble 160PROCget_environment 170PROCmainloop 180END 190 200 210DEF PROCinitialise_variables 220PROCset_vocab 230PROCset_stacks 240DIM caret% 24 250DIM code% 600 260DIM graph_box% 18 270DIM block% &300 280DIM sprites% 2000 290DIM buffer% &4000 300DIM temp% &1500 310REM DIM quit_menu% &200 320REM DIM main_menu% &300 330DIM cart_plot%(6) 340DIM cart_functions$(6) 350DIM entered_cart_functions$(6) 360DIM current_cart_func_text% 200 370DIM plot_values% 40320 380DIM polar_plot%(3) 390DIM polar_functions$(3) 400DIM entered_polar_functions$(3) 410DIM current_polar_func_text% 200 420polar_plot%() = FALSE 430DIM parax_functions$(3) 440DIM paray_functions$(3) 450cart_plot%() = FALSE 460DIM entered_parax_functions$(6) 470DIM entered_paray_functions$(6) 480DIM current_parax_func_text% 200 490DIM current_paray_func_text% 200 500DIM para_functions$(6) 510DIM para_plot%(6) 520DIM help_block% 100 530DIM b% 400 540DIM table% 5200 550maxstack% = 50 560DIM stack%(maxstack%) 570DIM draw_array% 24000 580para_plot%() = FALSE 590$block%= "TASK" 600SYS "Wimp_Initialise",200,!block%,"Graphs" TO version%, task% 610cart_plot% = TRUE 620polar_plot%= FALSE 630para_plot% = FALSE 640main_menu_open = FALSE 650quit_menu_open = FALSE 660finished% = FALSE 670auto_y_cartaxes% = FALSE 680show_axes% = TRUE 690cart_axes_yes_icon% = 9 700cart_func_yes_icon% = 6 710cart_func_count_icon% = 3 720cart_func_icon% =7 730current_cart_func% = 1 740cart_min_x_icon% = 5 750cart_max_x_icon% = 6 760cart_min_y_icon% = 7 770cart_max_y_icon% = 8 780x_icon%=2 790y_icon%=3 800old_main_x_origin$ = "" 810old_main_y_origin$ = "" 820main_x_origin% = 0 830main_y_origin% = 0 840entered_maxx = 5 850entered_minx = -5 860entered_maxy = 10 870entered_miny =-10 880auto_y_paraaxes% = FALSE 890PROCadjust_axes(maxx,minx,maxy,miny) 900show_coordinates% = FALSE 910default_format% = @% 920increment = (maxx-minx)/1280 930yfactor = 1024/(maxy - miny) 940y_shift% = 512 +yfactor*(miny+maxy)/2 950degrees% = FALSE 960PROCcalc_cart_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) 970zooming% = FALSE 980para_axes_yes_icon% = 9 990para_min_x_icon% = 5 1000para_max_x_icon% = 6 1010para_min_y_icon% = 7 1020para_max_y_icon% = 8 1030para_min_t_icon% = 11 1040para_max_t_icon% = 13 1050current_para_func% =1 1060para_func_yes_icon% = 6 1070para_funcx_icon% =7 1080para_funcy_icon% =11 1090para_func_count_icon%=3 1100polar_radius_icon% = 2 1110polar_min_icon% = 4 1120polar_max_icon% = 5 1130polar_axes_yes_icon% = 7 1140polar_left_icon% = 4 1150polar_func_count_icon%= 3 1160polar_right_icon% = 5 1170polar_func_icon% = 7 1180polar_func_yes_icon% = 6 1190polar_colour_icon% = 9 1200auto_polar_axes% = FALSE 1210current_polar_func% = 1 1220big% = 1000000 1230max_radius = 1 1240ok_icon% = 0 1250picture% = 3 1260entered_rad = 1 1270format$ = "data" 1280sf =1 1290old_sf =1 1300save_open% =FALSE 1310save1_open% =FALSE 1320ENDPROC 1330 1340 1350DEF PROCinitialise_functions 1360cart_functions$(1) ="X^2" 1370cart_functions$(2) ="X^3" 1380cart_functions$(3) ="1/X" 1390cart_functions$(4) ="1/X^2" 1400cart_functions$(5) ="SINX" 1410cart_functions$(6) ="LOGX" 1420para_functions$(1) ="2t^2" 1430para_functions$(2) ="4t" 1440para_functions$(3) ="SINt" 1450para_functions$(4) ="COS3t" 1460para_functions$(5) ="2t" 1470para_functions$(6) ="1/t" 1480FOR graph% = 1 TO 6 1490 entered_cart_functions$(graph%) = cart_functions$(graph%) 1500NEXT 1510PROCinitialise_para 1520window%= cartesian% 1530cart_func_icon%= FNupdate_cart_function( 1) 1540cart_axes_yes_icon%=FNchange_text(cartaxes%,cart_axes_yes_icon%,"NO") 1550PROCtick(main_menu%,5) 1560PROCno_tick(main_menu%,6) 1570PROCno_tick(main_menu%,7) 1580PROCno_tick(main_menu%,8) 1590PROCtick(main_menu%,9) 1600window% = parametric% 1610para_funcx_icon%= FNupdate_parax_function( 1) 1620para_funcy_icon%= FNupdate_paray_function( 1) 1630para_axes_yes_icon%=FNchange_text(paraaxes%,cart_axes_yes_icon%,"NO") 1640window% = polar% 1650polar_functions$(1) ="SINtCOSt" 1660polar_functions$(2) ="SIN3tCOS4" 1670polar_functions$(3) ="TANt" 1680para_functions$(6) ="1/t" 1690FOR graph% = 1 TO 3 1700 entered_polar_functions$(graph%) = polar_functions$(graph%) 1710NEXT 1720polar_func_icon%= FNupdate_polar_function( 1) 1730window%= cartesian% 1740ENDPROC 1750 1760 1770DEF PROCload_sprites 1780S%=OPENIN"<Graph$Dir>.Sprites":T%=EXT#S%+16:CLOSE#S% 1790DIM sprites% T% 1800!sprites%=T%:sprites%!8=1 1810SYS "OS_SpriteOp",&109,sprites% 1820SYS "OS_SpriteOp",&10A,sprites%,"<Graph$Dir>.sprites" 1830ENDPROC 1840 1850 1860DEF PROCload_templates 1870SYS "Wimp_OpenTemplate",,"<Graph$Dir>.templates" 1880SYS "Wimp_LoadTemplate",,buffer%,temp%+&200,temp%+&2FF,-1,"proginfo",0 1890SYS "Wimp_CreateWindow",,buffer% TO info% 1900SYS "Wimp_LoadTemplate",,buffer%,temp%+&300,temp%+&5FF,-1,"save",0 1910buffer%!64 = sprites% 1920SYS "Wimp_CreateWindow",,buffer% TO save% 1930SYS "Wimp_LoadTemplate",,buffer%,temp%+&600,temp%+&8FF,-1,"save1",0 1940buffer%!64 = sprites% 1950SYS "Wimp_CreateWindow",,buffer% TO save1% 1960SYS "Wimp_LoadTemplate",,buffer%,temp%+&900,temp%+&9FF,-1,"main",0 1970buffer%!64 = sprites% 1980SYS "Wimp_CreateWindow",,buffer% TO main% 1990SYS "Wimp_LoadTemplate",,buffer%,temp%+&A00,temp%+&AFF,-1,"cartaxes",0 2000SYS "Wimp_CreateWindow",,buffer% TO cartaxes% 2010SYS "Wimp_LoadTemplate",,buffer%,temp%+&B00,temp%+&DFF,-1,"cartesian",0 2020buffer%!64 = sprites% 2030SYS "Wimp_CreateWindow",,buffer% TO cartesian% 2040SYS "Wimp_LoadTemplate",,buffer%,temp%+&E00,temp%+&EFF,-1,"coord",0 2050SYS "Wimp_CreateWindow",,buffer% TO coord% 2060SYS "Wimp_LoadTemplate",,buffer%,temp%+&F00,temp%+&10FF,-1,"parametric",0 2070buffer%!64 = sprites% 2080SYS "Wimp_CreateWindow",,buffer% TO parametric% 2090SYS "Wimp_LoadTemplate",,buffer%,temp%+&1100,temp%+&11FF,-1,"paraaxes",0 2100SYS "Wimp_CreateWindow",,buffer% TO paraaxes% 2110SYS "Wimp_LoadTemplate",,buffer%,temp%+&1200,temp%+&12FF,-1,"polaraxes",0 2120SYS "Wimp_CreateWindow",,buffer% TO polaraxes% 2130SYS "Wimp_LoadTemplate",,buffer%,temp%+&1300,temp%+&14FF,-1,"polar",0 2140buffer%!64 = sprites% 2150SYS "Wimp_CreateWindow",,buffer% TO polar% 2160SYS "Wimp_CloseTemplate" 2170format$="data" 2180dummy$=FNread_filename_text(save1%) 2190format$="draw" 2200dummy$=FNread_filename_text(save%) 2210$fi%="GraphData" 2220$gi%="GraphDraw" 2230ENDPROC 2240 2250 2260 2270 2280 2290 2300DEF PROCerror 2310LOCAL temp% 2320temp% = @% 2330@% = default_format% 2340IF ERR = 17 THEN 2350 PROCerror_message("Escape pressed") 2360 VDU 3 2370 END 2380ELSE 2390 PROCerror_message(REPORT$+" (internal error) "+STR$(ERL)) 2400ENDIF 2410@%=temp% 2420ENDPROC 2430 2440 2450 2460 2470 2480 2490DEF PROCerror_message(text$) 2500SYS"Hourglass_Smash" 2510SYS"Wimp_DragBox",,-1 2520!block%=ERR 2530$(block%+4)=text$ 2540SYS "Wimp_ReportError",block%,1,"Graphs" 2550ENDPROC 2560 2570 2580 2590 2600 2610 2620DEF PROCglass(o%) 2630IF o% THEN 2640 SYS"Hourglass_On" 2650ELSE 2660 SYS"Hourglass_Off" 2670ENDIF 2680ENDPROC 2690 2700 2710 2720 2730 2740 2750DEF PROCno_tick(menu%,item%) 2760byte%=menu%+28+item%*24 2770!byte% = !byte% AND &FFFFFFFE 2780ENDPROC 2790 2800 2810DEF PROCtick(menu%,item%) 2820byte%=menu%+28+item%*24 2830!byte% = !byte% OR 1 2840ENDPROC 2850 2860 2870 2880 2890 2900DEF PROCtick_reverse(menu%,item%) 2910byte%=menu%+28+item%*24 2920IF !byte% AND 1 = 1 THEN 2930!byte% = !byte% AND &FFFFFFFE 2940ELSE 2950!byte% = !byte% OR 1 2960ENDIF 2970ENDPROC 2980 2990 3000 3010 3020 3030 3040DEF PROCmainloop 3050REPEAT 3060PROCupdate_coordinates 3070PROCpoll 3080UNTIL finished% 3090ENDPROC 3100 3110 3120DEF PROCpoll 3130SYS "Wimp_Poll",(NOT show_coordinates% AND 1),block% TO reason%,block% 3140CASE reason% OF 3150WHEN 1 : PROCsetsf:PROCredraw(!block%) 3160WHEN 2 : SYS "Wimp_OpenWindow",,block% 3170WHEN 3 : PROCclose(!block%) 3180WHEN 4 : PROCleave_window(block%) 3190WHEN 6 : PROCbuttons(block%) 3200WHEN 7 : PROCsave 3210WHEN 8 : PROCkey_press(block%) 3220WHEN 9 : PROCmenuselect(block%) 3230WHEN 17,18 : PROCreceive(block%) 3240ENDCASE 3250ENDPROC 3260 3270DEF PROCkey_press(block%) 3280LOCAL window%, icon%, key% ,height% 3290window% = !block% 3300icon% = block%!4 3310height% = block%!16 3320key% = block%!24 3330CASE key% OF 3340 WHEN 13 : PROCreturn 3350 WHEN &181 : PROCf1 3360 WHEN 27 : PROCescape_pressed 3370OTHERWISE 3380 SYS "Wimp_ProcessKey",key% 3390ENDCASE 3400ENDPROC 3410 3420DEF PROCreturn 3430CASE window% OF 3440 WHEN save1% :format$ = "data" 3450 PROCquicksave 3460 WHEN save% :format$ = "draw" 3470 PROCquicksave 3480 WHEN cartaxes% :PROCnextcart 3490 WHEN paraaxes% :PROCnextpara 3500 WHEN polaraxes% :PROCnextpolar 3510ENDCASE 3520ENDPROC 3530 3540DEF PROCnextcart 3550 PROCget_caret 3560 caret_icon% =(caret_icon%-4)MOD4+5 3570 PROCcaret(cartaxes%,caret_icon%) 3580ENDPROC 3590 3600 3610DEF PROCnextpara 3620 PROCget_caret 3630 CASE caret_icon% OF 3640 WHEN para_min_x_icon% : icon% =para_max_x_icon% 3650 WHEN para_max_x_icon% : icon% =para_min_y_icon% 3660 WHEN para_min_y_icon% : icon% =para_max_y_icon% 3670 WHEN para_max_y_icon% : icon% =para_min_t_icon% 3680 WHEN para_min_t_icon% : icon% =para_max_t_icon% 3690 WHEN para_max_t_icon% : icon% =para_min_x_icon% 3700ENDCASE 3710PROCcaret(paraaxes%,icon%) 3720ENDPROC 3730 3740DEF PROCnextpolar 3750 PROCget_caret 3760 CASE caret_icon% OF 3770 WHEN polar_radius_icon% :icon%= polar_min_icon% 3780 WHEN polar_min_icon% :icon%= polar_max_icon% 3790 WHEN polar_max_icon% :icon%= polar_radius_icon% 3800 ENDCASE 3810PROCcaret(polaraxes%,icon%) 3820ENDPROC 3830 3840 3850 3860 3870DEF PROCf1 3880A%=@% 3890@%=&01000608 3900cart_min_y_icon%=FNchange_text(cartaxes%,cart_min_y_icon%,STR$(-10)) 3910cart_max_y_icon%=FNchange_text(cartaxes%,cart_max_y_icon%,STR$(10)) 3920cart_min_x_icon%=FNchange_text(cartaxes%,cart_min_x_icon%,STR$(-5)) 3930cart_max_x_icon%=FNchange_text(cartaxes%,cart_max_x_icon%,STR$(5)) 3940SYS "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 3950@%=A% 3960ENDPROC 3970 3980 3990DEF PROCcaret(window%,icon%) 4000 SYS"Wimp_SetCaretPosition",window%,icon%,,,-1,0 4010ENDPROC 4020 4030DEF PROCget_caret 4040 SYS"Wimp_GetCaretPosition",,caret% 4050 caret_window% = !caret% 4060 caret_icon% = caret%!4 4070 caret_height% = caret%!16 4080ENDPROC 4090 4100 4110DEF PROCupdate_coordinates 4120IF show_coordinates% AND NOT polar_plot% THEN 4130SYS "Wimp_GetPointerInfo",,block% 4140x$=STR$(!block%) 4150y$=STR$(block%!4) 4160IF block%!12 = main% THEN 4170x=(!block% -main_x_origin%) *(maxx-minx)/1280/sf+minx:REM replace by * factor 4180y=(block%!4 - main_y_origin% )* (maxy-miny)/1024/sf+maxy 4190IF para_plot% THEN x=x*1.25 4200A%=@% 4210@%= &0100070A 4220x$=STR$(x) 4230y$=STR$(y) 4240@%=A% 4250ELSE 4260x$="" 4270y$="" 4280ENDIF 4290IF x$<>old_main_x_origin$ OR y$<>old_main_y_origin$ THEN 4300old_main_x_origin$ =x$ 4310old_main_y_origin$ =y$ 4320x_icon%=FNchange_text(coord%,x_icon%,x$) 4330y_icon%=FNchange_text(coord%,y_icon%,y$) 4340SYS "Wimp_ForceRedraw",coord%,-100,-300,400,100 4350ENDIF 4360ENDIF 4370ENDPROC 4380 4390 4400 4410DEF PROCredraw(handle%) 4420!block% = handle% 4430SYS "Wimp_RedrawWindow",,block% TO more% 4440WHILE more% <> 0 4450PROCget_window_parameters 4460PROCredraw_main_window 4470SYS "Wimp_GetRectangle",,block% TO more% 4480ENDWHILE 4490ENDPROC 4500 4510 4520 4530 4540 4550 4560DEF PROCclose(parameter%) 4570!block% = parameter% 4580SYS "Wimp_CloseWindow",,block% 4590CASE parameter% OF 4600WHEN coord% : PROCno_tick(main_menu%,8) 4610 coordinates% = FALSE 4620ENDCASE 4630ENDPROC 4640 4650 4660 4670 4680 4690 4700DEF PROCbuttons(parameter%) 4710mouse_x%= !parameter% 4720mouse_y%= parameter%!4 4730button% = parameter%!8 4740window% = parameter%!12 4750icon% = parameter%!16 4760IF button% AND 2 THEN 4770PROCmenu(window%,mouse_x%,mouse_y%) 4780ELSE 4790 IF window% = -2 THEN 4800 PROCopen_window(main%) 4810ENDIF 4820ENDIF 4830IF button% AND 4 THEN 4840CASE window% OF 4850 WHEN main% : SYS "Wimp_ForceRedraw",polaraxes%,0,-500,900,0 4860 IF cart_plot% THEN 4870 PROCcalculate_cart 4880 SYS "Wimp_ForceRedraw",cartaxes%,0,-500,900,0 4890 ENDIF 4900 IF para_plot% THEN 4910 PROCcalculate_para 4920 SYS "Wimp_ForceRedraw",paraaxes%,0,-500,900,0 4930 ENDIF 4940 IF polar_plot% THEN 4950 PROCcalculate_polar 4960 SYS "Wimp_ForceRedraw",polaraxes%,0,-500,900,0 4970 ENDIF 4980 WHEN cartaxes% : PROCupdatecartaxes(window%,icon%) 4990 WHEN cartesian% : PROCupdatecartesian(window%,icon%) 5000 WHEN paraaxes% : PROCupdateparaaxes(window%,icon%) 5010 WHEN parametric% : PROCupdateparametric(window%,icon%) 5020 WHEN polaraxes% : PROCupdatepolaraxes(window%,icon%) 5030 WHEN polar% : PROCupdatepolar(window%,icon%) 5040 WHEN save1% : format$ = "data" 5050 IF icon% = ok_icon% THEN PROCquicksave 5060 IF icon% = picture% THEN PROCdraw_click(window%) 5070 WHEN save% : format$ = "draw" 5080 IF icon% = ok_icon% THEN PROCquicksave 5090 IF icon% = picture% THEN PROCdraw_click(window%) 5100 5110ENDCASE 5120ENDIF 5130IF button% AND 1 THEN 5140CASE window% OF 5150 WHEN main% : PROCzoom 5160ENDCASE 5170ENDIF 5180ENDPROC 5190ENDPROC 5200 5210 5220 5230 5240 5250DEF PROCopen_window(handle%) 5260 !block% = handle% 5270 SYS "Wimp_GetWindowState",,block% 5280 block%!28 = -1 : REM Ensure window is on top 5290 SYS "Wimp_OpenWindow",,block% 5300ENDPROC 5310 5320 5330 5340DEF PROCmenu(window%,x%,y%) 5350CASE window% OF 5360WHEN main% : menu_block% = main_menu% 5370 main_menu_open = TRUE 5380 quit_menu_open = FALSE 5390WHEN -2 : menu_block% = quit_menu% 5400 main_menu_open = FALSE 5410 quit_menu_open = TRUE 5420ENDCASE 5430SYS "Wimp_CreateMenu",,menu_block%,x%,y% 5440ENDPROC 5450 5460 5470 5480DEF FNiconbar 5490!block%=-1:block%!4=0:block%!8=0:block%!12=63:block%!16=68:block%!20=&2102 5500spname$="!graphs" 5510DIM block%!24 (LENspname$+1):$(block%!24)=spname$:block%!28=sprites% 5520block%!32=LENspname$+1 5530SYS "Wimp_CreateIcon",,block% TO ic% 5540=ic% 5550 5560 5570 5580 5590DEF PROCmenuselect(block%) 5600selection% = !block% 5610IF main_menu_open THEN 5620SYS"Wimp_GetPointerInfo",,block% 5630IF block%!8 = 1 THEN 5640 REM reopen menu 5650 SYS "Wimp_CreateMenu",,main_menu% 5660ENDIF 5670CASE selection% OF 5680WHEN 0 : PROCfile_data 5690WHEN 1 : PROCfile_graphs 5700WHEN 2 : IF NOT polar_plot% THEN PROCcoordinates 5710WHEN 3 : PROCaxes 5720WHEN 4 : PROCfunctions 5730WHEN 5 : PROCselect_cartesian 5740WHEN 6 : PROCselect_polar 5750WHEN 7 : PROCselect_parametric 5760WHEN 8 : PROCdegrees 5770WHEN 9 : PROCaxes_flag 5780WHEN 10 : PROCline 5790ENDCASE 5800ELSE 5810CASE selection% OF 5820WHEN 0 : PROCclose_down 5830WHEN 1 : PROCopen_window(info%) 5840ENDCASE 5850ENDIF 5860ENDPROC 5870 5880 5890 5900 5910DEF PROCleave_window(parameter%) 5920LOCAL window% 5930window% = !parameter% 5940CASE window% OF 5950WHEN info% : PROCclose(info%) 5960REM WHEN cartesian% : PROCextract_cart_func 5970REM PROCconvert_functions 5980REMWHEN parametric%: PROCextract_para_functions 5990REM PROCreturn_paraaxes_values 6000REM PROCconvert_para_functions 6010REMWHEN polar% : PROCextract_polar_functions 6020REM PROCconvert_polar_functions 6030WHEN cartaxes% : PROCcheck_cart_axes 6040WHEN polaraxes% : PROCcheck_polar_axes 6050WHEN paraaxes% : PROCcheck_para_axes 6060ENDCASE 6070ENDPROC 6080 6090 6100 6110 6120 6130 6140DEF PROCclose_down 6150$block% = "TASK" 6160SYS "Wimp_CloseDown",task%,!block% 6170finished% = TRUE 6180ENDPROC 6190 6200 6210 6220 6230 6240DEF PROCreceive(parameter%) 6250LOCAL reason% 6260new_task% = parameter%!4 6270ref%=parameter%!8 6280reason%=parameter%!16 6290CASE reason% OF 6300WHEN 0 : PROCclose_down 6310WHEN 2 : PROCdatasave(parameter%) 6320WHEN 3,5 : IF parameter%!12=0 THEN PROCdataload(parameter%) 6330WHEN 6 : PROCmemory 6340WHEN &502: PROChelp 6350ENDCASE 6360ENDPROC 6370 6380 6390DEF PROCaxes 6400IF cart_plot% PROCopen_window(cartaxes%) 6410IF para_plot% PROCopen_window(paraaxes%) 6420IF polar_plot% PROCopen_window(polaraxes%) 6430ENDPROC 6440 6450 6460 6470 6480 6490DEF PROCfunctions 6500IF cart_plot% PROCopen_window(cartesian%) 6510IF para_plot% PROCopen_window(parametric%) 6520IF polar_plot% PROCopen_window(polar%) 6530 ENDPROC 6540 6550 6560 6570 6580 6590DEF PROCupdatecartaxes(window%,icon%) 6600IF icon% = cart_axes_yes_icon% THEN 6610 auto_y_cartaxes% = NOT auto_y_cartaxes% 6620 IF auto_y_cartaxes% THEN 6630 cart_axes_yes_icon%=FNchange_text(window%,icon%,"YES") 6640 PROCdeselect(window%,cart_min_y_icon%) 6650 PROCdeselect(window%,cart_max_y_icon%) 6660ELSE 6670 cart_axes_yes_icon%=FNchange_text(window%,icon%,"NO") 6680 PROCreselect(window%,cart_min_y_icon%) 6690 PROCreselect(window%,cart_max_y_icon%) 6700ENDIF 6710ENDIF 6720SYS "Wimp_ForceRedraw",window%,0,-300,800,0 6730ENDPROC 6740 6750 6760 6770 6780DEF FNread_icon_text(window%,icon%) 6790!block% = window% 6800block%!4 = icon% 6810SYS "Wimp_GetIconState",,block% 6820text% = block%+ 28 6830=$text% 6840 6850 6860 6870 6880DEF PROCdeselect(window%,icon%) 6890!block% = window% 6900block%!4= icon% 6910block%!8= 2^22 6920block%!12 = 2^22 6930SYS "Wimp_SetIconState",,block% 6940ENDPROC 6950 6960 6970 6980 6990DEF PROCreselect(window%,icon%) 7000!block% = window% 7010block%!4= icon% 7020block%!8= 0 7030block%!12 = 2^22 7040SYS "Wimp_SetIconState",,block% 7050ENDPROC 7060 7070 7080 7090 7100DEF PROCupdatecartesian(window%,icon%) 7110PROCextract_cart_func 7120 IF cart_plot%(current_cart_func%) THEN 7130 cart_func_yes_icon%=FNchange_text(window%,cart_func_yes_icon%,"YES") 7140ELSE 7150 cart_func_yes_icon%=FNchange_text(window%,cart_func_yes_icon%,"NO") 7160ENDIF 7170IF icon% = cart_func_yes_icon% THEN 7180 cart_plot%(current_cart_func%) = NOT cart_plot%(current_cart_func%) 7190 IF cart_plot%(current_cart_func%) THEN 7200 cart_func_yes_icon%=FNchange_text(window%,icon%,"YES") 7210ELSE 7220 cart_func_yes_icon%=FNchange_text(window%,icon%,"NO") 7230ENDIF 7240ENDIF 7250IF icon% = 4 AND current_cart_func% > 1 THEN 7260 current_cart_func% -=1 7270cart_func_count_icon% = FNchange_text(window%,cart_func_count_icon%,STR$(current_cart_func%)) 7280ENDIF 7290 7300IF icon% = 5 AND current_cart_func% < 6 THEN 7310 current_cart_func% +=1 7320cart_func_count_icon% = FNchange_text(window%,cart_func_count_icon%,STR$(current_cart_func%)) 7330ENDIF 7340cart_func_icon%=FNupdate_cart_function( current_cart_func%) 7350IF cart_plot%(current_cart_func%) THEN 7360 cart_func_yes_icon%=FNchange_text(window%,cart_func_yes_icon%,"YES") 7370ELSE 7380 cart_func_yes_icon%=FNchange_text(window%,cart_func_yes_icon%,"NO") 7390ENDIF 7400PROCset_graph_colour_icon(window%,current_cart_func%) 7410!block% = window% 7420SYS "Wimp_ForceRedraw",window%,0,-300,900,0 7430ENDPROC 7440 7450 7460 7470 7480DEFPROCset_graph_colour_icon(window%,current_cart_func%) 7490block%!0 = window% 7500block%!4 = 9 7510block%!8 = (9 + current_cart_func%)<<28 7520block%!12 = &F <<28 7530SYS "Wimp_SetIconState",,block% 7540ENDPROC 7550 7560 7570 7580DEF FNchange_text(window%,icon%,text$) 7590!block% = window% 7600block%!4 = icon% 7610SYS "Wimp_GetIconState",,block% 7620text% = block%+28 7630$text% = text$ 7640SYS "Wimp_DeleteIcon",,block% 7650FOR below% = block% + 4 TO block% +35 STEP 4 7660 !below% = below%!4 7670NEXT 7680SYS "Wimp_CreateIcon",,block% TO icon% 7690=icon% 7700 7710 7720 7730 7740 7750 7760DEF FNupdate_cart_function( item%) 7770!block% = window% 7780block%!4 = cart_func_icon% 7790SYS "Wimp_GetIconState",,block% 7800SYS "Wimp_DeleteIcon",,block% 7810FOR below% = block% + 4 TO block% +35 STEP 4 7820 !below% = below%!4 7830NEXT 7840text% = block% + 24 7850validation% = block% + 28 7860buffer_length% = block% + 32 7870!text% = current_cart_func_text% 7880!validation% = -1 7890!buffer_length% = 100 7900$current_cart_func_text% = entered_cart_functions$(item%) 7910SYS "Wimp_CreateIcon",,block% TO icon% 7920=icon% 7930 7940DEF PROCreturn_axes_values(RETURN minx,RETURN maxx,RETURN miny,RETURN maxy) 7950entered_minx=VALFNread_icon_text(cartaxes%,cart_min_x_icon%) 7960entered_maxx=VALFNread_icon_text(cartaxes%,cart_max_x_icon%) 7970entered_miny=VALFNread_icon_text(cartaxes%,cart_min_y_icon%) 7980entered_maxy=VALFNread_icon_text(cartaxes%,cart_max_y_icon%) 7990PROCadjust_axes(maxx,minx,maxy,miny) 8000ENDPROC 8010 8020 8030DEF PROCextract_cart_func 8040!block% = window% 8050block%!4 = cart_func_icon% 8060SYS "Wimp_GetIconState",,block% 8070entered_cart_functions$(current_cart_func%) = $(block%!28) 8080FOR graph% = 1 TO 6 8090 cart_functions$(graph%) = entered_cart_functions$(graph%) 8100NEXT 8110ENDPROC 8120 8130 8140 8150DEF PROCredraw_main_window 8160PROCsetsf 8170IF cart_plot% THEN 8180PROCdraw_cart_axes 8190PROCx_plot2(ebx%,etx%-2,ety%,eby%,1) 8200VDU 26 8210main_x_origin% =wbx% - xsc% 8220main_y_origin% =wty% - ysc% 8230ENDIF 8240 8250IF para_plot% THEN 8260 PROCdraw_cart_axes 8270 PROCx_plot1(ebx%,etx%-2,ety%,eby%,1) 8280 VDU 26 8290 main_x_origin% =wbx% - xsc% 8300 main_y_origin% =wty% - ysc% 8310 main_x_origin% =wbx% - xsc% 8320 main_y_origin% =wty% - ysc% 8330ENDIF 8340IF polar_plot% THEN 8350 PROCdraw_polar_axes 8360 PROCx_plot(ebx%,etx%-2,ety%,eby%,1) 8370 VDU 26 8380 main_x_origin% =wbx% - xsc% 8390 main_y_origin% =wty% - ysc% 8400ENDIF 8410ENDPROC 8420 8430DEF PROCsetsf 8440!b%= main% 8450SYS "Wimp_GetWindowInfo",,b% 8460sf=(b%!12-b%!4)/1280 8470multiplier% = sf * 1024 8480IF old_sf <> sf THEN 8490 SYS"OS_ReadModeVariable",MODE,4 TO ,,pix_value% 8500 pix_value% +=1 8510 pix_value% = pix_value%/ sf 8520 old_sf = sf 8530 !b% = main% 8540 b%!4 = 0 8550 b%!8 = -2000 8560 b%!12 = 2000 8570 b%!16 = 0 8580 SYS"Wimp_ForceRedraw",main%,0,-2000,2000,0 8590 B%=0 8600 C%= table% 8610 D% = multiplier% 8620CALL scale 8630ENDIF 8640ENDPROC 8650 8660 8670DEF PROCget_window_parameters 8680wbx% = block%!4 8690wby% = block%!8 8700wtx% = block%!12 8710wty% = block%!16 8720xsc% = block%!20 8730ysc% = block%!24 8740gbx% = block%!28 8750gby% = block%!32 8760gtx% = block%!36 8770gty% = block%!40 8780hp% = wtx% - wbx% 8790vp% = wty% -wby% 8800ebx% = xsc% + gbx%-wbx% 8810etx% = xsc%+gtx%-wbx% 8820ety%=ysc% + gty%-wty% 8830eby% = ysc%-gby%-wty% 8840VDU 26,5,24,gbx%;gby%;gtx%-2;gty%-4; 8850ORIGIN wbx% - xsc%,wty%-ysc% 8860ENDPROC 8870 8880 8890 8900 8910 8920 8930 8940 8950DEF PROCcalculate_cart 8960LOCAL count%, count1% 8970PROCglass(TRUE) 8980count% = 0 8990FOR graph%= 1 TO 6 9000 IF cart_plot%(graph%) THEN count% +=1 9010NEXT 9020count1%= count% 9030window% = cartesian% 9040PROCextract_cart_func 9050PROCconvert_functions 9060PROCreturn_axes_values(minx,maxx,miny,maxy) 9070IF auto_y_cartaxes% THEN 9080 count% =count%*2 9090 count1%=count1%*2 9100 PROCreturn_y_range(minx,maxx,miny,maxy) 9110ENDIF 9120increment = (maxx-minx)/1280 9130yfactor = 1024/(maxy - miny) 9140y_shift% = 512 +yfactor*(miny+maxy)/2 9150FOR graph% = 1 TO 6 9160base% = plot_values% +(graph% -1)*1280*4 9170IF cart_plot%(graph%) THEN 9180SYS"Hourglass_Percentage",100-(count1%/count%)*100 9190 count1% -=1 9200FOR X% = 0 TO 1280 9210 X= minx+increment*X% 9220 x=X 9230 ok% = TRUE 9240 LOCAL ERROR 9250 ON ERROR LOCAL ok% = FALSE : 9260 IF ok% THEN 9270 base%!(X%*4) = yfactor*EVALcart_functions$(graph%) -y_shift% 9280 ELSE 9290 base%!(X%*4)= -big% 9300 ENDIF 9310 RESTORE ERROR 9320NEXT 9330ENDIF 9340NEXT 9350PROCcalc_cart_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) 9360PROCglass(FALSE) 9370SYS "Wimp_ForceRedraw",main%,0,-1280,1280,0 9380ENDPROC 9390 9400DEF PROCreturn_y_range(minx,maxx,RETURN miny,RETURN maxy) 9410increment = (maxx-minx)/1280 9420entered_maxy= -10E30 9430entered_miny= 10E30 9440FOR graph% = 1 TO 6 9450IF cart_plot%(graph%) THEN 9460 SYS"Hourglass_Percentage",100-(count1%/count%)*100 9470FOR X% = 0 TO 1280 9480 X= minx+increment*X% 9490 x=X 9500 ok% = TRUE 9510 LOCAL ERROR 9520 ON ERROR LOCAL ok% = FALSE 9530 IF ok% THEN 9540 value = EVALcart_functions$(graph%) 9550 IF value < entered_miny THEN entered_miny = value 9560 IF value > entered_maxy THEN entered_maxy = value 9570 ENDIF 9580 RESTORE ERROR 9590NEXT 9600 count1%-=1 9610ENDIF 9620NEXT 9630A%=@% 9640@%=&01000308 9650cart_min_y_icon%=FNchange_text(cartaxes%,cart_min_y_icon%,STR$(entered_miny)) 9660cart_max_y_icon%=FNchange_text(cartaxes%,cart_max_y_icon%,STR$(entered_maxy)) 9670SYS "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 9680@%=A% 9690PROCadjust_axes(maxx,minx,maxy,miny) 9700ENDPROC 9710 9720 9730 9740DEF PROCcalc_cart_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) 9750A%=@% 9760@%=&01000108 9770IF 0 >= miny AND 0 <= maxy THEN 9780 x_axes_level= 0 9790 x_axes_level% = 0 * yfactor-y_shift% 9800 ELSE 9810 x_axes_level= VAL(STR$((maxy+miny)))/2 9820 x_axes_level% = x_axes_level * yfactor-y_shift% 9830ENDIF 9840IF 0 >= minx AND 0 <= maxx THEN 9850 y_axes_level% = 1280/(maxx-minx)*(-minx) 9860 y_axes_level=0 9870 ELSE 9880 y_axes_level= VAL(STR$((maxx+minx)))/2 9890 y_axes_level% = 1280/(maxx-minx)*(y_axes_level-minx) 9900ENDIF 9910@%=A% 9920ENDPROC 9930 9940 9950DEF PROCdraw_cart_axes 9960LOCAL y%,y1% 9970IF show_axes% THEN 9980y%=y_axes_level%*sf 9990y1%=(y_axes_level%-20)*sf 10000IF para_plot% THEN 10010 lmx%= 210*sf:lmy%=(x_axes_level%-20)*sf 10020 rmx%= 1068*sf: rmy% =(x_axes_level%-20)*sf 10030ELSE 10040 lmx%= 104*sf:lmy%=(x_axes_level%-20)*sf 10050 rmx%= 1174*sf: rmy% =(x_axes_level%-20)*sf 10060ENDIF 10070GCOL0,7 10080MOVE 0,x_axes_level%*sf 10090DRAW 1280*sf,x_axes_level%*sf 10100MOVE lmx%,lmy% 10110PLOT1,0,40*sf 10120MOVE rmx%,rmy% 10130PLOT1,0,40*sf 10140MOVE 1100*sf,x_axes_level%*sf-20 10150PRINT"y=";STR$(x_axes_level) 10160MOVE y%,0 10170DRAW y%,-1050*sf 10180MOVE y1%,-84*sf 10190PLOT 1,40*sf,0 10200MOVE y1%,-938*sf 10210PLOT 1,40*sf,0 10220MOVE y%+10,-50 10230PRINT "x=";STR$(y_axes_level) 10240ENDIF 10250ENDPROC 10260 10270 10280 10290DEF PROCcoordinates 10300show_coordinates% = NOT show_coordinates% 10310IF show_coordinates% THEN 10320PROCopen_window(coord%) 10330PROCtick(main_menu%,2) 10340ELSE 10350PROCclose(coord%) 10360PROCno_tick(main_menu%,2) 10370ENDIF 10380ENDPROC 10390 10400 10410DEF PROCcheck_cart_axes 10420PROCreturn_axes_values(minx,maxx,miny,maxy) 10430A%=@% 10440@%=&01000308 10450IF minx >= maxx THEN 10460 SWAP minx,maxx 10470 IF minx=maxx THEN maxx=maxx+1 10480 cart_max_x_icon% =FNchange_text(cartaxes%,cart_max_x_icon%,STR$(maxx)) 10490 cart_min_x_icon% =FNchange_text(cartaxes%,cart_min_x_icon%,STR$(minx)) 10500 SYS "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 10510 PROCerror_message("X min must be less than X max. Values adjusted") 10520ELSE 10530IF maxx - minx < 1E-6 THEN 10540PROCerror_message("There may be errors due to the small X range") 10550ENDIF 10560ENDIF 10570IF NOT auto_y_cartaxes% AND miny >= maxy THEN 10580 SWAP miny,maxy 10590 IF miny = maxy THEN maxy = maxy+1 10600 cart_max_y_icon% =FNchange_text(cartaxes%,cart_max_y_icon%,STR$(maxy)) 10610 cart_min_y_icon% =FNchange_text(cartaxes%,cart_min_y_icon%,STR$(miny)) 10620 SYS "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 10630 PROCerror_message("Y min must be less than Y max. Values adjusted") 10640ENDIF 10650ENDPROC 10660 10670 10680DEF PROCaxes_flag 10690show_axes% = NOT show_axes% 10700IF show_axes% THEN 10710 PROCtick(main_menu%,9) 10720ELSE 10730 PROCno_tick(main_menu%,9) 10740ENDIF 10750SYS "Wimp_ForceRedraw",main%,0,-1280,1280,0 10760ENDPROC 10770 10780DEF PROCdegrees 10790degrees% = NOT degrees% 10800IF degrees% THEN 10810 PROCtick(main_menu%,8) 10820ELSE 10830 PROCno_tick(main_menu%,8) 10840ENDIF 10850ENDPROC 10860 10870 10880 10890 10900DEF PROCconvert_functions 10910FOR gra% = 1 TO 6 10920IF cart_plot%(gra%) THEN 10930cart_functions$(gra%)= FNupper(cart_functions$(gra%)) 10940PROCconvert(cart_functions$(gra%),"X",cart_functions$(gra%),error_no%) 10950IF error_no% <> 0 THEN 10960 PROCreport_func_error(gra%,error_no%) 10970 cart_plot%(gra%)=FALSE 10980 PROCupdatecartesian(cartesian%,9) 10990ENDIF 11000PROCext_func(cart_functions$(gra%)) 11010ENDIF 11020NEXT 11030ENDPROC 11040 11050 11060 11070DEF FNreplace(object$,target$,by$) 11080LOCAL start%, position% 11090start% = INSTR(object$,target$) 11100WHILE start% 11110position% = LEN(object$)-LEN(target$)-start%+1 11120object$ = LEFT$(object$,start%-1)+by$+RIGHT$(object$,position%) 11130start% = INSTR(object$,target$,start%+LEN(by$)) 11140ENDWHILE 11150=object$ 11160 11170 11180 11190DEF PROCadjust_axes(RETURN maxx,RETURN minx,RETURN maxy,RETURN miny) 11200LOCAL average,sf 11210sf= 1.2 11220average = (entered_maxx +entered_minx)/2 11230maxx=(entered_maxx-average)*sf+average 11240minx=(entered_minx-average)*sf+average 11250average = (entered_maxy +entered_miny)/2 11260maxy=(entered_maxy-average)*sf+average 11270miny=(entered_miny-average)*sf+average 11280ENDPROC 11290 11300 11310DEF PROCzoom 11320LOCAL A% 11330IF NOT zooming% AND cart_plot% THEN 11340zooming% = TRUE 11350VDU 26 11360!block% = main% 11370SYS "Wimp_GetWindowInfo",,block% 11380VDU24,block%!4;block%!8;block%!12;block%!16; 11390GCOL4,5 11400SYS "Wimp_GetPointerInfo",,block% 11410x1% = !block% 11420y1% = block%!4 11430REPEAT 11440 MOUSE mx,my,b 11450UNTIL b=0 11460REPEAT 11470 MOUSE mx,my,b 11480 x2% = mx 11490 y2% = my 11500 RECTANGLE x1%,y1%,x2%-x1%,y2%-y1% 11510 WAIT 11520 RECTANGLE x1%,y1%,x2%-x1%,y2%-y1% 11530 MOUSE mx,my,b 11540UNTIL b = 1 OR b=4 11550A%=@% 11560@%=&01000608 11570IF x1% > x2% THEN SWAP x1%,x2% 11580IF y1% > y2% THEN SWAP y1%,y2% 11590n_minx=(x1% -main_x_origin%) *(maxx-minx)/1280/sf+minx 11600n_maxx=(x2% -main_x_origin%) *(maxx-minx)/1280/sf+minx 11610n_miny=(y1% - main_y_origin% )* (maxy-miny)/1024/sf+maxy 11620n_maxy=(y2% - main_y_origin% )* (maxy-miny)/1024/sf+maxy 11630IF b=1 AND STR$(n_miny) <>STR$(n_maxy) AND STR$(n_minx) <>STR$(n_maxx) THEN 11640minx = n_minx 11650miny = n_miny 11660maxx = n_maxx 11670maxy = n_maxy 11680cart_min_y_icon%=FNchange_text(cartaxes%,cart_min_y_icon%,STR$(miny)) 11690cart_max_y_icon%=FNchange_text(cartaxes%,cart_max_y_icon%,STR$(maxy)) 11700cart_min_x_icon%=FNchange_text(cartaxes%,cart_min_x_icon%,STR$(minx)) 11710cart_max_x_icon%=FNchange_text(cartaxes%,cart_max_x_icon%,STR$(maxx)) 11720SYS "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 11730PROCcalculate_cart 11740ENDIF 11750@%=A% 11760zooming% = FALSE 11770ENDIF 11780ENDPROC 11790 11800DEF FNfact(x%) 11810LOCAL sum, count% 11820sum = 1 11830IF x% > 1 THEN 11840FOR count% = 2 TO x% 11850 sum = sum * count% 11860NEXT 11870ENDIF 11880=sum 11890 11900DEF FNcosh(x) 11910=0.5*(EXP(x)+EXP(-x)) 11920 11930DEF FNsinh(x) 11940=0.5*(EXP(x)-EXP(-x)) 11950 11960DEF FNtanh(x) 11970=FNsinh(x)/FNcosh(x) 11980 11990DEF FNarccosh(x) 12000=LN(x+(x*x-1)^0.5) 12010 12020DEF FNarcsinh(x) 12030=LN(x+(x*x+1)^0.5) 12040 12050DEF FNarctanh(x) 12060=0.5*LN((1+x)/(1-x)) 12070 12080DEF FNupper(text$) 12090LOCAL result$,i%,c$ 12100result$="" 12110FOR i% = 1 TO LENtext$ 12120 c$=MID$(text$,i%,1) 12130 IF c$>="a" AND c$<="z" THEN c$=CHR$(ASC(c$)AND&DF) 12140 result$=result$+c$ 12150NEXT 12160=result$ 12170 12180DEF PROCselect_cartesian 12190cart_plot% = TRUE 12200polar_plot%= FALSE 12210para_plot% = FALSE 12220PROCno_tick(main_menu%,6) 12230PROCno_tick(main_menu%,7) 12240PROCtick(main_menu%,5) 12250PROCclose(parametric%) 12260PROCclose(paraaxes%) 12270PROCclose(polar%) 12280PROCclose(polaraxes%) 12290PROCopen_window(cartaxes%) 12300PROCopen_window(cartesian%) 12310PROCcalculate_cart 12320IF show_coordinates% THEN 12330PROCopen_window(coord%) 12340ENDIF 12350ENDPROC 12360 12370 12380DEF PROCselect_polar 12390window%= polar% 12400cart_plot% = FALSE 12410polar_plot%= TRUE 12420para_plot% = FALSE 12430PROCno_tick(main_menu%,5) 12440PROCno_tick(main_menu%,7) 12450PROCtick(main_menu%,6) 12460PROCclose(parametric%) 12470PROCclose(paraaxes%) 12480PROCclose(cartesian%) 12490PROCclose(cartaxes%) 12500PROCclose(coord%) 12510PROCclose(polaraxes%) 12520PROCopen_window(polar%) 12530PROCopen_window(polaraxes%) 12540PROCcalculate_polar 12550ENDPROC 12560 12570 12580DEF PROCselect_parametric 12590window%=parametric% 12600cart_plot% = FALSE 12610polar_plot%= FALSE 12620para_plot% = TRUE 12630PROCno_tick(main_menu%,6) 12640PROCno_tick(main_menu%,5) 12650PROCtick(main_menu%,7) 12660PROCclose(cartesian%) 12670PROCclose(cartaxes%) 12680PROCclose(polar%) 12690PROCclose(polaraxes%) 12700PROCopen_window(paraaxes%) 12710PROCopen_window(parametric%) 12720IF show_coordinates% THEN 12730PROCopen_window(coord%) 12740ENDIF 12750PROCcalculate_para 12760ENDPROC 12770 12780 12790DEF PROCupdateparaaxes(window%,icon%) 12800IF icon% = para_axes_yes_icon% THEN 12810 auto_y_paraaxes% = NOT auto_y_paraaxes% 12820 IF auto_y_paraaxes% THEN 12830 para_axes_yes_icon%=FNchange_text(window%,icon%,"YES") 12840 PROCdeselect(window%,para_min_y_icon%) 12850 PROCdeselect(window%,para_max_y_icon%) 12860 PROCdeselect(window%,para_min_x_icon%) 12870 PROCdeselect(window%,para_max_x_icon%) 12880ELSE 12890 para_axes_yes_icon%=FNchange_text(window%,icon%,"NO") 12900 PROCreselect(window%,para_min_y_icon%) 12910 PROCreselect(window%,para_max_y_icon%) 12920 PROCreselect(window%,para_min_x_icon%) 12930 PROCreselect(window%,para_max_x_icon%) 12940ENDIF 12950ENDIF 12960SYS "Wimp_ForceRedraw",window%,0,-500,800,0 12970ENDPROC 12980 12990 13000DEF PROCupdateparametric(window%,icon%) 13010PROCextract_para_func 13020 IF para_plot%(current_para_func%) THEN 13030 para_func_yes_icon%=FNchange_text(window%,para_func_yes_icon%,"YES") 13040ELSE 13050 para_func_yes_icon%=FNchange_text(window%,para_func_yes_icon%,"NO") 13060ENDIF 13070IF icon% = para_func_yes_icon% THEN 13080 para_plot%(current_para_func%) = NOT para_plot%(current_para_func%) 13090 IF para_plot%(current_para_func%) THEN 13100 para_func_yes_icon%=FNchange_text(window%,icon%,"YES") 13110ELSE 13120 para_func_yes_icon%=FNchange_text(window%,icon%,"NO") 13130ENDIF 13140ENDIF 13150IF icon% = 4 AND current_para_func% > 1 THEN 13160 current_para_func% -=1 13170para_func_count_icon% = FNchange_text(window%,para_func_count_icon%,STR$(current_para_func%)) 13180ENDIF 13190IF icon% = 5 AND current_para_func% < 3 THEN 13200 current_para_func% +=1 13210para_func_count_icon% = FNchange_text(window%,para_func_count_icon%,STR$(current_para_func%)) 13220ENDIF 13230 para_funcx_icon%=FNupdate_parax_function( current_para_func%) 13240 para_funcy_icon%=FNupdate_paray_function( current_para_func%) 13250IF para_plot%(current_para_func%) THEN 13260 para_func_yes_icon%=FNchange_text(window%,para_func_yes_icon%,"YES") 13270ELSE 13280 para_func_yes_icon%=FNchange_text(window%,para_func_yes_icon%,"NO") 13290ENDIF 13300PROCset_graph_colour_icon(window%,current_para_func%) 13310!block% = window% 13320SYS "Wimp_ForceRedraw",window%,0,-300,900,0 13330ENDPROC 13340 13350DEF FNupdate_parax_function( item%) 13360!block% = window% 13370block%!4 = para_funcx_icon% 13380SYS "Wimp_GetIconState",,block% 13390SYS "Wimp_DeleteIcon",,block% 13400FOR below% = block% + 4 TO block% +35 STEP 4 13410 !below% = below%!4 13420NEXT 13430text% = block% + 24 13440validation% = block% + 28 13450buffer_length% = block% + 32 13460!text% = current_parax_func_text% 13470!validation% = -1 13480!buffer_length% = 200 13490$current_parax_func_text% = entered_parax_functions$(item%) 13500SYS "Wimp_CreateIcon",,block% TO icon% 13510=icon% 13520 13530DEF FNupdate_paray_function( item%) 13540!block% = window% 13550block%!4 = para_funcy_icon% 13560SYS "Wimp_GetIconState",,block% 13570SYS "Wimp_DeleteIcon",,block% 13580FOR below% = block% + 4 TO block% +35 STEP 4 13590 !below% = below%!4 13600NEXT 13610text% = block% + 24 13620validation% = block% + 28 13630buffer_length% = block% + 32 13640!text% = current_paray_func_text% 13650!validation% = -1 13660!buffer_length% = 200 13670$current_paray_func_text% = entered_paray_functions$(item%) 13680SYS "Wimp_CreateIcon",,block% TO icon% 13690=icon% 13700 13710 13720 13730DEF PROCextract_para_func 13740!block% = window% 13750block%!4 = para_funcx_icon% 13760SYS "Wimp_GetIconState",,block% 13770entered_parax_functions$(current_para_func%) = $(block%!28) 13780!block% = window% 13790block%!4 = para_funcy_icon% 13800SYS "Wimp_GetIconState",,block% 13810entered_paray_functions$(current_para_func%) = $(block%!28) 13820FOR graph% = 1 TO 3 13830 parax_functions$(graph%) = entered_parax_functions$(graph%) 13840 paray_functions$(graph%) = entered_paray_functions$(graph%) 13850NEXT 13860ENDPROC 13870 13880 13890 13900DEF PROCinitialise_para 13910entered_parax_functions$(1) = para_functions$(1) 13920entered_paray_functions$(1) = para_functions$(2) 13930entered_parax_functions$(2) = para_functions$(3) 13940entered_paray_functions$(2) = para_functions$(4) 13950entered_parax_functions$(3) = para_functions$(5) 13960entered_paray_functions$(3) = para_functions$(6) 13970FOR graph% = 1 TO 3 13980 parax_functions$(graph%) = entered_parax_functions$(graph%) 13990 paray_functions$(graph%) = entered_paray_functions$(graph%) 14000NEXT 14010ENDPROC 14020DEF PROCcalculate_para 14030LOCAL count%, count1% 14040PROCglass(TRUE) 14050count% = 0 14060FOR graph%= 1 TO 3 14070 IF para_plot%(graph%) THEN count% +=1 14080NEXT 14090count1%= count% 14100PROCextract_para_functions 14110PROCconvert_para_functions 14120PROCreturn_paraaxes_values 14130IF auto_y_paraaxes% THEN 14140 count% =count%*2 14150 count1%=count1%*2 14160 PROCret_para_range(minx,maxx,miny,maxy,mint,maxt) 14170ENDIF 14180increment = (maxt-mint)/1280 14190yfactor = 1024/(maxy - miny) 14200y_shift% = 512 +yfactor*(miny+maxy)/2 14210xfactor = 1024/(maxx - minx) 14220x_shift%=-640+xfactor*(minx+maxx)/2 14230FOR graph% = 1 TO 3 14240IF para_plot%(graph%) THEN 14250SYS"Hourglass_Percentage",100-(count1%/count%)*100 14260 count1% -=1 14270X% = graph%*2-2 14280Y% = graph%*2-1 14290xbase% = plot_values%+X%*1280*4 14300ybase% = plot_values%+Y%*1280*4 14310FOR T% = 0 TO 1280 14320 T= mint+increment*T% 14330 t=T 14340 ok% = TRUE 14350 LOCAL ERROR 14360 ON ERROR LOCAL ok% = FALSE 14370 IF ok% THEN 14380 ybase%!(T%*4) = yfactor*EVALpara_functions$(Y%+1)-y_shift% 14390 ELSE 14400 ybase%!(T%*4) = big% 14410 ENDIF 14420 RESTORE ERROR 14430 ok% = TRUE 14440 LOCAL ERROR 14450 ON ERROR LOCAL ok% = FALSE 14460 IF ok% THEN 14470 xbase%!(T%*4) = xfactor*EVALpara_functions$(X%+1)-x_shift% 14480 ELSE 14490 xbase%!(T%*4) = big% 14500 ENDIF 14510 RESTORE ERROR 14520NEXT 14530ENDIF 14540NEXT 14550PROCcalc_para_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) 14560PROCglass(FALSE) 14570SYS "Wimp_ForceRedraw",main%,0,-1280,1280,0 14580ENDPROC 14590DEF PROCreturn_paraaxes_values 14600entered_minx=VALFNread_icon_text(paraaxes%,para_min_x_icon%) 14610entered_maxx=VALFNread_icon_text(paraaxes%,para_max_x_icon%) 14620entered_miny=VALFNread_icon_text(paraaxes%,para_min_y_icon%) 14630entered_maxy=VALFNread_icon_text(paraaxes%,para_max_y_icon%) 14640mint=VALFNread_icon_text(paraaxes%,para_min_t_icon%) 14650maxt=VALFNread_icon_text(paraaxes%,para_max_t_icon%) 14660PROCadjust_axes(maxx,minx,maxy,miny) 14670ENDPROC 14680 14690 14700DEF PROCextract_para_functions 14710!block% = parametric% 14720block%!4 = para_funcx_icon% 14730SYS "Wimp_GetIconState",,block% 14740entered_parax_functions$(current_para_func%) = $(block%!28) 14750block%!4 = para_funcy_icon% 14760SYS "Wimp_GetIconState",,block% 14770entered_paray_functions$(current_para_func%) = $(block%!28) 14780FOR graph% = 1 TO 3 14790 para_functions$(graph%*2) = entered_paray_functions$(graph%) 14800 para_functions$(graph%*2-1) = entered_parax_functions$(graph%) 14810NEXT 14820ENDPROC 14830 14840 14850DEF PROCconvert_para_functions 14860FOR gra% = 1 TO 6 14870IF para_plot%((gra% + 1) DIV 2) THEN 14880 para_functions$(gra%)= FNupper(para_functions$(gra%)) 14890 PROCconvert(para_functions$(gra%),"T",para_functions$(gra%),error_no%) 14900 IF error_no% <> 0 THEN 14910 PROCreport_func_error(gra%,error_no%) 14920 para_plot%((gra%+1)DIV 2)=FALSE 14930 PROCupdateparametric(parametric%,9) 14940 ENDIF 14950 PROCext_func(para_functions$(gra%)) 14960ENDIF 14970NEXT 14980ENDPROC 14990 15000 15010 15020 15030DEFPROCret_para_range(RETURNminx,RETURNmaxx,RETURNminy,RETURNmaxy,mint,maxt) 15040increment = (maxt-mint)/1280 15050entered_maxy= -10E30 15060entered_miny= 10E30 15070entered_maxx= -10E30 15080entered_minx= 10E30 15090FOR graph% = 1 TO 3 15100X% = graph%*2-1 15110Y% = graph%*2 15120IF para_plot%(graph%) THEN 15130 SYS"Hourglass_Percentage",100-(count1%/count%)*100 15140FOR T% = 0 TO 1280 15150 T= mint+increment*T% 15160 t=T 15170 ok% = TRUE 15180 LOCAL ERROR 15190 ON ERROR LOCAL ok% = FALSE 15200 IF ok% THEN 15210 value = EVALpara_functions$(Y%) 15220 IF value < entered_miny THEN entered_miny = value 15230 IF value > entered_maxy THEN entered_maxy = value 15240 ENDIF 15250 RESTORE ERROR 15260 ok% = TRUE 15270 LOCAL ERROR 15280 ON ERROR LOCAL ok% = FALSE 15290 IF ok% THEN 15300 value = EVALpara_functions$(X%) 15310 IF value < entered_minx THEN entered_minx = value 15320 IF value > entered_maxx THEN entered_maxx = value 15330 ENDIF 15340 RESTORE ERROR 15350NEXT 15360 count1%-=1 15370ENDIF 15380NEXT 15390A%=@% 15400@%=&01000308 15410para_min_y_icon%=FNchange_text(paraaxes%,para_min_y_icon%,STR$(entered_miny)) 15420para_max_y_icon%=FNchange_text(paraaxes%,para_max_y_icon%,STR$(entered_maxy)) 15430para_min_x_icon%=FNchange_text(paraaxes%,para_min_x_icon%,STR$(entered_minx)) 15440para_max_x_icon%=FNchange_text(paraaxes%,para_max_x_icon%,STR$(entered_maxx)) 15450minx = entered_minx 15460maxx = entered_maxx 15470miny = entered_miny 15480maxy = entered_maxy 15490SYS "Wimp_ForceRedraw",paraaxes%,0,-1280,1280,0 15500@%=A% 15510PROCadjust_axes(maxx,minx,maxy,miny) 15520ENDPROC 15530 15540 15550DEF PROCcalc_para_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) 15560A%=@% 15570@%=&01000108 15580IF 0 >= miny AND 0 <= maxy THEN 15590 x_axes_level= 0 15600 x_axes_level% = 0 * yfactor-y_shift% 15610 ELSE 15620 x_axes_level= VAL(STR$((maxy+miny)))/2 15630 x_axes_level% = x_axes_level * yfactor-y_shift% 15640ENDIF 15650IF 0 >= minx AND 0 <= maxx THEN 15660 y_axes_level% = 1280/(maxx-minx)*(-minx) 15670 y_axes_level=0 15680 ELSE 15690 y_axes_level= VAL(STR$((maxx+minx)))/2 15700 y_axes_level% = 1280/(maxx-minx)*(y_axes_level-minx) 15710ENDIF 15720@%=A% 15730ENDPROC 15740 15750 15760 15770DEF PROCupdatepolaraxes(window%,icon%) 15780IF icon% = polar_axes_yes_icon% THEN 15790 auto_polar_axes%= NOT auto_polar_axes% 15800 IF auto_polar_axes% THEN 15810 polar_axes_yes_icon%=FNchange_text(window%,icon%,"YES") 15820 PROCdeselect(window%,polar_radius_icon%) 15830ELSE 15840 polar_axes_yes_icon%=FNchange_text(window%,icon%,"NO") 15850 PROCreselect(window%,polar_radius_icon%) 15860ENDIF 15870ENDIF 15880SYS "Wimp_ForceRedraw",window%,0,-300,800,0 15890ENDPROC 15900 15910 15920 15930 15940 15950DEF PROCcalculate_polar 15960LOCAL count%, count1% 15970window% = polar% 15980PROCglass(TRUE) 15990count% = 0 16000FOR graph%= 1 TO 3 16010 IF polar_plot%(graph%) THEN count% +=1 16020NEXT 16030count1%= count% 16040PROCextract_polar_functions 16050PROCconvert_polar_functions 16060PROCreturn_polaraxes_values 16070IF auto_polar_axes% THEN 16080 count% =count%*2 16090 count1%=count1%*2 16100 PROCreturn_radius 16110ENDIF 16120increment = (max_theta-min_theta)/1280 16130IF radius = 0 THEN radius = 1 16140yfactor = 512/radius 16150y_shift% = 512 16160x_shift% = 640 16170IF degrees% THEN 16180FOR graph% = 1 TO 3 16190x% = graph% *2 -2 16200y% = graph% *2 -1 16210xbase% = plot_values% + x% *4 * 1280 16220ybase% = plot_values% + y% *4 * 1280 16230IF polar_plot%(graph%) THEN 16240SYS"Hourglass_Percentage",100-(count1%/count%)*100 16250 count1% -=1 16260FOR angle% = 0 TO 1280 16270 T= min_theta+increment*angle% 16280 t=T 16290 ok% = TRUE 16300 LOCAL ERROR 16310 ON ERROR LOCAL ok% = FALSE 16320 IF ok% THEN 16330 result = EVALpolar_functions$(graph%) 16340 ELSE 16350 result = big% 16360 ENDIF 16370 RESTORE ERROR 16380 xbase%!(angle%*4) = yfactor*result*COSRAD(t)+ x_shift% 16390 ybase%!(angle%*4) = yfactor*result*SINRAD(t)- y_shift% 16400NEXT 16410ENDIF 16420NEXT 16430ELSE 16440FOR graph% = 1 TO 3 16450x% = graph% *2 -2 16460y% = graph% *2 -1 16470xbase% = plot_values% + x% *4 * 1280 16480ybase% = plot_values% + y% *4 * 1280 16490IF polar_plot%(graph%) THEN 16500SYS"Hourglass_Percentage",100-(count1%/count%)*100 16510 count1% -=1 16520FOR angle% = 0 TO 1280 16530 T= min_theta+increment*angle% 16540 t=T 16550 ok% = TRUE 16560 LOCAL ERROR 16570 ON ERROR LOCAL ok% = FALSE 16580 IF ok% THEN 16590 result = EVALpolar_functions$(graph%) 16600 ELSE 16610 result = big% 16620 ENDIF 16630 RESTORE ERROR 16640 xbase%!(angle%*4) = yfactor*result*COS(t)+ x_shift% 16650 ybase%!(angle%*4) = yfactor*result*SIN(t)- y_shift% 16660NEXT 16670ENDIF 16680NEXT 16690ENDIF 16700PROCglass(FALSE) 16710SYS "Wimp_ForceRedraw",main%,0,-1280,1280,0 16720ENDPROC 16730 16740 16750 16760 16770DEF PROCreturn_polaraxes_values 16780entered_min=VALFNread_icon_text(polaraxes%,polar_min_icon%) 16790entered_max=VALFNread_icon_text(polaraxes%,polar_max_icon%) 16800entered_rad=VALFNread_icon_text(polaraxes%,polar_radius_icon%) 16810min_theta = entered_min 16820max_theta = entered_max 16830radius = entered_rad*1.2 16840ENDPROC 16850 16860DEF PROCupdatepolar(window%,icon%) 16870PROCextract_polar_functions 16880 IF polar_plot%(current_polar_func%) THEN 16890 polar_func_yes_icon%=FNchange_text(window%,polar_func_yes_icon%,"YES") 16900ELSE 16910 polar_func_yes_icon%=FNchange_text(window%,polar_func_yes_icon%,"NO") 16920ENDIF 16930IF icon% = polar_func_yes_icon% THEN 16940 polar_plot%(current_polar_func%) = NOT polar_plot%(current_polar_func%) 16950 IF polar_plot%(current_polar_func%) THEN 16960 polar_func_yes_icon%=FNchange_text(window%,icon%,"YES") 16970ELSE 16980 polar_func_yes_icon%=FNchange_text(window%,icon%,"NO") 16990ENDIF 17000ENDIF 17010IF icon% = 4 AND current_polar_func% > 1 THEN 17020 current_polar_func% -=1 17030polar_func_count_icon% = FNchange_text(window%,polar_func_count_icon%,STR$(current_polar_func%)) 17040ENDIF 17050IF icon% = 5 AND current_polar_func% < 3 THEN 17060 current_polar_func% +=1 17070polar_func_count_icon% = FNchange_text(window%,polar_func_count_icon%,STR$(current_polar_func%)) 17080ENDIF 17090polar_func_icon%=FNupdate_polar_function( current_polar_func%) 17100IF polar_plot%(current_polar_func%) THEN 17110 polar_func_yes_icon%=FNchange_text(window%,polar_func_yes_icon%,"Yes") 17120ELSE 17130 polar_func_yes_icon%=FNchange_text(window%,polar_func_yes_icon%,"No") 17140ENDIF 17150PROCset_graph_colour_icon(window%,current_polar_func%) 17160!block% = window% 17170SYS "Wimp_ForceRedraw",window%,0,-300,900,0 17180ENDPROC 17190 17200 17210DEF FNupdate_polar_function( item%) 17220!block% = window% 17230block%!4 = polar_func_icon% 17240SYS "Wimp_GetIconState",,block% 17250SYS "Wimp_DeleteIcon",,block% 17260FOR below% = block% + 4 TO block% +35 STEP 4 17270 !below% = below%!4 17280NEXT 17290text% = block% + 24 17300validation% = block% + 28 17310buffer_length% = block% + 32 17320!text% = current_polar_func_text% 17330!validation% = -1 17340!buffer_length% = 100 17350$current_polar_func_text% = entered_polar_functions$(item%) 17360SYS "Wimp_CreateIcon",,block% TO icon% 17370=icon% 17380 17390 17400DEF PROCextract_polar_functions 17410!block% = window% 17420block%!4 = polar_func_icon% 17430SYS "Wimp_GetIconState",,block% 17440entered_polar_functions$(current_polar_func%) = $(block%!28) 17450FOR graph% = 1 TO 3 17460 polar_functions$(graph%) = entered_polar_functions$(graph%) 17470NEXT 17480ENDPROC 17490 17500 17510 17520 17530DEF PROCconvert_polar_functions 17540FOR gra% = 1 TO 3 17550IF polar_plot%(gra%) THEN 17560polar_functions$(gra%)= FNupper(polar_functions$(gra%)) 17570PROCconvert(polar_functions$(gra%),"T",polar_functions$(gra%),error_no%) 17580IF error_no% <> 0 THEN 17590 PROCreport_func_error(gra%,error_no%) 17600 polar_plot%(gra%)=FALSE 17610PROCupdatepolar(polar%,9) 17620ENDIF 17630PROCext_func(polar_functions$(gra%)) 17640ENDIF 17650NEXT 17660ENDPROC 17670 17680 17690DEF PROCcheck_polar_axes 17700IF NOT auto_polar_axes% THEN 17710PROCreturn_polaraxes_values 17720IF min_theta >= max_theta THEN 17730 SWAP min_theta, max_theta 17740 IF min_theta = max_theta THEN max_theta=max_theta+1 17750 PROCerror_message("Min angle must be less than Max angle. Values adjusted.") 17760 polar_min_icon% =FNchange_text(polaraxes%,polar_min_icon%,STR$(min_theta)) 17770 polar_max_icon% =FNchange_text(polaraxes%,polar_max_icon%,STR$(max_theta)) 17780 SYS "Wimp_ForceRedraw",polaraxes%,0,-1280,1280,0 17790ENDIF 17800ENDIF 17810ENDPROC 17820 17830 17840DEF PROCcheck_para_axes 17850IF NOT auto_y_paraaxes% THEN 17860PROCreturn_paraaxes_values 17870IF entered_maxx <= entered_minx THEN 17880 SWAP entered_minx,entered_maxx 17890 IF entered_minx=entered_maxx THEN entered_maxx=entered_maxx+1 17900para_max_x_icon%=FNchange_text(paraaxes%,para_max_x_icon%,STR$(entered_maxx)) 17910para_min_x_icon%=FNchange_text(paraaxes%,para_min_x_icon%,STR$(entered_minx)) 17920 SYS "Wimp_ForceRedraw",paraaxes%,0,-1280,1280,0 17930 PROCerror_message("X min must be less than X max. Values adjusted") 17940ENDIF 17950IF entered_maxy <= entered_miny THEN 17960 SWAP entered_miny,entered_maxy 17970 IF entered_miny=entered_maxy THEN entered_maxy=entered_maxy+1 17980para_max_y_icon%=FNchange_text(paraaxes%,para_max_y_icon%,STR$(entered_maxy)) 17990para_min_y_icon%=FNchange_text(paraaxes%,para_min_y_icon%,STR$(entered_miny)) 18000 SYS "Wimp_ForceRedraw",paraaxes%,0,-1280,1280,0 18010 PROCerror_message("Y min must be less than Y max. Values adjusted") 18020ENDIF 18030IF maxt <= mint THEN 18040 SWAP mint,maxt 18050 IF mint=maxt THEN maxt=maxt+1 18060 para_max_t_icon% =FNchange_text(paraaxes%,para_max_t_icon%,STR$(maxt)) 18070 para_min_t_icon% =FNchange_text(paraaxes%,para_min_t_icon%,STR$(mint)) 18080 SYS "Wimp_ForceRedraw",paraaxes%,0,-1280,1280,0 18090 PROCerror_message("t min must be less than t max. Values adjusted") 18100ENDIF 18110ENDIF 18120ENDPROC 18130 18140DEF PROCreturn_radius 18150max_radius=0 18160increment = (max_theta-min_theta)/1280 18170FOR graph% = 1 TO 3 18180IF polar_plot%(graph%) THEN 18190 SYS"Hourglass_Percentage",100-(count1%/count%)*100 18200FOR angle% = 0 TO 1280 18210 T= min_theta+increment*angle% 18220 t=T 18230 ok% = TRUE 18240 LOCAL ERROR 18250 ON ERROR LOCAL ok% = FALSE 18260 IF ok% THEN 18270 result = EVALpolar_functions$(graph%) 18280 ELSE 18290 result =0 18300 ENDIF 18310 RESTORE ERROR 18320 IF ABS(result) > max_radius THEN 18330 max_radius = ABS(result) 18340 ENDIF 18350NEXT 18360 count1%-=1 18370ENDIF 18380NEXT 18390radius=max_radius*1.2 18400A%=@% 18410@%=&01000308 18420entered_rad = max_radius 18430polar_radius_icon% =FNchange_text(polaraxes%,polar_radius_icon%,STR$(entered_rad)) 18440SYS "Wimp_ForceRedraw",polaraxes%,0,-1280,1280,0 18450@%=A% 18460ENDPROC 18470 18480 18490DEF PROCdraw_polar_axes 18500IF show_axes% THEN 18510SYS"Wimp_SetColour",1 18520CIRCLE 640*sf,-512*sf,106*sf 18530CIRCLE 640*sf,-512*sf,213*sf 18540CIRCLE 640*sf,-512*sf,320*sf 18550CIRCLE 640*sf,-512*sf,427*sf 18560MOVE 1067*sf,-512*sf 18570DRAW 220*sf,-512*sf 18580MOVE 640*sf,-85*sf 18590DRAW 640*sf,-939*sf 18600MOVE 942*sf,-210*sf 18610DRAW 338*sf,-814*sf 18620MOVE 338*sf,-210*sf 18630DRAW 942*sf,-814*sf 18640MOVE 1070*sf,-512*sf 18650A%=@% 18660@%=&01000308 18670PRINT STR$(entered_rad) 18680@%=A% 18690ENDIF 18700ENDPROC 18710 18720 18730DEF PROCassemble 18740FOR pass% = 0 TO 2 STEP 2 18750P%= code% 18760[ OPT pass% 18770MOV R12, R1 18780MOV R9, #0 18790MOV R11, R0 ; put table start into r11 18800.LOOP 18810MOV R4, #1280 18820MOV R0, #69 18830LDR R1, [R6] ; get the x value 18840CMP R1 , #0 ; is it out of range 18850BMI noplot 18860CMP R1, R4; is it out of range 18870BPL noplot 18880ADD R1, R11, R1, LSL #2; add table start to x value * 4 18890LDR R1,[R1] ; get value from table 18900LDR R8,graph_box% 18910CMP R1, R8 18920BMI noplot 18930LDR R8,graph_box%+4 18940CMP R1,R8; range check 18950BPL noplot 18960LDR R2, [R7] 18970RSB R2, R2, #0; make r2 positive 18980CMP R2, #0 ; is it out of range 18990BMI noplot 19000CMP R2, R4 ; is it out of range 19010BPL noplot 19020ADD R2,R11,R2, LSL#2 ; add table start to y value * 4 19030LDR R2,[R2] ; get value from table 19040RSB R2, R2, #0; make r2 negative 19050LDR R8, graph_box%+8 19060CMP R2,R8 19070BPL noplot 19080LDR R8, graph_box%+12 19090CMP R2, R8 19100BMI noplot 19110CMP R1, R9; is this point the same as the previous? 19120BNE doplot 19130CMP R2,R10 19140BEQ noplot; yes so dont plot it again 19150.doplot 19160SWI "OS_Plot" 19170MOV R9,R1 ; store last plotted point 19180MOV R10,R2 19190.noplot 19200ADD R6, R6, #4 19210ADD R7, R7, #4 19220SUB R5, R5, #4 19230CMP R5, #0 19240BGT LOOP 19250MOV R15,R14 19260 19270.cart_code% 19280MOV R9, #0 19290MOV R12, R1 19300MOV R11, R0 ; put table start into r11 19310MOV R10, #0 ; x coordinate 19320.cart_LOOP 19330MOV R4, #1280 19340MOV R0, #69 19350ADD R1,R11,R10, LSL#2 ; add table start to x value * 4 19360LDR R1,[R1] 19370LDR R8,graph_box% 19380CMP R1, R8; cf x with left 19390BMI cart_noplot 19400LDR R8,graph_box%+4 19410CMP R1,R8 ; cf x with right 19420BPL cart_noplot 19430LDR R2, [R7] ; r7 points to y value 19440RSB R2, R2, #0; make r2 positive 19450CMP R2, #0 ; is it out of range 19460BMI cart_noplot 19470CMP R2, R4 ; is it out of range 19480BPL cart_noplot 19490ADD R2,R11,R2, LSL#2 ;add table start to y value * 4 19500LDR R2,[R2] ;get value from table 19510RSB R2, R2, #0; make r2 negative 19520LDR R8, graph_box%+8 19530CMP R2,R8 19540BPL cart_noplot 19550LDR R8, graph_box%+12 19560CMP R2, R8 19570BMI cart_noplot 19580SWI "OS_Plot" 19590.cart_noplot 19600ADD R10, R10, R12 19610ADD R7, R7, R12, ASL #2 19620SUB R5, R5, R12, ASL #2 19630CMP R5, #0 19640BGT cart_LOOP 19650MOV R15,R14 19660 19670.scale ; R1 is B% the counter 19680 ; R2 is pointer to table 19690 ; R3 is the multiplier 19700 ; R0 is the result 19710MUL R0,R1,R3 ; multiply 19720MOV R0,R0, ASR #10 ; divide by 1024 19730STR R0,[R2] 19740ADD R1,R1,#1 19750ADD R2,R2,#4 19760CMP R1, #1280 19770BMI scale 19780MOV R15,R14 19790] 19800NEXT 19810ENDPROC 19820 19830DEF PROCx_plot(left%, right%, top%, bottom%, plot_parameter%) 19840graph_box%!0 =left% 19850graph_box%!4 =right% 19860graph_box%!8 =top% 19870graph_box%!12 =bottom% 19880FOR graph% = 1 TO 3 19890IF polar_plot%(graph%) THEN 19900 SYS"Wimp_SetColour",9+graph% 19910 y% =graph%*2-1 19920 x% =graph%*2-2 19930 F% = 5120 :REM register 5 counts down from 5120 to zero 19940 G% = plot_values% + 1280*x%*4 : REM register 6 data array for x axis 19950 H% = plot_values% + 1280*y%*4 : REM register 7 data array for y axis 19960 B% = pix_value% 19970 A% = table% : REM R0 gets address of table 19980 CALL code% 19990ENDIF 20000NEXT 20010ENDPROC 20020 20030DEF PROCx_plot1(left%, right%, top%, bottom%, plot_parameter%) 20040graph_box%!0 =left% 20050graph_box%!4 =right% 20060graph_box%!8 =top% 20070graph_box%!12 =bottom% 20080FOR graph% = 1 TO 3 20090IF para_plot%(graph%) THEN 20100 SYS"Wimp_SetColour",9+graph% 20110 y% =graph%*2-1 20120 x% =graph%*2-2 20130 F% = 5120 :REM register 5 counts down from 5120 to zero 20140 G% = plot_values% + 1280*x%*4 : REM register 6 data array for x axis 20150 H% = plot_values% + 1280*y%*4 : REM register 7 data array for y axis 20160 A% = table% : REM R0 gets address of table 20170 B% = pix_value% 20180 CALL code% 20190ENDIF 20200NEXT 20210ENDPROC 20220 20230 20240DEF PROCx_plot2(left%, right%, top%, bottom%, plot_parameter%) 20250graph_box%!0 =left% 20260graph_box%!4 =right% 20270graph_box%!8 =top% 20280graph_box%!12 =bottom% 20290FOR graph% = 1 TO 6 20300IF cart_plot%(graph%) THEN 20310 SYS"Wimp_SetColour",9+graph% 20320 y% =graph%-1 20330 F% = 5120 :REM register 5 counts down from right to left 20340 G% = left% : REM register 6 data array for x axis 20350 H% = plot_values% + 1280*y%*4 : REM register 7 data array for y axis 20360 A% = table% : REM R0 gets address of table 20370 B% = pix_value% 20380 CALL cart_code% 20390ENDIF 20400NEXT 20410ENDPROC 20420 20430DEF PROChelp 20440LOCAL t$,window%, icon%, terms$, ap$, warn$ 20450SYS "Wimp_GetPointerInfo",,help_block% 20460window% = help_block%!12 20470icon% = help_block%!16 20480warn$ = "|MIt can be entered in normal algebraic format" 20490warn$ = warn$+"|MIf you are unsure of evaluation order then " 20500warn$ = warn$+"use brackets|MUse ^ for powers" 20510CASE window% OF 20520WHEN main% : t$="This is the graph window.|MSelect to recalculate" 20530 IF cart_plot% t$=t$+"|MAdjust to select a zoom box" 20540WHEN cartesian% 20550 CASE icon% OF 20560 WHEN 4 : t$="Select for previous graph" 20570 WHEN 5 : t$="Select for next graph" 20580 WHEN cart_func_yes_icon% 20590 t$="Select to change.|MIndicates if gragh is plotted or not" 20600 WHEN cart_func_icon% : t$="The function to be plotted"+warn$ 20610 WHEN 9 :t$="This shows the colour of the current function" 20620 ENDCASE 20630WHEN cartaxes% 20640 ap$ = "|Mf1 for default values" 20650 CASE icon% OF 20660 WHEN cart_max_x_icon% 20670 t$= "The maximum X value.|MSelect to alter"+ap$ 20680 WHEN cart_min_x_icon% 20690 t$= "The minimum X value.|MSelect to alter"+ap$ 20700 20710 WHEN cart_max_y_icon% 20720 t$= "The maximum Y value.|MSelect to alter"+ap$ 20730 WHEN cart_min_y_icon% 20740 t$= "The minimum Y value.|MSelect to alter"+ap$ 20750 WHEN auto_y_cartaxes% 20760 t$= "Manual or Auto Y axes.|MSelect to alter" 20770 ENDCASE 20780WHEN info% 20790 t$="This displays information about the Graph application" 20800WHEN save1% 20810 t$="This window allows graph function|Mand axes to be saved " 20820 CASE icon% OF 20830 WHEN 2 : t$=t$+"|MFile name to save functions" 20840 WHEN 0 : t$=t$+"|MSelect to save using given filename" 20850 WHEN 3 : t$=t$+"|MSelect, hold and drag to a directory viwer to save" 20860 ENDCASE 20870WHEN save% 20880 t$="This window allows graph display|Mto be saved as a Draw file. " 20890 CASE icon% OF 20900 WHEN 2 : t$=t$+"|MFile name to save graph as Draw file" 20910 WHEN 0 : t$=t$+"|MSelect to save using given filename" 20920 WHEN 3 : t$=t$+"|MSelect, hold and drag to a directory viwer to save" 20930 ENDCASE 20940WHEN parametric% 20950 CASE icon% OF 20960 terms$="|in terms of t" 20970 WHEN 4 : t$="Select for previous graph" 20980 WHEN 5 : t$="Select for next graph" 20990 WHEN para_func_yes_icon% 21000 t$="Select to change.|MIndicates if gragh is plotted or not" 21010 WHEN para_funcx_icon%:t$="The X componant of the function"+terms$+warn$ 21020 WHEN para_funcy_icon%:t$="The Y componant of the function"+terms$+warn$ 21030 WHEN 9 :t$="This shows the colour of the current function" 21040 ENDCASE 21050WHEN paraaxes% 21060 CASE icon% OF 21070 WHEN para_max_x_icon% 21080 t$= "The maximum X value.|MSelect to alter" 21090 WHEN para_min_x_icon% 21100 t$= "The minimum X value.|MSelect to alter" 21110 WHEN para_min_t_icon% 21120 t$= "The minimum T value.|MSelect to alter" 21130 WHEN para_max_t_icon% 21140 t$= "The maximum T value.|MSelect to alter" 21150 WHEN para_max_y_icon% 21160 t$= "The maximum Y value.|MSelect to alter" 21170 WHEN para_min_y_icon% 21180 t$= "The minimum Y value.|MSelect to alter" 21190 WHEN auto_y_cartaxes% 21200 t$= "Manual or Auto Y axes.|MSelect to alter" 21210 ENDCASE 21220 21230WHEN polar% 21240 CASE icon% OF 21250 WHEN 4 : t$="Select for previous graph" 21260 WHEN 5 : t$="Select for next graph" 21270 WHEN polar_func_yes_icon% 21280 t$="Select to change.|MIndicates if gragh is plotted or not" 21290 WHEN polar_func_icon% : t$="The function to be plotted|Min terms of t" 21300 t$=t$+warn$ 21310 WHEN 9 :t$="This shows the colour of the current function" 21320 ENDCASE 21330WHEN polaraxes% 21340 CASE icon% OF 21350 WHEN polar_max_icon% 21360 t$= "The maximum angle value.|MSelect to alter" 21370 WHEN polar_min_icon% 21380 t$= "The minimum X value.|MSelect to alter" 21390 WHEN auto_polar_axes% 21400 t$= "Manual or Auto Radius calculation.|MSelect to alter" 21410 WHEN polar_radius_icon% 21420 t$= "The maximum radius to be displayed.|MSelect to alter" 21430 ENDCASE 21440 21450ENDCASE 21460IF t$<>"" THEN 21470 block%!12=block%!8 21480 block%!16=&503 21490 $(block%+20)=t$+CHR$0 21500 !block% = (25+LENt$)AND NOT 3 21510 SYS"Wimp_SendMessage",17,block%,block%!4 21520ENDIF 21530ENDPROC 21540 21550DEF PROCsave_to_disc(name$) 21560IF format$ ="data" THEN 21570file% =OPENOUT(name$) 21580FOR graph% = 1 TO 6 21590PRINT #file%, cart_plot%(graph%) 21600PRINT #file%, cart_functions$(graph%) 21610PRINT #file%, entered_cart_functions$(graph%) 21620PRINT #file%, entered_parax_functions$(graph%) 21630PRINT #file%, entered_paray_functions$(graph%) 21640PRINT #file%, para_functions$(graph%) 21650PRINT #file%, para_plot%(graph%) 21660NEXT 21670 21680FOR graph% = 1 TO 3 21690PRINT #file%, polar_plot%(graph%) 21700PRINT #file%, polar_functions$(graph%) 21710PRINT #file%, entered_polar_functions$(graph%) 21720PRINT #file%, parax_functions$(graph%) 21730PRINT #file%, paray_functions$(graph%) 21740NEXT 21750 21760PRINT #file%,cart_plot% 21770PRINT #file%,polar_plot% 21780PRINT #file%,para_plot% 21790PRINT #file%,main_menu_open 21800PRINT #file%,quit_menu_open 21810PRINT #file%,finished% 21820PRINT #file%,auto_y_cartaxes% 21830PRINT #file%,show_axes% 21840PRINT #file%,old_main_x_origin$ 21850PRINT #file%,old_main_y_origin$ 21860PRINT #file%,main_x_origin% 21870PRINT #file%,main_y_origin% 21880PRINT #file%,entered_maxx 21890PRINT #file%,entered_minx 21900PRINT #file%,entered_maxy 21910PRINT #file%,entered_miny 21920PRINT #file%,auto_y_paraaxes% 21930PRINT #file%,maxx,minx,maxy,miny 21940PRINT #file%,increment 21950PRINT #file%,yfactor 21960PRINT #file%,y_shift% 21970PRINT #file%,degrees% 21980PRINT #file%,zooming% 21990PRINT #file%,auto_polar_axes% 22000 22010PRINT #file%,FNread_icon_text(cartaxes%,cart_axes_yes_icon%) 22020PRINT #file%,FNread_icon_text(cartaxes%,cart_min_x_icon%) 22030PRINT #file%,FNread_icon_text(cartaxes%,cart_max_x_icon%) 22040PRINT #file%,FNread_icon_text(cartaxes%,cart_min_y_icon%) 22050PRINT #file%,FNread_icon_text(cartaxes%,cart_max_y_icon%) 22060 22070 22080PRINT #file%,FNread_icon_text(paraaxes%,para_axes_yes_icon%) 22090PRINT #file%,FNread_icon_text(paraaxes%,para_min_x_icon% ) 22100PRINT #file%,FNread_icon_text(paraaxes%,para_max_x_icon% ) 22110PRINT #file%,FNread_icon_text(paraaxes%,para_min_y_icon% ) 22120PRINT #file%,FNread_icon_text(paraaxes%,para_max_y_icon% ) 22130PRINT #file%,FNread_icon_text(paraaxes%,para_min_t_icon% ) 22140PRINT #file%,FNread_icon_text(paraaxes%,para_max_t_icon% ) 22150 22160 22170PRINT #file%,FNread_icon_text(polaraxes%,polar_radius_icon%) 22180PRINT #file%,FNread_icon_text(polaraxes%,polar_min_icon% ) 22190PRINT #file%,FNread_icon_text(polaraxes%,polar_max_icon%) 22200PRINT #file%,FNread_icon_text(polaraxes%,polar_axes_yes_icon%) 22210 22220CLOSE #file% 22230SYS"Wimp_CreateMenu",,-1 22240OSCLI("settype "+name$+" 777") 22250ELSE 22260 PROCdraw(name$) 22270ENDIF 22280ENDPROC 22290 22300 22310DEF PROCload_from_disc(file_name$) 22320file% = OPENIN(file_name$) 22330FOR graph% = 1 TO 6 22340INPUT #file%, cart_plot%(graph%) 22350INPUT #file%, cart_functions$(graph%) 22360INPUT #file%, entered_cart_functions$(graph%) 22370INPUT #file%, entered_parax_functions$(graph%) 22380INPUT #file%, entered_paray_functions$(graph%) 22390INPUT #file%, para_functions$(graph%) 22400INPUT #file%, para_plot%(graph%) 22410NEXT 22420 22430FOR graph% = 1 TO 3 22440INPUT #file%, polar_plot%(graph%) 22450INPUT #file%, polar_functions$(graph%) 22460INPUT #file%, entered_polar_functions$(graph%) 22470INPUT #file%, parax_functions$(graph%) 22480INPUT #file%, paray_functions$(graph%) 22490NEXT 22500INPUT #file%,cart_plot% 22510INPUT #file%,polar_plot% 22520INPUT #file%,para_plot% 22530INPUT #file%,main_menu_open 22540INPUT #file%,quit_menu_open 22550INPUT #file%,finished% 22560INPUT #file%,auto_y_cartaxes% 22570INPUT #file%,show_axes% 22580INPUT #file%,old_main_x_origin$ 22590INPUT #file%,old_main_y_origin$ 22600INPUT #file%,main_x_origin% 22610INPUT #file%,main_y_origin% 22620INPUT #file%,entered_maxx 22630INPUT #file%,entered_minx 22640INPUT #file%,entered_maxy 22650INPUT #file%,entered_miny 22660INPUT #file%,auto_y_paraaxes% 22670INPUT #file%,maxx,minx,maxy,miny 22680INPUT #file%,increment 22690INPUT #file%,yfactor 22700INPUT #file%,y_shift% 22710INPUT #file%,degrees% 22720INPUT #file%,zooming% 22730INPUT #file%,auto_polar_axes% 22740INPUT #file%, text$ 22750cart_axes_yes_icon%=FNchange_text(cartaxes%,cart_axes_yes_icon%,text$) 22760INPUT #file%, text$ 22770cart_min_x_icon%=FNchange_text(cartaxes%,cart_min_x_icon%,text$) 22780INPUT #file%, text$ 22790cart_max_x_icon=FNchange_text(cartaxes%,cart_max_x_icon%,text$) 22800INPUT #file%, text$ 22810cart_min_y_icon%=FNchange_text(cartaxes%,cart_min_y_icon%,text$) 22820INPUT #file%, text$ 22830cart_max_y_icon%=FNchange_text(cartaxes%,cart_max_y_icon%,text$) 22840 22850INPUT #file%, text$ 22860para_axes_yes_icon%=FNchange_text(paraaxes%,para_axes_yes_icon%,text$) 22870INPUT #file%, text$ 22880para_min_x_icon%=FNchange_text(paraaxes%,para_min_x_icon%,text$ ) 22890INPUT #file%, text$ 22900para_max_x_icon%=FNchange_text(paraaxes%,para_max_x_icon%,text$ ) 22910INPUT #file%, text$ 22920para_min_y_icon%=FNchange_text(paraaxes%,para_min_y_icon%,text$ ) 22930INPUT #file%, text$ 22940para_max_y_icon%=FNchange_text(paraaxes%,para_max_y_icon%,text$ ) 22950INPUT #file%, text$ 22960mint = VAL(text$) 22970para_min_t_icon%=FNchange_text(paraaxes%,para_min_t_icon%,text$ ) 22980maxt = VAL(text$) 22990INPUT #file%, text$ 23000para_max_t_icon%=FNchange_text(paraaxes%,para_max_t_icon%,text$ ) 23010INPUT #file%, text$ 23020polar_radius_icon%=FNchange_text(polaraxes%,polar_radius_icon%,text$) 23030INPUT #file%, text$ 23040polar_min_icon%=FNchange_text(polaraxes%,polar_min_icon%,text$ ) 23050INPUT #file%, text$ 23060polar_max_icon%=FNchange_text(polaraxes%,polar_max_icon%,text$) 23070INPUT #file%, text$ 23080polar_axes_yes_icon%=FNchange_text(polaraxes%,polar_axes_yes_icon%,text$) 23090CLOSE #file% 23100PROCinstall 23110ENDPROC 23120 23130 23140 23150 23160DEF PROCinstall 23170window%= cartesian% 23180cart_func_icon%= FNupdate_cart_function( 1) 23190IF cart_plot%(1) THEN 23200cart_func_yes_icon%=FNchange_text(cartesian%,cart_func_yes_icon%,"Yes") 23210ELSE 23220cart_func_yes_icon%=FNchange_text(cartesian%,cart_func_yes_icon%,"No") 23230ENDIF 23240window% = parametric% 23250para_funcx_icon%= FNupdate_parax_function( 1) 23260para_funcy_icon%= FNupdate_paray_function( 1) 23270IF para_plot%(1) THEN 23280para_func_yes_icon%=FNchange_text(parametric%,para_func_yes_icon%,"Yes") 23290ELSE 23300para_func_yes_icon%=FNchange_text(parametric%,para_func_yes_icon%,"NO") 23310ENDIF 23320window% = polar% 23330polar_func_icon%= FNupdate_polar_function( 1) 23340IF polar_plot%(1) THEN 23350polar_func_yes_icon%=FNchange_text(polar%,polar_func_yes_icon%,"Yes") 23360ELSE 23370polar_func_yes_icon%=FNchange_text(polar%,polar_func_yes_icon%,"NO") 23380ENDIF 23390current_cart_func% =1 23400current_para_func% =1 23410current_polar_func% = 1 23420IF degrees% THEN 23430 PROCtick(main_menu%,8) 23440ELSE 23450 PROCno_tick(main_menu%,8) 23460ENDIF 23470IF show_coordinates% THEN 23480 PROCtick(main_menu%,2) 23490ELSE 23500 PROCno_tick(main_menu%,2) 23510ENDIF 23520IF show_axes% THEN 23530 PROCtick(main_menu%,9) 23540ELSE 23550 PROCno_tick(main_menu%,9) 23560ENDIF 23570 23580 IF auto_y_cartaxes% THEN 23590 PROCdeselect(cartaxes%,cart_min_y_icon%) 23600 PROCdeselect(cartaxes%,cart_max_y_icon%) 23610ELSE 23620 PROCreselect(cartaxes%,cart_min_y_icon%) 23630 PROCreselect(cartaxes%,cart_max_y_icon%) 23640ENDIF 23650 23660 IF auto_y_paraaxes% THEN 23670 PROCdeselect(paraaxes%,para_min_y_icon%) 23680 PROCdeselect(paraaxes%,para_max_y_icon%) 23690 PROCdeselect(paraaxes%,para_min_x_icon%) 23700 PROCdeselect(paraaxes%,para_max_x_icon%) 23710ELSE 23720 PROCreselect(paraaxes%,para_min_y_icon%) 23730 PROCreselect(paraaxes%,para_max_y_icon%) 23740 PROCreselect(paraaxes%,para_min_x_icon%) 23750 PROCreselect(paraaxes%,para_max_x_icon%) 23760ENDIF 23770 23780 IF auto_polar_axes% THEN 23790 PROCdeselect(polaraxes%,polar_radius_icon%) 23800ELSE 23810 PROCreselect(polaraxes%,polar_radius_icon%) 23820ENDIF 23830 23840 23850IF cart_plot% THEN PROCselect_cartesian 23860IF polar_plot% THEN PROCselect_polar 23870IF para_plot% THEN 23880 window%=parametric% 23890 PROCextract_para_func 23900 PROCselect_parametric 23910ENDIF 23920 23930REM set colour of icon 23940PROCset_graph_colour_icon(cartesian%,1) 23950PROCset_graph_colour_icon(parametric%,1) 23960PROCset_graph_colour_icon(polar%,1) 23970 23980REM set function number 23990cart_func_count_icon%=FNchange_text(cartesian%,cart_func_count_icon%,"1") 24000para_func_count_icon%=FNchange_text(parametric%,para_func_count_icon%,"1") 24010polar_func_count_icon%=FNchange_text(polar%,polar_func_count_icon%,"1") 24020 24030REM set function 24040window%=cartesian% 24050cart_func_icon% =FNupdate_cart_function(1) 24060window%=polar% 24070polar_func_icon%= FNupdate_polar_function( 1) 24080window%=parametric% 24090para_funcx_icon%= FNupdate_parax_function( 1) 24100para_funcy_icon%= FNupdate_paray_function( 1) 24110 24120 24130REM update window 24140IF cart_plot% THEN wind% =cartesian% 24150IF para_plot% THEN wind% =parametric% 24160IF polar_plot% THEN wind% =polar% 24170SYS "Wimp_ForceRedraw",wind%,0,-300,900,0 24180window%=parametric% 24190PROCopen_window(main%) 24200IF polar_plot% THEN PROCselect_polar 24210ENDPROC 24220 24230DEF PROCget_environment 24240SYS "OS_GetEnv" TO c$ 24250p = INSTR(c$,"""",INSTR(c$,"""")+1) 24260c$=MID$(c$,p+1) 24270WHILE LEFT$(c$,1)=" " 24280 c$=MID$(c$,2) 24290ENDWHILE 24300IF c$<>"" THEN PROCload_from_disc(c$) 24310IF c$<>"" THEN $fi% = c$ 24320ENDPROC 24330 24340 24350DEF PROCfile_data 24360 save_open% = TRUE 24370 PROCopen_window(save%) 24380ENDPROC 24390 24400 24410DEF PROCload(name$) 24420ENDPROC 24430 24440DEF PROCcreate_menu 24450DIM menu_block% 300 24460DIM menu1_block% 100 24470$menu_block% ="Graph Menu" 24480?(menu_block%+12) = 7 24490?(menu_block%+13) = 2 24500?(menu_block%+14) = 7 24510?(menu_block%+15) = 0 24520!(menu_block%+16) = 196 24530!(menu_block%+20) = 44 24540!(menu_block%+24) = 0 24550!(menu_block%+4+(24+0)) =0 24560!(menu_block%+4+(24*1+4)) =save1% 24570!(menu_block%+4+(24*1+8)) = &7000021 24580$(menu_block%+4+(24*1+12)) ="Save Data" 24590!(menu_block%+4+(24*2+0)) =0 24600!(menu_block%+4+(24*2+4)) = save% 24610!(menu_block%+4+(24*2+8)) =&7000021 24620$(menu_block%+4+(24*2+12)) ="Save Graphs" 24630!(menu_block%+4+(24*3+0)) =0 24640!(menu_block%+4+(24*3+4)) =-1 24650!(menu_block%+4+(24*3+8)) = &7000021 24660$(menu_block%+4+(24*3+12)) ="Coordinates" 24670!(menu_block%+4+(24*4+0)) =0 24680!(menu_block%+4+(24*4+4)) =-1 24690!(menu_block%+4+(24*4+8)) =&7000021 24700$(menu_block%+4+(24*4+12)) ="Axes" 24710!(menu_block%+4+(24*5+0)) =2 24720!(menu_block%+4+(24*5+4)) =-1 24730!(menu_block%+4+(24*5+8)) =&7000021 24740$(menu_block%+4+(24*5+12)) ="Functions" 24750!(menu_block%+4+(24*6+0)) =0 24760!(menu_block%+4+(24*6+4)) = -1 24770!(menu_block%+4+(24*6+8)) =&7000021 24780$(menu_block%+4+(24*6+12)) ="Cartesian" 24790!(menu_block%+4+(24*7+0)) =0 24800!(menu_block%+4+(24*7+4)) = -1 24810!(menu_block%+4+(24*7+8)) =&7000021 24820$(menu_block%+4+(24*7+12)) ="Polar" 24830!(menu_block%+4+(24*8+0)) =2 24840!(menu_block%+4+(24*8+4)) = -1 24850!(menu_block%+4+(24*8+8)) =&7000021 24860$(menu_block%+4+(24*8+12)) ="Parametric" 24870!(menu_block%+4+(24*9+0)) =0 24880!(menu_block%+4+(24*9+4)) = -1 24890!(menu_block%+4+(24*9+8)) =&7000021 24900$(menu_block%+4+(24*9+12)) ="Degrees" 24910!(menu_block%+4+(24*10+0)) = &81 24920!(menu_block%+4+(24*10+4)) = -1 24930!(menu_block%+4+(24*10+8)) =&7000021 24940$(menu_block%+4+(24*10+12)) ="Show Axes" 24950main_menu% = menu_block% 24960$menu1_block% ="Quit Menu" 24970?(menu1_block%+12) = 7 24980?(menu1_block%+13) = 2 24990?(menu1_block%+14) = 7 25000?(menu1_block%+15) = 0 25010!(menu1_block%+16) = 196 25020!(menu1_block%+20) = 44 25030!(menu1_block%+24) = 0 25040!(menu1_block%+4+(24+0)) =0 25050!(menu1_block%+4+(24*1+4)) = -1 25060!(menu1_block%+4+(24*1+8)) = &7000021 25070$(menu1_block%+4+(24*1+12)) ="Quit" 25080!(menu1_block%+4+(24*2+0)) =&80 25090!(menu1_block%+4+(24*2+4)) = info% 25100!(menu1_block%+4+(24*2+8)) =&7000021 25110$(menu1_block%+4+(24*2+12)) ="Info" 25120quit_menu%=menu1_block% 25130ENDPROC 25140 25150DEF PROCdraw_click(window%) 25160!block% = window% 25170SYS"Wimp_GetWindowState",,block% 25180wex = block%!4-block%!20 25190wey = block%!16 - block%!24 25200block%!4 = picture% 25210SYS"Wimp_GetIconState",,block% 25220!block%= window% 25230block%!4 = 5 25240block%!8 = block%!8+wex 25250block%!12 = block%!12+wey 25260block%!16 = block%!16+wex 25270block%!20 = block%!20+wey 25280block%!24 = 0 25290block%!28 = 0 25300block%!32 = &7FFFFFFF 25310block%!36 = &7FFFFFFF 25320SYS"Wimp_DragBox",,block% 25330ENDPROC 25340 25350DEF FNread_filename_text(window%) 25360IF format$ = "data" THEN 25370 !help_block% = save1% 25380ELSE 25390 !help_block% = save% 25400ENDIF 25410help_block%!4 = 2 :REM the text icon 25420SYS "Wimp_GetIconState",,help_block% 25430IF format$ = "data" THEN 25440 fi%=help_block%!28 25450ELSE 25460 gi%=help_block%!28 25470ENDIF 25480 = $(help_block%+ 28) 25490 25500DEF FNleaf(path$) 25510WHILE INSTR(path$,".") 25520path$=MID$(path$,INSTR(path$,".")+1) 25530ENDWHILE 25540=path$ 25550 25560 25570DEF PROCsave 25580SYS"Wimp_GetPointerInfo",,block% 25590block%!20 = 64 25600block%!32 = 0 25610block%!36 = 1 25620block%!40 = block%!12 25630block%!44 = block%!16 25640block%!48 = !block% 25650block%!52 = block%!4 25660IF format$="data" THEN 25670 $(block%+64) = FNleaf($fi%) 25680 block%!56 = 568 25690 block%!60 = &777 25700ELSE 25710 $(block%+64) = FNleaf($gi%) 25720 block%!56 = &4000 25730 block%!60 = &AFF 25740ENDIF 25750REM Hmm 25760SYS"Wimp_SendMessage",17,block%+20,block%!12,block%!16 25770ENDPROC 25780 25790DEF PROCdatasave(b%) 25800PROCsave_to_disc(FNget_name(b%+44)) 25810IF format$="data" THEN 25820 $fi%= FNget_name(b%+44) 25830ELSE 25840 $gi%= FNget_name(b%+44) 25850ENDIF 25860 25870b%!12 = b%!8 25880b%!16 = 3 25890!b% = 64 25900SYS"Wimp_SendMessage",17,b%,b%!20,b%!24 25910saveref%=b%!8 25920ENDPROC 25930 25940 25950 25960DEF FNget_name(P%) 25970A$="" 25980WHILE ?P%<>0 AND ?P%<> 13 25990 A$ = A$+CHR$?P%:P%+=1 26000ENDWHILE 26010=A$ 26020 26030DEF PROCquicksave 26040IF format$="data" THEN 26050 file$=$fi% 26060ELSE 26070 file$=$gi% 26080ENDIF 26090IF INSTR(file$,".") THEN 26100PROCsave_to_disc(file$) 26110ELSE 26120 PROCerror_message("To Save, draw the icon to a directory viewer") 26130ENDIF 26140ENDPROC 26150 26160DEF PROCdataload(b%) 26170IF b%!40 = &777 THEN 26180 PROCackload(b%) 26190 PROCload_from_disc(FNget_name(b%+44)) 26200 $fi% = FNget_name(b%+44) 26210ENDIF 26220ENDPROC 26230 26240DEF PROCackload(b%) 26250b%=block% 26260b%!12=b%!8 26270b%!16=4 26280!b%=64 26290SYS"Wimp_SendMessage",17,b%,b%!4 26300ENDPROC 26310 26320 26330 26340 26350 26360 26370 26380 26390DEFPROCpush(P%) 26400IFstack%>=maxstack%:ERROR99,"MathGraph stack full" 26410stack%(stack%)=P% 26420stack%+=1 26430ENDPROC 26440 26450 26460 26470DEFPROCpull(RETURN P%) 26480IFstack%<=0:ERROR99,"MathGraph stack empty" 26490stack%-=1 26500P%=stack%(stack%) 26510ENDPROC 26520 26530 26540 26550DEFPROCstartobj(T%) 26560LOCALP% 26570P%=draw_p% 26580PROCpush(P%) 26590!P%=T% 26600P%!4=0 26610P%!8=0 26620P%!12=0 26630P%!16=0 26640P%!20=0 26650draw_p%+=24 26660ENDPROC 26670 26680 26690 26700DEFPROCendobj 26710LOCALP% 26720PROCpull(P%) 26730P%!4=draw_p%-P% 26740IFP%!8<draw_array%!24draw_array%!24=P%!8 26750IFP%!12<draw_array%!28draw_array%!28=P%!12 26760IFP%!16>draw_array%!32draw_array%!32=P%!16 26770IFP%!20>draw_array%!36draw_array%!36=P%!20 26780ENDPROC 26790 26800 26810 26820DEFPROCstartdraw 26830$draw_array%="Draw" 26840draw_array%!4=201 26850draw_array%!8=0 26860$(draw_array%+12)="!Graph " 26870draw_array%!24=0 26880draw_array%!28=0 26890draw_array%!32=230400 26900draw_array%!36=184320 26910dstt%=draw_array% 26920draw_p%=draw_array%+40 26930stack%=0 26940ENDPROC 26950 26960DEFPROCenddraw 26970IFstack%<>0 ERROR99,"The drawing has gone wrong" 26980dend%=draw_p%-4 26990ENDPROC 27000 27010DEFPROCstartgroup(T$) 27020PROCstartobj(6) 27030$draw_p%=LEFT$(T$+STRING$(12," "),12) 27040draw_p%+=12 27050ENDPROC 27060 27070DEFPROCendgroup 27080PROCendobj 27090ENDPROC 27100 27110 27120DEFPROCtextl(X%,Y%,H%,C%,A$) 27130PROCstartobj(1) 27140!draw_p%=C% 27150draw_p%!4=&FFFFFF00 27160draw_p%!8=0 27170draw_p%+=12 27180!draw_p%=H%DIV2 27190draw_p%!4=H% 27200draw_p%+=8 27210!draw_p%=X% 27220draw_p%!4=Y% 27230draw_p%+=8 27240H%=4-LENA$MOD4 27250$draw_p%=A$+STRING$(H%,CHR$0) 27260draw_p%+=LENA$+H% 27270PROCendobj 27280ENDPROC 27290 27300 27310 27320DEFPROCstartpath(X%,Y%,fillcol%,linecol%,linethick%) 27330PROCstartobj(2) 27340!draw_p%=fillcol% 27350draw_p%!4=linecol% 27360draw_p%+=8 27370!draw_p%=linethick% 27380draw_p%!4=2^6 27390draw_p%+=8 27400!draw_p%=2 27410draw_p%!4=X% 27420draw_p%!8=Y% 27430draw_p%+=12 27440ENDPROC 27450 27460DEFPROCdrawto(X%,Y%) 27470!draw_p%=8 27480draw_p%!4=X% 27490draw_p%!8=Y% 27500draw_p%+=12 27510ENDPROC 27520 27530 27540DEFPROCmoveto(X%,Y%) 27550!draw_p%=2 27560draw_p%!4=X% 27570draw_p%!8=Y% 27580draw_p%+=12 27590ENDPROC 27600 27610 27620DEFPROCendpath 27630!draw_p%=0 27640draw_p%+=4 27650PROCendobj 27660ENDPROC 27670 27680DEFPROCclosepath 27690!draw_p%=5 27700draw_p%+=4 27710PROCendpath 27720ENDPROC 27730PROCcs 27740ENDPROC 27750 27760DEFPROCbezier(X%,Y%,x1%,y1%,x2%,y2%) 27770!draw_p%=6:draw_p%!4=x1%:draw_p%!8=y1%:draw_p%+=12 27780!draw_p%=x2%:draw_p%!4=y2%:draw_p%+=8 27790!draw_p%=X%:draw_p%!4=Y%:draw_p%+=8 27800ENDPROC 27810 27820DEFPROCcircle(X%,Y%,R%,fillcol%,linecol%,linethick%) 27830LOCALf 27840f=SINRAD33.3333333 27850X%=X%*200+50000 27860Y%=Y%*200 27870R%=R%*200 27880PROCstartpath(X%,Y%+R%,fillcol%,linecol%,linethick%) 27890PROCbezier(X%-R%,Y%,X%-R%*f,Y%+R%,X%-R%,Y%+R%*f) 27900PROCbezier(X%,Y%-R%,X%-R%,Y%-R%*f,X%-R%*f,Y%-R%) 27910PROCbezier(X%+R%,Y%,X%+R%*f,Y%-R%,X%+R%,Y%-R%*f) 27920PROCbezier(X%,Y%+R%,X%+R%,Y%+R%*f,X%+R%*f,Y%+R%) 27930PROCclosepath 27940ENDPROC 27950 27960 27970 27980 27990DEFPROCsave_draw(name$) 28000LOCALT% 28010OSCLI"Save "+name$+" "+STR$~draw_array%+" "+STR$~(dend%+4) 28020OSCLI"Settype "+name$+" AFF" 28030ENDPROC 28040 28050 28060 28070 28080DEFFNzts(T%) 28090LOCALT$ 28100WHILE?T%<>0 28110T$+=CHR$?T% 28120T%+=1 28130ENDWHILE 28140=T$ 28150 28160 28170 28180 28190 28200 28210DEF PROCdraw(name$) 28220PROCglass(TRUE) 28230draw_p%=draw_array% 28240PROCstartdraw 28250PROCstartgroup("line") 28260IF cart_plot% PROCdraw_cart 28270IF para_plot% PROCdraw_parametric 28280IF polar_plot% PROCdraw_polar 28290PROCendgroup 28300PROCenddraw 28310PROCsave_draw(name$) 28320PROCglass(FALSE) 28330ENDPROC 28340 28350 28360 28370DEF PROCdraw_cart 28380PROCdraw_cart_axes_draw 28390FOR graph% = 1 TO 6 28400 base% = plot_values% +(graph% -1)*1280*4 28410 IF cart_plot%(graph%) THEN 28420 X%=0 28430 PROCstartpath(0,-1000+0,-1,FNcolour(graph%),1) 28440 move% = TRUE 28450 REM PROCpoint_move(0,0) 28460 FOR X% = 0 TO 1276 STEP 4 28470 y% =base%!(X%*4) 28480 IF move% THEN 28490 PROCpoint_move(X%,y%+1000) 28500 ELSE 28510 PROCpoint_plot(X%,y%+1000) 28520 ENDIF 28530 NEXT 28540 PROCendpath 28550 ENDIF 28560NEXT 28570ENDPROC 28580 28590DEF PROCdraw_cart_axes_draw 28600LOCAL tx%,ty%,t$ 28610move%=FALSE 28620IF show_axes% THEN 28630 PROCstartpath(0,2512,-1,&FF,1) 28640 PROCpoint_move(0,x_axes_level%+1000) 28650 PROCpoint_plot(1280,x_axes_level%+1000) 28660 PROCpoint_move(y_axes_level%,0+1000) 28670 PROCpoint_plot(y_axes_level%,-1050+1000) 28680 PROCpoint_move( 104,x_axes_level%-20+1000) 28690 PROCpoint_plot( 104,x_axes_level%+20+1000) 28700 PROCpoint_move( 1174,x_axes_level%-20+1000) 28710 PROCpoint_plot( 1174,x_axes_level%+20+1000) 28720 PROCpoint_move( y_axes_level%-20,-84+1000) 28730 PROCpoint_plot( y_axes_level%+20,-84+1000) 28740 PROCpoint_move( y_axes_level%-20,-938+1000) 28750 PROCpoint_plot( y_axes_level%+20,-938+1000) 28760 PROCendpath 28770 tx%=1100*200+50000 28780 ty%=(x_axes_level%-20+1000)*200 28790 t$="y="+STR$(x_axes_level) 28800 PROCtextl(tx%,ty%,8000,&FF,t$) 28810 tx% = (y_axes_level%+10)*200+50000 28820 ty%=(-50+1000)*200 28830 t$="x="+STR$(y_axes_level) 28840 PROCtextl(tx%,ty%,8000,&FF,t$) 28850ENDIF 28860ENDPROC 28870 28880 28890DEF PROCdraw_parametric 28900PROCdraw_para_axes_draw 28910FOR graph% = 1 TO 3 28920 X% = graph%*2-2 28930 Y% = graph%*2-1 28940 xbase% = plot_values%+X%*1280*4 28950 ybase% = plot_values%+Y%*1280*4 28960 IF para_plot%(graph%) THEN 28970 X%=0 28980 PROCstartpath(0,-1000+0,-1,FNcolour(graph%),1) 28990 move% = TRUE 29000 FOR T% = 0 TO 1276 STEP 2 29010 y% =ybase%!(T%*4) 29020 x% =xbase%!(T%*4) 29030 IF move% THEN 29040 PROCpoint_move(x%,y%+1000) 29050 ELSE 29060 PROCpoint_plot(x%,y%+1000) 29070 ENDIF 29080 NEXT 29090 PROCendpath 29100 ENDIF 29110NEXT 29120ENDPROC 29130 29140DEF PROCdraw_para_axes_draw 29150LOCAL tx%,ty%,t$ 29160move%=FALSE 29170IF show_axes% THEN 29180 PROCstartpath(0,2512,-1,&FF,1) 29190 PROCpoint_move(0,x_axes_level%+1000) 29200 PROCpoint_plot(1280,x_axes_level%+1000) 29210 PROCpoint_move(y_axes_level%,0+1000) 29220 PROCpoint_plot(y_axes_level%,-1050+1000) 29230 PROCpoint_move( 210,x_axes_level%-20+1000) 29240 PROCpoint_plot( 210,x_axes_level%+20+1000) 29250 PROCpoint_move( 1068,x_axes_level%-20+1000) 29260 PROCpoint_plot( 1068,x_axes_level%+20+1000) 29270 PROCpoint_move( y_axes_level%-20,-84+1000) 29280 PROCpoint_plot( y_axes_level%+20,-84+1000) 29290 PROCpoint_move( y_axes_level%-20,-938+1000) 29300 PROCpoint_plot( y_axes_level%+20,-938+1000) 29310 PROCendpath 29320 tx%=1100*200+50000 29330 ty%=(x_axes_level%-20+1000)*200 29340 t$="y="+STR$(x_axes_level) 29350 PROCtextl(tx%,ty%,8000,&FF,t$) 29360 tx% = (y_axes_level%+10)*200+50000 29370 ty%=(-50+1000)*200 29380 t$="x="+STR$(y_axes_level) 29390 PROCtextl(tx%,ty%,8000,&FF,t$) 29400ENDIF 29410ENDPROC 29420 29430 29440DEF PROCdraw_polar 29450PROCdraw_polar_axes_draw 29460FOR graph% = 1 TO 3 29470 X% = graph%*2-2 29480 Y% = graph%*2-1 29490 xbase% = plot_values%+X%*1280*4 29500 ybase% = plot_values%+Y%*1280*4 29510 IF polar_plot%(graph%) THEN 29520 X%=0 29530 PROCstartpath(0,-1000+0,-1,FNcolour(graph%),1) 29540 move% = TRUE 29550 FOR T% = 0 TO 1276 STEP 2 29560 y% =ybase%!(T%*4) 29570 x% =xbase%!(T%*4) 29580 IF move% THEN 29590 PROCpoint_move(x%,y%+1000) 29600 ELSE 29610 PROCpoint_plot(x%,y%+1000) 29620 ENDIF 29630 NEXT 29640 PROCendpath 29650 ENDIF 29660NEXT 29670ENDPROC 29680 29690 29700 29710DEF PROCdraw_polar_axes_draw 29720LOCAL tx%,ty%,t$ 29730move%=FALSE 29740IF show_axes% THEN 29750 29760 PROCcircle(640,-512+1024,106,-1,&DDDDDD,1) 29770 PROCcircle(640,-512+1024,213,-1,&DDDDDD,1) 29780 PROCcircle(640,-512+1024,320,-1,&DDDDDD,1) 29790 PROCcircle(640,-512+1024,427,-1,&DDDDDD,1) 29800 PROCstartpath(0,2512,-1,&DDDDDD,1) 29810 PROCpoint_move(1067,-512+1000) 29820 PROCpoint_plot(220,-512+1000) 29830 PROCpoint_move(640,-85+1000) 29840 PROCpoint_plot(640,-939+1000) 29850 PROCpoint_move(942,-210+1000) 29860 PROCpoint_plot(338,-814+1000) 29870 PROCpoint_move(338,-210+1000) 29880 PROCpoint_plot(942,-814+1000) 29890 PROCendpath 29900 tx% = (1070)*200+50000 29910 ty%=(-512+1000)*200 29920 A%=@% 29930 @%=&01000308 29940 t$=STR$(entered_rad) 29950 PROCtextl(tx%,ty%,8000,&FF,t$) 29960 @%=A% 29970ENDIF 29980ENDPROC 29990 30000DEF FNcolour(value%) 30010CASE value% OF 30020 WHEN 1 : =&CC00 30030 WHEN 2 : =&DD0000 30040 WHEN 3 : =&EEEEBB 30050 WHEN 4 : =&558800 30060 WHEN 5 : =&FFBB00 30070 WHEN 6 : =&00BBFF 30080ENDCASE 30090END 30100 30110DEF PROCpoint_move(x%,y%) 30120IF x% >=0 AND x% <= 1280 AND y% >= -200 AND y% <= 1200 THEN 30130 PROCmoveto(50000+x%*200,5000+y%*200) 30140 move% = FALSE 30150ENDIF 30160ENDPROC 30170 30180DEF PROCpoint_plot(x%,y%) 30190 move% = FALSE 30200 IF y% > -150 AND y% < 1100 AND x% >=0 AND x% <= 1280 THEN 30210 PROCdrawto(50000+x%*200,5000+y%*200) 30220 ELSE 30230 move% = TRUE 30240 ENDIF 30250ENDPROC 30260 30270 30280 30290DEF PROCescape_pressed 30300ENDPROC 30310 30320DEF PROCmemory 30330q%=parameter% 30340REM IFq%!12<>saveref%:ENDPROC 30350PROCglass(TRUE) 30360draw_p%=draw_array% 30370PROCstartdraw 30380PROCstartgroup("line") 30390IF cart_plot% PROCdraw_cart 30400IF para_plot% PROCdraw_parametric 30410IF polar_plot% PROCdraw_polar 30420PROCendgroup 30430PROCenddraw 30440PROCglass(FALSE) 30450ENDPROC 30460IFdend%-draw_array%+1<q%!24 THEN 30470 q%!24=dend%-draw_array%%+4 30480ENDIF 30490VDU7 30500SYS"Wimp_TransferBlock",task%,draw_array%,new_task%,q%!20,q%!24 30510!q%=28 30520q%!16=7 30530q%!12=ref% 30540draw_array%+=q%!24 : REM is this needed 30550SYS"Wimp_SendMessage",17,q%,task% 30560saveref%=q%!8 30570ENDPROC 30580: 30590: 30600: 30610DEF PROCconvert(input$,var$,RETURN output$, RETURN error_no%) 30620LOCAL error%, eval_sp%, old_var$, en% 30630error_no% =0 30640eval_sp% = 0 30650old_var$ = var$ 30660var$ = "@" 30670PROCstrip_space(input$) 30680IF LEN(input$) = 0 THEN 30690 error_no% = 5 30700ELSE 30710 PROCbracketfix(input$) 30720 PROCanalyse1(old_var$,input$,error%,en%) 30730 IF error% THEN 30740 error_no%=en% 30750 ELSE 30760 PROCunary(input$,var$) 30770 PROCvariable(input$,var$) 30780 PROCnumber(input$,var$) 30790 PROCanalyse(var$,input$,error%,en%) 30800 IF error% THEN 30810 error_no%=1 30820 ELSE 30830 PROCbuild(error_no%) 30840 IF error_no% = 0 THEN 30850 PROCresult(output$,error%) 30860 IF error% THEN error_no% = 4 30870 ENDIF 30880 ENDIF 30890 ENDIF 30900 PROCback(output$,old_var$) 30910ENDIF 30920IF error_no% <>0 THEN output$="" 30930ENDPROC 30940: 30950: 30960DEF PROCvariable(RETURN line$,v$) 30970LOCAL c$,pointer%,new$,op$ 30980op$="+-*/^)" 30990new$ = "" 31000IF LEN line$ > 1 THEN 31010FOR pointer% = 1 TO LEN (line$)-1 31020 c$ = MID$(line$, pointer%,1) 31030 new$=new$+c$ 31040 IF c$= v$ AND INSTR(op$,MID$(line$,pointer%+1,1)) = 0 THEN 31050 new$=new$+"*" 31060 ENDIF 31070 IF c$= ")" AND MID$(line$,pointer%+1,1) ="(" THEN 31080 new$=new$+"*" 31090 ENDIF 31100NEXT 31110new$=new$+RIGHT$(line$,1) 31120ELSE 31130 new$ = line$ 31140ENDIF 31150line$=new$ 31160ENDPROC 31170: 31180: 31190DEF PROCnumber(RETURN line$,var$) 31200LOCAL c$,pointer%,new$,op$,num$ 31210op$="+-*/^)" 31220num$="0123456789." 31230new$ = "" 31240IF LEN line$ > 1 THEN 31250FOR pointer% = 1 TO LEN (line$)-1 31260 number%=FALSE 31270 next_not_no_op% = FALSE 31280 c$ = MID$(line$, pointer%,1) 31290 n$ = MID$(line$, pointer%+1,1) 31300 new$=new$+c$ 31310 IF INSTR(num$,c$) > 0 THEN number% = TRUE 31320 IF INSTR(op$+num$,n$) = 0 THEN next_not_no_op% = TRUE 31330 IF number% AND next_not_no_op% THEN 31340 IF n$=var$ THEN new$=new$+"#" ELSE new$=new$+"*" 31350 ENDIF 31360NEXT 31370new$=new$+RIGHT$(line$,1) 31380ELSE 31390 new$ = line$ 31400ENDIF 31410line$=new$ 31420ENDPROC 31430: 31440: 31450: 31460: 31470: 31480: 31490DEF PROCunary( RETURN line$, var$) 31500LOCAL c$, pointer%, new$, num$,p$,char$ 31510num$ = "0123456789.()"+var$ 31520new$="" 31530FOR pointer% = 1 TO LEN line$ 31540 c$ = MID$(line$, pointer%,1) 31550 p$ = MID$(line$, pointer%-1,1) 31560 char$ = c$ 31570 IF pointer% =1 AND c$="-" THEN 31580 char$ = "~" 31590 ELSE 31600 IF c$ = "-" AND INSTR(num$,p$) = 0 THEN char$ = "~" 31610 ENDIF 31620 IF c$ = "+" AND INSTR(num$,p$) = 0 THEN char$ = "" 31630 new$ = new$ + char$ 31640NEXT 31650line$ = new$ 31660ENDPROC 31670: 31680: 31690: 31700DEF PROCanalyse(var$,function$,RETURN error%,RETURN en%) 31710LOCAL term$,prec% 31720en% =1 31730error% = FALSE 31740PROCinit_stack 31750PROCinit_add 31760WHILE LEN function$ >0 AND NOT error% 31770 PROClexical(var$,function$,term$, prec%, error%,en%) 31780 PROCadd_to_rpn(term$,prec%) 31790ENDWHILE 31800PROCflush_rpn 31810ENDPROC 31820: 31830: 31840: 31850DEF PROCanalyse1(var$,RETURN function$,RETURN error%,RETURN en%) 31860LOCAL term$,prec% 31870en% =1 31880error% = FALSE 31890rpn$="" 31900PROCinit_stack 31910PROCinit_add 31920WHILE LEN function$ >0 AND NOT error% 31930 PROClexical(var$,function$,term$, prec%, err%,en%) 31940 IF term$ = var$ THEN term$="@" 31950 rpn$=rpn$+term$ 31960 IF err% THEN error% = TRUE 31970ENDWHILE 31980function$ = rpn$ 31990ENDPROC 32000: 32010: 32020: 32030DEF PROClexical(var$, RETURN line$, RETURN term$,RETURN prec%,RETURN error%,RETURN en%) 32040LOCAL num$,length%,remainder$,c%,operator% 32050error% = FALSE 32060num$ = "0123456789." 32070length% = LEN( line$) 32080remainder$="" 32090IF INSTR(num$,LEFT$(line$, 1)) > 0 THEN 32100 c% = 0 32110 REPEAT 32120 c%+=1 32130 UNTIL c% = length% OR INSTR(num$,MID$(line$,c%+1,1)) =0 32140 prec% = -1 32150 term$ = LEFT$(line$, c%) 32160 error% = NOT FNvalid_no(term$) 32170 IF error% THEN en% = 7 32180 remainder$ = RIGHT$(line$, length% -c%) 32190ELSE 32200 c% = 0 32210 operator% = FALSE 32220 REPEAT 32230 c%+=1 32240 IF LEFT$(line$, LEN(word$(c%))) = word$(c%) THEN operator% = TRUE 32250 UNTIL operator% OR word$(c%)="END" 32260 IF operator% THEN 32270 prec% = prec%(c%) 32280 term$ = word$(c%) 32290 remainder$ = RIGHT$(line$,length%-LEN(term$)) 32300 ELSE 32310 IF LEFT$(line$,LEN(var$))=var$ THEN 32320 prec% = -1 32330 remainder$ = RIGHT$(line$,length%-LEN(var$)) 32340 term$ = var$ 32350 ELSE 32360 error%= TRUE 32370 en% = 1 32380 ENDIF 32390 ENDIF 32400ENDIF 32410line$ = remainder$ 32420ENDPROC 32430: 32440: 32450: 32460: 32470DEF PROCset_vocab 32480LOCAL c%, 32490DIM word$(40), prec%(40) 32500RESTORE 32510c%=0 32520REPEAT 32530 c%+=1 32540 READ word$(c%), prec%(c%) 32550UNTIL word$(c%) ="END" 32560DATA "+",1 32570DATA "-",2 32580DATA "*",3 32590DATA "/",4 32600DATA "~",6 32610DATA "#",6 32620DATA "^",7 32630DATA "SIN",5 32640DATA "TAN",5 32650DATA "COS",5 32660DATA "ASN",5 32670DATA "ATN",5 32680DATA "ACS",5 32690DATA "ABS",5 32700DATA "INT",5 32710DATA "DEG",5 32720DATA "RAD",5 32730DATA "SINH",5 32740DATA "COSH",5 32750DATA "TANH",5 32760DATA "FACT",5 32770DATA "INVTANH",5 32780DATA "INVSINH",5 32790DATA "INVCOSH",5 32800DATA "LOG",5 32810DATA "LN",5 32820DATA "EXP",5 32830DATA "(",0 32840DATA ")",0 32850DATA "PI",-1 32860DATA "END",8 32870ENDPROC 32880: 32890: 32900: 32910DEF PROCstrip_space( RETURN line$) 32920LOCAL c$,pointer%,new$ 32930new$ ="" 32940FOR pointer% = 1 TO LEN line$ 32950 c$ = MID$(line$, pointer%,1) 32960 IF c$ <>" " THEN new$ = new$+c$ 32970NEXT 32980line$ = new$ 32990ENDPROC 33000: 33010: 33020: 33030DEF PROCset_stacks 33040DIM rpn$(100),rpn%(100), add$(100), add%(100) 33050rpn_sp% = 0 33060eval_sp% = 0 33070ENDPROC 33080: 33090: 33100DEF PROCinit_stack 33110rpn_sp% = 0 33120ENDPROC 33130: 33140DEF PROCpush_m(string$,prec%) 33150rpn$(rpn_sp%) = string$ 33160rpn%(rpn_sp%) = prec% 33170rpn_sp%+=1 33180ENDPROC 33190: 33200: 33210DEF PROCpull_m(RETURN string$, RETURN prec%, RETURN error%) 33220IF rpn_sp% = 0 THEN 33230 error% = TRUE 33240ELSE 33250 error% = FALSE 33260 rpn_sp%-=1 33270 string$ = rpn$(rpn_sp%) 33280 prec% = rpn%(rpn_sp%) 33290ENDIF 33300ENDPROC 33310: 33320: 33330: 33340: 33350: 33360DEF PROCevaluate(term$,prec%, RETURN error_no%) 33370LOCAL result$,operand1$,operand2$,an_error 33380an_error = FALSE 33390error_no% = 0 33400CASE prec% OF 33410 WHEN -1 : PROCpush_m(term$,prec%) 33420 WHEN 1,2,3,4,6,7 33430 IF term$="~" THEN 33440 PROCpull_m(operand1$,prec%,error) 33450 IF error THEN an_error = TRUE 33460 result$="("+term$+"("+operand1$+")"+")" 33470 PROCpush_m(result$,prec%) 33480 ELSE 33490 PROCpull_m(operand1$,prec%, error) 33500 IF error THEN an_error = TRUE 33510 PROCpull_m(operand2$,prec%, error) 33520 IF error THEN an_error = TRUE 33530 result$="("+operand2$+term$+operand1$+")" 33540 PROCpush_m(result$,prec%) 33550 ENDIF 33560 WHEN 5 : PROCpull_m(operand1$,prec%,error) 33570 IF error THEN an_error = TRUE 33580 result$="("+term$+"("+operand1$+")"+")" 33590 PROCpush_m(result$,prec%) 33600 OTHERWISE : error_no% = 2 33610ENDCASE 33620IF an_error THEN error_no% = 3 33630ENDPROC 33640: 33650: 33660DEF PROCresult(RETURN function$,RETURN error%) 33670LOCAL error,operand1$ 33680error%= FALSE 33690PROCpull_m(operand1$,prec%,error) 33700IF error THEN 33710 error%=TRUE 33720ELSE 33730 function$ = operand1$ 33740ENDIF 33750ENDPROC 33760: 33770: 33780DEF PROCadd_to_rpn(term$,prec%) 33790LOCAL operator$,op_prec%, error%,op_prec%,np% 33800IF prec% = -1 THEN 33810 PROCadd(term$,prec%) 33820ELSE 33830 IF term$=")" THEN 33840 REPEAT 33850 PROCpull_m(operator$,op_prec%, error%) 33860 IF operator$<>"(" THEN PROCadd(operator$,op_prec%) 33870 UNTIL operator$="(" OR error% 33880 ELSE 33890 IF FNnext_rpn_precedence= 8 OR term$ = "(" THEN 33900 PROCpush_m(term$,prec%) 33910 ELSE 33920 IF FNnext_rpn_precedence <= prec% THEN 33930 PROCpush_m(term$,prec%) 33940 ELSE 33950 REPEAT 33960 PROCpull_m(operator$,op_prec%, error%) 33970 PROCadd(operator$,op_prec%) 33980 np% = FNnext_rpn_precedence 33990 UNTIL np% <= prec% OR np% =0 OR np% = 8 OR error% 34000 PROCpush_m(term$,prec%) 34010 ENDIF 34020 ENDIF 34030 ENDIF 34040ENDIF 34050ENDPROC 34060: 34070: 34080DEF PROCflush_rpn 34090LOCAL operator$,op_prec%, error% 34100WHILE FNnext_rpn_precedence <> 8 34110 PROCpull_m(operator$,op_prec%, error%) 34120 PROCadd(operator$,op_prec%) 34130ENDWHILE 34140ENDPROC 34150: 34160: 34170: 34180DEF FNnext_rpn_precedence 34190IF rpn_sp% = 0 THEN 34200 =8 34210ELSE 34220 = rpn%(rpn_sp%-1) 34230ENDIF 34240: 34250: 34260DEF PROCinit_add 34270pointer%=0 34280ENDPROC 34290: 34300: 34310DEF PROCadd(string$,prec%) 34320 add$(pointer%) = string$ 34330 add%(pointer%) = prec% 34340 pointer%+=1 34350ENDPROC 34360: 34370: 34380DEF PROCbuild(RETURN error%) 34390LOCAL local_error% 34400error% = 0 34410rpn_sp% =0 34420FOR a% = 0 TO pointer% -1 34430 PROCevaluate(add$(a%),add%(a%),local_error%) 34440 IF local_error% > 0 THEN error% = local_error% 34450NEXT 34460ENDPROC 34470: 34480: 34490: 34500: 34510: 34520DEF FNvalid_no(number$) 34530LOCAL c%, points 34540ok = TRUE 34550IF number$="." THEN ok=FALSE 34560 points=0 34570 FOR c% = 1 TO LENnumber$ 34580 IF MID$(number$,c%,1) = "." THEN points+=1 34590 NEXT 34600 IF points>1 THEN ok=FALSE 34610ENDIF 34620=ok 34630: 34640: 34650DEF PROCback(RETURN term$, var$) 34660LOCAL news$,i%,char$ 34670new$="" 34680FOR i% = 1 TO LENterm$ 34690 char$ = MID$(term$,i%,1) 34700 IF char$ = "@" THEN char$=var$ 34710 IF char$ = "#" THEN char$ = "*" 34720 IF char$ = "~" THEN char$ = "-" 34730 new$ = new$+char$ 34740NEXT 34750term$=new$ 34760ENDPROC 34770: 34780: 34790DEF PROCbracketfix(RETURN input$) 34800LOCAL c%,new$ 34810new$="" 34820FOR c% = 1 TO LENinput$-1 34830 c1$ = MID$(input$,c%,1) 34840 c2$ = MID$(input$,c%+1,1) 34850 IF c1$=")" AND INSTR("+-*/^)",c2$)=0 THEN 34860 new$ = new$ + c1$+"#" 34870 ELSE 34880 new$=new$+c1$ 34890 ENDIF 34900NEXT 34910input$=new$+c2$ 34920ENDPROC 34930: 34940: 34950: 34960: 34970: 34980: 34990: 35000DEF PROCreport_func_error(gra%,error_no%) 35010LOCAL text$, fn$ 35020fn$=STR$(gra%) 35030IF para_plot% THEN 35040 IF gra% MOD 2 = 0 THEN 35050 fn$=STR$((1+gra%) DIV 2) 35060 fn$=fn$+" Y(t) " 35070 ELSE 35080 fn$=STR$((1+gra%) DIV 2) 35090 fn$=fn$+" X(t) " 35100 ENDIF 35110ENDIF 35120CASE error_no% OF 35130WHEN 1 : text$="contains a function which does not exist" 35140WHEN 2 : text$="has incorrect bracket use" 35150WHEN 3 : text$="has incorrect operator use" 35160WHEN 5 : text$="has no expression" 35170WHEN 6 : text$="has an operand missing" 35180WHEN 7 : text$="has a badly formed number" 35190OTHERWISE : text$="Error 9" 35200ENDCASE 35210text$=text$+". It will not be plotted." 35220PROCfunc_error_message("Function "+fn$+" "+text$) 35230PROCredraw_main_window :REM ok? 35240ENDPROC 35250 35260 35270DEF PROCfunc_error_message(text$) 35280SYS"Hourglass_Smash" 35290SYS"Wimp_DragBox",,-1 35300!block%=ERR 35310$(block%+4)=text$ 35320SYS "Wimp_ReportError",block%,1,"Graphs" 35330ENDPROC 35340 35350 35360 35370DEF PROCext_func(RETURN f$) 35380f$= FNreplace(f$,"ARCTANH","FNarctanh") 35390f$= FNreplace(f$,"ARCCOSH","FNarccosh") 35400f$= FNreplace(f$,"ARCSINH","FNarcsinh") 35410f$= FNreplace(f$,"SINH","FNsinh") 35420f$= FNreplace(f$,"COSH","FNcosh") 35430f$= FNreplace(f$,"TANH","FNtanh") 35440f$= FNreplace(f$,"FACT","FNfact") 35450IF degrees% THEN 35460f$ = FNreplace(f$,"SIN","SINRAD") 35470f$ = FNreplace(f$,"COS","COSRAD") 35480f$ = FNreplace(f$,"TAN","TANRAD") 35490f$ = FNreplace(f$,"ASN","DEGASN") 35500f$ = FNreplace(f$,"ATN","DEGATN") 35510f$ = FNreplace(f$,"ACS","DEGACS") 35520ENDIF 35530ENDPROC 35540 35550 35560DEF PROCDUMMY 35570ENDPROC 35580 35590 35600
� >:graphs.$.versions.v1 � Plots mathmatical graphs "� Cartesian, Polar, Parametric (3� Version 1 + FUNCTION EVALUATOR A.F.Lane 1990 2 <� � � 0:�:�:� F�initialise_variables P� � �error Z�load_sprites d�load_templates n�create_menu x�initialise_functions �graph_icon% =�iconbar �� � �error � �assemble ��get_environment � �mainloop �� � � �� �initialise_variables ��set_vocab ��set_stacks �� caret% 24 �� code% 600 � graph_box% 18 � block% &300 � sprites% 2000 "� buffer% &4000 ,� temp% &1500 6� DIM quit_menu% &200 @� DIM main_menu% &300 J� cart_plot%(6) T� cart_functions$(6) ^ � entered_cart_functions$(6) h!� current_cart_func_text% 200 r� plot_values% 40320 |� polar_plot%(3) �� polar_functions$(3) �!� entered_polar_functions$(3) �"� current_polar_func_text% 200 �polar_plot%() = � �� parax_functions$(3) �� paray_functions$(3) �cart_plot%() = � �!� entered_parax_functions$(6) �!� entered_paray_functions$(6) �"� current_parax_func_text% 200 �"� current_paray_func_text% 200 �� para_functions$(6) �� para_plot%(6) � help_block% 100 � b% 400 � table% 5200 &maxstack% = 50 0� stack%(maxstack%) :� draw_array% 24000 Dpara_plot%() = � N$block%= "TASK" X?ș "Wimp_Initialise",200,!block%,"Graphs" � version%, task% bcart_plot% = � lpolar_plot%= � vpara_plot% = � �main_menu_open = � �quit_menu_open = � �finished% = � �auto_y_cartaxes% = � �show_axes% = � �cart_axes_yes_icon% = 9 �cart_func_yes_icon% = 6 �cart_func_count_icon% = 3 �cart_func_icon% =7 �current_cart_func% = 1 �cart_min_x_icon% = 5 �cart_max_x_icon% = 6 �cart_min_y_icon% = 7 cart_max_y_icon% = 8 x_icon%=2 y_icon%=3 old_main_x_origin$ = "" *old_main_y_origin$ = "" 4main_x_origin% = 0 >main_y_origin% = 0 Hentered_maxx = 5 Rentered_minx = -5 \entered_maxy = 10 fentered_miny =-10 pauto_y_paraaxes% = � z%�adjust_axes(maxx,minx,maxy,miny) �show_coordinates% = � �default_format% = @% � increment = (maxx-minx)/1280 � yfactor = 1024/(maxy - miny) �)y_shift% = 512 +yfactor*(miny+maxy)/2 �degrees% = � �C�calc_cart_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) �zooming% = � �para_axes_yes_icon% = 9 �para_min_x_icon% = 5 �para_max_x_icon% = 6 �para_min_y_icon% = 7 �para_max_y_icon% = 8 para_min_t_icon% = 11 para_max_t_icon% = 13 current_para_func% =1 $para_func_yes_icon% = 6 .para_funcx_icon% =7 8para_funcy_icon% =11 Bpara_func_count_icon%=3 Lpolar_radius_icon% = 2 Vpolar_min_icon% = 4 `polar_max_icon% = 5 jpolar_axes_yes_icon% = 7 tpolar_left_icon% = 4 ~polar_func_count_icon%= 3 �polar_right_icon% = 5 �polar_func_icon% = 7 �polar_func_yes_icon% = 6 �polar_colour_icon% = 9 �auto_polar_axes% = � �current_polar_func% = 1 �#big% = 1000000 �max_radius = 1 �ok_icon% = 0 �picture% = 3 �entered_rad = 1 �"format$ = "data" sf =1 old_sf =1 save_open% =� save1_open% =� (� 2 < F� �initialise_functions Pcart_functions$(1) ="X^2" Zcart_functions$(2) ="X^3" dcart_functions$(3) ="1/X" ncart_functions$(4) ="1/X^2" xcart_functions$(5) ="SINX" �cart_functions$(6) ="LOGX" �para_functions$(1) ="2t^2" �para_functions$(2) ="4t" �para_functions$(3) ="SINt" �para_functions$(4) ="COS3t" �para_functions$(5) ="2t" �para_functions$(6) ="1/t" �� graph% = 1 � 6 �? entered_cart_functions$(graph%) = cart_functions$(graph%) �� ��initialise_para �window%= cartesian% �.cart_func_icon%= �update_cart_function( 1) Hcart_axes_yes_icon%=�change_text(cartaxes%,cart_axes_yes_icon%,"NO") �tick(main_menu%,5) �no_tick(main_menu%,6) "�no_tick(main_menu%,7) ,�no_tick(main_menu%,8) 6�tick(main_menu%,9) @window% = parametric% J0para_funcx_icon%= �update_parax_function( 1) T0para_funcy_icon%= �update_paray_function( 1) ^Hpara_axes_yes_icon%=�change_text(paraaxes%,cart_axes_yes_icon%,"NO") hwindow% = polar% r#polar_functions$(1) ="SINtCOSt" |$polar_functions$(2) ="SIN3tCOS4" �polar_functions$(3) ="TANt" �para_functions$(6) ="1/t" �� graph% = 1 � 3 �A entered_polar_functions$(graph%) = polar_functions$(graph%) �� �0polar_func_icon%= �update_polar_function( 1) �window%= cartesian% �� � � �� �load_sprites �-S%=�"<Graph$Dir>.Sprites":T%=�#S%+16:�#S% �� sprites% T% !sprites%=T%:sprites%!8=1 "ș "OS_SpriteOp",&109,sprites% 8ș "OS_SpriteOp",&10A,sprites%,"<Graph$Dir>.sprites" &� 0 : D� �load_templates N3ș "Wimp_OpenTemplate",,"<Graph$Dir>.templates" XIș "Wimp_LoadTemplate",,buffer%,temp%+&200,temp%+&2FF,-1,"proginfo",0 b+ș "Wimp_CreateWindow",,buffer% � info% lEș "Wimp_LoadTemplate",,buffer%,temp%+&300,temp%+&5FF,-1,"save",0 vbuffer%!64 = sprites% �+ș "Wimp_CreateWindow",,buffer% � save% �Fș "Wimp_LoadTemplate",,buffer%,temp%+&600,temp%+&8FF,-1,"save1",0 �buffer%!64 = sprites% �,ș "Wimp_CreateWindow",,buffer% � save1% �Eș "Wimp_LoadTemplate",,buffer%,temp%+&900,temp%+&9FF,-1,"main",0 �buffer%!64 = sprites% �+ș "Wimp_CreateWindow",,buffer% � main% �Iș "Wimp_LoadTemplate",,buffer%,temp%+&A00,temp%+&AFF,-1,"cartaxes",0 �/ș "Wimp_CreateWindow",,buffer% � cartaxes% �Jș "Wimp_LoadTemplate",,buffer%,temp%+&B00,temp%+&DFF,-1,"cartesian",0 �buffer%!64 = sprites% �0ș "Wimp_CreateWindow",,buffer% � cartesian% �Fș "Wimp_LoadTemplate",,buffer%,temp%+&E00,temp%+&EFF,-1,"coord",0 ,ș "Wimp_CreateWindow",,buffer% � coord% Lș "Wimp_LoadTemplate",,buffer%,temp%+&F00,temp%+&10FF,-1,"parametric",0 buffer%!64 = sprites% 1ș "Wimp_CreateWindow",,buffer% � parametric% *Kș "Wimp_LoadTemplate",,buffer%,temp%+&1100,temp%+&11FF,-1,"paraaxes",0 4/ș "Wimp_CreateWindow",,buffer% � paraaxes% >Lș "Wimp_LoadTemplate",,buffer%,temp%+&1200,temp%+&12FF,-1,"polaraxes",0 H0ș "Wimp_CreateWindow",,buffer% � polaraxes% RHș "Wimp_LoadTemplate",,buffer%,temp%+&1300,temp%+&14FF,-1,"polar",0 \buffer%!64 = sprites% f,ș "Wimp_CreateWindow",,buffer% � polar% pș "Wimp_CloseTemplate" zformat$="data" �&dummy$=�read_filename_text(save1%) �format$="draw" �%dummy$=�read_filename_text(save%) �$fi%="GraphData" �$gi%="GraphDraw" �� � � � � � � �� �error � temp% temp% = @% @% = default_format% $� � = 17 � .& �error_message("Escape pressed") 8 � 3 B � L� V2 �error_message(�$+" (internal error) "+�(�)) `� j@%=temp% t� ~ � � � � � �� �error_message(text$) �ș"Hourglass_Smash" �ș"Wimp_DragBox",,-1 � !block%=� �$(block%+4)=text$ �+ș "Wimp_ReportError",block%,1,"Graphs" �� ( 2 <� �glass(o%) F � o% � P ș"Hourglass_On" Z� d ș"Hourglass_Off" n� x� � � � � � � �� �no_tick(menu%,item%) �byte%=menu%+28+item%*24 �!byte% = !byte% � &FFFFFFFE �� � � �� �tick(menu%,item%) byte%=menu%+28+item%*24 !byte% = !byte% � 1 � " , 6 @ J T � �tick_reverse(menu%,item%) ^byte%=menu%+28+item%*24 h� !byte% � 1 = 1 � r!byte% = !byte% � &FFFFFFFE |� �!byte% = !byte% � 1 �� �� � � � � � � �� �mainloop �� ��update_coordinates � �poll � finished% � & 0� �poll :Dș "Wimp_Poll",(� show_coordinates% � 1),block% � reason%,block% DȎ reason% � N%� 1 : �setsf:�redraw(!block%) X*� 2 : ș "Wimp_OpenWindow",,block% b� 3 : �close(!block%) l#� 4 : �leave_window(block%) v� 6 : �buttons(block%) �� 7 : �save � � 8 : �key_press(block%) �!� 9 : �menuselect(block%) �� 17,18 : �receive(block%) �� �� � �� �key_press(block%) �#� window%, icon%, key% ,height% �window% = !block% �icon% = block%!4 �height% = block%!16 �key% = block%!24 Ȏ key% � � 13 : �return � &181 : �f1 � 27 : �escape_pressed * 4 ș "Wimp_ProcessKey",key% >� H� R \ � �return fȎ window% � p# � save1% :format$ = "data" z �quicksave �# � save% :format$ = "draw" � �quicksave � � cartaxes% :�nextcart � � paraaxes% :�nextpara � � polaraxes% :�nextpolar �� �� � �� �nextcart � �get_caret �% caret_icon% =(caret_icon%-4)�4+5 �" �caret(cartaxes%,caret_icon%) �� � �nextpara $ �get_caret . Ȏ caret_icon% � 81 � para_min_x_icon% : icon% =para_max_x_icon% B1 � para_max_x_icon% : icon% =para_min_y_icon% L1 � para_min_y_icon% : icon% =para_max_y_icon% V1 � para_max_y_icon% : icon% =para_min_t_icon% `1 � para_min_t_icon% : icon% =para_max_t_icon% j1 � para_max_t_icon% : icon% =para_min_x_icon% t� ~�caret(paraaxes%,icon%) �� � �� �nextpolar � �get_caret � Ȏ caret_icon% � �2 � polar_radius_icon% :icon%= polar_min_icon% �2 � polar_min_icon% :icon%= polar_max_icon% �5 � polar_max_icon% :icon%= polar_radius_icon% � � ��caret(polaraxes%,icon%) �� � � �f1 ( A%=@% 2@%=&01000608 <Dcart_min_y_icon%=�change_text(cartaxes%,cart_min_y_icon%,�(-10)) FCcart_max_y_icon%=�change_text(cartaxes%,cart_max_y_icon%,�(10)) PCcart_min_x_icon%=�change_text(cartaxes%,cart_min_x_icon%,�(-5)) ZBcart_max_x_icon%=�change_text(cartaxes%,cart_max_x_icon%,�(5)) d2ș "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 n @%=A% x� � � �� �caret(window%,icon%) �3 ș"Wimp_SetCaretPosition",window%,icon%,,,-1,0 �� � �� �get_caret �& ș"Wimp_GetCaretPosition",,caret% � caret_window% = !caret% � caret_icon% = caret%!4 � caret_height% = caret%!16 �� � � �update_coordinates )� show_coordinates% � � polar_plot% � "$ș "Wimp_GetPointerInfo",,block% ,x$=�(!block%) 6y$=�(block%!4) @� block%!12 = main% � JOx=(!block% -main_x_origin%) *(maxx-minx)/1280/sf+minx:� replace by * factor T<y=(block%!4 - main_y_origin% )* (maxy-miny)/1024/sf+maxy ^� para_plot% � x=x*1.25 h A%=@% r@%= &0100070A |x$=�(x) �y$=�(y) � @%=A% �� � x$="" � y$="" �� �8� x$<>old_main_x_origin$ � y$<>old_main_y_origin$ � �old_main_x_origin$ =x$ �old_main_y_origin$ =y$ �+x_icon%=�change_text(coord%,x_icon%,x$) �+y_icon%=�change_text(coord%,y_icon%,y$) �2ș "Wimp_ForceRedraw",coord%,-100,-300,400,100 �� � � & 0 :� �redraw(handle%) D!block% = handle% N*ș "Wimp_RedrawWindow",,block% � more% Xȕ more% <> 0 b�get_window_parameters l�redraw_main_window v*ș "Wimp_GetRectangle",,block% � more% �� �� � � � � � � �� �close(parameter%) �!block% = parameter% �!ș "Wimp_CloseWindow",,block% �Ȏ parameter% � �%� coord% : �no_tick(main_menu%,8) " coordinates% = � � � * 4 > H R \� �buttons(parameter%) fmouse_x%= !parameter% pmouse_y%= parameter%!4 zbutton% = parameter%!8 �window% = parameter%!12 �icon% = parameter%!16 �� button% � 2 � �$�menu(window%,mouse_x%,mouse_y%) �� � � window% = -2 � � �open_window(main%) �� �� �� button% � 4 � �Ȏ window% � �C � main% : ș "Wimp_ForceRedraw",polaraxes%,0,-500,900,0 �' � cart_plot% � + �calculate_cart H ș "Wimp_ForceRedraw",cartaxes%,0,-500,900,0 � $' � para_plot% � .+ �calculate_para 8H ș "Wimp_ForceRedraw",paraaxes%,0,-500,900,0 B � L( � polar_plot% � V, �calculate_polar `I ș "Wimp_ForceRedraw",polaraxes%,0,-500,900,0 j � t4 � cartaxes% : �updatecartaxes(window%,icon%) ~5 � cartesian% : �updatecartesian(window%,icon%) �4 � paraaxes% : �updateparaaxes(window%,icon%) �6 � parametric% : �updateparametric(window%,icon%) �5 � polaraxes% : �updatepolaraxes(window%,icon%) �1 � polar% : �updatepolar(window%,icon%) �& � save1% : format$ = "data" �8 � icon% = ok_icon% � �quicksave �B � icon% = picture% � �draw_click(window%) �& � save% : format$ = "draw" �8 � icon% = ok_icon% � �quicksave �B � icon% = picture% � �draw_click(window%) � �� � � button% � 1 � Ȏ window% � � main% : �zoom (� 2� <� F� P Z d n x �� �open_window(handle%) � !block% = handle% �& ș "Wimp_GetWindowState",,block% �0 block%!28 = -1 : � Ensure window is on top �" ș "Wimp_OpenWindow",,block% �� � � � �� �menu(window%,x%,y%) �Ȏ window% � �*� main% : menu_block% = main_menu% �$ main_menu_open = � $ quit_menu_open = � *� -2 : menu_block% = quit_menu% $ main_menu_open = � "$ quit_menu_open = � ,� 6+ș "Wimp_CreateMenu",,menu_block%,x%,y% @� J T ^ h� �iconbar rN!block%=-1:block%!4=0:block%!8=0:block%!12=63:block%!16=68:block%!20=&2102 |spname$="!graphs" �D� block%!24 (�spname$+1):$(block%!24)=spname$:block%!28=sprites% �block%!32=�spname$+1 �&ș "Wimp_CreateIcon",,block% � ic% �=ic% � � � � �� �menuselect(block%) �selection% = !block% �� main_menu_open � �#ș"Wimp_GetPointerInfo",,block% �� block%!8 = 1 � � reopen menu & ș "Wimp_CreateMenu",,main_menu% � &Ȏ selection% � 0� 0 : �file_data :� 1 : �file_graphs D,� 2 : � � polar_plot% � �coordinates N� 3 : �axes X� 4 : �functions b� 5 : �select_cartesian l� 6 : �select_polar v � 7 : �select_parametric �� 8 : �degrees �� 9 : �axes_flag �� 10 : �line �� �� �Ȏ selection% � �� 0 : �close_down �� 1 : �open_window(info%) �� �� �� � � � �leave_window(parameter%) � window% *window% = !parameter% 4Ȏ window% � >!� info% : �close(info%) H.� WHEN cartesian% : PROCextract_cart_func R-� PROCconvert_functions \2�WHEN parametric%: PROCextract_para_functions f2� PROCreturn_paraaxes_values p2� PROCconvert_para_functions z3�WHEN polar% : PROCextract_polar_functions �3� PROCconvert_polar_functions �$� cartaxes% : �check_cart_axes �%� polaraxes% : �check_polar_axes �$� paraaxes% : �check_para_axes �� �� � � � � � � �� �close_down $block% = "TASK" %ș "Wimp_CloseDown",task%,!block% finished% = � $� . 8 B L V `� �receive(parameter%) j � reason% tnew_task% = parameter%!4 ~ref%=parameter%!8 �reason%=parameter%!16 �Ȏ reason% � �� 0 : �close_down �!� 2 : �datasave(parameter%) �5� 3,5 : � parameter%!12=0 � �dataload(parameter%) �� 6 : �memory �� &502: �help �� �� � � �� �axes )� cart_plot% �open_window(cartaxes%) )� para_plot% �open_window(paraaxes%) *� polar_plot% �open_window(polaraxes%) � ( 2 < F P Z� �functions d*� cart_plot% �open_window(cartesian%) n+� para_plot% �open_window(parametric%) x&� polar_plot% �open_window(polar%) � � � � � � � �$� �updatecartaxes(window%,icon%) �#� icon% = cart_axes_yes_icon% � �+ auto_y_cartaxes% = � auto_y_cartaxes% � � auto_y_cartaxes% � �: cart_axes_yes_icon%=�change_text(window%,icon%,"YES") �( �deselect(window%,cart_min_y_icon%) �( �deselect(window%,cart_max_y_icon%) � 9 cart_axes_yes_icon%=�change_text(window%,icon%,"NO") ( �reselect(window%,cart_min_y_icon%) "( �reselect(window%,cart_max_y_icon%) ,� 6� @.ș "Wimp_ForceRedraw",window%,0,-300,800,0 J� T ^ h r |$� �read_icon_text(window%,icon%) �!block% = window% �block%!4 = icon% �"ș "Wimp_GetIconState",,block% �text% = block%+ 28 �=$text% � � � � �� �deselect(window%,icon%) �!block% = window% �block%!4= icon% �block%!8= 2^22 block%!12 = 2^22 "ș "Wimp_SetIconState",,block% � & 0 : D N� �reselect(window%,icon%) X!block% = window% bblock%!4= icon% lblock%!8= 0 vblock%!12 = 2^22 �"ș "Wimp_SetIconState",,block% �� � � � � �%� �updatecartesian(window%,icon%) ��extract_cart_func �' � cart_plot%(current_cart_func%) � �H cart_func_yes_icon%=�change_text(window%,cart_func_yes_icon%,"YES") �� �G cart_func_yes_icon%=�change_text(window%,cart_func_yes_icon%,"NO") �� #� icon% = cart_func_yes_icon% � G cart_plot%(current_cart_func%) = � cart_plot%(current_cart_func%) ' � cart_plot%(current_cart_func%) � : cart_func_yes_icon%=�change_text(window%,icon%,"YES") *� 49 cart_func_yes_icon%=�change_text(window%,icon%,"NO") >� H� R*� icon% = 4 � current_cart_func% > 1 � \ current_cart_func% -=1 f]cart_func_count_icon% = �change_text(window%,cart_func_count_icon%,�(current_cart_func%)) p� z �*� icon% = 5 � current_cart_func% < 6 � � current_cart_func% +=1 �]cart_func_count_icon% = �change_text(window%,cart_func_count_icon%,�(current_cart_func%)) �� �>cart_func_icon%=�update_cart_function( current_cart_func%) �&� cart_plot%(current_cart_func%) � �H cart_func_yes_icon%=�change_text(window%,cart_func_yes_icon%,"YES") �� �G cart_func_yes_icon%=�change_text(window%,cart_func_yes_icon%,"NO") �� �6�set_graph_colour_icon(window%,current_cart_func%) �!block% = window% �.ș "Wimp_ForceRedraw",window%,0,-300,900,0 � $ . 87��set_graph_colour_icon(window%,current_cart_func%) Bblock%!0 = window% Lblock%!4 = 9 V+block%!8 = (9 + current_cart_func%)<<28 `block%!12 = &F <<28 j"ș "Wimp_SetIconState",,block% t� ~ � � �'� �change_text(window%,icon%,text$) �!block% = window% �block%!4 = icon% �"ș "Wimp_GetIconState",,block% �text% = block%+28 �$text% = text$ � ș "Wimp_DeleteIcon",,block% �*� below% = block% + 4 � block% +35 � 4 � !below% = below%!4 �� (ș "Wimp_CreateIcon",,block% � icon% =icon% ( 2 < F P#� �update_cart_function( item%) Z!block% = window% dblock%!4 = cart_func_icon% n"ș "Wimp_GetIconState",,block% x ș "Wimp_DeleteIcon",,block% �*� below% = block% + 4 � block% +35 � 4 � !below% = below%!4 �� �text% = block% + 24 �validation% = block% + 28 � buffer_length% = block% + 32 �$!text% = current_cart_func_text% �!validation% = -1 �!buffer_length% = 100 �=$current_cart_func_text% = entered_cart_functions$(item%) �(ș "Wimp_CreateIcon",,block% � icon% � =icon% � 6� �return_axes_values(� minx,� maxx,� miny,� maxy) =entered_minx=��read_icon_text(cartaxes%,cart_min_x_icon%) =entered_maxx=��read_icon_text(cartaxes%,cart_max_x_icon%) "=entered_miny=��read_icon_text(cartaxes%,cart_min_y_icon%) ,=entered_maxy=��read_icon_text(cartaxes%,cart_max_y_icon%) 6%�adjust_axes(maxx,minx,maxy,miny) @� J T ^� �extract_cart_func h!block% = window% rblock%!4 = cart_func_icon% |"ș "Wimp_GetIconState",,block% �>entered_cart_functions$(current_cart_func%) = $(block%!28) �� graph% = 1 � 6 �> cart_functions$(graph%) = entered_cart_functions$(graph%) �� �� � � � �� �redraw_main_window � �setsf �� cart_plot% � ��draw_cart_axes �%�x_plot2(ebx%,etx%-2,ety%,eby%,1) � 26 main_x_origin% =wbx% - xsc% main_y_origin% =wty% - ysc% &� 0 :� para_plot% � D �draw_cart_axes N' �x_plot1(ebx%,etx%-2,ety%,eby%,1) X � 26 b! main_x_origin% =wbx% - xsc% l! main_y_origin% =wty% - ysc% v! main_x_origin% =wbx% - xsc% �! main_y_origin% =wty% - ysc% �� �� polar_plot% � � �draw_polar_axes �& �x_plot(ebx%,etx%-2,ety%,eby%,1) � � 26 �! main_x_origin% =wbx% - xsc% �! main_y_origin% =wty% - ysc% �� �� � �� �setsf �!b%= main% !ș "Wimp_GetWindowInfo",,b% !sf=(b%!12-b%!4)/1280 !multiplier% = sf * 1024 ! � old_sf <> sf � !*/ ș"OS_ReadModeVariable",�,4 � ,,pix_value% !4 pix_value% +=1 !> pix_value% = pix_value%/ sf !H old_sf = sf !R !b% = main% !\ b%!4 = 0 !f b%!8 = -2000 !p b%!12 = 2000 !z b%!16 = 0 !�. ș"Wimp_ForceRedraw",main%,0,-2000,2000,0 !� B%=0 !� C%= table% !� D% = multiplier% !�� scale !�� !�� !� !� !�� �get_window_parameters !�wbx% = block%!4 !�wby% = block%!8 !�wtx% = block%!12 "wty% = block%!16 "xsc% = block%!20 "ysc% = block%!24 "$gbx% = block%!28 ".gby% = block%!32 "8gtx% = block%!36 "Bgty% = block%!40 "Lhp% = wtx% - wbx% "Vvp% = wty% -wby% "`ebx% = xsc% + gbx%-wbx% "jetx% = xsc%+gtx%-wbx% "tety%=ysc% + gty%-wty% "~eby% = ysc%-gby%-wty% "�&� 26,5,24,gbx%;gby%;gtx%-2;gty%-4; "�ȑ wbx% - xsc%,wty%-ysc% "�� "� "� "� "� "� "� "� "� "�� �calculate_cart # � count%, count1% # �glass(�) #count% = 0 #� graph%= 1 � 6 #(( � cart_plot%(graph%) � count% +=1 #2� #<count1%= count% #Fwindow% = cartesian% #P�extract_cart_func #Z�convert_functions #d,�return_axes_values(minx,maxx,miny,maxy) #n� auto_y_cartaxes% � #x count% =count%*2 #� count1%=count1%*2 #�* �return_y_range(minx,maxx,miny,maxy) #�� #� increment = (maxx-minx)/1280 #� yfactor = 1024/(maxy - miny) #�)y_shift% = 512 +yfactor*(miny+maxy)/2 #�� graph% = 1 � 6 #�,base% = plot_values% +(graph% -1)*1280*4 #�� cart_plot%(graph%) � #�5ș"Hourglass_Percentage",100-(count1%/count%)*100 #� count1% -=1 #�� X% = 0 � 1280 #� X= minx+increment*X% $ x=X $ ok% = � $ � � $" � � � ok% = � : $, � ok% � $6A base%!(X%*4) = yfactor*�cart_functions$(graph%) -y_shift% $@ � $J base%!(X%*4)= -big% $T � $^ � � $h� $r� $|� $�C�calc_cart_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) $� �glass(�) $�.ș "Wimp_ForceRedraw",main%,0,-1280,1280,0 $�� $� $�.� �return_y_range(minx,maxx,� miny,� maxy) $� increment = (maxx-minx)/1280 $�entered_maxy= -10E30 $�entered_miny= 10E30 $�� graph% = 1 � 6 $�� cart_plot%(graph%) � $�7 ș"Hourglass_Percentage",100-(count1%/count%)*100 $�� X% = 0 � 1280 % X= minx+increment*X% % x=X % ok% = � %& � � %0 � � � ok% = � %: � ok% � %D( value = �cart_functions$(graph%) %N3 � value < entered_miny � entered_miny = value %X3 � value > entered_maxy � entered_maxy = value %b � %l � � %v� %� count1%-=1 %�� %�� %� A%=@% %�@%=&01000308 %�Mcart_min_y_icon%=�change_text(cartaxes%,cart_min_y_icon%,�(entered_miny)) %�Mcart_max_y_icon%=�change_text(cartaxes%,cart_max_y_icon%,�(entered_maxy)) %�2ș "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 %� @%=A% %�%�adjust_axes(maxx,minx,maxy,miny) %�� %� %� & &E� �calc_cart_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) & A%=@% & @%=&01000108 &*� 0 >= miny � 0 <= maxy � &4 x_axes_level= 0 &>* x_axes_level% = 0 * yfactor-y_shift% &H � &R' x_axes_level= �(�((maxy+miny)))/2 &\6 x_axes_level% = x_axes_level * yfactor-y_shift% &f� &p� 0 >= minx � 0 <= maxx � &z. y_axes_level% = 1280/(maxx-minx)*(-minx) &� y_axes_level=0 &� � &�' y_axes_level= �(�((maxx+minx)))/2 &�: y_axes_level% = 1280/(maxx-minx)*(y_axes_level-minx) &�� &� @%=A% &�� &� &� &�� �draw_cart_axes &�� y%,y1% &�� show_axes% � &�y%=y_axes_level%*sf 'y1%=(y_axes_level%-20)*sf '� para_plot% � '- lmx%= 210*sf:lmy%=(x_axes_level%-20)*sf '$0 rmx%= 1068*sf: rmy% =(x_axes_level%-20)*sf '.� '8- lmx%= 104*sf:lmy%=(x_axes_level%-20)*sf 'B0 rmx%= 1174*sf: rmy% =(x_axes_level%-20)*sf 'L� 'V�0,7 '`� 0,x_axes_level%*sf 'j� 1280*sf,x_axes_level%*sf 't� lmx%,lmy% '~�1,0,40*sf '�� rmx%,rmy% '��1,0,40*sf '�!� 1100*sf,x_axes_level%*sf-20 '��"y=";�(x_axes_level) '� � y%,0 '�� y%,-1050*sf '�� y1%,-84*sf '�� 1,40*sf,0 '�� y1%,-938*sf '�� 1,40*sf,0 '�� y%+10,-50 '�� "x=";�(y_axes_level) ( � ( � ( ( (( (2� �coordinates (<+show_coordinates% = � show_coordinates% (F� show_coordinates% � (P�open_window(coord%) (Z�tick(main_menu%,2) (d� (n�close(coord%) (x�no_tick(main_menu%,2) (�� (�� (� (� (�� �check_cart_axes (�,�return_axes_values(minx,maxx,miny,maxy) (� A%=@% (�@%=&01000308 (�� minx >= maxx � (� Ȕ minx,maxx (� � minx=maxx � maxx=maxx+1 (�H cart_max_x_icon% =�change_text(cartaxes%,cart_max_x_icon%,�(maxx)) (�H cart_min_x_icon% =�change_text(cartaxes%,cart_min_x_icon%,�(minx)) )4 ș "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 )F �error_message("X min must be less than X max. Values adjusted") )� )"� maxx - minx < 1E-6 � ),B�error_message("There may be errors due to the small X range") )6� )@� )J)� � auto_y_cartaxes% � miny >= maxy � )T Ȕ miny,maxy )^# � miny = maxy � maxy = maxy+1 )hH cart_max_y_icon% =�change_text(cartaxes%,cart_max_y_icon%,�(maxy)) )rH cart_min_y_icon% =�change_text(cartaxes%,cart_min_y_icon%,�(miny)) )|4 ș "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 )�F �error_message("Y min must be less than Y max. Values adjusted") )�� )�� )� )� )�� �axes_flag )�show_axes% = � show_axes% )�� show_axes% � )� �tick(main_menu%,9) )�� )� �no_tick(main_menu%,9) )�� )�.ș "Wimp_ForceRedraw",main%,0,-1280,1280,0 *� * *� �degrees *°rees% = � degrees% *0� degrees% � *: �tick(main_menu%,8) *D� *N �no_tick(main_menu%,8) *X� *b� *l *v *� *� *�� �convert_functions *�� gra% = 1 � 6 *�� cart_plot%(gra%) � *�8cart_functions$(gra%)= �upper(cart_functions$(gra%)) *�G�convert(cart_functions$(gra%),"X",cart_functions$(gra%),error_no%) *�� error_no% <> 0 � *�( �report_func_error(gra%,error_no%) *� cart_plot%(gra%)=� *�$ �updatecartesian(cartesian%,9) *�� *�$�ext_func(cart_functions$(gra%)) +� +� +� + +* +4 +>#� �replace(object$,target$,by$) +H� start%, position% +Rstart% = �object$,target$) +\ ȕ start% +f.position% = �(object$)-�(target$)-start%+1 +p8object$ = �object$,start%-1)+by$+�object$,position%) +z,start% = �object$,target$,start%+�(by$)) +�� +�=object$ +� +� +� +�/� �adjust_axes(� maxx,� minx,� maxy,� miny) +�� average,sf +�sf= 1.2 +�-average = (entered_maxx +entered_minx)/2 +�*maxx=(entered_maxx-average)*sf+average +�*minx=(entered_minx-average)*sf+average +�-average = (entered_maxy +entered_miny)/2 +�*maxy=(entered_maxy-average)*sf+average ,*miny=(entered_miny-average)*sf+average ,� , ,$ ,.� �zoom ,8� A% ,B� � zooming% � cart_plot% � ,Lzooming% = � ,V� 26 ,`!block% = main% ,j#ș "Wimp_GetWindowInfo",,block% ,t.�24,block%!4;block%!8;block%!12;block%!16; ,~�4,5 ,�$ș "Wimp_GetPointerInfo",,block% ,�x1% = !block% ,�y1% = block%!4 ,�� ,� ȗ mx,my,b ,� � b=0 ,�� ,� ȗ mx,my,b ,� x2% = mx ,� y2% = my ,� ȓ x1%,y1%,x2%-x1%,y2%-y1% ,� Ȗ - ȓ x1%,y1%,x2%-x1%,y2%-y1% - ȗ mx,my,b -� b = 1 � b=4 - A%=@% -(@%=&01000608 -2� x1% > x2% � Ȕ x1%,x2% -<� y1% > y2% � Ȕ y1%,y2% -F:n_minx=(x1% -main_x_origin%) *(maxx-minx)/1280/sf+minx -P:n_maxx=(x2% -main_x_origin%) *(maxx-minx)/1280/sf+minx -Z<n_miny=(y1% - main_y_origin% )* (maxy-miny)/1024/sf+maxy -d<n_maxy=(y2% - main_y_origin% )* (maxy-miny)/1024/sf+maxy -n;� b=1 � �(n_miny) <>�(n_maxy) � �(n_minx) <>�(n_maxx) � -xminx = n_minx -�miny = n_miny -�maxx = n_maxx -�maxy = n_maxy -�Ecart_min_y_icon%=�change_text(cartaxes%,cart_min_y_icon%,�(miny)) -�Ecart_max_y_icon%=�change_text(cartaxes%,cart_max_y_icon%,�(maxy)) -�Ecart_min_x_icon%=�change_text(cartaxes%,cart_min_x_icon%,�(minx)) -�Ecart_max_x_icon%=�change_text(cartaxes%,cart_max_x_icon%,�(maxx)) -�2ș "Wimp_ForceRedraw",cartaxes%,0,-1280,1280,0 -��calculate_cart -�� -� @%=A% -�zooming% = � -�� .� . .� �fact(x%) ."� sum, count% .,sum = 1 .6� x% > 1 � .@� count% = 2 � x% .J sum = sum * count% .T� .^� .h=sum .r .|� �cosh(x) .�=0.5*(�(x)+�(-x)) .� .�� �sinh(x) .�=0.5*(�(x)-�(-x)) .� .�� �tanh(x) .�=�sinh(x)/�cosh(x) .� .�� �arccosh(x) .�=�(x+(x*x-1)^0.5) .� .�� �arcsinh(x) .�=�(x+(x*x+1)^0.5) / /� �arctanh(x) /=0.5*�((1+x)/(1-x)) /& /0� �upper(text$) /:� result$,i%,c$ /Dresult$="" /N� i% = 1 � �text$ /X c$=�text$,i%,1) /b* � c$>="a" � c$<="z" � c$=�(�(c$)�&DF) /l result$=result$+c$ /v� /�=result$ /� /�� �select_cartesian /�cart_plot% = � /�polar_plot%= � /�para_plot% = � /��no_tick(main_menu%,6) /��no_tick(main_menu%,7) /��tick(main_menu%,5) /��close(parametric%) /��close(paraaxes%) /��close(polar%) /��close(polaraxes%) 0�open_window(cartaxes%) 0�open_window(cartesian%) 0�calculate_cart 0 � show_coordinates% � 0*�open_window(coord%) 04� 0>� 0H 0R 0\� �select_polar 0fwindow%= polar% 0pcart_plot% = � 0zpolar_plot%= � 0�para_plot% = � 0��no_tick(main_menu%,5) 0��no_tick(main_menu%,7) 0��tick(main_menu%,6) 0��close(parametric%) 0��close(paraaxes%) 0��close(cartesian%) 0��close(cartaxes%) 0��close(coord%) 0��close(polaraxes%) 0��open_window(polar%) 0��open_window(polaraxes%) 0��calculate_polar 1� 1 1 1$� �select_parametric 1.window%=parametric% 18cart_plot% = � 1Bpolar_plot%= � 1Lpara_plot% = � 1V�no_tick(main_menu%,6) 1`�no_tick(main_menu%,5) 1j�tick(main_menu%,7) 1t�close(cartesian%) 1~�close(cartaxes%) 1��close(polar%) 1��close(polaraxes%) 1��open_window(paraaxes%) 1��open_window(parametric%) 1�� show_coordinates% � 1��open_window(coord%) 1�� 1��calculate_para 1�� 1� 1� 1�$� �updateparaaxes(window%,icon%) 2 #� icon% = para_axes_yes_icon% � 2 + auto_y_paraaxes% = � auto_y_paraaxes% 2 � auto_y_paraaxes% � 2: para_axes_yes_icon%=�change_text(window%,icon%,"YES") 2(( �deselect(window%,para_min_y_icon%) 22( �deselect(window%,para_max_y_icon%) 2<( �deselect(window%,para_min_x_icon%) 2F( �deselect(window%,para_max_x_icon%) 2P� 2Z9 para_axes_yes_icon%=�change_text(window%,icon%,"NO") 2d( �reselect(window%,para_min_y_icon%) 2n( �reselect(window%,para_max_y_icon%) 2x( �reselect(window%,para_min_x_icon%) 2�( �reselect(window%,para_max_x_icon%) 2�� 2�� 2�.ș "Wimp_ForceRedraw",window%,0,-500,800,0 2�� 2� 2� 2�&� �updateparametric(window%,icon%) 2��extract_para_func 2�' � para_plot%(current_para_func%) � 2�H para_func_yes_icon%=�change_text(window%,para_func_yes_icon%,"YES") 2�� 2�G para_func_yes_icon%=�change_text(window%,para_func_yes_icon%,"NO") 3� 3#� icon% = para_func_yes_icon% � 3G para_plot%(current_para_func%) = � para_plot%(current_para_func%) 3"' � para_plot%(current_para_func%) � 3,: para_func_yes_icon%=�change_text(window%,icon%,"YES") 36� 3@9 para_func_yes_icon%=�change_text(window%,icon%,"NO") 3J� 3T� 3^*� icon% = 4 � current_para_func% > 1 � 3h current_para_func% -=1 3r]para_func_count_icon% = �change_text(window%,para_func_count_icon%,�(current_para_func%)) 3|� 3�*� icon% = 5 � current_para_func% < 3 � 3� current_para_func% +=1 3�]para_func_count_icon% = �change_text(window%,para_func_count_icon%,�(current_para_func%)) 3�� 3�A para_funcx_icon%=�update_parax_function( current_para_func%) 3�A para_funcy_icon%=�update_paray_function( current_para_func%) 3�&� para_plot%(current_para_func%) � 3�H para_func_yes_icon%=�change_text(window%,para_func_yes_icon%,"YES") 3�� 3�G para_func_yes_icon%=�change_text(window%,para_func_yes_icon%,"NO") 3�� 3�6�set_graph_colour_icon(window%,current_para_func%) 3�!block% = window% 4.ș "Wimp_ForceRedraw",window%,0,-300,900,0 4� 4 4&$� �update_parax_function( item%) 40!block% = window% 4:block%!4 = para_funcx_icon% 4D"ș "Wimp_GetIconState",,block% 4N ș "Wimp_DeleteIcon",,block% 4X*� below% = block% + 4 � block% +35 � 4 4b !below% = below%!4 4l� 4vtext% = block% + 24 4�validation% = block% + 28 4� buffer_length% = block% + 32 4�%!text% = current_parax_func_text% 4�!validation% = -1 4�!buffer_length% = 200 4�?$current_parax_func_text% = entered_parax_functions$(item%) 4�(ș "Wimp_CreateIcon",,block% � icon% 4� =icon% 4� 4�$� �update_paray_function( item%) 4�!block% = window% 4�block%!4 = para_funcy_icon% 4�"ș "Wimp_GetIconState",,block% 5 ș "Wimp_DeleteIcon",,block% 5*� below% = block% + 4 � block% +35 � 4 5 !below% = below%!4 5 � 5*text% = block% + 24 54validation% = block% + 28 5> buffer_length% = block% + 32 5H%!text% = current_paray_func_text% 5R!validation% = -1 5\!buffer_length% = 200 5f?$current_paray_func_text% = entered_paray_functions$(item%) 5p(ș "Wimp_CreateIcon",,block% � icon% 5z =icon% 5� 5� 5� 5�� �extract_para_func 5�!block% = window% 5�block%!4 = para_funcx_icon% 5�"ș "Wimp_GetIconState",,block% 5�?entered_parax_functions$(current_para_func%) = $(block%!28) 5�!block% = window% 5�block%!4 = para_funcy_icon% 5�"ș "Wimp_GetIconState",,block% 5�?entered_paray_functions$(current_para_func%) = $(block%!28) 5�� graph% = 1 � 3 6@ parax_functions$(graph%) = entered_parax_functions$(graph%) 6@ paray_functions$(graph%) = entered_paray_functions$(graph%) 6� 6$� 6. 68 6B 6L� �initialise_para 6V4entered_parax_functions$(1) = para_functions$(1) 6`4entered_paray_functions$(1) = para_functions$(2) 6j4entered_parax_functions$(2) = para_functions$(3) 6t4entered_paray_functions$(2) = para_functions$(4) 6~4entered_parax_functions$(3) = para_functions$(5) 6�4entered_paray_functions$(3) = para_functions$(6) 6�� graph% = 1 � 3 6�A parax_functions$(graph%) = entered_parax_functions$(graph%) 6�A paray_functions$(graph%) = entered_paray_functions$(graph%) 6�� 6�� 6�� �calculate_para 6�� count%, count1% 6� �glass(�) 6�count% = 0 6�� graph%= 1 � 3 6�( � para_plot%(graph%) � count% +=1 7 � 7 count1%= count% 7�extract_para_functions 7�convert_para_functions 7(�return_paraaxes_values 72� auto_y_paraaxes% � 7< count% =count%*2 7F count1%=count1%*2 7P3 �ret_para_range(minx,maxx,miny,maxy,mint,maxt) 7Z� 7d increment = (maxt-mint)/1280 7n yfactor = 1024/(maxy - miny) 7x)y_shift% = 512 +yfactor*(miny+maxy)/2 7� xfactor = 1024/(maxx - minx) 7�'x_shift%=-640+xfactor*(minx+maxx)/2 7�� graph% = 1 � 3 7�� para_plot%(graph%) � 7�5ș"Hourglass_Percentage",100-(count1%/count%)*100 7� count1% -=1 7�X% = graph%*2-2 7�Y% = graph%*2-1 7�#xbase% = plot_values%+X%*1280*4 7�#ybase% = plot_values%+Y%*1280*4 7�� T% = 0 � 1280 7� T= mint+increment*T% 7� t=T 8 ok% = � 8 � � 8 � � � ok% = � 8" � ok% � 8,? ybase%!(T%*4) = yfactor*�para_functions$(Y%+1)-y_shift% 86 � 8@ ybase%!(T%*4) = big% 8J � 8T � � 8^ ok% = � 8h � � 8r � � � ok% = � 8| � ok% � 8�@ xbase%!(T%*4) = xfactor*�para_functions$(X%+1)-x_shift% 8� � 8� xbase%!(T%*4) = big% 8� � 8� � � 8�� 8�� 8�� 8�C�calc_para_axes(minx,maxx,miny,maxy,yfactor,y_shift%,increment) 8� �glass(�) 8�.ș "Wimp_ForceRedraw",main%,0,-1280,1280,0 8�� 8�� �return_paraaxes_values 9=entered_minx=��read_icon_text(paraaxes%,para_min_x_icon%) 9=entered_maxx=��read_icon_text(paraaxes%,para_max_x_icon%) 9=entered_miny=��read_icon_text(paraaxes%,para_min_y_icon%) 9&=entered_maxy=��read_icon_text(paraaxes%,para_max_y_icon%) 905mint=��read_icon_text(paraaxes%,para_min_t_icon%) 9:5maxt=��read_icon_text(paraaxes%,para_max_t_icon%) 9D%�adjust_axes(maxx,minx,maxy,miny) 9N� 9X 9b 9l� �extract_para_functions 9v!block% = parametric% 9�block%!4 = para_funcx_icon% 9�"ș "Wimp_GetIconState",,block% 9�?entered_parax_functions$(current_para_func%) = $(block%!28) 9�block%!4 = para_funcy_icon% 9�"ș "Wimp_GetIconState",,block% 9�?entered_paray_functions$(current_para_func%) = $(block%!28) 9�� graph% = 1 � 3 9�A para_functions$(graph%*2) = entered_paray_functions$(graph%) 9�C para_functions$(graph%*2-1) = entered_parax_functions$(graph%) 9�� 9�� 9� 9� :� �convert_para_functions :� gra% = 1 � 6 :"� para_plot%((gra% + 1) � 2) � : : para_functions$(gra%)= �upper(para_functions$(gra%)) :*I �convert(para_functions$(gra%),"T",para_functions$(gra%),error_no%) :4 � error_no% <> 0 � :>* �report_func_error(gra%,error_no%) :H! para_plot%((gra%+1)� 2)=� :R( �updateparametric(parametric%,9) :\ � :f% �ext_func(para_functions$(gra%)) :p� :z� :�� :� :� :� :� :�K��ret_para_range(RETURNminx,RETURNmaxx,RETURNminy,RETURNmaxy,mint,maxt) :� increment = (maxt-mint)/1280 :�entered_maxy= -10E30 :�entered_miny= 10E30 :�entered_maxx= -10E30 :�entered_minx= 10E30 :�� graph% = 1 � 3 :�X% = graph%*2-1 ;Y% = graph%*2 ;� para_plot%(graph%) � ;7 ș"Hourglass_Percentage",100-(count1%/count%)*100 ;$� T% = 0 � 1280 ;. T= mint+increment*T% ;8 t=T ;B ok% = � ;L � � ;V � � � ok% = � ;` � ok% � ;j$ value = �para_functions$(Y%) ;t3 � value < entered_miny � entered_miny = value ;~3 � value > entered_maxy � entered_maxy = value ;� � ;� � � ;� ok% = � ;� � � ;� � � � ok% = � ;� � ok% � ;�$ value = �para_functions$(X%) ;�3 � value < entered_minx � entered_minx = value ;�3 � value > entered_maxx � entered_maxx = value ;� � ;� � � ;�� <