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
;� �
;� � �
;��
<