amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (02/19/91)
Submitted-by: dm@stekt.oulu.fi (Hannu Helminen ti) Posting-number: Volume 91, Issue 017 Archive-name: applications/mandel-1.0/part01 [ uuencoded executable, icons, and library enclosed ...tad ] [ also, one source file was split to allow for posting. ...tad ] This is yet another mandelbrot for amiga, but this one is quite fast. It also has a cute graphical user interface. Freely distributable. Source included. Author: Hannu Helminen dm@stekt.oulu.fi #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 4)." # Contents: iff.library.uu mandel.doc mandel.doc.uu mandel.info.uu # mandel.uu source source/gui.asm.ae source/iff.i source/macros.i # source/mbrot.i source/pipe.asm # Wrapped by tadguy@ab20 on Mon Feb 18 17:25:39 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'iff.library.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'iff.library.uu'\" else echo shar: Extracting \"'iff.library.uu'\" \(3334 characters\) sed "s/^X//" >'iff.library.uu' <<'END_OF_FILE' Xbegin 666 iff.library XM```#\P`````````#``````````(```(>``````````````/I```"'F`$0TA7M XM(4/Z`(`L>``$3J[^:"Q`3J[_Q"(`0?H`/B0(=BU.KO_0(DXL>``$3J[^8G`%Q XM3G5*_````#0```((@!`)`0```$X```!:````E&EF9BYL:6)R87)Y`$E&1B`Q; XM-BXQ("@P,2U$96,M,3DX."D@8GD@0VAR:7-T:6%N($$N(%=E8F5R"@!D;W,N) XM;&EB<F%R>0`````Z````I````.0```$0```!/@```8H```'"```"!@```@@`G XM``+````"W@```P0```,4```#6```!&(```1Z```(`@``""````(0_____^``? XM``@)`,````H```!.X```#@8`T```%``0T```%@`!P```&````%H`````2.?`9 XMQ"I`*T@`(D/Z_VQP'TZN_=@K0``H0>T`+""(6)!"J``$(4@`"$S?(P-.=4CGJ XM0.8J3F$`!GYF/'`6<@$L>``$3J[_.DJ`9RPD0)/)3J[^VB5```Y"J@`20>T`+ XM+")*3J[_"E)M`"`(K0`#`"8@#4S?9P).=7``8/9(YP`F*DYA``8R9Q0D0")`+ XM+'@`!$ZN_P1P%B)*3J[_+DS?9`!P`%-N`"!F"@@N``,`)F<"80).=4CG(`8J_ XM3DIM`"!G"@CM``,`)G``8"HB32QX``1.KO\$(FT`*$ZN_F(D+0`B<``B33`M& XM`!"2P-!M`!).KO\N(`),WV`$3G5(YSXF?/]@!DCG/B8L`"I.3^__]'H`(@@DR XM/````^TL;0`H3J[_XB@`9@1Z$&!P(@0D#W8,3J[_U@R71D]236<$>A-@4"(&) XM:@YR`0RO.%-66``(9@)R`W0,)B\`!-2#(`(L>``$3J[_.DJ`9@1Z$F`D)$`D_ XMPB($)`I0@EB"+&T`*$ZN_]9*@&H$>A%@"$S7``=(T@`'(@0L;0`H3J[_W"`%M XM9P9A``5$8`9A``4R(`I/[P`,3-]D?$YU2.<`!BI.(`EG"B`A+'@`!$ZN_RYA1 XM``4.3-]@`$YU(&D`!$/I``S1R;"19Q0B*0`$4H$(@0``0_$8"+/(9>J3R2`)* XM3G4@/$)-2$1A`/_29P)0@$YU2.<X("1((#Q#34%080#_O$J`9RH@0%B(*!B)8 XM_``#2,0@!%.$<@!T`'8`$A@4&!88Z4GH2X)"@D,TP5',_^A,WP0<3G5(YS\^' XM3^_^M"I.)D@H20RL24Q"30`(9P9P&&```+)A`/^,9@9P&6```*8D0$SK`/\`S XM"$C7`/]T`!0J``BT*P`%8P9P&V```(@@/$)/1%DB3&$`_S1F!'`:8'0@0%B(T XM(!A)\`@`$"H`"F8&3?H`<F`.#````6<$<!Q@5$WZ`&A^``PJ``$`"5?'>``X# XM$MA\``_FC`B$``!Z`#H3?``\*P`"4T930C8")$\@!")23I;;FE'+__9*!V<(Z XM(`1#[P`@3I:QS&0$4<[_WF$``\)@!&$``\A/[P%,3-]\_$YU$MA1R/_\3G4_B XM`G(`$AAK"A+84T!1R?_Z8`Q$`108$L)30%')__I*0&[@-!].=4CG.`!R`'0`U XM-A$X*0`"80``"$S?`!Q.=4CG/SZ>_`$,*DXL""9)*$\_00$$/T(!!@B#```_9 XM0P$(/T0!"BC\1D]237X\*,<H_$E,0DTH_$)-2$1^%"C'&4``"D(L``E"+``+V XM0FP`#$*L``0Y?`H+``X9:P`%``CG2SB#.4,`$#E$``(Y1``2+WQ#04U'`"A^% XM!"]'`"P@3&$``UH(K``'``IG!`C```LO0``P+WS____X`#@@"F=$0^\`-"+\C XM0TU!4'`!<@$2*P`%XV@T`,#\``-4@`)`__PBP%-",!KI2!-```+H2`(``/`32 XM0``!Z$@"``#P$H!625'*_^(B!B0\```#[BQM`"A.KO_B+@!G``"P("\`.-&OS XM``0B!R0/=D36KP`X+&T`*$ZN_]!*@&L``)!*+``*9@9A``"B8`1A``$D2H!KV XM>B8`5H/&/`#\+T,!`->O``26@$J#9Q0B!T*G)`\L;0`H3J[_T%B/2H!K4"('X XM=`!V_RQM`"A.KO^^(@<D#W8\UJ\`."QM`"A.KO_02H!K+$'O`/P@O$)/1%DBS XM!R0(=@@L;0`H3J[_T$J`:Q`B!RQM`"A.KO_<80`!R&`2(@=G""QM`"A.KO_</ XM<!1A``'`WOP!#$S??/Q.=4CG/CA)[P`DGOP`)#`L`0AR`!(K``7`P3(L`0K`U XMP2]``"`R+`$&PM-P`#`L`032@$'K``@B3W`')!C4@2+"4<C_^'8`>`!Z`#H3# XM%BL`!39#-BP!"#@L`0I31%-+)$\L"R(')!(L;0`H3J[_T$J`:P[;FE'._^Q1V XMS/_D("\`(-[\`"1,WQQ\3G5(YSXX2>\`))[\`21"KP$@,BP!!L+3<``P+`$$_ XMTH!!ZP`((D]P!R08U($BPE'(__AV`'@`>@`Z$Q8K``4F0S8L`0@X+`$*4T13; XMBR1/+`LP`R!20^\`(&$VT:\!("('0^\`("0)+P,F`"QM`"A.KO_0)A]*@&L.X XMVYI1SO_44<S_S"`O`2#>_`$D3-\<?$YU2.<P,$7P``!V`&%,L'P``VT05(,2` XM$-#`4T!$`!+`$L%@*B9(=`!2`FL04HBQRFP,82:P?``#;>Y@`G1_($O6@E*#B XM4T(2PA+84<K__+'*;;H@`TS?#`Q.=2\(<`$2&+(89@RP?`"`;`920+'*;?`@J XM7TYUD\DL>``$3J[^VB(`("T`+"!`(!!G"+*H``YF]"`(3G5AWF<$0J@`$G`!8 XM3G4O`B0`8<YG!"%"`!(D'W``3G5(YP`&*DYANDJ`9PX@*``20J@`$DS?8`!.3 XM=7#_8/8O"B1)(#Q#04U'80#ZLF<(($`@*``(8!@B2F$`^LAG$"!`81`,*``&) XM``AM!`C```LD7TYU<``,*``$``AN"@Q0`8!O!`C```\,:`$8``)M!`C```).Y XM=0`````#[````!D`````````-@```#H```!"````1@```$H```"8````G```S XM`*````"D````J````*P```"P````M````+@```"\````P````,0```#(````\ XMS````-````#4````V````-P```#N```!"`````````/R```#Z@````````/RR X,```#ZP````````/RC X`` Xend Xsize 2352 END_OF_FILE if test 3334 -ne `wc -c <'iff.library.uu'`; then echo shar: \"'iff.library.uu'\" unpacked with wrong size! fi # end of 'iff.library.uu' fi if test -f 'mandel.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mandel.doc'\" else echo shar: Extracting \"'mandel.doc'\" \(14242 characters\) sed "s/^X//" >'mandel.doc' <<'END_OF_FILE' X X----------------------------------------------------------------------------- X X Version history X X v0.50 First numbered version. Most bugs I've found are fixed. X v0.60 Workbench interface added. X v1.00 First public release. X X----------------------------------------------------------------------------- X X BUGS X X - Not very smart handling of AUTOCRAWL X - If invoked with too little memory, 56 bytes will mysteriously X disappear X - Window title bar may get trashed if moved too high X X----------------------------------------------------------------------------- X X Copying licence: X X This program is copyright 1990 by Hannu Helminen. However, you may X freely distribute it provided that this package is left intact and no X charge is taken. You are also licenced to use parts of the code in your X programs provided that X X 1) New versions are clearly marked as such X 2) You give credit where credit is due (me) X X I will not guarantee anything about this program. It seems quite X reliable to me, though. X X----------------------------------------------------------------------------- X X Package includes: X X mandel Main proggie X mandel.doc This file X iff.library Used when saving pictures. Place in libs: directory. X X source/gui.asm Graphical user interface X source/brot.asm This takes care of the actual drawing X source/pipe.asm A package of fifo routines, as needed by brot X X source/macros.i General macros X source/mbrot.i brot-specific include file, including my own structure X source/iff.i Needed to use iff.library X X----------------------------------------------------------------------------- X X X X OVERVIEW X X There are quite a few Mandelbrot programs for Amiga, perhaps to the X extent that I should have named my program "yamb" instead of "mandel". X (Yet Another MandelBrot) X X I hope though that there are enough reasons to satisfy the existence of X this program. Namely, it was designed with three goals in mind: first, X speed. Secondly, speed. And last but not least, speed. X X Of course, most Mandelbrot programs draw nice-looking pictures, if only X you can wait for ten minutes or even more for them to be complete. X Increase the number of iterations and you will have to wait for hours, X unless you are one of those lucky guys with a 60-MHz 68040-equipped X A3000's... The main reason for that slowness is the floating point math X most programs use. X X The first version of this program was quite ugly: coded partly in X Basic, partly in 68000 machine language, it was a mess of a code. Its X optimized core used 32-bit fixed point math but was still relatively X slow. After writing it, I forgot it for years. X X Then someone in alt.fractals told about a new algorithm called contour X crawling that produces fast images of Mandelbrot set. I adopted the X idea and rewrote the program to use it, this time completely in machine X language. It turned out to be fast (within minutes); that is because it X does not need to iterate all pixels. And the drawing was visually X attractive, so it suits well for interactive use. X X After imploying a 16-bit iteration for lower resolutions, I found I had X written the fastest Mandelbrot program I had ever seen. (Ok, forget X that little transputer...) I cannot pretend to have seen even all Amiga X ones, though, so there may already be a faster one. If so, please tell X me that all this code was in vain. X X X X USAGE X X Start from CLI by typing `mandel', or click the icon in Workbench. The X program will then immediately begin to draw the Mandelbrot set. Various X options exists, however, to modify how, where and when the image will X be drawn. Use CTRL-C to abort a draw in progress, and another CTRL-C to X abort the program. X X From CLI: Enter the options after the command, e.g. X X mandel -i1000 -j -sram:Picture X X Type `mandel ?' to see a brief summary of the options. X X From Workbench: Select mandel icon, select `info' from the `Workbench' X menu and enter options in the TOOL TYPES array, e.g. X X I=100 X FLAGS=j X SAVE=ram:Picture X X X The options are listed below. # is a shorthand for a number. X X CLI WorkBench X X -x# X=# These determine the point (z = x + yi) in the complex X -y# Y=# plane you will see right in the center of your monitor. X They are in the range -4 to 4. X X -m# M=# This is a logarithmic quantity that represents the X magnification of the image. 2^(-m) determines the X distance between two lo-res pixels in complex plane. X Default is 6, maximum is 29. X X -i# I=# Iterations. Self-explanatory? No? The greater the X number, the more accurate pictures mandel will draw. X For further information, refer to APPENDIX A. X The maximum number of iterations is 65535. X X -jx# JX=# These determine a constant (c = jx + jy i) that is used X -jy# JY=# when iterating a Julia set. Each c will produce a X different set. See APPENDIX A. These, too, have a range X from -4 to 4. X X -sname SAVE=name This determines a filename for saved pictures. X X If mandel is operated interactively (g flag is set), X the user can save pictures by pressing CTRL S. The X standard filename is `mandel.picture', but can be X overridden by this option. If many pictures are saved, X a number is added at the end to distinguish the files X from each other. X X If mandel is in non-interactive use (x flag is set), X this options specifies that the image must be saved X upon exit, and determines the name for it. Note: if X this option does not exists, no image will be saved. X X -l FLAGS=l Normally mandel determines itself whether it should use X -h FLAGS=h 16 or 32 bits of precision, as denoded by (a). There X -a FLAGS=a are certain, limited circumstances when you need to set X the precision explicitely to 16 (l) or 32 (h) bits. In X particular, Julia sets that have a complex structure X near origo may produce inaccurate images unless 32 bits X are used. X X -c FLAGS=c You can enable (c) or disable (w) the crawling if you X -w FLAGS=w wish, default is (p), which means to crawl whenever X -p FLAGS=p possible. Currently non-connected Julia sets are not X crawled because they *could* produce inaccurate X results. Future versions might add more sanity checks X to this. X X -x FLAGS=x When the (x) flag is used, the programs exits X -g FLAGS=g immediately after the first image is drawn. Default is X (g) which means to prompt the user with a X requester-like window (See below). The x flag is X intented for non-interactive use, for example X continuous zooms that are achieved via scripts. X X -m FLAGS=m Whether you want to draw Julia (j) or Mandelbrot (m) X -j FLAGS=j sets. See APPENDIX A. X X X NOTE: In Workbench, if multiple FLAGS are used, they *must* be X combined in a single FLAGS entry, e.g. X X FLAGS=apgx X X In CLI, flags *must not* be combined, so do not try `-apgx' X instead of `-a -p -g -x'. X X X X GRAPHICAL USER INTERFACE X X When mandel is invoked with the -g option, after the first image is X drawn, a requester-like window will pop in. A grid will also be X displayed, indicating the centerpoint and borders of the next image. X Screen title bar will show coordinates of the mouse position. X X You can then set the centerpoint by clicking in the image or entering a X value in the string gadgets labeled `X' and `Y'. Magnification and X iterations can be set in the gadgets `M' and `I', respectively. X X A new quantity can be set using the `Z' gadget: zooming. As its name X implies, this determines which portion of the current image will be X shown in the next one. This is a signed number that will be added to X magnification, thus set z=0 for 100% zooming, z=1 for 50%, z=-1 for X 200% etc. This can also be set by pressing the right mouse button and X moving it over the image. X X The program draws images in one of three modes: ZOOM, DRAW and RESET. X ZOOM means zooming to the size shown by the grid. DRAW will take the X numbers from the requester and draw according to them (used for example X to redraw the same picture, or to quickly enter a very deep X magnification level) X X As setting zoom in DRAW mode makes as little sense as setting X magnification in ZOOM mode, these modifications will immediately change X the draw mode, too. The third mode, RESET, will return the X magnification and centerpoint to normal. The mode can be changed by X respective gadgets. X X Clicking MAND or JULIA will change the set type to Mandelbrot or Julia. X The magical constant c for Julia sets (See APPENDIX A) can be set as X follows: Make sure you are in MAND mode. Then select the point c by X either clicking on the image or entering it in the X/Y-gadgets. Then X click JULIA gadget and select whatever centerpoint you wish your image X to have. X X Alas, window close gadget only removes the requester window, screen X title and grid in order to let you view the image. Normal operation is X resumed by pressing either mouse button. X X Quit the program by double-clicking the QUIT gadget or draw a new set X by double-clicking either in the image or one of the gadgets ZOOM, X DRAW, RESET. X X X X AUTHOR X X Hannu "The DM" Helminen X Perkkio X 85900 REISJARVI X FINLAND X X dm@stekt.oulu.fi (for the next few years, I hope) X X X X THANKS X X Thanks to X X T. Saarinen for extensive beta-testing X X 'LS' Hautamaki for not-so-extensive testing X X J.M. Jarre who was in great help during long nights of programming X X B. Mandelbrot who invented the set that carries his name X X X X X X APPENDIX A: A mathematical definition of Mandelbrot and Julia sets. X X X A point z = x + y i is said to be in the Mandelbrot set if X 0 X X 2 X z = z + c does not go to +-oo (infinity) when n -> oo X n+1 n X ____ X where c = z . ( i = ,/ -1 so z, c are complex numbers ) X 0 X X X A point z = x + y i is said to be in the Julia set c if X 0 X X 2 X z = z + c does not -> oo when n -> oo X n+1 n X X X NOTE: There are an infinite number of Julia sets, each corresponding to X one value of c. c is also related to a point in the Mandelbrot set. X (originally the Mandelbrot set was the set of c's that will produce a X *connected* Julia set.) Note also that the Julia set looks similar to X the surroundings of that point in the Mandelbrot set from which the X Julia set was derived. X X Becausese these calculations would take a considerable amount of time X with any contemporary computer, they are approximated by a finite X number of iterations (typically 100 or more). An usual test for a point X z going to infinity is to test whether or not | z | < 2. And since few X computers can calculate with complex numbers, we can rewrite the X equation (z -> z**2 + c) in a C-ish style program using only real X variables z = x + y i: X X i = max_iterations; X X while (i > 0 && x**2 + y**2 < 4) { X X tmpx = x**2 - y**2 + x0; X tmpy = 2 x y + y0; X x = tmpx; X y = tmpy; X i--; X X } X X if (i=0) inside (); else outside(); X X If you are a first-time user of any Mandelbrot program, I might suggest X that you study the edge of the black area, because that is where the X most interesting parts of the set are. (The coloured areas do not X actually belong to the set, and the interior is, of course, all X black...) X X X X APPENDIX B: The contour crawling method X X This method works by finding an edge of an area of uniform color, then X crawling its way through the edge until starting point is reached. The X interior is then assumed to be of same color. This is of course true X for the ideal set, but because the image is sampled to a finite set of X pixels, errors *may* occur. (Haven't seen one so far, though.) X X Non-connected Julia sets must not be crawled in the strict mathematical X sense. However, most of the time mandel produces correct pictures even X then. So it is quite safe to use the -c option of mandel. X X X X APPENDIX C: Compilation X X Assuming you have a68k v2.61 or higher and blink, the following X steps are needed to compile a working executable of mandel: X X a68k gui.asm -q500 -iinclude: X a68k brot.asm -q200 -iinclude: X a68k pipe.asm -q100 X blink gui.o brot.o pipe.o to mandel lib amiga.lib X X where include: is assigned to standard assembly include directory. X X NOTE: if you have a68k v2.42, gadget arrow images will not be marked as X going to CHIP ram. This will give you strange-looking images unless: X X 0) You have only CHIP ram (poor chap) X X 1) You use FastMemFirst, FixHunk, ATOM etc. kludges X X 2) Modify the code: allocate some CHIP-mem and CopyMem() the images X there. This is a kludge, however. X X 3) Get v2.62 somewhere (e.g. disk 314 from Fred Fish's X wonderful collection.) X X X X APPENDIX D: How to use brot with your own programs? X X Just pass the address of a valid mb-structure in a0 (see mbrot.i), X `jsr MandelBrot' and `XREF MandelBrot' somewhere in your code and X (b)link your proggie with brot.o and pipe.o. The RastPort you use X *must* have valid TmpRas and AreaInfo structures attached to it. X AreaInfo should carry as many vectors as possible (no more than 6553, X however, since that seems to be a maximum) X X END_OF_FILE if test 14242 -ne `wc -c <'mandel.doc'`; then echo shar: \"'mandel.doc'\" unpacked with wrong size! fi # end of 'mandel.doc' fi if test -f 'mandel.doc.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mandel.doc.uu'\" else echo shar: Extracting \"'mandel.doc.uu'\" \(585 characters\) sed "s/^X//" >'mandel.doc.uu' <<'END_OF_FILE' Xbegin 666 mandel.doc.info XMXQ```0``````?@`1`#``%@`$``,``0#!--@`````````````````````````> XM````!,,`P4(8`````````#(````&```````````````````````P`!8``@#$F XM2C@#``````#_______^#_______)_____W_)G)1.1AG)*92U2S/)*92TRSF#A XMG,RV2X/_____________________________________________________$ XM_________S___QG$LP___G*<93___Y&<XS___CC$\9__________________- XM______\```````!\```````V`````(`V8VNQN>8VUFM*M,PVUFM+-,9\8S-)9 XMM'P``````````````````P``````#8``````!H``````,P`````&68`````,D XMR````,`><.8[3/`S(8UCFL`!@&YC',```<<[#F``````````````````````P X9```````3<WES.G5T:6QI=&EE<R]M;W)E`,<[L X`` Xend Xsize 385 END_OF_FILE if test 585 -ne `wc -c <'mandel.doc.uu'`; then echo shar: \"'mandel.doc.uu'\" unpacked with wrong size! fi # end of 'mandel.doc.uu' fi if test -f 'mandel.info.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mandel.info.uu'\" else echo shar: Extracting \"'mandel.info.uu'\" \(951 characters\) sed "s/^X//" >'mandel.info.uu' <<'END_OF_FILE' Xbegin 666 mandel.info XMXQ```0``````(``/`#``%@`&``,``0#!W_@`PW4X````````````````````[ XM`````_X`P3*8`````/___]0````$```````````````````````P`!8``@`!J XM83`#``````#____________________________________^?______^?___M XM__^`!?____\``?____X``/___P0``/___````?___````?___P0``/____X`N XM`/____^``?____^`!?_____^?______^?___________________________< XM______\````````````````````!```````#P``````'X`````#_^0````'_> XM_X``!`?__X``!____X``#____X``?____P``?____P``#____X``!____X``@ XM!`?__X````'__X````#_^0`````'X``````#P``````!````````````````K XM`````````#``%@`"``%B.`,``````/___________________________[__/ XM_____Y_^_____P?=_____X8"'_____@#_____0:W____T`/_____X`/_____V XMX`?_____X`?_____X`O____P8+____[@'_____Q`,?____\UX/____]__W__K XM_____?___________________P```````````````````````````?``````< XM`___@````___P````___\```'___^```?___````___X````___@```!__^`8 XM```'__^````?__\```#___\``!____````___^````/__\````#__\``````8 X5!X````````````````````````$`( X`` Xend Xsize 651 END_OF_FILE if test 951 -ne `wc -c <'mandel.info.uu'`; then echo shar: \"'mandel.info.uu'\" unpacked with wrong size! fi # end of 'mandel.info.uu' fi if test -f 'mandel.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mandel.uu'\" else echo shar: Extracting \"'mandel.uu'\" \(22144 characters\) sed "s/^X//" >'mandel.uu' <<'END_OF_FILE' Xbegin 666 mandel XM```#\P`````````&``````````4```?[```$'D```/(```!'````/```````: XM``/I```'^TCG?_XF2#8`D\DL>0````1.KO[:($`@*`"L9RI",S#_0KD````H# XM($#1R-'((&@`$-'(T<@0&"/(````+$B`,\````!.8#I'Z`!<($M.KOZ`($M.G XMKOZ,(\`````H($`@*``D9QP@0"00(&@`!"/(````+'+_4D%*&&;Z,\$```!.1 XM0_D```P6<`!.KOW8(\`````(9AI(YP$&+CP``X`'+'@`!$ZN_Y1,WV"`8``'= XM.DJY````*&<2(@(L>0````A.KO^"+'D````$0_D```P$<`!.KOW8(\`````$) XM9AI(YP$&+CP``X`$+'@`!$ZN_Y1,WV"`8``&4$/Y```+\W``3J[]V"/`````] XM`&8:2.<!!BX\``.``BQX``1.KO^43-]@@&``!AA!^0``##MP`4/Y````RG(`/ XM3J[^1$H`9QI(YP$&+CP`!(`5+'@`!$ZN_Y1,WV"`8``%W$7Y````\A5\``0`* XM"$(J``E"J@`*%7P````.</\3_``!```!%4ZN_K9*`&L`!:050``/D\E.KO[:) XM)4``$$'J`!0@B%B00J@`!"%(``A!^0```,HA2@`.0KD````<($M)^0```'PY9 XM?````!PY?````!XY?`$_`"`Y?`#_`"(3_``````!%3E\`&0`*!E\`!@`+!/\D XM``$```$4$_P``````19".0```1=">0```$Q".0```1@C_``!``````!((_P`Q XM!@``````."/\`````````$`C_`````````!$*7P``````!0I?```````&$/YR XM```64BE)`"0Y?``>`"I*N0```"AG``"2+'D````$0_D```PB<`!.KOW82H!FC XM#!/\``@```$58```[BQ`('D````L3J[_LDJ`9@H3_``)```!%6`\*D!%^0``1 XM"<9'^0``">9*$V<D(&T`-B)+3J[_H"):2H!G!B!`3I%G!DH;9OQ@X!/\``H`P XM``$5($U.KO^F(DXL>0````1.KOYB2CD```$59@`$0&!^1_D```Q()CP```+UG XM2A!G;@P0`#]G4A/\``(```$51_D```Z()CP```"U$!AG4`P``"!G]@P```AGZ XM\`P``"UF*!`80_D```FX1?D```F$#```864$!```("I:L!EF!DZ59P9@QDH1K XM9O`L>0````A.KO_$(@`D"TZN_]!@``.L0?D```$`+'D````$3J[_.A/\``,`8 XM``$5(\`````09P`#BB1`(\H```$Z(\H```%J1^H`+$'Y```!'$ZN_S03_``$7 XM```!%2/`````%&<``U(@0"1H`#(HBB!+0_D```#`<"`L>0````!.KO]`(#P`, XM`"@`<@(D`2QY````!$ZN_SH3_``%```!%2/`````(&<``P!'^0```*HB0"!+M XM(`(L>0````!.KOXL)4L`#"`\``!__7(`+'D````$3J[_.B/`````)&<``K1'\ XM^0```+(@2R)`(#P``!F9+'D`````3J[^YB5+`!`3_``````!%2`Y````."(\? XM`!T``+"!8P(@`2(\``4``+"!9`(@`2/`````.&$`$.(C^0```#@````\($Q.G XMN0``&@!*.0```11G``(.80`&A$'Y```!3"QY````!$ZN_S0CP````!AG``($4 XM'CD```$6$_P``@```18@.0```$!A``F,(#D```!$80`)RB`Y````.&$`"K`P2 XM+``H80`*<B`Y````2&$`"?83QP```19A``L*80`+:F$`#WYF``&(+'D````$U XM#((```(`9E(@>0```!@CZ``$```!3$ZN_[A"N0```!@@>0```!!P`$ZN_N9AU XM``*X80`/0&8``5X,@@````AF\&$``SX@>0```!!P`2QY````!$ZN_N9@`/\TS XM#((````09@9A``X.8(H,@@````AF*`Q#`&AF$&$`#0AG`/]V:P`!`&```)H,& XM0P!I9@QA``N$9@``[F``_UP,0@`@9B(R+0`F,`$"0$``9PQA``7,9@``T&``& XM_T9A``:$:V)F``#"#((```0`9E(,0P`A9DP(!``#9T8@>0```!@CZ``$```!. XM3$ZN_[A"N0```!@@>0```!!P`$ZN_N9A``'L80`36&$``GX@>0```!!P`2QY% XM````!$ZN_N9@`/YT8`#^UB!Y````&"QY````!"/H``0```%,3J[_N&$``:X,O XM.0`````!%F<L##D``0```19G+B/\``8``````#@C_`````````!`(_P`````P XM````1&``_=8@.0```$C1N0```#A@`/W&('D````8+'D````$3J[_N&$``51** XM.0```11F#$HY```!&&<$80`2L"!Y````$'``+'D````$3J[^YB)Y````)"`\G XM``!__2QY````!$ZN_RXB>0```"`@/```*``L>0````1.KO\N+'D````$('D`A XM```43J[_N"!Y````$$ZN_[Y!^0```/(0*``/+'D````$3J[^L$/Y````RDZNQ XM_CXB>0````!.KOYB(GD````$3J[^8DHY```!%6=X+'D````(2KD````H9QA!^ XM^0``#STB""0\```#[DZN_^)*@&=48`1.KO_$*``B!"0Y````+#8Y````3DC#D XM3J[_T"($$#D```$52(#E2$'Y```*`"!P```D"';_4H-*&&;Z3J[_T$JY````? XM*&<,<F1.KO\Z(@1.KO_<+'D````$(GD````(3J[^8B`Y````*&<*3J[_?")`6 XM3J[^AG``$#D```$59P)P%$S??_Y.=4HY```!%V<``(1(Y^#B+'D````$('D`@ XM```4)&@`,C`Y````4#(Y````4B)Y````7&%<,#D```!4,CD```!6(GD```!@U XM84@P.0```%0R.0```%HB>0```&AA-#`Y````6#(Y````5B)Y````9&$@,#D`N XM``!8,CD```!:(GD```!L80Q".0```1=,WT<'3G4@2B0)9P1.KO^43G5A`/]DX XM##D``````19G'`PY``(```$69P`"="`Y````.+"Y````/&8``F1(Y__B(#D`% XM``!P(CD```!T$_P``0```1<CP````'`CP0```'0D/```@`#0@M*"*``J`4A`S XM2$%T`"QY````!$/Y```(`"!Y````%"1H`#*P;``<;`PP+``<0_D```B@4D*PE XM;``@;PPP+``@0_D```C44D*R;``>;`PR+``>0_D```D(4D*R;``B;PPR+``B[ XM0_D```D\4D(,0@`!8PA"N0```%Q@&#/`````4#/!````4B!*(\D```!<3J[_4 XME#`L`""0;``<)CD```!(##D``0```19F`G8`!H,``0``:P`!:'(`=`!A``PJE XM+``P+``BD&P`'F$`#!PN`"0$)@64AI:'V(;:ATA"2$-(1$A%?``P+``<,BP`$ XM(+1`;`8T``C&``"T06X``2*X06\&.`$(Q@`!N$!M``$2,"P`'C(L`"*V0&P&> XM-@`(Q@`"MD%N``#ZND%O!CH!",8``[I`;0``ZC/"````5#/#````5C/$````^ XM6#/%````6DCG`!Q#^0``"#!'^0``"&A)^0``"$Q+^0``"(0(!@``9PA#^0``X XM"*`F20@&``%G"$GY```(U"I,"`8``F<(0_D```D(*$D(!@`#9PA'^0``"3PJ5 XM2T8&$`8"```%9@*3R1`&`@``"68"E\L0!@(```9F`IG,`@8`"F8"F\T@2B/)& XM````8&<(,`(R`TZN_Y0B2R!*(\D```!H9P@P`C(%3J[_E"),($HCR0```&1GF XM"#`$,@-.KO^4(DT@2B/)````;&<(,`0R!4ZN_Y1,WS@`8!A"N0```&!"N0``+ XM`&A"N0```&1"N0```&Q,WT?_3G5(Y_@`)"P`#"@Y````0)BL``0,@@`!``!E" XM!N**XHQ@\HC"(`1"0(#"2$`P!"0L`!`H+``(F+D```!$#((``0``90;BBN*,% XM8/*(PB($0D&"PDA!,@1(0$A!(\````!P(\$```!T3-\`'TYU`D&/_R)-80`(Z XM\B!I`"(@4`Q!``!G+`Q!``%G2@Q!``)G``"$#$$``V=@80`+@F<$2A!G!#`LW XM`"@Y0``H80`#E&!^80`*W&<$2A!G!B`Y````0"/`````0&$`_SQA``)R80#\B XMIF!:80`*N&<$2A!G!B`Y````1"/`````1&$`_QAA``*680#\@F`V80`$[F<$= XM2A!G!B`Y````2"/`````2&$``KY@&F$`"Y!G!$H09P8@.0```#@CP````#AAI XM``-*<`!.=3`!`D`@`&=.`D&/_Q`\```,00`%9PX0/``!#$$`!F<$$#P``A/`8 XM```!%F$``_(@.0```#`B.0```#0D"B8+(\H````P(\L````T3J[_FDI`9P)P; XM_TYU,`$"0!``9QX"08__"*P``@`L#$$`"&<&".P``@`L80`#1'``3G4,00`*3 XM9B@@.0```#`B.0```#0D"B8+(\H````P(\L````T3J[_FDI`9P)P`4YU`D&/2 XM_WX`/@%A``"$0_D```#*2$<@/``&&H!*1V<6(#P``8:@#$<`"64*(#P``$X@8 XM/CS__E)'2$<S?``)`!PC?```````("-``"0CR0```!PL>0````1.KOXR80`'^ XM,&8*#$(``V>B?@!@`GX!(GD````<3J[^(")Y````'$ZN_B9"N0```!Q*1TYUL XM<`!.=4CGP``P!W(!`D!__PQ```!F+"`L``Q(04I':@1$@$2!T;D```!`T[D`I XM``!P(#D```!`80``H&$`^M1@``"2#$```68J("P`$$A!2D=J!$2`1('1N0``_ XM`$23N0```'0@.0```$1A``"V80#ZHF!@#$```F8>(#P``!F92D=J`D2`T;D`@ XM```X(#D````X80`!?F`\#$```V8>(#P``!F92D=J`D2`T;D```!((#D```!(: XM80``LF`8#$``!&822D=J`D2!TVP`*#`L`"AA``$*3-\``TYU2.?A\B1Y````\ XM&$?Y```!?`@L``(`+&8$*4``%"0`($HB2RQY````!$ZN_QS!0B!K`"(@4"XL3 XM``QA``580A!A``%*3-]/ATYU2.?A\B1Y````&$?Y```!X`@L``(`+&8$*4``9 XM&"0`($HB2RQY````!$ZN_QS!0B!K`"(@4"XL`!!A``400A!A``$"3-]/ATYU- XM2.?@\B1Y````&$?Y```#^"0`($HB2RQY````!$ZN_QS!0B!K`"(@4!(\`"M*/ XM@&H&1(`2/``M$,%A``0P0A!A``"Z##D``0```19F'"`Y````/"/`````.&%.` XM$_P``````19A``$>8`1A`/D^3-]/!TYU2.?@\B1Y````&$?Y```$V"0`($HBH XM2RQY````!$ZN_QS!0B!K`"(@4&$``Y9"$&%83-]/!TYU2.?@\B1Y````&$?YJ XM```#&"0`($HB2RQY````!$ZN_QS!0B!K`"(@4&$``YA"$&$B##D``````19F) XM#A/\``$```$680``EF`$80#XMDS?3P=.=2!K`")":``(0F@`#"!*(DL@`DZNM XM_]8@2R)*E<IP`4ZN_E!.=4CGX/8L>0````0@>0```!@J2$/Y```&/"9)<`).' XMKOY$0_D```9H""P``@`L9PX`:0"```P":_]_``Q@#`)I_W\`#`!K`(``#"!-B XM(DN5RG("3J[^2B!+(DUP`DZN_E!,WV\'3G5(Y^#V+'D````$('D````8*DA#2 XM^0``!;@F27`#3J[^1$7Y```%Y$/Y```&$!(Y```!%@P!``%G&@P!``)G*`!K) XM`(``#`)J_W\`#`)I_W\`#&`F`FO_?P`,`&H`@``,`FG_?P`,8!(":_]_``P"* XM:O]_``P`:0"```P@32)+E<IR`TZN_DH@2R)-<`-.KOY03-]O!V$`]Y).=1`8H XM#```*V<(#```+6<(4XAA``:L3G5A``:F9P)$@$YU0CD```$680#_0#`%,@9(C XMYP8`2$5(1D)%0D9A``$<3-\`8#/%````>#/&````>DCGP`!A``-63-\``V8`` XM`/H,@@```!!GW$CGY@!(Y\``D'D```!X:@)$0))Y````>FH"1$%F!$I`9S0T) XM+``@E&P`'$A`0D"`PF@"</\T+``BE&P`'DA!0D&"PF@"<O^P06(",`%A``18; XM(\````!(3-\``SHY````>#PY````>MI`W$%(14A&0D5"1B(L``PD+``0XHGB; XMBN*-2D5K`G(`XHY*1FL"=``CQ0```'`CQ@```'1(14A&80`!LMJ!G((CQ0``- XM`$`CQ@```$0@!6$`_#H@!F$`_'P@.0```$AA`/RZ3-\`9TJ"9AYA``)(9AH,Y XM@@```!!F$#/%````>#/&````>F``_PQP`$YU+P`CQ0```'`CQ@```'1(14A&( XM80`!3"/%````0"/&````1"`%80#[V"`&80#\&F$`]@8@'TYU(#D````P(CD`\ XM```T)`HF"R/*````,"/+````-$ZN_YI*0&92,\4```!X,\8```!Z80`!ZF90. XM#((````09^9(YP8`2$5(1D)%0D9A`/]^3-\`8$J"9AQA``&:9BH,@@```!!F1 XM#C/%````>#/&````>F#$<`!@$DA%2$9"14)&80#_2G`!8`)P_TYU2.?@`#(\- XM)Q!T``*```#__X#!9@1*0F<(!@``,!#`=`%(0$C!@OP`"F;@2D)F!!#\`#!,I XMWP`'3G5(Y^``(@!(0&&^$/P`+G0#POP`"DA!!@$`,!#!2$%1RO_P2D%J!&$`X XM`.A,WP`'3G5A-D'Y```+V2`%+BP`#&%8$/P`("`&+BP`$&%,0A@@>0```!!!# XMZ`!40_D```EP<%!R`$ZN_RA.=2\`,`7*[``,2$5"1<#L``[:@-JL``0P!LSL/ XM`!!(1D)&P.P`$MR`1(;<K``((!].=4CG_G`4/``K2H!J!A0\`"U$@!#"%#P`1 XM,`R`(````&4*!(`@````4@)@[A#"$/P`+D/Y````!$7Y````1"9\_____W(`O XM%#P`,"89*!HJ`"P!G(2;@VL((`4B!E("8.Z^BR9I__QB!!#"8-H,`@`U90)A( XM!DS?#G].=4CG@(`0(`P``"YG^`P``#EF!A"\`#!@[%(03-\!`4YU2.?`P&$DX XM9AQ*@F86",``#"QY````!$ZN_L((```,9@1@XG``3-\#`TYU+'D````$=``@D XM>0```!0@:`!6$"@`#P'"3J[^C$J`9CP@>0```!@@"&<2(&@`5A`H``\!PDZN= XM_HQ*@&8@(GD````<(`EG$B!I``X0*``/`<).KOXL2H!F0L%"3G4B0"0I`!0VK XM*0`8."D`&BII`!PZ*0`@/"D`(B1I`"0F:0`H3J[^A@R"```$`&8B#$,`,V8<[ XM"`0``V<6<`%.=2)Y````'$ZN_B9"N0```!QT`W``3G4P/"``<@!T`"8Y````I XM.&%>*4``#"E``!`P+``<T&P`("(Y````0"0L``SB2&0&)@+B@Y*#2D!G!I*"Q XM4T!@]BE!``0P+``>T&P`(B(Y````1"0L`!#B2&0&)@+B@]*#2D!G!M*"4T!@B XM]BE!``A.=4CG>(!(0TI#9PKB2.)1XE)30V#T2$-!^0```(`X&.-#9!3`Q,+$3 XMQ,1(0M1!2$'30$A`>`#11$I#9N)(0#`!3-\!'DYU2.=X@'(`2D!K!E)!XTA@E XM]DA!0?D```"@=`_C2388>``X`$A$QL#8@V4,``$``4A$:@)21#`$4<K_XB`!% XM3-\!'DYU2.?`PBQY````!"!Y````%"!H`%9.KOZ,2H!G*B)`#*D```0``!1FH XM&@QI`#,`&&82,"D`&@@```-G"$ZN_H9P_V`03J[^AG``<@!.KO[."```#$S?' XM0P-.=4CG?'`F2'(`=@`D/(````!#^0````!%^0```$`0&`P``"MG^`P``"UFQ XM!@C#``]@[`P``"YF!@C#``=@X`P``#!E,@P``#EB+`C#``"UB4H#:PQ#^0``3 XM``!%^0```$`$```Q:[A(@"@1*A+4A=.$4<C_^F"H4XAA3DI#:@)$@2`!"`,`1 XM`&8"($M,WPX^3G5(YV!`(DAT`'``$A@,`0`P918,`0`Y8A`$`0`P2('`_``*( XMT$%T`6#B4XAA#$I"9@(@24S?`@9.=2\`$!@,```@9_A3B"`?3G5A`/\H9PHC^ XMP````$!P`4YU0CD```$4<`%.=6$`_PYG""/`````1'`!3G5A%F<*(\`````XS XM<`%.=0BL``(`+'`!3G5(YV!@)$EA`/]N2$`,&``N9C)R`'0`0D`4&%)`#`(`: XM,&4&#`(`.6/P0^C__U-`9Q(4(00"`#!(03("2$&"_``*8.HP`5.(80#_9@R`+ XM`!T``&($<@%@!'``(DI,WP8&3G5A`/\49P8Y0``H<`%.=0BL``,`+`BL````] XM+'`!3G4(K``#`"P([````"QP`4YU".P``P`L<`%.=0BL``0`+`CL``$`+'`!D XM3G4(K``$`"P(K``!`"QP`4YU".P`!``L<`%.=1/\``$```$43G40&`P``&%EV XM!`0``"`,``!89@YA`/X(9P8I0``4<`%.=0P``%EF#F$`_?1G!BE``!AP`4YU2 XM4X@([``"`"QP`4YU0_D```]D$!AG"@P``"!G!!+`8/)3B$(1(\D``!!T80#^Q XM@A`\``$3P````1A.=1`89V0,``!A900$```@2'K_\`P``$QG`/\<#```2&<`Q XM_R0,``!!9P#_+`P``$-G`/\N#```5V<`_S8,``!09P#_/@P``$=G`/]`#```I XM2F<`_W@,``!-9P#^9`P``%AG`/XT6(]P`$YU<`%.=4'Y```/9"0(('D``!!T+ XM,#D```!,9P9A`/F<0A!2>0```$Q#^0``#"]P`"QY````!$ZN_=A*@&=6+$`@U XM>0```!`D:``P)&H`!")H`%@@0C(L`!PT+``>-BP`(#@L`"+F25Y#YDN609A"- XM4D-21'`!3J[_N"0`(DXL>0````1.KOYB2H)F$A/\``<```$58`@3_``&```!6 XM%4YU2.?__BA(+'D````$0_D``!_%<`!.KOW82H!G``",+$`(+``#`"QG(`CL% XM````+`RL``0````,91`,K``$````$&4&"*P````L""P`!``L9R@([``!`"P(< XM+``"`"QG&BPL`!0N+``8-BP`*&$``PY*0VL&"*P``0`L*E0B33`\``!.KOZJ1 XM(DTP+``<,BP`'C0L`"`V+``B3J[^S@@L``$`+&<$85Y@`F$2(DXL>0````1.V XMKOYB3-]__TYU."P`'#HL`!X\!#XL`"`V+``B80`![&$``]YF*E)$N$=E\&$`W XM`=Q21;I#8AIA``'280`#Q&804T2X1F+P80`!PE)%ND-CS$YU,"P`'@!`P`!(2 XM0#`L`!QA#F8&80`$PF;V80`$R$YU2.?_`#@`2$`Z``)%/_\V``)#P`!A``$HX XM2D!J1#P$/@4T`R)-(`0B!6$``WIA1")-(`0B!6$``Y)A``-69B:\1&;JOD5F> XMYK1#9N(B32`$(@5.KO["(DU.KOZJ(DUA``0D<`!@"")-80`$&G#_3-\`_TYU( XM2.>C`&$``2(T`#P$/@5A?&$``1:T0&<P2D-J!`I#0``&0T``:@0*0T``2D!KN XM%$J`:Q`P!8!#"D#``$A`,`1A``0,.`8Z!V`^/`0^!6%>80``V+1`9QY*0&L4B XM2H!K$#`%@$,*0,``2$`P!&$``^`X!CH'8!)*0VH$"D-```9#P`!J!`I#0`!,0 XMWP#%3G5*0VL."`,`#F8$4T5.=5-$3G4(`P`.9@121$YU4D5.=4I#:PX(`P`.Z XM9@121$YU4T5.=0@#``YF!%)%3G531$YU+P-V`%-$81Z&0%1$81B&0%-$4T5A` XM$(9`5$5A"H9`4T4P`R8?3G5(YT#`<`"X;``<922X;``@8AZZ;``>91BZ;``BH XM8A(B32`$(@5.KO["#$```&8"</],WP,"3G5(YW/`=`!P_[AL`!QE``"DN&P`R XM(&(``)RZ;``>90``E+IL`")B``",-@0\`\SL``Q(1CP\``#&[``.W(/<K``$_ XM:P0T/$``(DT@!"(%3J[^P@C``!\,0```9E@V!3X#SNP`$$A'/CP``,;L`!+>W XM@T2'WJP`"#8L`"A50VH"=@!A0`Q#__]G$`*#``#__X;L`"I(0U1#8`0V/``!A XM,`,B34ZN_JHP!#(%(DU.KOZ\,`,(@``?#$```6<"@$),WP/.3G4(+````"QGN XM``"T2.?O`"@&*@<(+``"`"QG""PL`!0N+``8(`1A3B0!T(!I0"`%8430@&DX, XM(`'0@FDRE('4AFDN(`0B!6$PTH%I)-*':2`J`2@"4<O_SB`$81HD`="`:0P@9 XM!6$0T(!I!-*":`)20TS?`/=.=2(`2.<\`"0`:@)$@$J!:@1$@4:"-@'&P'H=F XMZJM(0#@!R,!Z#>JLUH1(03@!R,#GC-:$2$#"P.JIUH%*@FH"1(,B`TS?`#Q.Y XM=4CG[P!(1DA'.`8Z!P@L``(`+&<(/"P`%#XL`!@P!#(`P\#G@4A!-`'00&E&, XM,`4R`,/`YX%(0=!`:3@P`=!":3*40=1&:2XP!#(%P\#G@4A!TD%I(-)':1PZ# XM`3@"4<O_OLO%R<38A6D*V(38A&D$V(1H`E)#3-\`]TYU2.>`@"`L`"1G!"!`0 XM3I!,WP$!3G4SP```'\`SP0``'\(SP```'[PSP0``'[Y".0``'\1.KO\$3G5(\ XMYS``849*.0``'\1J+#0`-@$P.0``'[PR.0``'[XSP```'\`SP0``'\).KO[^0 XM,`(R`T(Y```?Q&$2,\```!^\,\$``!^^3-\`#$YU-#D``!_`-CD``!_"E$"67 XM04I":@1$0D1#2D-J!$1"1$-*0F<::@C60F8@=`1@'DI#9PBV0F84=`)@$G0!N XM8`Y*0V<$=`-@!G0`8`)T_Q8Y```?Q&<22@)G%+8"9Q`3_`#_```?Q$YU$\(`V XM`!_$3G4O"3`Y```?O#(Y```?ODZN_OXB7TZN_OA.=0```````````&=R87!HJ XM:6-S+FQI8G)A<GD`3G%.^0```&A.^0````!.^0```+1P80```^P````7````I XM````&@X``![&```>S```'M(``![8```>W@``'O```![\```?`@``'P@``!\.U XM```?'```'R0``!\J```?-@``'SP``!^"```?E```'YP``!^F```?K```!(P`F XM``)"````/`````$```""````R@```/@```$F```"8@```IH```*@```"[```\ XM`PH```,N```#-````VH```..```#E````YX```/$```$H```!20```7P```&Z XM0```!UP```>:```(_```"18```DH```).@``"4P```HX```*/@``"D0```I*< XM```*5@``"F0```IR```*@```#F8```ZN```.]@``#V@```^>```0'```$"H`2 XM`!"````0C@``$)0``!.(```3K@``%!X``!0D```5Y```%B0``!:\```6P@``U XM%OX``!<$```8T```&.@``!EJ```9<@``&8P```$%`````P```"(````X````M XM0````%@```!N````?````(X```"P````N@```-8```$$```!+@```5@```%V4 XM```!I````:X```&V```!U@```>H```'R```!^````?X```($```"#@```A@`H XM``(B```"+````E(```)T```"@````I````+(```"X````P0```-4```#<```M XM`WP```."```#J@```[````/,```#[````_(```/\```$"```!"@```0R```$( XM0@``!%(```18```$=@``!(````2$```$D@``!*8```2P```$N@``!,(```3(^ XM```$T@``!-P```3N```$^```!0X```4<```%+@``!30```58```%8```!>@`S XM``7Z```&````!A@```8@```&,@``!C@```90```&6@``!F8```9P```&>@``7 XM!H0```:*```&E```!IH```:H```&L```!KP```;$```&S@``!N0```;Z```') XM````!PH```<4```'*```!S(```<\```'1@``!TX```=4```'?```!X(```>0W XM```'L@``!\P```?6```'Z@``!_H```@(```(#@``"!@```@>```()```""P`G XM``@R```(.```"$````A&```(3```"%0```A:```(8```"&@```AN```(=```L XM"'P```B:```(I```"*X```BT```(P@``",@```C0```(U@``"-P```CV```)_ XM`@``"5H```EB```):```"7````F"```)B@``"AP```HB```**```"BX```JR0 XM```*Q@``"MH```KN```+!```"PH```L0```+%@``"RH```M6```+>@``"X``R XM``O8```+W@``"_P```P"```,(```#"8```P\```,0@``#'0```Q^```,A```O XM#(X```R4```,T@``#-@```SB```,Z```#08```U$```-9@``#7````UZ```-& XMJ```#:X```VT```-V@``#>````WF```."```#@X```XL```.,@``#F````Y^1 XM```.J```#L8```[P```/`@``#S````\X```//@``#T@```]B```/=```#Y@`> XM``^J```/Q@``#]```!`.```0%```$'(``!!X```0F@``$28``!%(```13@``2 XM$70``!%^```1O```$<8``!',```1^@``$@```!(2```2&```$BH``!)*```2J XM4```$F```!)F```2=```$GH``!*4```2F@``$J0``!*J```2N```$KX``!+XT XM```2_@``$Z0``!2X```4T```%.P``!5*```55```%6@``!6````5J@``%EX`$ XM`!>(```7D@``%Z(``!>P```8B```&/8``!EX```9A@``&:0``!GP```9^@``_ XM``,````$```?X```'^8``!_:`````````_(```/J```$'B`````#,S,S`%'K` XMA0`(,28``-&W```4^````A@````U````!0``````````````````````````, XM````````````````,S,S,QZX4>OI>-3]%UCB&;6(XVC>]!:]K^4U>5YCN(R)W XM<%]!#;YO[`%?U_X`(R\S``.$N```6A(```D!M0771>K!]27ZA/T^_I[_3_^G) XM_]3_ZO_U__K__?____]J"C!P%RP+5@6;`LH!9`"R`%D`+``6``L`!@`#``$`, XM`0B(```/``\P#V`/D`_`#_`,\`GP!O`#\`#P`/,`]@#Y`/P`_P#/`)\`;P`_" XM``\##P8/"0\,#P\/#PP/"0\&#P,``````4`!```%`0(````/````````"\X`3 XM``````````%``0`!`@``!!@``QL```````````````````````````#_____[ XM_____P`/`!0`%`"4`%`!`@``!F```P`*```!?`````````````````````#_) XM_________P`/```!X``G``T`:``(`````P`$```"1`````````',````````G XM`:A```````````N2``````````T````````````````````````````````!4 XM`@``__8```````````O$`````````F@`)P`:`&@`"`````,`!````D0`````N XM```",`````````(,0`$````````+GP`````````-````````````````````X XM`````````````0(``/_V```````````+Q@````#__O_^`0``!0```E0`````? XM``````!K````:P`+````"P````````*4``H`"P`+``8`!``#``$```;`````V XM```````````````````!`````````L``"@`>``L`!@`$``,``0``!M0`````> XM````````````````@`$````````"[``#`!(`!@`+``0``P`!```&Z```````+ XM``````````````"```````````,8`!8`$@`&``L`!``#``$```;\````````> XM`````````````````````````Z``%P`J`"@`"`````,`!````WP````````#= XM:`````````-$0`(````````+K``````````)````````````````````````Q XM`````````0(``/_N```````````+R`````#__O_^`0``!0```XP`````````2 XM```K````*P`+````"P````````/,``X`*``&``L`!``#``$```;H````````X XM```````````````"`````````_@`0@`H``8`"P`$``,``0``!OP`````````" XM````````````@`(````````$@``7`#<`*``(```$`P`$```$7`````````1([ XM````````!"1``P````````NU``````````D`````````````````````````T XM```````!`@``_^X```````````O*`````/_^__X!```%```$;```````````U XM`"L````K``L````+````````!*P`#@`U``8`"P`$``,``0``!N@`````````F XM``````````````,````````$V`!"`#4`!@`+``0``P`!```&_```````````Q XM``````````"``P````````5@`!L`1``@``@```0#``0```4\````````!2@`H XM```````%!$`$````````"[X`````````!@``````````````````````````< XM``````$"``#_Z@``````````"\P`````__[__@$```4```5,````````````4 XM(P```",`"P````L````````%C``2`$(`!@`+``0``P`!```&Z```````````( XM``````````"`!`````````6X`#X`0@`&``L`!``#``$```;\````````````< XM```````````$````````!>0`20`H`"``#``&``(``0``!Q````<D````````5 XM````````(`4````````&$`!)`#4`(``,``8``@`!```'.```!TP`````````` XM```````@!@````````8\`$D`0@`@``P`!@`"``$```=@```'=```````````* XM`````"`'````````!F@`:@`H`!,`&0`&``(``0``![````?$````````````> XM````$`@````````&E`!^`"@`$P`9``8``@`!```'B```!YP`````````````_ XM```0"0```````````&H`0@`G``P`!@`#``$```?8```'[```````````````4 XM```*````````````"P`&``4``````P`````````````+``8`!0```!@#````4 XM``````````8`"P`%````,`,`````````````!@`+``4```!<`P``````````^ XM```@``P`!0```(@!`````````````"``#``%````B`,`````````````(``,B XM``4```#H`0`````````````@``P`!0```.@#`````````````"``#``%```!\ XM2`$`````````````(``,``4```%(`P`````````````3`!D`!0```G`!````J XM`````````!,`&0`%```"<`,`````````````$P`9``4```&H`0``````````! XM```3`!D`!0```:@#`````````````"<`#``%```#.`$`````````````)P`,$ XM``4```,X`P```````````!\``@(```@0```(&/_V````"@```````!\``@(`` XM``@H````````__8````*`````!\``@,```A```````````H```````H`````O XM```?``(#```(7``````````*`````/_V````````'P`"`P``"'@```````#_J XM]@``````"@```````!\``@,```B4````````__8`````__8````````?``(#. XM```(L```"+P`!0`%```````%__L`````'P`"`@``",P```````$````*````' XM````'P`"`P``".0```CP__L`!0````#_^__[`````!\``@(```D``````/__E XM``#_]@```````!\``@,```D8```))/_[``4```````4`!0`````?``("```)< XM-``````````!````"@`````?``(#```)3```"5C_^__[```````%__L`````, XM'P`"`@``"6@```````#__P``__8!`@$```$``0````````O9````````%X``( XM`!>:```7J@``&"(``!@P```80```&%```!A:```8:@``&'H``!B$```8C@``\ XM&,Y864U)3$A!0U=01TI3````%X```!>:```7J@``&"(``!B@```8M```&/P`K XM`!C.6`!9`$T`20!*6`!*60!&3$%'4P!3059%``````HL```*+0``"DX```IO, XM```*B```"J$```J^```*_P``"RT```M,```+=0`Z($-O=6QD(&YO="!A;&QOG XM8V%T92!S:6=N86P@8FET"@`Z($5R<F]R(&EN(&-O;6UA;F0@;&EN92!O<'1IB XM;VYS"@`Z($-O=6QD(&YO="!O<&5N('-C<F5E;@H`.B!#;W5L9"!N;W0@;W!E^ XM;B!W:6YD;W<*`#H@0V]U;&0@;F]T(&%L;&]C871E(&UE;6]R>0H`.B!9;W4@1 XM;F5E9"!I9F8N;&EB<F%R>2!I;B!Y;W5R(&QI8G,Z(&1I<F5C=&]R>2!T;R!S) XM879E('!I8W1U<F5S"@`Z(&EF9BYL:6)R87)Y(')E='5R;F5D(&5R<F]R(&]N7 XM('-A=F4@8V]M;6%N9`H`.B!#;W5L9"!N;W0@;W!E;B!I8V]N+FQI8G)A<GD*B XM`#H@0V]U;&0@;F]T(&-H96-K(&EC;VX@*&9O<B!T;V]L('1Y<&5S*0H`.B!%] XM<G)O<B!I;B!T;V]L='EP92!O<'1I;VYS"@`K,"XP,#`P,#`P,#``*S`N,#`PD XM,#`P,#`P`#`P+C`P,#`P`"LP+C`P,#`P`#`P,#`P`'@`>0!-`%H`:0!-86YD( XM96Q"<F]T`"LP+C`P,#`P,#`P,"`K,"XP,#`P,#`P,#``9W)A<&AI8W,N;&EBP XM<F%R>0!I;G1U:71I;VXN;&EB<F%R>0!D;W,N;&EB<F%R>0!I8V]N+FQI8G)A. XM<GD`:69F+FQI8G)A<GD`=&EM97(N9&5V:6-E``I4:&ES('!R;V=R86T@9')A3 XM=W,@=&AE($UA;F1E;&)R;W0@86YD($IU;&EA('-E=',@*'H@+3X@>K(@*R!CA XM*0IU<VEN9R!A('-M87)T(&-O;G1O=7(M8W)A=VQI;F<@;65T:&]D(&%N9"!F) XM87-T(#,R+6)I="!F:7AE9"!P;VEN="!M871H+@I!=71H;W(Z($AA;FYU(")TR XM:&4@1$TB($AE;&UI;F5N"@I&<F5E;'D@9&ES=')I8G5T86)L92!V97)S:6]N? XM(#$N,#`*"B!Z(#T@('@@*R`@>2!I(&ES('1H92!C96YT97)P;VEN="!O9B!T@ XM:&4@<V5T"B!C(#T@:G@@*R!J>2!I(&ES(&$@8V]N<W1A;G0@;VYL>2!F;W(@L XM2G5L:6$@<V5T<PH@;2!I<R!M86=N:69I8V%T:6]N+"`U("T@,CD@*&QO9R!S6 XM8V%L92D*(&D@:7,@=&AE(&UA>&EM=6T@;G5M8F5R(&]F(&ET97)A=&EO;G,LX XM(&D@/#T@-C4U,S4*4V%V92!P:6-T=7)E<R!T;R!F:6QE;F%M92!B>2!#5%),F XM+5,*"D9L86=S.B`M;"!L;W<@("`@+6@@:&EG:"`@+6$@875T;R!P<F5C:7-IQ XM;VX*("`@("`@("UC(&-R87=L("`M=R!W86QK("`M<"!C<F%W;"!I9B!P;W-SM XM:6)L90H@("`@("`@+7@@97AI="`@("UG('5S92!'54D*("`@("`@("UJ(&IUK XM;&EA("`M;2!M86YD96QB<F]T"@I5<V%G93H@;6%N9&5L("!O<B`@;6%N9&5L^ XM(#\*("`@;W(@(&UA;F1E;"![+7@;6S1M>!M;,&T@+7D;6S1M>1M;,&T@+6T;[ XM6S1M;1M;,&T@+6D;6S1M:1M;,&T@+6PM:"UA("UC+7<M<"`M>"UG("UJ+6T*& XM("`@("`@("`@("`@("`@+6IX&ULT;6IX&ULP;2`M:GD;6S1M:GD;6S!M("USX XM&ULT;3QF:6QE;F%M93X;6S!M?0IC;VXZ,"\U,"\V-#`O,3`P+R!M86YD96P@3 XM(&)Y($1-("`Q.3DP(`!M86YD96PN<&EC='5R90``````````````````````Z XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````#W(```/L````%0````````F$```)B```"8P`X XM``F0```)E```"9@```F<```)H```":0```FH```)K```";````FT```)Q@``] XM"<H```G.```)T@``"=8```G:```)W@``">(```!I`````0```10```%>```!X XM?````8X```&6```!G@```:@```'8```!X````?(```'Z```"`@```@P```(\B XM```"3````F@```)Z```"E````J8```+````"T@```NP```+^```#&````RH`^ XM``,R```#.@```T0```-T```#A````Z````.R```#S````]X```/X```$"@``( XM!!(```0:```$)```!%0```1D```$@```!)(```2L```$O@``!-@```3J```$V XM\@``!/H```4$```%-```!40```5@```%<@``!8P```6>```%N```!<H```7.J XM```%Y```!?8```7Z```&$```!B(```8F```&/```!DX```92```&:```!GH`I XM``9^```&I@``!JH```@(```(#```""````@X```(5```"'````B,```(J```$ XM"*P```C$```(W```".````CX```)$```"10```DL```)1```"4@```E@```)' XM?```"@````H$```*"```"@P```H0```*%```"A@```H<```*(```"B0```HH& XM```0=````!`````"```&R@``!MX```;R```'!@``!QH```<N```'0@``!U8`+ XM``=J```'?@``!Y(```>F```'N@``!\X```?B```']@````````/R0``#Z@``: XM`/($``H`$0`@@$!`_^````0`#@`?`#^```#_X$I`((`1``H`!````#^`'P`.4 XM``0````$``P`%``D`$0`A`!$`"0`%``,``0```````@`&``X`'@`.``8``@`( XM`````(``P`"@`)``B`"$`(@`D`"@`,``@```````0`!@`'``>`!P`&``0```, XM``````````````````/\<B4"!!57`F0E50>4154'E'(E`F0```($```#_```Z XM````````______________P#C=K\`^JH_`/:JO@#NJKX`XW:_`/___P#___\G XM`___________````````!_P```0$9G5^A%551`16=42$55=$!&551(0``$?\A XM``!`@```?X``````________^`/___@#F8J``ZJJ@`.IBH`#JJB``YJJ@`/_[ XM_X`#__^`?___@'______``````````````.<9S=S#%1$(I1F)B``5!0@`%=GT XM(I0```,,```#G```````````______________QCF,B,\ZN[W6N9V=__J^O?+ XM_ZB8W6O___SS___\8___________```````````KLP``.JJ``"NJ@``JJH``T XM*JL`````````````````````````$````&P```""```&@@``"0(``#@$```)K XM`@``!H(```""````;````!```````````````````/__X`#__^``U$S@`,55> XM8`#456``U55@`-54X`#__^``___@`/__X`#__^``_^_@`/^3X`#_?>``^7W@F XM`/;]X`#'^^``]OW@`/E]X`#_?>``_Y/@`/_OX`#__^``___@`/__X```````4 XM`````!5%P``514``%47``%5%0`!W=4````````````````````````>````(C XM0```&"````0@```$$````A````((```!!@```(0```!X````````````````/ XM````````___@`/__X`#JNB``ZKJ@`.JZ(`"JNJ``B(J@`/__X`#__^``___@8 XM`/__X`#X?^``][_@`.??X`#[W^``^^_@`/WOX`#]]^``_OG@`/][X`#_A^``L XM___@`/__X`#__^``___@``````````````````````_P`#JN``@0`"JD``I0? XM`"JD``F0`"JD``F0`#ND``I0``@```@0``````_P`````````````````/__D XM___^`/_____^`/____`.`,51__`.`-5;__`.`-5;__`.`-5;__`.`,1;__`.G XM`/?___`.`/____`.`/_____^`/_____^`````_(```/K````1P```_(```/IM XM````/$CGX.(D`"!Y````Z"`(9@IA*F<B(\@```#L#&@$```&90@D2&$69PXD\ XMB#`H``8A@@``6&@`!DS?1P=.=2`\```$`'(`+'@`!$ZN_SI*@&<6($!"D#%\@ XM``@`!#%\``@`!B/(````Z$YU2.=@XB1Y````['#_(@IG-EAJ``0P*@`$)#(`) XM_+!J``9F(")*)%$@/```!``L>``$3J[_+B/*````[&8&0KD```#H(`)R_TS?: XM1P9.=4CGP.(D>0```.PL>``$(DH@"F<.)%$@/```!`!.KO\N8.Q"N0```.A", XMN0```.Q,WT<#3G4``````````````^P````)````!`````@````6````8@``9 XJ`&X```">````I@```+H```#8````W@````````/R```#Z@````````/RY X`` Xend Xsize 15792 END_OF_FILE if test 22144 -ne `wc -c <'mandel.uu'`; then echo shar: \"'mandel.uu'\" unpacked with wrong size! fi # end of 'mandel.uu' fi if test ! -d 'source' ; then echo shar: Creating directory \"'source'\" mkdir 'source' fi if test -f 'source/gui.asm.ae' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/gui.asm.ae'\" else echo shar: Extracting \"'source/gui.asm.ae'\" \(546 characters\) sed "s/^X//" >'source/gui.asm.ae' <<'END_OF_FILE' X* This one for RightButton. Xtmpx ds.w 1 Xtmpy ds.w 1 X X* Huh! My very own structure. XMyMandelBrot: X ds.b mb_SIZEOF XMyTmpRas: ds.b tr_SIZEOF XMyAreaInfo: ds.b ai_SIZEOF XIOreq: ds.b IOTV_SIZE XMsgPort: ds.b MP_SIZE X Xinter: ds.b 1 ; Boolean: are we interactive Xerror: ds.b 1 ; general error code Xmethod: ds.b 1 ; method of zooming (ZOOM, REDRAW or RESET) Xisdrawn: dc.b 1 ; Boolean: is grid drawn? Xsaveit: dc.b 1 ; Boolean: do we have to save picture? X end X END_OF_FILE if test 546 -ne `wc -c <'source/gui.asm.ae'`; then echo shar: \"'source/gui.asm.ae'\" unpacked with wrong size! fi # end of 'source/gui.asm.ae' fi if test -f 'source/iff.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/iff.i'\" else echo shar: Extracting \"'source/iff.i'\" \(1448 characters\) sed "s/^X//" >'source/iff.i' <<'END_OF_FILE' X* Assembler include file for the iff library X* by Christian A. Weber, Zurich/Switzerland V16.1 01-Dec-88 X X XREF _IFFBase X XIFFVERSION: EQU 16 X XIFF: MACRO X movea.l _IFFBase,a6 X jsr %1(a6) X ENDM X X X*************** L I B R A R Y - O F F S E T S **************************** X XOpenIFF: equ -30 ; (filename) (A0) XCloseIFF: equ -36 ; (ifffile) (A1) XFindChunk: equ -42 ; (ifffile,chunkname) (A1,D0) XGetBMHD: equ -48 ; (ifffile) (A1) XGetColorTab: equ -54 ; (ifffile,colortable) (A1/A0) XDecodePic: equ -60 ; (ifffile,bitmap) (A1/A0) XSaveBitMap: equ -66 ; (name,bmap,ctab,crmd) (A0-A2,D0) XSaveClip: equ -72 ; (name,bmap,ctab,crmd,x,y,w,h) (A0-A2,D0-D4) XIffError: equ -78 ; () () XGetViewModes: equ -84 ; (ifffile) (A1) XNewOpenIFF: equ -90 ; (filename,memtype) (A0,D0) X X X*************** F E H L E R - C O D E S ********************************** X XIFF_BADTASK: equ -1 ; Fehler-Abfrage von falschem Task! X XIFF_CANTOPENFILE: equ 16 ; Datei existiert nicht XIFF_READERROR: equ 17 ; Fehler beim Einlesen der Datei XIFF_NOMEM: equ 18 ; zuwenig Speicher um Datei zu laden XIFF_NOTIFF: equ 19 ; Datei ist kein IFF-File XIFF_WRITEERROR: equ 20 ; Fehler beim schreiben X XIFF_NOILBM: equ 24 ; kein ILBM-File XIFF_NOBMHD: equ 25 ; BMHD-Chunk nicht gefunden XIFF_NOBODY: equ 26 ; BODY-Chunk nicht gefunden XIFF_TOOMANYPLANES: equ 27 ; Bild hat mehr Planes als BitMap XIFF_UNKNOWNCOMPRESSION: equ 28 ; Unbekannter Kompressions-Typ X END_OF_FILE if test 1448 -ne `wc -c <'source/iff.i'`; then echo shar: \"'source/iff.i'\" unpacked with wrong size! fi # end of 'source/iff.i' fi if test -f 'source/macros.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/macros.i'\" else echo shar: Extracting \"'source/macros.i'\" \(349 characters\) sed "s/^X//" >'source/macros.i' <<'END_OF_FILE' X* \0 should be the suffix. Hope this works. X Xbhs macro X bcc.\0 \1 X endm X Xblo macro X bcs.\0 \1 X endm X Xpush macro X movem.l \1,-(sp) X endm X Xpull macro X movem.l (sp)+,\1 X endm X XBase macro X move.l _\1Base,a6 X endm X XCall macro X xref _LVO\1 X jsr _LVO\1(a6) X endm X END_OF_FILE if test 349 -ne `wc -c <'source/macros.i'`; then echo shar: \"'source/macros.i'\" unpacked with wrong size! fi # end of 'source/macros.i' fi if test -f 'source/mbrot.i' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/mbrot.i'\" else echo shar: Extracting \"'source/mbrot.i'\" \(1659 characters\) sed "s/^X//" >'source/mbrot.i' <<'END_OF_FILE' X X IFND EXEC_TYPES_I X INCLUDE "exec/types.i" X ENDC X X* signed 32-bit fixed point, scaled by 2^29 (range -4 .. 4) XFIXED MACRO X LONG \1 X ENDM X X STRUCTURE mbrot,0 X X* Rastport image will be drawn to X APTR mb_RastPort X X* These define z = x0 + y0 i that will be mapped to upper lefthand X* corner of Rastport (that is (0,0) NOT (x1,y1)) X FIXED mb_x0 X FIXED mb_y0 X X* Deltas in both directions, i.e. how much to increment z for each pixel X FIXED mb_dx X FIXED mb_dy X X* If this is actually a Julia set, this is the c = jx + jy i X FIXED mb_jx X FIXED mb_jy X X* (x1,y1)-(x2,y2) rectangle within rastport to fill with mandelbrot X UWORD mb_x1 X UWORD mb_y1 X UWORD mb_x2 X UWORD mb_y2 X X* Pointer to a call-back procedure (or NULL) that should return X* with Z clear (result nonzero) if some kind of break condition is met X APTR mb_break X X UWORD mb_i ; max. number of iterations, 0<= i <=65533 X UWORD mb_colors ; number of colors used in colouring OUTSIDE X UBYTE mb_flags ; see below X BYTE mb_pad X LABEL mb_SIZEOF X X* Flags for mb_flags X BITDEF MB,HIGH,0 ; 32 bit precision enabled X BITDEF MB,CRAWL,1 ; crawling enabled X BITDEF MB,JULIA,2 ; this is actually a Julia set X BITDEF MB,AUTOPREC,3 ; automatic precision (16/32 bits, ignore HIGH) X BITDEF MB,AUTOCRAWL,4 ; automatic crawling when adequate, ign. CRAWL X X* Limit for AUTOPREC XDELTALIMIT EQU $40000 X X* PIXEL color defines XCLEAR EQU 0 ; the color (x1,y1)-(x2,y2) is cleared to XINTERIOR EQU 1 ; inside the set XFIRST EQU 2 ; outside the set X END_OF_FILE if test 1659 -ne `wc -c <'source/mbrot.i'`; then echo shar: \"'source/mbrot.i'\" unpacked with wrong size! fi # end of 'source/mbrot.i' fi if test -f 'source/pipe.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/pipe.asm'\" else echo shar: Extracting \"'source/pipe.asm'\" \(4315 characters\) sed "s/^X//" >'source/pipe.asm' <<'END_OF_FILE' X X* This file: pipe v0.01 X X* (c) 1990 by The DM X X XDEF f_push X XDEF f_pull X XDEF f_clear X X XREF _LVOAllocMem X XREF _LVOFreeMem X XMAXDEPTH EQU 254 X X SECTION pipe,CODE X X* error = f_push(value) X* Z d0 X X* Will push d0.l to dynamically allocated linked list of memory X* that represents pipe (fifo). Pointers _Head and _Tail should be X* initialized to 0 before first call. Define MAXDEPTH to # of X* longwords to be stored in one chunk of memory. X* If Z is set (result zero) no memory was left. X X* All registers are preserved. X X* Structure: X* X* LONG next ; points to previous structure X* WORD used ; offset from beginning, points to 1st used long. X* WORD free ; offset from beginning, points to 1st free long. X* LONG data [0] ; 1st longword of data X* ... X* LONG data [MAXDEPTH-1] X X Xf_push: X movem.l a0-a2/a6/d0-d2,-(a7) X move.l d0,d2 X move.l _Head,a0 X move.l a0,d0 X bne.s 1$ X X* This is first time we are called so X bsr.s _push1 X beq.s 3$ ; error, no memory X move.l a0,_Tail ; this pointer also needs to be initialized X1$: X cmp.w #(MAXDEPTH*4)+4+2+2,6(a0) X bcs.s 4$ X X* This hunk is full, allocate next one X move.l a0,a2 X bsr.s _push1 X beq.s 3$ ; error, no memory! X move.l a0,(a2) ; link hunks X4$: X move.w 6(a0),d0 ; free X move.l d2,0(a0,d0.w) X addq.w #4,6(a0) ; result is nonzero X3$: ; if brach here, result is zero X movem.l (a7)+,a0-a2/a6/d0-d2 X rts X X* Here we allocate one block. X* nextblock/a0 , Z/error = _push1 () X_push1: X move.l #(MAXDEPTH*4)+4+2+2,d0 X moveq #0,d1 X move.l $4,a6 X jsr _LVOAllocMem(a6) X tst.l d0 X beq.s 2$ X X X move.l d0,a0 X clr.l (a0) ; next field set to zero X move.w #8,4(a0) ; used initialized to 4 (offset) X move.w #8,6(a0) ; free initialized to 8 (offset) X move.l a0,_Head ; result is nonzero X2$: ; if branch here, result is zero X rts ; if error, Z will be set X X X* value = f_pull () X* d0 X X* Will pull d0.l from dynamically allocated linked list of memory X* that represents pipe. If client is trying to pull from empty X* pipe, -1 will be returned and Z will be set. X* Will automagically deallocate any memory. X X* NOTE: if you do not pull everything you have pushed, memory X* will be lost! X Xf_pull: X movem.l a0-a2/a6/d1-d2,-(a7) X move.l _Tail,a2 X moveq #-1,d0 X move.l a2,d1 X beq.s 1$ ; Pipe is empty X X addq.w #4,4(a2) X move.w 4(a2),d0 X move.l -4(a2,d0.w),d2 ; Pipe contains at least one value X* ^^ This is because I just accidentally incremented d0 X X cmp.w 6(a2),d0 ; if used == free, time to free this block X bne.s 2$ X X* Done with this block, deallocate it and move to next X move.l a2,a1 X move.l (a1),a2 X move.l #(MAXDEPTH*4)+4+2+2,d0 X move.l $4,a6 X jsr _LVOFreeMem(a6) X move.l a2,_Tail X bne.s 2$ ; if this was last block, X clr.l _Head ; clear _Head as well. X2$: X move.l d2,d0 X moveq #-1,d1 ; this is surely nonzero X1$: X movem.l (a7)+,a0-a2/a6/d1-d2 X rts X X X* f_clear () X X* Will deallocate our pipe quickly, cleanly and completely in case there X* is no need to process the remaining stuff in the pipe. X Xf_clear: X movem.l a0-a2/a6/d0-d1,-(a7) X move.l _Tail,a2 X move.l $4,a6 X1$: X move.l a2,a1 X move.l a2,d0 X beq.s 2$ X X* This block is valid, deallocate it & back up X move.l (a1),a2 X move.l #(MAXDEPTH*4)+4+2+2,d0 X jsr _LVOFreeMem(a6) X bra.s 1$ X2$: X* Ups! Almost forget: X clr.l _Head X clr.l _Tail X movem.l (a7)+,a0-a2/a6/d0-d1 X rts X X* In order to save space, these are right here in program segment... X X_Head: dc.l 0 ; initialized to zero! X_Tail: dc.l 0 X END END_OF_FILE if test 4315 -ne `wc -c <'source/pipe.asm'`; then echo shar: \"'source/pipe.asm'\" unpacked with wrong size! fi # end of 'source/pipe.asm' fi echo shar: End of archive 1 \(of 4\). cp /dev/null ark1isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.misc.