From 59290ba718b3eef79087978cda3c7bbcb332b4ac Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Sun, 29 May 2022 21:03:47 +0100 Subject: [PATCH] Files --- amigae33a/E_v3.3a/Bin/AGSplit | Bin 0 -> 14936 bytes amigae33a/E_v3.3a/Bin/AProf | Bin 0 -> 61652 bytes amigae33a/E_v3.3a/Bin/Ag2Txt | Bin 0 -> 5296 bytes amigae33a/E_v3.3a/Bin/Ag2Txt13 | Bin 0 -> 4836 bytes amigae33a/E_v3.3a/Bin/ECDEMO | Bin 0 -> 87000 bytes amigae33a/E_v3.3a/Bin/EFindHit | Bin 0 -> 7220 bytes amigae33a/E_v3.3a/Bin/EYacc | Bin 0 -> 59292 bytes amigae33a/E_v3.3a/Bin/FindModule | Bin 0 -> 38556 bytes amigae33a/E_v3.3a/Bin/FindString | Bin 0 -> 33192 bytes amigae33a/E_v3.3a/Bin/FlushCache | Bin 0 -> 1156 bytes amigae33a/E_v3.3a/Bin/Fonts/E.font | Bin 0 -> 524 bytes amigae33a/E_v3.3a/Bin/Fonts/E/11 | Bin 0 -> 3296 bytes amigae33a/E_v3.3a/Bin/Fonts/ELSE.font | Bin 0 -> 264 bytes amigae33a/E_v3.3a/Bin/Fonts/ELSE/11 | Bin 0 -> 3804 bytes amigae33a/E_v3.3a/Bin/Fonts/README | 6 + amigae33a/E_v3.3a/Bin/Fonts/end.font | Bin 0 -> 524 bytes amigae33a/E_v3.3a/Bin/Fonts/end/10 | Bin 0 -> 2708 bytes amigae33a/E_v3.3a/Bin/Fonts/end/11 | Bin 0 -> 3120 bytes amigae33a/E_v3.3a/Bin/Fonts/except.font | Bin 0 -> 784 bytes amigae33a/E_v3.3a/Bin/Fonts/except/11 | Bin 0 -> 3196 bytes amigae33a/E_v3.3a/Bin/Fonts/except/12 | Bin 0 -> 3404 bytes amigae33a/E_v3.3a/Bin/Fonts/except/13 | Bin 0 -> 3548 bytes amigae33a/E_v3.3a/Bin/Iconvert | Bin 0 -> 9020 bytes amigae33a/E_v3.3a/Bin/O2M | Bin 0 -> 4872 bytes amigae33a/E_v3.3a/Bin/README | 4 + amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ced | 37 + amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ged | 101 + .../E_v3.3a/Bin/SetPatch/SetPatch43_6.lha | Bin 0 -> 12977 bytes amigae33a/E_v3.3a/Bin/ShowCache | Bin 0 -> 1240 bytes amigae33a/E_v3.3a/Bin/ShowHunk | Bin 0 -> 21828 bytes amigae33a/E_v3.3a/Bin/ShowModule | Bin 0 -> 8420 bytes amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.guide | 867 + amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.info | Bin 0 -> 548 bytes amigae33a/E_v3.3a/Bin/Tools/AProf/README | 33 + amigae33a/E_v3.3a/Bin/Tools/README | 5 + amigae33a/E_v3.3a/Bin/Tools/efindhit.readme | 197 + amigae33a/E_v3.3a/Bin/Tools/explorer.readme | 249 + amigae33a/E_v3.3a/Bin/build | Bin 0 -> 8120 bytes amigae33a/E_v3.3a/Bin/d | Bin 0 -> 6648 bytes amigae33a/E_v3.3a/Bin/edbg | Bin 0 -> 95032 bytes amigae33a/E_v3.3a/Bin/explorer | Bin 0 -> 59216 bytes amigae33a/E_v3.3a/Bin/patch_v30a_to_v33a | Bin 0 -> 61920 bytes amigae33a/E_v3.3a/Bin/patch_v31a_to_v33a | Bin 0 -> 46764 bytes amigae33a/E_v3.3a/Bin/patch_v32a_to_v33a | Bin 0 -> 37968 bytes amigae33a/E_v3.3a/Bin/pragma2module | Bin 0 -> 3688 bytes .../Docs/BeginnersGuide/Appendices.guide | 497 + .../Docs/BeginnersGuide/BuiltIns.guide | 1002 + .../Docs/BeginnersGuide/Constants.guide | 254 + .../Docs/BeginnersGuide/Contents.guide | 69 + .../Docs/BeginnersGuide/Contents.guide.info | Bin 0 -> 1814 bytes .../E_v3.3a/Docs/BeginnersGuide/EIndex.guide | 294 + .../Docs/BeginnersGuide/EIndex.guide.info | Bin 0 -> 1814 bytes .../Docs/BeginnersGuide/Examples.guide | 1189 + .../Docs/BeginnersGuide/Exceptions.guide | 405 + .../Docs/BeginnersGuide/FloatingPoint.guide | 358 + .../E_v3.3a/Docs/BeginnersGuide/Format.guide | 208 + .../E_v3.3a/Docs/BeginnersGuide/Index.guide | 1024 + .../Docs/BeginnersGuide/Index.guide.info | Bin 0 -> 1814 bytes .../Docs/BeginnersGuide/Introduction.guide | 1681 ++ .../E_v3.3a/Docs/BeginnersGuide/Memory.guide | 557 + .../E_v3.3a/Docs/BeginnersGuide/Modules.guide | 260 + .../Docs/BeginnersGuide/MoreExpressions.guide | 1157 + .../E_v3.3a/Docs/BeginnersGuide/OOE.guide | 929 + .../Docs/BeginnersGuide/Procedures.guide | 306 + .../Docs/BeginnersGuide/Recursion.guide | 423 + .../E_v3.3a/Docs/BeginnersGuide/Types.guide | 1711 ++ amigae33a/E_v3.3a/Docs/E.guide | 6980 ++++++ amigae33a/E_v3.3a/Docs/README | 7 + amigae33a/E_v3.3a/Modules.lha | Bin 0 -> 659318 bytes amigae33a/E_v3.3a/README | 2 + amigae33a/E_v3.3a/Src.lha | Bin 0 -> 2618056 bytes ec33a/ec33a/EC | Bin 0 -> 86996 bytes ec33a/ec33a/ec33a.readme | 19 + ec33a_src/ec33a_src/EC733_v33a.S | 19569 ++++++++++++++++ ec33a_src/ec33a_src/ec33a_src.readme | 127 + ec33a_src/ec33a_src/extra/EC.TXT | 1273 + ec33a_src/ec33a_src/extra/TODO.TXT | 772 + ec33a_src/ec33a_src/extra/prefs/ASM-One.Pref | 43 + ec33a_src/ec33a_src/extra/tools/Iconvert.e | 280 + .../ec33a_src/extra/tools/Pragma2Module.e | 106 + ec33a_src/ec33a_src/extra/tools/ecdebug.e | 405 + ec33a_src/ec33a_src/extra/tools/fc.e | 42 + ec33a_src/ec33a_src/extra/tools/o2m.e | 139 + ec33a_src/ec33a_src/extra/tools/sc.e | 41 + ec33a_src/ec33a_src/extra/tools/smod.e | 313 + 85 files changed, 43941 insertions(+) create mode 100644 amigae33a/E_v3.3a/Bin/AGSplit create mode 100644 amigae33a/E_v3.3a/Bin/AProf create mode 100644 amigae33a/E_v3.3a/Bin/Ag2Txt create mode 100644 amigae33a/E_v3.3a/Bin/Ag2Txt13 create mode 100644 amigae33a/E_v3.3a/Bin/ECDEMO create mode 100644 amigae33a/E_v3.3a/Bin/EFindHit create mode 100644 amigae33a/E_v3.3a/Bin/EYacc create mode 100644 amigae33a/E_v3.3a/Bin/FindModule create mode 100644 amigae33a/E_v3.3a/Bin/FindString create mode 100644 amigae33a/E_v3.3a/Bin/FlushCache create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/E.font create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/E/11 create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/ELSE.font create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/ELSE/11 create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/README create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/end.font create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/end/10 create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/end/11 create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/except.font create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/except/11 create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/except/12 create mode 100644 amigae33a/E_v3.3a/Bin/Fonts/except/13 create mode 100644 amigae33a/E_v3.3a/Bin/Iconvert create mode 100644 amigae33a/E_v3.3a/Bin/O2M create mode 100644 amigae33a/E_v3.3a/Bin/README create mode 100644 amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ced create mode 100644 amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ged create mode 100644 amigae33a/E_v3.3a/Bin/SetPatch/SetPatch43_6.lha create mode 100644 amigae33a/E_v3.3a/Bin/ShowCache create mode 100644 amigae33a/E_v3.3a/Bin/ShowHunk create mode 100644 amigae33a/E_v3.3a/Bin/ShowModule create mode 100644 amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.guide create mode 100644 amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.info create mode 100644 amigae33a/E_v3.3a/Bin/Tools/AProf/README create mode 100644 amigae33a/E_v3.3a/Bin/Tools/README create mode 100644 amigae33a/E_v3.3a/Bin/Tools/efindhit.readme create mode 100644 amigae33a/E_v3.3a/Bin/Tools/explorer.readme create mode 100644 amigae33a/E_v3.3a/Bin/build create mode 100644 amigae33a/E_v3.3a/Bin/d create mode 100644 amigae33a/E_v3.3a/Bin/edbg create mode 100644 amigae33a/E_v3.3a/Bin/explorer create mode 100644 amigae33a/E_v3.3a/Bin/patch_v30a_to_v33a create mode 100644 amigae33a/E_v3.3a/Bin/patch_v31a_to_v33a create mode 100644 amigae33a/E_v3.3a/Bin/patch_v32a_to_v33a create mode 100644 amigae33a/E_v3.3a/Bin/pragma2module create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Appendices.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/BuiltIns.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Constants.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Contents.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Contents.guide.info create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/EIndex.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/EIndex.guide.info create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Examples.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Exceptions.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/FloatingPoint.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Format.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Index.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Index.guide.info create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Introduction.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Memory.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Modules.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/MoreExpressions.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/OOE.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Procedures.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Recursion.guide create mode 100644 amigae33a/E_v3.3a/Docs/BeginnersGuide/Types.guide create mode 100644 amigae33a/E_v3.3a/Docs/E.guide create mode 100644 amigae33a/E_v3.3a/Docs/README create mode 100644 amigae33a/E_v3.3a/Modules.lha create mode 100644 amigae33a/E_v3.3a/README create mode 100644 amigae33a/E_v3.3a/Src.lha create mode 100644 ec33a/ec33a/EC create mode 100644 ec33a/ec33a/ec33a.readme create mode 100644 ec33a_src/ec33a_src/EC733_v33a.S create mode 100644 ec33a_src/ec33a_src/ec33a_src.readme create mode 100644 ec33a_src/ec33a_src/extra/EC.TXT create mode 100644 ec33a_src/ec33a_src/extra/TODO.TXT create mode 100644 ec33a_src/ec33a_src/extra/prefs/ASM-One.Pref create mode 100644 ec33a_src/ec33a_src/extra/tools/Iconvert.e create mode 100644 ec33a_src/ec33a_src/extra/tools/Pragma2Module.e create mode 100644 ec33a_src/ec33a_src/extra/tools/ecdebug.e create mode 100644 ec33a_src/ec33a_src/extra/tools/fc.e create mode 100644 ec33a_src/ec33a_src/extra/tools/o2m.e create mode 100644 ec33a_src/ec33a_src/extra/tools/sc.e create mode 100644 ec33a_src/ec33a_src/extra/tools/smod.e diff --git a/amigae33a/E_v3.3a/Bin/AGSplit b/amigae33a/E_v3.3a/Bin/AGSplit new file mode 100644 index 0000000000000000000000000000000000000000..4f5aaeecc3fb88152ec83f4d4bf941261f377cd0 GIT binary patch literal 14936 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 bJveM`@G{z#EBIm7v#4Dtb^wWg)=&N$#X+JS literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/AProf b/amigae33a/E_v3.3a/Bin/AProf new file mode 100644 index 0000000000000000000000000000000000000000..558bb43b10b856c79df689318e4ceb1959e5f8a9 GIT binary patch literal 61652 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 C4U~rf literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/Ag2Txt13 b/amigae33a/E_v3.3a/Bin/Ag2Txt13 new file mode 100644 index 0000000000000000000000000000000000000000..e5f453e6dc666b47f7b5e764d77f521d5c63e0f0 GIT binary patch literal 4836 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 X4#rK4&oQoHT*3G!2C9ia?mPbnkyW|} literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/ECDEMO b/amigae33a/E_v3.3a/Bin/ECDEMO new file mode 100644 index 0000000000000000000000000000000000000000..ed492a1d57315cdcddc7edb9ecacc8c898ac2b4e GIT binary patch literal 87000 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 literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/EFindHit b/amigae33a/E_v3.3a/Bin/EFindHit new file mode 100644 index 0000000000000000000000000000000000000000..0dfa5a458e6aa25f8b368f8f47c0ff30d2d8844c GIT binary patch literal 7220 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 literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/FindModule b/amigae33a/E_v3.3a/Bin/FindModule new file mode 100644 index 0000000000000000000000000000000000000000..4dc0281544e22fc44ccb9f10c984c099642bb6bc GIT binary patch literal 38556 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 B0ucZJ literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/FindString b/amigae33a/E_v3.3a/Bin/FindString new file mode 100644 index 0000000000000000000000000000000000000000..5a5ccfa6095cce88420ae4ed8336456756ac31a6 GIT binary patch literal 33192 zcmchA4RBP~mFDdqwHncgHkOqRQOS=USrI}=M8mLzVTpeDX={j#1;G?UOg9DuLO_oI z4)Sx3pZQcTvBrMxaL-XOMIrp4%&pqedbMJetRNz-ie|+YQ)BV?!3j7_&sR#uiF2Be{I;DmEN)Qv1}35{$G{aR?6=~C}xkh zow7$dV|Cs3m3W;!QsdjN9w$fMjtB8A9INWKhpdv$XuQp;Rl%wbq}N*|+lS+*1Nyh% ze94>#d9JRruXUE7)Zut5?w_fuvv0On!g(`u)td`tM}oEmtyEGwez5tIuky+p8*4%3sx% z>0Gd@=5i)+TLn;~Dc+pCUIs#3#yu{ zTfXwtt_>~@6+I^@_dW7g;9G6*Ddn^6u3JgVYD+2K_u4YMsye0hpImt0 zK|sFr`oHZge;}cvI3g|gTK?7VMZ&uMv`T(NdaL%Tpl;*OFKjOtIO_qYyfX$W599FNt0lELhcBRgM(>H#06jJnRRg)F? z+0jr2eNoY)3>VkcDdb(KX{vedi>;~*M|sOB6~+<45w(H?KkR`_Ost#Rq+%%fLM`vM z<1W~Fcwd=W?rQP8SAO*_;(BHfOo2c<1Rk-72Vpa}J~J z4i$d*Z|p0qRUe3duBujrtLxaKb_vplt2Fsz)V< z(>BUNx^gkF!kt~xnnmauZ?@JMVjIbuZkyLv-4?D!7uBk=WVq^cng)W$6(_-@`73^ggM{eVe5v}FXTscjzyB{jNK z{UBMLwvzGmqGV;dDLFeGO_ry_$yw?0WNA8-EJ^#5p>#0mPx~No!GYh6g**LeyZu0u z^J#8w!vB;{ua*0WxgV1rkx#I|M;9oOkH5f&`BU1(_uN+rgeVYoM)T#S>{|~>iMnW+#d7g_SXL^tTi@m2FsRo#9*zlZ8X@_ zn*6vq&rVO1aps%0cC%RJU@$(P>DW^I(^r$G!syz4aF(-m8Vgo zEO*T1j9bM!*!mi^2$JDk|0{is0ToURFtta`s!@ykdSz7O9yukRoG9>`gbI~b^6~it!J^{uwCRx< zAw6O6MRaLS6yK&U0AbAR&Uj@&6;N6=I^X>7JieI8Ev7MxXcfT2JYzFMjc7Mw$ z`;;zIy@6%O*+2RLAp^pwLmROzfZ?*j7}^#w^tJ*XKACslZPnSQBAG2aJ3HY+Zg6OH zc^-i`rye`4!b(9t(K`*w%_~#EjA}x@eEj^Lvsp!O1UYghPq6)@QYD%i84)fmgaw(6 z%xO}!ycWHt9vMhvM8=t3pOrRG>1B5)-Qp>|Tdd@5cw0){K);M~bf8~uvtQDRl3v$6 zF|zu-0B1pi%td?aO)2>0;Ki(lrE1kz9u(X=*e8H9;*=m9b6rhnE>EH=kO`|+S~ReO zEn!r$rDC@9gF8ZYFs$@IUQfsz(;Cmo(ZaQ}bkipRcOp_Qn)Wp)_-^n^l5kgut>~QJ zT9*+!8WE2BpvPiXF>{-5sdbGtYDwbUU~dP@I5n!))2}ElTi?Ys+e!-l(j0uHJ2+4-!rsv~B1r z$m18Nm!lYc!)zD*y~rX~jl6?we2nrzNbOmaf<2kn3@s^qLCJQE#356wBd`3&`Q_s^ zs(r8*nqU}Lk-^?N^og#G`wllJI@nta-@sZ9o<|br`g!d2$=+PI;1nYc#al}YMwULDC!sBw@;fzxELT4<;$f^U*)coUu(>iGb zHi7UV9U~sC3Jsz>A81qBrxBE-E`T+r&YD;XK8zTcuqGVaCknUBnBEJPV{wn1S;J3Ok1Yg-;ueI(fC3(DvWGop@lrqYLq_*UTGe@ zZ%lz#>BtK3t#fe5whJjFUVzi*))mPz*kWXxeDcHa{%v>m5O-1lC(!pSMsuhkAmijV z=!>{|;T^X|ovHDTw1QsfgY2PR5iIdYwx*}GmD1DU>JTW{nk$K3`=#YhN-Z;OtkkWp zm(eNtRZb2ub-1B>mv_-#{KcI38=v^qTXwoHmC zp<*djLoxNIgJIuO^hdMY0St^$w*-6dv^|nv#tP6D#B` zOv%iqx)!U{l)C|bz}s|7EW;INTby-yHGxm}$fwm4t~KAGKAS;LD|~R?X3j7ga*v@V zXG}unjA^Ny_n33qoO{f9pE>V0=L0dTt_yb|975N7Z&pwp9_4%65R0=#9KSko z&=(?{C)+oC6Juk%dF=PT*Z{ok4Dp`ZG%>1Y57tun!=WCLV(@}7{A(Ob!c)wFWPUJW zWu#oBCqOPZb^Y z0AiT)3aJ^$#fL~h?DHlEvrG>z=cnSL{brUXMt})DW$w=B&4bIdZn+P3&zXJa>LJr+rRbJ3 z=B`C3Xfb!oB(Hn{);_d9Iq5g8IbMJ+F;z#C=QXNcpp^@>9cmd;YE1oFjon9+#7v2IpNpw?Uyryh{HX)mvbUlTSjtS7Bi==+6y#PI1^305CVYBEJf;LzrcpGB9 z%xr`Gq37U}V%JRDH?nx%A-1yK8C4px^bkg@ilo%6dg*~I)widX`DG8w6p%I4zvn~d zX$_GlYk=uW7JCy?2c9_XF3xNBU1>M3)bM4N^3sRcz;4)+DD5MlA$|pZ6^kVYJ-Uye zkM#VIak_}L3bTM9y>^GA1xkgbRLGPv@d_V(fDJ-b&Wgxygn`UaKM@0&iK3JTgURbt zG2kjfI?(?toV5+^9F^-RpDr4jGh5YTsK*EC!Wy}~q~lq{^*0rLwSr7KI*Pr*yx^Gx3(n1;9>4Mk30y8DVi7_g8g_*m#%1eWf5{4X< zK~JU~4+eceeF*uWk06@oGP$eAh>vlq$C2m6RwNG|waZzFnMLdC;Nz`A+hvIX!TIyM zm0BwGST-9ajH#lGQpXt)!}(7bX{yhrW_er0OW+3&N3=;HSRAEJ?0*AYSCgQ)C3`xI;-^4R1Mb1i~o? zcquhOy-;SYkeG=ZeK3$Ncb1D~(>(@Hg6S>C zI63bjdsuwokpjN(epe69*Sg6saWKdXeD29(j+g6q;u5ow0tv!Vqc-B2QSxzUosIOW z;9mrh9uq1NbNlHF;081vv=3+2)$oX*$)#>3xo?lh*Ti?if_=*^H%s7P3=lR(-AkZg z1Z_y11m|JU98NQWYU1z##Nj9U;=An;gYz?*R{0*1?^_1P+Cn(q7-rjOZD=0wv2P`n zkDeQ89L6Z9l@X|~>v)|~U!=9>3c*d07U&|qwq)Prs;R7EUJ@zhD(0J>)x7Vk>|di? zKk7+&POf#jF4qV=ZeoNNrPPf!2TPL{Kw6hc1I}urNuQ4N%Dl4EkhaWIw%(LQ`v3kY zuPoNNZp`wO^@Ddq=s(U~7@sRAr(CWMq35w$X5T_CB?5DL+#wEY54HCJ3RVdw&g5B1 ztOa534SiuxpE=f2_8D!+dc|fw$2FV+((4O*rPrTP%9hn0v@psZux+g?FwP=~(N>yB z=bJ`f&;m;=p5={1(GEbO>@->w*_Pcl*eF2^zXm-h(LRw#>0|X(CoT)Bm=d@(#e?Z+ z{smw;KGY<7l>RNXkNCzi5=Jz?WWGu098>V1?Qw{dl^Dpr3`EnG=&UH}%+=2IYDOKud zRM6~8n9@oGwZAW=mtzEyL%MI8sLQ#QCO*n5dUU#Z+S7MRaBQAPDmCoF^?TqhCKf3b zImL16!iUbj&S(c_Sj?TyIFsaJ#4G`09t(B5_)rj^v>!lf~d zb0|*k6~Z|;dP;kOSQh5W*$Ao!TUjkdK0M`Ye&U0fGMm;KPLCoO8_+0pYyu5Yp#eTP zJlZJzb;#Ost0L|wxV9Rwp+~2D)b4qb7ocqwMV(iUW%5o?ll(xuuXceSLq=5b);G2CK zj7R$t8b{#prZ;Mg9-41v=4U_;Bfx2v6weiUUE^X!HQn?9gU>M^a4s7R^t`^t#eieJ z$?;LC*Cvu~j7q2j);hZ5t;0P!#;?t*gD5k1zRD=j<4q!w-pGz{1{=eSA1u+hc+~hj zmZnQF&Lh3F8&NavYErZzh$nzk?u_2h^da?^@b^4vR^V?=w27P-9VcZl-i?Hrh?E&s zw0`3SG{_>)r~=1-)lNJpO)2#cSf|jds(ItX(z{w7{>p>vpa&!Ky6qF3B>*c(pzN#h zjB1RKr7TIxCI6Tg|AO3tB<1pJ(v@n5U-n7jR*+xVUxM)gpF;RCDR-s1*Wo)&Lf&cc++);;G%$YqkC-FhRNSu8brKmB=7>lx2H4nNvqp_iwSP+W#iG(-h z@l{$@?Vxit`Aj`E#9Jo)apCiTckJt&iS3@%pq$-2dE*+?QcAr#jvRomb>8%}w;#CX zRe1b4vFRTP<}t+a$IUp~;&RfBe-~)&!vd{+c*oX0B#ywl(QVC{-DX>B%=Q~)+0|gr z>Hb!fb|;QJX7n;kRp8lrYZdlVB6bZlvV@3KC%U3K(eIH{*%!O<;|c zIe_D=gy^*n(y7yHy;4An5KuB(({>t~51K+_x~PuPs&PG6&Z7%+AZf+f3lcZ09C)j>IWAg?u2Vnc$FNm_>Jz~n7|N6C; zs8=L{+|TIl%&=5(#;;-uADn04Hs4G9r|d4?7j|WKt`&{jWg7seRxP*-Cs&MliKJ*Q@f@>?dF`?j8u$R zLHI)ww+?Q#mSYsuRAY~*#06Rz6{u4U0omzOtz(#jjckG5!r##E(%!4CU*#?LqYW%a z53bgSeR`1Fl=^G>L=vBMN;2jdC=siNm}fv`W1jvI@1J^9H6rZ)9W~}Z=6lq49(OtU zyc6k_eb%HLl!y$AOnG`7PlhS~@!F->lN(G2fZwRIkBRc7GTH*`Sc=yg^Z5XOQtFkY z16lr7r~d#^QX5S(aPH9nbckwnul%d`6x&C|&!k%tb==n9Zk)SQl}R zacN`bC$tg#joL6f&3&5w`_hG=EGDMdC!9kgXuAJg3t~mBamYkpFXznty_yzz&c&rA zt?*oo)6N2+r6wIJfNhm&CkJv4OpE*hCP8o8{k@pIVMd5nLYiahqO`Iot)C+jsdf3j zz-@(*F3F?pjx(wq`~)f}soY7~CGhXbr6Pe?L@tjw{`8KAwITJU4(?7j|iL_anxo$mukUZ#bBW)owl!xPggOr3ElxbaOD01 zM1tH}QLiqS+H4QdQ_704MdG6t@XDD(E6^C#Jf(K^EtCF+ zcJ(dHYFA&4_YY5ptyClGn0m!mss_|Ms?nRPuMPE4L^v4L4Fl(!o-|r5rVX0bBidf) z>eC#|!^9jlz6UxH3ve~eZuo0D=V_DUjQ?y-*Bx`#n4FNyAqUzblM|kjgUF^}Ftv`~ z+be-=j~oG&^wZ0Pw?Swm+G?i6jQ16*D~6v1``-`(#|FTiAZ-8pptnA!Zb*+qvG>j# z3#*{0bBuL>nG?Iw&sMpy8^~{t7l@M4!PDkRkMf44D>@JCq=fxZhi+T-p|?cBnR^hFKm`u?lU*bD8!@tb$rheO5oKpd-4%Q|zqD zBKJE5XV;-`^}X+cN)Hw9bc-^ z{AI9B_?mB>@3Mcn|LwqqV0Un==($i^=#|hb>Ka0v-zmPtKZW%fJcSU#chu14+w80l zYFd3du7W<(_W^ycX(e7^;#Ed#9By$|cAyDCneL$dph)D|hX8d5d90oT4rAD{b${m}-{n;m81IcY2CmO#q^*vBY)M>wUq zE}jtQtH5KL!DpuKf%DZ4MnywYG4l5O8hSmL!=WFv?`SvyjR;LB+^xl20@oX$SG;`j zVqFaxvj@}R!KVgK+apeI=0Y@DNk*_d3kz!2Whgo4&hZ{pl>8cf?(C5knM|qwvCyG7 zIQIXKV)n>jCYNew41u2Mu9RRtky3BBplHnIg&|95qmpDHuAZgQvdi8+QBo` zc=ioD11Y)i0!M%kEeWM|CZ+Z*zk^NSg7K0~-?J@fO3?+_WtXEl%y=v2c;nL`1#@LI zau$HLX0XjdrHt;tGag!Ie<+?VwN+qoZuxv|C0fJr72Q!Hvj=D|%ClgWBhP}jD>M2j zNRFLc?s=$#@5$#}KmpcQLBUjLj`jlutXwQyL0dL(&4u|=F6SX?}({Z^^B?T zDXe=1BgPN8AFiVPTMh*Sdvt5YpORg6bDH3z>RDVA*BdQ9JIR%G`kBtEc^No?nP_&V zW?$Fq`S2GMFuf(;c*hN{uj~CY@;xNqHxY#$vciZOVFxXHQNJlfX2j!ZAL@(}14cqH zH>s||Y*yxJv8}OeWO@Ms*YHiCmE8VY#+h+eW-wdit`yb~ ze};Fkdf~KRdRb{nAuYIHEYRSwfYZ0KFqmr|mb+JE}@+e-e_Ipu&SRes4 z-1jsgQn%%_3XNl}v@&&p4)7?cCNI05%aJriuD*R)8!g?y~g!|Gme`N=ZFC`0(e>od^e zlaFMCt2g}_g&?K)yhY--6=_&9LUpc==aooq&PV`uHzk6Bok$#kvReiF6zO69ch2); zS*c@uK=!9w^h2dpJhKOw*!zMpxLaBDT>J0@vwlVub06&Z;(ivz8rWs2OS!eN^VZbn z{sY#I=G2a%M$FX4z6_2BfrPyoh*6e0UVb20z{_8+*84~A_*dp@bMip9g`)z8yr&0e z*%yL6CX=KeF~%#VUCaX0K~hDnhcoU;Iqt-d?1RO@J>)hWqCE2+(6C2_+??c$v%>6V zzXga9YX_bOhju6DlbgY~(~ouj`DXGWR1{~;pf5m`bDh6iqcNAT2ASpBy2xi2sJ z9##t>8w&Yf#>vNP=Y!~b6bGZTWqQ>qfG51|qv&r$4Sd(pvi8omkUPXno=V0wC@<4K zo=$_#^Kra z{UVw->rB63PpP@mJ;eB6t>Bm=SEfvM{U<2a!(ux0LLA&!Xv%z=+7YP@3B~&nz!lWA z0EMz6qXyTU$xyo4D~?oiRFgXC8F_<);kEYH^P>QcJu$WhYlwWy6Z8fnj}@RZ25X?N zbnL~wQO7z9L$q15-TbiaHTS$iOpRYfWO_UVt>bYf9nc&aJa$d>mB+66wz9 z_aszXLD>8ft(Vbr(CC9t12@@qi&WW90-NzPG-ay=yCv&AJ3N>(HVNIT81a*cWFK^Q z-#35no^uuuiXls!+s$0EnA!P4fX=U$5{w0(Wf~} zj+9!#!EYEWO3XFkA<9dB&RcF;Sq`bgN>i?8#l5Ve|Kn@ah}fOm47=G$; z%78A+XHje1_?j!}VPW(HXqTJEN*}2Xo3dizLT@@2E_60);XW%0`4f1Z zV@L2*QAeOW6b@}vjovcudTdx*0AMhbCiV`cdfYM+6so1xGu)HbB@#3b`U(4$L(s%U zDfMTf|4<*kP^i+(orD%W!!n+`^4Ox7DuN9PDtvHW&YiBjru`u{I%e^;3y=rB&Ps2G zV^{O*3MA~beFdwlde)rNme2v8XfU%*`$NMW8KhmqTSAVQ^(QG0{iSDRatE2m%r33x znUW&Z`oIHiPk%>R_tBP1Y|X9ZdTqK~yHk$vTuv`g(?MqlB$D1mJUbuU7dzL^8GNY1 zVd3C=1ZbD#Jp$y7tlZsXzf9p$oO%oTYWS-{F?eM3#Ks}%cF4`X#hVEktpN!D_zH>)50!>u$nJ)1*{o{ zzIvYdL0{$2C9|-rg26Ok@MxCj{*Q9;a9hx$qk+)S(gK`j@*0q3bZCfcPg7(2U(1D& zi+>)(QbGYlfo33P<%+Y#tAMyE4`PnIyAU-Oq6XrXTfl%BR4^d9j)S+^P+3pEu_kbFP(hmWH{w4=@e5QzJ~lU&}%g z?+-E&93#`YymedGk~N(WfyEbj<_D0c$bnk-Yd~~H!4eJc4iNdg*;Ux}CW$iK{Inw; zS}h8#cBNK1`pdCMTvIvqZHy>c^*NO^W9vF}+pFkZ?l&2B%EI>VX6&2RzoAKKYhR<{ zxDHyVPi?8K0Isg#3h_?V<%%JEZwCsl@N9;g1MlADZCvX-hXYg3;Bq;RS@HY7(Cq5; zu-t{@J1F0N`6iBx1YHNev}I{ZQsZJY$o@C+XM}#PPYeBjD)fuwu?F63>C^xmyd%lQ zv_e}VV7QrB8jbAdHSnYM3gaLKc-NP_2aiwY+#okFhxnv@dU|&r*1}P?1}*d57-iPd z+YjG_f8*#lu&DOpn+uaNAN#1_zq+{nAAck~0u3)P{9iIfp3hLmq^s;4d4W9m? zjglPH8GOdgX>v+iEA(67275tM1Q4s8(vpLx>Ln+PoQU99BNXE~4@TVWg+lRlXEy`d zs}LHn9}MFKcj$TICy|G=(vm3HVkCOxXzE+fg1K@tle>xE1|&T@o{cNi=e@haU#5H0 z!Nr*yAU;yV(Tvi&;rUDKFFR}Hi~;NKl>C^drt|zx81Hq3cM0z_fKsobRM{O%HJDOQ z-?dbU_H=Dp?>oc7dK{mIvKQaA)IBK09S5`STIxOxYjWtWrOHtXG)|tsYpKtm6#R5~ zx96R)uhDo-9=a>6=_us`taW!SHN%wRn(CcfH1mha@Lfxpy-^c4yrmd>G9{P)}7k7PyONE zo?TnE?RjiR_LnJATleqX+nxPoiUa$1cJJK(gj-<$-gN3v{r0_k_ABcRXy#b!*h??X zc@QC$v6ucE&J{SH$C>GuaW2F8U7Vvh-^Mx8I`$vya1P_V80TO+-m1p;ud{D9WY8mF zE934mmmM}tgFQin!x_mat5=5Fp|!?YQ#1>7s%z(BDh%wVe4wM~?KsbHndfpQzn`Ri zb>VyVcMaSnpH1TrFBY2uKbe#lrlg#ll5%`X%Bd+S{W&QM(bi!} zxyZKoT*AbOw2kjR`9?$q*Ld3pzTcAXo4|*)GM-v2e@t>O8ElVcTak3EKcURicRd?fZq^lw5SoeU_|l;#BikSsi)I2>N|dav1zBO{rMvhHnD)366q^ z?^EKN$L=j_Koq6uq(#Z7n|RqH88wRY)R|f|4n1T<1f0(C;kFw|;oIU~_te&L6YQ%3 z^zRwy@CjYH!`ujvc;Itr1;3qHFD_FKRHR-KMeTmq6>ObbKAN#bz;tgJ^4i_B_1G4J0FyEVh{8P;bposY93&%qj@a2(%|rdCqI|NpED5iIlR@u z1sr}+U_DA$ZYvtEkgk1bmVvS>4;Sr+xY#4t#WwJ&!R?d>YA$X84{qdw^GSPfJImUE zZyQ*B9#}bj{lq`8vZt?l92io6i>d$C9qZr9tG~rt-}DvV!I{@rrj$#yDe38>oPNfv z{fYP3lKDua%Kx0f4r9pWzvh(0bWrDAl>aOaiS0O*c}Dx3HE^6<_tc)+zGvhF8rh!P zlIEl7=_mfyK!@Vg9|L{BQ^N}@oC7OIYM%Is0kMxT3fK3)f0z1yZR-EQo$DL!R*AiF z<KraICw;IoS5mTQu_t$&819ERbL;d%pkY1LBw3B#;IA=9jOE8=P zXG^a$#o%^b*ZS2))^Yv@UH=GhuIq-YnL)3ubaqFuJ}uBichxknW-xn zKc#pV+gY5=yv9f}qRlh#*4t3c+{DBXuxtOd;4LW#5B^utuz|M@^j{Onjb}L##Ji9* zCxRC(j#IW=ORAwS-UW5RY}umyPT8V0x~z*~-9*2k`0yPmE{tIb+B%MLv6^k=>o4RP z8R3lWPX;u%`CA$aRt>U&(LV#x5qVQpI;)xV{&!icLj)0##RBg<@O{@KiAV7!8qR7N z{~nG*gYBPWUqK6=ay3CQII@XR$~e|iP3{rgkM{WY^C?c2MqI}9Cg$9cdbZ5c*ptO4 z)LG)YZVAKzBG?y#xey{sZJFIljpmhoL3-;gav`ODAo86pkJ;u*>OAxhd5*Y?yw`-5 zRdkt1S_qQ1P@rHJg_{pv`szq6`g#lMzab?ypq-=MQd;h(y+E!ruX(KagyYLkds6x$ z2j=8a!emK|61=NuI_K|@F1yyyepvdA`^Kp45P6v%VT}U4ZXlG%iWg#%Ts@EW_&t0q zM=IZ3Ham_{>+}Y$ot}AxZ>QisBehUkozVrk&aT4pcW&h1x4z~Xf8YtEszgT_jiqy* zDP?~?^vm%wXt@z;xd8k>%)fk;f~mSrz2Hh1Br0(*@C(Q}Z7?+swG9vKJXVuTlRoIs zef`D|`NCY-7X9`%y{;0Q_1PJCW0?@R@;2zii*}q{x z5-FP!k3mk~Vz%s9G!q@t5g_m?rHW~x#IyN#{kX!;MBz^bqa-{~0@ANbgiqlLQDTh$ zi~~{1iSDN6C}u3m%>1CL0Qh8ZMG#CnVSpTYP_@_pbAB)&JGSZry%>~`$$ zh5mu12enIZERb@==)aRG6?((LP2T9D;~o)tGkz(`1|{P2Vm8LZSPJVmkJ-!lK4-;f zo%{To$?1?BS~NE&4hvI-dRqR+&p1@&r7v{S$!A*W`k5XZ&1X5x9=D=BfG%&M36W!X z=7@0|{cZ|Z$GSX*rw7XRVqEcRZH6m0^81<+NlU43RuG2t8{$Bqo4cGM*cFDSN^?s- z{}D^dI5qo*$R)?S0B^J%FjoKPTLnv4ePHg!kij(z=~1UF&L>jp=ae(oAJcxy9W6qe zGhQLRh*1=G={L~>(owu+=oWDldB78U!3(@&q<^qClu_I>107&SA|g*5ok6^x#8?A( zHX&k%XHR8!a0$=Q`z7>J{aY!}IE#TR&#Dx>^C`@AQz1OLc*Xk2At7BS;u;#jvnIe9SxLHN%6CX zlX_hTqke;vF7~BGVIvs61^EMl^%#lC(U(7|nE?7HfG( z%e|^vzoKJ_wQ}d4t!wx9?A+67eWCuhfyM*-9@uBqJkY&$t~Gy|^}s$)0xWO;9*xvhD-)euNDFY+x^Elr80 z%n#!#(bVWa^1}tbmgYor_5JM!63vMZVru{WkE?^~r%(Mf^V1j3_HGLv@9lW%;fwGO z@oWv`Cf0r+-i`IQX`OW#2bX{wf9v*DNo$Z_5DsH(M9qB}u!?f50LQ(cB+6g5UC^LH z@x74iy(&_b=uwR|_V}4hm*4VLsm|EiO!RL%!w+Au$D-g!N7D;Uztdt*T7Xd9np^jA zwW!9PbRc~DsUQDPLs?i5%9U2ash&#xPqvde_4tsn{$rqaJ$$Q>_w5#?5a{-GH8~b(sS~Y%8yuY?ve!I~9 z{lfM^s~gW#43a-TJ4z_l0=$ZVHN*BPsgF3$C)aO3(1zGhXVs@Gi`MvS*unnZT|vv2 zEWtJ214tRwyy&d7nurl4!{_UowLar-3XHc7O-6q*V0|lowEe)tM-5-f$(KJnm(Lf0 z{-YX_#r>+n0($=3bn87}rPbXFh}z&b}l!NHC13IFs3h z-(5Gn2$h`R8y5+lq!DCcQZDnXyKxua3gtyo%!%e!J{-r5=0% z#~vJYm>52%)QaOU#20a7;JaVOfoS~75ge$y;!&h;RI2qF4#fDoA%k5g-?ae;2Exvl zZ~)d$M6P$dh2tQOxKf=c--$AvF{QR&#c>Ev&kkbg1Tc$_!IW)MYI--^;`6`}_>>~O z6gZXw$LRYAg8`R&>v24ZX+kNE1daiv?!!K$`(Rk_1K#&tQ0g-nhOsCPv^Dz(j^~y7 z+~e3l?Z>ek2VhqABlGm7(Xzk;pTfI$a-3Fut91CQ1nSE>m(G>t(a0EcG4Y)1L!b{t!A0FUOQnD+&7 zfTt}B!OIW9)0c5v0e`=PKG=xkb^OHf8Kr*j5RO|2aMa-dZmSRCcuA>;E-MB0s5Ol^ u(EfVBdSo%23(&sdNgTlA_eassZ(@>u1HTUnd>`9@F$NlZD8o#-GVH(MrW zD<2?<2yiinwKG5#B6ZrI^YGcvbBHLXiOT;&o&mWB#NXk(0CFWbgi}04L=E;&*z19~ zXpDs?%;}Jk8PDtaBb3P&tV|(eW;;kaujeK+iT^0X??Z{p@^3#8GDIVGOH|W+K|{Py zgQDuU6=+7*`%-n_KQ9&Y8lu9SX}20<{qXhx4>4zINkt6mABTO`wq? zj@<585n4D|5DFs#ypv4X08JuwTNX9UVZYzuSDU;Vn-bNqpF+_R?w9Df^qHSjSMi_Q z4;O*lXd^zvRM>#1b{BD5(rdu0V6QwF73K!A)SUTA(MTH*wf5Y$e-nj`)zlr`CuIbj(|me3QENv6-}8ABg8k|8HWnn=RR=abojafD^E z%$iPmoU}cuPq2h(9?T>?9{3YxR`PeWGBv{}H1*AAtvn-!H9g7vi2xhiy!j{QUAu0b z$LS<02%N$~$JL{2LLW_I6lZmlYD3%c~HiWl$M{=U8XFZ!q|-wE#gO0HLS6}o4Emm_h$C9Dk&YCmrZ zYrllGxK+qm1tQhNIZSeSmA@9r;a=U-mtJ$1QZ;YXx3lMmbobpgsY?3O=xL^$KgO*b VYQSz4^hp;!44VsIcWZ9{@DX9t1jh*=(e5&fI>Q{fg zdR09Vx%-1uc4t~r-2F5BFO(^P6w}RLxm1Rb|u4c2)YKYE7jkx#s!bTCHK;x+Nd=<%TX978!gQb*f8I zy=6h@4CawWe9bn@ zPqLTfiCbti{w-{+b1z~*nGPwjp%G`%LOb!%iE6$+9DcIe>gTQ1ys^3dIM}1cBer>A z!#JBkP~SBs(bBVF)@G$KU9?Zt5B$?Fg5NBtcg|!PIlz`+1BRPU_R8L%{&}P3)mbP1 z&}J$BB!lXi1ob+%va(>4U@r)c_fdVdw+l=fZLTV8SMz?qpAT2N`Y6v^t@ZWw{PE*% zs~gliqMVt_lDxEiV@;V9*409CCbnA^p4fCtoAiA9)8LL6X`9JHY&jgPPRTH92HCSP zyRTNKW@29__WnGiJ?h8F<=14+`9xmgTHk0kk1O?;*XmzRGm|6_)|taKCVkX*hmB$0 z&0BfiXc2hA|6$|9p#FaLKI&uat(uH*klG1HMvUeC5PQ@m1K<8D+gTW^ou}+prM^ag z8P)f)r%`=a-BZhe7<=zsX;EKm3bBtTy3eBB+*|LwmDPgX$egMAsF@TleaLbx)#d$G zKAfs=u>#by2O;+5eU=yUp47=W>fy*DfSF1g)T2MB*A90MQae-!&(!+NgxJT`O=C|# zk70GsrmK5G<}@ss^OcbIs1Npb__OfdyYEHk`XXfJt;`8?sx5RJdz90n{e})#wX2(C z&L(L?>_gt;r}&RbkWT*GP;UtxcS&$msn@8UkXY?~enUO|SuN&0>I?Fm)y4i8`_$w6 zHQ6rXof9w3puTK=wDM8#t@^^fqP{w{)_2CShjrLnH_cBEA#b((1QVtUVZQzf@3&=Q<%URoWq5r{7g#kq%aE>=3x;sScW<@VGTCG!xr>l03+Ce zG3>$~?85;Z!Vw(937o0N;oX2HTdEJ6m$P=_Y0!3KEPf*uTD1UoQ>UD$(tIDo_d zFJb@V`i>}%;RH@$0%vdz7n1%#Aca}5Fb|86!7|jL32Th^lp7GrE$G1jMz8~8*o8gV zhXXi-qiK0ec><>}fipOV3rS}LQkVq`^RNgREJGcdum&68VGDXNfD!D#7G+_-+VFFvwg8__S2gYzltnkhMC*O$( SA&z#Bzbo)DY{nM3`~8pN;%^@S literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/Fonts/ELSE.font b/amigae33a/E_v3.3a/Bin/Fonts/ELSE.font new file mode 100644 index 0000000000000000000000000000000000000000..871aa472bae1a16e3652949633acee5ad179845d GIT binary patch literal 264 Ycmd;QU|@9h33k;tG-MdDfSVx!0M2CsHUIzs literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/Fonts/ELSE/11 b/amigae33a/E_v3.3a/Bin/Fonts/ELSE/11 new file mode 100644 index 0000000000000000000000000000000000000000..959696c8fbfa31049c388f591015060663dba6af GIT binary patch literal 3804 zcmeH~e{5UT701te_r-1-w`tO8vYRZFwulW4_A*0StuJ+lM%8IurA>q(#E^|EcVWpI zEgINLQ#%x;s7jVHrp+e89n#i6%GeSaIR#4U@Fp9O%VQlH2@{R0bhZ!)ad@asv19Lh z?YMEFsgO2le{9eC_?&z0kMn)!zWXc_F`Y`6uw-G_@4*M$b{6*iq8vAIXJd_zDn^$3 zuC=@G`OeiqX%=s;+f3DDr&YANxIzJ;pV2Rg3{MiR=_fM5|4(0bI_2YQT8j%aiWdhJK6~ZP%QUTECByugbm7&kMzZWljdjlzx)sG8 z8<-0&WUizJl|oL5Fu^DII^|ejF>xuWF<;;6Mdq~iFl{Aa0VSCxCVpFBWH4y$7qaoS z!S=~y*2xZp?M5`5cIfR5X=&;r?Tmi8!J#c{%AM~S2)VGlaVQm7a5Z{-cC)7Fnj&k8 zGBG!(=;s0fs8Qo<6Gb%lH-c= zuk~M#;MyQC&sBeND= zI}^*tg3eq<%kh%c*y2uVb<_rC7Oc-6I!@vxioZ6~t-7CDUA@W}^rS*jZ=sOtGi$g% z{q?<*si0?Z=z<3(VF^+AY|r0!WWx)yM>l?O@|m`vC0#e%lvEX{d8xnAn`rjT4o2$_ z>4>O`&HV11qQ}Prsex2q)I`EjtUsg2!jHw^1P~sQq2|ihd)y1R#cr2Xl z==-$o^+Aj-<=c>oZtQyfzwY6FXrGEi?sYUzj#?HMXE74>i%B zay1b7N5`~@*JiwTE*BZ;*+i%fMQ8`P_w0S}`$wmGGJ1KZifT+ybMU}WUd5AQn+($E zE3=uRnz3xh$(K9E7Sp!7hGf;%|Po}O;EUWnme~Mj>a920fSZ^}X@?l!?(si&aHb-9W@tKkSxBVk<_Aq$ zEKjXomSZ+w`F(@hn8mvdJF8NBrxvD)XDV9{Wp96Da4eg29LZboFef%)>sPqg)wubp zcYVj`Ye0vg^zMUKeiv7cmX{k>$MMj5{)I?Izk&G21nPhpG=i<*HXws$pn$u<9h()_NND8MJ>#Ys6Eq|3&!z7w>NvI>OM3dWoo)_$GA5 zVb6mJ#1pVd*pFa8f$lu5Vg_2n){}u@Pgw&=Y!lduI^q7=*T~3Z64^J2vAe)_#CBrN zZmVO)e_F0)C_R;B%D17XYaH5C7i{T@=G|Q z(gQch|1fHay~oM=cRy0a3KCWqkOVKwpWEi=Co52Yj1_mQH2pG5+oB-K<1Udi! literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/Fonts/end/10 b/amigae33a/E_v3.3a/Bin/Fonts/end/10 new file mode 100644 index 0000000000000000000000000000000000000000..8b0916ddc70be4963e3fb0366f94a72815105e7a GIT binary patch literal 2708 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 literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/Fonts/except.font b/amigae33a/E_v3.3a/Bin/Fonts/except.font new file mode 100644 index 0000000000000000000000000000000000000000..fc69872298a7bba434420b0a2d07559b522bb06f GIT binary patch literal 784 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 LL%VA6x7_>>&S$ly literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/README b/amigae33a/E_v3.3a/Bin/README new file mode 100644 index 0000000..8a2380e --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/README @@ -0,0 +1,4 @@ +Here you'll find most of the executables that come with E. Documentation for +the functioning of most of these can be found in 'Docs/E.doc'. The Tools +'Explorer', 'Aprof' and 'EYacc' have their respective directories in the +Tools directory. diff --git a/amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ced b/amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ced new file mode 100644 index 0000000..0ab47eb --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ced @@ -0,0 +1,37 @@ +/* Ecompile.rexx: run E compiler from ced. + thanks to Rick Younie for improvements. */ + +epath = 'e:bin/' /* homedir of EC */ + +OPTIONS RESULTS +ADDRESS COMMAND + +IF ~EXISTS('ram:ec') THEN 'copy 'epath'ec ram:' /* for slow sys: devices */ + +ADDRESS 'rexx_ced' + +'status 19' /* ask ced filename */ +file = result + +'status 18' +IF result ~= 0 THEN DO /* save if changed */ + 'save' file + SAY 'saving changes..' +END +ELSE SAY 'no changes..' + +PARSE VAR file comparg '.e' /* strip the extension */ +SAY 'invoking E compiler with file' comparg'.e' + +ADDRESS +OPTIONS FAILAT 1000000 +'ram:ec -E' comparg /* run compiler */ +ebyte = rc + +IF EXISTS(comparg) THEN comparg /* run exe */ + +ADDRESS +pull /* wait for a */ +'cedtofront' +IF ebyte>0 THEN 'jump to byte' ebyte /* jump to spot of error */ +exit 0 diff --git a/amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ged b/amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ged new file mode 100644 index 0000000..1919244 --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/Rexx/Ecompile.ged @@ -0,0 +1,101 @@ +/* $VER: CompileE.ged v0.5 (8.8.94) + by Leon Woestenberg (leon@stack.urc.tue.nl) + + This is an ARexx script for GoldED (© Dietmar Eilert), and enables + you to compile E programs from the editor. Just add a menu item, + and in the 'Command' window select this ARexx script. Also, set + the output to 'NIL:'. You might as well add keybindings, window + gadgets, a shortcut key or even API to call this script. + + Now just edit your source in the active window, and select the + menu item (or key, gadget etc.) you added. The compiler will be + invoked, and feedback will be showed in the status line of the + active window. If necessary, unsaved changes will be saved first. + After compilation, the status line will show the result. If there + was an error, the cursor will jump exactly to the spot of error, + and the error message of the compiler will be shown in the status + line. Warnings or unreferences (not both) will also be shown but + will not jump, nor beep, as this would get annoying very soon. + Also, cursor slot (bookmark) 9 will contain the spot of trouble. + +*/ + +/* adjust your EC filename here, especially after registering :) */ +ec='ECDEMO' + +OPTIONS RESULTS + +IF (LEFT(ADDRESS(),6)~="GOLDED") THEN ADDRESS 'GOLDED.1' +'LOCK CURRENT QUIET' +IF rc THEN EXIT + +options='ERRBYTE' 'QUIET' + +'QUERY ANYTEXT' +IF (result='TRUE') THEN +DO + 'QUERY DOC VAR FILEPATH' + IF (UPPER(RIGHT(result,2))='.E') THEN + DO + 'QUERY MODIFY' + IF (result='TRUE') THEN + DO + 'REQUEST STATUS="Saving changes..."' + 'SAVE ALL' + END + 'REQUEST STATUS="Compiling source..."' + ADDRESS COMMAND ec filepath options '>T:EC_Report' + errorbyte=rc + IF errorbyte>0 THEN + DO + 'FOLD OPEN=TRUE ALL' + 'GOTO UNFOLD=TRUE BYTE=' || errorbyte + 'PING 9' + END + IF OPEN(filehandle,'T:EC_Report','Read')~=0 THEN + DO + importance=0 + DO WHILE ~EOF(filehandle) & importance~='ERROR' + lastline=READLN(filehandle) + /* messages ordered in accending importance */ + IF (INDEX(lastline,'UNREFERENCED:')~=0) & (importance<1) THEN + DO + importance=1 + message=lastline + END + IF (INDEX(lastline,'WARNING:')~=0) & (importance<2) THEN + DO + importance=2 + message=lastline + END + IF (INDEX(lastline,'ERROR:')~=0) & (importance<3) THEN + DO + importance=3 + message=lastline + END + IF (INDEX(lastline,'EC INTERNAL ERROR')~=0) & (importance<4) THEN + DO + importance=4 + message=lastline + END + END + ok=CLOSE(filehandle) + IF importance=0 THEN message='Compilation succesful.' + IF importance>=3 THEN 'BEEP' + message=TRANSLATE(message,'''','"') + 'FIX VAR message' + 'REQUEST STATUS="' || message ||'"' + END + END + ELSE + DO + 'REQUEST STATUS="Source has no .e extension!"' + END +END +ELSE +DO + 'REQUEST STATUS="Say what?! Try typing some e source first :)"' +END +'UNLOCK' +EXIT + diff --git a/amigae33a/E_v3.3a/Bin/SetPatch/SetPatch43_6.lha b/amigae33a/E_v3.3a/Bin/SetPatch/SetPatch43_6.lha new file mode 100644 index 0000000000000000000000000000000000000000..f774f33a54f86988fb5b20dc6bc9a92136d4e371 GIT binary patch literal 12977 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 gp#a8|VD-8;KLTd;kCd literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/ShowHunk b/amigae33a/E_v3.3a/Bin/ShowHunk new file mode 100644 index 0000000000000000000000000000000000000000..e7dc49dbfcd43df38bc376fe37db87a726cd9986 GIT binary patch literal 21828 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 YL&aGfQ5@i_0G|z^vLR6XEC1~O0O}Jdy#N3J literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.guide b/amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.guide new file mode 100644 index 0000000..03554e7 --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.guide @@ -0,0 +1,867 @@ +@DATABASE "AProf.guide" + +@remark Profiler Dokumentation für Version 3.3 +@remark +@remark $RCSfile: AProf.guide $ +@remark +@remark $Revision: 1.7 $ $Date: 1994/10/04 11:28:35 $ + + + + +@remark ****************** +@remark * Main +@remark ****************** +@NODE Main "AProf.guide" + + Documentation for Amiga Profiler V3.30 + © 1993,94 Michael G. Binz + + @{" What is a profiler? " link l-what} + + @{" System requirements " link l-sysrequ } + @{" Installation procedure " link l-install } + + @{" Starting the profiler " link l-start } + @{" User interface " link l-ui } + @{" Configurability " link l-config } + + @{" Notes " link l-notes } + @{" Tested Systems " link l-systeme } + @{" Caveats " link l-caveats } + @{" StripB " link l-stripb } + + @{" Feedback " link l-feedback } + @{" AProf needs you..." link l-enforcer-blah } + @{" Copyright " link l-copyright} + + @{" Changes " link l-changes } + @{" Q+A " link frageantwort } +@ENDNODE + + + +@remark ****************** +@remark * Was isses??? +@remark ****************** +@NODE l-what "AProf:What is a profiler" + + A profiler is a development tool supporting the developer in code + optimization. A specified program is executed by the profiler + which collects several informations (ie. call counts, time values) + while execution. This data can be used to locate the so-called + hot spots in your code - functions where most of the execution time + is spent and optimization will gain most effect. + + The following articles supply further information on profilers: + + o Dr. Dobb's Journal, January 1993 + Joseph Newcomer, 'Profiling for Performance', pp. 80 + + o Dr. Dobb's Journal, November 1993 + Michael R. Dunlavey, 'Performance Tuning: Slugging it out', pp. 18 +@ENDNODE + + + +@remark ****************** +@remark * Installation & Systemanforderungen +@remark ****************** +@NODE l-sysrequ "AProf: System requirements" + + o Hardware requirements + + The profiler needs at least Workbench/Kickstart 2.04 and a minimum + of 500K available memory (depends on profilees sizes). + + It has been tested successfully with Amiga 500, 2000, 3000, 4000 + and OS versions 2.04, 2.1, 3.0. + + + o Software requirements + + Your compiler must be able to create Amiga symbol hunks. Code + symbols included in this hunks should only address the starting + addresses of functions in your code. No intermediate jump + labels must be defined. (See @{ "Clean symbol tables" link frageantwort}, @{ "Tested compilers" link l-systeme }) +@ENDNODE + +@NODE l-install "AProf:Installation procedure" + + Copy all files included in AProf3_30.lha into a directory and add + this directory to your PATH. + + Do not delete AProf's icon (AProf.info), since configuration data + is located in this file (See @{"Configurability" link l-config}). +@ENDNODE + + + +@remark ****************** +@remark * Start & Oberfläche +@remark ****************** +@NODE l-start "AProf: Starting the profiler" + + From CLI the profiler is started with + + 1.> AProf [application] + + The profiler starts up, displays its user interface, loads the + symbol tables from the file 'application' if specified and waits + for your actions. + + From Workbench, doubleclick the AProf icon. + + If no filename was specified or if started from workbench, you can + load a file from the menu @{ "[Files/Open]" link m-files }. + + See also: @{ "User interface" link l-ui } +@ENDNODE + +@NODE l-ui "AProf:User interface" + + Title: Name of loaded profilee + + Menus: @{ " Files " link m-files } @{ " Action " link m-action } @{ " Data " link m-data } @{ " Move " link m-move } @{ " Misc " link m-misc } + Displays: @{ " Mode " link gad-inex } @{ " Time unit " link gad-percmil } @{ " Sort " link gad-sort } @{ " Time " link gad-xtime } + Buttons: [ Shortcuts for often needed menu entrys ] + + Description of table entrys: + + Function HitCnt Per Call Over Min/Max + | | | | | + Symbol names* | | | | + | | | | + Call count** | | | + | | | + Average execution time per call | | + | | + Overall execution time for that function | + | + Minimum/maximum execution time per call + + * The symbol *ENTRY*, if displayed, is generated by AProf if the symbol + table of the profilee contains no symbol sitting at the very first + executed address of its seglist. + + ** A call count value of -1 is shown for symbols being no function entrys. + Safe profiling must be active. + + [ Status and error messages are displayed in the bottom window border ] +@ENDNODE + +@NODE m-files "AProf:Menu: Files" + + Menu: Files + Reading and writing profiler data. + + + Open: Read a new file (also accessable via button) + Save: Save report to file with same basename and suffix .pro + Save as: Save report to selectable file + Reset: Reset all timing values + Print: Print report + Exit: Leave the program +@ENDNODE + +@NODE m-action "AProf:Menu: Action" + + Menu: Action + Start the profiling process. + + + Start: Starts the profile run. If you restart a profilee, then times + are added. + If you want to run a profilee several times without adding the + times and hit counts, you must reset the timer and hitcounts + with @{ " Files/Reset " link m-files }. + (also accessable via button row) +@ENDNODE + +@NODE m-data "AProf:Menu: Data" + + Menu: Data + Runtime configuration and execution control. + + + Exec details: + Provide a command line and stack size for the profilee + See: @{ "Exec dialog" link dialog-exec } + + Preferences: + Configure the profiler. + See: @{ "Preferences dialog" link dialog-preferences }, @{ "Configurability" link l-config }. +@ENDNODE + +@NODE m-move "AProf:Menu: Move" + + Menu: Move + Moving in the display area. + + + Find: Enter a search string and start search + Find next: Search for next occurence + Top: Go to top of symbol table + Bottom: Go to bottom of symbol table + Page up/down: One page up/down +@ENDNODE + +@NODE m-misc "AProf:Menu: Misc" + + Menu: Misc + Other functions + + + Help: + Start the AmigaGuide(TM) hypertext help system (if available) + + Refresh Window: + Redisplay symbol table + + About: + Display version and copyright information +@ENDNODE + +@NODE gad-inex "AProf: Profiler mode: Separate/Combined" + + Separate/Combined: (Mode) + Displays how function timing values are accumulated. If combined + is selected, the time value for a function includes the times of + all functions that are called by this function. Separate excludes + the times of called functions. + + Note that if your code includes recursive procedure you must use + separate mode. If combined is used, the time for the recursive + procedure is wrong. + + Example: + + int main( void ) + { + foo( 2 ); /* foo needs 2secs execution time */ + + bar( 3 ); /* bar needs 3secs execution time */ + + ...burn 1sec proc. time in main()... + + return 0; + } + + If 'Separate' is selected, the profile list will look like this: + Symbol HitCnt Per Call + main 1 1000 The timing values are updated for + foo 1 2000 each funktion separate. + bar 1 3000 + + Now if 'Combined' is selected: + Symbol HitCnt Per Call + main 1 6000 The timing values for foo() and + foo 1 2000 bar() are added to main(), since + bar 1 3000 main() calls both. +@ENDNODE + +@NODE gad-percmil "AProf: Cycle: Percentual/Millisecond timevalues" + + Millisecond/Percentual time units: (Units) + Displays the units used for for timing values. If percentual is + active, times shown are fractions of overall execution time in + percent. +@ENDNODE + +@NODE gad-xtime "AProf: XTime" + + Overall execution time of profilee. Units are seconds or milli- + seconds depending on execution time. Times longer than 1000 ms are + displayed in seconds (s), below in milliseconds (ms). +@ENDNODE + +@NODE l-config "AProf: Configurability" + + All configurable items of AProf must be set as ToolTypes in AProf's + .info file, which must reside in the same directory as the profiler. + + +------------------------------------------------------------------+ + | Never delete AProf.info! All configuration data will be | + | written to this file! | + +------------------------------------------------------------------+ + + Beginning with version 3.30 one can save AProf's current settings + with the 'Save' button in 'Preferences'. It is recommended to use + this instead of setting the ToolTypes manually. + + + o WINDIM=left/top/width/height + Use this to set size and position for the profiler window. + + o TUNITS=(PERCENTUAL | MILLISECOND) + Default time units. + + o PMODE=(COMBINED|SEPARATE) + Profiling mode + + o PATTERN=(AmigaPattern) + Amiga pattern for symbols to hide. + Look in your Amiga User Manual for a description of pattern syntax + + o SORT=(NONE | NAME | HIT | AVERAGE | OVER) + Specify the sort order you prefer. + + o SAFE=(TRUE | FALSE) + Safe profiling on or off +@ENDNODE + + + +@REMARK **************** +@REMARK * Allgemein Blah... +@REMARK **************** +@NODE l-notes "AProf: Notes" + + Implementation + -------------- + AProf is an active profiler. This means, hit counts and timing values + are measured by employing a sophisticated breakpoint scheme. + + Before a profilee is executed by AProf, all function entry points + are marked with breakpoints. + + After execution is started, AProf receives the breakpoint hits and + places additional breakpoints at the function return points. + + The address for function return points is derived from the stack. This + should make it clear why AProf needs a 'clean' symbol table: There is + no foolproof way to figure out the function return address if there + are any function local data on top of stack. + + Actually some testing can be undergone to ensure the correct values + are read from the stack. This can be activated in AProf versions + > 3.22 by the checkmark 'safe profiling' in AProf preferences. + Although this is not foolproof as stated, it works unexpected good + with most compilers. The disadvatage of this technique is the + additional time spent in the checking routines. + + + Profilee environment + -------------------- + Wether AProf is started from CLI or workbench, the profilee's + environment is always a shell. If started from wb, a shell window will + be supplied for profilee IO. + + ARexx port + ---------- + In the current version AProf provides no additional functions for + ARexx hosts. +@ENDNODE + +@NODE l-caveats "AProf: Caveats" + + Here is a list of known constructs which can result in problems if + you try to profile programs including them + + o Non-standard startup code + ------------------------- + The profilees must be able to run in the same process environment + as the profiler. It's not possible to use special startup codes for + detaching a program or making it resident. + + + o recursive procedures + -------------------- + Use only '@{ "separate" link gad-inex }' profiling mode if your code includes recursive + procedures. In combined mode the time for the recursive procedure + is wrong. + + + o setjmp()/longjmp() + ------------------ + If setjmp()/longjmp() combinations are used in the profilee, the + time span between calling longjmp() and the next RTS instruction + will add to the function calling longjmp(). + + + o signal()/raise() + ---------------- + Most compiler libraries contain signal()/raise() functions which + are not compatible with AProf. + + + o CIA Timer + --------- + CIA timers are not available for profilees. + + + o Overlays + -------- + Profiling of overlayed programs is not possible. + + + o Runtime limitation + ------------------ + Profiler timers can measure maximum time spans of about 99 mins. + + + o Static functions + ---------------- + Functions to be measured must be in the symbol table. This is not + the case for static (module local) functions in most programming + environments. + + + o Traphandlers + ------------ + If your program uses a private trap handler, traps not handled must + be propagated to the previous handler. Used traps must be allocated + with AllocTrap(). + Profiling is NOT possible if you are using trace traps (#9). + + + o Switch- and Launchfunctions + --------------------------- + Profilees using members tc_Switch and tc_Launch in Exec's Task + structure must propagate execution to previous defined handlers. +@ENDNODE + + + +@NODE l-stripb "AProf: StripB" + + StripB is a command line utility which can be used to remove all + HUNK_SYMBOL- and HUNK_DEBUG-hunks from an Amiga executable. + + Command line: StripB infile outfile +@ENDNODE + + + +@NODE l-systeme "AProf: Tested systems" + + This is a list of systems I have tested the profiler with. If you + find an error or if you have tested a system not included here, + send a message please. + + @{ " Amiga E " link amiga-e } + @{ " Aztec C " link manx-c } + @{ " DICE C " link dice-c } + @{ " GNU C/C++ " link gnu-cpp} + @{ " SAS C 6.3 " link sas-c } + @{ " Maxon C++ V1.2.1 " link maxon-cpp } + @{ " Assemblers " link assemblers } + + @{ " Other systems... " link other } +@ENDNODE + + +@NODE amiga-e "AProf: Tested systems: Amiga E" + + AProf works with all versions of Amiga E >2.1b. + + Problems: + Profiling of programs using exeptions leads to meaningless results + + Creation of symbol hunks: + Use -s switch +@ENDNODE + +@NODE manx-c "AProf: Tested systems: Aztec C" + + Manx Aztec C V3.4 - V5.2b + + Creation of symbol hunks: + Use option -w for the linker + + Problems: + + o Remove symbols named '_H#[0-9]_org' + + o Don't use detach.o with programs you want to profile. + + o ANSI C functions signal() and raise() don't handle traps + the way they should. (see @{"Caveats" link l-caveats}, custom trap-handlers) +@ENDNODE + +@NODE sas-c "AProf: Tested systems: SAS C" + + SAS C ? + +@ENDNODE + +@NODE maxon-cpp "AProf: Tested systems: Maxon C++" + + Maxon C++ V1.2.1 + + Problems: + Code and data symbols in link libraries reside in the same hunk. According + to Jens Gelhar this will change in future versions of the library. The + beta version of the updated compiler writes symbol hunks as needed by Aprof + so the library problem requires a simple recompile. + + Compiler is adding labels named L'num' to symbol table. This must be + removed (Pattern: L#[0-9]) or you must activate 'save profiling'. + + Creation of symbol hunks: + For command line compiler use option -bs. + In the integrated environment use menu 'Compiler options'. + + Other: + Test the procedure rexx/maxoncpp.aprof for unmangling of c++ symbol names. +@ENDNODE + + +@NODE dice-c "AProf: Tested systems: DICE C" + + DICE C V2.06.21 unregistered version + + Problems: + Dice generates dirty symbol tables, activate 'Safe profiling'. + + Creation of symbol hunks: + Use option -s for DCC. + + Information about the commercial DICE system welcome. +@ENDNODE + +@NODE gnu-cpp "AProf: Tested systems: GNU C/C++" + + GNU gcc - 2.3.3 + + Problems: + Profiling programs using ixemul.library is not possible, use static linking. + Activate 'Safe profiling'. + + Creation of symbol hunks: + Always created, to not create them use -s or @{ " StripB " link l-stripb }, which is + included in this AProf distribution. +@ENDNODE + +@NODE assemblers "AProf: Tested systems: Assemblers" + + AProf is tested with a number of assemblers (Aztec as, asm68, DevPack). + There seem to be no problems as long as the following rules are obeyed: + + o If you export code symbols other than function labels, activate + 'Safe profiling' in [Data/Prefs]. + + o Don't be too creative with your control flow, eg. several starting + points for functions etc. Although this will not crash AProf, the + results provided will be a bit random :) + + o Do not mix data and code in one hunk. + + o Do not use self modifying code. +@ENDNODE + +@NODE other "AProf: Tested systems: Other..." + + Here is a little strategy to test if your system is able to cooperate + with AProf. + + Step 0. + ------- + First, try to find out if your system can generate executables with + Amiga symbol hunks. You should find this information in your compiler + documentation. + + Then after successfully creating a executable version of the program + to test, first check if your program is at least stable enough to run + stand-alone without crashing the machine. + + Close all applications so that if a crash happens no data is lost! + + Step 1. + ------- + Start AProf and load your program. Then specify in [Data/Prefs] the + symbol pattern '#?' (without quotation marks). This removes the complete + symbol table, which results in a reduced protocol between AProf and + your program. + + When this is done, close your eyes and start your program (if you + have problems in finding the right keys you can keep your eyes open). + If your machine crashed, then Aprof is definitely incompatible with + this programming system. The only thing to do is to reboot your machine + an delete AProf. If there was no problems and your program is running, + take all steps needed to stop your program. + + Step 2. + ------- + Next step is to remove all symbols but one, which should be generated by + you. If your programm contains a function 'foo' written by you then + open the prefs request and insert ~(foo) as symbol pattern. After selecting + 'use', this should be the only symbol displayed (it is possible, that + there is an second symbol called *ENTRY* - this is used by AProf, ignore + it). + + Start execution. If everything works, then again stop your program or + wait for termination. Now Aprof should display the function timings. + + A crash is a sign for incompatibility. Forget AProf. + + Step 3. + ------- + Now remove the pattern in [Data/Prefs] and activate 'Save profiling'. + Then take a look at the symbol list. Remove temporary labels or + line number labels. + + Examples: + _L0001, _L0002, _L0003, _L0004, ... + _H0_org, _H0_end, _H1_org, _H1_end, ... + @0001, @0002, @0003, ... + + Then again start execution of your program. If everything works as it + should you did it. Exit your program and AProf will generate the + timing report. AProf seems to be compatible with your programming + system. Save the pattern created in the preceding step and use it + in future profiling sessions. + + If your program crashed, the hard work begins. As we saw in Step 2, + your programming system basically should work with AProf. So there + must be one or several data objects in your code hunks. You will + have to find and remove them. + + Step 4. + ------- + Save all settings. +@ENDNODE + + + +@NODE l-feedback "AProf: Feedback" + + Contact me under + + EMail: michab@informatik.fh-augsburg.de + + If it's not possible to use EMail, write to: + + Michael Binz + Bahnhofstr. 11 + D-86459 Gessertshausen + + If you made tests with a compiler not listed in 'systems', please + send me a small demo source file, the translated executable (with + symbol hunk) and some information about creating symbol hunks with + your compiler. If needed, send a description of problems and actions + you performed to solve them, too. +@ENDNODE + +@NODE l-enforcer-blah "AProf needs you..." + + ... if you have access to an Amiga with MMU! + + Since I'm developing AProf on an Amiga 2000 with 68000 I can't check + for ENFORCER HITS! Although much care was taken to keep this nasty + sort of bugs out of my code, there must be some. Anywhere. + + So man, read the following! + + if ( found_enforcer_hit() ) + { + if ( have_access_to_email() ) + + Send_Micha_An_Email_Report( ); /* Really! */ + + else if ( !too_lazy() ) + + Send_Micha_SnailMail_Report(); /* Cool... */ + + else + + GuruForever(); /* Gnah... */ + } + + @{ " Micha's address? " link l-feedback } +@ENDNODE + +@NODE l-copyright "AProf: Copyright" + This software is freeware. You are allowed to copy, distribute and + use it, as long as you don't change the software and distribute only + the packed file (AProf3_30.lha). + + You are not allowed to charge a fee higher than Fred Fish's for copy- + ing and distributing. + + These files and their related documentation, utilities and examples + are provided "AS-IS" and subject to change without notice; no warran- + ties are made. All use is at your own risk. No liability or respon- + sibility is assumed. + + This software, the included utilities and documentation are + © 1993-94 Michael G. Binz +@ENDNODE + + + + +@remark ************* +@remark * Abgesang +@remark ************* +@NODE l-changes "AProf: Changes" + +V 3.34 + Bugs fixed: + o Screen updates caused enforcer hits + o Shell display of command line caused enforcer hit + + Changes: + o Console window opened when started from WB now has close gadget + o XTime display uses [s] if [ms] value exceeds 1000 + + +V 3.30 + Future: + o Passive (interrupt controlled) profiling mode + + Known Problems: + o AmigaGuide needs 'topaz' or maybe another fixed width font + to be the system default font. If another font is used, + AmigaGuide fails silently. + + Changes: + o If run from WB the profiler acts as shell for profilees + o System default font is used + o Added sorting functions + o Extended configurability + o Maximum command line length is now 256 chars + o Special 'safe' profiling mode added + o ARexx Port for custom symbol name unmangling + + Bugs fixed: + o Use of other fonts than topaz.8 trashed window + o Catched some enforcer hits + o Initial window size was wrong + o Syntax error in a pattern led to an endless loop + + +V 3.20 + o First released +@ENDNODE + +@NODE frageantwort "AProf: Question and Answer" + + o What is an 'clean' symbol table? + + Clean symbol tables include only function entry addresses. Neither + intermediate labels are defined nor data symbols in code hunks. + +@ENDNODE + + + + +@remark ******* +@remark * Hilfeseiten für Dialoge. Aufruf erfolgt direkt aus AProf +@remark * +@remark * Texte werden in diesem Hilfedokument mehrfach verwendet. +@remark ******* + +@NODE dialog-preferences "AProf: Preferences dialog" + + APROF: PREFERENCES DIALOG @{ " Exit help " close } + ------------------------- + + Symbol pattern: + Provide a regular expression for symbols you want to exclude from + profiling. For a description of Amiga regular expressions see + your dos manual. + Patterns can be used to remove compiler generated intermediate + labels or functions you aren't interested in. One advantage of + removing functions from the symbol table is faster profiling. + + Example: 'L#[0-9]' removes symbols starting with an 'L' followed + by any number of digits (L1 L00 L4711). + + + Separate/Combined: (Mode) + Specifies how function timing values are accumulated. If combined + is selected, the time value for a function includes the times of + all functions that are called by this function. Separate excludes + the times of called functions. + + Note that if your code includes recursive procedure you must use + separate mode. If combined is used, the time for the recursive + procedure is wrong. + + See @{ "example" link gad-inex }. + + + Millisecond/Percentual time units: (Units) + Selects the units used for for timing values. If percentual is + active, times shown are fractions of overall execution time in + percent. + + + Safe profiling: + If safe profiling is on (selected), then while profiling, every + breakpoint must pass additional tests to ensure that it belongs + to a function entry or exit (See @{ "dirty symbol tables" link frageantwort }). + If off, this tests are not done, resulting in faster profiling. + Since it is hard to notice the time spent in doing the tests, it + is recommended to activate safe profiling. + + + Rexx Unmangler: + Specifiy the filename of the Rexx procedure to be used for name + unmangling. + Some programming languages (eg. C++) offer 'type-safe linking', + which is often implemented by coding the argument types into the + symbol names (this process is called symbol mangling). Since for + humans this symbol names are then hard to read, it is possible + to specify a Rexx procedure for translating the symbol back in + a more readable form. + + See @{ "example Rexx unmangler" link rexxample }. + + + Sort order: + Specify the preferred sort order. +@ENDNODE + +@NODE rexxample "AProf: Rexx example" + + /* Dummy C Unmangler + * + * This demonstrates the basics for AProf unmanglers written in Rexx + * + * Don't use this in real life, since this is included in AProf + * as standard unmangler (No mangler selected in preferences) + * + * This unmangler removes a leading '_', if one exists + */ + + /* Get the symbol name from AProf and put it in 'symnam' */ + parse arg symnam + + /* Check if there is a leading '_' */ + if "_" = left( symnam, 1 ) then + /* Remove first char */ + symnam = right( symnam, length( symnam ) -1 ) + + /* Return result */ + exit symnam + +@ENDNODE + + +@NODE dialog-exec "AProf: Exec dialog" + + APROF: EXEC DIALOG @{ " Exit help " close } + ------------------ + + Command line: + A command line for the profilee can be specified. The command + name must not be given. + + Example: You have written a program named 'foo', which needs one + argument 'bar' to be specified on the command line. The following + steps are needed to get an execution profile of 'foo': + + o Start AProf: aprof foo + o Select 'Data...' and insert 'bar' as command line + o Select 'Use' + o Select 'Start' + + + Stack size: + Provide a stack size for the profilee. +@ENDNODE + + diff --git a/amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.info b/amigae33a/E_v3.3a/Bin/Tools/AProf/AProf.info new file mode 100644 index 0000000000000000000000000000000000000000..98be63a1c5e11fa31bbec540b93307b9183a0714 GIT binary patch literal 548 zcmZ9H&r8B!7{{Nr$SA>qQ654iD1r`Zh}2=!$O!{ChuiQJ1l>9nbf35W3BiA%KcP+@ z9pugy23;f#0t>>Y=Xs|{z3{%DJ>Td1{MbMN3Ha>69h6`TmMNBCw|6hp|BobJ3F+YV zow!5ydSOwb&k}6H63EWJyhu@7h&@mo2iU$r#34Yc5Ha=`G4m1eB_SwFk|0(1>{nnV z6EP*2g$ptc;YezpFtY$6rY&Z^h*Xc9pZ9}Vf0)k`TgG_^oliE?`GT+!dY)%Pcz#O` zg-LnUkJ^tg>b0raNROB@97gxK;k0d(^_ znDj25?%__5;u+3UoR~_Bf>YA&wwC2?6u4-wfh}IpgqN^3H>gezbhq=qz literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/Tools/AProf/README b/amigae33a/E_v3.3a/Bin/Tools/AProf/README new file mode 100644 index 0000000..3b80770 --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/Tools/AProf/README @@ -0,0 +1,33 @@ +AProf has been included in the Amiga E distribution with the +approval of the author, Michael G. Binz. Thanks Michael! + +[the AProf executable itself can be found in the bin directory] + +usage of AProf with Amiga E is dead simple: + +compile your source (say, 'bla.e') with the '-s' switch (SYM/S) +(= add symbols): + +1> ec sym bla + +as you can check with ShowHunk, bla now has a symbolhunk +added to it. Now, load 'bla' into AProf: + +1> aprof bla + +if everything went ok, you'll be seeing a GUI with some +buttons. You'll probably want to toggle 'inclusive subroutines' +off. now start the profile by pressing 'Start'. After your +program has finished, you'll see the amount of time spend +in each PROC. Especially the 'Average' column is interesting. +This will give you a clue which part of your program needs +optimising. + +notes: +- as you might have noticed, E system functions CAN be profiled + seperatedly, but library calls CANNOT, i.e. the'll always + be added to the PROC that calls them. Be aware of this. +- AProf is not always reliable when the executation time + of the whole program is very short. + +For further infos, check AProf.guide diff --git a/amigae33a/E_v3.3a/Bin/Tools/README b/amigae33a/E_v3.3a/Bin/Tools/README new file mode 100644 index 0000000..1e918f0 --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/Tools/README @@ -0,0 +1,5 @@ +Here you'll find the distributions/docs of currently only +Aprof (a profiler), and the docs for Explorer (an object browser) +and EFindHit (an enforcer tool). Mac2E has been removed due to the +new internal macro-preprocessor in E v3.1a, EE is not being updated +anymore, and the EYacc stuff has moved to the Src/Lang directory. diff --git a/amigae33a/E_v3.3a/Bin/Tools/efindhit.readme b/amigae33a/E_v3.3a/Bin/Tools/efindhit.readme new file mode 100644 index 0000000..6cb8a32 --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/Tools/efindhit.readme @@ -0,0 +1,197 @@ +Short: EFindHit v1.2 (for Enforcer output) +Type: dev/e +Author: jason@fsel.com (Jason R. Hulance) + +EFindHit can be used to find the line number of an Enforcer hit in an +E program, given the offset information that Enforcer produces. +Unlike normal FindHit programs, EFindHit reports the line numbers of +hits in E modules, too (i.e., not just the main program). And it can +also tell you which function the code was in. + + +Usage +----- + +To use EFindHit, the main source file *must* be compiled with the +LINEDEBUG or DEBUG switches. And if you want to track hits in modules +used by the program, they too must be compiled with one of these +switches. + +If you want to see the names of functions as well, then you need to +use the SYM switch, too, but only on the main source file. This is +especially useful for tracking hits in E internal functions. If you +don't use the SYM switch when compiling your source then EFindHit +cannot reliably identify hits that occur in E internal functions (it +may report them as coming from the last line of one of the sources, +and flag those offsets that appear to be too far beyond the last +line). + +EFindHit takes the following arguments: + + EXECUTABLE/A,DEBUG/S,OFFSETS/M + +So, you can supply a list of offsets. Hexadecimal offsets can be +specified using a leading '$' or '0x'. Without these prefixes the +offset is interpreted as decimal. + +New to v1.2 is the DEBUG switch: see below for an illustrative +example. + + +Example +------- + +For example, consider the following output from Enforcer (when +SegTracker is running): + + BYTE-READ from 00000000 PC: 7833432C + USP: 7834B4B0 SR: 0004 SW: 0751 (U0)(-)(-) TCB: 7828F188 + Data: 00000000 0000000D 78348FB8 7829016C 00000001 1E0CCF39 78348FB8 00000001 + Addr: 00000000 7828F1E4 783343AE 7829016C 7834B6C0 7834B4B4 78019864 -------- + Stck: 00000000 7829016C 78334306 783341F2 00000000 00000000 00000000 00000000 + Stck: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + ----> 7833432C - "xxx" Hunk 0000 Offset 00000244 + Name: "Shell Process" CLI: "xxx" Hunk 0000 Offset 00000244 + +The interested lines are the first and last. The first line says the +hit was a byte read from $00000000 (probably from dereferencing a NIL +pointer). The last line says that the culprit was the program "xxx" +and that the hit happened at offset $00000244. (You might also +consider using the STACKCHECK option of Enforcer to get the backtrace +of the call stack.) + +If "xxx" has been compiled with LINEDEBUG (or DEBUG) then you can run +EFindHit on it to find the line number of the hit in one of the source +files: + + 1.System:> efindhit xxx $244 + EFindHit works better if you compile with the SYM option + Offset $244: "xxx.e" line 5 [$242] + +The first line of output is a reminder that using SYM makes EFindHit +work better, then the information about the offset. The trailing +"[$242]" indicates the offset of the start of the code for line 5. + +If you've compiled "xxx" with the SYM option too, then things get a +bit better: + + 1.System:> efindhit xxx $244 + Offset $244: "xxx.e" line 5 [$242], in "fun()" [$238] + +This also states the function the hit occurred in, and gives the +offset of the start of code for that function ($238). + +If you don't trust the output of EFindHit (???), then you can use the +DEBUG switch to dump all the information from the executable that +EFindHit uses. (If this switch is specified then any supplied offsets +are ignored.) For example: + + 1.System:> efindhit xxx debug + $00000000 *** Startup1 *** + $00000196 *** End of startup1 *** + $00000374 *** End of code *** + $00000236 fun() + $000001D2 zzz() + $00000196 external() + $00000284 main() + $000002DA WriteF() + $0000036A Char() + $0000023A 14 xxx.e + $00000240 15 xxx.e + $00000244 16 xxx.e + $00000288 22 xxx.e + $0000028E 23 xxx.e + $000001D6 4 zzz.e + $0000019A 8 xyz.e + $000001EE *** Startup2 *** + $00000200 *** End of Startup2 *** + +The first column is the offset, the second (if present) is the line +number and the last column is the name of the file, the function or +another significant part of the executable. You could sort this +output if you have pipes set up: + + 1.System:> efindhit xxx debug | sort in: out: + $00000000 *** Startup1 *** + $00000196 *** End of startup1 *** + $00000196 external() + $0000019A 8 xyz.e + $000001D2 zzz() + $000001D6 4 zzz.e + $000001EE *** Startup2 *** + $00000200 *** End of Startup2 *** + $00000236 fun() + $0000023A 14 xxx.e + $00000240 15 xxx.e + $00000244 16 xxx.e + $00000284 main() + $00000288 22 xxx.e + $0000028E 23 xxx.e + $000002DA WriteF() + $0000036A Char() + $00000374 *** End of code *** + +Now it's really easy to see where any particular offset lies... + + +Possible output +--------------- + +As well as complaining about errors (like you forgot to compile with +LINEDEBUG), EFindHit might report: + +1) Offset $244: "xxx.e" line 5 [$242], in "fun()" [$238] + +The offset is in the identified function in the main source. + +2) Offset $200: "xyz.e" line 11 [$1E8], near EXPORTed "external()" [$196] + +The line number information for code in modules is more accurate than +the function information, since only EXPORTed functions can be +followed. So EFindHit reminds you that the code at the offset is only +"near" the EXPORTed function (i.e., some point after it but before the +next EXPORTed function). + +3) Offset $280: E internal function "Char()" + +The hit has occurred in an E internal function. You probably want the +backtrace in this case (the STACKCHECK option of Enforcer), so you can +spot which function this was called from. + +4) Offset $190: E startup code + +The hit has occurred outside user code, either when starting or +cleaning up. This didn't ought to happen unless your code has +scribbled all over the place. (These offsets will show up in the +backtrace produced by the STACKCHECK option of Enforcer, as E code +always starts in the startup code!) + +5) Invalid offset $330: not in code part + +The hit didn't occur within the code of the executable being analysed. +This might happen if you're running EFindHit on the wrong program or a +different version from that which produced the hit. + +6) No line number for offset $200 + +EFindHit couldn't find a line number (but might still be able to +identify a function, nonetheless, and this will be reported as "in" or +"near" as appropriate [assuming you've compiled with the SYM option]). + + +Limitations +----------- + +There's no symbol information (currently?) for any methods or for +functions which are not EXPORTed from modules. So it's not possible +to put names to offsets in these bits of code (the line numbers should +be sufficicient in these cases). And offsets in methods/INCBIN/other +data in the main source file will be reported as being "in" the +nearest function before it. + +The startup code recognition is pretty much specific to EC v3.2e. +It's likely to change in future... + + + +Have fun! diff --git a/amigae33a/E_v3.3a/Bin/Tools/explorer.readme b/amigae33a/E_v3.3a/Bin/Tools/explorer.readme new file mode 100644 index 0000000..474525a --- /dev/null +++ b/amigae33a/E_v3.3a/Bin/Tools/explorer.readme @@ -0,0 +1,249 @@ +Short: Amazing System Browser and Debugger +Type: dev/e +Author: jason@fsel.com (Jason R. Hulance) + + +Explorer 2.2j +============= +Allows you to browse around memory as E objects (which are like C structs). + + +Basic Function +-------------- +You enter an address and then select the object which is (supposed to be?) +at that address. You can then see the value that each element of the +object takes, and follow pointers etc. by double-clicking on the element (a +single click changes the address to the element's address, which is an +offset from the address you specified for the object). + +A double-click may therefore change the object being browsed, so there is a +way of returning to the original object via the "Back Up" button. As you +double-click and select new objects your choices are recorded. The current +depth of this path is shown as the 'Depth:' text. The action of the "Back +Up" button is duplicated by the "Back Up" menu item on the "Selections" +menu. There is also an option to clear the current path on this menu. + +The list of objects may be created in several ways (these are found on the +"Project" menu): + + 1) "Open" Opens a previously saved config file, containing any number of + objects. By default, when Explorer starts it tries to load + objects from "explorer.config" in the current directory, and + then "s:explorer.config" if that fails. The supplied + "explorer.config" file contains all the standard Amiga OS + objects. (This file was created by using "Load Modules" on the + "Emodules:" directory and then saving the config using the next + option.) + 2) "Save" Saves the current list of objects as an Explorer config file. + 3) "Load Modules" Scan the selected module or all the modules in the + selected directory and its sub-directories. The found objects + will replace any current list of objects. This operation can + take a long time, especially if you try to load all the modules + in "Emodules:". You can interrupt it at any time by closing the + status window. + 4) "Merge Modules" Same as 3) but any objects found are added to the + current list of objects rather than replacing them. + 5) "Load Cache" Same as 3) but the current E module cache is scanned. + This is most useful when Explorer is used to help debug your + programs. + +The address and object can also be specified via ARexx, making Explorer an +extremely useful debugging tool as well as a system browser! In fact, EDBG +v3.3a+ makes use of Explorer to analyse typed variables. (A module is +supplied to show how easy it is to integrate the appropriate ARexx call +into your program.) + + +Object Layout +------------- +The elements of the selected object are listed in order. If you choose to +see the value of element it will be displayed in hex in parenthesis after +the element, and if you choose to see the element address (an offset from +the object address) it will be displayed after an '@'. (Use the +"Selections" menu to decide which, if any, you want to see.) + + +Where to Start +-------------- +Explorer starts off with the address of an internal hail and copyright +string. The items on the "Presets" menu give some other, interesting +starting points: + + 1) "Dos" Views the address stored in the 'dosbase' global variable as a + 'doslibrary' object. The dos.library is one of the fundamental + Amiga system libraries, and 'dosbase' is its corresponding + library base object. + 2) "Exec" Same as 1) but for the 'execbase' variable and object for the + exec.library (the most fundamental Amiga system library). + 3) "Graphics" Same as 1) but for the 'gfxbase' variable and object for the + graphics.library. + 4) "Intuition." Same as 1) but for the 'intuitionbase' variable and + object for the intuition.library. + 5) "This Process." Views the 'process' object for the running Explorer + program! + +For a typical Explorer session, you would probably start at one of these +points and then double-click on elements and use the "Back Up" button to +browse around. You never really need to set the address explicitly on the +GUI (at worst you'd do it by ARexx), but the option is there if you really +want to... + + +Simple Types +------------ +The "CHAR", "INT" and "LONG" buttons view the contents of the address as if +it were a pointer to the corresponding type, and fills in the 'Hex:', +'Decimal:' and 'String:' texts with the value(s) being pointed at. + +"BSTR" is similar to "CHAR" but it first converts the address from a BCPL +pointer and then skips over the length byte. "BADDR" just converts the +address to a BCPL pointer. + +"--" and "++" treat the address as if it were pointing to an array of the +type last requested (i.e., an object or simple type). "--" moves the +address back to the previous element in the array, and "++" moves it on to +the next. The size of the last requested type is shown as the 'Size:' +text. (Note: "--" can be activated also by the "p" key and "++" by the "n" +key.) + + +Display Beeps! +-------------- +The screen will flash (or you'll get a beep or whatever your Workbench is +set up to do) if you do one of the following: + + 1) Select something when the address is NIL (zero). A NIL address is not + valid (although Explorer will behave as if it were). + 2) Select an element which is a NIL pointer or a LONG that is NIL. + 3) Select an element with object or PTR TO object type, where the object + is not in the current list of objects. + 4) Try to backup past a depth of zero. + + +Command Line Options +-------------------- +The command line template is: + + OBJECT,ADDR,ALL/S,CACHE/S,NONE/S,CONFIG/K,SCREEN/K,NOAUTOREPLY/S + + 1) OBJECT Specify an initial object to be displayed (to be useful, the + appropriate module must also be loaded using 'ALL' or 'CACHE'). + 2) ADDR Specify an initial address to be displayed (NIL is ignored!). + 3) ALL Load all objects from the modules in Emodules: and its + sub-directories (overrides 'CACHE' and 'CONFIG'). + 4) CACHE Load all objects from the modules in the current E module cache + (overrides 'CONFIG'). + 5) NONE Start with no objects (overrides 'ALL', 'CACHE' and 'CONFIG'). + 6) CONFIG Specify the config file to load. If this load fails then + Explorer will try "s:explorer.config". + 7) SCREEN Specify the public screen to open on. Normally Explorer will + open on the default public screen. + 8) NOAUTOREPLY Specifies that the "Auto Reply" option (described below) + should start as off rather than on. + +By default, Explorer will try to load the "explorer.config" in the current +directory (as if you'd used the CONFIG option -- so it will fall back to +trying "s:explorer.config"). The starting address will be that of an +internal hail and copyright string (which will be displayed as the +'String:' text). + + +ARexx +----- +The "Reply" menu item on the "ARexx" menu manually replies to an ARexx +message that may have been received. You can also let Explorer +automatically reply to these messages by checking the "Auto Reply" option, +but the manual method is best since you can be sure that the pointers +remain valid while you browse (since the calling program is halted). Once +you've replied to a message the calling program is free to scribble all +over the memory at the address it just gave you... + +A module 'sendexplorer' is supplied to simplify the debugging facilities of +Explorer. It defines several functions: + +1) PROC sendExplorer(addr,obj=NIL,repPort=NIL,message=NIL,quiet=FALSE) + + 'addr' is the address you wish to use. + 'obj' is the name of the object you are interested in. + 'repPort' is a message port for replies. If you don't supply this then a + temporary port is created for the duration of the function call. + (The purpose of this parameter is to allow you to re-use the + same port during your program if you call 'sendExplorer' a lot.) + 'message' is a short string to be displayed in the 'Message:' part of + Explorer. Use this to communicate some information about the + address and object (EDBG uses this to give the name, type and + scope of the variable being explored). + 'quiet' is a boolean to say whether Explorer should complain if the + object is not loaded. + +The result is TRUE if the message was successfully delivered and did +not cause an ARexx error, and FALSE otherwise. + +An example call is: + + sendExplorer(packet, 'dospacket') + +To browse using your own objects you'd separate them out into modules and +load these modules in your program. Compiling your program would add these +to the E module cache, which can then be used to set-up Explorer (using the +"Load Cache" menu item). Alternatively, you could "Load" or "Merge" the +appropriate module directly, or use a config file if the objects don't +change very often. + +2) PROC quitExplorer(repPort=NIL) + + 'repPort' is as above. + +This sends a 'QUIT' message to Explorer. Again, it returns TRUE if +everything succeeded. + +3) PROC isExplorerRunning() + +Returns TRUE if Explorer is running. It works this out by testing for +the presence of Explorer's ARexx port, so it may be fooled.. + + +Altering Data +------------- +By popular demand, if you hold down the shift key when you click on an +element of an object or on the 'CHAR', 'INT' or 'LONG' buttons, then a +small window pops up which allows you to edit the appropriate value. It's +not very safe to randomly edit data (especially system data), so use of +this feature is discouraged unless you really know what you're doing... + + +Example Program +--------------- +To show how useful Explorer can be, there is a modified version of the +'empty' handler supplied. This uses the above call to 'sendExplorer' to +communicate the value of the packet currently being processed. Since the +handler is not a full process (it's just a task) there would normally be no +simple way of debugging it or examining the packets as they arrive (none of +the DOS functions, such as printing text, are available to simple tasks). +However, the handler can send messages to ARexx and thus to Explorer. + +To try it out: + + 1) Make sure ARexx is up (by running RexxMast, if necessary). + 2) Start up Explorer using, + run explorer all + 3) Now copy the 'empty-handler' to L:, + copy empty-handler L: + 4) Mount it using, + mount empty: from empty.mountlist + 5) Use the handler, + type empty:10 + 6) Look at Explorer. It will be displaying the first packet. Browse + around it, remembering that most elements will be BCPL strings. + 7) Select "Reply" from the ARexx menu (or press RAmiga-R) to reply to this + message. + 8) Another packet arrives and the message is sent to Explorer. + 9) Repeat 6)-8) until the 'type' command finishes and you get the Shell + prompt back. + + +EDBG +---- +EDBG v3.3a+ communicates data about a variable if you hold down the shift +key and double-click on a variable that's within the current scope (EDBG +also adds it to the list of watched variables, if necessary). diff --git a/amigae33a/E_v3.3a/Bin/build b/amigae33a/E_v3.3a/Bin/build new file mode 100644 index 0000000000000000000000000000000000000000..19cbba764f50240126ac40070de9202a8dadeb7f GIT binary patch literal 8120 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 a#txLRkh}|_Il2dUi#TzBaQQ2I|NjMAi;VLC literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/patch_v30a_to_v33a b/amigae33a/E_v3.3a/Bin/patch_v30a_to_v33a new file mode 100644 index 0000000000000000000000000000000000000000..e4dee149f2582da49a69123ed3e95fbf91bf94fd GIT binary patch literal 61920 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 X0R6|D9vHx_zzt#R=r82ooZJ5w=t4mj literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/patch_v31a_to_v33a b/amigae33a/E_v3.3a/Bin/patch_v31a_to_v33a new file mode 100644 index 0000000000000000000000000000000000000000..e141b6a70780d494addbd9dcefc05a8bae0947a5 GIT binary patch literal 46764 zcmeFa4_H%Iwl};JB1Vi9DYaCsJ%$tmMxaO?OeqCKiV-6sTB?ps{F4}@G?Q?+m~p&l zTkC}IS44_P9Y5>!I*iv^$EytEC8vmplu~LbW35_im0C(ErHUyf?{A+RtnD4Z^QFuXK^^WGDP#xrVrB?xgkmJhMniMM}{v3$7y~~Y7Nuk zza*>hoG)NUNSympyoW2sO3EBYUzb$8*N9Uh$fjYu&F+yZN^tSQIz zQue(NqeXAtU|RcQ6rw#vh{T_|Z^wjXxra2h?g3+ki>uJTY* zp!^H(EZ*6`=Ofm#+GXyZ@L9xWfvp99Wb|l6h6A?qo z%yRdn=7$r6N@==3=F(84>oXI$17@$Ie{c_MBxDXVi^vqS+yl&u?!JlnNw|yD;G&ecwrNC(M`ifErHNJ+>L5vnc{5|!er5|sgwNAe2 zM;3pLl4iLF!{Z1oqYqd@%L10t98#_jU*ysWOlvzNM_eK2ONcjwTKAy0{gU$*Xn)L^ z&xxx-F-Q4}?!jQR9{Kt4`N?R0M_1*jY0X+x#GFck-b~JS*3e2hN{Alb>zWEs8$5D5<%6$}Y9B>Hp?P$D9GzW9| zc*r96q4>K<8^zFm9N_(7ynm4Qk7K0abTka2tbwq6S|X)qa-L_rz8#Bt_@Pz<2=M{% zy(p?cs0{ga&y1&Y!rcw%0Xy^f~U@VmR9ly_YmIpAr+-mAIe$1qo0LBSV^OhNsO>(wzO@q){WyVr{yRM#Yy? zCZrkkltbPB-jim6S>YK|%iM$f*g?+|KVeQt&2H2v&Mcz+;0bpRfjcpDTwoLjSct!0 z+8;{v?qw(q312@`8#)MIRDI%F0Iwciu5n2ZVhf7ib_`{(r$w|l9_1d3%p5C7}WUiCi@mk>$Hm_V<*pNG?DiQ#|v ze@OB_`bQ1g{wM!`txf+(7)Baqf|m*)zkk&5GmKw1kLO_?Qa&mbMxc}*fdeBW)jfa} z$um;HYlTtghxjtTe2hQY$Vk-@al`)&CEOd=f3<|w|HBfLbmpPfwEm-))UG2Utl{8Q zbiKM4@8>k5D{=c)8smP-5kI6paeq3@(0_uOBFo>E$GzGi_J8XUQP}@BkH4EDq-R zTgP<7b;u*BR9G8KjhcgmC^vXE4w{2O@1b=)dh&dko{ZD#i7ZJ^LI(9DDwi%f@5fO0 zY8iDeXX{DEX+0V5k68PFee^`0t|yBa_~+0V9~{sVp8-ADBnIx`Qy!ykM?ZBxd4;;4 zmQ%MnR8RDw)OX1baU1kxS)QKgP|gfV2)*JJ*k;{G3xQ)~&kAoC{cjYND}M{J zBJS4{FTYURmOAC4MXurYA};qbJL}zjs(8HXq+)XJ(Ou^cP|}a7&!4G4-&uB^70TUxj=bgi&5BIIX0X$p5mn8>*+zB3*`M$5&L?E=zH)9% ztG!LKpGuyV(?Q4+&)k@c_Lec7LDPGU? zRbA22S2OKPpG84Ax=S)Y5{fu27&3YA$HI>R?#}WLl!<88FLB3+q5r6#fw(j5Rjlqd4Kwpm#ysi{K`6d2XUL+Dfetnx^big2=zyw}qT^ z7}J=k#=+n?=}aW?HN>#-@0`#bE^k>e96DdiMg$rSZ1~xI@&tt~Z<@oJYFaM6MTmPi zs0D2Ez*10g>m-A(XEtHTfirBKq^r=fL{x(O@}ZxR_QC^hmG8jpfS3N|AAtW6c*OA6 z!>?jBEnz31$Y~$rhq$l>?eaIcTWOXp=f62eLqrL85Z0&XK6gpP( z_w9Ty0;pTdCf^iG7P@jTmvFh)0UdxYKog*qjplqJ*?&J#dV*E7=6CDKa1R~tFG^V@ zeGz1Nyer`pEm0@dU83V7tII(2!Pqw<^u3%Q7mG2R?{IJ-i(WsQO$(N3*u-|3mX0A= znwF($HiZ>k%DIu2&onTylDZr-)4;#g3LUVBef<3{Y^2*MOE26tSHk6NF5{Sv zJ!kjPTxYFjm6jCSX(5T$;GKYsZKpv1kSnVL;bSrMv<4ZSDzb*$NqUl;MdNHGv;mLA zc}TV70%NnDc*|uy;pmc-8OX-k*)D4%QY6c5)`%dmk^HBwc3+-4bw93l@zx~#VOUl1|v{;hrrn{~CB&^59j}T!J{h z2x|p^IuoxWT!FA@h+qHr!Gk9~ZFn#r>1vREgQpBy-+-|HGvI&0Q|5yNb%2CJ%k{7L zKT|ee)@hW78SIZ4{Ezn2{~!PVi!{@b^%{1`i7IP=XS!4;%2@O_f?|KAf~@9f{EWT2`aDHs zBi;t&jpwl}kKwT-?{SJ{x`$31xjY%36Nu9aTtGWb$v91tAj$_@Yy4L%oi z9wW9r;dMkfR`^kuk*v2V*Lnh(aU~9AK3){DGxrtl+kHMJ&o{CWwIi;`o%@PE^v&}V z9wm87kMFLlcwez){>8ipY2kM}@+L+$(nTR)s!;N@AlHi!3j*Y{aRE~i=SZIaNE{BLn2N!UlhN z^kG#U1`H!UHoCU=4cd-%N%E7Xx^~do(i)Fa=MQk_- zw;p}f@4f4MrfjR*?H)9el{)tEGZG#7rhex^HtZd&yzGP#uBiW!N}9`LbVbThmcsU1@s3Paw4S z71ZUCILLe*o^6(ae0{^icy;9KOCxe*&|Nx~0jQuGWcCz=w~$AdTu`akii2Eh;onMv znrO_TmL;9BQ~1#uSA4SAI>QuRFMF0$8HqF&xW-6)l)#7ZT*XspzkxhorL?V4%T|&{ z3?yU6&X04#rFt@}oq0hPhg~0eK1u0JSVbe-P8W_gCJHUnm8c<+ZK7L+M|+U#G&&F; z?TMX&@;V*-cYDcw2V~7qWQgxtR2Vh$%{&KC+@U zL@V1v#uJf&Jm+8VelMTLx=ixibv}=zBFh|TdHhhnR}EzOHB^kBy`Y4bkqp;sHoAuq z-l!u#pc;!@U5^-jOQ6>j*&uj=vCO$fi+_t)z=5l6(ypEWuPrf|kw+YWH zY)>BB<$CgP5%*-(&W{8Ih^%t{qQ!{@vg|6|T%9q$zQ3aB$ykN@$yip!$xGOf52bV~ z^xXdTKM-%;cTi8BOmnn8y@A$inPMYZ#_W7g#&~6*UQe!}^;+h)bAK6!MxAd?zUdz3 zGtP2Yl=2d6lp|?_w@P6KVEbis!s?(lLLMKaW8?ALp!666Sz1!CfA@Z9illUOKYm;F zv7U%76rT$dA`h{lT!{Ad`ofO}|LhVSGDd}u54MT+{lX@yau2~*Rq7lpxYxXuq!iQN zA6Y*J98j>|&dq8nYdd9NUeIhckaV%iwz89*XPG$)cf%%IM8u3*sx)X3HA`ue%6Y}a ztTi!1B9W>kVKqN-4j6(9tdE;QM#)AMr<FA+=UdgcrKIbrG*GTvjxUWnZ;G|8d-SO_^SgxKzd)FOoDyj{o{sS~OZ2GT9I0An02-loLJA?bL+{B`$u zTEEy5CaWouQ1%f}JVXMXewO$rREI8CIRZa1425PB*{l>IqkcvvMI`8Mrruv?9r>;o zoiNdmo_zBv4zMkR?+kxqSilsSm`IFLxU}@`fgj{NP(Ec$13G72+E%3TH~P@J7>Kr4 z*O6Y3BP);JNK#w7xafvxCzk55P?0@Iyp6K1AtF;^_wII6JxT+Km?DlNV^iY-8}Mel z<$!nSjYi zbirz`4K}ic#Hii3WQiomNJtWJfpIe22aVKU%KIyfD)>W;!MZq^iIlj94AD4YTLpii zd&uYq?2j-7um}Qx1n+3PEcb1rpRQk)W>cQL;s(i`wD^W%4$i zN|r?Y43aHkogBW2@QHMR(DA7eS4p1666FJ|1{QDef;0nVn0zjkl0N_KM^3sgnYBEl zK%rjN7`#?K9?My5=tAXERl=WThF*;drQep#0^^VvWH{6DK3XTX7&>(U2=k(0{1Vs% zS8Qwuoq$j}a878Tk0j-Rvxr1C7M&QOkr@2=)Gr(IrfjCU>C7?-(h$-KjBZ}oe*#?D zNEY7G5yByrmobdKL5$;4n(G*Y6uFRvEjnKh8!&iF|3Jf$AIj7*e2b+>b#+i#o0`-Ej?IiOSgnBoOB7(Z@e)5 zrYKSFtmVNMlm&b}&hykyQ!NaB*GwjzMOzu6ZIXm3x=E9UKtD=ZnemWss5fOBWE%7ZDAr5cA=_nLpJf;c zqs!K;6|^R!>0Y73p06XrD#udE2Ga)QKxleGf^AFH!O-OMt!U!imf-OTd!!g$pzk81 zAAG#vfs$zph7(pM?D_HkZvuG3pmCS0(=KBfPdm!SG^fes=asg!EUf&0 zU0GbirO6?jFVGaVEQrdR71uc?lb`h30NuMSpt4Sz;gurlz^WR@H_!03phofQ9~>EA-#oav{7@z|{g4`fu(*;raIh{*Pko?@a$*CpxKY3u zqV#VrWGNoE3mCd+{u#Sm9$ymhRRLcYaJPVa1PuKT{hK==;6VZZ;K6F4*VJQ#XCDDS zAmD&v>jG1}&{t}quhc?csfE5$LwiL3)V~mLjDX_>oK$R`ZVFi}JS`RQa{^u|V4;W9 zYu~VrGflJ#p+bMCf4zID=&ot{b|Lt;0xlA;FpboEmWi1(QD@9%LSo7QP&~!#2OI$$ z2h;;N00jSMeF2jIXzJ4ufCPXRfMN9XYCtBy0zj`~j#>+%y2%85asbo#N2mxEKKF z7nckG4dXHZYXDh*TtGemb&Es2;%Weg0H{w~J)jAIdc<7>TnC{1cnM%KVA?X#*Cxqi zA|@ps#3ugaahZ61)01`auDh$)bykBZGr^CL1Q0HP0Ym{(0H{O)DlxAF&_+li-Y2dC z90!01^D6)+AkCsdNoa8rDxZW3K8waYYbGQ)5rD=d9|c?k^y)}dFB^2OAu3P=k?zUm z#pezQ-q@<~>~5+M|+^Z^mISFFj2UWuu~tE=0lb5u1^%8xiHfI3hxlgNP>;;^otLvt4#> z_CN(U`%)PfIcRT513{Allagklc2P>N+Z!4!5N#yOa_Q-3RS2mK!OAr~>;CM8PefnJnIMkD4WK50K z&lDJ$iCqj9*+@k3vP8v*hA4$2y$jA=^~8IkAG*ZIzzT~p(mR@qtV9kw5Y;y-X6z3% z>J$54TSDpoeZCOCtn|GMY#T1$i(qkZPaG@fo~YjGWQxy-5mi>gJrRIV?>)};*Uuc% z;~ayX!$p)AoYBFb$;PxtBn3=C#6aXZ)<7bncR8iSf5}0XJ+#aS>1#`*?-OL@>eQ3F zS4+<{K<|-M&V{!*xbWZ-F8l}^ayGMmih+c0sc8vcy?Ko8C?dw-ZE_J8z8#vNy90Wg zERGU1++RG8jOAOgK?ot95F}~yv?{E3w{@23$vJpG-ax|I@Mb^8m=XlzsSsBG+7dk( zbinvPeKofs!$`t0Dvv?871qbfxv(uotzp@^0naG#QaQM=k(~~=aMb?R?M`p>T zXUGHCRxc$ggE*r=oIu9r$-c<6@8(n)1^WuEQ%sL;4qX`lA>Bw+SF!KLCWair#>b12 zfK=~BjNgP}n=*N$0=x7CG6kC#JVAj%Pv*tYI|S-{mQz30v#o)ijhG=pfi0Uc2FkgB zQ0kWiFAB9inKfe(F1B!?t!mek7pOJIXo7#r6(!EzsR+L{u!5Uew409Q*{ZUZnO9{i zeTjk0?0TIBMfN*jGU7cmLQlRcDuT@FH?#7m4aOi1Z7bnsE_ZM(E)VK#}(`>=gHScllR&9vw{T^yTB=SG-(^bSx(rSak>#1YBO zP6@lAL#cw=)HT-@Qb~N$AaZV+R>aMygW;Ii5I~J57WW6kO(oP`Xv{I4ELTKBQwg39 zl%6Z|2>Gevz0Sx&%iKst9U}f5mM0PWgBs8g^?GvZH12G$#79p~#GsK7OR_qs+`i;8 z-DWJg7KWV0Pbxk)DPrvBaq+IHu3fOcnK+2-#nI}B%?4TYT=W+y;v(kkI;UZz*cTIH zOfgK2evuOtM+k^D8M%oi5#McRU`j6>&I?;NBq8YUQNT;Ut73w!aPrkgkAH$c4 zmx-pIIjOQq53|plNjz>#FNC=MqPai{O(4HuG*{cK1|5jVAoP2jxz*(aPsB^Fi4BFr>c z==zU~P!6623Od4v^#T#p_EHlVK>9NRMThem3&okdwmX&ay^uF$N6`s{mcJRwU zd+U@V^3AYfQ!zGCR83Pz3ZoVUR5pjCQ!T_VnS%X)_1`KoO;}}=NSko%MB`-?pHDYR zJ$wQ+e*A1*5ah>@lmak96NV9#28Yk9vDw>Be}fiw}PP*1Z5tEX+DY*rMhP#=yo zLM3}R;zZryh$`-|Hyi(6Uamw>NQ27ueYITueOd9rHx3qB798bsiR0hF`r7L_(nDAf zwWAkv(YICb_aYqYns*NTVR~|)j!%=AD@J~5~5DXk=p6@p(&@Y&BYx^s(CQc4e=&-KKUIdqs7<^=@SlK1YE@hXl;tk6z2BQc4 zDbpB}gVl#7pQt-D*%(VpU6)Un6Dmv%4=L3DHWUmf{qP#ZVt%@=+swa4Lx_<=diWUp`-8bpM<@+IOra7?1FLev*%++ zk{e@pJG*MQ?|XKA&=@=y1EXApM!bF?3@(=Fh35zE#e|^kCud8Yje9=&NhD=b#`e?O zLC!K{EFXz(lJ9m76j&cNO^L>xSqKm%FNZd$yKyHam5~~H6ZS$hu=(|cL+!u*GAk>%30p9$^9!A6Fu;Tw@1u2kvJdSM1?Wj{wrUgT zE|J^5^(o@|hYQZvP>OkBSoUA90*~4A$q9H5QRSVMRj41z;yc1euI{fvcnSNY)66sA zHcSW!qyBt|is9E|?OedEooCyoZ^pVFUFvKrc3#-?-o(L4iP$WCwLC-`UX?&UxeKt)syZnG%}9X?8QmB3-Npe&k=0$QjubT z$efzCI3Z>JA~mz=CDy{|UexDoFs)y|-fGG=uF>DS;A?28#{r%Ifd5#33)l-ldg~{E?+D33IXS3n&H@0I`<&ka zE`nQ*1w0PW0_V%TX|8a| znpwBrV9MriSyS?^$y)y+d1+1N`n5Sc#W!ZZ^e@?rK8HcaSQ+z6xRPC(CZ05Ko2rio z`snqHfm>!TxYx}RxR=di;C7k4;dYqE!fiE6;WnAa!EG@6&{b{81^ADf$HP5hmccz_ zo^UU`+U$#v3iAVSOU!+}dYi91f6`QBS`ew*1 zhkM%`G!p*pEwch4*UgXL3+XZk-}AScXW(sI`AN7s^BlM<%)fw}ZjOelHP5}5 zPl8!}&p*ff6y8RdW8j9GpN6Y2$HJXvegaUt`W31n2!p$$An__r&G+9qR?k=#tX?mN)ySzJ@L*SG) z?>42)`&y`NY(lWjn=_BWqDQxR5LlO7K>XX(um$EIaX5Q=$UuI`iJijlJUWF1%I~yo zY@pGHTAFOdUZl+5AJ!eGTxwGoa+u6-GW+=Ro*a)rL{kzUPi!r_ z=q`4<1FGeWuQA3+B`jF{SnwK_WCQd)4OXC7RUefFy3VSH@Swm;SRNd)4 zpB#a#DM-bXm)$sm3H)4I78E44k<>OE1-klaUDg3XGYW$mDG# zL$`o`ok@nSVNvg}x7#>AQ6n@C0d@c?2>Goa zKn(zM{A~l^1^_GoSrB^w0Clqm1404&2`QKgz;gl86eQxH9Q7(e9ZK2&7jeL&0K@?@ z0BCb*50-7TrR)%(1AsVX*9qB)A+}QnK)$=S0O|;-K$|KNw{knEi1@!gwA1?Ure7ok zgi!5(>!3#$;+m9RK+S)Cmjv2__5Usr_vA|GNgMHrcG1o927)6>23m?RyCqg}6e<|# z0q@oZzkuC(Z*a1n%mm;2;d%tLZ)AlGnkDQ-;!s2s+!?rR6Gt91hQb|hRPM%J`H5io zA2m$<=mTAymdz;89Y^QWF|%+s#_CoOYISUCv93I$IQWJ10_1G7b9ZA(n(q4RN$BQc z>%W<1_oo*yE3sOu0(eEo-6Bs@28SajZi|a{>WN_>EuX52Fv{BadImsXSnROKhpTDf zu+%CC4g%f=90L3bFpa*>(L7QSyG1@!zYJPb3DK<7EH#p$TIdJB4TlcMHj)Q{g`lrgkNFz#zXr z&8Y9jdQ>cW(mqwosxKn+P{iX$S0Dyh@%PpGOQ8)xG#5FZitLuu@3%2?=_8$#TOh&@ zAHa)j=5hG8!?!Nzb0PAIXqs8NlDb;uMgA#Cd69pPrI-(ivUA@n*|q16p~ER0XQNHt zXe|E9EzFDrDD+TUmyQ;<)sB&vn2xTP5z5;;+Do|aDzSBP1=uai)wMA4me8SccbGC4 z${4@1qgqk4{@WPJ3b!ddMk$-ZsA-Cgqq*7|8QYz8%m$dOQ5ptNL#s`Jpd>1>X^!K< zrf3~+mbxjLzS-uF{L5KI+omuh`Ho=2+yn7Ezo_GOAkA!37(yD}rx7O=SrRu*HU{u@ znQW9r-$k41sJm&h!2Bdi7x6}ZGWxLsy#zk-NS_XvnJKj1n$C z9UG`Ii)bF(x?z~hUnktwEfq`wj0a(Nl(@{n*uERa?bI-sjIHLM`fz*oIG$2NUEf^? zPG;77M$LnswyH-)58kN|=P0lO7<3(+%6Drpe3*ViX~LMG&#-s<&OS02zDLL%VMo3R z%l)0}5qw)WMcCW!w1czYj}LFGv?@%&FJDKcy)k7L840PE%_p!^AytfRs2WskH%Mvq zUhcAUFJH2A1Kq6Jy3Vvk9?yipJj#!unmb8^YiNf&F5(Mplrm`S(G;!7Q^MzVHK8)% z3{s_e;=g>Ik`YE}J}4an?OU~OD)kv5Tkvnt%ir?50UHP3)Do^=S<=#f0jl8#Vaa1D z!nVeK>Dwf58PvW1kb;_0O@pr<_(22t<~a6@KD^0PA>t3S`{r~dtyD{YSn|zR z^7Ul$aG7<7DL^!oBZ_v3Fj`kv2lDLUo2UZkz)t7YozB)>mf0sLYa2eQqxN$JsJK!O z4l%q>wvF1B8A;zXFuTX7RqHptBO}eueUn$l4X8?3&23(sNv zv#-7B>nt5v)yyiaM@@73CZmsVX!G?BEj!oN*XSOGY$xZZ&P0S#=`?_U^2gIuD*eT~ z?hKT7e7z2h^EQxPFp-!kD%*z}O1NHE71w*&&V4<(oa=WKwe$)GguN%w*K6=xjx^}o zUPl?%Kc}4QT~pKAPe2TBN{rsS9quv7}GjJd=^la!|$~TZrskO*-fLdJkjm*iZBYlUk zOG?+BB(wKyNN(i~dsBcFZl#Ke0+~^(cx}#J!fM-D>xZ|fIeO3G? zdeFrM-t^N|X1CJi9*hR)F6*&b3T;4~T;_2l8L8d3RiTXtTSJ$NZ*A~pJYNVmjhf;3 z_H<$yOC|wtH-l``99&O*S?hQ5glc71bQebM#XVO>SyFW;skXdu4Qt~D*07I{w(?eU zh!O<--q;jaBZJ0l zM_3rCF077^PLn`E=KF<)S&1~QlywzusNlZX4lPN}8}G&mVojcod?71q?jBS?YU^3! z;JT0C>Dr&q8A*3b3D>=?`cikw2oLMlp+xYon;F1`z^QCp>&@FEbM|Hr8`plbK3pWn zzGQD1)nneg%_g>f=^K4fFQv=;ml8JS!drtN3P*P~Wm=;@kJCyn(be-t6oyg&qyC29 zzfxJ^tJ8?Pqui3PNsck->luSzRU&YW_AaDeHEq`+3suVuzJkyc+*OwYCx)wUHp4$D z=n6(Y4T-dKH#Y2arWQK2rA}3$^E1*cwqjhVd6=bYU;k z!ndP>E7P(m=gZQVxqOAm=f&I?(#m&H_i21knvs0I`=jm_wd;mKN4mM$pQA)Id?zE+ zHwwGD4@SGb#{Rv#Mw>$?+ou18w^Z@Y7j3VyKkv|LKlZ1<5z_x9Q2m0`6*W@sR@9F+H|T2X0GpVYlrfc`(S$ z-$-|1=4fzKA`X|9w?nV*i#d|!nIkvX*rDtXxOrl3oO_sg0Z}8dc53A|l2mFPYZ_Ox z3}f#z7i4ODX&`a;0Vub-VJ%_-b>x)ltD+ZY*9Zn!Z5vIELws6cjTFO~Ii54D}_A~1VHku zdIeAfC zwXeg&2G#DSXjbh`>g=xFTg%R^EvRJ|*RnIubtu%=bxPay^qrPj>0v)!n((1)a2vkg zcClxn>ocOVU0=bdFCE1xcTo_Cm0!<>S(uM`(JkL^Bl)-@VwFq%DbeOm9O?Pzc&B)-jP3w*(RMSo3-t;ny>a#ee&OJay z>AkBmc6dINFq+V9Z=ShAfx_||+1WVcn8^bUC!FPb&q#ITqOTpdsI*wbhNL5A%!KsO z>g5ZE8fJ3;u}0{~iN)&OPy#1@a4>i?hW}tx40(BJ0!}{YEy7Gr+5lS!Q8rt|k;`l> zM`~CYf#~>6MF3T4}0vLx?1g?&B##C9N zBwHZwgBx9Njc}t6^G3MQg&X|tV0tEzL@-TE zU0%WAYOl!@Wb+|iVupGtpGq2`y&dYA+E`;v=cv|!s-6Ryn==|WqUL1FQRG_$`QSqDrxr3BUC7TFZ4lP7x-r9gBaRxepF=jHOW4x(TOwS zGzkXsLAitbU^_d&z1fLNw{LbDd@NXVMF({Rwi>hh3S-FL2hqA@9qO=c= z^kKUJ+;%l32C25UKtSPV=&y4txtRRYGplrj^p;t3+2>)AV*QP2yzH}-->T@I<*79# zM~bA|F#l^38^ASR67`DR7rlh){R+r^Q7#nAd>{Zs;}B5K2Ew0^NkL0;oMJ zKxc){_jw06b*P?n-lEF@{8RBclcGoQDa3f(`;kixL->p&PO9-~M!(czSo@Ge8FVFp zh2hPqx@XiKNmNd^@ppX=S@OJX?s={N$u7$RKN(f$kq0!uxI*Hc2#kv(6V?Ea&%_rb zfF~Ns*r~u+C?7fuJPF6z`M?hw$r!5qgSKtlD>a<|kmI8C0G=ywkCf)4Ksp!jWLmf0BDwg$(AceBhQs*)Sb;^zSdj@002c{jyV zXa7s~ws+By(i(IKgg)tZ$EA0td30o_R(Lw^-MW#^dsk_`~}SEM-53M0>uxnpyx%jPisTb7^o#$2aBDG0_z!*X)+ZsL|E40`su(( zM6&1xC}=PfYeVIbUqlLo;WjF{o(UpiFkx2ARnnN`wx0YV0JuNeso^sR3$MY+0zRtc zp&hBF3&bfXGd`SF_+cXg83UDH>Y3JrRXUp43HrURC8O-;c!4Y-y+D|zvB)o&%H7bH&lx5ow=l*wVL5KPW;(dm$psL2#z!qHNH3;VQqX^MwUP9LOZ2OX z;_1*x@3jQc&+*)wLT(5nbobGb;F&`1Bk)&LHnn7fL+xNS+&LE(i1P<3FPv8}36Z=s z*>WrS=3316?}K5wat`~qbIWm!rDZiP#heq{n_4jEhyCo_XS zRnTc*K##g_QEAhC&C%4{ji@zt?(9(YrFIUY;xSJv-#ehPy`QJ5b2n0g9vRp>>eiQg zKeTwXmo-hzP-G0YmT>>kRMB!4lT2*EblhU+28)Wgrfx?QJwW(+M~w%sE9aW3S^0?6 zI>%F$wir9tR%e_tz=~bYi$#{mGg06IRWz5k2E!*%PNyg5j-_1j zj;0!$CjMIpZ{fQDP09K-l)ksC$~YVHuHRA9QlGK0EgX|!9D%N&aT`0Q?YqYNH!)?c z$8PiH4v;&K-LBxyWS4P`18f@CSXI*8*r-W0kTdBOT;suN?##5kXC0L1jyujKaqqMh zap$ENE$>uTbMM&L>G$3}KjO1<-L7C3vVo1JpHQL2wEX|7)B9u$FWbqhtq@i4QW0~V^2>A7z3*HUG zi)M^y9FKg{P+*mtrpmEm$?;SR>`MXueeL<5=WFt_%Bjtyf=`>Vk+>(1`2OpnX8uOS z8uDKq$SROt&6W5=W#dh2<7%Xx^o_Q<=|GgqcCe|?GXDVoX$O3Dclc_=#G~lw`Z8kx zkJlLkd2Gf_PcqB}@{|a4Lgj?olX013_y{l*kT6njsb6RCkD80rHTI6alb&=2GHm0+ z_Sswdsy%c0^sxORxd94dNh8!i4NITI4oX6J5;qks6(^Z${%bRCkzy$%8}3nc4nkm- z^rJa(^fz%BS|R(ub-|0a2HHe?`*%P!Cx?P92etHwdBoi`LK$~GDB_1ynKsBd;v@Lr z!)^I2BEDD3r06dQHsc{0n}|~DZZcxf?(yz0EKZ?lMW9*qODwkCH%1oQ!K<_npiRZ$nW0%omxTjFp6kOle44OY zViCS8=Ho`QQQYbM<=kmU;dw>4+I@(QBT;~(`OnwFLGx29irOg0_`DfvY`h^{3HRqC zMb>gtu-A6x1=R~YzhA?C+`mZg0lc zlvucb)N?o(K2J8u&}-_MTAOE6xAi|-}c)?pvD*s!-de#F=gDz+=?z|EL9OX;}k2SrtrR` z*&L-Hn{dII=qckQR^xBi@LiHv$-Rnw#J9m!7r#jIkXjs124_35%HO9DI(wRiz!oh9 zhrMh2k&-Z>2FQ;V$2T{xZ@Nr-(ZdQ^Y;cv2(R`>!n&&VuTP+DIGgyRH|>JYua~qO?^P+OKI!<4a_)G0CCBx$DI=?;#*_R{ zH~{}s8yjs2eaG$@6mPHC;?|S;Xw`^*Jr*NKL`Trb1_a+$d4=lc>aJt5ZPAhI$AK-t zyvDAs4Zi)Q)<2l$#ucxk+cZ%m)$fbq_%tVVM8seiLTn+^@F^8(be%|!cvNtlwDdKq zX=V~}gZDV8X|78NrvoXojC)&G-u$*IaVM`+&h)C3L%hZHU)?U~EIi zbpemXb5u>sF@@)gk5X;rrMfCcExv){u@?F@N}addCcY%M^G}2JW?3Tj$r49p3>Dm4 z)$9z*jD!5wRrb>*TfQRLc4`RYoBsruyd;>0EvLFy`SQIV1)?Z;X;BKB*jG`&KMk@^ zjC?p2cX5RK5Duu{*I6M&q2nl2K6`Pmx=I_VR0`F#TN#sLj_YI% zt^H^k9W0_vcJ3rBoSO$6T=U>gOVB8VVY9vO^Wyi<0#}xC{|Q0VlVaE3N}(1~L>B&K zQUt$pha|n^OLe;;NnjpSVqfU6s6$eOm&=8h%ST=c;Tb}B#*g81K+cdA_Lh(pBVh&a z1z`O6tRY7#Gj_m6q0+&fIPeC@scN3pM1{OrO%T7%7-&0j`DD~~x?^B>&?dLJ4nbwt zNX=v+P_?s{)>)3paTvBCYKPU^MP;8z_(e zfSW@qRz|*zDb$N9953HF>d99#^8)&$w($M(>G4#w8m^#o1Q=5ItPb#!X*(^WeP;%i zUhRlECkV5T+9m$}MxisH_}pQ9J~lnn_I5pJvD>nAw00kY_^*|1qR01J12&48K+j2+ zTHO$U#9CxR4!1=@bwY*2!;SPzGVBB$%DC`9bF}s#RaU6&SU0E?P|3Y#9`&P9yPN?< z_;dhFdCnM&nqb?pWVzZ^{^Q72*j)CJi8wk1bO|`x^H$kzpHBF95*TWGtAEsQ7*uj^ z9cG`lOdpLLH6R68?-|1`=hO<2o}Eia681G1@Deo|pDOuV^O(OJ6(+YG%_^|W8l{XS zzoi_hy>4V}F-9VO)Tm2*fm2d&ya?A$aBn1TSem)I@ObfYdY&2jABSfwfZerI-WusT z>Q6HrZN8UU!UfKy$3c~rUFZtvjg4`4>6wMDkQ4A-&`(&GDI`QE?fvU43J zuRF`DxRxCHRkWArR-OvCi?K@8jF1NYGH5GL>&e(0In44EB1S!Y$mq?)O-~@=#BH#$ zsFf1=qkIjK{c;g(Vk4 z7UG7F7|#nCK3%+PIJgvFu$a}M+yrVm?yJ+K`|8xLIfdCW86UT4#SXX0jxRIEyni~w z0Y!QYAs6Tci3-}*_nXk_&RArfDv3UesBNkg8so!#h>^3Xm&Amkm@D;_)?CvXbg)kZ zqJ|_r3T+$K<`vZ7^zc>qmYX5J9)?l7D2*oX3`BA{o{sW`w9vZ|ypJ2HLMP-K2~plf zT=;IMdI-NvBy0X~A6*DPJjiah9$g@6G~;tanjugGJXw^K|M)m~#W0wpKydIOi2$a5 zVF2wu={S;)EwVU$pRYG52_TP`Od_KEKp{Q}pAZ^1Q%e*$@KeQqMIy}qnoyZg3I60_ zCWO9#n{rSfNspkL1nOxsIlB63XqQz$9v_+-}Z~JJfLNR7t@x|uF*2Mq9gk8*UzwXtQh(2v#_`;l+q$? zI({>W{_@#E_YnQ{vk?4-88#+~_kNeG9jOlfB%~D~4uk~Ui$j0A%o6ILzf)$nDou}! z`V(dL1>O%4Ek;6@AX;^)=m_Wvr9X2lh<8G|1uYoN9wlt7d)B|EO|SehT* zMa_=2EF)8P=}BV~{o>mpn<9+J$}8esKkT3;Ao^?itASl%7o<3t?J^-RPr1!5#&X5$a@PqwJXy~i^Lr{>Rh4Yx#h&^h>KOY|+2?;7UlJbV*d z_uB?UOYiH$Rv9?O*VdtN1lAMAwRy?-4}s) zOXKikDS^>-#QyRsjOg3AXX%Acc_q?A0^(Sf_*n`VyCM4fIEpiwu_cb^1~3gDsAqL_ zmxuDw_2mDGL^+;Rt9doj>d$HX#As@;qJl3Bl40-&)${Wk@*5hiHe9{hceSr?uy3eu zxX;}OrWFg8Cc#gO(T_u1q;vPdE?t zV~7=?2dtrAk{j2g#24!5mm~2FI`4$3ffo%!3%^3&Q1w~GMf6Q@oMNfpWEsr+GYPJT zHP9GK9lM`j^)0?`V=0Y!|EqEVh3iu5Vm?`8EPj5ppa&o72`~t~5 zVY9fT#m#Bi$^049u7k2MVD4Hq&Wfd=(A@d%;ZP+Q7X92r2{RvlNpLb_tJypw8B)X< zrZvJUblDG0D`|~X>KaSr@LCKM{SjjlQ6H0!WFB$fWVtu|GUxa|q3#>9%@I(4@XHviC zqD(oxgO9pJ(YkFz-4fixiV&eUQt?wOxK0ziKyIt)T^{r|HdiTEdWK#YY(bKg^bkgRlaVMV4r3rJ8N*KA0^MBC1VMnJI_5F4C54j9Qdo|!H?VVDqD5V z3@wqU-chy2xT-JFv!T()K{DZGTv~E3EqPAZNXf79C3{A~PQ_0~!nn~!!XDR;BcXcD zKhz)oo{`Y^jC=UgEK_X)sMXt2m1oPm#W(MUTUDdv}evg z)Jy&lcrbSV8?ET51+A8i@&1pZ|EOLn`ON~!my6fr;IouVSku~#%W)U>C5se%mVTNl zC&84nNN<)B(KxY}WQ_M%AB3f^f6<(!&sjebIxlOz-ZFo2$~fM$bggCm`s{J(>+^C_ z)@K`YHjI-J`T(?aeNNI#+3+nkug|7F={zcO{;$^VJ}Rm+Pw@D2i;@)hlEPMEXvGR4 z#Lxs^LO2fX@yJ_g5rj$=RM4=t1r$(NRMn{}5NO(9B#w*5QQKiyM{UP-ScY&6V;f=^ z+c3r^N-H7idW>t-*v4^O$MLw1<8d6F?{n*-xckriv7YnscW>S2KF{xY?n@Q*ay~Zjl88U(iV})0A~WD}j-Aifp? z3WuCBEDcm;`}|Q$ovU2o2cqOU4!3J{)O${MD9hsx8A(>I86}qb>Sa5!Rf23xdqhr- zc{JBsp{`w2Xg0oEMipvL+GI*H-*?OGvV|zNtGfB9)y6Jhc6&T(e|X&L424_) zFB_2ZdYj8xVRbjSyOH=4fia2HGQUPN14l6YxM<g*x^wHoF`PS3u2AKTaK_LWkABHq!PE zVP+o;PmAnor?*O*VT;P)8r_G4lJ6^DmG5kH1#G_BiN#*e*jam{x7@C^%m!*4oi1GM zl_N$1#vFH$AB>OA$xMrC{Upa2vp;vi`jeS7dnX{LwyC*fv<1)P2{-4^TjmC|3U701K_UT4n zT-m_T3WDseftVQ#`pVtvQ6H|xUhed`4C?=Z9CtlOfjpn(HiTUATqdIBoSB`L$?+T^ zRFUuVtt$2#9PSDirzvlUeU|OXNpGo-;qbBNswX~e&R}+XE98drI2$eAN}nj8!m;y4 zqmf}A^GJ>}B#&c7C-zXe|BRcBY0XpWvrv)Z!Yshwb$}Nt?oXkTZXL+^N>7iVJ-h`invRv#CE^nrR3Zm50-r}sc=Bb;OOys#l z?s4)|BBMN$$XHkx^3ZAdsCK?(9r-MhUG4VUT=nwwlPOmUpL!G>>#*0V6-OD3nevbf zZ)=&jdXQ)bJ_X4ye8R|#j>`7A0_83_4x|)5vpB3;(I}o>cqR<0X^3!lWJa<|J@tf( z(d~diQCrO62}N#iwY||9ne~|N$jsG^DEDgh8FZ<$L9LYqY8SK}f9#1d%dDLm<&LEu zsdB&6hx-}si`;``f7FxXvmUY$$IIj3S)pjzj#XwI%v7HSpUuc^72Y#44Qh_r)pg!g zjq3A3Q0;cKUVR-={KC)e`db$L8u_9^9tMg|-T!%}aaNF-x-!w?_1A@r^j-$L%e9Kf zav0N)i>D(OrM=Etm!gv=ZADk?Rbx(_UyZp9&RTW>MVHI*+z?W9a%5>I;NnQmaR-#_ zxqaI#jtOUZ3;mDh#H zIU>A2_=1J%wMaOw*#`a79QGwih zx!bMncRcB+`;@KDEB7gP<`H@&*LiMc$eqDF|!IwWtZ)Z!O^8-X64e%Kow_N zxmtKiQBMFKx7rdX4%xh{^XZ|W4vTE``A4+9yDH$U9W6l>PiM8owf>N7lqGU%%sTQI z3onqXFlQv?kgK-HStVZ*C_0{E-Bsb^cXV3ajN!+5y;(h4hF4FDj+ai_8tU3qJ?5Yc zA1lueQn_(Cbkv5zd-mwuMtg+MqTe_=ORY@i^6cCw|H61Wtv(x%E?{5cZ1QxOPVN-X z=Cs2!T!$s7Z4G*=aP0Gk1KXVE1ZSCx-OJ*wc9(IE(b1OnmjtILhK`ei+=)3`kL*ELlJ2u<%(bLU!ia999-awDqK>bX{(;x7(`BbBGW z@Sh8;s6PI5)+k3yZN?}Ein1YA2=Nkt36fT$Y>jzdWwF7?Q~=un|OgQn~v-utu@hwQg{V&QpvwbwT@0+XXs7x`HuLS7T?rj_~TAR&o`U-r|5sK#Y`>c zX|X_y#ab-YB5&gIPtm)z7}R2u7F)E)+kpI2^#4_hZCd;@Ew*d%FSYm^E%J6I{}g?f z7JIb#w_5DeB435)pQ8VJE&g7Mys5}PMbDc`YUJlKYWz-%m$i6Ji#N5%o3#8>^#7to z-lkRO|2-VX@s7Ei9~Z5~Nm`t&#i?4HuEkfhI7^H3wD>1lT%<*9yvG%4^L8!1r^OXo zbZK#w76V$W*P=H5<9?;huhrrPEpE}GHtys8YLi9Tz(wJ*MQ%Zk8ZBly$^VW*OOAMN zi6uW*J`kQT7uw{E4EEgo-0UKeooUY%Il1P{;`}1HNPF0pYt79p62%2YmVA*{ywobo za24@oGUWzOGQE9dzrQZQB=s{T&u{m*)o?gX|vE=j>RUd zMK)1LCrO1~=38WyS$VQAw5UzlEz5H$W6Lcnrm8}_BiClP6c$jTcqu(E5?RGXVhL%< z!70hkB_&&?g}&vMSPN~;k3(tcth@e5)a@hf5u@idyh02SZxGiIZxOqR_lSMOeqDLrk z1H=IFF0n}{KQ$275mShph*siuqFld&D9bZmKb7rv31zw<{+76c*iWSYFaABTp7;l1 zE0OV;PXAv#N0j}$ER-3k#D5?%PA~p5k#T?VUx^2aPl&W*dzkA7IAsC(b7J6B(y?#@G0Bq0F2@Tud|*^N9}PyF|v-$T-bx zCNfSl+lh?RO!78zKlPcniR@Q1$=}#UWcwI@EfkZU$bMwXAu=weBH|umC2=2-{mR%) z+(~4dOg+RyLU|>U_&Z`8@fcC&eVX`ycu^<`S;QZSHsb##GLFXoL+m9!CXz=CyjkWPgZB5Xx)xBZhH#Z67g}cz~EjWPD@(gg8uGNW4hQCf+12 zA(BVTQlTV~XN-+FjaWiVBL0GyMqEW?ytw^_@;ciyW;JmU@s~vMj$uD~y@kkr^!gqm z$KC5g#J?oU_PU67h&@EvUawGQ>Du^GWqVAYP~MQwRSNh&hO77{%fo$i{v`7W%=1kY z`Dn~p=F{YqHh+QntTFRfn759Zzs|gT?ielqPt1G9%->^PK4*+Bf5<$yWle4`jwo?w znE4akE6iLSwA>d|W3@0d$^R^n|I3Sq3Ug&RI4LO1PFc2C_c_-rh*}~)u1(?-yJG!Z zIiK}(KDy_d-nFarCS_%G!favaU0YKe`3o)yvdJ`?&xAZrj>!+}`GSp47{)v@#3N6a ziv?rno^YAJXUm=(dTwsVb939Do7?={99QV^R`6-xU?Ei?V^-qIg{p)h4(Dsu1I& zu@Ggb2Fu2;!Fp^5?T>%RSIp_+1j9ypysVTd)}GJ{TAV)zC^=CFdN6Screhvx zVd4@vKn4@({lt1~0X>_z7d^!hcIyAp$eqYpH)a}GKgNVakZnu~<{%C8u>gyZ1L}`q zWMix-LJ3N-60{dX?_xagBZLMtqXn(lfKAwf?dZTx?7=>Cp$EM@wjuj{agBlw^6BxW$1}v5Vie+$OkKin>fgEG+;vqMS*24&Lc!~C2 zqOF%oz#zWFx-SiI$7YsKOT-+^#}d%?v+&jhhGRh-0HpZ^dTxgR;}l;Re`nGxUhYbR>fHW{}ei#%D%5 zSbxR=uO@_xP3A4c3ik-FViGKZ=W>Pczw3W>R)$3K*Z6 zA*=^E&ZNzmU7)NQwhr8MFSX5(-zQAVI0K}PJ_0S9`FTcJ!T;l^zn7Z<@KxF&V@W??Zb7xu(SYO zV7)iwJUPp!(&Q2$enwtDWBs48UJBDG9-CFZdrs4pf73Xa0%CO8~5>8h_@p_ zeQ(EtzQ0X=Z>J(1^zm&o3gEyBRKkmTtigJ0Mmu(+6Z_GJBN)Um&J`<;;D;6^GK0~` z*at==qX%T2LADu;K*nJ(Y8l6H9E?WB2+ra>7?q4GxP}|Jg*%|v84vJC2>D*c&-E~1 z0*sh~X_yWZ5-|%Yn1eLT#{w)u4wfJvRurKGrC5myRKo*5LTErUTF{CO*n}CoW*%u#1&k_4cx*V+`|Jr;)@XidKfT) z`*an6P4f=Z?@YrI@Yp+S)^}EbUFaQl)puwk|2Ej&^Y7y!9&=|McDtpKp#0KGzTQXO z1<{y{I6kthv*_GCO!s35*FjzdX-(2Q1W!glP$KJ?%q4&xY3;w&!W8gAhp9&zO@JtklZrXvw4NW%i;ARk5C zwPgbsw_?_JFxC#n*1>v?c+f{jHT+-<9ox{39oUV%=tMUd-x3elAC{GXb(T?P**>s* z8DqcfFplFq*iOqHaE0SatVb_cwtN`uW8Ae#yie}$Cu0$ofLz`Wpb48mF7MOE`?UT3 zK@4CJCvgLhgeav?r6wd{9u^`G4wS(Q>MJFOQuaT*u7e+l*c7en29 z!7to@dzEk4-UaD99}7{o1~gkX!W}di`tl*1<<1ro;aj%n0#T;DJz&}T@Uqm+OZc5yN6+`Ekh-0KpwT!Q(F(p*V178aWG*P<{<+su?O8ah~pT+UA|jA9}8gv`^7KGIXjvd&Iz34HR(~*D-oW*%i?^^0u zTL8AjTKch;ZL#(+$Y(9vWGy+bmF2E&w7=lAM1C*0>Rd9|M?Q3*5?<7!86TnxjKjJq zAlG%|x{mzTtwc2_vu+z`b6qcJZynoy-EG_#qIEJ@ueBA7K`UijcVHjLua&x6=|k%! zAwHtqN1MT89}R$PM?X2W!(Z~^`rkXIXZwb4!+ zd9@wF5H50YTLUP!u@gNYkB#KL@fg49U<@{S5JEG^_2Vooffe-qKPQJjKZh&04(e}D#vIUY`zBE5Uo1xjsI#L9 zo3Rb;pzj@wZwLM8pq&nK>DUkQ>5%37aRf&(h#?H)G-$iy0@yAcS3wRPH$fg9cX1yN zL7)Gd4v~n)Buqvu;t-DnBq158n1^&^U?H+#Mji@ag9FR40%fQ~4ZH}T9!*$-53wF? z*oe(Pzu)F*^gsjAK1m1?jny}tzfKoQO~Z^ zc+Br#ShjmR_JQrWo4R(hzyF5y_e%L-Kik^_w$a|JxFN)UUjRSWaAB@Eq=2&fmSZKF z(89IvXzQ={gF63ui1+2Fvy*b2j7ukFJ6GT&&T?sqB#?g>W79>wUF7>W4Pg3jXt&!0 z%5P_Am>l+3(=DWa_gb){p7Hp>HVy?e*?DQ zh!CG9fHpp5`KR>#)0Lq9Pbu>$+vL-B>;^ga#)CS0siU_I0~i7M_TJ>OP>~o0?H@28 z4jDLzez5Goc_DsFzP}yf76r6%kTwod{@`sPKBL~xXz#O~*a!Oj8QbAAmi5iT4)h7} zxe?U;`G+8n&$odbKR*iU{hW0^zs_&x7QhPnbf_AXKeQK=`(hFDKu%v=;_}b2n2v>L zz#6Ov`Ssrw;_uS21l0F;rh&SCXGQ@WAg3dVr~x@2*@JHM;+_y+GEQGo z_Djb5OLF^iC&=r|J3FsISuXwIS*3LAbAX41v!4r zx?j`(ui0n5rv0y}_iNVqnsvVJ+!*|wMfr^4$K$~;9G{2zpqb+g;c-?uUWq1<*6|J4 z0#ZKSk71m}MO+i&gb~zrf>cjrAPae@fCnKoqYdl|Cm8Y*q<*3s2SA-Cj)HnmoWoTi zhVnuBLu;@Jq&~ztL##8zIzu;w_`@{N?jPvGA86-f0_gV1IiNo$8LpFFbYM3+u^;sP zByF8y-BYZ4Dh1?zDhsrGss?`0<|*1dMVqH+^VC&55@I+S^m&-}hfPQan`gKPjN35% z9cIjiH-ljxrtRV5pv__WH+)HmZ&>G>1;_zye&awZ7d_CyfJvBw=^)1u`ZSWY(H{A+ zCF1)MrdOgGa-BA81LHbEA4iVz!+LW3mK?t&$8X8;+j*Fe02;6#XK@Ae=`>?-nlh)^ zey6kG#~N(MUUcCg=)>vzcr3&j+BiemGo`2ib)O-hGn=pttaFBT&h&wt&YT48ow5Qj7{9%om;gL<@pzMb99@A1jue^TH1B&34!=c(^Jb$mAo^z*v}q<}tr$M*Qn z#xG(68@{uo50HPTy|;effS5dT#+vcaSQkG zNGQr3JP?YGPZD)}T&pu;8cdjlIhc<{;A2;v6@1L9TZwA;(SR0gz!r3154zBcLm0qu zjNm-3;0EsCflwj@3@~CEOqhi^n2$wR0xL?e64mgd0WH{oE$F}=bfFiAFo5G2!FgQ4 z4cx&4p|A-Ry#dBz<*nc@OTC-{8azz4pDe(*uBVF-LzfDiQ)10U2HZsI=p z5H>0j(TGJHl8}saWWbC(IItX*s6joNupVt_#}0I&8-3`+X z#3Bw!NJcs`U`8GsSdL26pdL+Fk2bVp2RhM>KJ;S{LpX;ExQ?5+kB34TABkwhA`VGN zMmjQJMjjkkj!M*^9!*$}Hnd|0I?;_j^kWc1IEM?kj+?lTheDYUiD<+k4oOHxIx=8J z9voPXO4OhpO<0dMv||T4(TzUzV-Q0)hYPrlo4AjMLYWweXv888Nk~RIGGIm?99WJ@ z)Sw!FylF?OejGaIJq!3V)7+EMrFO1SMZ5l z4xh}mppQ?su7DHHEKYp0DDwsMe$ z{du_b8{SPk(ZM^12YAPDI>@B_0`Cw~v#XtV2Ps`SfMMPdOafU|amuY~0jJ06HtaXFR$K1yfUW;Uz&I& z$@*WV^Gc4M4aM`)r-GLy^yZr*JmqcYX{-{Dcq*c|mvuZv@Yt0dobLDh+3y*!h`U1m z{2u zzoOx$u0Ah|f^vyJd_&Tp$yr|R;v3T5DpMszMi+a1rdn4m<#PS<_co^bxv6tg!Y#<6 zvJz9sr^eK1;VOUYEhqnTAJr%7&9Hl(aM@a6&i?1{cREa~4TfCq{4n~Rki_u?`~UrZ zLduf|+&6hzrFima>(Qj_B!hh&-v>F%_d!NX5lQ0<>S71v?W09a@Pf^lnS`ttYnjEeV;uYb)<@e-C}) zRymf`np#jdXSRrx-=68Me)6bHKbPOc7u3Ds6Z$7Trj#cKtEQP2aao(*WY3eXH-4cy zNbD^b36Gh~J)Ehv<+)rZn-)EvC$%<k@7@qW~ne6$`Wb&-{|GzU~YY6#0 zAFdgz{+lp`4a#{Z>MQ~<@&z3m<{>ux#hr0ii9^_rJ=lOU69beLl%Z~gGlcvXarZv}YcCSK literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/patch_v32a_to_v33a b/amigae33a/E_v3.3a/Bin/patch_v32a_to_v33a new file mode 100644 index 0000000000000000000000000000000000000000..07bd0cc687852d57c49575977c12432ef9e36917 GIT binary patch literal 37968 zcmeFa4Ompyq4&E62_a-8Xow+d$OI<@a72Q{;*=63hEhaCL_*Y%!I&99V&)8Nf>Y~3 zW33%VL?lR1iS-&^ugCft>+v-n>ScD7AR&ZML#Z*w8e@#L##(9!rE-63W@FO6HShVj z&->ixK9}UT|9h{!zSr98Yp*>DG3rmk_oveoF@7Y(sL!REDusVcdaN)c3Grx1M3TUk zQDp5OHfK~>{q3Pyib-^@;d-TK<5cnSkn|%f_olQ_5uG;Ny7^?*{+p*GQ!@TV?6Zc? z{JmJrb(N;>=#=3zGY7@%(donIEWw63hCAh1)<4PrqO*qkxaY#;(vyQC-~Mpc{=fF& zqT41!_urUwVsaRhs9SbUVY1DXLM)EsVgT(xcSX+~9D6|(9KmWBAk@c1k{$u5__FQb~@KDCS;eK0~sdV^MglV`xN>?r_WO{oe z{5hVHIc6*!zG4Wng+yc+Vz|n|Jk}6oy%vER(!T`l)U;b_q-pq!EeKmHBc9}XozXOW zA#1TOH?^F9?pJd+w|f2Y%Tlry3}2Z#MTE#WZF0>0LikTk8NQ;gBJ*{nLX4Z5G&lRH ztPvY^m#`6Nm@<4NyK1VyG*G(RJYJgO?wVb2?6;3P@blsRWkO6hOc8qHl;M8Ei^JE( zR7DASJ(c6|mHeu1>=+;Nq>kLn;o2gGk8}50ewFksf_NFJEu;P*bBGw9$8><&BE(o< zykzKgOJ%InKMN6azaXS3!vj-Ogbd>v>Mz4W1Emj{AB$jo=|yF1ha#}6`FsX@L&W+D zr5%!9`Gc&lefIj~jdO%BJe2jU%roh~2z-V-@Y;)#F|Z5Yz2Sjd@xJwT}@m4i7|rS#7p65e`rX{u@X z033onJZ}eP4(g`!3?GV~GrVW!SGesn$a3uWp7(gq2fXJ$Hv~?VwPAp;`eUnPh%!IZ zD}D8~_B`1*_JgfaA=XnbE=G!hAyOI3x=2DY^4k2dmcv5^)9{YiD%|)>pS^DMxLI!S z=FQ)@S@yqhW5&(gtX$2F$s5je&CP%>9C`eoOVTcQDtvWn!SH~$?ojd~M0+Lz?Zd<< z#jca(;4>c{qIELJdOj4B zBJIn%M{Bf9+z~6=OPweYcNjleANSqBfULg=KR&AN#^hq4_F)M{X$w+8l))YRdAdL&;>rLEO!T?qE|Ayw2r{YXu<2*1|<2ST`2 zum52P1^>kmqU4iDtY!RfA5ynP=;*^~t7Lz5%iiDTne2(XS4$h;%sCN)>%-r4#}oRW z$W5K&-{r@x*kSvBDiK}m|I&|tcaDhjGDoC;f1g^>E?X&oS|1@tO#g|rigmYqI6w#? zS_mQD+|^QL5yEoIR_i|u=ii?e*=y3u(-(cCAG3(TJ-(4jgJXZjZXu$IeA9-E-ILxU zZC47#Gj)aHuB<|#Pb(DB1BD`?LUuUsC&}ZvI(a<1yinvHD-?H+#nuiqs8B@Y7K%9r z&ZkQozur|Sg8B=^3P1FU*X2QZ?71$FAFY+g-_^_GwwOXu7$eWlgkZO|P%Nk{6c)lR zu@{PE30X?uS0X@&=(!7YX0_sGjk@Y+y;^Zrnc~^uQY#MBcUJ9^uJ7tII#)F*5o(1+ z9+KSZkNTB_4rM@}A`Hufa!tusm4=4)5!($NtHqmxKU!EKlzhdYDsfHfkK*c8Wn8mb zeq)nohhkF8_qx57R@Rn?@_J=@2ZgWw)v4tvwT`Hj3m4SeaG~N@CX!+YRP>mVdfFph}4CJ6=6h{q9aVzHuCz)GEXs zoz;h`Pxek?+QdcA2FG{$E&irh5g2C{@g!nLi73mCaf*n^>xGznR2YPR_6lrv8`3gA zUUf5nW1+ae%OdW)SW~7i4w3PUGY?<0iM!7%6LR4o%>?V!fMNs1O5PO z#hry>uBA~eiBTfT0*lAajo{jprRbwX;P7xsm!*5t2i-RPq;@PXH#mng4B1&qjB_~K zRTfk{_TL7FlS{-uRhUNW!$g!-*mITX-S$|$5Z|>4dt`>-XlPJhx>2vbbk5ajFSnf0 zhlm)Pc&WpszI4p3zNEfdrYjy*G4B<(YTv0us&;2hSxE7C!{|U#VDn3TaMHU(`!v;H zhPN7IZGL-46fytV4y9CGcvJb#+dCpsjn2yOhQ6v@^U09aQbS&c}3QQ7Xy`O?nO8vOZ!salA&7sEN3!ERcW796h<;`$Mn7O zNrMU{T;+DF(Q_KxOP9;g^%=@j?`6qy(&uC;(#?w4nlt4WbE*uj27T?(a=W3`dpAqV z$vMg+@Aom0={BqsV#5wOXZ_iZTD5#-Oxn^E-Jyv#feqqx7v6;|fK3skF0N$V5Dl;>)smrwq=r!*33j9j-mKY~QrO zvg6oJk8qa7O*%on*W7^R0un;l1c(FLb>FAFi68FUq zmN}pLT=-4m!CW0;be0v^g{vJ-(FcT>xZGz)o`0L& z|L8sG-`M>^OxP#HG|tBlaK6+RM%*DG?mb7u{jn2_StpP?V=iEB#4H^9E&o35J>pBl zy;Znt#(j}53>n|h*#A9@J>?7YUO^n_V`R8v8~*o%?G5V~;qefUd;S9=IPXlbqc*U0b+HcPu^Ru3A z(OG-vSLLj?&}IH5F~{4Sxyn+C(^d<7o1PJ3yJ~5vG{zt2c4+0@Ue#9`yy{>1h}6NM z%2==VSKjZ{E0uzVD~vnmH+|e^4VLY3Xyl~9<)LUyT4}vR0v`hcWDBsyvgBy2jbUbys z@?IJES3Q+u;*ZOIA#|b^a`>dd7wM`)BV_7ACt_!R<=7EBHu1bm_NQL+2Ic8rHyfR$ ztF*>`j?KSNT-&WgblkTe<8+(~m-43a9NoXr#*OO%p85Y2w2l8McQQQdH~7zn zPhTXn__QavPUiIwU z=y-UR?9ZokS$2E-^;wqYk+3Z3(#QM5Txv}222Z+6wM=yNdWQ^jY0+6WQJBC=PnOX+ zZq)|Qu8p2cHEN;%#uK|3)P&Zmg?^i)VU;r1Q?=Q%uKMIU--sb>{YKCF4gCL`wX!CL zt+UkUd3EHrQqmKhYs>MbW|uWXYS?;Z+WS>3Q;m`l4_hx|8n(9PjBQV$cwnc|Y1<)} zhx_v)R|@g!4#Nx**IcjKDjWK27K`W)^QFj^7U{GJ!`)F%TSoou2bQO8V=dxO9g_xa zLF90tMLbLI{r#_mE?~Oy*vWp2cck<{|F$;k&Pb;?Syg?^eHg0^KF@=)+Rxy8{^FY_ZNc7Q zT)AvZ9=u`+e0IIpYPpirSydi;SE2a*^$6#Z9#`4oV$13fEt>;ACLRx@FwW~?!Vxq) zY!zQz^tH7X@x_^uf#amFWCaGIHcS@#!r(3g(0Qj!=I8w;4L;BLYB8xz+N|lB*PA@S zTS-&&-xo`5;*R8vj_>4f{+dnP*@8CNL|`)7Y!g9I=pL?{yg9YgDxPVIaxO9J7l{X~ zB7c3|nf&spfrVm9x8XT`%J8sFJd+mXNnI>$JCC_}Bu^k9 zolWR6YSgC(T&MC+1(Gm1x1IDh$7~i=0^M!Vb7)R(xap|$(G<0~p#Q#Kh1I|A^wZm7 zCuIC&naE$M{|T-FN<_Y6nsk_3+Y>$4_q?u{=+iZqYSrkubsbM99>lzh0ZFT9_#9P`l{ELr6uC&3tnH+Y8=y}=UPIDuqyKD=bZD4V$1lCf;~ zCg#U2;;%$x&fr}W^?5Qgo^Gn`jLsvY406~Vo#%3-MCWrE_WYb6B;fbP2=_1II5#cOommZxc zia09l@+=}R|EHUR5NA!BJOi$;6TV1nqP-YP2oIs5E;VIRhiSD+N=QBn|0wrjFDC z??blB8tE#FERMOIKc*DR_|#_08B}Il(S9 z$8XcGd1mJgtP)Yqg$=}>r#Ab-rn0+>9}Lf}*3TD#R=rnsR{vT5BK)wyGmw4QefD;t z`=0C#j>$E?N}pXp&zLpRI?P+XN=HcgjGx#<_Bt)R+=l;!Z}nx##aY=w7IEXe^hiDc z^ZWv5_?|J&%VW(8^=K&`@(|2Dms_1Y;gh*h&S$D7F&`YMom|^ZnbKtSc$Xt~Znu^i zchrZRjl$tE&BS@jWS{2cy1KH7#fG^KE~!Fu*F;fYM6PsZ6T?@0NuBF(mH8F>ZyXY# zN>o`?@zIfhE#l8t$;&a;-1N`R@!rrOym>m-78^Q2?%x9reoy^`J6g%( zr8%o{Gu9R)1F?#%tCpVJ>T-Sk%w;0GvrkQIP4v)J-^p^*y&}M-?;8^ODCX?L!*T_s zRm4s3OA&Wwr-Zd~=WfS6bt!f+sufqP!N@LNTjwAv=dL6KN_B2_>;%rNgtfG$BVhWa z^-*;6|GchF%}T6Q=O(*4ejNDQR{6L@&vKv2IvhViKU3VjOw1WX$CQXU*PGO=BXyl~ zRQa?$z`(Y@Ua@w?x>jCr{FH z_*){)ql&g3-TZEfzF5=_4_Om=H?eqQ*@WUpjF{-?wEZ!WcT0zF*g`DV^=b5dSGW!z z9y(k$m`}$#;Bb%6g*&>9x;h4K)c84X{SFty;;e`| zqjMY8D`{@kd8}ETomk(N8yV%yb=0d<@@mv6IklK8aovo!#(5uvUDkle!QZb_;vA7v z7Rm_T?qOoN@F|P9X=?15Z;oVj)0>z!@3F(x89m1qGV&BO-L@;GL&&-AZqHz0GQym5 zmc`ke14>eRPDI2zQO=xF*?9lswZCRHCxW)(2N^XTKS-#Y5`R3>Ij{cqONBLk^YSv} z*tsU-EjiM)iS$mRb6#D<-7HPU9wyw_qwX?eal-Aw%Tl}v>xwYXV^RFC7vx|wJ2gS+_o`Tx8wElk`%x&D|; zT;c{V7mGS=^zYReuW6ld4R36ZNU;><2t9uM@t=DEp|Xqr(eQsYxyYWyq- zqe$;bYONZd#@cLrs$9Lz%7_^)M`swNwk7l$%yR}CI)3N&)$dI^lsxsx^~$5~3@-R- z&U)V*kZ~a;r8ha}IS#Y+{n;J@3`@w5E(@;DF0@JYdT5Os4ZoW6-Q6kuD+}36PiA$X}YGF8_S}9;5Rc*yIiR0 zbDBP{DGh=An^CIiKWX~1ra#oQO4A=}sujo#tw3hfYvzrbZqrmNkQuwR>wnSoziX-$ z#Ehfbb*rYwHKp>&zZvvnUhUSDl|%0}QxmVA(e#|A7c{-3=@m_xt;@d|{hAJF`d6Qt zwL&uApSUm7jT;cK;(X5rD`JXlOS2SIx=}$GS(NufD%v%@u8OnAR=OwKa zBB>5oW=Prz`{59@fC>~$(nS~);(JU7z84JRfDHOx9Hc@PP$9op043n4p0A7kfljIC zd@tbN_u2rzzK37m!>?rGlZ;=|JubU-)s z!Wp2Yc!KymL42O*he0;K2p~Qw#3yAe5TBHAAe|{OK%7!YZ%Pu7cPZ&W{-xx@5-5cV zr~=}aLcCI%VGj_Wlon_M;*oM1E&$=r^oQ{fzQDg-ef+3W5qS6;_M?tP}3 zeDb%oalFIU>b22SxNYm+Mm3?fR!vw{uO=LReQ)(|t{4v*HsU*3c0jkf_Et;%2?O=dqnXnJ3?f{iRB?RJUobTYby{2kX_x zwr$?K@dWSN|Dvx|9}C4WVC&x3PO$7Xcu<+H#?@D!uy9_YBz4E7g-*a;7~b4z6>*8L z?rrRj3;fBv!1o322YU;}SLZfS22;D->eR?ub?Sa4`t6dI305(6RddJGf|Ykz4q%6O z>{HWg)T!&XzSCdm)ThX-nL4)i)Kua3q`31Z^RUw8i)rlD=C;@_u6Mf6#J0#g1MVy( z&U~(-HQy$t?#@yUvSJW>jX`Mas+!K&<(7V5S&cHe)z~~{v9XnnYHY!#ciN(Kz9kqP z6X+@Dq=O)3mOACQTb)wGKyON|oW2B@juwh9!)h2Yg-nSEJR$C3jxt}EtbX~`WUMK_ zde??`R>mv}okHakrgKV~x|+4i)nVJz$4gyjA3r5uI^S-HC+#(;lWQ8hr9REHnL=9> zEUaR3U!&J3{<>SnVRBrd_;Zan4wD=Ir#QrP)vA;8-0I|XWqIf1a>JtUM9H{JE>WUR z&j}J@4iE2~aS#O=FcBh@^!6C}c3U_0NKH>^Ps~c*QtyhIlfU8LhS*ZDOL@xEz!)|D zNaJk>#7av0$o>Q+UCs7$t69fu+F7EFk90oPbNjW<1~uDXDe8$bvHUYQ!x`Nuf^ryT ztq8ACA3a*ro$Y50m9Ky2UXSFMEo#(ku?_Db-t9=qjyIU2{XXS&dE8F9L{imKDBe28 zCSOG`Og@~%QXV~XX^$L~&O0lI(DTm63U-r>lb#kV*yI`9))BYTs!yCDSNU9R1xW^H z+;nBi$?{3;H=Q{+dcC_hF47kK)G zR9)4q)ssAgaYb3o-6m;cty*M0ogwhZ#@Iy`L zLd!4K)$&~&jOLH`7L`UvZ4ZQZFH8m6N zVqbW-;wj@N<00e6z`(0N(&87$HU7pj@bGG;rm1K!_8EwH?LYgC^hkdSeD)^G^x%HV zNP1#5`xZ?f{@R^4pJY5@NQR6*?#wd2TKq=x(;HsO*X9fS7U&*6am3^dq**J-RpQzv z&pPG|TgiHZ}EiIck#fqQbb|$u_>77YA+Zkr&k}? zc|Ia-Vr;xiEr=s4$JMq)=f;@dW9p|qs8=37d6{HAwoFVszu9xNnR!3cwdl-^@3qaZ z`lf%iYC#ySNkJH1BtTg8heL%izKLl;Lf}_|`Vl>+P~5@RuaLtHj>JWE)(DE^PK>jx zVcsWqg=`K)I!*sIpTk9U^3jsB>w*}oK}PqZt2GWoL5$DHCMFKD>PeXtMDpc|c-A7l zc{Z%tv!C*xSl3<YEJ*m13D#rqhuf1=F?knhD-a-%;A5OnGlltdL8& zd#B5hL|9I9TY@AIYc)Vo#j>^%5L-q zdSAWE5%+wl4CwiCnN`o{S1`oTr5MfOu1ItEs)jXO#T(6g<87=;?TtHpbT3=o_68^^ z>hqOKnj=LsBK<%me!T^#*$4@u5bGpBSZokv7WT8l=x=yxqj|!ONb}8uobRaVPHeUrD*U|n8JgW( zv)Qw}mW3TX^5dSQQqI=1L_&q_uYRrQKp9Y40IXF{cUP~8N?<4608_qt_C-T+-N}j$Wla_Fk25 zS+pS5W->Ydl*1-5R;3(|GH%|%OGaI2p}4wSK4HQ?!ucn@V7j@)TeD(pff3H@H(kBU znq}6Ex@vM>zd+M<-rFX`@jhuzy~9|Lz`GUm^~2oUBiE|36r=gRQg0aqVcv{+EmguU zt7&Z)HQnD}{&YwVTQ4M6doI_tmv%k8lCGZB*wU^Vwe(a|cj@V=(!?tKvdY-(SX$Rs zdWz0^VMAGX@$}Nug`#=Sw82mdR(kokY&su}MamVgIG2@|a+ms;5~Roozc{X9HrM;P zj#JX->x@6p*|T%zre;1h$81>flHxE}UMwsxDt_UG7s`s4+m;mG`dsW$Lvfj5`Ag*n zyW=JM3y#ti276)o^F=Q#HAI!Y@Pc9KOV5`@Gb9ts*8wx=~0#?8QI5aonZPF%}>01Ot& ze+H*nR;2Y-9)T<<1=66r3Aj@Rg{Zg}2)7~~mILvtVDeb;9$Z}z_ydN%;V&&IdExnT zZ%Sq_MEkGV{WxB>kK%a2?$7b8{SJutaE_t&hd2h?4Y%(4*&k-Rz>qzH;|=?y5%WJ?wi_|IV1MM6NuNFP z)_JG>QSP?cqd2zOqd6Y6$8bDkpUiQ;-E_<5PWzNw=MDDQTjwtORBW!b$8lU`e~e?L zJ)Wb(K8<6kJ%OXu{y0aAeLBa5_U~}awI_1Svd_5XPpaK~>wLQXyWEYlCvl9ie~+Wl zp3E`a{shM`dkV*~_L&^@_Ee4m_9rZxvT0c^jSah2q0YGFAmfd0Z`K4hHlZ_VBfbGoUNV8E`(vd1q>*GeEW9 zK|dzg< zXIXKRdDjy-KPBwLdF{hPvG>J%-`blx(Q<6-NBbE?1;|m9jU@<~Ea$N-#TSP2SY5}8 ziMBKu52vaaPSM25SN4_5#L#8*hb3a@yz=NCSGQC3+Bwd@gG|T;J5&OmzT$!=*at_T6D|p{UfM}U zov$@ic*yZWxI%%rxgsG3b_!8F5xB0#P4z6^;t{V};!xWKr+G7B zgcQgJ(!A*kAH0&5x;@YX*r~g~C%9Cf&3eG!S69JNAsR?iBX%3tk%`#<;hwD@?PiG0 zi?zXVxz%#R!OzmjZ<_3%&EivuTDMvxn$*d$)h7?IqQpYhSNmM*r9_f0gW8K`0d66F2U0t1BYv z+gC)$nz*W?fh(n7eKghGv)Yw7C}!odV)$r`cWaPq(;j82XJ3sYO+JW!b}@uYm_!h3 z4D!)iV{{D5ohB<{<s`wj$Oh{w%hPVKNUVsj zep}laq|9^7Y_{v9g*BJhbCx3WVa+89hG2QNck@bp)&jS|`RAL3!V=52h63-^HNJ>B z#8r08;GZwJ9HtfV_xfUL9?4j4nz(rYHKO~_iIYAh@W`6(6_H%A1LMywUryGjE0_|k zh^vEbyt<5h@6LbT|g61*)IO$O)CHWJxw4U}2*N}o%8`9FC_cutkGiJLr8n>?o)7*AGzn8xEmbg%C*%D4RCoVB3$TE!m^ zDbXj^8qGKDP3kKbHocu{TWE0JOsuTH)mW}3%3gQo;FtZc zzQ2@AVo%9co}#1)Cg%r5wd&QuCiUvsYR~vrJ?@PswLK$O4{!1;*?6+vm&;e(n?2KC z^(=Y)9YG=kWFoI7HkFMpj+i>SFzDYtwu(O#vFETWnbqz;u!l}=2K$3yY7jevFK&Kk zcWyN|cUZ)gp$(4c8t>KmTo-0*@SaxW%0o75CCYKH78wu7ZgZaw{TR`IAmr+rzQG+6gvk;58*5v(Wp7N^> z*zB0x8qD9!e0Oq||I7xCIr5c#@ReTL#dHz+i*~Xne1oTD zvxhAS4#Vx98_N;7Ho0Mm@%`F)A(>7+B5A#*}<_KFBc1rdadJRQ`ud`qcaSPaMCGTfel4lJnNW9mcPy>niSbO z3|Csj=lZ(#O9RH|s8zf$xwN0F^S?Z46PG$RdDd+IFmt3?xMU$TnuX8u(G6&}lG6Fv z4gDIyG+>$d?23}o{aMRYT?FI1?R9b$=d&BiQ||;Po-PcGI&BfZ_g9imy*WU3sB(Z< zmt`C4)tuThvSYZIKhhx}XU++j=5ka+LoZ~fY#BfR0SBxgiGEI9N za>hD9pLscxuk|9(SyRoQwR1jh(#NubV-jEODdK&^yv};{^Y(3OT~5s@=W&9gB7R;c zyQjJ=&ek`mETm<2*5w#xc;hENy}Z#A*w{r>!@Wj1Hu349hQ3Q3=D~|ri@2mt`;-vO zoE?cXU(9j$UD};E_ytp)OU+s3!r#tYvitG*Qtg)aD&@m^$w3j()?O-cJ0dUalAA^S z`SAWi6FJH@!B6&1W#D*UcwyBhK*NNy1lPIexJY5liu9>$u3`kf3nS2;NC_3 z-t8V^UHc~k2Y*r`KDl1)SySVP_@vu7A%k~ypLBUm+cVa1t{##$S`N)zCNAVud(vL> zxLl{tUoI3LS)$aV^Jl;5trFAq>1A!;O%~mCsHS~Yhk+6Q<-ms17x&1s&wKSRuoF<6 zPqT=N`wT1#eSTbd;P(rp^^%aY@6&tt-guFeS?ovtm5=m-@!;TXy0Bqo#9xhD90PUgURq zzA=?eoI9>ec08Ie?Q?3V*s?P)TJEE?iQhG{CrqxFiQm<1@1h&lW45+Y&5W#V&kU6j z+|sq>o%M^W(?6?XrEg5ROFeg0$?9fRF_?;&QLqHCvz7Z>n_xdMNZ#6t-C1ZGbU+s{u-k5l=c|S7c5cE3%PZU*ynR& zzuwImB%k&*{1nLPE3*eb5hmw_g$DDP1HAvLksVo8i!$}&9r`uH!&M>6#D@)WYb@S3ylO-bzF&;E1WU%FxkWUBq!V20_$}d7%?9s3014{Dz)FqysH+tN#@okrb zwdhgpukNq*#BBdCJn@8O9Nrl$AsoXjj2ZkwEHZ$=>iw^MZ19C>4NM#yK3gcB$P1hy zr`>X06i?b3rLXNHiQM#F%)Q=O`5V3WQcd3Y&Bn6P#dkMb{PI&WQmx|G^&99C`_(sk zYoNCKjlT2~@e@L1On<{PtV*dk{nkR+L%da>r88*KS27vWr25$AgUX~2n4|exp6-E> zEbq3~chEC=>+BCJ8r7sKrBVIv65e%uH$}0ieb*aDS`)LcHR)||slAuUkv;hv-c6HZ zAg6an?H-5n$RXvIzo}hN?VDA+yH3tI_c*3e0?yVACrja(00)=WB4$HIb57X8a1I|o7&F%sJDlIsk(xK% z7jjopwWpR{9tRHB$o;4kG?k*wz*~W2nZeFh+jw7f^tK10EucL>val6N<7{0!f|Mlr~bxT5>>N%!7_JQ5pYUVwf$@z}Sbo8rA zU#8!Frv`gQ%Ades;M01I0o`P_j;GbOxAyw-t5$6=Y(JzVsIA>D zwPod|cj_${7r1{xH{Y_7mwK_q@h$nw#PE2p31|P;>5QkA8JCFvtA~0NCchu>AIpB} zfW%)#4Gtc6>X?gVZEM?=U~=wm+u(R=m-h=bez@u8xwtV0$m*6lTc}r;+QPhQXY;$b zsfKyu8|GosbeYcKt`c!`Kgv*@om(9(ORZxQX5hNH`u!t5XI633={4F>eR7-cfj@S0 z>q!?$r2Y15+vr)zM)uY^N95|T#6PAmJdNHlZHSSSSRLlnd6ToAxnTq|ymA5^@1|^B zz0oC3hQWUO`S$Ea#1!G@%Ouy?=nSV$Ch;p)slSjPZHf z8`6uvwU9UG;aW47$hn`_ZXzXiY$r4K4Lcj!e|df?dGpr78t;SiX?vsk%l#YQUuSsE z^qjYSS>inwxYQ`MzVodm*0C8y@)uE#9edR?Ys1dluM8@)nCk1v&@ndg%cB_`dv|m~Ce~sXCh7;TDT%sTj#3!(IMWlv}>C>|~ODgsr;6j9;cw%hvCs zi;Tto^&nkqz;u`Tq_d89uI|3*Ie{ae3CS^iov$ryVP8zkkqt+cNuGd)jzd>XQF3l@ z=wiKksJl^BuPT`%jc10>!M{0O>c4d)uX;>0VJ;=L$TR%$Ft^D5T*}LWKh!`5Uw>xSa zQQ7{o5y|#9tLf^u?fK(pS$5F#Hr2O}xNx7j-MBi^c_eQneH%V%_P!vx&Eoq;kKc&R zx^L+xn@23&{!wT=y=GjTw@Hmodns5hG)JfL5Ypa7&vrY^(V5!KJnd%Q$W6^WUo+4D z+I%`W6TQ&Y5xsE4%+;|vlvXNeiP+z`*|UodTrsszX_K?iDQ!$3PFQ7`-oD3Y2*qr} z)HTw3`sUa4hgJ2PJ$sc6p8DJ8LOqt6)hRu%dctpS$?cuC{L4kRx;nH${Y48gy#2R6 zZb#he&}DvxFy9iF+1wf$#OT8DkI2%E9+PF}Gi~!(C~N z^WY`kx2z6rRNu4T{=?vUY}D{Mk-Pnb)s_+IJjnhe-}7+$q}8f#UcY@>UL*UG91*vx zl9pz@_rX44rRkc|!w(S2-?ut&nEf2oeG-`M|82G3CHIHMMmP_Y^2Oop!kG6{`G9sG z9cim<@i<7heT{Xop_E2Ai#5Kz)gO(Oj&J96ts`z^&nja!_Danj485A1G~8Ecm^~PM zn6p!b<7N*=yvSL1p?>z@`1@>&Mp@Hdx)Txw5kBX+hPbg>pdy5*=~u6N3;-dWzK6iJ2Lm4OB~eY*_kBoWmAnVM|#!E?jZjNt`2y;>yUf1yl3i2V7=`7@)uEG zVVAQT*}mLZpwqX1utPS?AM94Pp5UdfU+(t9n+`9~&E>f1u#(8`u#i5j{qHkLn|(3L z^Y6FG@0<5Hjj=*s-!OCVuj}byPUrANVe)S(3)jpXyy>_Vgl0$8=Pir1%S@0#;a#fJ{clqD9jyp`>c3*93zt-r> zeI?luzuV2QKEae0<$R-`-)1{3fA8y!>oHY^(S<@iJace(4=eL*nfohC5PxMu)n9v? z_>r~H)4W{y>mKSzsDaUw=sPncLaNK=75_LWkd5(j0@*D1K}5bH-9F&`Iq)E>*nZVO zV$?Km5amYsn&e1g?C{NH0Y~O@w>$A(d`i>L5~EARb~R%;KdTv${#k3)%&WuK;;=VA zg&#f)OFSxEuPkQU!wvSujvg4{@lqM z`_m+KgJ;JkF7Ip3c#-%AfBz4|*XCFGHe*;!N?hkhp(9)CJ_?l^7=yO@S$L_>{<0!> z$2x<_Sv3@4uDZVAy~T9128?sV@YO{@$q7- z_s#al32sNuh!wfdR{nh~zl9k_f2>_sYr0W0->hA;SS#3x@$nnHsQ&}{bGZo+{a3b$ zEz@$b)EY9vD>ds&~L5cw*yyoHr~oDSLg34o*W#$A-B~2u7WXhR`vTV zNAfFyEJs!dU$(Ofue%`07Jn=gFZTWl=78Y^x3W3%*IZ8E<)gw5?P z*V*mYztv`jS|5hZZCA0G_ia5NZSo~Hg#ch`nQF?V8ZnrzX*SWw(pxO&4goSW|j^{&fDunwDwm)U--dUk%s!|5UqnX}VF<22JJr3hCeLno_aLQ`hy{OSBDAFs0F>eb(B%Dm8feL>U9n(}n%aQ+4h9tR`i>w?gEbwi>3y0`)bwFZqcn}zbcUuWnriud$6W1tzNSxW%4-w; zba%X<=`u|nnpSA4<^LT&(ymu)x?a;-O|^W#<7W%}jBUXce7?jdJi$LgYthy6b0+l1 zLU(T@T8*}#o7k&tK)0Zo=r+`W{tVrN{x_k!&kx;?8c{xrx-S9!6*>!TN2R+?G!K0r zwV=O6OVD#@IeH0Qgmn`o%ejT=HA6uSG9 zP$Rk&HKEPuH1rZ`MhDSUp$iK@e}Ilfv(d%qGw5#Ag39oUgzkaqXsOVRZ$%yGb<`8$u>XBgC!(H*E2-Gx%GLiVEDQ1Z#J4?QAu4+o&XM8~7Y zQ5o+ZbO1dgbP=iOr)UoPdz5?(`4f5oy@?W!G33i6(lLg7nM8dUL%vKRy<^4;oss%5 zCPL^QAsu7Lmq&J?vFJfG0VRLO%s{))Wb_RBBzhT5M~TOnIYJjnJjdjqVQ4-Yi9UxW zpvzG5YfPEYJxY0wc^OSXe~1$AG1Q|+t5E9EqdQQZyGJ|Ft*8ud4|)yVhsy8{2wjw) zt1O_nVa#Eni^&EH(H%WL^k24Pot)$oz>!?O2_J@gQF+!P{!o*}~f$;Ah^nMvB^nqv$;J2RMTaO?513u&%imLryYF>$hy(j zpdZM)(L+LR&Jn@>KwN|M5CX&_I1GqOumOw^1ty4t1W1G=NP$_94w;Y*xsVTw!2(O6 z2ui^YK6)I%d|gB`F7_P{K`Gdw z94cWYRKZ$U4{oT1dT4}gumg6%9@qy5;1C>v7HEaz&<>r@4X2DHK5|*r6OM zVI@?-T38QmsD*lHgl(_`cEKLl2M6E~9Dx>Sh2zi;ozM-ZpbyT#Ik*6q;0j!Wei(ou ze%)7qKLmmvLLd~vU?Ld62vJ~yI7om*NP-lY1?i9p*^mqQuox_`6pEk}>`)Gsuo9|Z zEvyGO)IvQp!Zz3eyI>FOg9C5~jzEhLWAS4wZpYGwjlBvt*rYKIxW1R`d*$^IKb;i> zp+NYdxC!Nc=w-l8=ykweDD770O(E{1J-ROdaC2WUj0OC>Z#;xU1Vlm%#6mnw2Q$!a z-Ioe!kO5hc19`9zXv^+f0#+!2<=}t{aKb8B1M9#AHBbi)&;-q}6L!O1*bfKcFdT(r zph6pTKo|5tFPw(6a2_tgWw;90;RX!CO@5u$4+0IaC7qX{ZIlG3*lJVKbxvVL#js-9S7azRWu| z!iq2e`5jRYO+em790$@gDFHHJAuI(45XPiFAn%P4kO7z*SHW5!ZN^r9!!iWMK{!N0 z8sq|TeWVENfM1VbKhh7fArA_`3Z>wN7EqxBdVsJa2l(d@{UHisfiyl!zC3!Ke+7kj zMD2o$tdA$b9>86+ye7_aP#crazq>)aCgXlG?o6DUh@YtecEb@Me@xeT9To%R&y?wq z4A`4OdZ$zZ>77E^OxX(u0C!VJdo1}Fy8{S27W1i*U;^@UDsh@h_)}eg{i$ux38#R# zOufMOuq99~#ABrKu@E8R$)EUO7!R3%`*`fc?*#mh@8@44;C$L4!SCe2dLS(cy>J#T z!d18dH-&gS0PyeeaX{K1Cw`B|!gL^wkEcNv|fpaGg;H|&SQa17d@ z3wq%!T!gD|18xfOod5`iaS#rX5DU{G8PXsN@}K~$upBC26|93AXn3gK&t1SeOpUkOoec07F8^MZNF(Lm=oO1VSMUCV~Ns z5CtZPg9J!~BuIf-kPexU4Y`mHi@^d*p$JOB4&_h@E1?S3!g_E+E!0CJY=a%J3--W1 zH~@#>2(&;e9EW!3gl;$meQ*ZO!3DSkSKu1-!vG8kktDz$0znTU5DH;15e#62C@?`B zBtRnII4K2YK{{kYHsnG+ECvfKg(4^gJCyU2UwdF59DqY`1X`dKjzc?iLN}a(J~#vC z-~wEND{u|^VE~5snJ@wV5D0pH9*nv*Yqt=yIiDQ{>44d6>f3DU+icpF*|cG^2_y3= z&<`K(>(6aivu%AvqSu#IOjP%a2Cju9Ky^Y z%pAg;Pdw-Afw1RK1S6Or0SIUQEXaghSPV;{6v|;GtOYmJ!#3Cj``{3?z;Wn=Q*Z_@ zz!m6+A$}gmAM_9k6Tt{3NPr}m1(}e`PwlJ+@@)a`^T_W!@;486dEr1B^NPR@mIUMw^caxV7l{80wL(~f+2J}4h^K8iltU*FhoWsTC`2)S786GCT7Cn>4y3;XJ0<6Y zSY`y$u#7xfMjDqn0JqBsqcjx8g9(x#9|{2XrTA6a06XCTwDS8JOTY>xKwMtLuNNx- z`!5pyi)(;*zvzM*AU!YQ$BRwS4EXipZrBU^;UFA_qi_sVXoC*uf*$CF({L8f!$r6Z zSK&I`fI+y)uWM99>O64A|VE1As(iK8ImCt(jWt}AP4ebAr!z8utEte z2M1Ju6IQ_*AzsF>mvQ$pc3!5eUZ!rmOxeEN1y^{zN?BDBr%K{dnF-{1nafoG&zs3+l zjA67TN;;IWUD9E@uGNZ`rD&|OE;peD|F1`JQv%yYKPdx#wcv{_|ZPnDs1X`2nMxYzWH6JtWRk@~7Lh|Pc`T!VLY7-{^oL6$ zRmEsiT2|9Hx;bnmIum?VRBpF}mocmp=Nr&Oiu19Zw3UQU0gO zS3FN8+OE)cg?bg&te#+>ZL`m|DZgzh=`19dd|t)A+qM}wZIjQo4!-sca3WJkBa16s zMcgVes`9YUtMsGFKCe2Be5&mGDmhoh%ZXEUpAqLN1v2n>e5ZgSN-1M23cPcacISmp zLcZJOyIqdkSFjdkw(sT8yUU*bYY(vPcNq?$dLk-RS7QLG6{>FF2$HK7v|0zMuZOTh zxgEQ3-;NF>yhE%V@of^`agT=~)MVnx^s{{&ME##BvvUeFEcZ~1glfgA)lO{-r|3fG z-%UcfcN;l|Jl;LcCuX4N{Cg#AWGixge-TT_N2lLE%u(d_{tyqX7e0lVyv7EqQEqoH z*O32i^&>F%OhuUj$=9ofA3bBIDr@+l%g*mw1u$G?R|3Grw{w| zVc%&>Q9MsB^8bY#e$mHG1`)q5gV|`e?mfi(mqOk^%=&V6v6njZz25lN>qotI>g7`3 zjC|_j<=Z*KIbw9tO)uK6@5g?rA3zTEL&&54KEsTl&;L4xM3NcLL{dm)DruyX!A$0o zNfrxPL=L&+v5W!=SG)b{{dwVY^54weL$Q8y*vuxplt{DaRmGGpjZbz-hZk7;kXy^I6Hg{ z`{?ihw?p{V0@hOz!jV*FpzM)CJQ0tSQ|W{+ZT-3#F@N0^LZg_C$~797Mr9k9bCD~i zdZ#1*qsHc_xJTvto6WfW8|^klQKo4g@@_iDgAhKP&swziVH>A09v_PPVLvyK^M}LE zds>9tj)~nYhi12%)ob3#Zq9^oJPmCexBa-jA76p^$CWv5pB%5_AaZV*ikK~8wA9i; z5Atmpaz0NY-Dv+r5~*a-N;|flxEjK5<@?*N5L&g-s*P6VTknSOk+>ge@1y-3L7zXe zA3n0JZ8{CKg>Z5LVxN2md7Rvf98aD@+>`2@9CRJ71>~bor`DqUslzDuyKHii)93lO>4vd-+HP{I_4pVj(r%nj?;AU$SDp9bhxTS8jFz2IWf+yMBI8)j6-u`9`#TUhe1B>70tO=$y-ZwAE=GJJstfq8zz(?qoOWcDB>a6|V7h z2p1+G)&==q$YK$>yg>;Y*-9-Q4;PI41^HiS`uWR|s-=;?7w=b` zY*!N}7z*Lj$!PCWxqmAD#WeK!;%xNeqOrPIN<9bB?~Bdo^F?i4QumU&mu4X6ON-F% zrDE2j%}d(6q|Hm(yfnbW5W17m*KX~1N693IS1?}P`q^!)x_4pByS3fji8j0Sulu^| z)T;B@0-i^kpA}GTD)ShU7|$f8Ajckk>XBd167qSK6|5y*uNGt4V@!MWv*(;i&+`0S zo}bI}^Qbq0dzMCivcc`mG;@WU=u@vT=$(uG)~lV~^;EEr!yKg*edrzLkqcRie_7ef zuki+AUzW?|_mInFbuMe?avSowd=c$k9^zZXxH67Z=3zXpET@DrD$%bi`^=t}!@r4l zHJzC#e^tDzVtg?kef%Pg8R)|o_Qw~?Lg-Jzwtn0CU*xKJvAdDazu$9VZE>zG;ST!s zx{6>8xze5)twvDk>-v0WTS~2`Miqo zH`cPA&2;Q~`Khd>iK#bk`p<3Tb>o5QpMfMMFqu|*(C1qTjAIgu$V1RurIceo+^R>; zx754UhjG6p_P~4=VvGjV8)(5k8aP8Ngs(D~jdEXQ6Tj~wSGeY)Ywr76-LKXCx`1{% z=tO?s$m1J%d{agRgWTa;9)?Kd9uGofjJYXeOaK})fyqRf&TQtBjfp&C@-cB|%nH`B zp3PLUlik#Fh@-S{iViyI;VL(|%{?B3$k;#<6PQet>C9$6*(@QSS6RVY*0Y&PcCwp# z4snzgPSHUpJzV7`x4FlI5U~p*2}w){CgYMt4!IOiND;-9QBDmeZza~zKqDq+CAQH{ zj4t}HlPq$`rGP?;D5i{ZYN(}-1{!Iijdo&m(MLan3^B}z zYxpISObV%_lR+j~+#p_V!tXrzfY+KJIcAN>q6 z#4sZv@)wCDlR_%#WROV~Ipk76Aw?8ZMmaUqQbz-gG|@&oF}moZpFxHgW+X($Cz4DG zsic!ZCRyZ=O96!x2cNor@N(qMrIEK{CbN0ndHSkJYL2VVc%6I3@%LHB+;Ok6631TS z5hh+Y(IeTH^viuQ|GY2YD{+jE-o){Ey4Qv2$~@<_A!B?9e>2$^q=~-p^n2cJUqY1N z`2FMCJ}}?wgKBmEZZ7I9|AdFqn$JF(>GOfE`&ZU;!iTt1sG#46w%S}>=L1`DiaO}_ zA#FPHUE{TCO(kAe*4A>Eqdu^e`uBqN9zTrKbetvew`vbXOD?(qcw|dPTU8UthIq_1p0U zm!n0B{O{({b@q8rye{yj4}tX}nlAH42gOBA~@ zpyjQP#V>msau)yRlNp)Oe@aSvVI<6*VZr_MlF^Q7&*nA%_i);b(FfKfpX_>?5BHo) zU!0!w@^-U1ub9o*6CIoWY~H4nj`+IkAtNnm+5!V{_q(kF)_ePw2Tn2GzkX7D^|xrr z=A#kQX@9Bxh8eTM*5@Dp-&zcSv}^&$SRNJ%nH`0CK(+X-u;KdxMSXY@|mU#&@*wlwXBEmcL|T4gF>+Me&C z&UBrYSs^h#_qAp1=);u>bFy8lbklR|Lc-{==#0_UHIt*+GfPHWGD=2|KKBogwffzX z*Yjk|;<-P`G{5psa-A5>{?j}~-5P%M!jJyExQ}y48a?(nlS6+_CjZy_|L;ufjS!!u z8$4U%KjS9Zp^iw;TwwzfOx0b+TvDD);eBer?=G4-#7w{3HqxPNP)6*CBSidX?EU`%t_jD! literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Bin/pragma2module b/amigae33a/E_v3.3a/Bin/pragma2module new file mode 100644 index 0000000000000000000000000000000000000000..12fd994652fd160b6a6098a9667f46b9607cdb23 GIT binary patch literal 3688 zcmZ`+ZERE58Gao*&aGoH6GbQk#16*sk~G)`v2M-K6eodtR&h3`RZ+)O8;Eb6IPsNZ zr_kkx3oSy~q%m5ds;ad8s8+NAW7$BegsPMxL?eErYlJcutyz~Ak9i|v8L~VlXV2?< zorEt-_ndp)&*!}7x#t`cng2uj&t&xI%s<8R5AItJk)A+1f@kD{+R&PiQ_fbo&}2%}FjwS;(}H$}E9Oebys)VbXHc|Y6o%X* zY_WMKd@%q0=&u|7B=_!CIiuQOHR9~V_?W9z&V}~r)if&q(#PFzj+f(9g)$m7w=d?j zO=wHqcjS)d?#20z7rZ;^8d1mlhGgL($?S?GO3Lmi(HhQCHG^ZS_5p8=oNp_ z`oZ#SN|o7Imk=E@wVvX+6Gh3&wKLwy&bc)T{aCLuvgX0iHJDZ2n9mF&F=TTUnPxkG zmK4;Y0g=UW=kc9*hN4)9kHdv6dMa&ORy< z;}2(7>SF$^QkR+!8Rg^ZvN#4U$1gmp64jTWb%+63(8%GiXF=@fzVSddFz%)Mq_4hI zmO4p%WBfHY(=8ix!Mh>f@;j8V)HBfDE)@5HG-zZn)7ECOPIw@V}-!Ln%(RP z29@?@dEX45E$>IA^JnFJQr~UBv(kQ!6CrsCQA&`z{l%*KGIt6r@nksyuPN~0`!QQ# z53VuWO}D)YY_N`H{H%HGy8W-nd30-i)g}0>b6MYIExdm@9>J)B!KebVm-og;@d=E` zL4TgJApQ(8((-OnE)4Fy9UyJ)cEYrV`k95N8%MTf^Tmp9obq z;bmtjXV7hVwpBQX$R1htpua48@V;F303Lz&G9LEEo;$W|b%d=r9x%M9nSd+LBjCvQ z6Ls9JWkDo`F;zduZ&>F%*7J|R=0TJxaAw^KE2@2L z16|$9w_LrEWh+e4^n1+|@7^v!P!MzlI-DZPgb@6L5bPzO}J#r*t~`r;AF~VS=o?is)pg#cS`l=thh=Tn$cE=2?sYk$Z#u|y>{s-) zj&^$cRJQuRf1~fdGeK|vjv9h*s1}g#_24nJsw?ZX;C^+8XPzQm({VzVghxftt)wVT zjt1a*rmu_9^($qhzR2yK<4wxNRlrn$-T(eVC3_uRn;FE z+1kTLB6G+@a$|*eF6C3~e2%ZzHK^;yC{}O<+~2R;pjyY)$MWjEp5sC}aRf657nuXj zfTKZOSH^b_?N9pVfk>=vmooB|c;W$@AN8?~zkl9(pH1M_2IfG0lg;C$h7sD?B1-1 + UpperStr(s) + EXIT StrCmp(s, 'QUIT', ALL) + WriteF('Read: \\a\\s\\a\\n', s) + ENDWHILE + WriteF('Finished\\n') + ENDPROC + + There are some worked examples in Part Three (see + @{"String Handling and I-O" Link "Examples.guide/String Handling and I-O" }) which also show how to use @{b }ReadStr@{ub }. + +@{b }FileLength(@{ub }@{fg shine }string@{fg text }@{b })@{ub } + Returns the length of the file named in @{fg shine }string@{fg text }, or -1 if the file + doesn't exist or an error occurred. Notice that you don't need to + @{b }Open@{ub } the file or have a filehandle, you just supply the filename. + There is a worked example in Part Three (see @{"String Handling and I-O" Link "Examples.guide/String Handling and I-O" }) + which shows how to use this function. + +@{b }SetStdIn(@{ub }@{fg shine }filehandle@{fg text }@{b })@{ub } + Returns the value of @{b }stdin@{ub } before setting it to @{fg shine }filehandle@{fg text }. + Therefore, the following code fragments are equivalent: + + oldstdin:=SetStdIn(newstdin) + + oldstdin:=stdin + stdin:=newstdin + +@{b }SetStdOut(@{ub }@{fg shine }filehandle@{fg text }@{b })@{ub } + Returns the value of @{b }stdout@{ub } before setting it to @{fg shine }filehandle@{fg text }, and is + otherwise just like @{b }SetStdIn@{ub }. + + +@ENDNODE + +@NODE "Intuition support functions" "Intuition support functions" +@Next "Graphics functions" +@Prev "Input and output functions" +@Toc "Built-In Functions" + +Intuition support functions +--------------------------- + + The functions in this section are simplified versions of Amiga system +functions (in the Intuition library, as the title suggests). To make best +use of them you are probably going to need something like the `Rom Kernel +Reference Manual (Libraries)', especially if you want to understand the +Amiga specific things like IDCMP and raster ports. + + The descriptions given here vary slightly in style from the previous +descriptions. All function parameters can be expressions which represent +numbers or addresses, as appropriate. Because many of the functions take +several parameters they have been named (fairly descriptively) so they can +be more easily referenced. + +@{b }OpenW(@{ub }@{fg shine }x@{fg text }@{b },@{ub }@{fg shine }y@{fg text }@{b },@{ub }@{fg shine }wid@{fg text }@{b },@{ub }@{fg shine }hgt@{fg text }@{b },@{ub }@{fg shine }idcmp@{fg text }@{b },@{ub }@{fg shine }wflgs@{fg text }@{b },@{ub }@{fg shine }title@{fg text }@{b },@{ub }@{fg shine }scrn@{fg text }@{b },@{ub }@{fg shine }sflgs@{fg text }@{b },@{ub }@{fg shine }gads@{fg text }@{b },@{ub }@{fg shine }tags@{fg text }@{b }=NIL)@{ub } + Opens and returns a pointer to a window with the supplied properties. + If for some reason the window could not be opened @{b }NIL@{ub } is returned. + + @{fg shine }x@{fg text }, @{fg shine }y@{fg text } + The position on the screen where the window will appear. + + @{fg shine }wid@{fg text }, @{fg shine }hgt@{fg text } + The width and height of the window. + + @{fg shine }idcmp@{fg text }, @{fg shine }wflgs@{fg text } + The IDCMP and window specific flags. + + @{fg shine }title@{fg text } + The window title (a string) which appears on the title bar of + the window. + + @{fg shine }scrn@{fg text }, @{fg shine }sflgs@{fg text } + The screen on which the window should open. If @{fg shine }sflgs@{fg text } is 1 the + window will be opened on Workbench, and @{fg shine }scrn@{fg text } is ignored (so it + can be @{b }NIL@{ub }). If @{fg shine }sflgs@{fg text } is @{b }$F@{ub } (i.e., 15) the window will open + on the custom screen pointed to by @{fg shine }scrn@{fg text } (which must then be + valid). See @{b }OpenS@{ub } to see how to open a custom screen and get a + screen pointer. + + @{fg shine }gads@{fg text } + A pointer to a gadget list, or @{b }NIL@{ub } if you don't want any gadgets. + These are not the standard window gadgets, since they are + specified using the window flags. A gadget list can be created + using the @{b }Gadget@{ub } function. + + @{fg shine }tags@{fg text } + A tag-list of other options available under Kickstart version 37 + or greater. This can normally be omitted since it defaults to + @{b }NIL@{ub }. See the `Rom Kernel Reference Manual (Libraries)' for + details about the available tags and their meanings. + + There's not enough space to describe all the fine details about + windows and IDCMP (see the `Rom Kernel Reference Manual (Libraries)' + for complete details), but a brief description in terms of flags + might be useful. Here's a small table of common IDCMP flags: + + @{i }IDCMP Flag@{ui } @{i }Value@{ui } + -------------------------- + IDCMP_NEWSIZE $2 + IDCMP_REFRESHWINDOW $4 + IDCMP_MOUSEBUTTONS $8 + IDCMP_MOUSEMOVE $10 + IDCMP_GADGETDOWN $20 + IDCMP_GADGETUP $40 + IDCMP_MENUPICK $100 + IDCMP_CLOSEWINDOW $200 + IDCMP_RAWKEY $400 + IDCMP_DISKINSERTED $8000 + IDCMP_DISKREMOVED $10000 + + Here's a table of useful window flags: + + @{i }Window Flag@{ui } @{i }Value@{ui } + -------------------------- + WFLG_SIZEGADGET $1 + WFLG_DRAGBAR $2 + WFLG_DEPTHGADGET $4 + WFLG_CLOSEGADGET $8 + WFLG_SIZEBRIGHT $10 + WFLG_SIZEBBOTTOM $20 + WFLG_SMART_REFRESH 0 + WFLG_SIMPLE_REFRESH $40 + WFLG_SUPER_BITMAP $80 + WFLG_BACKDROP $100 + WFLG_REPORTMOUSE $200 + WFLG_GIMMEZEROZERO $400 + WFLG_BORDERLESS $800 + WFLG_ACTIVATE $1000 + + All these flags are defined in the module @{b }intuition/intuition@{ub }, so if + you use that module you can use the constants rather than having to + write the less descriptive value (see @{"Modules" Link "Modules.guide/main" }). Of course, you can + always define your own constants for the values that you use. + + You use the flags by @{b }OR@{ub }-ing the ones you want together, in a similar + way to using sets (see @{"Sets" Link "Constants.guide/Sets" }). However, you should supply only IDCMP + flags as part of the @{fg shine }idcmp@{fg text } parameter, and you should supply only + window flags as part of the @{fg shine }wflgs@{fg text } parameter. So, to get IDCMP + messages when a disk is inserted and when the close gadget is clicked + you specify both of the flags @{b }IDCMP_DISKINSERTED@{ub } and + @{b }IDCMP_CLOSEWINDOW@{ub } for the @{fg shine }idcmp@{fg text } parameter, either by @{b }OR@{ub }-ing the + constants or (less readably) by using the calculated value @{b }$8200@{ub }. + + Some of the window flags require some of IDCMP flags to be used as + well, if an effect is to be complete. For example, if you want your + window to have a close gadget (a standard window gadget) you need to + use @{b }WFLG_CLOSEGADGET@{ub } as one of the window flags. If you want that + gadget to be useful then you need to get an IDCMP message when the + gadget is clicked. You therefore need to use @{b }IDCMP_CLOSEWINDOW@{ub } as + one of the IDCMP flags. So the full effect requires both a window + and an IDCMP flag (a gadget is pretty useless if you can't tell when + it's been clicked). The worked example in Part Three illustrates how + to use these flags in this way (see @{"Gadgets" Link "Examples.guide/Gadgets" }). + + If you only want to output text to a window (and maybe do some input + from a window), it may be better to use a @{fg shine }console@{fg text } window. These + provide a text based input and output window, and are opened using + the Dos library function @{b }Open@{ub } with the appropriate @{b }CON:@{ub } file name. + See the `AmigaDOS Manual' for more details about console windows. + +@{b }CloseW(@{ub }@{fg shine }winptr@{fg text }@{b })@{ub } + Closes the window which is pointed to by @{fg shine }winptr@{fg text }. It's safe to give + @{b }NIL@{ub } for @{fg shine }winptr@{fg text }, but in this case, of course, no window will be + closed! The window pointer is usually a pointer returned by a + matching call to @{b }OpenW@{ub }. You @{i }must@{ui } remember to close any windows you + may have opened before terminating your program. + +@{b }OpenS(@{ub }@{fg shine }wid@{fg text }@{b },@{ub }@{fg shine }hgt@{fg text }@{b },@{ub }@{fg shine }depth@{fg text }@{b },@{ub }@{fg shine }scrnres@{fg text }@{b },@{ub }@{fg shine }title@{fg text }@{b },@{ub }@{fg shine }tags@{fg text }@{b }=NIL)@{ub } + Opens and returns a pointer to a custom screen with the supplied + properties. If for some reason the screen could not be opened @{b }NIL@{ub } is + returned. + + @{fg shine }wid@{fg text }, @{fg shine }hgt@{fg text } + The width and height of the screen. + + @{fg shine }depth@{fg text } + The depth of the screen, i.e., the number of bit-planes. This + can be a number in the range 1-8 for AGA machines, or 1-6 for + pre-AGA machines. A screen with depth 3 will be able to show 2 + to the power 3 (i.e., 8) different colours, since it will have 2 + to the power 3 different pens (or colour registers) available. + You can set the colours of pens using the @{b }SetColour@{ub } function. + + @{fg shine }scrnres@{fg text } + The screen resolution flags. + + @{fg shine }title@{fg text } + The screen title (a string) which appears on the title bar of + the screen. + + @{fg shine }tags@{fg text } + A tag-list of other options available under Kickstart version 37 + or greater. See the `Rom Kernel Reference Manual (Libraries)' + for more details. + + The screen resolution flags control the screen mode. The following + (common) values are taken from the module @{b }graphics/view@{ub } (see @{"Modules" Link "Modules.guide/main" }). + You can, if you want, define your own constants for the values that + you use. Either way it's best to use descriptive constants rather + than directly using the values. + + @{i }Mode Flag@{ui } @{i }Value@{ui } + ------------------------ + V_LACE $4 + V_SUPERHIRES $20 + V_PFBA $40 + V_EXTRA_HALFBRITE $80 + V_DUALPF $400 + V_HAM $800 + V_HIRES $8000 + + So, to get a hires, interlaced screen you specify both of the flags + @{b }V_HIRES@{ub } and @{b }V_LACE@{ub }, either by @{b }OR@{ub }-ing the constants or (less readably) + by using calculated value @{b }$8004@{ub }. There is a worked example using + this function in Part Three (see @{"Screens" Link "Examples.guide/Screens" }). + +@{b }CloseS(@{ub }@{fg shine }scrnptr@{fg text }@{b })@{ub } + Closes the screen which is pointed to by @{fg shine }scrnptr@{fg text }. It's safe to + give @{b }NIL@{ub } for @{fg shine }scrnptr@{fg text }, but in this case, of course, no screen will + be closed! The screen pointer is usually a pointer returned by a + matching call to @{b }OpenS@{ub }. You @{i }must@{ui } remember to close any screens you + may have opened before terminating your program. Also, you @{i }must@{ui } + close all windows that you opened on your screen before you can close + the screen. + +@{b }Gadget(@{ub }@{fg shine }buf@{fg text }@{b },@{ub }@{fg shine }glist@{fg text }@{b },@{ub }@{fg shine }id@{fg text }@{b },@{ub }@{fg shine }flags@{fg text }@{b },@{ub }@{fg shine }x@{fg text }@{b },@{ub }@{fg shine }y@{fg text }@{b },@{ub }@{fg shine }width@{fg text }@{b },@{ub }@{fg shine }text@{fg text }@{b })@{ub } + Creates a new gadget with the supplied properties and returns a + pointer to the next position in the (memory) buffer that can be used + for a gadget. + + @{fg shine }buf@{fg text } + This is the memory buffer, i.e., a chunk of allocated memory. + The best way of allocating this memory is to declare an array of + size n*GADGETSIZE, where @{fg shine }n@{fg text } is the number of gadgets which are + going to be created. The first call to @{b }Gadget@{ub } will use the + array as the buffer, and subsequent calls use the result of the + previous call as the buffer (since this function returns the + next free position in the buffer). + + @{fg shine }glist@{fg text } + This is a pointer to the gadget list that is being created, + i.e., the array used as the buffer. When you create the first + gadget in the list using an array @{b }a@{ub }, this parameter should be + @{b }NIL@{ub }. For all other gadgets in the list this parameter + should be the array @{b }a@{ub }. + + @{fg shine }id@{fg text } + A number which identifies the gadget. It is best to give a + unique number for each gadget; that way you can easily identify + them. This number is the only way you can identify which gadget + has been clicked. + + @{fg shine }flags@{fg text } + The type of gadget to be created. Zero represents a normal + gadget, one a boolean gadget (a toggle) and three a boolean that + starts selected. + + @{fg shine }x@{fg text }, @{fg shine }y@{fg text } + The position of the gadget, relative to the top, left-hand + corner of the window. + + @{fg shine }width@{fg text } + The width of the gadget (in pixels, not characters). + + @{fg shine }text@{fg text } + The text (a string) which will centred in the gadget, so the + @{fg shine }width@{fg text } must be big enough to hold this text. + + Once a gadget list has been created by possibly several calls to this + function the list can be passed as the @{fg shine }gads@{fg text } parameter to @{b }OpenW@{ub }. + There is a worked example using this function in Part Three (see + @{"Gadgets" Link "Examples.guide/Gadgets" }). + +@{b }Mouse()@{ub } + Returns the state of the mouse buttons (including the middle mouse + button if you have a three-button mouse). This is a set of flags, + and the individual flag values are: + + @{i }Button Pressed@{ui } @{i }Value@{ui } + ---------------------- + Left %001 + Right %010 + Middle %100 + + So, if this function returns @{b }%001@{ub } you know the left button is being + pressed, and if it returns @{b }%110@{ub } you know the middle and right buttons + are both being pressed. + + This mouse function is not strictly the proper way to do things. It + is suggested you use this function only for small tests or demo-like + programs. @{b }LeftMouse@{ub } and @{b }WaitLeftMouse@{ub } can be used to do things in a + friendly way, but are restricted to seeing when the left mouse button + is pressed. More generally, the proper way of getting mouse details + is to use the appropriate IDCMP flags for your window, wait for + events (using @{b }WaitIMessage@{ub }, for example) and decode the received + information. + +@{b }MouseX(@{ub }@{fg shine }winptr@{fg text }@{b })@{ub } + Returns the @{fg shine }x@{fg text } coordinate of the mouse pointer, relative to the + window pointed to by @{fg shine }winptr@{fg text }. + + As above, this mouse function is not strictly the proper way to do + things. + +@{b }MouseY(@{ub }@{fg shine }winptr@{fg text }@{b })@{ub } + Returns the @{fg shine }y@{fg text } coordinate of the mouse pointer, relative to the + window pointed to by @{fg shine }winptr@{fg text }. + + As above, this mouse function is not strictly the proper way to do + things. + +@{b }LeftMouse(@{ub }@{fg shine }winptr@{fg text }@{b })@{ub } + Returns @{b }TRUE@{ub } if left mouse button has been clicked in the window + pointed to by @{fg shine }winptr@{fg text }, and @{b }FALSE@{ub } otherwise. In order for this to + work sensibly the window must have the IDCMP flag @{b }IDCMP_MOUSEBUTTONS@{ub } + set (see above). + + This function does things in a proper, Intuition-friendly manner and + so is a good alternative to the @{b }Mouse@{ub } function. + +@{b }WaitIMessage(@{ub }@{fg shine }winptr@{fg text }@{b })@{ub } + This function waits for a message from Intuition for the window + pointed to by @{fg shine }winptr@{fg text } and returns the class of the message (which is + an IDCMP flag). If you did not specify any IDCMP flags when the + window was opened, or the specified messages could never happen + (e.g., you asked only for gadget messages and you have no gadgets), + then this function may wait forever. When you've got a message you + can use the @{b }MsgXXX@{ub } functions to get some more information about the + message. See the `Rom Kernel Reference Manual (Libraries)' for more + details on Intuition and IDCMP. There is a worked example using this + function in Part Three (see @{"IDCMP Messages" Link "Examples.guide/IDCMP Messages" }). + + This function is basically equivalent to the following function, + except that the @{b }MsgXXX@{ub } functions can also access the message data + held in the variables @{b }code@{ub }, @{b }qual@{ub } and @{b }iaddr@{ub }. + + PROC waitimessage(win:PTR TO window) + DEF port,msg:PTR TO intuimessage,class,code,qual,iaddr + port:=win.userport + IF (msg:=GetMsg(port))=NIL + REPEAT + WaitPort(port) + UNTIL (msg:=GetMsg(port))<>NIL + ENDIF + class:=msg.class + code:=msg.code + qual:=msg.qualifier + iaddr:=msg.iaddress + ReplyMsg(msg) + ENDPROC class + +@{b }MsgCode()@{ub } + Returns the @{b }code@{ub } part of the message returned by @{b }WaitIMessage@{ub }. + +@{b }MsgIaddr()@{ub } + Returns the @{b }iaddr@{ub } part of the message returned by @{b }WaitIMessage@{ub }. + There is a worked example using this function in Part Three (see + @{"IDCMP Messages" Link "Examples.guide/IDCMP Messages" }). + +@{b }MsgQualifier()@{ub } + Returns the @{b }qual@{ub } part of the message returned by @{b }WaitIMessage@{ub }. + +@{b }WaitLeftMouse(@{ub }@{fg shine }winptr@{fg text }@{b })@{ub } + This function waits for the left mouse button to be clicked in the + window pointed to by @{fg shine }winptr@{fg text }. It is advisable to have the IDCMP + flag @{b }IDCMP_MOUSEBUTTONS@{ub } set for the window (see above). + + This function does things in a proper, Intuition-friendly manner and + so is a good alternative to the @{b }Mouse@{ub } function. + + +@ENDNODE + +@NODE "Graphics functions" "Graphics functions" +@Next "Maths and logic functions" +@Prev "Intuition support functions" +@Toc "Built-In Functions" + +Graphics functions +------------------ + + The functions in this section use the standard raster port, the address +of which is held in the variable @{b }stdrast@{ub }. Most of the time you don't need +to worry about this because the E functions which open windows and screens +set up this variable (see @{"Intuition support functions" Link "Intuition support functions" }). So, by default, +these functions affect the last window or screen opened. When you close a +window or screen, @{b }stdrast@{ub } becomes @{b }NIL@{ub } and calls to these functions have no +effect. There is a worked example using these functions in Part Three +(see @{"Graphics" Link "Examples.guide/Graphics" }). + + The descriptions in this section follow the same style as the previous +section. + +@{b }Plot(@{ub }@{fg shine }x@{fg text }@{b },@{ub }@{fg shine }y@{fg text }@{b },@{ub }@{fg shine }pen@{fg text }@{b }=1)@{ub } + Plots a single point (@{fg shine }x@{fg text },@{fg shine }y@{fg text }) in the specified pen colour. The + position is relative to the top, left-hand corner of the window or + screen that is the current raster port (normally the last screen or + window to be opened). The range of pen values available depend on + the screen setup, but are at best 0-255 on AGA machines and 0-31 on + pre-AGA machines. As a guide, the background colour is usually pen + zero, and the main foreground colour is pen one (and this is the + default pen). You can set the colours of pens using the @{b }SetColour@{ub } + function. + +@{b }Line(@{ub }@{fg shine }x1@{fg text }@{b },@{ub }@{fg shine }y1@{fg text }@{b },@{ub }@{fg shine }x2@{fg text }@{b },@{ub }@{fg shine }y2@{fg text }@{b },@{ub }@{fg shine }pen@{fg text }@{b }=1)@{ub } + Draws the line (@{fg shine }x1@{fg text },@{fg shine }y1@{fg text }) to (@{fg shine }x2@{fg text },@{fg shine }y2@{fg text }) in the specified pen colour. + +@{b }Box(@{ub }@{fg shine }x1@{fg text }@{b },@{ub }@{fg shine }y1@{fg text }@{b },@{ub }@{fg shine }x2@{fg text }@{b },@{ub }@{fg shine }y2@{fg text }@{b },@{ub }@{fg shine }pen@{fg text }@{b }=1)@{ub } + Draws the (filled) box with vertices (@{fg shine }x1@{fg text },@{fg shine }y1@{fg text }), (@{fg shine }x2@{fg text },@{fg shine }y1@{fg text }), + (@{fg shine }x1@{fg text },@{fg shine }y2@{fg text }) and (@{fg shine }x2@{fg text },@{fg shine }y2@{fg text }) in the + specified pen colour. + +@{b }Colour(@{ub }@{fg shine }fore-pen@{fg text }@{b },@{ub }@{fg shine }back-pen@{fg text }@{b }=0)@{ub } + Sets the foreground and background pen colours. As mentioned above, + the background colour is normally pen zero and the main foreground is + pen one. You can change these defaults with this function, and if + you stick to having the background pen as pen zero then calling this + function with one argument changes just the foreground pen. + +@{b }TextF(@{ub }@{fg shine }x@{fg text }@{b },@{ub }@{fg shine }y@{fg text }@{b },@{ub }@{fg shine }format-string@{fg text }@{b },@{ub }@{fg shine }arg1@{fg text }@{b },@{ub }@{fg shine }arg2@{fg text }@{b },...)@{ub } + This works just like @{b }WriteF@{ub } except the resulting string is drawn on + the current raster port (usually the last window or screen to be + opened) ,starting at point (@{fg shine }x@{fg text },@{fg shine }y@{fg text }). Take care not to use any + line-feed, carriage return, tab or escape characters in the + string--they don't behave like they do in @{b }WriteF@{ub }. + +@{b }SetColour(@{ub }@{fg shine }scrnptr@{fg text }@{b },@{ub }@{fg shine }pen@{fg text }@{b },@{ub }@{fg shine }r@{fg text }@{b },@{ub }@{fg shine }g@{fg text }@{b },@{ub }@{fg shine }b@{fg text }@{b })@{ub } + Sets the colour of colour register @{fg shine }pen@{fg text } for the screen pointed to by + @{fg shine }scrnptr@{fg text } to be the appropriate RGB value (i.e., red value @{fg shine }r@{fg text }, green + value @{fg shine }g@{fg text } and blue value @{fg shine }b@{fg text }). The @{b }pen@{ub } can be anything up to 255, + depending on the screen depth. Regardless of the chipset being used, + @{fg shine }r@{fg text }, @{fg shine }g@{fg text } and @{fg shine }b@{fg text } are taken from the range zero to 255, so 24-bit + colours are always specified. In operation, though, the values are + scaled to 12-bit colour for non-AGA machines. + +@{b }SetStdRast(@{ub }@{fg shine }newrast@{fg text }@{b })@{ub } + Returns the value of @{b }stdrast@{ub } before setting it to the new value. The + following code fragments are equivalent: + + oldstdrast:=SetStdRast(newstdrast) + + oldstdrast:=stdrast + stdrast:=newstdrast + +@{b }SetTopaz(@{ub }@{fg shine }size@{fg text }@{b }=8)@{ub } + Sets the text font for the current raster port to Topaz at the + specified size, which defaults to the standard size eight. + + +@ENDNODE + +@NODE "Maths and logic functions" "Maths and logic functions" +@Next "System support functions" +@Prev "Graphics functions" +@Toc "Built-In Functions" + +Maths and logic functions +------------------------- + + We've already seen the standard arithmetic operators. The addition, @{b }+@{ub }, +and subtraction, @{b }-@{ub }, operators use full 32-bit integers, but, for +efficiency, multiplication, @{b }*@{ub }, and division, @{b }/@{ub }, use restricted values. +You can use @{b }*@{ub } only to multiply 16-bit integers, and the result will be a +32-bit integer. Similarly, you can use @{b }/@{ub } only to divide a 32-bit integer +by a 16-bit integer, and the result will be a 16-bit integer. The +restrictions do not affect most calculations, but if you really need to +use all 32-bit integers (and you can cope with overflows, etc.) you can +use the @{b }Mul@{ub } and @{b }Div@{ub } functions. @{b }Mul(a,b)@{ub } corresponds to @{b }a*b@{ub }, and @{b }Div(a,b)@{ub } +corresponds to @{b }a/b@{ub }. + + We've also met the logic operators @{b }AND@{ub } and @{b }OR@{ub }, which we know are really +bit-wise operators. You can also use the functions @{b }And@{ub } and @{b }Or@{ub } to do +exactly the same as @{b }AND@{ub } and @{b }OR@{ub } (respectively). So, for instance, @{b }And(a,b)@{ub } +is the same as @{b }a AND b@{ub }. The reason for these functions is because there +are @{b }Not@{ub } and @{b }Eor@{ub } (bit-wise) functions, too (and there aren't operators for +these). @{b }Not(a)@{ub } swaps one and zero bits, so, for instance, @{b }Not(TRUE)@{ub } is +@{b }FALSE@{ub } and @{b }Not(FALSE)@{ub } is @{b }TRUE@{ub }. @{b }Eor(a,b)@{ub } is the exclusive version of @{b }Or@{ub } and +does almost the same, except that @{b }Eor(1,1)@{ub } is 0 whereas @{b }Or(1,1)@{ub } is 1 (and +this extends to all the bits). So, basically, @{b }Eor@{ub } tells you which bits +are different, or, logically, if the truth values are different. +Therefore, @{b }Eor(TRUE,TRUE)@{ub } is @{b }FALSE@{ub } and @{b }Eor(TRUE,FALSE)@{ub } is @{b }TRUE@{ub }. + + There's a collection of other functions related to maths, logic or +numbers in general: + +@{b }Abs(@{ub }@{fg shine }expression@{fg text }@{b })@{ub } + Returns the absolute value of @{fg shine }expression@{fg text }. The absolute value of a + number is that number without any minus sign (i.e., its the size of a + number, disregarding its sign). So, @{b }Abs(9)@{ub } is 9, and @{b }Abs(-9)@{ub } is also + 9. + +@{b }Sign(@{ub }@{fg shine }expression@{fg text }@{b })@{ub } + Returns the sign of @{fg shine }expression@{fg text }, which is the value one if it is + (strictly) positive, -1 if it is (strictly) negative and zero if it + is zero. + +@{b }Even(@{ub }@{fg shine }expression@{fg text }@{b })@{ub } + Returns @{b }TRUE@{ub } if @{fg shine }expression@{fg text } represents an even number, and @{b }FALSE@{ub } + otherwise. Obviously, a number is either odd or even! + +@{b }Odd(@{ub }@{fg shine }expression@{fg text }@{b })@{ub } + Returns @{b }TRUE@{ub } if @{fg shine }expression@{fg text } represents an odd number, and @{b }FALSE@{ub } + otherwise. + +@{b }Max(@{ub }@{fg shine }exp1@{fg text }@{b }, @{ub }@{fg shine }exp2@{fg text }@{b })@{ub } + Returns the maximum of @{fg shine }exp1@{fg text } and @{fg shine }exp2@{fg text }. + +@{b }Min(@{ub }@{fg shine }exp1@{fg text }@{b }, @{ub }@{fg shine }exp2@{fg text }@{b })@{ub } + Returns the minimum of @{fg shine }exp1@{fg text } and @{fg shine }exp2@{fg text }. + +@{b }Bounds(@{ub }@{fg shine }exp@{fg text }@{b }, @{ub }@{fg shine }minexp@{fg text }@{b }, @{ub }@{fg shine }maxexp@{fg text }@{b })@{ub } + Returns the value of @{fg shine }exp@{fg text } bounded to the limits @{fg shine }minexp@{fg text } (minimum + bound) and @{fg shine }maxexp@{fg text } (maximum bound). That is, if @{fg shine }exp@{fg text } lies between + the bounds then @{fg shine }exp@{fg text } is returned, but if it is less than @{fg shine }minexp@{fg text } + then @{fg shine }minexp@{fg text } is returned or if it is greater than @{fg shine }maxexp@{fg text } then + @{fg shine }maxexp@{fg text } is returned. This is useful for, say, constraining a + calculated value to be a valid (integer) percentage (i.e., a value + between zero and one hundred). + + The following code fragments are equivalent: + + y:=Bounds(x, min, max) + + y:=IF xmax THEN max ELSE x + +@{b }Mod(@{ub }@{fg shine }exp1@{fg text }@{b },@{ub }@{fg shine }exp2@{fg text }@{b })@{ub } + Returns the 16-bit remainder (or modulus) of the division of the + 32-bit @{fg shine }exp1@{fg text } by the 16-bit @{fg shine }exp2@{fg text } as the regular return value (see + @{"Multiple Return Values" Link "Procedures.guide/Multiple Return Values" }), and the 16-bit result of the division as the + first optional return value. For example, the first assignment in + the following code sets @{b }a@{ub } to 5 (since 26=(7*3)+5), @{b }b@{ub } to 3, @{b }c@{ub } to -5 + and @{b }d@{ub } to -3. It is important to notice that if @{fg shine }exp1@{fg text } is negative + then the modulus will also be negative. This is because of the way + integer division works: it simply discards fractional parts rather + rounding. + + a,b:=Mod(26,7) + c,d:=Mod(-26,7) + +@{b }Rnd(@{ub }@{fg shine }expression@{fg text }@{b })@{ub } + Returns a random number in the range 0 to (n-1), where @{fg shine }expression@{fg text } + represents the value n. These numbers are pseudo-random, so although + you appear to get a random value from each call, the sequence of + numbers you get will probably be the same each time you run your + program. Before you use @{b }Rnd@{ub } for the first time in your program you + should call it with a negative number. This decides the starting + point for the pseudo-random numbers. + +@{b }RndQ(@{ub }@{fg shine }expression@{fg text }@{b })@{ub } + Returns a random 32-bit value, based on the seed @{fg shine }expression@{fg text }. This + function is quicker than @{b }Rnd@{ub }, but returns values in the 32-bit range, + not a specified range. The seed value is used to select different + sequences of pseudo-random numbers, and the first call to @{b }RndQ@{ub } should + use a large value for the seed. + +@{b }Shl(@{ub }@{fg shine }exp1@{fg text }@{b },@{ub }@{fg shine }exp2@{fg text }@{b })@{ub } + Returns the value represented by @{fg shine }exp1@{fg text } shifted @{fg shine }exp2@{fg text } bits to the + left. For example, @{b }Shl(%0001110,2)@{ub } is @{b }%0111000@{ub } and @{b }Shl(%0001011,3)@{ub } + is @{b }%1011000@{ub }. Shifting a number one bit to the left is generally the + same as multiplying it by two (although this isn't true when you + shift large positive or large negative values). (The new bits + shifted in at the right are always zeroes.) + +@{b }Shr(@{ub }@{fg shine }exp1@{fg text }@{b },@{ub }@{fg shine }exp2@{fg text }@{b })@{ub } + Returns the value represented by @{fg shine }exp1@{fg text } shifted @{fg shine }exp2@{fg text } bits to the + right. For example, @{b }Shr(%0001110,2)@{ub } is @{b }%0000011@{ub } and @{b }Shr(%1011010,3)@{ub } + is @{b }%0001011@{ub }. For positive @{fg shine }exp1@{fg text }, shifting one bit to the right is + the same as dividing by two. (The new bits shifted in at the left + are zeroes if @{fg shine }exp1@{fg text } is positive, and ones otherwise, hence + preserving the @{fg shine }sign@{fg text } of the expression.) + +@{b }Long(@{ub }@{fg shine }addr@{fg text }@{b }), Int(@{ub }@{fg shine }addr@{fg text }@{b }), Char(@{ub }@{fg shine }addr@{fg text }@{b })@{ub } + Returns the @{b }LONG@{ub }, @{b }INT@{ub } or @{b }CHAR@{ub } value at the address @{fg shine }addr@{fg text }. These + functions should be used only when setting up a pointer and + dereferencing it in the normal way would make your program cluttered + and less readable. Use of functions like these is often called + @{fg shine }peeking@{fg text } memory (especially in dialects of the BASIC language). + +@{b }PutLong(@{ub }@{fg shine }addr@{fg text }@{b },@{ub }@{fg shine }exp@{fg text }@{b }), PutInt(@{ub }@{fg shine }addr@{fg text }@{b },@{ub }@{fg shine }exp@{fg text }@{b }), PutChar(@{ub }@{fg shine }addr@{fg text }@{b },@{ub }@{fg shine }exp@{fg text }@{b })@{ub } + Writes the @{b }LONG@{ub }, @{b }INT@{ub } or @{b }CHAR@{ub } value represented by @{fg shine }exp@{fg text } to the + address @{fg shine }addr@{fg text }. Again, these functions should be used only when + really necessary. Use of functions like these is often called + @{fg shine }poking@{fg text } memory. + + +@ENDNODE + +@NODE "System support functions" "System support functions" +@Prev "Maths and logic functions" +@Toc "Built-In Functions" + +System support functions +------------------------ + +@{b }New(@{ub }@{fg shine }bytes@{fg text }@{b })@{ub } + Returns a pointer to a newly allocated chunk of memory, which is + @{fg shine }bytes@{fg text } number of bytes. If the memory could not be allocated @{b }NIL@{ub } is + returned. The memory is initialised to zero in each byte, and taken + from any available store (Fast or Chip memory, in that order of + preference). When you've finished with this memory you can use + @{b }Dispose@{ub } to free it for use elsewhere in your program. You don't have + to @{b }Dispose@{ub } with memory you allocated with @{b }New@{ub } because your program + will automatically free it when it terminates. This is @{i }not@{ui } true for + memory allocated using the normal Amiga system routines. + +@{b }NewR(@{ub }@{fg shine }bytes@{fg text }@{b })@{ub } + The same as @{b }New@{ub } except that if the memory could not be allocated then + the exception @{b }"MEM"@{ub } is raised (and so, in this case, the function + does not return). See @{"Exception Handling" Link "Exceptions.guide/main" }. + +@{b }NewM(@{ub }@{fg shine }bytes@{fg text }@{b },@{ub }@{fg shine }type@{fg text }@{b })@{ub } + The same as @{b }NewR@{ub } except that the @{fg shine }type@{fg text } of memory (Fast or Chip) to + be allocated can be specified using flags. The flags are defined in + the module @{b }exec/memory@{ub } (see @{"Amiga System Modules" Link "Modules.guide/Amiga System Modules" }). See the `Rom + Kernel Reference Manual (Libraries)' for details about the system + function @{b }AllocMem@{ub } which uses these flags in the same way. + + As useful example, here's a small program which allocates some + cleared (i.e., zeroed) Chip memory. + + MODULE 'exec/memory' + + PROC main() + DEF m + m:=NewM(20, MEMF_CHIP OR MEMF_CLEAR) + WriteF('Allocation succeeded, m = $\\h\\n', m) + EXCEPT + IF exception="NEW" THEN WriteF('Failed\\n') + ENDPROC + +@{b }Dispose(@{ub }@{fg shine }address@{fg text }@{b })@{ub } + Used to free memory allocated with @{b }New@{ub }, @{b }NewR@{ub } or @{b }NewM@{ub }. You should + rarely need to use this function because the memory is automatically + freed when the program terminates. + +@{b }DisposeLink(@{ub }@{fg shine }complex@{fg text }@{b })@{ub } + Used to free the memory allocated with @{b }String@{ub } (see @{"String functions" Link "Types.guide/String functions" }) + or @{b }List@{ub } (see @{"List functions" Link "Types.guide/List functions" }). Again, you should rarely need to use + this function because the memory is automatically freed when the + program terminates. + +@{b }FastNew(@{ub }@{fg shine }bytes@{fg text }@{b })@{ub } + The same as @{b }NewR@{ub } except it uses a very fast, recycling method of + allocating memory. The memory allocated using @{b }FastNew@{ub } is, as ever, + deallocated automatically at the end of a program, and can be + deallocated before then using @{b }FastDispose@{ub }. Note that only + @{b }FastDispose@{ub } can be used and that it differs slightly from the + @{b }Dispose@{ub } and @{b }DisposeLink@{ub } functions (you have to specify the number of + bytes again when deallocating). + +@{b }FastDispose(@{ub }@{fg shine }address@{fg text }@{b },@{ub }@{fg shine }bytes@{fg text }@{b })@{ub } + Used to free the memory allocated using @{b }FastNew@{ub }. The @{fg shine }bytes@{fg text } + parameter must be the same as the @{fg shine }bytes@{fg text } used when the memory was + allocated with @{b }FastNew@{ub }, but the benefit is much faster allocation and + deallocation, and generally more efficient use of memory. + +@{b }CleanUp(@{ub }@{fg shine }expression@{fg text }@{b }=0)@{ub } + Terminates the program at this point, and does the normal things an E + program does when it finishes. The value denoted by @{fg shine }expression@{fg text } is + returned as the error code for the program. It is the replacement + for the AmigaDOS @{b }Exit@{ub } routine which should @{i }never@{ui } be used in an E + program. This is the only safe way of terminating a program, other + than reaching the (logical) end of the @{b }main@{ub } procedure (which is by + far the most common way!). + +@{b }CtrlC()@{ub } + Returns @{b }TRUE@{ub } if control-C has been pressed since the last call, and + @{b }FALSE@{ub } otherwise. This is really sensible only for programs started + from the Shell/CLI. + +@{b }FreeStack()@{ub } + Returns the current amount of free stack space for the program. Only + complicated programs need worry about things like stack. Recursion + is the main thing that eats a lot of stack space (see @{"Recursion" Link "Recursion.guide/main" }). + +@{b }KickVersion(@{ub }@{fg shine }expression@{fg text }@{b })@{ub } + Returns @{b }TRUE@{ub } if your Kickstart revision is at least that given by + @{fg shine }expression@{fg text }, and @{b }FALSE@{ub } otherwise. For instance, @{b }KickVersion(37)@{ub } + checks whether you're running with Kickstart version 37 or greater + (i.e., AmigaDOS 2.04 and above). + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Constants.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Constants.guide new file mode 100644 index 0000000..d62873b --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Constants.guide @@ -0,0 +1,254 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Constants" +@Next "Types.guide/main" +@Prev "Procedures.guide/main" +@Toc "Contents.guide/main" + +Constants +********* + + A @{fg shine }constant@{fg text } is a value that does not change. A (literal) number like +121 is a good example of a constant--its value is always 121. We've +already met another kind of constant: string constants (see @{"Strings" Link "Introduction.guide/Strings" }). As +you can doubtless tell, constants are pretty important things. + + + @{" Numeric Constants " Link "Numeric Constants" } + @{" String Constants Special Character Sequences " Link "String Constants Special Character Sequences" } + @{" Named Constants " Link "Named Constants" } + @{" Enumerations " Link "Enumerations" } + @{" Sets " Link "Sets" } + + +@ENDNODE + +@NODE "Numeric Constants" "Numeric Constants" +@Next "String Constants Special Character Sequences" +@Toc "main" + +Numeric Constants +================= + + We've met a lot of numbers in the previous examples. Technically +speaking, these were numeric constants (constant because they don't change +value like a variable might). They were all decimal numbers, but you can +use hexadecimal and binary numbers as well. There's also a way of +specifying a number using characters. To specify a hexadecimal number you +use a @{b }$@{ub } before the digits (and after the optional minus sign @{b }-@{ub } to +represent a negative value). To specify a binary number you use a @{b }%@{ub } +instead. + + Specifying numbers using characters is more complicated, because the +base of this system is 256 (the base of decimal is ten, that of +hexadecimal is 16 and that of binary is two). The digits are enclosed in +double-quotes (the " character), and there can be at most four digits. +Each digit is a character representing its ASCII value. Therefore, the +character @{b }A@{ub } represents 65 and the character @{b }0@{ub } (zero) represents 48. This +upshot of this is that character @{b }A@{ub } has ASCII value @{b }"A"@{ub } in E, and @{b }"0z"@{ub } +represents ("0" * 256) + "z" = (48 * 256) + 122 = 12,410. However, you +probably don't need to worry about anything other than the single +character case, which gives you the ASCII value of the character. + + The following table shows the decimal value of several numeric +constants. Notice that you can use upper- or lower-case letters for the +hexadecimal constants. Obviously the case of characters is significant +for character numbers. + + @{i }Number@{ui } @{i }Decimal value@{ui } + ---------------------- + 21 21 + -143 -143 + $1a 26 + -$B1 -177 + %1110 14 + -%1010 -10 + "z" 122 + "Je" 19,045 + -"A" -65 + + +@ENDNODE + +@NODE "String Constants Special Character Sequences" "String Constants Special Character Sequences" +@Next "Named Constants" +@Prev "Numeric Constants" +@Toc "main" + +String Constants: Special Character Sequences +============================================= + + We have seen that in a string the character sequence @{b }\\n@{ub } means a +linefeed (see @{"Strings" Link "Introduction.guide/Strings" }). There are several other similar such special +character sequences which represent useful characters that can't be typed +in a string. The following table shows all these sequences. Note that +there are some other similar sequences which are used to control +formatting with built-in procedures like @{b }WriteF@{ub }. These are listed where +@{b }WriteF@{ub } and similar procedures are described (see +@{"Input and output functions" Link "BuiltIns.guide/Input and output functions" }). + + @{i }Sequence@{ui } @{i }Meaning@{ui } + -------------------------------------- + \\0 A null (ASCII zero) + \\a An apostrophe ' + \\b A carriage return (ASCII 13) + \\e An escape (ASCII 27) + \\n A linefeed (ASCII 10) + \\q A double quote (ASCII 34) + \\t A tab (ASCII 9) + \\\\ A backslash \\ + +An apostrophe can also be produced by typing two apostrophes in a row in a +string. It's best to use this only in the middle of a string, where it's +nice and obvious: + + WriteF('Here\\as an apostrophe.\\n') /* Using \\a */ + + WriteF('Here''s another apostrophe.\\n') /* Using '' */ + + +@ENDNODE + +@NODE "Named Constants" "Named Constants" +@Next "Enumerations" +@Prev "String Constants Special Character Sequences" +@Toc "main" + +Named Constants +=============== + + It is often nice to be able to give names to certain constants. For +instance, as we saw earlier, the truth value @{b }TRUE@{ub } actually represents the +value -1, and @{b }FALSE@{ub } represents zero (see @{"Logic and comparison" Link "Introduction.guide/Logic and comparison" }). These are +our first examples of named constants. To define your own you use the +@{b }CONST@{ub } keyword as follows: + + CONST ONE=1, LINEFEED=10, BIG_NUM=999999 + +This has defined the constant @{b }ONE@{ub } to represent one, @{b }LINEFEED@{ub } ten and +@{b }BIG_NUM@{ub } 999,999. Named constants must begin with two uppercase letters, +as mentioned before (see @{"Identifiers" Link "Format.guide/Identifiers" }). + + You can use previously defined constants to give the value of a new +constant, but in this case the definitions must occur on different @{b }CONST@{ub } +lines. + + CONST ZERO=0 + CONST ONE=ZERO+1 + CONST TWO=ONE+1 + +The expression used to define the value of a constant can use only simple +operators (no function calls) and constants. + + +@ENDNODE + +@NODE "Enumerations" "Enumerations" +@Next "Sets" +@Prev "Named Constants" +@Toc "main" + +Enumerations +============ + + Often you want to define a whole lot of constants and you just want +them all to have a different value so you can tell them apart easily. For +instance, if you wanted to define some constants to represent some famous +cities and you only needed to know how to distinguish one from another +then you could use an @{fg shine }enumeration@{fg text } like this: + + ENUM LONDON, MOSCOW, NEW_YORK, PARIS, ROME, TOKYO + +The @{b }ENUM@{ub } keyword begins the definitions (like the @{b }CONST@{ub } keyword does for +an ordinary constant definition). The actual values of the constants +start at zero and stretch up to five. In fact, this is exactly the same +as writing: + + CONST LONDON=0, MOSCOW=1, NEW_YORK=2, PARIS=3, ROME=4, TOKYO=5 + + The enumeration does not have to start at zero, though. You can change +the starting value at any point by specifying a value for an enumerated +constant. For example, the following constant definitions are equivalent: + + ENUM APPLE, ORANGE, CAT=55, DOG, GOLDFISH, FRED=-2, + BARNEY, WILMA, BETTY + + CONST APPLE=0, ORANGE=1, CAT=55, DOG=56, GOLDFISH=57, + FRED=-2, BARNEY=-1, WILMA=0, BETTY=1 + + +@ENDNODE + +@NODE "Sets" "Sets" +@Prev "Enumerations" +@Toc "main" + +Sets +==== + + Yet another kind of constant definition is the @{fg shine }set@{fg text } definition. This +useful for defining flag sets, i.e., a number of options each of which can +be on or off. The definition is like a simple enumeration, but using the +@{b }SET@{ub } keyword and this time the values start at one and increase as powers +of two (so the next value is two, the next is four, the next eight, and so +on). Therefore, the following definitions are equivalent: + + SET ENGLISH, FRENCH, GERMAN, JAPANESE, RUSSIAN + + CONST ENGLISH=1, FRENCH=2, GERMAN=4, JAPANESE=8, RUSSIAN=16 + +However, the significance of the values it is best shown by using binary +constants: + + CONST ENGLISH=%00001, FRENCH=%00010, GERMAN=%00100, + JAPANESE=%01000, RUSSIAN=%10000 + +If a person speaks just English then we can use the constant @{b }ENGLISH@{ub }. If +they also spoke Japanese then to represent this with a single value we'd +normally need a new constant (something like @{b }ENG_JAP@{ub }). In fact, we'd +probably need a constant for each combination of languages a person might +know. However, with the set definition we can @{b }OR@{ub } the @{b }ENGLISH@{ub } and @{b }JAPANESE@{ub } +values together to get a new value, @{b }%01001@{ub }, and this represents a set +containing both @{b }ENGLISH@{ub } and @{b }JAPANESE@{ub }. On the other hand, to find out if +someone speaks French we would @{b }AND@{ub } the value for the languages they know +with @{b }%00010@{ub } (or the constant @{b }FRENCH@{ub }). (As you might have guessed, @{b }AND@{ub } and +@{b }OR@{ub } are really bit-wise operators, not simply logical operators. See +@{"Bitwise AND and OR" Link "MoreExpressions.guide/Bitwise AND and OR" }.) + + Consider this program fragment: + + speak:=GERMAN OR ENGLISH OR RUSSIAN /* Speak any of these */ + IF speak AND JAPANESE + WriteF('Can speak in Japanese\\n') + ELSE + WriteF('Unable to speak in Japanese\\n') + ENDIF + IF speak AND (GERMAN OR FRENCH) + WriteF('Can speak in German or French\\n') + ELSE + WriteF('Unable to speak in German or French\\n') + ENDIF + +The assignment sets @{b }speak@{ub } to show that the person can speak in German, +English or Russian. The first @{b }IF@{ub } block tests whether the person can speak +in Japanese, and the second tests whether they can speak in German or +French. + + When using sets be careful you don't get tempted to add values instead +of @{b }OR@{ub }-ing them. Adding two different constants from the same set is the +same as @{b }OR@{ub }-ing them, but adding the same set constant to itself isn't. +This is not the only time addition doesn't give the same answer, but it's +the most obvious. If you to stick to using @{b }OR@{ub } you won't have a problem. + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Contents.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Contents.guide new file mode 100644 index 0000000..a2cfc16 --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Contents.guide @@ -0,0 +1,69 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "beginner.guide" + + + + Copyright (c) 1994-1997, Jason R. Hulance. + +A Beginner's Guide to Amiga E +***************************** + + This Guide gives an introduction to the Amiga E programming language +and, to some extent, programming in general. + + +Part One: Getting Started + + @{" Introduction to Amiga E " Link "Introduction.guide/main" } + @{" Understanding a Simple Program " Link "Introduction.guide/Understanding a Simple Program" } + @{" Variables and Expressions " Link "Introduction.guide/Variables and Expressions" } + @{" Program Flow Control " Link "Introduction.guide/Program Flow Control" } + @{" Summary " Link "Introduction.guide/Summary" } + +Part Two: The E Language + + @{" Format and Layout " Link "Format.guide/main" } + @{" Procedures and Functions " Link "Procedures.guide/main" } + @{" Constants " Link "Constants.guide/main" } + @{" Types " Link "Types.guide/main" } + @{" More About Statements and Expressions " Link "MoreExpressions.guide/main" } + @{" E Built-In Constants Variables and Functions " Link "BuiltIns.guide/main" } + @{" Modules " Link "Modules.guide/main" } + @{" Exception Handling " Link "Exceptions.guide/main" } + @{" Memory Allocation " Link "Memory.guide/main" } + @{" Floating-Point Numbers " Link "FloatingPoint.guide/main" } + @{" Recursion " Link "Recursion.guide/main" } + @{" Object Oriented E " Link "OOE.guide/main" } + +Part Three: Worked Examples + + @{" Introduction to the Examples " Link "Examples.guide/main" } + @{" String Handling and I-O " Link "Examples.guide/String Handling and I-O" } + @{" Timing Expressions " Link "Examples.guide/Timing Expressions" } + @{" Argument Parsing " Link "Examples.guide/Argument Parsing" } + @{" Gadgets IDCMP and Graphics " Link "Examples.guide/Gadgets IDCMP and Graphics" } + @{" Recursion Example " Link "Examples.guide/Recursion Example" } + +Part Four: Appendices + + @{" Common Problems " Link "Appendices.guide/main" } + @{" Other Information " Link "Appendices.guide/Other Information" } + +Indices + + @{" E Language Index " Link "EIndex.guide/main" } + @{" Main Index " Link "Index.guide/main" } + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Contents.guide.info b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Contents.guide.info new file mode 100644 index 0000000000000000000000000000000000000000..1618f2878a2d89e4c3fe7a91edfc9772e8931bd1 GIT binary patch literal 1814 zcmaDXz`)1=0=x`D42BG*3~UU{42%^PS1(jpTo(Y#AQOx%3>B7hXH@VQE@%LXgD?U> zl^ZgcFfcLjeAQq^Na1Di|A9!?|8D>>82|r&0HT@y|Nj7@+5i9l0iyZ;{|76S|Ns9V zh;RS@|9@n<9>{M13Lt2EF#rEQ`Tqxi;&A#8KZwuxA4oqyrh)pwd~#`sH-P2>Ed!g2 zPJ``b0NHy0Cj{z3G zV9qEp6hi=-r+#D*m#2V90GxJcKpy}FAJAN4X>e`;xdW6dXh0L|4wyQcgbUDXqhM%- gfJAU)uvKYEW=>{FW@@p%Z)r|RW?5!xImj0*0Hera$N&HU literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/EIndex.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/EIndex.guide new file mode 100644 index 0000000..54bc2a6 --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/EIndex.guide @@ -0,0 +1,294 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "E Language Index" +@Next "Index.guide/main" +@Prev "Appendices.guide/Other Information" +@Toc "Contents.guide/main" + +E Language Index +**************** + + This index should be used to find detailed information about the +keywords, functions, variables and constants which are part of the Amiga E +language. There is a separate index which deals with concepts etc. (see +@{"Main Index" Link "Index.guide/main" }). + + + + @{" Symbol, close curly brace " Link "Types.guide/Finding addresses (making pointers)" 0 } Finding addresses (making pointers) + @{" Symbol, double-quote " Link "Constants.guide/Numeric Constants" 11 } Numeric Constants + @{" Symbol, open curly brace " Link "Types.guide/Finding addresses (making pointers)" 0 } Finding addresses (making pointers) + @{" Symbol, ! " Link "FloatingPoint.guide/Floating-Point Calculations" 0 } Floating-Point Calculations + @{" Symbol, $ " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Symbol, % " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Symbol, ' .. ' (string) " Link "Types.guide/Normal strings and E-strings" 0 } Normal strings and E-strings + @{" Symbol, * " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Symbol, + " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Symbol, + (strings) " Link "Format.guide/Statements" 58 } Statements + @{" Symbol, ++ " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Symbol, - " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Symbol, -- " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Symbol, -> " Link "Format.guide/Comments" 0 } Comments + @{" Symbol, / " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Symbol, /* .. */ " Link "Format.guide/Comments" 0 } Comments + @{" Symbol, : " Link "MoreExpressions.guide/Labelling and the JUMP statement" 0 } Labelling and the JUMP statement + @{" Symbol, := " Link "Introduction.guide/Assignment" 0 } Assignment + @{" Symbol, ; " Link "Format.guide/Statements" 18 } Statements + @{" Symbol, < " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Symbol, <= " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Symbol, <=> " Link "MoreExpressions.guide/Unification" 0 } Unification + @{" Symbol, <> " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Symbol, = " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Symbol, > " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Symbol, >= " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Symbol, [ .. , .. ] (list) " Link "Types.guide/Lists and E-lists" 12 } Lists and E-lists + @{" Symbol, [ .. , .. ]:type (typed list) " Link "Types.guide/Typed lists" 0 } Typed lists + @{" Symbol, [ .. ] (array) " Link "Types.guide/Tables of data" 0 } Tables of data + @{" Symbol, [] (array) " Link "Types.guide/Accessing array data" 55 } Accessing array data + @{" Symbol, \0 " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, \a " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, \b " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, \c " Link "BuiltIns.guide/Input and output functions" 16 } Input and output functions + @{" Symbol, \d " Link "BuiltIns.guide/Input and output functions" 16 } Input and output functions + @{" Symbol, \d " Link "Introduction.guide/Changing the example" 0 } Changing the example + @{" Symbol, \e " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, \h " Link "BuiltIns.guide/Input and output functions" 16 } Input and output functions + @{" Symbol, \l " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" Symbol, \n " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, \n " Link "Introduction.guide/Strings" 0 } Strings + @{" Symbol, \q " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, \r " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" Symbol, \s " Link "BuiltIns.guide/Input and output functions" 16 } Input and output functions + @{" Symbol, \t " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, \z " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" Symbol, \\ " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Symbol, ^ " Link "Types.guide/Extracting data (dereferencing pointers)" 0 } Extracting data (dereferencing pointers) + @{" Symbol, ` (backquote) " Link "MoreExpressions.guide/Quoted Expressions" 0 } Quoted Expressions + @{" Abs " Link "BuiltIns.guide/Maths and logic functions" 30 } Maths and logic functions + @{" ALL " Link "BuiltIns.guide/Built-In Constants" 12 } Built-In Constants + @{" And " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" AND " Link "MoreExpressions.guide/Bitwise AND and OR" 0 } Bitwise AND and OR + @{" arg " Link "BuiltIns.guide/Built-In Variables" 7 } Built-In Variables + @{" ARRAY " Link "Types.guide/Tables of data" 0 } Tables of data + @{" ARRAY OF type " Link "Types.guide/Tables of data" 0 } Tables of data + @{" Bounds " Link "BuiltIns.guide/Maths and logic functions" 55 } Maths and logic functions + @{" Box " Link "BuiltIns.guide/Graphics functions" 30 } Graphics functions + @{" BUT " Link "MoreExpressions.guide/BUT expression" 0 } BUT expression + @{" CASE " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" CASE " Link "Introduction.guide/SELECT block" 0 } SELECT block + @{" CASE ..TO.. " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" CHAR " Link "Types.guide/Indirect types" 0 } Indirect types + @{" Char " Link "BuiltIns.guide/Maths and logic functions" 116 } Maths and logic functions + @{" CHAR " Link "MoreExpressions.guide/Static memory" 0 } Static memory + @{" CleanUp " Link "BuiltIns.guide/System support functions" 65 } System support functions + @{" CloseS " Link "BuiltIns.guide/Intuition support functions" 178 } Intuition support functions + @{" CloseW " Link "BuiltIns.guide/Intuition support functions" 122 } Intuition support functions + @{" Colour " Link "BuiltIns.guide/Graphics functions" 35 } Graphics functions + @{" conout " Link "BuiltIns.guide/Built-In Variables" 34 } Built-In Variables + @{" CONST " Link "Constants.guide/Named Constants" 0 } Named Constants + @{" CtrlC " Link "BuiltIns.guide/System support functions" 74 } System support functions + @{" DEC " Link "MoreExpressions.guide/INC and DEC statements" 0 } INC and DEC statements + @{" DEF " Link "Introduction.guide/Variable declaration" 0 } Variable declaration + @{" DEFAULT " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" DEFAULT " Link "Introduction.guide/SELECT block" 0 } SELECT block + @{" Dispose " Link "BuiltIns.guide/System support functions" 39 } System support functions + @{" DisposeLink " Link "BuiltIns.guide/System support functions" 44 } System support functions + @{" Div " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" DO, (FOR loop) " Link "Introduction.guide/FOR loop" 55 } FOR loop + @{" DO, (WHILE loop) " Link "Introduction.guide/WHILE loop" 57 } WHILE loop + @{" dosbase " Link "BuiltIns.guide/Built-In Variables" 51 } Built-In Variables + @{" ELSE " Link "Introduction.guide/IF block" 0 } IF block + @{" ELSEIF " Link "Introduction.guide/IF block" 0 } IF block + @{" EMPTY " Link "OOE.guide/Inheritance in E" 275 } Inheritance in E + @{" end " Link "OOE.guide/Methods in E" 118 } Methods in E + @{" END " Link "Memory.guide/NEW and END Operators" 0 } NEW and END Operators + @{" ENDFOR " Link "Introduction.guide/FOR loop" 0 } FOR loop + @{" ENDIF " Link "Introduction.guide/IF block" 0 } IF block + @{" ENDLOOP " Link "MoreExpressions.guide/LOOP block" 0 } LOOP block + @{" ENDOBJECT " Link "Types.guide/Example object" 23 } Example object + @{" ENDPROC " Link "Introduction.guide/Procedure Definition" 0 } Procedure Definition + @{" ENDPROC value " Link "Procedures.guide/Functions" 23 } Functions + @{" ENDSELECT " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" ENDSELECT " Link "Introduction.guide/SELECT block" 0 } SELECT block + @{" ENDWHILE " Link "Introduction.guide/WHILE loop" 0 } WHILE loop + @{" ENUM " Link "Constants.guide/Enumerations" 0 } Enumerations + @{" Eor " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" EstrLen " Link "Types.guide/String functions" 125 } String functions + @{" Eval " Link "MoreExpressions.guide/Evaluation" 0 } Evaluation + @{" Even " Link "BuiltIns.guide/Maths and logic functions" 41 } Maths and logic functions + @{" EXCEPT " Link "Exceptions.guide/Procedures with Exception Handlers" 0 } Procedures with Exception Handlers + @{" EXCEPT DO " Link "Exceptions.guide/Raising an Exception" 73 } Raising an Exception + @{" exception " Link "Exceptions.guide/Raising an Exception" 36 } Raising an Exception + @{" exceptioninfo " Link "Exceptions.guide/Raising an Exception" 50 } Raising an Exception + @{" execbase " Link "BuiltIns.guide/Built-In Variables" 51 } Built-In Variables + @{" Exists " Link "MoreExpressions.guide/Lists and quoted expressions" 46 } Lists and quoted expressions + @{" EXIT " Link "MoreExpressions.guide/EXIT statement" 0 } EXIT statement + @{" Fabs " Link "FloatingPoint.guide/Floating-Point Functions" 55 } Floating-Point Functions + @{" FALSE " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" FALSE " Link "BuiltIns.guide/Built-In Constants" 5 } Built-In Constants + @{" FastDispose " Link "BuiltIns.guide/System support functions" 59 } System support functions + @{" FastDisposeList " Link "Memory.guide/List and typed list allocation" 66 } List and typed list allocation + @{" FastNew " Link "BuiltIns.guide/System support functions" 50 } System support functions + @{" Fceil " Link "FloatingPoint.guide/Floating-Point Functions" 59 } Floating-Point Functions + @{" Fcos " Link "FloatingPoint.guide/Floating-Point Functions" 51 } Floating-Point Functions + @{" Fexp " Link "FloatingPoint.guide/Floating-Point Functions" 66 } Floating-Point Functions + @{" Ffloor " Link "FloatingPoint.guide/Floating-Point Functions" 59 } Floating-Point Functions + @{" FileLength " Link "BuiltIns.guide/Input and output functions" 154 } Input and output functions + @{" Flog " Link "FloatingPoint.guide/Floating-Point Functions" 73 } Floating-Point Functions + @{" Flog10 " Link "FloatingPoint.guide/Floating-Point Functions" 73 } Floating-Point Functions + @{" FOR " Link "Introduction.guide/FOR loop" 0 } FOR loop + @{" ForAll " Link "MoreExpressions.guide/Lists and quoted expressions" 29 } Lists and quoted expressions + @{" Forward " Link "Types.guide/Linked Lists" 56 } Linked Lists + @{" Fpow " Link "FloatingPoint.guide/Floating-Point Functions" 66 } Floating-Point Functions + @{" FreeStack " Link "BuiltIns.guide/System support functions" 79 } System support functions + @{" Fsin " Link "FloatingPoint.guide/Floating-Point Functions" 51 } Floating-Point Functions + @{" Fsqrt " Link "FloatingPoint.guide/Floating-Point Functions" 63 } Floating-Point Functions + @{" Ftan " Link "FloatingPoint.guide/Floating-Point Functions" 51 } Floating-Point Functions + @{" Gadget " Link "BuiltIns.guide/Intuition support functions" 187 } Intuition support functions + @{" GADGETSIZE " Link "BuiltIns.guide/Built-In Constants" 16 } Built-In Constants + @{" gfxbase " Link "BuiltIns.guide/Built-In Variables" 51 } Built-In Variables + @{" HANDLE " Link "Exceptions.guide/Procedures with Exception Handlers" 0 } Procedures with Exception Handlers + @{" IF " Link "Introduction.guide/IF block" 0 } IF block + @{" IF, (expression) " Link "Introduction.guide/IF expression" 0 } IF expression + @{" INC " Link "MoreExpressions.guide/INC and DEC statements" 0 } INC and DEC statements + @{" INCBIN " Link "MoreExpressions.guide/Static memory" 0 } Static memory + @{" Inp " Link "BuiltIns.guide/Input and output functions" 109 } Input and output functions + @{" InStr " Link "Types.guide/String functions" 156 } String functions + @{" Int " Link "BuiltIns.guide/Maths and logic functions" 116 } Maths and logic functions + @{" INT " Link "MoreExpressions.guide/Static memory" 0 } Static memory + @{" INT " Link "Types.guide/Indirect types" 0 } Indirect types + @{" intuitionbase " Link "BuiltIns.guide/Built-In Variables" 51 } Built-In Variables + @{" IS " Link "Procedures.guide/One-Line Functions" 0 } One-Line Functions + @{" JUMP " Link "MoreExpressions.guide/Labelling and the JUMP statement" 0 } Labelling and the JUMP statement + @{" KickVersion " Link "BuiltIns.guide/System support functions" 84 } System support functions + @{" LeftMouse " Link "BuiltIns.guide/Intuition support functions" 273 } Intuition support functions + @{" Line " Link "BuiltIns.guide/Graphics functions" 27 } Graphics functions + @{" Link " Link "Types.guide/Linked Lists" 23 } Linked Lists + @{" LIST " Link "Types.guide/Lists and E-lists" 35 } Lists and E-lists + @{" List " Link "Types.guide/List functions" 12 } List functions + @{" ListAdd " Link "Types.guide/List functions" 47 } List functions + @{" ListCmp " Link "Types.guide/List functions" 28 } List functions + @{" ListCopy " Link "Types.guide/List functions" 37 } List functions + @{" ListItem " Link "Types.guide/List functions" 65 } List functions + @{" ListLen " Link "Types.guide/List functions" 55 } List functions + @{" ListMax " Link "Types.guide/List functions" 59 } List functions + @{" Long " Link "BuiltIns.guide/Maths and logic functions" 116 } Maths and logic functions + @{" LONG " Link "Types.guide/LONG Type" 0 } LONG Type + @{" LONG " Link "MoreExpressions.guide/Static memory" 0 } Static memory + @{" LONG, preliminary " Link "Introduction.guide/Variable types" 0 } Variable types + @{" LOOP " Link "MoreExpressions.guide/LOOP block" 0 } LOOP block + @{" LowerStr " Link "Types.guide/String functions" 169 } String functions + @{" main " Link "Introduction.guide/Procedures" 0 } Procedures + @{" MapList " Link "MoreExpressions.guide/Lists and quoted expressions" 8 } Lists and quoted expressions + @{" Max " Link "BuiltIns.guide/Maths and logic functions" 49 } Maths and logic functions + @{" MidStr " Link "Types.guide/String functions" 144 } String functions + @{" Min " Link "BuiltIns.guide/Maths and logic functions" 52 } Maths and logic functions + @{" Mod " Link "BuiltIns.guide/Maths and logic functions" 70 } Maths and logic functions + @{" MODULE " Link "Modules.guide/Using Modules" 0 } Using Modules + @{" Mouse " Link "BuiltIns.guide/Intuition support functions" 235 } Intuition support functions + @{" MouseX " Link "BuiltIns.guide/Intuition support functions" 259 } Intuition support functions + @{" MouseY " Link "BuiltIns.guide/Intuition support functions" 266 } Intuition support functions + @{" MsgCode " Link "BuiltIns.guide/Intuition support functions" 313 } Intuition support functions + @{" MsgIaddr " Link "BuiltIns.guide/Intuition support functions" 316 } Intuition support functions + @{" MsgQualifier " Link "BuiltIns.guide/Intuition support functions" 321 } Intuition support functions + @{" Mul " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" NEW " Link "Memory.guide/NEW and END Operators" 0 } NEW and END Operators + @{" New " Link "BuiltIns.guide/System support functions" 0 } System support functions + @{" NEWFILE " Link "BuiltIns.guide/Built-In Constants" 20 } Built-In Constants + @{" NewM " Link "BuiltIns.guide/System support functions" 19 } System support functions + @{" NewR " Link "BuiltIns.guide/System support functions" 14 } System support functions + @{" Next " Link "Types.guide/Linked Lists" 38 } Linked Lists + @{" NIL " Link "BuiltIns.guide/Built-In Constants" 8 } Built-In Constants + @{" Not " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" OBJECT " Link "Types.guide/Example object" 23 } Example object + @{" OBJECT..OF " Link "OOE.guide/Inheritance in E" 0 } Inheritance in E + @{" Odd " Link "BuiltIns.guide/Maths and logic functions" 45 } Maths and logic functions + @{" OLDFILE " Link "BuiltIns.guide/Built-In Constants" 20 } Built-In Constants + @{" OpenS " Link "BuiltIns.guide/Intuition support functions" 129 } Intuition support functions + @{" OpenW " Link "BuiltIns.guide/Intuition support functions" 16 } Intuition support functions + @{" OR " Link "MoreExpressions.guide/Bitwise AND and OR" 0 } Bitwise AND and OR + @{" Or " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" Out " Link "BuiltIns.guide/Input and output functions" 99 } Input and output functions + @{" Plot " Link "BuiltIns.guide/Graphics functions" 16 } Graphics functions + @{" PrintF " Link "BuiltIns.guide/Input and output functions" 85 } Input and output functions + @{" PRIVATE " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" PROC " Link "Introduction.guide/Procedure Definition" 0 } Procedure Definition + @{" PROC..OF " Link "OOE.guide/Methods in E" 0 } Methods in E + @{" PTR TO type " Link "Types.guide/PTR Type" 0 } PTR Type + @{" PUBLIC " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" PutChar " Link "BuiltIns.guide/Maths and logic functions" 123 } Maths and logic functions + @{" PutInt " Link "BuiltIns.guide/Maths and logic functions" 123 } Maths and logic functions + @{" PutLong " Link "BuiltIns.guide/Maths and logic functions" 123 } Maths and logic functions + @{" Raise " Link "Exceptions.guide/Raising an Exception" 0 } Raising an Exception + @{" RAISE " Link "Exceptions.guide/Automatic Exceptions" 25 } Automatic Exceptions + @{" ReadStr " Link "BuiltIns.guide/Input and output functions" 114 } Input and output functions + @{" RealF " Link "FloatingPoint.guide/Floating-Point Functions" 19 } Floating-Point Functions + @{" RealVal " Link "FloatingPoint.guide/Floating-Point Functions" 10 } Floating-Point Functions + @{" REPEAT " Link "Introduction.guide/REPEAT..UNTIL loop" 0 } REPEAT..UNTIL loop + @{" ReThrow " Link "Exceptions.guide/Raise within an Exception Handler" 68 } Raise within an Exception Handler + @{" RETURN " Link "Procedures.guide/Functions" 32 } Functions + @{" RightStr " Link "Types.guide/String functions" 136 } String functions + @{" Rnd " Link "BuiltIns.guide/Maths and logic functions" 84 } Maths and logic functions + @{" RndQ " Link "BuiltIns.guide/Maths and logic functions" 93 } Maths and logic functions + @{" SELECT " Link "Introduction.guide/SELECT block" 0 } SELECT block + @{" SELECT " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" SELECT..OF " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" SelectList " Link "MoreExpressions.guide/Lists and quoted expressions" 62 } Lists and quoted expressions + @{" self " Link "OOE.guide/Methods in E" 67 } Methods in E + @{" SET " Link "Constants.guide/Sets" 0 } Sets + @{" SetColour " Link "BuiltIns.guide/Graphics functions" 49 } Graphics functions + @{" SetList " Link "Types.guide/List functions" 62 } List functions + @{" SetStdIn " Link "BuiltIns.guide/Input and output functions" 161 } Input and output functions + @{" SetStdOut " Link "BuiltIns.guide/Input and output functions" 170 } Input and output functions + @{" SetStdRast " Link "BuiltIns.guide/Graphics functions" 58 } Graphics functions + @{" SetStr " Link "Types.guide/String functions" 178 } String functions + @{" SetTopaz " Link "BuiltIns.guide/Graphics functions" 67 } Graphics functions + @{" Shl " Link "BuiltIns.guide/Maths and logic functions" 100 } Maths and logic functions + @{" Shr " Link "BuiltIns.guide/Maths and logic functions" 108 } Maths and logic functions + @{" Sign " Link "BuiltIns.guide/Maths and logic functions" 36 } Maths and logic functions + @{" SIZEOF " Link "MoreExpressions.guide/SIZEOF expression" 0 } SIZEOF expression + @{" stdin " Link "BuiltIns.guide/Built-In Variables" 34 } Built-In Variables + @{" stdout " Link "BuiltIns.guide/Built-In Variables" 34 } Built-In Variables + @{" stdrast " Link "BuiltIns.guide/Built-In Variables" 46 } Built-In Variables + @{" STEP " Link "Introduction.guide/FOR loop" 37 } FOR loop + @{" StrAdd " Link "Types.guide/String functions" 99 } String functions + @{" StrCmp " Link "Types.guide/String functions" 40 } String functions + @{" StrCopy " Link "Types.guide/String functions" 58 } String functions + @{" STRING " Link "Types.guide/Normal strings and E-strings" 49 } Normal strings and E-strings + @{" String " Link "Types.guide/String functions" 14 } String functions + @{" StringF " Link "BuiltIns.guide/Input and output functions" 90 } Input and output functions + @{" StrLen " Link "Types.guide/String functions" 108 } String functions + @{" STRLEN " Link "BuiltIns.guide/Built-In Constants" 24 } Built-In Constants + @{" StrMax " Link "Types.guide/String functions" 131 } String functions + @{" SUPER " Link "OOE.guide/Inheritance in E" 110 } Inheritance in E + @{" TextF " Link "BuiltIns.guide/Graphics functions" 42 } Graphics functions + @{" THEN " Link "Introduction.guide/IF block" 29 } IF block + @{" Throw " Link "Exceptions.guide/Raising an Exception" 0 } Raising an Exception + @{" TO " Link "Introduction.guide/FOR loop" 0 } FOR loop + @{" TO, (CASE range) " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" TO, (FOR loop) " Link "Introduction.guide/FOR loop" 0 } FOR loop + @{" TrimStr " Link "Types.guide/String functions" 161 } String functions + @{" TRUE " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" TRUE " Link "BuiltIns.guide/Built-In Constants" 5 } Built-In Constants + @{" UNTIL " Link "Introduction.guide/REPEAT..UNTIL loop" 0 } REPEAT..UNTIL loop + @{" UpperStr " Link "Types.guide/String functions" 174 } String functions + @{" Val " Link "Types.guide/String functions" 199 } String functions + @{" VOID " Link "MoreExpressions.guide/Turning an Expression into a Statement" 0 } Turning an Expression into a Statement + @{" WaitIMessage " Link "BuiltIns.guide/Intuition support functions" 282 } Intuition support functions + @{" WaitLeftMouse " Link "BuiltIns.guide/Intuition support functions" 324 } Intuition support functions + @{" wbmessage " Link "BuiltIns.guide/Built-In Variables" 23 } Built-In Variables + @{" WHILE " Link "Introduction.guide/WHILE loop" 0 } WHILE loop + @{" WriteF " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/EIndex.guide.info b/amigae33a/E_v3.3a/Docs/BeginnersGuide/EIndex.guide.info new file mode 100644 index 0000000000000000000000000000000000000000..2ebbabdd48378e752b5a1641dbd2e86e628ce669 GIT binary patch literal 1814 zcmaDXz`)1=0>KPI42BG*3~UU{42%^P=M5?>E_r}ukO@W>h6>BsCn|XKXEXrCK^Or9 zAWTCB69y&*o_8yl5mI0^L} zFPJk*48;(D=BbY_h|5#JBmho3G@uWFf)8jeu{1b0fZPGf6*QoUbq7oxO~M7}wNWs% hLO>!oGT5rLBr_+oBr~;G-?ucUB(p3twH)LN762~qW3d1L literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Examples.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Examples.guide new file mode 100644 index 0000000..2192ffe --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Examples.guide @@ -0,0 +1,1189 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Introduction to the Examples" +@Next "String Handling and I-O" +@Prev "OOE.guide/main" +@Toc "Contents.guide/main" + +Introduction to the Examples +**************************** + + In this part we shall go through some slightly larger examples than +those in the previous parts. However, none of them are too big, so they +should still be easy to understand. The note-worthy parts of each example +are described, and you may even find the odd comment in the code. Large, +complicated programs benefit hugely from the odd well-placed and +descriptive comment. This fact can't be stressed enough. + + All the examples will run on a standard Amiga, except for the one which +uses @{b }ReadArgs@{ub } (an AmigaDOS 2.0 function). It is really worth upgrading +your system to AmigaDOS 2.0 (or above) if you are still using previous +versions. The @{b }ReadArgs@{ub } example can only hint at the power and +friendliness of the newer system functions. If you are fortunate enough +to have an A4000 or an accelerated machine, then the timing example will +give better (i.e., quicker) results. + + Supplied with this Guide should be a directory of sources of most of +the examples. Here's a complete catalogue: + +@{b }simple.e@{ub } + The simple program from the introduction. See @{"A Simple Program" Link "Introduction.guide/A Simple Program" }. + +@{b }while.e@{ub } + The slightly complicated @{b }WHILE@{ub } loop. See @{"WHILE loop" Link "Introduction.guide/WHILE loop" }. + +@{b }address.e@{ub } + The program which prints the addresses of some variables. See + @{"Finding addresses (making pointers)" Link "Types.guide/Finding addresses (making pointers)" }. + +@{b }static.e@{ub } + The static data problem. See @{"Static data" Link "Types.guide/Static data" }. + +@{b }static2.e@{ub } + The first solution to the static data problem. See @{"Static data" Link "Types.guide/Static data" }. + +@{b }except.e@{ub } + An exception handler example. See @{"Raising an Exception" Link "Exceptions.guide/Raising an Exception" }. + +@{b }except2.e@{ub } + Another exception handler example. See @{"Raising an Exception" Link "Exceptions.guide/Raising an Exception" }. + +@{b }static3.e@{ub } + The second solution to the static data problem, using @{b }NEW@{ub }. See + @{"List and typed list allocation" Link "Memory.guide/List and typed list allocation" }. + +@{b }float.e@{ub } + The floating-point example program. See @{"Floating-Point Functions" Link "FloatingPoint.guide/Floating-Point Functions" }. + +@{b }bintree.e@{ub } + The binary tree example. See @{"Binary Trees" Link "Recursion.guide/Binary Trees" }. + +@{b }tree.e@{ub } + The @{b }tree@{ub } and @{b }integer_tree@{ub } classes, as a module. See @{"Inheritance in E" Link "OOE.guide/Inheritance in E" }. + +@{b }tree-use.e@{ub } + A program to use the @{b }integer_tree@{ub } class. See @{"Inheritance in E" Link "OOE.guide/Inheritance in E" }. + +@{b }set.e@{ub } + The simple, inefficient @{b }set@{ub } class, as a module. See @{"Data-Hiding in E" Link "OOE.guide/Data-Hiding in E" }. + +@{b }set-use.e@{ub } + A program to use the @{b }set@{ub } class. See @{"Data-Hiding in E" Link "OOE.guide/Data-Hiding in E" }. + +@{b }csv-estr.e@{ub } + The CSV reading program using E-strings. See @{"String Handling and I-O" Link "String Handling and I-O" }. + +@{b }csv-norm.e@{ub } + The CSV reading program using normal strings. See + @{"String Handling and I-O" Link "String Handling and I-O" }. + +@{b }csv-buff.e@{ub } + The CSV reading program using normal strings and a large buffer. See + @{"String Handling and I-O" Link "String Handling and I-O" }. + +@{b }csv.e@{ub } + The CSV reading program using normal strings, a large buffer, and an + exception handler. See @{"String Handling and I-O" Link "String Handling and I-O" }. + +@{b }timing.e@{ub } + The timing example. See @{"Timing Expressions" Link "Timing Expressions" }. + +@{b }args.e@{ub } + The argument parsing example for any AmigaDOS. See @{"Any AmigaDOS" Link "Any AmigaDOS" }. + +@{b }args20.e@{ub } + The argument parsing example for any AmigaDOS 2.0 and above. See + @{"AmigaDOS 2.0 (and above)" Link "AmigaDOS 2.0 (and above)" }. + +@{b }gadgets.e@{ub } + The gadgets example. See @{"Gadgets" Link "Gadgets" }. + +@{b }idcmp.e@{ub } + The IDCMP and gadgets example. See @{"IDCMP Messages" Link "IDCMP Messages" }. + +@{b }graphics.e@{ub } + The graphics example. See @{"Graphics" Link "Graphics" }. + +@{b }screens.e@{ub } + The screens example, without an exception handler. See @{"Screens" Link "Screens" }. + +@{b }screens2.e@{ub } + The screens example again, but this time with an exception handler. + See @{"Screens" Link "Screens" }. + +@{b }dragon.e@{ub } + The dragon curve recursion example. See @{"Recursion Example" Link "Recursion Example" }. + + +@ENDNODE + +@NODE "String Handling and I-O" "String Handling and I-O" +@Next "Timing Expressions" +@Prev "main" +@Toc "Contents.guide/main" + +String Handling and I/O +*********************** + + This chapter shows how to use normal strings and E-strings, and also +how to read data from a file. The programs use a number of the string +functions and make effective (but different) use of memory where possible. +The key points to understand are: + + @{b }*@{ub } The difference between normal strings and E-strings. + + @{b }*@{ub } The two methods of reading data from a file (line-by-line or all at + once). + + @{b }*@{ub } The necessary allocation of memory for E-strings. + + @{b }*@{ub } The unnecessary, but advisable, deallocation of the E-string memory + once it is no longer needed. The deallocation could be left to the + automatic deallocation at the end of the program, but that would + waste an increasing amount of memory whilst the program was running. + If the input data was large then memory could easily be exhausted. + + @{b }*@{ub } The way in which sections of an E-string (or a normal string, for + that matter) can easily be turned into normal strings. + + @{b }*@{ub } The way exception handlers can tidy up programs. + + The problem to solve is reading of a CSV (comma separated variables) +file, which is a standard format file for databases and spreadsheets. The +format is very simple: each record is a line (i.e., terminated with a +line-feed) and each field in a record is separated by a comma. To make +this example a lot simpler, we will forbid a field to contain a comma +(normally this would require the field to be quoted). So, a typical input +file would look like this: + + Field1,Field2,Field3 + 10,19,-3 + fred,barney,wilma + ,,last + first,, + +In this example all records have three fields, as is well illustrated by +the first line (i.e., the first record). The last two records may seem a +bit strange, but they just show how fields can be blank. In the last +record all but the first field are blank, and in the previous record all +but the last are blank. + + So now we know the format of the file to be read. To operate on a file +we must first open it using the @{b }Open@{ub } function (from the @{b }dos.library@{ub }), and +to read the lines from the file we will use the @{b }ReadStr@{ub } (built-in) +function. There will be four versions of a program to read a CSV file: +two of which read data line-by-line and two which read all the file at +once. Of the two which read line-by-line, one manipulates the read lines +as E-strings and the other uses normal strings. The use of normal strings +is arguably more advanced than the use of E-strings, since cunning tricks +are employed to make effective use of memory. However, the programs are +not meant to show that E-strings are better than normal strings (or vice +versa), rather they are meant to show how to use strings properly. + + /* A suitably large size for the record buffer */ + CONST BUFFERSIZE=512 + + PROC main() + DEF filehandle, status, buffer[BUFFERSIZE]:STRING, filename + filename:='datafile' + IF filehandle:=Open(filename, OLDFILE) + REPEAT + status:=ReadStr(filehandle, buffer) + /* This is the way to check ReadStr() actually read something */ + IF buffer[] OR (status<>-1) THEN process_record(buffer) + UNTIL status=-1 + /* If Open() succeeded then we must Close() the file */ + Close(filehandle) + ELSE + WriteF('Error: Failed to open "\\s"\\n', filename) + ENDIF + ENDPROC + + PROC process_record(line) + DEF i=1, start=0, end, len, s + /* Show the whole line being processed */ + WriteF('Processing record: "\\s"\\n', line) + REPEAT + /* Find the index of a comma after the start index */ + end:=InStr(line, ',', start) + /* Length is end index minus start index */ + len:=(IF end<>-1 THEN end ELSE EstrLen(line))-start + IF len>0 + /* Allocate an E-string of the correct length */ + IF s:=String(len) + /* Copy the portion of the line to the E-string s */ + MidStr(s, line, start, len) + /* At this point we could do something useful... */ + WriteF('\\t\\d) "\\s"\\n', i, s) + /* We've finished with the E-string so deallocate it */ + DisposeLink(s) + ELSE + /* It's a non-fatal error if the String() call fails */ + WriteF('\\t\\d) Memory exhausted! (len=\\d)\\n', len) + ENDIF + ELSE + WriteF('\\t\\d) Empty Field\\n', i) + ENDIF + /* The new start is after the end we found */ + start:=end+1 + INC i + /* Once a comma is not found we've finished */ + UNTIL end=-1 + ENDPROC + + There are a couple of points worth noting about this program: + + @{b }*@{ub } A large E-string, @{b }buffer@{ub }, is used to hold each line before it is + processed. If a record exceeds the size of this E-string then + @{b }ReadStr@{ub } will only read a partial record, and the next @{b }ReadStr@{ub } + will read some more this record. However, the program considers each + call to @{b }ReadStr@{ub } to read a whole record, so it will get the records + slightly wrong in this case. This is a limitation of the program and + it should be documented so that users know to constrain themselves to + datafiles without long lines. + + @{b }*@{ub } The file name is `hard-wired' to be @{b }datafile@{ub }. A more flexible + program would allow this to be passed as an argument (see + @{"Argument Parsing" Link "Argument Parsing" }). + + @{b }*@{ub } @{b }ReadStr@{ub } may return -1 to indicate an error (usually when the end + of the file has been reached), but the E-string read so far may still + be valid. The check on the E-string and error value is the proper + way of deciding whether @{b }ReadStr@{ub } actually read anything from the file. + + @{b }*@{ub } Look carefully at the manipulation of the string indexes @{b }start@{ub } and + @{b }end@{ub }, and the calculation of the length of a portion of a string. + + @{b }*@{ub } @{b }MidStr@{ub } is used to copy a field from a record, so an E-string must + be used to hold the field. + + @{b }*@{ub } The E-string @{b }s@{ub } is only valid between the successful allocation by + @{b }string@{ub } and the @{b }DisposeLink@{ub }. It would be incorrect to try to, for + instance, print it at any other point. On the other hand, a more + complicated program may want to store up all the data, and so it may + be inappropriate to deallocate the E-string at this point. In this + case, the pointer to the E-string could be stored and it might be + valid for the rest of the program. + + @{b }*@{ub } The allocation using @{b }String@{ub } is very closely followed by deallocation + using @{b }DisposeLink@{ub }. This suggests that a single E-string could be + allocated and used repeatedly (like @{b }buffer@{ub } is), due to the simple + nature of this example. + + To change this to use normal strings (in a very memory efficient way), +we need to alter only the @{b }process_record@{ub } procedure. Some note-worthy +differences are: + + @{b }*@{ub } Small parts of the E-string @{b }buffer@{ub } are turned into normal strings by + terminating them with @{b }NIL@{ub } when necessary. This involves changing a + comma that is found. + + @{b }*@{ub } No new memory is allocated, rather the @{b }buffer@{ub } memory is reused (as + described above). This is fine for this example, although if the + fields were needed after a record had been processed they would need + to be copied, since the contents of @{b }buffer@{ub } are changed by @{b }ReadStr@{ub }. + + PROC process_record(line) + DEF i=1, start=0, end, s + /* Show the whole line being processed */ + WriteF('Processing record: "\\s"\\n', line) + REPEAT + /* Find the index of a comma after the start index */ + end:=InStr(line, ',', start) + /* If a comma was found then terminate with a NIL */ + IF end<>-1 THEN line[end]:=NIL + /* Point to the start of the field */ + s:=line+start + IF s[] + /* At this point we could do something useful... */ + WriteF('\\t\\d) "\\s"\\n', i, s) + ELSE + WriteF('\\t\\d) Empty Field\\n', i) + ENDIF + /* The new start is after the end we found */ + start:=end+1 + INC i + /* Once a comma is not found we've finished */ + UNTIL end=-1 + ENDPROC + + The next two versions of the program are basically the same: they both +read the whole file into one large, dynamically allocated buffer and then +process the data. The second of the two versions also uses exceptions to +make the program much more readable. The differences from the above +version which uses normal strings are: + + @{b }*@{ub } The @{b }main@{ub } procedure calculates the length of the data in the file and + then uses @{b }New@{ub } to dynamically allocate some memory to hold it. + + @{b }*@{ub } The read data is terminated with a @{b }NIL@{ub } so that it can safely be + treated as a (very long) normal string. + + @{b }*@{ub } The @{b }process_buffer@{ub } procedure splits the read data up into lots of + normal strings, one for each line of data. + + PROC main() + DEF buffer, filehandle, len, filename + filename:='datafile' + /* Get the length of data in the file */ + IF 0<(len:=FileLength(filename)) + /* Allocate just enough room for the data + a terminating NIL */ + IF buffer:=New(len+1) + IF filehandle:=Open(filename, OLDFILE) + /* Read whole file, checking amount read */ + IF len=Read(filehandle, buffer, len) + /* Terminate buffer with a NIL just in case... */ + buffer[len]:=NIL + process_buffer(buffer, len) + ELSE + WriteF('Error: File reading error\\n') + ENDIF + /* If Open() succeeded then we must Close() the file */ + Close(filehandle) + ELSE + WriteF('Error: Failed to open "\\s"\\n', filename) + ENDIF + /* Deallocate buffer (not really necessary in this example) */ + Dispose(buffer) + ELSE + WriteF('Error: Insufficient memory to load file\\n') + ENDIF + ELSE + WriteF('Error: "\\s" is an empty file\\n', filename) + ENDIF + ENDPROC + + /* buffer is like a normal string since it's NIL-terminated */ + PROC process_buffer(buffer, len) + DEF start=0, end + REPEAT + /* Find the index of a linefeed after the start index */ + end:=InStr(buffer, '\\n', start) + /* If a linefeed was found then terminate with a NIL */ + IF end<>-1 THEN buffer[end]:=NIL + process_record(buffer+start) + start:=end+1 + /* We've finished if at the end or no more linefeeds */ + UNTIL (start>=len) OR (end=-1) + ENDPROC + + PROC process_record(line) + DEF i=1, start=0, end, s + /* Show the whole line being processed */ + WriteF('Processing record: "\\s"\\n', line) + REPEAT + /* Find the index of a comma after the start index */ + end:=InStr(line, ',', start) + /* If a comma was found then terminate with a NIL */ + IF end<>-1 THEN line[end]:=NIL + /* Point to the start of the field */ + s:=line+start + IF s[] + /* At this point we could do something useful... */ + WriteF('\\t\\d) "\\s"\\n', i, s) + ELSE + WriteF('\\t\\d) Empty Field\\n', i) + ENDIF + /* The new start is after the end we found */ + start:=end+1 + INC i + /* Once a comma is not found we've finished */ + UNTIL end=-1 + ENDPROC + + The program is now quite messy, with many error cases in the @{b }main@{ub } +procedure. We can very simply change this by using an exception handler +and a few automatic exceptions. + + /* Some constants for exceptions (ERR_NONE is zero: no error) */ + ENUM ERR_NONE, ERR_LEN, ERR_NEW, ERR_OPEN, ERR_READ + + /* Make some exceptions automatic */ + RAISE ERR_LEN IF FileLength()<=0, + ERR_NEW IF New()=NIL, + ERR_OPEN IF Open()=NIL + + PROC main() HANDLE + /* Note the careful initialisation of buffer and filehandle */ + DEF buffer=NIL, filehandle=NIL, len, filename + filename:='datafile' + /* Get the length of data in the file */ + len:=FileLength(filename) + /* Allocate just enough room for the data + a terminating NIL */ + buffer:=New(len+1) + filehandle:=Open(filename, OLDFILE) + /* Read whole file, checking amount read */ + IF len<>Read(filehandle, buffer, len) THEN Raise(ERR_READ) + /* Terminate buffer with a NIL just in case... */ + buffer[len]:=NIL + process_buffer(buffer, len) + EXCEPT DO + /* Both of these are safe thanks to the initialisations */ + IF buffer THEN Dispose(buffer) + IF filehandle THEN Close(filehandle) + /* Report error (if there was one) */ + SELECT exception + CASE ERR_LEN; WriteF('Error: "\\s" is an empty file\\n', filename) + CASE ERR_NEW; WriteF('Error: Insufficient memory to load file\\n') + CASE ERR_OPEN; WriteF('Error: Failed to open "\\s"\\n', filename) + CASE ERR_READ; WriteF('Error: File reading error\\n') + ENDSELECT + ENDPROC + +The code is now much clearer, and the majority of errors can be caught +automatically. Notice that the exception handler is called even if the +program succeeds (thanks to the @{b }DO@{ub } after the @{b }EXCEPT@{ub }). This is because +when the program terminates it needs to deallocate the resources it +allocated in every case (successful or otherwise), so the code is the same. +Conditional deallocation (of the buffer, for example) is made safe by an +appropriate initialisation. + + If you feel like a small exercise, try to write a similar program but +this time using the @{b }tools/file@{ub } module which comes in the standard Amiga E +distribution. Of course, you'll first need to read the accompanying +documentation, but you should find that this module makes file interaction +very simple. + + +@ENDNODE + +@NODE "Timing Expressions" "Timing Expressions" +@Next "Argument Parsing" +@Prev "String Handling and I-O" +@Toc "Contents.guide/main" + +Timing Expressions +****************** + + You may recall the outline of a timing procedure in Part Two (see +@{"Evaluation" Link "MoreExpressions.guide/Evaluation" }). This chapter gives the complete version of this example. +The information missing from the outline was how to determine the system +time and use this to calculate the time taken by calls to @{b }Eval@{ub }. So the +things to notice about this example are: + + @{b }*@{ub } Use of the Amiga system function @{b }DateStamp@{ub } (from the @{b }dos.library@{ub }). + (You really need the `Rom Kernel Reference Manuals' and the `AmigaDOS + Manual' to understand the system functions.) + + @{b }*@{ub } Use of the module @{b }dos/dos@{ub } to include the definitions of the object + @{b }datestamp@{ub } and the constant @{b }TICKS_PER_SECOND@{ub }. (There are fifty ticks + per second.) + + @{b }*@{ub } Use of the @{b }repeat@{ub } procedure to do @{b }Eval@{ub } a decent number of times for + each expression (so that some time is taken up by the calls!). + + @{b }*@{ub } The timing of the evaluation of 0, to calculate the overhead of the + procedure calls and loop. This value is stored in the variable + @{b }offset@{ub } the first time the @{b }test@{ub } procedure is called. The + expression 0 should take a negligible amount of time, so the number + of ticks timed is actually the time taken by the procedure calls and + loop calculations. Subtracting this time from the other times gives + a fair view of how long the expressions take, relative to one another. + (Thanks to Wouter for this offset idea.) + + @{b }*@{ub } Use of @{b }Forbid@{ub } and @{b }Permit@{ub } to turn off multi-tasking temporarily, + making the CPU calculate only the expressions (rather than dealing + with screen output, other programs, etc.). + + @{b }*@{ub } Use of @{b }CtrlC@{ub } and @{b }CleanUp@{ub } to allow the user to stop the program if it + gets too boring... + + @{b }*@{ub } Use of the option @{b }LARGE@{ub } (using @{b }OPT@{ub }) to produce an executable that + uses the large data and code model. This seems to help make the + timings less susceptible variations due to, for instance, + optimisations, and so better for comparison. See the `Reference + Manual' for more details. + + Also supplied are some example outputs. The first was from an A1200 +with 2MB Chip RAM and 4MB Fast RAM. The second was from an A500Plus with +2MB Chip RAM. Both used the constant @{b }LOTS_OF_TIMES@{ub } as 500,000, but you +might need to increase this number to compare, for instance, an A4000/040 +to an A4000/030. However, 500,000 gives a pretty long wait for results on +the A500. + + MODULE 'dos/dos' + + CONST TICKS_PER_MINUTE=TICKS_PER_SECOND*60, LOTS_OF_TIMES=500000 + + DEF x, y, offset + + PROC fred(n) + DEF i + i:=n+x + ENDPROC + + /* Repeat evaluation of an expression */ + PROC repeat(exp) + DEF i + FOR i:=0 TO LOTS_OF_TIMES + Eval(exp) /* Evaluate the expression */ + ENDFOR + ENDPROC + + /* Time an expression, and set-up offset if not done already */ + PROC test(exp, message) + DEF t + IF offset=0 THEN offset:=time(`0) /* Calculate offset */ + t:=time(exp) + WriteF('\\s:\\t\\d ticks\\n', message, t-offset) + ENDPROC + + /* Time the repeated calls, and calculate number of ticks */ + PROC time(x) + DEF ds1:datestamp, ds2:datestamp + Forbid() + DateStamp(ds1) + repeat(x) + DateStamp(ds2) + Permit() + IF CtrlC() THEN CleanUp(1) + ENDPROC ((ds2.minute-ds1.minute)*TICKS_PER_MINUTE)+ds2.tick-ds1.tick + + PROC main() + x:=9999 + y:=1717 + test(`x+y, 'Addition') + test(`y-x, 'Subtraction') + test(`x*y, 'Multiplication') + test(`x/y, 'Division') + test(`x OR y, 'Bitwise OR') + test(`x AND y, 'Bitwise AND') + test(`x=y, 'Equality') + test(`xIDCMP_CLOSEWINDOW + gad:=MsgIaddr() /* Our gadget clicked? */ + IF (class=IDCMP_GADGETUP) AND (gad.userdata=OURGADGET) + TextF(10,60, + IF gad.flags=0 THEN 'Gadget off ' ELSE 'Gadget on ') + ENDIF + ENDWHILE + CloseW(wptr) /* Close the window */ + ELSE + WriteF('Error -- could not open window!') + ENDIF + ENDPROC + +The gadget reports its state when you click on it, using the @{b }TextF@{ub } +function (see @{"Graphics functions" Link "BuiltIns.guide/Graphics functions" }). The only way to quit the program is +using the close gadget of the window. The @{b }gadget@{ub } object is defined in the +module @{b }intuition/intuition@{ub } and the @{b }iaddr@{ub } part of the IDCMP message is a +pointer to our gadget if the message was a gadget message. The @{b }userdata@{ub } +element of the gadget identifies the gadget that was clicked, and the +@{b }flags@{ub } element is zero if the boolean gadget is off (unselected) or +non-zero if the boolean gadget is on (selected). + + +@ENDNODE + +@NODE "Graphics" "Graphics" +@Next "Screens" +@Prev "IDCMP Messages" +@Toc "Gadgets IDCMP and Graphics" + +Graphics +======== + + The following program illustrates how to use the various graphics +functions. + + MODULE 'intuition/intuition' + + PROC main() + DEF wptr, i + wptr:=OpenW(20,50,200,100,IDCMP_CLOSEWINDOW, + WFLG_CLOSEGADGET OR WFLG_ACTIVATE, + 'Graphics demo window',NIL,1,NIL) + IF wptr /* Check to see we opened a window */ + Colour(1,3) + TextF(20,30,'Hello World') + SetTopaz(11) + TextF(20,60,'Hello World') + FOR i:=10 TO 150 STEP 8 /* Plot a few points */ + Plot(i,40,2) + ENDFOR + Line(160,40,160,70,3) + Line(160,70,170,40,2) + Box(10,75,160,85,1) + WHILE WaitIMessage(wptr)<>IDCMP_CLOSEWINDOW + ENDWHILE + CloseW(wptr) + ELSE + WriteF('Error -- could not open window!\\n') + ENDIF + ENDPROC + +First of all a small window is opened with a close gadget and activated +(so it is the selected window). Clicks on the close gadget will be +reported via IDCMP, and this is the only way to quit the program. The +graphics functions are used as follows: + + @{b }*@{ub } @{b }Colour@{ub } is used to set the foreground colour to pen one and the + background colour to pen three. This will make the text nicely + highlighted. + + @{b }*@{ub } Text is output in the standard font. + + @{b }*@{ub } The font is set to Topaz 11. + + @{b }*@{ub } More text is output (probably now in a different font). + + @{b }*@{ub } The @{b }FOR@{ub } loop plots a dotted line in pen two. + + @{b }*@{ub } A vertical line in pen three is drawn. + + @{b }*@{ub } A diagonal line in pen two is drawn. This and the previous line + together produce a vee shape. + + @{b }*@{ub } A filled box is drawn in pen one. + + +@ENDNODE + +@NODE "Screens" "Screens" +@Prev "Graphics" +@Toc "Gadgets IDCMP and Graphics" + +Screens +======= + + This next example uses parts of the previous example, but also opens a +custom screen. Basically, it draws coloured lines and boxes in a big +window opened on a 16 colour, high resolution screen. + + MODULE 'intuition/intuition', 'graphics/view' + + PROC main() + DEF sptr=NIL, wptr=NIL, i + sptr:=OpenS(640,200,4,V_HIRES,'Screen demo') + IF sptr + wptr:=OpenW(0,20,640,180,IDCMP_CLOSEWINDOW, + WFLG_CLOSEGADGET OR WFLG_ACTIVATE, + 'Graphics demo window',sptr,$F,NIL) + IF wptr + TextF(20,20,'Hello World') + FOR i:=0 TO 15 /* Draw a line and box in each colour */ + Line(20,30,620,30+(7*i),i) + Box(10+(40*i),140,30+(40*i),170,1) + Box(11+(40*i),141,29+(40*i),169,i) + ENDFOR + WHILE WaitIMessage(wptr)<>IDCMP_CLOSEWINDOW + ENDWHILE + WriteF('Program finished successfully\\n') + ELSE + WriteF('Could not open window\\n') + ENDIF + ELSE + WriteF('Could not open screen\\n') + ENDIF + IF wptr THEN CloseW(wptr) + IF sptr THEN CloseS(sptr) + ENDPROC + +As you can see, the error-checking @{b }IF@{ub } blocks can make the program hard to +read. Here's the same example written with an exception handler: + + MODULE 'intuition/intuition', 'graphics/view' + + ENUM WIN=1, SCRN + + RAISE WIN IF OpenW()=NIL, + SCRN IF OpenS()=NIL + + PROC main() HANDLE + DEF sptr=NIL, wptr=NIL, i + sptr:=OpenS(640,200,4,V_HIRES,'Screen demo') + wptr:=OpenW(0,20,640,180,IDCMP_CLOSEWINDOW, + WFLG_CLOSEGADGET OR WFLG_ACTIVATE, + 'Graphics demo window',sptr,$F,NIL) + TextF(20,20,'Hello World') + FOR i:=0 TO 15 /* Draw a line and box in each colour */ + Line(20,30,620,30+(7*i),i) + Box(10+(40*i),140,30+(40*i),170,1) + Box(11+(40*i),141,29+(40*i),169,i) + ENDFOR + WHILE WaitIMessage(wptr)<>IDCMP_CLOSEWINDOW + ENDWHILE + EXCEPT DO + IF wptr THEN CloseW(wptr) + IF sptr THEN CloseS(sptr) + SELECT exception + CASE 0 + WriteF('Program finished successfully\\n') + CASE WIN + WriteF('Could not open window\\n') + CASE SCRN + WriteF('Could not open screen\\n') + ENDSELECT + ENDPROC + +It's much easier to see what's going on here. The real part of the +program (the bit before the @{b }EXCEPT@{ub }) is no longer cluttered with error +checking, and it's easy to see what happens if an error occurs. Notice +that if the program successfully finishes it still has to close the screen +and window properly, so it's often sensible to use @{b }EXCEPT DO@{ub } to raise a +zero exception and deal with all the tidying up in the handler. + + +@ENDNODE + +@NODE "Recursion Example" "Recursion Example" +@Next "Appendices.guide/main" +@Prev "Gadgets IDCMP and Graphics" +@Toc "Contents.guide/main" + +Recursion Example +***************** + + This next example uses a pair of mutually recursive procedures to draw +what is known as a dragon curve (a pretty, space-filling pattern). + + MODULE 'intuition/intuition', 'graphics/view' + + /* Screen size, use SIZEY=512 for a PAL screen */ + CONST SIZEX=640, SIZEY=400 + + /* Exception values */ + ENUM WIN=1, SCRN, STK, BRK + + /* Directions (DIRECTIONS gives number of directions) */ + ENUM NORTH, EAST, SOUTH, WEST, DIRECTIONS + + RAISE WIN IF OpenW()=NIL, + SCRN IF OpenS()=NIL + + /* Start off pointing WEST */ + DEF state=WEST, x, y, t + + /* Face left */ + PROC left() + state:=Mod(state-1+DIRECTIONS, DIRECTIONS) + ENDPROC + + /* Move right, changing the state */ + PROC right() + state:=Mod(state+1, DIRECTIONS) + ENDPROC + + /* Move in the direction we're facing */ + PROC move() + SELECT state + CASE NORTH; draw(0,t) + CASE EAST; draw(t,0) + CASE SOUTH; draw(0,-t) + CASE WEST; draw(-t,0) + ENDSELECT + ENDPROC + + /* Draw and move to specified relative position */ + PROC draw(dx, dy) + /* Check the line will be drawn within the window bounds */ + IF (x>=Abs(dx)) AND (x<=SIZEX-Abs(dx)) AND + (y>=Abs(dy)) AND (y<=SIZEY-10-Abs(dy)) + Line(x, y, x+dx, y+dy, 2) + ENDIF + x:=x+dx + y:=y+dy + ENDPROC + + PROC main() HANDLE + DEF sptr=NIL, wptr=NIL, i, m + /* Read arguments: [m [t [x [y]]]] */ + /* so you can say: dragon 16 */ + /* or: dragon 16 1 */ + /* or: dragon 16 1 450 */ + /* or: dragon 16 1 450 100 */ + /* m is depth of dragon, t is length of lines */ + /* (x,y) is the start position */ + m:=Val(arg, {i}) + t:=Val(arg:=arg+i, {i}) + x:=Val(arg:=arg+i, {i}) + y:=Val(arg:=arg+i, {i}) + /* If m or t is zero use a more sensible default */ + IF m=0 THEN m:=5 + IF t=0 THEN t:=5 + sptr:=OpenS(SIZEX,SIZEY,4,V_HIRES OR V_LACE,'Dragon Curve Screen') + wptr:=OpenW(0,10,SIZEX,SIZEY-10, + IDCMP_CLOSEWINDOW,WFLG_CLOSEGADGET, + 'Dragon Curve Window',sptr,$F,NIL) + /* Draw the dragon curve */ + dragon(m) + WHILE WaitIMessage(wptr)<>IDCMP_CLOSEWINDOW + ENDWHILE + EXCEPT DO + IF wptr THEN CloseW(wptr) + IF sptr THEN CloseS(sptr) + SELECT exception + CASE 0 + WriteF('Program finished successfully\\n') + CASE WIN + WriteF('Could not open window\\n') + CASE SCRN + WriteF('Could not open screen\\n') + CASE STK + WriteF('Ran out of stack in recursion\\n') + CASE BRK + WriteF('User aborted\\n') + ENDSELECT + ENDPROC + + /* Draw the dragon curve (with left) */ + PROC dragon(m) + /* Check stack and ctrl-C before recursing */ + IF FreeStack()<1000 THEN Raise(STK) + IF CtrlC() THEN Raise(BRK) + IF m>0 + dragon(m-1) + left() + nogard(m-1) + ELSE + move() + ENDIF + ENDPROC + + /* Draw the dragon curve (with right) */ + PROC nogard(m) + IF m>0 + dragon(m-1) + right() + nogard(m-1) + ELSE + move() + ENDIF + ENDPROC + + If you write this to the file @{b }dragon.e@{ub } and compile it to the executable +@{b }dragon@{ub } then some good things to try are: + + dragon 5 9 300 100 + dragon 10 4 250 250 + dragon 11 3 250 250 + dragon 15 1 300 100 + dragon 16 1 400 150 + + If you want to understand how the program works you need to study the +recursive parts. Here's an overview of the program, outlining the +important aspects: + + @{b }*@{ub } The constants @{b }SIZEX@{ub } and @{b }SIZEY@{ub } are the width and height (respectively) + of the custom screen (and window). As the comment suggests, change + @{b }SIZEY@{ub } to 512 if you want a bigger screen and you have a PAL Amiga. + + @{b }*@{ub } The @{b }state@{ub } variable holds the current direction (north, south, east or + west). + + @{b }*@{ub } The @{b }left@{ub } and @{b }right@{ub } procedures turn the current direction to the left + and right (respectively) by using some modulo arithmetic trickery. + + @{b }*@{ub } The @{b }move@{ub } procedure uses the @{b }draw@{ub } procedure to draw a line (of length + @{b }t@{ub }) in the current direction from the current point (stored in @{b }x@{ub } + and @{b }y@{ub }). + + @{b }*@{ub } The @{b }draw@{ub } procedure draws a line relative to the current point, but + only if it fits within the boundaries of the window. The current + point is moved to the end of the line (even if it isn't drawn). + + @{b }*@{ub } The @{b }main@{ub } procedure reads the command line arguments into the + variables @{b }m@{ub }, @{b }t@{ub }, @{b }x@{ub } and @{b }y@{ub }. The depth/size of the dragon is given by @{b }m@{ub } + (the first argument) and the length of each line making up the dragon + is given by @{b }t@{ub } (the second argument). The starting point is given by + @{b }x@{ub } and @{b }y@{ub } (the final two arguments). The defaults are five for @{b }m@{ub } + and @{b }t@{ub }, and zero for @{b }x@{ub } and @{b }y@{ub }. + + @{b }*@{ub } The @{b }main@{ub } procedure also opens the screen and window, and sets the + dragon drawing. + + @{b }*@{ub } The @{b }dragon@{ub } and @{b }nogard@{ub } procedures are very similar, and these are + responsible for creating the dragon curve by calling the @{b }left@{ub }, @{b }right@{ub } + and @{b }move@{ub } procedures. + + @{b }*@{ub } The @{b }dragon@{ub } procedure contains a couple of checks to see if the user + has pressed Control-C or if the program has run out of stack space, + raising an appropriate exception if necessary. These exceptions are + handled by the @{b }main@{ub } procedure. + +Notice the use of @{b }Val@{ub } and the exception handling. Also, the important +base case of the recursion is when @{b }m@{ub } reaches zero (or becomes negative, +but that shouldn't happen). If you start off a big dragon and want to +stop it you can press Control-C and the program tidies up nicely. If it +has finished drawing you simply click the close gadget on the window. + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Exceptions.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Exceptions.guide new file mode 100644 index 0000000..3c16f6c --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Exceptions.guide @@ -0,0 +1,405 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Exception Handling" +@Next "Memory.guide/main" +@Prev "Modules.guide/main" +@Toc "Contents.guide/main" + +Exception Handling +****************** + + Often your program has to check the results of functions and do +different things if errors have occurred. For instance, if you try to +open a window (using @{b }OpenW@{ub }), you may get a @{b }NIL@{ub } pointer returned which +shows that the window could not be opened for some reason. In this case +you normally can't continue with the program, so you must tidy up and +terminate. Tidying up can sometimes involve closing windows, screens and +libraries, so sometimes your error cases can make your program cluttered +and messy. This is where exceptions come in--an @{fg shine }exception@{fg text } is simply an +error case, and @{fg shine }exception handling@{fg text } is dealing with error cases. The +exception handling in E neatly separates error specific code from the real +code of your program. + + + @{" Procedures with Exception Handlers " Link "Procedures with Exception Handlers" } + @{" Raising an Exception " Link "Raising an Exception" } + @{" Automatic Exceptions " Link "Automatic Exceptions" } + @{" Raise within an Exception Handler " Link "Raise within an Exception Handler" } + + +@ENDNODE + +@NODE "Procedures with Exception Handlers" "Procedures with Exception Handlers" +@Next "Raising an Exception" +@Toc "main" + +Procedures with Exception Handlers +================================== + + A procedure with an exception handler looks like this: + + PROC fred(params...) HANDLE + /* Main, real code */ + EXCEPT + /* Error handling code */ + ENDPROC + +This is very similar to a normal procedure, apart from the @{b }HANDLE@{ub } and +@{b }EXCEPT@{ub } keywords. The @{b }HANDLE@{ub } keyword means the procedure is going to have +an exception handler, and the @{b }EXCEPT@{ub } keyword marks the end of the normal +code and the start of the exception handling code. The procedure works +just as normal, executing the code in the part before the @{b }EXCEPT@{ub }, but when +an error happens you can pass control to the exception handler (i.e., the +code after the @{b }EXCEPT@{ub } is executed). + + +@ENDNODE + +@NODE "Raising an Exception" "Raising an Exception" +@Next "Automatic Exceptions" +@Prev "Procedures with Exception Handlers" +@Toc "main" + +Raising an Exception +==================== + + When an error occurs (and you want to handle it), you @{fg shine }raise@{fg text } an +exception using either the @{b }Raise@{ub } or @{b }Throw@{ub } function. You call @{b }Raise@{ub } with a +number which identifies the kind of error that occurred. The code in the +exception handler is responsible for decoding the number and then doing +the appropriate thing. @{b }Throw@{ub } is very similar to @{b }Raise@{ub }, and the following +description of @{b }Raise@{ub } also applies to @{b }Throw@{ub }. The difference is that @{b }Throw@{ub } +takes a second argument which can be used to pass extra information to a +handler (usually a string). The terms `raising' and `throwing' an +exception can be used interchangeably. + + When @{b }Raise@{ub } is called it immediately stops the execution of the current +procedure code and passes control to the exception handler of most recent +procedure which has a handler (which may be the current procedure). This +is a bit complicated, but you can stick to raising exceptions and handling +them in the same procedure, as in the next example: + + CONST BIG_AMOUNT = 100000 + + ENUM ERR_MEM=1 + + PROC main() HANDLE + DEF block + block:=New(BIG_AMOUNT) + IF block=NIL THEN Raise(ERR_MEM) + WriteF('Got enough memory\\n') + EXCEPT + IF exception=ERR_MEM + WriteF('Not enough memory\\n') + ELSE + WriteF('Unknown exception\\n') + ENDIF + ENDPROC + +This uses an exception handler to print a message saying there wasn't +enough memory if the call to @{b }New@{ub } returns @{b }NIL@{ub }. The parameter to @{b }Raise@{ub } is +stored in the special variable @{b }exception@{ub } in the exception handler part of +the code, so if @{b }Raise@{ub } is called with a number other than @{b }ERR_MEM@{ub } a message +saying "Unknown exception" will be printed. + + Try running this program with a really large @{b }BIG_AMOUNT@{ub } constant, so +that the @{b }New@{ub } can't allocate the memory. Notice that the "Got enough +memory" is not printed if @{b }Raise@{ub } is called. That's because the execution +of the normal procedure code stops when @{b }Raise@{ub } is called, and control +passes to the appropriate exception handler. When the end of the +exception handler is reached the procedure is finished, and in this case +the program terminates because the procedure was the @{b }main@{ub } procedure. + + If @{b }Throw@{ub } is used instead of @{b }Raise@{ub } then, in the handler, the special +variable @{b }exceptioninfo@{ub } will contain the value of the second parameter. +This can be used in conjunction with @{b }exception@{ub } to provide the handler with +more information about the error. Here's the above example re-written to +use @{b }Throw@{ub }: + + CONST BIG_AMOUNT = 100000 + + ENUM ERR_MEM=1 + + PROC main() HANDLE + DEF block + block:=New(BIG_AMOUNT) + IF block=NIL THEN Throw(ERR_MEM, 'Not enough memory\\n') + WriteF('Got enough memory\\n') + EXCEPT + IF exception=ERR_MEM + WriteF(exceptioninfo) + ELSE + WriteF('Unknown exception\\n') + ENDIF + ENDPROC + + An enumeration (using @{b }ENUM@{ub }) is a good way of getting different +constants for various exceptions. It's always a good idea to use +constants for the parameter to @{b }Raise@{ub } and in the exception handler, because +it makes everything a lot more readable: @{b }Raise(ERR_MEM)@{ub } is much clearer +than @{b }Raise(1)@{ub }. The enumeration starts at one because zero is a special +exception: it usually means that no error occurred. This is useful when +the handler does the same cleaning up that would normally be done when the +program terminates successfully. For this reason there is a special form +of @{b }EXCEPT@{ub } which automatically raises a zero exception when the code in the +procedure successfully terminates. This is @{b }EXCEPT DO@{ub }, with the @{b }DO@{ub } +suggesting to the reader that the exception handler is called even if no +error occurs. Also, the argument to the @{b }Raise@{ub } function defaults to zero +if it is omitted (see @{"Default Arguments" Link "Procedures.guide/Default Arguments" }). + + So, what happens if you call @{b }Raise@{ub } in a procedure without an exception +handler? Well, this is where the real power of the handling mechanism +comes to light. In this case, control passes to the exception handler of +the most @{fg shine }recent@{fg text } procedure with a handler. If none are found then the +program terminates. `Recent' means one of the procedures involved in +calling your procedure. So, if the procedure @{b }fred@{ub } calls @{b }barney@{ub }, then when +@{b }barney@{ub } is being executed @{b }fred@{ub } is a recent procedure. Because the @{b }main@{ub } +procedure is where the program starts it is a recent procedure for every +other procedure in the program. This means, in practice: + + @{b }*@{ub } If you define @{b }fred@{ub } to be a procedure with an exception handler then + any procedures called by @{b }fred@{ub } will have their exceptions handled by + the handler in @{b }fred@{ub } if they don't have their own handler. + + @{b }*@{ub } If you define @{b }main@{ub } to be a procedure with an exception handler then + any exceptions that are raised will always be dealt with by some + exception handling code (i.e., the handler of @{b }main@{ub } or some other + procedure). + + Here's a more complicated example: + + ENUM FRED=1, BARNEY + + PROC main() + WriteF('Hello from main\\n') + fred() + barney() + WriteF('Goodbye from main\\n') + ENDPROC + + PROC fred() HANDLE + WriteF(' Hello from fred\\n') + Raise(FRED) + WriteF(' Goodbye from fred\\n') + EXCEPT + WriteF(' Handler fred: \\d\\n', exception) + ENDPROC + + PROC barney() + WriteF(' Hello from barney\\n') + Raise(BARNEY) + WriteF(' Goodbye from barney\\n') + ENDPROC + +When you run this program you get the following output: + + Hello from main + Hello from fred + Handler fred: 1 + Hello from barney + +This is because the @{b }fred@{ub } procedure is terminated by the @{b }Raise(FRED)@{ub } call, +and the whole program is terminated by the @{b }Raise(BARNEY)@{ub } call (since +@{b }barney@{ub } and @{b }main@{ub } do not have handlers). + + Now try this: + + ENUM FRED=1, BARNEY + + PROC main() + WriteF('Hello from main\\n') + fred() + WriteF('Goodbye from main\\n') + ENDPROC + + PROC fred() HANDLE + WriteF(' Hello from fred\\n') + barney() + Raise(FRED) + WriteF(' Goodbye from fred\\n') + EXCEPT + WriteF(' Handler fred: \\d\\n', exception) + ENDPROC + + PROC barney() + WriteF(' Hello from barney\\n') + Raise(BARNEY) + WriteF(' Goodbye from barney\\n') + ENDPROC + +When you run this you get the following output: + + Hello from main + Hello from fred + Hello from barney + Handler fred: 2 + Goodbye from main + +Now the @{b }fred@{ub } procedure calls @{b }barney@{ub }, so @{b }main@{ub } and @{b }fred@{ub } are recent +procedures when @{b }Raise(BARNEY)@{ub } is executed, and therefore the @{b }fred@{ub } +exception handler is called. When this handler finishes the call to @{b }fred@{ub } +in @{b }main@{ub } is finished, so the @{b }main@{ub } procedure is completed and we see the +`Goodbye' message. In the previous program the @{b }Raise(BARNEY)@{ub } call did not +get handled and the whole program terminated at that point. + + +@ENDNODE + +@NODE "Automatic Exceptions" "Automatic Exceptions" +@Next "Raise within an Exception Handler" +@Prev "Raising an Exception" +@Toc "main" + +Automatic Exceptions +==================== + + In the previous section we saw an example of raising an exception when +a call to @{b }New@{ub } returned @{b }NIL@{ub }. We can re-write this example to use +@{fg shine }automatic@{fg text } exception raising: + + CONST BIG_AMOUNT = 100000 + + ENUM ERR_MEM=1 + + RAISE ERR_MEM IF New()=NIL + + PROC main() HANDLE + DEF block + block:=New(BIG_AMOUNT) + WriteF('Got enough memory\\n') + EXCEPT + IF exception=ERR_MEM + WriteF('Not enough memory\\n') + ELSE + WriteF('Unknown exception\\n') + ENDIF + ENDPROC + +The only difference is the removal of the @{b }IF@{ub } which checked the value of +@{b }block@{ub }, and the addition of a @{b }RAISE@{ub } part. This @{b }RAISE@{ub } part means that +whenever the @{b }New@{ub } function is called in the program, the exception @{b }ERR_MEM@{ub } +will be raised if it returns @{b }NIL@{ub } (i.e., the exception @{b }ERR_MEM@{ub } is +automatically raised). This unclutters the program by removing a lot of +error checking @{b }IF@{ub } statements. + + The precise form of the @{b }RAISE@{ub } part is: + + RAISE @{fg shine }exception@{fg text } IF @{fg shine }function@{fg text }() @{fg shine }compare@{fg text } @{fg shine }value@{fg text } , + @{fg shine }exception2@{fg text } IF @{fg shine }function2@{fg text }() @{fg shine }compare2@{fg text } @{fg shine }value2@{fg text } , + ... + @{fg shine }exceptionN@{fg text } IF @{fg shine }functionN@{fg text }() @{fg shine }compareN@{fg text } @{fg shine }valueN@{fg text } + +The @{fg shine }exception@{fg text } is a constant (or number) which represents the exception +to be raised, @{fg shine }function@{fg text } is the E built-in or system function to be +automatically checked, @{fg shine }value@{fg text } is the return value to be checked against, +and @{fg shine }compare@{fg text } is the method of checking (i.e., @{b }=@{ub }, @{b }<>@{ub }, @{b }<@{ub }, @{b }<=@{ub }, @{b }>@{ub } or @{b }>=@{ub }). +This mechanism only exists for built-in or library functions because they +would otherwise have no way of raising exceptions. The procedures you +define yourself can, of course, use @{b }Raise@{ub } to raise exceptions in a much +more flexible way. + + +@ENDNODE + +@NODE "Raise within an Exception Handler" "Raise within an Exception Handler" +@Prev "Automatic Exceptions" +@Toc "main" + +@{b }Raise@{ub } within an Exception Handler +================================= + + If you call @{b }Raise@{ub } within an exception handler then control passes to +the next most recent handler. In this way you can write procedures which +have handlers that perform local tidying up. By using @{b }Raise@{ub } at the end of +the handler code you can invoke the next layer of tidying up. + + As an example we'll use the Amiga system functions @{b }AllocMem@{ub } and @{b }FreeMem@{ub } +which are like the built-in function @{b }New@{ub } and @{b }Dispose@{ub }, but the memory +allocated by @{b }AllocMem@{ub } @{i }must@{ui } be deallocated (using @{b }FreeMem@{ub }) when it's +finished with, before the end of the program. + + CONST SMALL=100, BIG=123456789 + + ENUM ERR_MEM=1 + + RAISE ERR_MEM IF AllocMem()=NIL + + PROC main() + allocate() + ENDPROC + + PROC allocate() HANDLE + DEF mem=NIL + mem:=AllocMem(SMALL, 0) + morealloc() + FreeMem(mem, SMALL) + EXCEPT + IF mem THEN FreeMem(mem, SMALL) + WriteF('Handler: deallocating "allocate" local memory\\n') + ENDPROC + + PROC morealloc() HANDLE + DEF more=NIL, andmore=NIL + more:=AllocMem(SMALL, 0) + andmore:=AllocMem(BIG, 0) + WriteF('Allocated all the memory!\\n') + FreeMem(andmore, BIG) + FreeMem(more, SMALL) + EXCEPT + IF andmore THEN FreeMem(andmore, BIG) + IF more THEN FreeMem(more, SMALL) + WriteF('Handler: deallocating "morealloc" local memory\\n') + Raise(ERR_MEM) + ENDPROC + +The calls to @{b }AllocMem@{ub } are automatically checked, and if @{b }NIL@{ub } is returned +the exception @{b }ERR_MEM@{ub } is raised. The handler in the @{b }allocate@{ub } procedure +checks to see if it needs to free the memory pointed to by @{b }mem@{ub }, and the +handler in the @{b }morealloc@{ub } checks @{b }andmore@{ub } and @{b }more@{ub }. At the end of the +@{b }morealloc@{ub } handler is the call @{b }Raise(ERR_MEM)@{ub }. This passes control to the +exception handler of the @{b }allocate@{ub } procedure, since @{b }allocate@{ub } called +@{b }morealloc@{ub }. + + There's a couple of subtle points to notice about this example. +Firstly, the memory variables are all initialised to @{b }NIL@{ub }. This is because +the automatic exception raising on @{b }AllocMem@{ub } will result in the variables +not being assigned if the call returns @{b }NIL@{ub } (i.e., the exception is raised +before the assignment takes place), and the handler needs them to be @{b }NIL@{ub } +if @{b }AllocMem@{ub } fails. Of course, if @{b }AllocMem@{ub } does not return @{b }NIL@{ub } the +assignments work as normal. + + Secondly, the @{b }IF@{ub } statements in the handlers check the memory pointer +variables do not contain @{b }NIL@{ub } by using their values as truth values. Since +@{b }NIL@{ub } is actually zero, a non-@{b }NIL@{ub } pointer will be non-zero, i.e., true in +the @{b }IF@{ub } check. This shorthand is often used, and so you should be aware of +it. + + It is quite common that an exception handler will want to raise the +same exception after it has done its processing. The function @{b }ReThrow@{ub } +(which has no arguments) can be used for this purpose. It will re-raise +the exception, but only if the exception is not zero (since this special +value means that no error occurred). If the exception is zero then this +function has no effect. In fact, the following code fragments (within a +handler) are equivalent: + + ReThrow() + + IF exception THEN Throw(exception, exceptioninfo) + + There are two examples, in Part Three, of how to use an exception +handler to make a program more readable: one deals with using data files +(see @{"String Handling and I-O" Link "Examples.guide/String Handling and I-O" }) and the other deals with opening screens and +windows (see @{"Screens" Link "Examples.guide/Screens" }). + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/FloatingPoint.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/FloatingPoint.guide new file mode 100644 index 0000000..c9396ea --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/FloatingPoint.guide @@ -0,0 +1,358 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Floating-Point Numbers" +@Next "Recursion.guide/main" +@Prev "Memory.guide/main" +@Toc "Contents.guide/main" + +Floating-Point Numbers +********************** + + @{fg shine }Floating-point@{fg text } or @{fg shine }real@{fg text } numbers can be used to represent both very +small fractions and very large numbers. However, unlike a @{b }LONG@{ub } which can +hold every integer in a certain range (see @{"Variable types" Link "Introduction.guide/Variable types" }), floating-point +numbers have limited @{fg shine }accuracy@{fg text }. Be warned, though: using floating-point +arithmetic in E is quite complicated and most problems can be solved +without using floating-point numbers, so you may wish to skip this chapter +until you really need to use them. + + + @{" Floating-Point Values " Link "Floating-Point Values" } + @{" Floating-Point Calculations " Link "Floating-Point Calculations" } + @{" Floating-Point Functions " Link "Floating-Point Functions" } + @{" Accuracy and Range " Link "Accuracy and Range" } + + +@ENDNODE + +@NODE "Floating-Point Values" "Floating-Point Values" +@Next "Floating-Point Calculations" +@Toc "main" + +Floating-Point Values +===================== + + Floating-point values in E are written just like you might expect and +are stored in @{b }LONG@{ub } variables: + + DEF x + x:=3.75 + x:=-0.0000367 + x:=275.0 + +You must remember to use a decimal point (without any spaces around it) in +the number if you want it to be considered a floating-point number, and +this is why a trailing @{b }.0@{ub } was used on the number in the last assignment. +At present you can't express every floating-point value in this way; the +compiler may complain that the value does not fit in 32-bits if you try to +use more than about nine digits in a single number. You can, however, use +the various floating-point maths functions to calculate any value you want +(see @{"Floating-Point Functions" Link "Floating-Point Functions" }). + + +@ENDNODE + +@NODE "Floating-Point Calculations" "Floating-Point Calculations" +@Next "Floating-Point Functions" +@Prev "Floating-Point Values" +@Toc "main" + +Floating-Point Calculations +=========================== + + Since a floating-point number is stored in a @{b }LONG@{ub } variable it would +normally be interpreted as an integer, and this interpretation will +generally not give a number anything like the intended floating-point +number. To use floating-point numbers in expressions you must use the +(rather complicated) floating-point conversion operator, which is the @{b }!@{ub } +character. This converts expressions and the normal maths and comparison +operators to and from floating-point. + + All expressions are, by default, integer expressions. That is, they +represent @{b }LONG@{ub } integer values, rather than floating-point values. The +first time a @{b }!@{ub } occurs in an expression the value of the expression so far +is converted to floating-point and all the operators and variables after +this point are considered floating-point. The next time it occurs the +(floating-point) value of the expression so far is converted to an +integer, and the following operators and variables are considered integer +again. You can use @{b }!@{ub } as often as necessary within an expression. Parts +of an expression in parentheses are treated as separate expressions, so +are, by default, integer expressions (this, includes function call +arguments). + + The integer/floating-point conversions performed by @{b }!@{ub } are not simple. +They involve rounding and also bounding. Conversion, for example, from +integer to floating-point and back again will generally not result in the +original integer value. + + Here's a few commented examples, where @{b }f@{ub } always holds a floating-point +number, and @{b }i@{ub } and @{b }j@{ub } always hold integers: + + DEF f, i, j + i:=1 + f:=1.0 + f:=i! -> i converted to floating-point (1.0) + f:=6.2 + i:=!f! -> the expression f is floating-point, + -> then converted to integer (6) + +In the first assignment, the integer value one is assigned to @{b }i@{ub }. In the +second, the floating-point value 1.0 is assigned to @{b }f@{ub }. The expression on +the right-hand side of third assignment is considered to be an integer +until the @{b }!@{ub } is met, at which point it is converted to the nearest +floating-point value. So, @{b }f@{ub } is assigned the floating-point value of one +(i.e., 1.0), just like it is by the second assignment. The expression in +the final assignment needs to start off as floating-point in order to +interpret the value stored in @{b }f@{ub } as floating-point. The expression +finishes by converting back to integer. The overall result is to turn the +floating-point value of @{b }f@{ub } into the nearest integer (in this case, six). + + The assignments below are more complicated, but should be +straight-forward to follow. Again, @{b }f@{ub } always holds a floating-point +number, and @{b }i@{ub } and @{b }j@{ub } always hold integers. + + f:=!f*f -> the whole expression is floating-point, + -> and f is squared (6.2*6.2) + f:=!f*(i!) -> the whole expression is floating-point, + -> i is converted to floating-point and + -> multiplied by f + j:=!f/(i!)! -> the whole division is floating-point, + -> with the result converted to integer + j:=!f!/i -> floating-point f is converted to integer + -> and is (integer) divided by i + IF !f<230.0 THEN RETURN 0 -> floating-point comparison < + IF !f>(i!) THEN RETURN 0 -> i converted to floating-point, + -> then compared to f + +If the @{b }!@{ub } were omitted from the first assignment, then not only would the +value in @{b }f@{ub } be interpreted (incorrectly) as integer, but the multiplication +performed would be integer multiplication, rather than floating-point. In +the second assignment, the parentheses around the expression involving @{b }i@{ub } +are crucial. Without the parentheses the value stored in @{b }i@{ub } would be +interpreted as floating-point. This would be wrong because @{b }i@{ub } actually +stores an integer value, so parentheses are used to start a new expression +(which defaults to being integer). The value of @{b }i@{ub } is then interpreted +correctly, and finally converted to floating-point (by the @{b }!@{ub } just before +the closing parenthesis). The (floating-point) multiplication then takes +place with two floating-point values, and the result is stored in @{b }f@{ub }. In +the last two assignments (using division), @{b }j@{ub } is assigned roughly the same +value. However, the expression in the first assignment allows for greater +accuracy, since it uses floating-point division. This means the result +will be rounded, whereas it is truncated when integer division is used. + + One important thing to know about floating-point numbers in E is that +the following assignments store the same value in @{b }g@{ub } (again, @{b }f@{ub } stores a +floating-point number). This is because no computation is performed and +no conversion happens: the value in @{b }f@{ub } is simply copied to @{b }g@{ub }. This is +especially important for function calls, as we shall see in the next +section. Strictly speaking, however, the second version is better, since +it shows (to the reader of the code) that the value in @{b }f@{ub } is meant to be +floating-point. + + g:=f + g:=!f + + +@ENDNODE + +@NODE "Floating-Point Functions" "Floating-Point Functions" +@Next "Accuracy and Range" +@Prev "Floating-Point Calculations" +@Toc "main" + +Floating-Point Functions +======================== + + There are functions for formatting floating-point numbers to E-strings +(so that they can be printed) and for decoding floating-point numbers from +strings. There are also a number of built-in, floating-point functions +which compute some of the less common mathematical functions, such as the +various trigonometric functions. + +@{b }RealVal(@{ub }@{fg shine }string@{fg text }@{b })@{ub } + This works in a similar way to @{b }Val@{ub } for extracting integers from a + string. The decoded floating-point value is returned as the regular + return value, and the number of characters of @{fg shine }string@{fg text } that were read + to make the number is returned as the first optional return value. + If a floating-point value could not be decoded from the string then + zero is returned as the optional return value and the regular return + value will be zero (i.e., 0.0). + +@{b }RealF(@{ub }@{fg shine }e-string@{fg text }@{b },@{ub }@{fg shine }float@{fg text }@{b },@{ub }@{fg shine }digits@{fg text }@{b })@{ub } + Converts the floating-point value @{b }float@{ub } into a string which is stored + in @{fg shine }e-string@{fg text }. The number of digits to use after the decimal point + is specified by @{fg shine }digits@{fg text }, which can be zero to eight. The + floating-point value is rounded to the specified number of digits. A + value of zero for @{fg shine }digits@{fg text } gives a result with no fractional part and + no decimal point. The @{fg shine }e-string@{fg text } is returned by this function, and + this makes it easy to use with @{b }WriteF@{ub }. + + PROC main() + DEF s[20]:STRING, f, i + f:=21.60539 + FOR i:=0 TO 8 + WriteF('f is \\s (using digits=\\d)\\n', RealF(s, f, i), i) + ENDFOR + ENDPROC + + Notice that the floating-point argument, @{b }f@{ub }, to @{b }RealF@{ub } does not need a + leading @{b }!@{ub } because we are simply passing its value and not performing + a computation with it. The program should generate the following + output: + + f is 22 (using digits=0) + f is 21.6 (using digits=1) + f is 21.61 (using digits=2) + f is 21.605 (using digits=3) + f is 21.6054 (using digits=4) + f is 21.60539 (using digits=5) + f is 21.605390 (using digits=6) + f is 21.6053900 (using digits=7) + f is 21.60539000 (using digits=8) + +@{b }Fsin(@{ub }@{fg shine }float@{fg text }@{b })@{ub }, @{b }Fcos(@{ub }@{fg shine }float@{fg text }@{b })@{ub }, @{b }Ftan(@{ub }@{fg shine }float@{fg text }@{b })@{ub } + These compute the sine, cosine and tangent (respectively) of the + supplied @{fg shine }float@{fg text } angle, which is specified in radians. + +@{b }Fabs(@{ub }@{fg shine }float@{fg text }@{b })@{ub } + Returns the absolute value of @{fg shine }float@{fg text }, much like @{b }Abs@{ub } does for + integers. + +@{b }Ffloor(@{ub }@{fg shine }float@{fg text }@{b })@{ub }, @{b }Fceil(@{ub }@{fg shine }float@{fg text }@{b })@{ub } + The @{b }Ffloor@{ub } function rounds a floating-point value down to the + nearest, whole floating-point value. The @{b }Fceil@{ub } function rounds it up. + +@{b }Fsqrt(@{ub }@{fg shine }float@{fg text }@{b })@{ub } + Returns the square root of @{fg shine }float@{fg text }. + +@{b }Fpow(@{ub }@{fg shine }x@{fg text }@{b },@{ub }@{fg shine }y@{fg text }@{b })@{ub }, @{b }Fexp(@{ub }@{fg shine }float@{fg text }@{b })@{ub } + The @{b }Fpow@{ub } function returns the value of @{fg shine }x@{fg text } raised to the power of @{fg shine }y@{fg text } + (which are both floating-point values). The @{b }Fexp@{ub } function returns + the value of e raised to the power of @{fg shine }float@{fg text }, where e is the + mathematically special value (roughly 2.718282). `Raising to a + power' is known as @{fg shine }exponentiation@{fg text }. + +@{b }Flog10(@{ub }@{fg shine }float@{fg text }@{b })@{ub }, @{b }Flog(@{ub }@{fg shine }float@{fg text }@{b })@{ub } + The @{b }Flog10@{ub } function returns the log to base ten of @{fg shine }float@{fg text } (the + @{fg shine }common logarithm@{fg text }). The @{b }Flog@{ub } function returns the log to base e of + @{fg shine }float@{fg text } (the @{fg shine }natural logarithm@{fg text }). @{b }Flog10@{ub } and @{b }Fpow@{ub } are linked in the + following way (ignoring floating-point inaccuracies): + + x = Fpow(10.0, Flog10(x)) + + @{b }Flog@{ub } and @{b }Fexp@{ub } are similarly related (@{b }Fexp@{ub } could be used again, using + 2.718282 as the first argument in place of 10.0). + + x = Fexp(Flog(x)) + + Here's a small program which uses a few of the above functions, and +shows how to define functions which use and/or return floating-point +values. + + DEF f, i, s[20]:STRING + + PROC print_float() + WriteF('\\tf is \\s\\n', RealF(s, !f, 8)) + ENDPROC + + PROC print_both() + WriteF('\\ti is \\d, ', i) + print_float() + ENDPROC + + /* Square a float */ + PROC square_float(f) IS !f*f + + /* Square an integer */ + PROC square_integer(i) IS i*i + + /* Converts a float to an integer */ + PROC convert_to_integer(f) IS Val(RealF(s, !f, 0)) + + /* Converts an integer to a float */ + PROC convert_to_float(i) IS RealVal(StringF(s, '\\d', i)) + + /* This should be the same as Ftan */ + PROC my_tan(f) IS !Fsin(!f)/Fcos(!f) + + /* This should show float inaccuracies */ + PROC inaccurate(f) IS Fexp(Flog(!f)) + + PROC main() + WriteF('Next 2 lines should be the same\\n') + f:=2.7; i:=!f! + print_both() + f:=2.7; i:=convert_to_integer(!f) + print_both() + + WriteF('Next 2 lines should be the same\\n') + i:=10; f:=i! + print_both() + i:=10; f:=convert_to_float(i) + print_both() + + WriteF('f and i should be the same\\n') + i:=square_integer(i) + f:=square_float(f) + print_both() + + WriteF('Next 2 lines should be the same\\n') + f:=Ftan(.8) + print_float() + f:=my_tan(.8) + print_float() + + WriteF('Next 2 lines should be the same\\n') + f:=.35 + print_float() + f:=inaccurate(f) + print_float() + ENDPROC + +The @{b }convert_to_integer@{ub } and @{b }convert_to_float@{ub } functions perform similar +conversions to those done by @{b }!@{ub } when it occurs in an expression. To make +things more explicit, there are a lot of unnecessary uses of @{b }!@{ub }, and these +are when @{b }f@{ub } is passed directly as a parameter to a function (in these +cases, the @{b }!@{ub } could safely be omitted). All of the examples have the +potential to give different results where they ought to give the same, and +this is due to the inaccuracy of floating-point numbers. The last example +has been carefully chosen to show this. + + +@ENDNODE + +@NODE "Accuracy and Range" "Accuracy and Range" +@Prev "Floating-Point Functions" +@Toc "main" + +Accuracy and Range +================== + + A floating-point number is just another 32-bit value, so can be stored +in @{b }LONG@{ub } variables. It's just the interpretation of the 32-bits which +makes them different. A floating-point number can range from numbers as +small as 1.3E-38 to numbers as large as 3.4E+38 (that's very small and +very large if you don't understand the scientific notation!). However, +not every number in this range can @{fg shine }accurately@{fg text } be represented, since the +number of significant digits is roughly eight. + + Accuracy is an important consideration when trying to compare two +floating-point numbers and when combining floating-point values after +dividing them. It is usually best to check that a floating-point value is +in a small range of values, rather than just a particular value. And when +combining values, allow for a small amount of error due to rounding etc. +See the `Reference Manual' for more details about the implementation of +floating-point numbers. + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Format.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Format.guide new file mode 100644 index 0000000..c42cf0c --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Format.guide @@ -0,0 +1,208 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Format and Layout" +@Next "Procedures.guide/main" +@Prev "Introduction.guide/Summary" +@Toc "Contents.guide/main" + +Format and Layout +***************** + + In this chapter we'll look at the rules which govern the format and +layout of E code. In the previous Part we saw examples of E code that +were quite nicely indented and the structure of the program was easily +visible. This was just a convention and the E language does not constrain +you to write code in this way. However, there are certain rules that must +be followed. (This chapter refers to some concepts and parts of the E +language which were not covered in Part One. Don't let this put you +off--those things will be dealt with in later chapters, and it's maybe a +good idea to read this chapter again when they have been.) + + + @{" Identifiers " Link "Identifiers" } + @{" Statements " Link "Statements" } + @{" Spacing and Separators " Link "Spacing and Separators" } + @{" Comments " Link "Comments" } + + +@ENDNODE + +@NODE "Identifiers" "Identifiers" +@Next "Statements" +@Toc "main" + +Identifiers +=========== + + An @{fg shine }identifier@{fg text } is a word which the compiler must interpret rather than +treating literally. For instance, a variable is an identifier, as is a +keyword (e.g., @{b }IF@{ub }), but anything in a string is not (e.g., @{b }fred@{ub } in @{b }'fred +and wilma'@{ub } is not an identifier). Identifiers can be made up of upper- or +lower-case letters, numbers and underscores (the @{b }_@{ub } character). There are +only two constraints: + + 1. The first character cannot be a number (this would cause confusion + with numeric constants). + + 2. The case of the first few characters of identifiers is significant. + +For keywords (e.g., @{b }ENDPROC@{ub }), constants (e.g., @{b }TRUE@{ub }) and assembly +mnemonics (e.g., @{b }MOVE.L@{ub }) the first two characters must both be uppercase. +For E built-in or Amiga system procedures/functions the first character +must be uppercase and the second must be lowercase. For all other +identifiers (i.e., local, global and procedure parameter variables, object +names and element names, procedure names and code labels) the first +character must be lowercase. + + Apart from these constraints you are free to write identifiers how you +like, although it's arguably more tasteful to use all lowercase for +variables and all uppercase for keywords and constants. + + +@ENDNODE + +@NODE "Statements" "Statements" +@Next "Spacing and Separators" +@Prev "Identifiers" +@Toc "main" + +Statements +========== + + A @{fg shine }statement@{fg text } is normally a single instruction to the computer, and +each statement normally occupies a single line. If you think of a +procedure as a paragraph then a statement is a sentence. Using the same +analogy, variables, expressions and keywords are the words which make up +the sentence. + + So far in our examples we have met only two kinds of statement: the +single line statement and the multi-line statement. The assignments we +have seen were single line statements, and the vertical form of the @{b }IF@{ub } +block is a multi-line statement. The horizontal form of the @{b }IF@{ub } block was +actually the single line statement form of the @{b }IF@{ub } block. Notice that +statements can be built up from other statements, as is the case for @{b }IF@{ub } +blocks. The code parts between the @{b }IF@{ub }, @{b }ELSEIF@{ub }, @{b }ELSE@{ub } and @{b }ENDIF@{ub } lines are +sequences of statements. + + Single line statements can often be very short, and you may be able to +fit several of them onto an single line without the line getting too long. +To do this in E you use a semi-colon (the @{b };@{ub } character) to separate each +statement on the line. For example, the following code fragments are +equivalent: + + fred(y,z) + y:=x + x:=z+1 + + fred(y,z); y:=x; x:=z+1 + + On the other hand you may want to split a long statement over several +lines. This is a bit more tricky because the compiler needs to see that +you haven't finished the statement when it gets to the end of a line. +Therefore you can only break a statement at certain places. The most +common place is after a comma that is part of the statement (like in a +procedure call with more than one parameter), but you can also split a +line after binary operators and anywhere between opening and closing +brackets. The following examples are rather silly but show some allowable +line breaking places. + + fred(a, b, c, + d, e, f) /* After a comma */ + + x:=x+ + y+ + z /* After a binary operator */ + + x:=(1+2 + +3) /* Between open...close brackets */ + + list:= [ 1,2, + [3,4] + ] /* Between open...close brackets */ + +The simple rule is this: if a complete line can be interpreted as a +statement then it will be, otherwise it will be interpreted as part of a +statement which continues on the following lines. + + Strings may also get a bit long. You can split them over several lines +by breaking them into several separate strings and using @{b }+@{ub } between them. +If a line ends with a @{b }+@{ub } and the previous thing on the line was a string +then the E compiler takes the next string to be a continuation. The +following calls to @{b }WriteF@{ub } print the same thing: + + WriteF('This long string can be broken over several lines.\\n') + + WriteF('This long string ' + + 'can be broken over several lines.\\n') + + WriteF('This long' + + ' string can be ' + + 'broken over several ' + + 'lines.\\n') + + +@ENDNODE + +@NODE "Spacing and Separators" "Spacing and Separators" +@Next "Comments" +@Prev "Statements" +@Toc "main" + +Spacing and Separators +====================== + + The examples we've seen so far used a rigid indentation convention +which was intended to illuminate the structure of the program. This was +just a convention, and the E language places no constraints on the amount +of @{fg shine }whitespace@{fg text } (spaces, tabs and linefeeds) you place between statements. +However, within statements you must supply enough spacing to make the +statement readable. This generally means that you must put whitespace +between adjacent identifiers which start or end with a letter, number or +underscore (so that the compiler does not think it's one big identifier!). +So, in practice, you should put a space after a keyword if it might run +into a variable or procedure name. Most other times (like in expressions) +identifiers are separated by non-identifier characters (a comma, +parenthesis or other symbol). + + +@ENDNODE + +@NODE "Comments" "Comments" +@Prev "Spacing and Separators" +@Toc "main" + +Comments +======== + + A @{fg shine }comment@{fg text } is something that the E compiler ignores and is only there +to help the reader. Remember that one day in the future you may be the +reader, and it may be quite hard to decipher your own code without a few +decent comments! Comments are therefore pretty important. + + You can write comments anywhere you can write whitespace that isn't +part of a string. There are two kinds of comment: one uses @{b }/*@{ub } to mark the +start of the comment text and @{b }*/@{ub } to mark the end, and the other uses @{b }->@{ub } to +mark the start, with the comment text continuing to the end of the line. +You must be careful not to write @{b }/*@{ub }, @{b }*/@{ub } or @{b }->@{ub } as part of the comment text, +unless part of a nested comment. In practice a comment is best put on a +line by itself or after the end of the code on a line. + + /* This line is a comment */ + x:=1 /* This line contains an assignment then a comment */ + /* y:=2 /* This whole line is a comment with a nested comment */*/ + + x:=1 -> Assignment then a comment + -> y:=2 /* A nested comment comment */ + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Index.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Index.guide new file mode 100644 index 0000000..e1b358c --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Index.guide @@ -0,0 +1,1024 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Main Index" +@Prev "EIndex.guide/main" +@Toc "Contents.guide/main" + +Main Index +********** + + This index should be used to find detailed information about particular +concepts. There is a separate index which deals with the keywords, +variables, functions and constants which are part of Amiga E (see +@{"E Language Index" Link "EIndex.guide/main" }). + +@Index "main" + + + + @{" A4 register " Link "MoreExpressions.guide/Things to watch out for" 11 } Things to watch out for + @{" A5 register " Link "MoreExpressions.guide/Things to watch out for" 11 } Things to watch out for + @{" Absolute value " Link "BuiltIns.guide/Maths and logic functions" 30 } Maths and logic functions + @{" Absolute value (floating-point) " Link "FloatingPoint.guide/Floating-Point Functions" 55 } Floating-Point Functions + @{" Abstract class " Link "OOE.guide/Inheritance in E" 173 } Inheritance in E + @{" Abstract method " Link "OOE.guide/Inheritance in E" 275 } Inheritance in E + @{" Access array outside bounds " Link "Types.guide/Accessing array data" 25 } Accessing array data + @{" Accessing array data " Link "Types.guide/Accessing array data" 0 } Accessing array data + @{" Accuracy of floating-point numbers " Link "FloatingPoint.guide/Accuracy and Range" 0 } Accuracy and Range + @{" Addition " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Address " Link "Types.guide/Addresses" 0 } Addresses + @{" Address " Link "Types.guide/Memory addresses" 0 } Memory addresses + @{" Address, finding " Link "Types.guide/Finding addresses (making pointers)" 0 } Finding addresses (making pointers) + @{" Algebra " Link "Introduction.guide/Variables and Expressions" 0 } Variables and Expressions + @{" Alignment " Link "MoreExpressions.guide/SIZEOF expression" 17 } SIZEOF expression + @{" Allocating an object " Link "OOE.guide/Objects in E" 17 } Objects in E + @{" Allocating memory " Link "BuiltIns.guide/System support functions" 0 } System support functions + @{" Allocation, dynamic memory " Link "Memory.guide/Dynamic Allocation" 0 } Dynamic Allocation + @{" Allocation, memory " Link "Memory.guide/main" 0 } Memory Allocation + @{" Allocation, static memory " Link "Memory.guide/Static Allocation" 0 } Static Allocation + @{" Allocation, typed memory dynamically " Link "Memory.guide/NEW and END Operators" 0 } NEW and END Operators + @{" Allowable assignment left-hand sides " Link "MoreExpressions.guide/Assignments" 33 } Assignments + @{" Amiga E author " Link "Appendices.guide/Amiga E Author" 0 } Amiga E Author + @{" Amiga system module " Link "Modules.guide/Amiga System Modules" 0 } Amiga System Modules + @{" Amiga system objects " Link "Types.guide/Amiga system objects" 0 } Amiga system objects + @{" Analogy, pointers " Link "Types.guide/Addresses" 10 } Addresses + @{" And " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" AND, bit-wise " Link "MoreExpressions.guide/Bitwise AND and OR" 0 } Bitwise AND and OR + @{" AND-ing flags " Link "Constants.guide/Sets" 19 } Sets + @{" Apostrophe " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Append to a list " Link "Types.guide/List functions" 47 } List functions + @{" Append to an E-string " Link "Types.guide/String functions" 99 } String functions + @{" arg, using " Link "Examples.guide/Any AmigaDOS" 0 } Any AmigaDOS + @{" Argument " Link "Introduction.guide/Parameters" 0 } Parameters + @{" Argument parsing " Link "Examples.guide/Argument Parsing" 0 } Argument Parsing + @{" Argument, default " Link "Procedures.guide/Default Arguments" 0 } Default Arguments + @{" Array " Link "Types.guide/Tables of data" 0 } Tables of data + @{" Array and array pointer declaration " Link "Types.guide/Array pointers" 46 } Array pointers + @{" Array diagram " Link "Types.guide/Array pointers" 71 } Array pointers + @{" Array pointer, decrementing " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Array pointer, incrementing " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Array pointer, next element " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Array pointer, previous element " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Array size " Link "Types.guide/Tables of data" 0 } Tables of data + @{" Array, access outside bounds " Link "Types.guide/Accessing array data" 25 } Accessing array data + @{" Array, accessing data " Link "Types.guide/Accessing array data" 0 } Accessing array data + @{" Array, first element short-hand " Link "Types.guide/Accessing array data" 55 } Accessing array data + @{" Array, initialised " Link "Types.guide/Typed lists" 0 } Typed lists + @{" Array, pointer " Link "Types.guide/Array pointers" 0 } Array pointers + @{" Array, procedure parameter " Link "Types.guide/Array procedure parameters" 0 } Array procedure parameters + @{" ASCII character constant " Link "Constants.guide/Numeric Constants" 11 } Numeric Constants + @{" Assembly and E constants " Link "MoreExpressions.guide/Assembly and the E language" 15 } Assembly and the E language + @{" Assembly and E variables " Link "MoreExpressions.guide/Assembly and the E language" 0 } Assembly and the E language + @{" Assembly and labels " Link "MoreExpressions.guide/Assembly and the E language" 28 } Assembly and the E language + @{" Assembly and procedures " Link "MoreExpressions.guide/Assembly and the E language" 28 } Assembly and the E language + @{" Assembly and static memory " Link "MoreExpressions.guide/Static memory" 0 } Static memory + @{" Assembly statements " Link "MoreExpressions.guide/Assembly Statements" 0 } Assembly Statements + @{" Assembly, calling system functions " Link "MoreExpressions.guide/Assembly and the E language" 39 } Assembly and the E language + @{" Assembly, potential problems " Link "MoreExpressions.guide/Things to watch out for" 0 } Things to watch out for + @{" Assignment expression " Link "MoreExpressions.guide/Assignments" 0 } Assignments + @{" Assignment versus copying " Link "Types.guide/String functions" 70 } String functions + @{" Assignment, := " Link "Introduction.guide/Assignment" 0 } Assignment + @{" Assignment, allowable left-hand sides " Link "MoreExpressions.guide/Assignments" 33 } Assignments + @{" Assignment, Emodules: " Link "Modules.guide/Using Modules" 0 } Using Modules + @{" Assignment, multiple " Link "Procedures.guide/Multiple Return Values" 12 } Multiple Return Values + @{" Automatic exceptions " Link "Exceptions.guide/Automatic Exceptions" 0 } Automatic Exceptions + @{" Automatic exceptions and initialisation " Link "Exceptions.guide/Raise within an Exception Handler" 54 } Raise within an Exception Handler + @{" Automatic voiding " Link "MoreExpressions.guide/Turning an Expression into a Statement" 20 } Turning an Expression into a Statement + @{" Background pen, setting colour " Link "BuiltIns.guide/Graphics functions" 35 } Graphics functions + @{" Backslash " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Base case " Link "Recursion.guide/Factorial Example" 44 } Factorial Example + @{" Base class " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" Beginner's Guide author " Link "Appendices.guide/Guide Author" 0 } Guide Author + @{" Binary constant " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Binary tree " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Bit shift left " Link "BuiltIns.guide/Maths and logic functions" 100 } Maths and logic functions + @{" Bit shift right " Link "BuiltIns.guide/Maths and logic functions" 108 } Maths and logic functions + @{" Bit-wise AND and OR " Link "MoreExpressions.guide/Bitwise AND and OR" 0 } Bitwise AND and OR + @{" Black box " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" Block, conditional " Link "Introduction.guide/Conditional Block" 0 } Conditional Block + @{" Block, IF " Link "Introduction.guide/IF block" 0 } IF block + @{" Block, SELECT " Link "Introduction.guide/SELECT block" 0 } SELECT block + @{" Block, SELECT..OF " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" Books, further reading " Link "Appendices.guide/Further Reading" 0 } Further Reading + @{" Bounding a value " Link "BuiltIns.guide/Maths and logic functions" 55 } Maths and logic functions + @{" Box drawing " Link "BuiltIns.guide/Graphics functions" 30 } Graphics functions + @{" Box, black " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" Bracketing expressions " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Branch " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Breaking a string over several lines " Link "Format.guide/Statements" 58 } Statements + @{" Breaking statements over several lines " Link "Format.guide/Statements" 30 } Statements + @{" Bug, finding " Link "Appendices.guide/main" 0 } Common Problems + @{" Built-in constants " Link "BuiltIns.guide/Built-In Constants" 0 } Built-In Constants + @{" Built-in functions " Link "BuiltIns.guide/Built-In Functions" 0 } Built-In Functions + @{" Built-in functions, floating-point " Link "FloatingPoint.guide/Floating-Point Functions" 0 } Floating-Point Functions + @{" Built-in functions, linked list " Link "Types.guide/Linked Lists" 13 } Linked Lists + @{" Built-in functions, list and E-list " Link "Types.guide/List functions" 0 } List functions + @{" Built-in functions, string and E-string " Link "Types.guide/String functions" 0 } String functions + @{" Built-in variables " Link "BuiltIns.guide/Built-In Variables" 0 } Built-In Variables + @{" BUT expression " Link "MoreExpressions.guide/BUT expression" 0 } BUT expression + @{" Button click, left " Link "BuiltIns.guide/Intuition support functions" 273 } Intuition support functions + @{" Button click, left (wait) " Link "BuiltIns.guide/Intuition support functions" 324 } Intuition support functions + @{" Buttons state " Link "BuiltIns.guide/Intuition support functions" 235 } Intuition support functions + @{" Calculating with floating-point numbers " Link "FloatingPoint.guide/Floating-Point Calculations" 0 } Floating-Point Calculations + @{" Calling a method " Link "OOE.guide/Methods in E" 28 } Methods in E + @{" Calling a procedure " Link "Introduction.guide/Procedure Execution" 0 } Procedure Execution + @{" Calling a procedure " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Calling system functions from Assembly " Link "MoreExpressions.guide/Assembly and the E language" 39 } Assembly and the E language + @{" Carriage return " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Case of characters in identifiers " Link "Format.guide/Identifiers" 0 } Identifiers + @{" Case, base " Link "Recursion.guide/Factorial Example" 44 } Factorial Example + @{" Case, recursive " Link "Recursion.guide/Factorial Example" 44 } Factorial Example + @{" Ceiling of a floating-point value " Link "FloatingPoint.guide/Floating-Point Functions" 59 } Floating-Point Functions + @{" Changing stdin " Link "BuiltIns.guide/Input and output functions" 161 } Input and output functions + @{" Changing stdout " Link "BuiltIns.guide/Input and output functions" 170 } Input and output functions + @{" Changing stdrast " Link "BuiltIns.guide/Graphics functions" 58 } Graphics functions + @{" Changing the value of a variable " Link "Introduction.guide/Assignment" 0 } Assignment + @{" Character constant " Link "Constants.guide/Numeric Constants" 11 } Numeric Constants + @{" Character, apostrophe " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, backslash " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, carriage return " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, double quote " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, escape " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, linefeed " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, null " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, printing " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Character, read from a file " Link "BuiltIns.guide/Input and output functions" 109 } Input and output functions + @{" Character, tab " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Character, write to file " Link "BuiltIns.guide/Input and output functions" 99 } Input and output functions + @{" Choice, conditional block " Link "Introduction.guide/Conditional Block" 0 } Conditional Block + @{" Class (OOP) " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" Class hierarchy " Link "OOE.guide/Inheritance in E" 173 } Inheritance in E + @{" Class, abstract " Link "OOE.guide/Inheritance in E" 173 } Inheritance in E + @{" Class, base " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" Class, derived " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" Class, super " Link "OOE.guide/Inheritance in E" 161 } Inheritance in E + @{" Classes and modules " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" Clean-up, program termination " Link "BuiltIns.guide/System support functions" 65 } System support functions + @{" Close screen " Link "BuiltIns.guide/Intuition support functions" 178 } Intuition support functions + @{" Close window " Link "BuiltIns.guide/Intuition support functions" 122 } Intuition support functions + @{" Code fragment " Link "Introduction.guide/Conditional Block" 0 } Conditional Block + @{" Code modules " Link "Modules.guide/Code Modules" 0 } Code Modules + @{" code part of Intuition message " Link "BuiltIns.guide/Intuition support functions" 313 } Intuition support functions + @{" Code, reuse " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Code, style " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Colour, setting " Link "BuiltIns.guide/Graphics functions" 49 } Graphics functions + @{" Colour, setting foreground and background pen " Link "BuiltIns.guide/Graphics functions" 35 } Graphics functions + @{" Command line argument parsing " Link "Examples.guide/Argument Parsing" 0 } Argument Parsing + @{" Comment, nested " Link "Format.guide/Comments" 7 } Comments + @{" Comments " Link "Format.guide/Comments" 0 } Comments + @{" Common logarithm " Link "FloatingPoint.guide/Floating-Point Functions" 73 } Floating-Point Functions + @{" Common problems " Link "Appendices.guide/main" 0 } Common Problems + @{" Common use of pointers " Link "Types.guide/Extracting data (dereferencing pointers)" 90 } Extracting data (dereferencing pointers) + @{" Comparison of lists " Link "Types.guide/List functions" 28 } List functions + @{" Comparison of strings " Link "Types.guide/String functions" 40 } String functions + @{" Comparison operators " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Compiler, ec " Link "Introduction.guide/Compilation" 0 } Compilation + @{" Complex memory, deallocate " Link "BuiltIns.guide/System support functions" 44 } System support functions + @{" Complex memory, free " Link "BuiltIns.guide/System support functions" 44 } System support functions + @{" Complex types " Link "Types.guide/Complex types" 0 } Complex types + @{" Conditional block " Link "Introduction.guide/Conditional Block" 0 } Conditional Block + @{" Constant " Link "Constants.guide/main" 0 } Constants + @{" Constant string " Link "Types.guide/Normal strings and E-strings" 0 } Normal strings and E-strings + @{" Constant, binary " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Constant, built-in " Link "BuiltIns.guide/Built-In Constants" 0 } Built-In Constants + @{" Constant, character " Link "Constants.guide/Numeric Constants" 11 } Numeric Constants + @{" Constant, decimal " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Constant, enumeration " Link "Constants.guide/Enumerations" 0 } Enumerations + @{" Constant, hexadecimal " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Constant, named " Link "Constants.guide/Named Constants" 0 } Named Constants + @{" Constant, numeric " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Constant, set " Link "Constants.guide/Sets" 0 } Sets + @{" Constant, use in Assembly " Link "MoreExpressions.guide/Assembly and the E language" 15 } Assembly and the E language + @{" Constructor " Link "OOE.guide/Classes and methods" 20 } Classes and methods + @{" Constructor, names " Link "OOE.guide/Methods in E" 78 } Methods in E + @{" Control-C testing " Link "BuiltIns.guide/System support functions" 74 } System support functions + @{" Controlling program flow " Link "Introduction.guide/Program Flow Control" 0 } Program Flow Control + @{" Conversion of floating-point numbers " Link "FloatingPoint.guide/Floating-Point Calculations" 0 } Floating-Point Calculations + @{" Convert an expression to a statement " Link "MoreExpressions.guide/Turning an Expression into a Statement" 0 } Turning an Expression into a Statement + @{" Convert header file to module " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Convert include file to module " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Convert pragma file to module " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Converting floating-point numbers from a string " Link "FloatingPoint.guide/Floating-Point Functions" 10 } Floating-Point Functions + @{" Converting strings to numbers " Link "Types.guide/String functions" 199 } String functions + @{" Copy middle part of a string " Link "Types.guide/String functions" 144 } String functions + @{" Copy right-hand part of an E-string " Link "Types.guide/String functions" 136 } String functions + @{" Copying a list " Link "Types.guide/List functions" 37 } List functions + @{" Copying a string " Link "Types.guide/String functions" 58 } String functions + @{" Copying versus assignment " Link "Types.guide/String functions" 70 } String functions + @{" Cosine function " Link "FloatingPoint.guide/Floating-Point Functions" 51 } Floating-Point Functions + @{" Crash, avoiding stack problems " Link "Recursion.guide/Stack (and Crashing)" 21 } Stack (and Crashing) + @{" Crash, running out of stack " Link "Recursion.guide/Stack (and Crashing)" 0 } Stack (and Crashing) + @{" Create gadget " Link "BuiltIns.guide/Intuition support functions" 187 } Intuition support functions + @{" Cure for linefeed problem " Link "Introduction.guide/Strings" 0 } Strings + @{" Data, extracting from a pointer " Link "Types.guide/Extracting data (dereferencing pointers)" 0 } Extracting data (dereferencing pointers) + @{" Data, input " Link "Introduction.guide/The Simple Program" 0 } The Simple Program + @{" Data, manipulation " Link "Introduction.guide/The Simple Program" 0 } The Simple Program + @{" Data, named " Link "Introduction.guide/Variables and Expressions" 0 } Variables and Expressions + @{" Data, output " Link "Introduction.guide/The Simple Program" 0 } The Simple Program + @{" Data, static " Link "Types.guide/Static data" 0 } Static data + @{" Data, storage " Link "Introduction.guide/Variable types" 0 } Variable types + @{" Data-abstraction " Link "OOE.guide/Classes and methods" 29 } Classes and methods + @{" Data-hiding " Link "OOE.guide/Classes and methods" 29 } Classes and methods + @{" Deallocating an object " Link "OOE.guide/Objects in E" 31 } Objects in E + @{" Deallocating complex memory " Link "BuiltIns.guide/System support functions" 44 } System support functions + @{" Deallocating memory " Link "BuiltIns.guide/System support functions" 39 } System support functions + @{" Deallocation of memory " Link "Memory.guide/Deallocation of Memory" 0 } Deallocation of Memory + @{" Deallocation, potential problems " Link "Memory.guide/Deallocation of Memory" 28 } Deallocation of Memory + @{" Decimal constant " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Decimal number, printing " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Decision, conditional block " Link "Introduction.guide/Conditional Block" 0 } Conditional Block + @{" Declaration, array and array pointer " Link "Types.guide/Array pointers" 46 } Array pointers + @{" Declaration, illegal " Link "Types.guide/Indirect types" 0 } Indirect types + @{" Declaration, initialised " Link "MoreExpressions.guide/Initialised Declarations" 0 } Initialised Declarations + @{" Declaration, variable type " Link "Types.guide/Default type" 15 } Default type + @{" Declaring a variable " Link "Introduction.guide/Variable declaration" 0 } Variable declaration + @{" Decrementing a variable " Link "MoreExpressions.guide/INC and DEC statements" 0 } INC and DEC statements + @{" Decrementing array pointer " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Default arguments " Link "Procedures.guide/Default Arguments" 0 } Default Arguments + @{" Default type " Link "Types.guide/Default type" 0 } Default type + @{" Definition of a procedure with parameters " Link "Introduction.guide/Global and local variables" 62 } Global and local variables + @{" Dereferencing a pointer " Link "Types.guide/Extracting data (dereferencing pointers)" 0 } Extracting data (dereferencing pointers) + @{" Derivation (OOP) " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" Derived class " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" Descoping a global variable " Link "Introduction.guide/Global and local variables" 57 } Global and local variables + @{" Destructor " Link "OOE.guide/Classes and methods" 20 } Classes and methods + @{" Destructor, end " Link "OOE.guide/Methods in E" 118 } Methods in E + @{" Direct type " Link "Types.guide/Indirect types" 21 } Indirect types + @{" Division " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Division, 32-bit " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" Double quote " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Doubly linked list " Link "Types.guide/Linked Lists" 64 } Linked Lists + @{" Dragon curve " Link "Examples.guide/Recursion Example" 0 } Recursion Example + @{" Drawing, box " Link "BuiltIns.guide/Graphics functions" 30 } Graphics functions + @{" Drawing, line " Link "BuiltIns.guide/Graphics functions" 27 } Graphics functions + @{" Drawing, text " Link "BuiltIns.guide/Graphics functions" 42 } Graphics functions + @{" Dynamic (typed) memory allocation " Link "Memory.guide/NEW and END Operators" 0 } NEW and END Operators + @{" Dynamic E-list allocation " Link "Types.guide/List functions" 12 } List functions + @{" Dynamic E-string allocation " Link "Types.guide/String functions" 14 } String functions + @{" Dynamic memory allocation " Link "Memory.guide/Dynamic Allocation" 0 } Dynamic Allocation + @{" Dynamic type " Link "OOE.guide/Inheritance in E" 147 } Inheritance in E + @{" E author " Link "Appendices.guide/Amiga E Author" 0 } Amiga E Author + @{" E-list " Link "Types.guide/Lists and E-lists" 0 } Lists and E-lists + @{" E-list functions " Link "Types.guide/List functions" 0 } List functions + @{" E-list, append " Link "Types.guide/List functions" 47 } List functions + @{" E-list, comparison " Link "Types.guide/List functions" 28 } List functions + @{" E-list, copying " Link "Types.guide/List functions" 37 } List functions + @{" E-list, dynamic allocation " Link "Types.guide/List functions" 12 } List functions + @{" E-list, length " Link "Types.guide/List functions" 55 } List functions + @{" E-list, maximum length " Link "Types.guide/List functions" 59 } List functions + @{" E-list, setting the length " Link "Types.guide/List functions" 62 } List functions + @{" E-string " Link "Types.guide/Normal strings and E-strings" 39 } Normal strings and E-strings + @{" E-string functions " Link "Types.guide/String functions" 0 } String functions + @{" E-string handling example " Link "Examples.guide/String Handling and I-O" 0 } String Handling and I-O + @{" E-string, append " Link "Types.guide/String functions" 99 } String functions + @{" E-string, comparison " Link "Types.guide/String functions" 40 } String functions + @{" E-string, copying " Link "Types.guide/String functions" 58 } String functions + @{" E-string, dynamic allocation " Link "Types.guide/String functions" 14 } String functions + @{" E-string, format text to " Link "BuiltIns.guide/Input and output functions" 90 } Input and output functions + @{" E-string, length " Link "Types.guide/String functions" 125 } String functions + @{" E-string, lowercase " Link "Types.guide/String functions" 169 } String functions + @{" E-string, maximum length " Link "Types.guide/String functions" 131 } String functions + @{" E-string, middle copy " Link "Types.guide/String functions" 144 } String functions + @{" E-string, reading from a file " Link "BuiltIns.guide/Input and output functions" 114 } Input and output functions + @{" E-string, right-hand copy " Link "Types.guide/String functions" 136 } String functions + @{" E-string, set length " Link "Types.guide/String functions" 178 } String functions + @{" E-string, trim leading whitespace " Link "Types.guide/String functions" 161 } String functions + @{" E-string, uppercase " Link "Types.guide/String functions" 174 } String functions + @{" Early termination of a function " Link "Procedures.guide/Functions" 32 } Functions + @{" ec compiler " Link "Introduction.guide/Compilation" 0 } Compilation + @{" Element selection " Link "Types.guide/Element selection and element types" 0 } Element selection and element types + @{" Element types " Link "Types.guide/Element selection and element types" 13 } Element selection and element types + @{" Elements of a linked list " Link "Types.guide/Linked Lists" 13 } Linked Lists + @{" Elements of an array " Link "Types.guide/Accessing array data" 0 } Accessing array data + @{" Elements of an object " Link "Types.guide/OBJECT Type" 0 } OBJECT Type + @{" Emodules: assignment " Link "Modules.guide/Using Modules" 0 } Using Modules + @{" end destructor " Link "OOE.guide/Methods in E" 118 } Methods in E + @{" End of file " Link "BuiltIns.guide/Input and output functions" 109 } Input and output functions + @{" Enumeration " Link "Constants.guide/Enumerations" 0 } Enumerations + @{" EOF " Link "BuiltIns.guide/Input and output functions" 109 } Input and output functions + @{" Error handling " Link "Exceptions.guide/main" 0 } Exception Handling + @{" Escape character " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Evaluation of quoted expressions " Link "MoreExpressions.guide/Evaluation" 0 } Evaluation + @{" Even number " Link "BuiltIns.guide/Maths and logic functions" 41 } Maths and logic functions + @{" Example module use " Link "Modules.guide/Example Module Use" 0 } Example Module Use + @{" Examples, altering " Link "Introduction.guide/Tinkering with the example" 0 } Tinkering with the example + @{" Examples, tinkering " Link "Introduction.guide/Tinkering with the example" 0 } Tinkering with the example + @{" Exception " Link "Exceptions.guide/main" 0 } Exception Handling + @{" Exception handler in a procedure " Link "Exceptions.guide/Procedures with Exception Handlers" 0 } Procedures with Exception Handlers + @{" Exception handling " Link "Exceptions.guide/main" 0 } Exception Handling + @{" Exception, automatic " Link "Exceptions.guide/Automatic Exceptions" 0 } Automatic Exceptions + @{" Exception, raising " Link "Exceptions.guide/Raising an Exception" 0 } Raising an Exception + @{" Exception, raising from a handler " Link "Exceptions.guide/Raise within an Exception Handler" 0 } Raise within an Exception Handler + @{" Exception, recursive handling " Link "Recursion.guide/Stack and Exceptions" 9 } Stack and Exceptions + @{" Exception, throwing " Link "Exceptions.guide/Raising an Exception" 0 } Raising an Exception + @{" Exception, use of stack " Link "Recursion.guide/Stack and Exceptions" 0 } Stack and Exceptions + @{" Exception, zero " Link "Exceptions.guide/Raising an Exception" 73 } Raising an Exception + @{" Exceptions and initialisation " Link "Exceptions.guide/Raise within an Exception Handler" 54 } Raise within an Exception Handler + @{" Exclusive or " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" Executing a procedure " Link "Introduction.guide/Procedure Execution" 0 } Procedure Execution + @{" Execution " Link "Introduction.guide/Execution" 0 } Execution + @{" Execution, jumping to a label " Link "MoreExpressions.guide/Labelling and the JUMP statement" 0 } Labelling and the JUMP statement + @{" Exists a list element " Link "MoreExpressions.guide/Lists and quoted expressions" 46 } Lists and quoted expressions + @{" EXIT statement " Link "MoreExpressions.guide/EXIT statement" 0 } EXIT statement + @{" Exiting a loop " Link "MoreExpressions.guide/EXIT statement" 0 } EXIT statement + @{" Exponentiation " Link "FloatingPoint.guide/Floating-Point Functions" 66 } Floating-Point Functions + @{" Expression " Link "Introduction.guide/Expressions" 0 } Expressions + @{" Expression " Link "Introduction.guide/Variables and Expressions" 0 } Variables and Expressions + @{" Expression in parentheses " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Expression, assignment " Link "MoreExpressions.guide/Assignments" 0 } Assignments + @{" Expression, bad grouping " Link "Introduction.guide/Precedence and grouping" 25 } Precedence and grouping + @{" Expression, bracketing " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Expression, BUT " Link "MoreExpressions.guide/BUT expression" 0 } BUT expression + @{" Expression, conversion to a statement " Link "MoreExpressions.guide/Turning an Expression into a Statement" 0 } Turning an Expression into a Statement + @{" Expression, grouping " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Expression, IF " Link "Introduction.guide/IF expression" 0 } IF expression + @{" Expression, quotable " Link "MoreExpressions.guide/Quotable expressions" 0 } Quotable expressions + @{" Expression, quoted " Link "MoreExpressions.guide/Quoted Expressions" 0 } Quoted Expressions + @{" Expression, sequence " Link "MoreExpressions.guide/BUT expression" 0 } BUT expression + @{" Expression, side-effects " Link "MoreExpressions.guide/Side-effects" 0 } Side-effects + @{" Expression, timing example " Link "Examples.guide/Timing Expressions" 0 } Timing Expressions + @{" Expression, voiding " Link "MoreExpressions.guide/Turning an Expression into a Statement" 0 } Turning an Expression into a Statement + @{" Extracting data from a pointer " Link "Types.guide/Extracting data (dereferencing pointers)" 0 } Extracting data (dereferencing pointers) + @{" Extracting floating-point numbers from a string " Link "FloatingPoint.guide/Floating-Point Functions" 10 } Floating-Point Functions + @{" Extracting numbers from a string " Link "Types.guide/String functions" 199 } String functions + @{" Factorial function " Link "Recursion.guide/Factorial Example" 0 } Factorial Example + @{" Field formatting " Link "BuiltIns.guide/Input and output functions" 37 } Input and output functions + @{" Field size " Link "BuiltIns.guide/Input and output functions" 37 } Input and output functions + @{" Field, left-justify " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" Field, right-justify " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" Field, zero fill " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" File length " Link "BuiltIns.guide/Input and output functions" 154 } Input and output functions + @{" Filtering a list " Link "MoreExpressions.guide/Lists and quoted expressions" 62 } Lists and quoted expressions + @{" Find sub-string in a string " Link "Types.guide/String functions" 156 } String functions + @{" Finding addresses " Link "Types.guide/Finding addresses (making pointers)" 0 } Finding addresses (making pointers) + @{" Finding bugs " Link "Appendices.guide/main" 0 } Common Problems + @{" First element of an array " Link "Types.guide/Accessing array data" 55 } Accessing array data + @{" Flag, AND-ing " Link "Constants.guide/Sets" 19 } Sets + @{" Flag, IDCMP " Link "BuiltIns.guide/Intuition support functions" 70 } Intuition support functions + @{" Flag, mouse button " Link "BuiltIns.guide/Intuition support functions" 244 } Intuition support functions + @{" Flag, OR-ing " Link "Constants.guide/Sets" 19 } Sets + @{" Flag, screen resolution " Link "BuiltIns.guide/Intuition support functions" 171 } Intuition support functions + @{" Flag, set constant " Link "Constants.guide/Sets" 0 } Sets + @{" Flag, window " Link "BuiltIns.guide/Intuition support functions" 89 } Intuition support functions + @{" Floating-point conversion operator " Link "FloatingPoint.guide/Floating-Point Calculations" 0 } Floating-Point Calculations + @{" Floating-point functions " Link "FloatingPoint.guide/Floating-Point Functions" 0 } Floating-Point Functions + @{" Floating-point number " Link "FloatingPoint.guide/main" 0 } Floating-Point Numbers + @{" Floating-point number, extracting from a string " Link "FloatingPoint.guide/Floating-Point Functions" 10 } Floating-Point Functions + @{" Floor of a floating-point value " Link "FloatingPoint.guide/Floating-Point Functions" 59 } Floating-Point Functions + @{" Flow control " Link "Introduction.guide/Program Flow Control" 0 } Program Flow Control + @{" Following elements in a linked list " Link "Types.guide/Linked Lists" 56 } Linked Lists + @{" Font, setting Topaz " Link "BuiltIns.guide/Graphics functions" 67 } Graphics functions + @{" For all list elements " Link "MoreExpressions.guide/Lists and quoted expressions" 29 } Lists and quoted expressions + @{" FOR loop " Link "Introduction.guide/FOR loop" 0 } FOR loop + @{" Foreground pen, setting colour " Link "BuiltIns.guide/Graphics functions" 35 } Graphics functions + @{" Format rules " Link "Format.guide/main" 0 } Format and Layout + @{" Format text to an E-string " Link "BuiltIns.guide/Input and output functions" 90 } Input and output functions + @{" Forward through a linked list " Link "Types.guide/Linked Lists" 56 } Linked Lists + @{" Fragment, code " Link "Introduction.guide/Conditional Block" 0 } Conditional Block + @{" Free stack space " Link "BuiltIns.guide/System support functions" 79 } System support functions + @{" Freeing complex memory " Link "BuiltIns.guide/System support functions" 44 } System support functions + @{" Freeing memory " Link "BuiltIns.guide/System support functions" 39 } System support functions + @{" Function " Link "Procedures.guide/main" 0 } Procedures and Functions + @{" Function, built-in " Link "BuiltIns.guide/Built-In Functions" 0 } Built-In Functions + @{" Function, early termination " Link "Procedures.guide/Functions" 32 } Functions + @{" Function, factorial " Link "Recursion.guide/Factorial Example" 0 } Factorial Example + @{" Function, graphics " Link "BuiltIns.guide/Graphics functions" 0 } Graphics functions + @{" Function, input " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Function, Intuition support " Link "BuiltIns.guide/Intuition support functions" 0 } Intuition support functions + @{" Function, logic " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" Function, maths " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" Function, one-line " Link "Procedures.guide/One-Line Functions" 0 } One-Line Functions + @{" Function, output " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Function, recursive " Link "Recursion.guide/main" 0 } Recursion + @{" Function, return value " Link "Procedures.guide/Functions" 0 } Functions + @{" Function, system support " Link "BuiltIns.guide/System support functions" 0 } System support functions + @{" Functions, floating-point " Link "FloatingPoint.guide/Floating-Point Functions" 0 } Floating-Point Functions + @{" Functions, linked list " Link "Types.guide/Linked Lists" 13 } Linked Lists + @{" Functions, list and E-list " Link "Types.guide/List functions" 0 } List functions + @{" Functions, string and E-string " Link "Types.guide/String functions" 0 } String functions + @{" Further reading " Link "Appendices.guide/Further Reading" 0 } Further Reading + @{" Gadget and IDCMP example " Link "Examples.guide/IDCMP Messages" 0 } IDCMP Messages + @{" Gadget, create " Link "BuiltIns.guide/Intuition support functions" 187 } Intuition support functions + @{" Gadgets example " Link "Examples.guide/Gadgets" 0 } Gadgets + @{" General loop " Link "MoreExpressions.guide/LOOP block" 0 } LOOP block + @{" Global variable " Link "Introduction.guide/Global and local variables" 0 } Global and local variables + @{" Global variable, descoping " Link "Introduction.guide/Global and local variables" 57 } Global and local variables + @{" Graphics example " Link "Examples.guide/Graphics" 0 } Graphics + @{" Graphics functions " Link "BuiltIns.guide/Graphics functions" 0 } Graphics functions + @{" Grouping expressions " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Grouping, bad " Link "Introduction.guide/Precedence and grouping" 25 } Precedence and grouping + @{" Guide author " Link "Appendices.guide/Guide Author" 0 } Guide Author + @{" Handler in a procedure " Link "Exceptions.guide/Procedures with Exception Handlers" 0 } Procedures with Exception Handlers + @{" Handler raising an exception " Link "Exceptions.guide/Raise within an Exception Handler" 0 } Raise within an Exception Handler + @{" Handler, recursive " Link "Recursion.guide/Stack and Exceptions" 9 } Stack and Exceptions + @{" Handling exceptions " Link "Exceptions.guide/main" 0 } Exception Handling + @{" Head of a linked list " Link "Types.guide/Linked Lists" 23 } Linked Lists + @{" Header file, convert to module " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Hexadecimal constant " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Hexadecimal number, printing " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Hierarchy, class " Link "OOE.guide/Inheritance in E" 173 } Inheritance in E + @{" Horizontal FOR loop " Link "Introduction.guide/FOR loop" 55 } FOR loop + @{" Horizontal function definition " Link "Procedures.guide/One-Line Functions" 0 } One-Line Functions + @{" Horizontal IF block " Link "Introduction.guide/IF block" 29 } IF block + @{" Horizontal WHILE loop " Link "Introduction.guide/WHILE loop" 57 } WHILE loop + @{" I/O example " Link "Examples.guide/String Handling and I-O" 0 } String Handling and I-O + @{" I/O example, with handler " Link "Examples.guide/String Handling and I-O" 307 } String Handling and I-O + @{" iaddr part of Intuition message " Link "BuiltIns.guide/Intuition support functions" 316 } Intuition support functions + @{" IDCMP and gadget example " Link "Examples.guide/IDCMP Messages" 0 } IDCMP Messages + @{" IDCMP flags " Link "BuiltIns.guide/Intuition support functions" 70 } Intuition support functions + @{" IDCMP message, code part " Link "BuiltIns.guide/Intuition support functions" 313 } Intuition support functions + @{" IDCMP message, iaddr part " Link "BuiltIns.guide/Intuition support functions" 316 } Intuition support functions + @{" IDCMP message, qual part " Link "BuiltIns.guide/Intuition support functions" 321 } Intuition support functions + @{" IDCMP message, waiting for " Link "BuiltIns.guide/Intuition support functions" 282 } Intuition support functions + @{" Identifier " Link "Format.guide/Identifiers" 0 } Identifiers + @{" Identifier, case of characters " Link "Format.guide/Identifiers" 0 } Identifiers + @{" IF block " Link "Introduction.guide/IF block" 0 } IF block + @{" IF block, nested " Link "Introduction.guide/IF block" 74 } IF block + @{" IF block, overlapping conditions " Link "Introduction.guide/IF block" 80 } IF block + @{" IF expression " Link "Introduction.guide/IF expression" 0 } IF expression + @{" Illegal declaration " Link "Types.guide/Indirect types" 0 } Indirect types + @{" Include file, convert to module " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Incrementing a variable " Link "MoreExpressions.guide/INC and DEC statements" 0 } INC and DEC statements + @{" Incrementing array pointer " Link "Types.guide/Point to other elements" 0 } Point to other elements + @{" Indentation " Link "Format.guide/Spacing and Separators" 0 } Spacing and Separators + @{" Indirect type " Link "Types.guide/Indirect types" 0 } Indirect types + @{" Inheritance (OOP) " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" Inheritance, OBJECT..OF " Link "OOE.guide/Inheritance in E" 0 } Inheritance in E + @{" Initialisation " Link "Introduction.guide/Global and local variables" 109 } Global and local variables + @{" Initialisation and automatic exceptions " Link "Exceptions.guide/Raise within an Exception Handler" 54 } Raise within an Exception Handler + @{" Initialisation, general " Link "MoreExpressions.guide/Initialised Declarations" 28 } Initialised Declarations + @{" Initialised array " Link "Types.guide/Typed lists" 0 } Typed lists + @{" Initialised declaration " Link "MoreExpressions.guide/Initialised Declarations" 0 } Initialised Declarations + @{" Inlining procedures " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Input a character " Link "BuiltIns.guide/Input and output functions" 109 } Input and output functions + @{" Input a string " Link "BuiltIns.guide/Input and output functions" 114 } Input and output functions + @{" Input functions " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Input/output example " Link "Examples.guide/String Handling and I-O" 0 } String Handling and I-O + @{" Input/output example, with handler " Link "Examples.guide/String Handling and I-O" 307 } String Handling and I-O + @{" Interface " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" Intuition message flags " Link "BuiltIns.guide/Intuition support functions" 70 } Intuition support functions + @{" Intuition message, code part " Link "BuiltIns.guide/Intuition support functions" 313 } Intuition support functions + @{" Intuition message, iaddr part " Link "BuiltIns.guide/Intuition support functions" 316 } Intuition support functions + @{" Intuition message, qual part " Link "BuiltIns.guide/Intuition support functions" 321 } Intuition support functions + @{" Intuition message, waiting for " Link "BuiltIns.guide/Intuition support functions" 282 } Intuition support functions + @{" Intuition support functions " Link "BuiltIns.guide/Intuition support functions" 0 } Intuition support functions + @{" Iteration " Link "Introduction.guide/Loops" 0 } Loops + @{" Jumping out of a loop " Link "MoreExpressions.guide/Labelling and the JUMP statement" 29 } Labelling and the JUMP statement + @{" Jumping to a label " Link "MoreExpressions.guide/Labelling and the JUMP statement" 0 } Labelling and the JUMP statement + @{" Kickstart version " Link "BuiltIns.guide/System support functions" 84 } System support functions + @{" Label " Link "MoreExpressions.guide/Labelling and the JUMP statement" 0 } Labelling and the JUMP statement + @{" Label, use in Assembly " Link "MoreExpressions.guide/Assembly and the E language" 28 } Assembly and the E language + @{" Languages " Link "Introduction.guide/main" 0 } Introduction to Amiga E + @{" Layout rules " Link "Format.guide/main" 0 } Format and Layout + @{" Leaf " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Left mouse button click " Link "BuiltIns.guide/Intuition support functions" 273 } Intuition support functions + @{" Left mouse button click (wait) " Link "BuiltIns.guide/Intuition support functions" 324 } Intuition support functions + @{" Left shift " Link "BuiltIns.guide/Maths and logic functions" 100 } Maths and logic functions + @{" Left-hand side of an assignment, allowable " Link "MoreExpressions.guide/Assignments" 33 } Assignments + @{" Left-justify field " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" Length (maximum) of an E-list " Link "Types.guide/List functions" 59 } List functions + @{" Length (maximum) of an E-string " Link "Types.guide/String functions" 131 } String functions + @{" Length of a file " Link "BuiltIns.guide/Input and output functions" 154 } Input and output functions + @{" Length of a list " Link "Types.guide/List functions" 55 } List functions + @{" Length of a string " Link "Types.guide/String functions" 108 } String functions + @{" Length of an E-list, setting " Link "Types.guide/List functions" 62 } List functions + @{" Length of an E-string " Link "Types.guide/String functions" 125 } String functions + @{" Length of an E-string, setting " Link "Types.guide/String functions" 178 } String functions + @{" Line drawing " Link "BuiltIns.guide/Graphics functions" 27 } Graphics functions + @{" Linefeed " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Linefeed problem " Link "Introduction.guide/Execution" 20 } Execution + @{" Linefeed problem, cure " Link "Introduction.guide/Strings" 0 } Strings + @{" Linefeed, \n " Link "Introduction.guide/Strings" 0 } Strings + @{" Linked list " Link "Types.guide/Linked Lists" 0 } Linked Lists + @{" Linked list, doubly " Link "Types.guide/Linked Lists" 64 } Linked Lists + @{" Linked list, elements " Link "Types.guide/Linked Lists" 13 } Linked Lists + @{" Linked list, following elements " Link "Types.guide/Linked Lists" 56 } Linked Lists + @{" Linked list, functions " Link "Types.guide/Linked Lists" 13 } Linked Lists + @{" Linked list, head " Link "Types.guide/Linked Lists" 23 } Linked Lists + @{" Linked list, linking " Link "Types.guide/Linked Lists" 23 } Linked Lists + @{" Linked list, next element " Link "Types.guide/Linked Lists" 38 } Linked Lists + @{" Linked list, singly " Link "Types.guide/Linked Lists" 64 } Linked Lists + @{" Linking a linked list " Link "Types.guide/Linked Lists" 23 } Linked Lists + @{" List " Link "Types.guide/Lists and E-lists" 0 } Lists and E-lists + @{" List functions " Link "Types.guide/List functions" 0 } List functions + @{" List, append " Link "Types.guide/List functions" 47 } List functions + @{" List, comparison " Link "Types.guide/List functions" 28 } List functions + @{" List, copying " Link "Types.guide/List functions" 37 } List functions + @{" List, filtering " Link "MoreExpressions.guide/Lists and quoted expressions" 62 } Lists and quoted expressions + @{" List, for all elements " Link "MoreExpressions.guide/Lists and quoted expressions" 29 } Lists and quoted expressions + @{" List, length " Link "Types.guide/List functions" 55 } List functions + @{" List, linked " Link "Types.guide/Linked Lists" 0 } Linked Lists + @{" List, mapping a quoted expression " Link "MoreExpressions.guide/Lists and quoted expressions" 8 } Lists and quoted expressions + @{" List, normal " Link "Types.guide/Lists and E-lists" 0 } Lists and E-lists + @{" List, selecting an element " Link "Types.guide/List functions" 65 } List functions + @{" List, tag " Link "Types.guide/Lists and E-lists" 42 } Lists and E-lists + @{" List, there exists an element " Link "MoreExpressions.guide/Lists and quoted expressions" 46 } Lists and quoted expressions + @{" List, typed " Link "Types.guide/Typed lists" 0 } Typed lists + @{" Lists and quoted expressions " Link "MoreExpressions.guide/Lists and quoted expressions" 0 } Lists and quoted expressions + @{" Local variable " Link "Introduction.guide/Global and local variables" 0 } Global and local variables + @{" Local variable, initialisation " Link "Introduction.guide/Global and local variables" 109 } Global and local variables + @{" Local variable, same names " Link "Introduction.guide/Global and local variables" 32 } Global and local variables + @{" Local variable, self " Link "OOE.guide/Methods in E" 67 } Methods in E + @{" Local variables in a quoted expression " Link "MoreExpressions.guide/Quotable expressions" 0 } Quotable expressions + @{" Locate sub-string in a string " Link "Types.guide/String functions" 156 } String functions + @{" Location, memory " Link "Types.guide/Memory addresses" 0 } Memory addresses + @{" Location, memory " Link "Types.guide/Addresses" 0 } Addresses + @{" Logarithm, common " Link "FloatingPoint.guide/Floating-Point Functions" 73 } Floating-Point Functions + @{" Logarithm, natural " Link "FloatingPoint.guide/Floating-Point Functions" 73 } Floating-Point Functions + @{" Logic " Link "Introduction.guide/Logic and comparison" 0 } Logic and comparison + @{" Logic functions " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" Logic operators " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Logic, and " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" Logic, exclusive or " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" Logic, not " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" Logic, or " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" LONG type " Link "Types.guide/LONG Type" 0 } LONG Type + @{" LONG type, definition " Link "Types.guide/Indirect types" 21 } Indirect types + @{" Loop " Link "Introduction.guide/Loops" 0 } Loops + @{" LOOP block " Link "MoreExpressions.guide/LOOP block" 0 } LOOP block + @{" Loop check, REPEAT..UNTIL " Link "Introduction.guide/REPEAT..UNTIL loop" 18 } REPEAT..UNTIL loop + @{" Loop check, WHILE " Link "Introduction.guide/WHILE loop" 22 } WHILE loop + @{" Loop termination " Link "Introduction.guide/WHILE loop" 61 } WHILE loop + @{" Loop, EXIT " Link "MoreExpressions.guide/EXIT statement" 0 } EXIT statement + @{" Loop, exiting " Link "MoreExpressions.guide/EXIT statement" 0 } EXIT statement + @{" Loop, FOR " Link "Introduction.guide/FOR loop" 0 } FOR loop + @{" Loop, general " Link "MoreExpressions.guide/LOOP block" 0 } LOOP block + @{" Loop, LOOP " Link "MoreExpressions.guide/LOOP block" 0 } LOOP block + @{" Loop, REPEAT..UNTIL " Link "Introduction.guide/REPEAT..UNTIL loop" 0 } REPEAT..UNTIL loop + @{" Loop, terminate by jumping to a label " Link "MoreExpressions.guide/Labelling and the JUMP statement" 29 } Labelling and the JUMP statement + @{" Loop, WHILE " Link "Introduction.guide/WHILE loop" 0 } WHILE loop + @{" Lowercase a string " Link "Types.guide/String functions" 169 } String functions + @{" main procedure " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Making pointers " Link "Types.guide/Finding addresses (making pointers)" 0 } Finding addresses (making pointers) + @{" Manipulation, safe " Link "Types.guide/LIST and STRING Types" 0 } LIST and STRING Types + @{" Mapping a quoted expression over a list " Link "MoreExpressions.guide/Lists and quoted expressions" 8 } Lists and quoted expressions + @{" Matching patterns " Link "MoreExpressions.guide/Unification" 0 } Unification + @{" Mathematical operators " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Maths functions " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" Maximum " Link "BuiltIns.guide/Maths and logic functions" 49 } Maths and logic functions + @{" Maximum length of an E-list " Link "Types.guide/List functions" 59 } List functions + @{" Maximum length of an E-string " Link "Types.guide/String functions" 131 } String functions + @{" Memory address " Link "Types.guide/Memory addresses" 0 } Memory addresses + @{" Memory address " Link "Types.guide/Addresses" 0 } Addresses + @{" Memory, allocating " Link "BuiltIns.guide/System support functions" 0 } System support functions + @{" Memory, allocation " Link "Memory.guide/main" 0 } Memory Allocation + @{" Memory, deallocate " Link "BuiltIns.guide/System support functions" 39 } System support functions + @{" Memory, deallocate complex " Link "BuiltIns.guide/System support functions" 44 } System support functions + @{" Memory, deallocation " Link "Memory.guide/Deallocation of Memory" 0 } Deallocation of Memory + @{" Memory, dynamic (typed) allocation " Link "Memory.guide/NEW and END Operators" 0 } NEW and END Operators + @{" Memory, dynamic allocation " Link "Memory.guide/Dynamic Allocation" 0 } Dynamic Allocation + @{" Memory, free " Link "BuiltIns.guide/System support functions" 39 } System support functions + @{" Memory, free complex " Link "BuiltIns.guide/System support functions" 44 } System support functions + @{" Memory, reading " Link "BuiltIns.guide/Maths and logic functions" 116 } Maths and logic functions + @{" Memory, sharing " Link "Appendices.guide/Assignment and Copying" 41 } Assignment and Copying + @{" Memory, static allocation " Link "Memory.guide/Static Allocation" 0 } Static Allocation + @{" Memory, writing " Link "BuiltIns.guide/Maths and logic functions" 123 } Maths and logic functions + @{" Method (OOP) " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" Method, abstract " Link "OOE.guide/Inheritance in E" 275 } Inheritance in E + @{" Method, calling " Link "OOE.guide/Methods in E" 28 } Methods in E + @{" Method, constructor " Link "OOE.guide/Classes and methods" 20 } Classes and methods + @{" Method, destructor " Link "OOE.guide/Classes and methods" 20 } Classes and methods + @{" Method, end " Link "OOE.guide/Methods in E" 118 } Methods in E + @{" Method, overriding " Link "OOE.guide/Inheritance in E" 96 } Inheritance in E + @{" Method, PROC..OF " Link "OOE.guide/Methods in E" 0 } Methods in E + @{" Method, self local variable " Link "OOE.guide/Methods in E" 67 } Methods in E + @{" Middle copy of a string " Link "Types.guide/String functions" 144 } String functions + @{" Minimum " Link "BuiltIns.guide/Maths and logic functions" 52 } Maths and logic functions + @{" Mnemonics, Assembly " Link "MoreExpressions.guide/Assembly Statements" 0 } Assembly Statements + @{" Module " Link "Modules.guide/main" 0 } Modules + @{" Module, Amiga system " Link "Modules.guide/Amiga System Modules" 0 } Amiga System Modules + @{" Module, code " Link "Modules.guide/Code Modules" 0 } Code Modules + @{" Module, convert from include, header or pragma file " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Module, example use " Link "Modules.guide/Example Module Use" 0 } Example Module Use + @{" Module, non-standard " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Module, using " Link "Modules.guide/Using Modules" 0 } Using Modules + @{" Module, view contents " Link "Modules.guide/Using Modules" 19 } Using Modules + @{" Modules and classes " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" Modulus " Link "BuiltIns.guide/Maths and logic functions" 70 } Maths and logic functions + @{" Mouse button flags " Link "BuiltIns.guide/Intuition support functions" 244 } Intuition support functions + @{" Mouse buttons state " Link "BuiltIns.guide/Intuition support functions" 235 } Intuition support functions + @{" Mouse click, left button " Link "BuiltIns.guide/Intuition support functions" 273 } Intuition support functions + @{" Mouse click, left button (wait) " Link "BuiltIns.guide/Intuition support functions" 324 } Intuition support functions + @{" Mouse x-coordinate " Link "BuiltIns.guide/Intuition support functions" 259 } Intuition support functions + @{" Mouse y-coordinate " Link "BuiltIns.guide/Intuition support functions" 266 } Intuition support functions + @{" Multiple return values " Link "Procedures.guide/Multiple Return Values" 0 } Multiple Return Values + @{" Multiple-assignment " Link "Procedures.guide/Multiple Return Values" 12 } Multiple Return Values + @{" Multiplication " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Multiplication, 32-bit " Link "BuiltIns.guide/Maths and logic functions" 0 } Maths and logic functions + @{" Mutual recursion " Link "Recursion.guide/Mutual Recursion" 0 } Mutual Recursion + @{" Named constant " Link "Constants.guide/Named Constants" 0 } Named Constants + @{" Named data " Link "Introduction.guide/Variables and Expressions" 0 } Variables and Expressions + @{" Named elements " Link "Types.guide/OBJECT Type" 0 } OBJECT Type + @{" Names of constructors " Link "OOE.guide/Methods in E" 78 } Methods in E + @{" Names of local variables " Link "Introduction.guide/Global and local variables" 32 } Global and local variables + @{" Natural logarithm " Link "FloatingPoint.guide/Floating-Point Functions" 73 } Floating-Point Functions + @{" Nested comment " Link "Format.guide/Comments" 7 } Comments + @{" Nested IF blocks " Link "Introduction.guide/IF block" 74 } IF block + @{" Next element of a linked list " Link "Types.guide/Linked Lists" 38 } Linked Lists + @{" Node " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Non-standard module " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Normal list " Link "Types.guide/Lists and E-lists" 0 } Lists and E-lists + @{" Normal list, selecting an element " Link "Types.guide/List functions" 65 } List functions + @{" Normal string " Link "Types.guide/Normal strings and E-strings" 0 } Normal strings and E-strings + @{" Not " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" Null character " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Number, even " Link "BuiltIns.guide/Maths and logic functions" 41 } Maths and logic functions + @{" Number, extracting from a string " Link "Types.guide/String functions" 199 } String functions + @{" Number, floating-point " Link "FloatingPoint.guide/main" 0 } Floating-Point Numbers + @{" Number, odd " Link "BuiltIns.guide/Maths and logic functions" 45 } Maths and logic functions + @{" Number, printing " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Number, printing (simple) " Link "Introduction.guide/Changing the example" 18 } Changing the example + @{" Number, quick random " Link "BuiltIns.guide/Maths and logic functions" 93 } Maths and logic functions + @{" Number, random " Link "BuiltIns.guide/Maths and logic functions" 84 } Maths and logic functions + @{" Number, real " Link "FloatingPoint.guide/main" 0 } Floating-Point Numbers + @{" Number, signed or unsigned " Link "Appendices.guide/Signed and Unsigned Values" 0 } Signed and Unsigned Values + @{" Numbered elements of an array " Link "Types.guide/Accessing array data" 0 } Accessing array data + @{" Numeric constant " Link "Constants.guide/Numeric Constants" 0 } Numeric Constants + @{" Object " Link "Types.guide/OBJECT Type" 0 } OBJECT Type + @{" Object (OOP) " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" Object element types " Link "Types.guide/Element selection and element types" 13 } Element selection and element types + @{" Object elements, private " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" Object elements, public " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" Object pointer " Link "Types.guide/Element selection and element types" 8 } Element selection and element types + @{" Object selection, use of ++ and - " Link "Types.guide/Element selection and element types" 44 } Element selection and element types + @{" Object, allocation " Link "OOE.guide/Objects in E" 17 } Objects in E + @{" Object, Amiga system " Link "Types.guide/Amiga system objects" 0 } Amiga system objects + @{" Object, deallocation " Link "OOE.guide/Objects in E" 31 } Objects in E + @{" Object, element selection " Link "Types.guide/Element selection and element types" 0 } Element selection and element types + @{" Object, named elements " Link "Types.guide/OBJECT Type" 0 } OBJECT Type + @{" Object, size " Link "MoreExpressions.guide/SIZEOF expression" 0 } SIZEOF expression + @{" OBJECT..OF, inheritance " Link "OOE.guide/Inheritance in E" 0 } Inheritance in E + @{" Odd number " Link "BuiltIns.guide/Maths and logic functions" 45 } Maths and logic functions + @{" One-line function " Link "Procedures.guide/One-Line Functions" 0 } One-Line Functions + @{" OOP, class " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" OOP, derivation " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" OOP, inheritance " Link "OOE.guide/Inheritance" 0 } Inheritance + @{" OOP, method " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" OOP, object " Link "OOE.guide/Classes and methods" 0 } Classes and methods + @{" Open screen " Link "BuiltIns.guide/Intuition support functions" 129 } Intuition support functions + @{" Open window " Link "BuiltIns.guide/Intuition support functions" 16 } Intuition support functions + @{" Operator precedence " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Operator, SUPER " Link "OOE.guide/Inheritance in E" 110 } Inheritance in E + @{" Operators, comparison " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Operators, logic " Link "Introduction.guide/Logic and comparison" 11 } Logic and comparison + @{" Operators, mathematical " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Option, set constant " Link "Constants.guide/Sets" 0 } Sets + @{" Optional return values " Link "Procedures.guide/Multiple Return Values" 32 } Multiple Return Values + @{" Or " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" OR, bit-wise " Link "MoreExpressions.guide/Bitwise AND and OR" 0 } Bitwise AND and OR + @{" Or, exclusive " Link "BuiltIns.guide/Maths and logic functions" 14 } Maths and logic functions + @{" OR-ing flags " Link "Constants.guide/Sets" 19 } Sets + @{" Output a character " Link "BuiltIns.guide/Input and output functions" 99 } Input and output functions + @{" Output functions " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Output text " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Output window " Link "BuiltIns.guide/Built-In Variables" 34 } Built-In Variables + @{" Overlapping conditions " Link "Introduction.guide/IF block" 80 } IF block + @{" Overriding methods " Link "OOE.guide/Inheritance in E" 96 } Inheritance in E + @{" Pad byte " Link "MoreExpressions.guide/SIZEOF expression" 17 } SIZEOF expression + @{" Parameter " Link "Introduction.guide/Parameters" 0 } Parameters + @{" Parameter variable " Link "Introduction.guide/Global and local variables" 0 } Global and local variables + @{" Parameter, default " Link "Procedures.guide/Default Arguments" 0 } Default Arguments + @{" Parameter, procedure local variables " Link "Introduction.guide/Global and local variables" 62 } Global and local variables + @{" Parentheses and expressions " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Parsing command line arguments " Link "Examples.guide/Argument Parsing" 0 } Argument Parsing + @{" Pattern matching " Link "MoreExpressions.guide/Unification" 0 } Unification + @{" Peeking memory " Link "BuiltIns.guide/Maths and logic functions" 116 } Maths and logic functions + @{" Pen colour, setting " Link "BuiltIns.guide/Graphics functions" 49 } Graphics functions + @{" Pen, setting foreground and background colour " Link "BuiltIns.guide/Graphics functions" 35 } Graphics functions + @{" Place-holder, decimal \d " Link "Introduction.guide/Changing the example" 18 } Changing the example + @{" Place-holder, field formatting " Link "BuiltIns.guide/Input and output functions" 37 } Input and output functions + @{" Place-holder, field size " Link "BuiltIns.guide/Input and output functions" 37 } Input and output functions + @{" Place-holders " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Plot a point " Link "BuiltIns.guide/Graphics functions" 16 } Graphics functions + @{" Point, plot " Link "BuiltIns.guide/Graphics functions" 16 } Graphics functions + @{" Pointer " Link "Types.guide/PTR Type" 0 } PTR Type + @{" Pointer (array) and array declaration " Link "Types.guide/Array pointers" 46 } Array pointers + @{" Pointer analogy " Link "Types.guide/Addresses" 10 } Addresses + @{" Pointer diagram " Link "Types.guide/Addresses" 37 } Addresses + @{" Pointer type " Link "Types.guide/PTR Type" 0 } PTR Type + @{" Pointer, array " Link "Types.guide/Array pointers" 0 } Array pointers + @{" Pointer, common use " Link "Types.guide/Extracting data (dereferencing pointers)" 90 } Extracting data (dereferencing pointers) + @{" Pointer, dereference " Link "Types.guide/Extracting data (dereferencing pointers)" 0 } Extracting data (dereferencing pointers) + @{" Pointer, making " Link "Types.guide/Finding addresses (making pointers)" 0 } Finding addresses (making pointers) + @{" Pointer, object " Link "Types.guide/Element selection and element types" 8 } Element selection and element types + @{" Pointer, sharing memory " Link "Appendices.guide/Assignment and Copying" 41 } Assignment and Copying + @{" Poking memory " Link "BuiltIns.guide/Maths and logic functions" 123 } Maths and logic functions + @{" Polymorphism " Link "OOE.guide/Inheritance in E" 147 } Inheritance in E + @{" Potential problems using Assembly " Link "MoreExpressions.guide/Things to watch out for" 0 } Things to watch out for + @{" Pragma file, convert to module " Link "Modules.guide/Non-Standard Modules" 0 } Non-Standard Modules + @{" Precedence, operators " Link "Introduction.guide/Precedence and grouping" 0 } Precedence and grouping + @{" Printing characters " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Printing decimal numbers " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Printing hexadecimal numbers " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Printing numbers " Link "Introduction.guide/Changing the example" 18 } Changing the example + @{" Printing strings " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Printing text " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" Printing to an E-string " Link "BuiltIns.guide/Input and output functions" 90 } Input and output functions + @{" Private, object elements " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" Problems, common " Link "Appendices.guide/main" 0 } Common Problems + @{" PROC..OF, method " Link "OOE.guide/Methods in E" 0 } Methods in E + @{" Procedure " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Procedure argument " Link "Introduction.guide/Parameters" 0 } Parameters + @{" Procedure parameter " Link "Introduction.guide/Parameters" 0 } Parameters + @{" Procedure parameter local variables " Link "Introduction.guide/Global and local variables" 62 } Global and local variables + @{" Procedure parameter types " Link "Types.guide/Procedure parameters" 0 } Procedure parameters + @{" Procedure parameter variable " Link "Introduction.guide/Global and local variables" 0 } Global and local variables + @{" Procedure parameter, array " Link "Types.guide/Array procedure parameters" 0 } Array procedure parameters + @{" Procedure parameter, default " Link "Procedures.guide/Default Arguments" 0 } Default Arguments + @{" Procedure with parameters, definition " Link "Introduction.guide/Global and local variables" 62 } Global and local variables + @{" Procedure, calling " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Procedure, calling " Link "Introduction.guide/Procedure Execution" 0 } Procedure Execution + @{" Procedure, definition " Link "Introduction.guide/Procedure Definition" 0 } Procedure Definition + @{" Procedure, early termination " Link "Procedures.guide/Functions" 32 } Functions + @{" Procedure, exception handler " Link "Exceptions.guide/Procedures with Exception Handlers" 0 } Procedures with Exception Handlers + @{" Procedure, execution " Link "Introduction.guide/Procedure Execution" 0 } Procedure Execution + @{" Procedure, inlining " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Procedure, recent " Link "Exceptions.guide/Raising an Exception" 87 } Raising an Exception + @{" Procedure, return value " Link "Procedures.guide/Functions" 0 } Functions + @{" Procedure, reuse " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Procedure, running " Link "Introduction.guide/Procedure Execution" 0 } Procedure Execution + @{" Procedure, running " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Procedure, style " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Procedure, use in Assembly " Link "MoreExpressions.guide/Assembly and the E language" 28 } Assembly and the E language + @{" Program flow control " Link "Introduction.guide/Program Flow Control" 0 } Program Flow Control + @{" Program termination " Link "BuiltIns.guide/System support functions" 65 } System support functions + @{" Program, finish " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Program, running " Link "Introduction.guide/Execution" 0 } Execution + @{" Program, start " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Pseudo-random number " Link "BuiltIns.guide/Maths and logic functions" 84 } Maths and logic functions + @{" Public, object elements " Link "OOE.guide/Data-Hiding in E" 0 } Data-Hiding in E + @{" qual part of Intuition message " Link "BuiltIns.guide/Intuition support functions" 321 } Intuition support functions + @{" Quick random number " Link "BuiltIns.guide/Maths and logic functions" 93 } Maths and logic functions + @{" Quotable expressions " Link "MoreExpressions.guide/Quotable expressions" 0 } Quotable expressions + @{" Quoted expression " Link "MoreExpressions.guide/Quoted Expressions" 0 } Quoted Expressions + @{" Quoted expression, evaluation " Link "MoreExpressions.guide/Evaluation" 0 } Evaluation + @{" Quoted expression, for all list elements " Link "MoreExpressions.guide/Lists and quoted expressions" 29 } Lists and quoted expressions + @{" Quoted expression, local variables " Link "MoreExpressions.guide/Quotable expressions" 0 } Quotable expressions + @{" Quoted expression, mapping over a list " Link "MoreExpressions.guide/Lists and quoted expressions" 8 } Lists and quoted expressions + @{" Quoted expression, there exists a list element " Link "MoreExpressions.guide/Lists and quoted expressions" 46 } Lists and quoted expressions + @{" Quoted expressions and lists " Link "MoreExpressions.guide/Lists and quoted expressions" 0 } Lists and quoted expressions + @{" Raising an exception " Link "Exceptions.guide/Raising an Exception" 0 } Raising an Exception + @{" Raising an exception from a handler " Link "Exceptions.guide/Raise within an Exception Handler" 0 } Raise within an Exception Handler + @{" Raising to a power " Link "FloatingPoint.guide/Floating-Point Functions" 66 } Floating-Point Functions + @{" Random number " Link "BuiltIns.guide/Maths and logic functions" 84 } Maths and logic functions + @{" Random number, quick " Link "BuiltIns.guide/Maths and logic functions" 93 } Maths and logic functions + @{" Range of floating-point numbers " Link "FloatingPoint.guide/Accuracy and Range" 0 } Accuracy and Range + @{" ReadArgs, using " Link "Examples.guide/AmigaDOS 2.0 (and above)" 0 } AmigaDOS 2.0 (and above) + @{" Reading a character from a file " Link "BuiltIns.guide/Input and output functions" 109 } Input and output functions + @{" Reading a string from a file " Link "BuiltIns.guide/Input and output functions" 114 } Input and output functions + @{" Reading from memory " Link "BuiltIns.guide/Maths and logic functions" 116 } Maths and logic functions + @{" Reading, further " Link "Appendices.guide/Further Reading" 0 } Further Reading + @{" Real number " Link "FloatingPoint.guide/main" 0 } Floating-Point Numbers + @{" Recent procedure " Link "Exceptions.guide/Raising an Exception" 87 } Raising an Exception + @{" Recursion " Link "Recursion.guide/main" 0 } Recursion + @{" Recursion example " Link "Examples.guide/Recursion Example" 0 } Recursion Example + @{" Recursion, mutual " Link "Recursion.guide/Mutual Recursion" 0 } Mutual Recursion + @{" Recursive case " Link "Recursion.guide/Factorial Example" 44 } Factorial Example + @{" Recursive exception handling " Link "Recursion.guide/Stack and Exceptions" 9 } Stack and Exceptions + @{" Recursive function " Link "Recursion.guide/main" 0 } Recursion + @{" Recursive type " Link "Recursion.guide/main" 0 } Recursion + @{" Registers, A4 and A5 " Link "MoreExpressions.guide/Things to watch out for" 11 } Things to watch out for + @{" Regular return value " Link "Procedures.guide/Multiple Return Values" 32 } Multiple Return Values + @{" Remainder " Link "BuiltIns.guide/Maths and logic functions" 70 } Maths and logic functions + @{" REPEAT..UNTIL loop " Link "Introduction.guide/REPEAT..UNTIL loop" 0 } REPEAT..UNTIL loop + @{" REPEAT..UNTIL loop check " Link "Introduction.guide/REPEAT..UNTIL loop" 18 } REPEAT..UNTIL loop + @{" REPEAT..UNTIL loop version of a FOR loop " Link "Introduction.guide/REPEAT..UNTIL loop" 17 } REPEAT..UNTIL loop + @{" Repeated execution " Link "Introduction.guide/Loops" 0 } Loops + @{" Resolution flags " Link "BuiltIns.guide/Intuition support functions" 171 } Intuition support functions + @{" Return value of a function " Link "Procedures.guide/Functions" 0 } Functions + @{" Return value, optional " Link "Procedures.guide/Multiple Return Values" 32 } Multiple Return Values + @{" Return value, regular " Link "Procedures.guide/Multiple Return Values" 32 } Multiple Return Values + @{" Return values, multiple " Link "Procedures.guide/Multiple Return Values" 0 } Multiple Return Values + @{" Reusing code " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Reusing procedures " Link "Introduction.guide/Style Reuse and Readability" 0 } Style Reuse and Readability + @{" Revision, Kickstart " Link "BuiltIns.guide/System support functions" 84 } System support functions + @{" Rewriting a FOR loop as a REPEAT..UNTIL loop " Link "Introduction.guide/REPEAT..UNTIL loop" 17 } REPEAT..UNTIL loop + @{" Rewriting a FOR loop as a WHILE loop " Link "Introduction.guide/WHILE loop" 17 } WHILE loop + @{" Rewriting SELECT block as IF block " Link "Introduction.guide/SELECT block" 23 } SELECT block + @{" Rewriting SELECT..OF block as IF block " Link "Introduction.guide/SELECT..OF block" 71 } SELECT..OF block + @{" Right shift " Link "BuiltIns.guide/Maths and logic functions" 108 } Maths and logic functions + @{" Right-hand copy of an E-string " Link "Types.guide/String functions" 136 } String functions + @{" Right-justify field " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + @{" Root " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Rounding a floating-point value " Link "FloatingPoint.guide/Floating-Point Functions" 59 } Floating-Point Functions + @{" Rules, format and layout " Link "Format.guide/main" 0 } Format and Layout + @{" Running a method " Link "OOE.guide/Methods in E" 28 } Methods in E + @{" Running a procedure " Link "Introduction.guide/Procedures" 0 } Procedures + @{" Running a program " Link "Introduction.guide/Execution" 0 } Execution + @{" Safe manipulation " Link "Types.guide/LIST and STRING Types" 0 } LIST and STRING Types + @{" Same names of local variables " Link "Introduction.guide/Global and local variables" 32 } Global and local variables + @{" Screen example, with handler " Link "Examples.guide/Screens" 71 } Screens + @{" Screen example, without handler " Link "Examples.guide/Screens" 0 } Screens + @{" Screen resolution flags " Link "BuiltIns.guide/Intuition support functions" 171 } Intuition support functions + @{" Screen, close " Link "BuiltIns.guide/Intuition support functions" 178 } Intuition support functions + @{" Screen, open " Link "BuiltIns.guide/Intuition support functions" 129 } Intuition support functions + @{" Seed of a random sequence " Link "BuiltIns.guide/Maths and logic functions" 93 } Maths and logic functions + @{" SELECT block " Link "Introduction.guide/SELECT block" 0 } SELECT block + @{" SELECT block, rewriting as IF block " Link "Introduction.guide/SELECT block" 23 } SELECT block + @{" SELECT..OF block " Link "Introduction.guide/SELECT..OF block" 0 } SELECT..OF block + @{" SELECT..OF block, rewriting as IF block " Link "Introduction.guide/SELECT..OF block" 71 } SELECT..OF block + @{" SELECT..OF block, speed versus size " Link "Introduction.guide/SELECT..OF block" 90 } SELECT..OF block + @{" Selecting an element of a normal list " Link "Types.guide/List functions" 65 } List functions + @{" Selecting an element of an object " Link "Types.guide/Element selection and element types" 0 } Element selection and element types + @{" Selection, use of ++ and - " Link "Types.guide/Element selection and element types" 44 } Element selection and element types + @{" self, method local variable " Link "OOE.guide/Methods in E" 67 } Methods in E + @{" Separators " Link "Format.guide/Spacing and Separators" 0 } Spacing and Separators + @{" Sequencing expressions " Link "MoreExpressions.guide/BUT expression" 0 } BUT expression + @{" Sequential composition " Link "Format.guide/Statements" 18 } Statements + @{" Set " Link "Constants.guide/Sets" 0 } Sets + @{" Set length of an E-string " Link "Types.guide/String functions" 178 } String functions + @{" Setting foreground and background pen colours " Link "BuiltIns.guide/Graphics functions" 35 } Graphics functions + @{" Setting pen colours " Link "BuiltIns.guide/Graphics functions" 49 } Graphics functions + @{" Setting stdin " Link "BuiltIns.guide/Input and output functions" 161 } Input and output functions + @{" Setting stdout " Link "BuiltIns.guide/Input and output functions" 170 } Input and output functions + @{" Setting stdrast " Link "BuiltIns.guide/Graphics functions" 58 } Graphics functions + @{" Setting the length of an E-list " Link "Types.guide/List functions" 62 } List functions + @{" Setting Topaz font " Link "BuiltIns.guide/Graphics functions" 67 } Graphics functions + @{" Sharing memory " Link "Appendices.guide/Assignment and Copying" 41 } Assignment and Copying + @{" Shift left " Link "BuiltIns.guide/Maths and logic functions" 100 } Maths and logic functions + @{" Shift right " Link "BuiltIns.guide/Maths and logic functions" 108 } Maths and logic functions + @{" Short-hand for first element of an array " Link "Types.guide/Accessing array data" 55 } Accessing array data + @{" Show module contents " Link "Modules.guide/Using Modules" 19 } Using Modules + @{" Side-effects " Link "MoreExpressions.guide/Side-effects" 0 } Side-effects + @{" Sign of a number " Link "BuiltIns.guide/Maths and logic functions" 36 } Maths and logic functions + @{" Signed and unsigned values " Link "Appendices.guide/Signed and Unsigned Values" 0 } Signed and Unsigned Values + @{" Sine function " Link "FloatingPoint.guide/Floating-Point Functions" 51 } Floating-Point Functions + @{" Singly linked list " Link "Types.guide/Linked Lists" 64 } Linked Lists + @{" Size of an array " Link "Types.guide/Tables of data" 0 } Tables of data + @{" Size of an object " Link "MoreExpressions.guide/SIZEOF expression" 0 } SIZEOF expression + @{" Size versus speed, SELECT..OF block " Link "Introduction.guide/SELECT..OF block" 90 } SELECT..OF block + @{" Spacing " Link "Format.guide/Spacing and Separators" 0 } Spacing and Separators + @{" Special character sequences " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Speed versus size, SELECT..OF block " Link "Introduction.guide/SELECT..OF block" 90 } SELECT..OF block + @{" Splitting a string over several lines " Link "Format.guide/Statements" 58 } Statements + @{" Splitting statements over several lines " Link "Format.guide/Statements" 30 } Statements + @{" Square root " Link "FloatingPoint.guide/Floating-Point Functions" 63 } Floating-Point Functions + @{" Stack and crashing " Link "Recursion.guide/Stack (and Crashing)" 0 } Stack (and Crashing) + @{" Stack and exceptions " Link "Recursion.guide/Stack and Exceptions" 0 } Stack and Exceptions + @{" Stack space, free " Link "BuiltIns.guide/System support functions" 79 } System support functions + @{" Stack, avoiding crashes " Link "Recursion.guide/Stack (and Crashing)" 21 } Stack (and Crashing) + @{" State of mouse buttons " Link "BuiltIns.guide/Intuition support functions" 235 } Intuition support functions + @{" Statement " Link "Format.guide/Statements" 0 } Statements + @{" Statement, Assembly " Link "MoreExpressions.guide/Assembly Statements" 0 } Assembly Statements + @{" Statement, breaking " Link "Format.guide/Statements" 30 } Statements + @{" Statement, conversion from an expression " Link "MoreExpressions.guide/Turning an Expression into a Statement" 0 } Turning an Expression into a Statement + @{" Statement, several on one line " Link "Format.guide/Statements" 18 } Statements + @{" Statement, splitting " Link "Format.guide/Statements" 30 } Statements + @{" Static data " Link "Types.guide/Static data" 0 } Static data + @{" Static data, potential problems " Link "Types.guide/Static data" 22 } Static data + @{" Static memory allocation " Link "Memory.guide/Static Allocation" 0 } Static Allocation + @{" Static memory, use in Assembly " Link "MoreExpressions.guide/Static memory" 0 } Static memory + @{" stdin, setting " Link "BuiltIns.guide/Input and output functions" 161 } Input and output functions + @{" stdout, setting " Link "BuiltIns.guide/Input and output functions" 170 } Input and output functions + @{" stdrast, setting " Link "BuiltIns.guide/Graphics functions" 58 } Graphics functions + @{" String " Link "Introduction.guide/Strings" 0 } Strings + @{" String " Link "Types.guide/Normal strings and E-strings" 0 } Normal strings and E-strings + @{" String diagram " Link "Types.guide/Normal strings and E-strings" 38 } Normal strings and E-strings + @{" String functions " Link "Types.guide/String functions" 0 } String functions + @{" String handling example " Link "Examples.guide/String Handling and I-O" 0 } String Handling and I-O + @{" String handling example, with handler " Link "Examples.guide/String Handling and I-O" 307 } String Handling and I-O + @{" STRING type " Link "Types.guide/Normal strings and E-strings" 49 } Normal strings and E-strings + @{" String, append " Link "Types.guide/String functions" 99 } String functions + @{" String, breaking " Link "Format.guide/Statements" 58 } Statements + @{" String, comparison " Link "Types.guide/String functions" 40 } String functions + @{" String, constant " Link "Types.guide/Normal strings and E-strings" 0 } Normal strings and E-strings + @{" String, converting to floating-point number " Link "FloatingPoint.guide/Floating-Point Functions" 10 } Floating-Point Functions + @{" String, converting to numbers " Link "Types.guide/String functions" 199 } String functions + @{" String, copying " Link "Types.guide/String functions" 58 } String functions + @{" String, find sub-string " Link "Types.guide/String functions" 156 } String functions + @{" String, length " Link "Types.guide/String functions" 108 } String functions + @{" String, lowercase " Link "Types.guide/String functions" 169 } String functions + @{" String, middle copy " Link "Types.guide/String functions" 144 } String functions + @{" String, printing " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" String, right-hand copy " Link "Types.guide/String functions" 136 } String functions + @{" String, special character sequence " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" String, splitting " Link "Format.guide/Statements" 58 } Statements + @{" String, trim leading whitespace " Link "Types.guide/String functions" 161 } String functions + @{" String, uppercase " Link "Types.guide/String functions" 174 } String functions + @{" Structure " Link "Types.guide/OBJECT Type" 0 } OBJECT Type + @{" Sub-string location in a string " Link "Types.guide/String functions" 156 } String functions + @{" Subtraction " Link "Introduction.guide/Mathematics" 0 } Mathematics + @{" Successful, zero exception " Link "Exceptions.guide/Raising an Exception" 73 } Raising an Exception + @{" Summary of Part One " Link "Introduction.guide/Summary" 0 } Summary + @{" Super class " Link "OOE.guide/Inheritance in E" 161 } Inheritance in E + @{" SUPER, operator " Link "OOE.guide/Inheritance in E" 110 } Inheritance in E + @{" System function, calling from Assembly " Link "MoreExpressions.guide/Assembly and the E language" 39 } Assembly and the E language + @{" System module " Link "Modules.guide/Amiga System Modules" 0 } Amiga System Modules + @{" System objects " Link "Types.guide/Amiga system objects" 0 } Amiga system objects + @{" System support functions " Link "BuiltIns.guide/System support functions" 0 } System support functions + @{" System variables " Link "BuiltIns.guide/Built-In Variables" 0 } Built-In Variables + @{" Tab character " Link "Constants.guide/String Constants Special Character Sequences" 0 } String Constants Special Character Sequences + @{" Table of data " Link "Types.guide/Tables of data" 0 } Tables of data + @{" Tag list " Link "Types.guide/Lists and E-lists" 42 } Lists and E-lists + @{" Tail of a linked list " Link "Types.guide/Linked Lists" 23 } Linked Lists + @{" Tangent function " Link "FloatingPoint.guide/Floating-Point Functions" 51 } Floating-Point Functions + @{" Terminating loops " Link "Introduction.guide/WHILE loop" 61 } WHILE loop + @{" Termination, program " Link "BuiltIns.guide/System support functions" 65 } System support functions + @{" Test for control-C " Link "BuiltIns.guide/System support functions" 74 } System support functions + @{" Test for even number " Link "BuiltIns.guide/Maths and logic functions" 41 } Maths and logic functions + @{" Test for odd number " Link "BuiltIns.guide/Maths and logic functions" 45 } Maths and logic functions + @{" Text drawing " Link "BuiltIns.guide/Graphics functions" 42 } Graphics functions + @{" Text, printing " Link "BuiltIns.guide/Input and output functions" 0 } Input and output functions + @{" There exists a list element " Link "MoreExpressions.guide/Lists and quoted expressions" 46 } Lists and quoted expressions + @{" Throwing an exception " Link "Exceptions.guide/Raising an Exception" 0 } Raising an Exception + @{" Timing expressions example " Link "Examples.guide/Timing Expressions" 0 } Timing Expressions + @{" Tinkering " Link "Introduction.guide/Tinkering with the example" 0 } Tinkering with the example + @{" Topaz, setting font " Link "BuiltIns.guide/Graphics functions" 67 } Graphics functions + @{" Tree, binary " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Tree, branch " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Tree, leaf " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Tree, node " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Tree, root " Link "Recursion.guide/Binary Trees" 0 } Binary Trees + @{" Trigonometry functions " Link "FloatingPoint.guide/Floating-Point Functions" 51 } Floating-Point Functions + @{" Trim leading whitespace from a string " Link "Types.guide/String functions" 161 } String functions + @{" Trouble-shooting " Link "Appendices.guide/main" 0 } Common Problems + @{" Truth values as numbers " Link "Introduction.guide/Logic and comparison" 36 } Logic and comparison + @{" Turn an expression into a statement " Link "MoreExpressions.guide/Turning an Expression into a Statement" 0 } Turning an Expression into a Statement + @{" Type " Link "Types.guide/main" 0 } Types + @{" Type of a variable " Link "Introduction.guide/Variable types" 0 } Variable types + @{" Type, 16-bit " Link "Types.guide/Indirect types" 0 } Indirect types + @{" Type, 32-bit " Link "Types.guide/Default type" 0 } Default type + @{" Type, 8-bit " Link "Types.guide/Indirect types" 0 } Indirect types + @{" Type, address " Link "Types.guide/Addresses" 0 } Addresses + @{" Type, array " Link "Types.guide/Tables of data" 0 } Tables of data + @{" Type, complex " Link "Types.guide/Complex types" 0 } Complex types + @{" Type, default " Link "Types.guide/Default type" 0 } Default type + @{" Type, direct " Link "Types.guide/Indirect types" 21 } Indirect types + @{" Type, dynamic " Link "OOE.guide/Inheritance in E" 147 } Inheritance in E + @{" Type, E-list " Link "Types.guide/Lists and E-lists" 0 } Lists and E-lists + @{" Type, indirect " Link "Types.guide/Indirect types" 0 } Indirect types + @{" Type, list " Link "Types.guide/Lists and E-lists" 0 } Lists and E-lists + @{" Type, LONG " Link "Types.guide/LONG Type" 0 } LONG Type + @{" Type, LONG (definition) " Link "Types.guide/Indirect types" 21 } Indirect types + @{" Type, object " Link "Types.guide/OBJECT Type" 0 } OBJECT Type + @{" Type, object elements " Link "Types.guide/Element selection and element types" 13 } Element selection and element types + @{" Type, pointer " Link "Types.guide/PTR Type" 0 } PTR Type + @{" Type, procedure parameters " Link "Types.guide/Procedure parameters" 0 } Procedure parameters + @{" Type, recursive " Link "Recursion.guide/main" 0 } Recursion + @{" Type, STRING " Link "Types.guide/Normal strings and E-strings" 49 } Normal strings and E-strings + @{" Type, variable declaration " Link "Types.guide/Default type" 15 } Default type + @{" Typed list " Link "Types.guide/Typed lists" 0 } Typed lists + @{" Unification " Link "MoreExpressions.guide/Unification" 0 } Unification + @{" Unsigned and signed values " Link "Appendices.guide/Signed and Unsigned Values" 0 } Signed and Unsigned Values + @{" Uppercase a string " Link "Types.guide/String functions" 174 } String functions + @{" Using a module " Link "Modules.guide/Using Modules" 0 } Using Modules + @{" Using arg " Link "Examples.guide/Any AmigaDOS" 0 } Any AmigaDOS + @{" Using modules, example " Link "Modules.guide/Example Module Use" 0 } Example Module Use + @{" Using ReadArgs " Link "Examples.guide/AmigaDOS 2.0 (and above)" 0 } AmigaDOS 2.0 (and above) + @{" Using wbmessage " Link "Examples.guide/Any AmigaDOS" 0 } Any AmigaDOS + @{" van Oortmerssen, Wouter " Link "Appendices.guide/Amiga E Author" 0 } Amiga E Author + @{" Variable " Link "Introduction.guide/Variables and Expressions" 0 } Variables and Expressions + @{" Variable initialisation and automatic exceptions " Link "Exceptions.guide/Raise within an Exception Handler" 54 } Raise within an Exception Handler + @{" Variable type " Link "Types.guide/Default type" 15 } Default type + @{" Variable, built-in " Link "BuiltIns.guide/Built-In Variables" 0 } Built-In Variables + @{" Variable, changing value " Link "Introduction.guide/Assignment" 0 } Assignment + @{" Variable, declaration " Link "Introduction.guide/Variable declaration" 0 } Variable declaration + @{" Variable, decrement " Link "MoreExpressions.guide/INC and DEC statements" 0 } INC and DEC statements + @{" Variable, global " Link "Introduction.guide/Global and local variables" 0 } Global and local variables + @{" Variable, increment " Link "MoreExpressions.guide/INC and DEC statements" 0 } INC and DEC statements + @{" Variable, initialisation " Link "Introduction.guide/Global and local variables" 109 } Global and local variables + @{" Variable, local " Link "Introduction.guide/Global and local variables" 0 } Global and local variables + @{" Variable, procedure parameter " Link "Introduction.guide/Global and local variables" 0 } Global and local variables + @{" Variable, same global and local names " Link "Introduction.guide/Global and local variables" 57 } Global and local variables + @{" Variable, same local names " Link "Introduction.guide/Global and local variables" 32 } Global and local variables + @{" Variable, system " Link "BuiltIns.guide/Built-In Variables" 0 } Built-In Variables + @{" Variable, type " Link "Introduction.guide/Variable types" 0 } Variable types + @{" Variable, use in Assembly statements " Link "MoreExpressions.guide/Assembly and the E language" 0 } Assembly and the E language + @{" Version, Kickstart " Link "BuiltIns.guide/System support functions" 84 } System support functions + @{" Vertical FOR loop " Link "Introduction.guide/FOR loop" 0 } FOR loop + @{" Vertical IF block " Link "Introduction.guide/IF block" 0 } IF block + @{" Vertical WHILE loop " Link "Introduction.guide/WHILE loop" 0 } WHILE loop + @{" View module contents " Link "Modules.guide/Using Modules" 19 } Using Modules + @{" Voiding an expression " Link "MoreExpressions.guide/Turning an Expression into a Statement" 0 } Turning an Expression into a Statement + @{" Voiding, automatic " Link "MoreExpressions.guide/Turning an Expression into a Statement" 20 } Turning an Expression into a Statement + @{" Wait for left mouse button click " Link "BuiltIns.guide/Intuition support functions" 324 } Intuition support functions + @{" Waiting for Intuition messages " Link "BuiltIns.guide/Intuition support functions" 282 } Intuition support functions + @{" wbmessage, using " Link "Examples.guide/Any AmigaDOS" 0 } Any AmigaDOS + @{" WHILE loop " Link "Introduction.guide/WHILE loop" 0 } WHILE loop + @{" WHILE loop check " Link "Introduction.guide/WHILE loop" 22 } WHILE loop + @{" WHILE loop version of a FOR loop " Link "Introduction.guide/WHILE loop" 17 } WHILE loop + @{" Whitespace " Link "Format.guide/Spacing and Separators" 0 } Spacing and Separators + @{" Whitespace, trim from a string " Link "Types.guide/String functions" 161 } String functions + @{" Window flags " Link "BuiltIns.guide/Intuition support functions" 89 } Intuition support functions + @{" Window, close " Link "BuiltIns.guide/Intuition support functions" 122 } Intuition support functions + @{" Window, open " Link "BuiltIns.guide/Intuition support functions" 16 } Intuition support functions + @{" Window, output " Link "BuiltIns.guide/Built-In Variables" 34 } Built-In Variables + @{" Wouter van Oortmerssen " Link "Appendices.guide/Amiga E Author" 0 } Amiga E Author + @{" Writing a character to file " Link "BuiltIns.guide/Input and output functions" 99 } Input and output functions + @{" Writing to memory " Link "BuiltIns.guide/Maths and logic functions" 123 } Maths and logic functions + @{" X-coordinate, mouse " Link "BuiltIns.guide/Intuition support functions" 259 } Intuition support functions + @{" Y-coordinate, mouse " Link "BuiltIns.guide/Intuition support functions" 266 } Intuition support functions + @{" Zero exception (success) " Link "Exceptions.guide/Raising an Exception" 73 } Raising an Exception + @{" Zero fill field " Link "BuiltIns.guide/Input and output functions" 54 } Input and output functions + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Index.guide.info b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Index.guide.info new file mode 100644 index 0000000000000000000000000000000000000000..1e5b05b239bc396e5bca9e04be29008a3920877c GIT binary patch literal 1814 zcmaDXz`)1=0+Shp7z`Oq8Q2(@85k=pPIpvToD~4eAQOx%3>6laPgL;eZD;_BgD?U> zl^ZgcFfcLj6rEs3Na1Di|A9!?|8D>>82|r&0HT@y|Nj7@+5i9l0iyZ;{|76S|Ns9V zh;RS@|9@n<9>{M13Lt2EF#rEQ`Tqxi;&A#8KZwuxA4oqyrh)pwd~#`sH-P2>Ed!g2 zPJ``b0NHy0Cj{z3G zV9qEp6hi=-r(S0em#2V90GxJcKpy}FAJAN4X>e`;xdW6dXh0L|4wyQcgbUDXqhM%- gfJAU)uvKYEW=>{FW@@p%Z)r|RW?5!xImj0*0C=2ZbN~PV literal 0 HcmV?d00001 diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Introduction.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Introduction.guide new file mode 100644 index 0000000..e3f61e4 --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Introduction.guide @@ -0,0 +1,1681 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Introduction to Amiga E" +@Next "Understanding a Simple Program" +@Prev "Contents.guide/main" +@Toc "Contents.guide/main" + +Introduction to Amiga E +*********************** + + To interact with your Amiga you need to speak a language it understands. +Luckily, there is a wide choice of such languages, each of which fits a +particular need. For instance, BASIC (in most of its flavours) is simple +and easy to learn, and so is ideal for beginners. Assembly, on the other +hand, requires a lot of effort and is quite tedious, but can produce the +fastest programs so is generally used by commercial programmers. These +are two extremes and most businesses and colleges use C or +Pascal/Modula-2, which try to strike a balance between simplicity and +speed. + + E programs look very much like Pascal or Modula-2 programs, but E is +based more closely on C. Anyone familiar with these languages will easily +learn E, only really needing to get to grips with E's unique features and +those borrowed from other languages. This guide is aimed at people who +haven't done much programming and may be too trivial for competent +programmers, who should find the `E Reference Manual' more than adequate +(although some of the later sections offer different explanations to the +`Reference Manual', which may prove useful). + + Part One (this part) goes through some of the basics of the E language +and programming in general. Part Two delves deeper into E, covering the +more complex topics and the unique features of E. Part Three goes through +a few example programs, which are a bit longer than the examples in the +other Parts. Finally, Part Four contains the Appendices, which is where +you'll find some other, miscellaneous information. + + + @{" A Simple Program " Link "A Simple Program" } + + +@ENDNODE + +@NODE "A Simple Program" "A Simple Program" +@Toc "main" + +A Simple Program +================ + + If you're still reading you're probably desperate to do some +programming in E but you don't know how to start. We'll therefore jump +straight in the deep end with a small example. You'll need to know two +things before we start: how to use a text editor and the Shell/CLI. + + + @{" The code " Link "The code" } + @{" Compilation " Link "Compilation" } + @{" Execution " Link "Execution" } + + +@ENDNODE + +@NODE "The code" "The code" +@Next "Compilation" +@Toc "A Simple Program" + +The code +-------- + + Enter the following lines of code into a text editor and save it as the +file @{b }simple.e@{ub } (taking care to copy each line accurately). (Just type the +characters shown, and at the end of each line press the RETURN or ENTER +key.) + + PROC main() + WriteF('My first program') + ENDPROC + +Don't try to do anything different to the code, yet: the case of the +letters in each word is significant and the funny characters are important. +If you're a real beginner you might have difficulty finding the ' +character. On my GB keyboard it's on the big key in the top left-hand +corner directly below the ESC key. On a US and most European keyboards +it's two to the right of the L key, next to the ; key. (If you don't have +your keyboard set up properly then you find that keys don't produce the +same characters that are printed on them--especially when use use the +shift key. In this case it will probably behave like a US keyboard, +although you should really fix this and set it up properly--see the +manuals that came with your Amiga.) + + +@ENDNODE + +@NODE "Compilation" "Compilation" +@Next "Execution" +@Prev "The code" +@Toc "A Simple Program" + +Compilation +----------- + + Once the file is saved (preferably in the RAM disk, since it's only a +small program), you can use the E compiler to turn it into an executable +program. All you need is the file @{b }ec@{ub } in your @{b }C:@{ub } directory or somewhere +else on your search path (advanced users note: we don't need the @{b }Emodules:@{ub } +assignment because we aren't using any modules). Assuming you have this +and you have a Shell/CLI running, enter the following at the prompt after +changing directory to where you saved your new file: + + ec simple + +If all's well you should be greeted, briefly, by the E compiler. If +anything went wrong then double-check the contents of the file @{b }simple.e@{ub }, +that your CLI is in the same directory as this file, and that the program +@{b }ec@{ub } is in your @{b }C:@{ub } directory (or on your search path). + + +@ENDNODE + +@NODE "Execution" "Execution" +@Prev "Compilation" +@Toc "A Simple Program" + +Execution +--------- + + Once everything is working you can run your first program by entering +the following at the CLI prompt: + + simple + + As a help here's the complete transcript of the whole compilation and +execution process (the CLI prompt, below, is the bit of text beginning +with @{b }1.@{ub } and ending in @{b }>@{ub }): + + 1.System3.0:> cd ram: + 1.Ram Disk:> ec simple + Amiga E Compiler/Assembler/Linker/PP v3.2e registered (c) '91-95 Wouter + lexical analysing ... + parsing and compiling ... + no errors + 1.Ram Disk:> simple + My first program1.Ram Disk:> + +Your display should be something similar if it's all worked. Notice how +the output from the program runs into the prompt (the last line). We'll +fix this soon. + + +@ENDNODE + +@NODE "Understanding a Simple Program" "Understanding a Simple Program" +@Next "Variables and Expressions" +@Prev "main" +@Toc "Contents.guide/main" + +Understanding a Simple Program +****************************** + + To understand the example program we need to understand quite a few +things. The observant amongst you will have noticed that all it does is +print out a message, and that message was part of a line we wrote in the +program. The first thing to do is see how to change this message. + + + @{" Changing the Message " Link "Changing the Message" } + @{" Procedures " Link "Procedures" } + @{" Parameters " Link "Parameters" } + @{" Strings " Link "Strings" } + @{" Style Reuse and Readability " Link "Style Reuse and Readability" } + @{" The Simple Program " Link "The Simple Program" } + + +@ENDNODE + +@NODE "Changing the Message" "Changing the Message" +@Next "Procedures" +@Toc "Understanding a Simple Program" + +Changing the Message +==================== + + Edit the file so that line contains a different message between the two +' characters and compile it again using the same procedure as before. +Don't use any ' characters except those around the message. If all went +well, when you run the program again it should produce a different message. +If something went wrong, compare the contents of your file with the +original and make sure the only difference is the message between the ' +characters. + + + @{" Tinkering with the example " Link "Tinkering with the example" } + @{" Brief overview " Link "Brief overview" } + + +@ENDNODE + +@NODE "Tinkering with the example" "Tinkering with the example" +@Next "Brief overview" +@Toc "Changing the Message" + +Tinkering with the example +-------------------------- + + Simple tinkering is a good way to learn for yourself so it is +encouraged on these simple examples. Don't stray too far, though, and if +you start getting confused return to the proper example pretty sharpish! + + +@ENDNODE + +@NODE "Brief overview" "Brief overview" +@Prev "Tinkering with the example" +@Toc "Changing the Message" + +Brief overview +-------------- + + We'll look in detail at the important parts of the program in the +following sections, but we need first to get a glimpse of the whole +picture. Here's a brief description of some fundamental concepts: + + @{b }*@{ub } @{i }Procedures:@{ui } We defined a procedure called @{b }main@{ub } and used the + (built-in) procedure @{b }WriteF@{ub }. A procedure can be thought of as a + small program with a name. + + @{b }*@{ub } @{i }Parameters:@{ui } The message in parentheses after @{b }WriteF@{ub } in our + program is the parameter to @{b }WriteF@{ub }. This is the data which the + procedure should use. + + @{b }*@{ub } @{i }Strings:@{ui } The message we passed to @{b }WriteF@{ub } was a series of + characters enclosed in ' characters. This is known as a @{fg shine }string@{fg text }. + + +@ENDNODE + +@NODE "Procedures" "Procedures" +@Next "Parameters" +@Prev "Changing the Message" +@Toc "Understanding a Simple Program" + +Procedures +========== + + As mentioned above, a procedure can be thought of as a small program +with a name. In fact, when an E program is run the procedure called @{b }main@{ub } +is executed. Therefore, if your E program is going to do anything you +must define a @{b }main@{ub } procedure. Other (built-in or user-defined) procedures +may be run (or @{fg shine }called@{fg text }) from this procedure (as we did @{b }WriteF@{ub } in the +example). For instance, if the procedure @{b }fred@{ub } calls the procedure @{b }barney@{ub } +the code (or mini-program) associated with @{b }barney@{ub } is executed. This may +involve calls to other procedures, and when the execution of this code is +complete the next piece of code in the procedure @{b }fred@{ub } is executed (and +this is generally the next line of the procedure). When the end of the +procedure @{b }main@{ub } has been reached the program has finished. However, lots +can happen between the beginning and end of a procedure, and sometimes the +program may never get to finish. Alternatively, the program may @{fg shine }crash@{fg text }, +causing strange things to happen to your computer. + + + @{" Procedure Definition " Link "Procedure Definition" } + @{" Procedure Execution " Link "Procedure Execution" } + @{" Extending the example " Link "Extending the example" } + + +@ENDNODE + +@NODE "Procedure Definition" "Procedure Definition" +@Next "Procedure Execution" +@Toc "Procedures" + +Procedure Definition +-------------------- + + Procedures are defined using the keyword @{b }PROC@{ub }, followed by the new +procedure's name (starting with a lowercase letter), a description of the +parameters it takes (in parentheses), a series of lines forming the code +of the procedure and then the keyword @{b }ENDPROC@{ub }. Look at the example +program again to identify the various parts. See @{"The code" Link "The code" }. + + +@ENDNODE + +@NODE "Procedure Execution" "Procedure Execution" +@Next "Extending the example" +@Prev "Procedure Definition" +@Toc "Procedures" + +Procedure Execution +------------------- + + Procedures can be called (or executed) from within the code part of +another procedure. You do this by giving its name, followed by some data +in parentheses. Look at the call to @{b }WriteF@{ub } in the example program. See +@{"The code" Link "The code" }. + + +@ENDNODE + +@NODE "Extending the example" "Extending the example" +@Prev "Procedure Execution" +@Toc "Procedures" + +Extending the example +--------------------- + + Here's how we could change the example program to define another +procedure: + + PROC main() + WriteF('My first program') + fred() + ENDPROC + + PROC fred() + WriteF('...slightly improved') + ENDPROC + +This may seem complicated, but in fact it's very simple. All we've done +is define a second procedure called @{b }fred@{ub } which is just like the original +program--it outputs a message. We've @{fg shine }called@{fg text } this procedure in the @{b }main@{ub } +procedure just after the line which outputs the original message. +Therefore, the message in @{b }fred@{ub } is output after this message. Compile the +program as before and run it so you don't have to take my word for it. + + +@ENDNODE + +@NODE "Parameters" "Parameters" +@Next "Strings" +@Prev "Procedures" +@Toc "Understanding a Simple Program" + +Parameters +========== + + Generally we want procedures to work with particular data. In our +example we wanted the @{b }WriteF@{ub } procedure to work on a particular message. +We passed the message as a @{fg shine }parameter@{fg text } (or @{fg shine }argument@{fg text }) to @{b }WriteF@{ub } by +putting it between the parentheses (the @{b }(@{ub } and @{b })@{ub } characters) that follow +the procedure name. When we called the @{b }fred@{ub } procedure, however, we did +not require it to use any data so the parentheses were left empty. + + When defining a procedure we define how much and what type of data we +want it to work on, and when calling a procedure we give the specific data +it should use. Notice that the procedure @{b }fred@{ub } (like the procedure @{b }main@{ub }) +has empty parentheses in its definition. This means that the procedure +cannot be given any data as parameters when it is called. Before we can +define our own procedure that takes parameters we must learn about +variables. We'll do this in the next chapter. See +@{"Global and local variables" Link "Global and local variables" }. + + +@ENDNODE + +@NODE "Strings" "Strings" +@Next "Style Reuse and Readability" +@Prev "Parameters" +@Toc "Understanding a Simple Program" + +Strings +======= + + A series of characters between two ' characters is known as a string. +Almost any character can be used in a string, although the \\ and ' +characters have a special meaning. For instance, a linefeed is denoted by +the two characters @{b }\\n@{ub }. We now know how to stop the message running into +the prompt. Change the program to be: + + PROC main() + WriteF('My first program\\n') + fred() + ENDPROC + + PROC fred() + WriteF('...slightly improved\\n') + ENDPROC + +Compile it as before, and run it. You should notice that the messages now +appear on lines by themselves, and the second message is separated from +the prompt which follows it. We have therefore cured the linefeed problem +we spotted earlier (see @{"Execution" Link "Execution" }). + + +@ENDNODE + +@NODE "Style Reuse and Readability" "Style Reuse and Readability" +@Next "The Simple Program" +@Prev "Strings" +@Toc "Understanding a Simple Program" + +Style, Reuse and Readability +============================ + + The example has grown into two procedures, one called @{b }main@{ub } and one +called @{b }fred@{ub }. However, we could get by with only one procedure: + + PROC main() + WriteF('My first program\\n') + WriteF('...slightly improved\\n') + ENDPROC + + What we've done is replace the call to the procedure @{b }fred@{ub } with the code +it represents (this is called @{fg shine }inlining@{fg text } the procedure). In fact, almost +all programs can be easily re-written to eliminate all but the @{b }main@{ub } +procedure. However, splitting a program up using procedures normally +results in more readable code. It is also helpful to name your procedures +so that their function is apparent, so our procedure @{b }fred@{ub } should probably +have been named @{b }message@{ub } or something similar. A well-written program in +this style can read just like English (or any other spoken language). + + Another reason for having procedures is to reuse code, rather than +having to write it out every time you use it. Imagine you wanted to print +the same, long message fairly often in your program--you'd either have to +write it all out every time, or you could write it once in a procedure and +call this procedure when you wanted the message printed. Using a +procedure also has the benefit of having only one copy of the message to +change, should it ever need changing. + + +@ENDNODE + +@NODE "The Simple Program" "The Simple Program" +@Prev "Style Reuse and Readability" +@Toc "Understanding a Simple Program" + +The Simple Program +================== + + The simple program should now (hopefully) seem simple. The only bit +that hasn't been explained is the built-in procedure @{b }WriteF@{ub }. E has many +built-in procedures and later we'll meet some of them in detail. The +first thing we need to do, though, is manipulate data. This is really +what a computer does all the time--it accepts data from some source +(possibly the user), manipulates it in some way (possibly storing it +somewhere, too) and outputs new data (usually to a screen or printer). +The simple example program did all this, except the first two stages were +rather trivial. You told the computer to execute the compiled program +(this was some user input) and the real data (the message to be printed) +was retrieved from the program. This data was manipulated by passing it +as a parameter to @{b }WriteF@{ub }, which then did some clever stuff to print it on +the screen. To do our own manipulation of data we need to learn about +variables and expressions. + + +@ENDNODE + +@NODE "Variables and Expressions" "Variables and Expressions" +@Next "Program Flow Control" +@Prev "Understanding a Simple Program" +@Toc "Contents.guide/main" + +Variables and Expressions +************************* + + Anybody who's done any school algebra will probably know what a +variable is--it's just a named piece of data. In algebra the data is +usually a number, but in E it can be all sorts of things (e.g., a string). +The manipulation of data like the addition of two numbers is known as an +@{fg shine }expression@{fg text }. The result of an expression can be used to build bigger +expressions. For instance, @{b }1+2@{ub } is an expression, and so is @{b }6-(1+2)@{ub }. The +good thing is you can use variables in place of data in expressions, so if +@{b }x@{ub } represents the number 1 and @{b }y@{ub } represents 5, then the expression @{b }y-x@{ub } +represents the number 4. In the next two sections we'll look at what kind +of variables you can define and what the different sorts of expressions +are. + + + @{" Variables " Link "Variables" } + @{" Expressions " Link "Expressions" } + + +@ENDNODE + +@NODE "Variables" "Variables" +@Next "Expressions" +@Toc "Variables and Expressions" + +Variables +========= + + Variables in E can hold many different kinds of data (called @{fg shine }types@{fg text }). +However, before a variable can be used it must be defined, and this is +known as @{fg shine }declaring@{fg text } the variable. A variable declaration also decides +whether the variable is available for the whole program or just during the +code of a procedure (i.e., whether the variable is @{fg shine }global@{fg text } or @{fg shine }local@{fg text }). +Finally, the data stored in a variable can be changed using @{fg shine }assignments@{fg text }. +The following sections discuss these topics in slightly more detail. + + + @{" Variable types " Link "Variable types" } + @{" Variable declaration " Link "Variable declaration" } + @{" Assignment " Link "Assignment" } + @{" Global and local variables " Link "Global and local variables" } + @{" Changing the example " Link "Changing the example" } + + +@ENDNODE + +@NODE "Variable types" "Variable types" +@Next "Variable declaration" +@Toc "Variables" + +Variable types +-------------- + + In E a variable is a storage place for data (and this storage is part +of the Amiga's RAM). Different kinds of data may require different +amounts of storage. However, data can be grouped together in @{fg shine }types@{fg text }, and +two pieces of data from the same type require the same amount of storage. +Every variable has an associated type and this dictates the maximum amount +of storage it uses. Most commonly, variables in E store data from the +type @{b }LONG@{ub }. This type contains the integers from -2,147,483,648 to +2,147,483,647, so is normally more than sufficient. There are other +types, such as @{b }INT@{ub } and @{b }LIST@{ub }, and more complex things to do with types, but +for now knowing about @{b }LONG@{ub } is enough. + + +@ENDNODE + +@NODE "Variable declaration" "Variable declaration" +@Next "Assignment" +@Prev "Variable types" +@Toc "Variables" + +Variable declaration +-------------------- + + Variables must be declared before they can be used. They are declared +using the @{b }DEF@{ub } keyword followed by a (comma-separated) list of the names of +the variables to be declared. These variables will all have type @{b }LONG@{ub } +(later we will see how to declare variables with other types). Some +examples will hopefully make things clearer: + + DEF x + + DEF a, b, c + +The first line declares the single variable @{b }x@{ub }, whilst the second declares +the variables @{b }a@{ub }, @{b }b@{ub } and @{b }c@{ub } all in one go. + + +@ENDNODE + +@NODE "Assignment" "Assignment" +@Next "Global and local variables" +@Prev "Variable declaration" +@Toc "Variables" + +Assignment +---------- + + The data stored by variables can be changed and this is normally done +using @{fg shine }assignments@{fg text }. An assignment is formed using the variable's name +and an expression denoting the new data it is to store. The symbol @{b }:=@{ub } +separates the variable from the expression. For example, the following +code stores the number two in the variable @{b }x@{ub }. The left-hand side of the +@{b }:=@{ub } is the name of the variable to be affected (@{b }x@{ub } in this case) and the +right-hand side is an expression denoting the new value (simply the number +two in this case). + + x := 2 + +The following, more complex example uses the value stored in the variable +before the assignment as part of the expression for the new data. The +value of the expression on the right-hand side of the @{b }:=@{ub } is the value +stored in the variable @{b }x@{ub } plus one. This value is then stored in @{b }x@{ub }, +over-writing the previous data. (So, the overall effect is that @{b }x@{ub } is +incremented.) + + x := x + 1 + +This may be clearer in the next example which does not change the data +stored in @{b }x@{ub }. In fact, this piece of code is just a waste of CPU time, +since all it does is look up the value stored in @{b }x@{ub } and store it back there! + + x := x + + +@ENDNODE + +@NODE "Global and local variables" "Global and local variables" +@Next "Changing the example" +@Prev "Assignment" +@Toc "Variables" + +Global and local variables (and procedure parameters) +----------------------------------------------------- + + There are two kinds of variable: @{fg shine }global@{fg text } and @{fg shine }local@{fg text }. Data stored by +global variables can be read and changed by all procedures, but data +stored by local variables can only be accessed by the procedure to which +they are local. Global variables must be declared before the first +procedure definition. Local variables are declared within the procedure +to which they are local (i.e., between the @{b }PROC@{ub } and @{b }ENDPROC@{ub }). For +example, the following code declares a global variable @{b }w@{ub } and local +variables @{b }x@{ub } and @{b }y@{ub }. + + DEF w + + PROC main() + DEF x + x:=2 + w:=1 + fred() + ENDPROC + + PROC fred() + DEF y + y:=3 + w:=2 + ENDPROC + +The variable @{b }x@{ub } is local to the procedure @{b }main@{ub }, and @{b }y@{ub } is local to @{b }fred@{ub }. +The procedures @{b }main@{ub } and @{b }fred@{ub } can read and alter the value of the global +variable @{b }w@{ub }, but @{b }fred@{ub } cannot read or alter the value of @{b }x@{ub } (since that +variable is local to @{b }main@{ub }). Similarly, @{b }main@{ub } cannot read or alter @{b }y@{ub }. + + The local variables of one procedure are, therefore, completely +different to the local variables of another procedure. For this reason +they can share the same names without confusion. So, in the above +example, the local variable @{b }y@{ub } in @{b }fred@{ub } could have been called @{b }x@{ub } and the +program would have done exactly the same thing. + + DEF w + + PROC main() + DEF x + x:=2 + w:=1 + fred() + ENDPROC + + PROC fred() + DEF x + x:=3 + w:=2 + ENDPROC + +This works because the @{b }x@{ub } in the assignment in @{b }fred@{ub } can refer only to the +local variable @{b }x@{ub } of @{b }fred@{ub } (the @{b }x@{ub } in @{b }main@{ub } is local to @{b }main@{ub } so cannot be +accessed from @{b }fred@{ub }). + + If a local variable for a procedure has the same name as a global +variable then in the rest of the procedure the name refers only to the +local variable. Therefore, the global variable cannot be accessed in the +procedure, and this is called @{fg shine }descoping@{fg text } the global variable. + + The parameters of a procedure are local variables for that procedure. +We've seen how to pass values as parameters when a procedure is called +(the use of @{b }WriteF@{ub } in the example), but until now we haven't been able to +define a procedure which takes parameters. Now we know a bit about +variables we can have a go: + + DEF y + + PROC onemore(x) + y:=x+1 + ENDPROC + +This isn't a complete program so don't try to compile it. Basically, +we've declared a variable @{b }y@{ub } (which will be of type @{b }LONG@{ub }) and a procedure +@{b }onemore@{ub }. The procedure is defined with a parameter @{b }x@{ub }, and this is just +like a (local) variable declaration. When @{b }onemore@{ub } is called a parameter +must be supplied, and this value is stored in the (local) variable @{b }x@{ub } +before execution of @{b }onemore@{ub }'s code. The code stores the value of @{b }x@{ub } plus +one in the (global) variable @{b }y@{ub }. The following are some examples of +calling @{b }onemore@{ub }: + + onemore(120) + onemore(52+34) + onemore(y) + + A procedure can be defined to take any number of parameters. Below, +the procedure @{b }addthem@{ub } is defined to take two parameters, @{b }a@{ub } and @{b }b@{ub }, so it +must therefore be called with two parameters. Notice that values stored +by the parameter variables (@{b }a@{ub } and @{b }b@{ub }) can be changed within the code of the +procedure, since they are just like local variables for the procedure. +(The only real difference between local and parameter variables is that +parameter variables are initialised with the values supplied as parameters +when the procedure is called.) + + DEF y + + PROC addthem(a, b) + a:=a+2 + y:=a*b + ENDPROC + +The following are some examples of calling @{b }addthem@{ub }: + + addthem(120,-20) + addthem(52,34) + addthem(y,y) + + Global variables are, by default, initialised to zero. Parameter +variables are, of course, initialised by the actual values passed as +parameters when a procedure is called. However, local variables are not +initialised. This means that a local variable will contain a fairly +random value when the code of a procedure is first executed. It is the +responsibility of the programmer to ensure no assumptions are made about +the value of local variables before they have been initialised. The +obvious way to initialise a local variable is using an assignment, but +there is also a way of giving an initialisation value as part of the +declaration (see @{"Initialised Declarations" Link "MoreExpressions.guide/Initialised Declarations" }). Initialisation of variables +is often very important, and is a common reason why programs go wrong. + + +@ENDNODE + +@NODE "Changing the example" "Changing the example" +@Prev "Global and local variables" +@Toc "Variables" + +Changing the example +-------------------- + + Before we change the example we must learn something about @{b }WriteF@{ub }. We +already know that the characters @{b }\\n@{ub } in a string mean a linefeed. +However, there are several other important combinations of characters in a +string, and some are special to procedures like @{b }WriteF@{ub }. One such +combination is @{b }\\d@{ub }, which is easier to describe after we've seen the +changed example. + + PROC main() + WriteF('My first program\\n') + fred() + ENDPROC + + PROC fred() + WriteF('...brought to you by the number \\d\\n', 236) + ENDPROC + +You might be able to guess what happens, but compile it and try it out +anyway. If everything's worked you should see that the second message +prints out the number that was passed as the second parameter to @{b }WriteF@{ub }. +That's what the @{b }\\d@{ub } combination does--it marks the place in the string +where the number should be printed. Here's the output the example should +generate: + + My first program + ...brought to you by the number 236 + +Try this next change: + + PROC main() + WriteF('My first program\\n') + fred() + ENDPROC + + PROC fred() + WriteF('...the number \\d is quite nice\\n', 16) + ENDPROC + +This is very similar, and just shows that the @{b }\\d@{ub } really does mark the +place where the number is printed. Again, here's the output it should +generate: + + My first program + ...the number 16 is quite nice + +We'll now try printing two numbers. + + PROC main() + WriteF('My first program\\n') + fred() + ENDPROC + + PROC fred() + WriteF('...brought to you by the numbers \\d and \\d\\n', 16, 236) + ENDPROC + +Because we're printing two numbers we need two lots of @{b }\\d@{ub }, and we need to +supply two numbers as parameters in the order in which we want them to be +printed. The number 16 will therefore be printed before the word `and' +and before the number 236. Here's the output: + + My first program + ...brought to you by the numbers 16 and 236 + + We can now make a big step forward and pass the numbers as parameters +to the procedure @{b }fred@{ub }. Just look at the differences between this next +example and the previous one. + + PROC main() + WriteF('My first program\\n') + fred(16, 236) + ENDPROC + + PROC fred(a,b) + WriteF('...brought to you by the numbers \\d and \\d\\n', a,b) + ENDPROC + +This time we pass the (local) variables @{b }a@{ub } and @{b }b@{ub } to @{b }WriteF@{ub }. This is +exactly the same as passing the values they store (which is what the +previous example did), and so the output will be the same. In the next +section we'll manipulate the variables by doing some arithmetic with @{b }a@{ub } and +@{b }b@{ub }, and get @{b }WriteF@{ub } to print the results. + + +@ENDNODE + +@NODE "Expressions" "Expressions" +@Prev "Variables" +@Toc "Variables and Expressions" + +Expressions +=========== + + The E language includes the normal mathematical and logical operators. +These operators are combined with values (usually in variables) to give +@{fg shine }expressions@{fg text } which yield new values. The following sections discuss this +topic in more detail. + + + @{" Mathematics " Link "Mathematics" } + @{" Logic and comparison " Link "Logic and comparison" } + @{" Precedence and grouping " Link "Precedence and grouping" } + + +@ENDNODE + +@NODE "Mathematics" "Mathematics" +@Next "Logic and comparison" +@Toc "Expressions" + +Mathematics +----------- + + All the standard mathematical operators are supported in E. You can do +addition, subtraction, multiplication and division. Other functions such +as sine, modulus and square-root can also be used as they are part of the +Amiga system libraries, but we only need to know about simple mathematics +at the moment. The @{b }+@{ub } character is used for addition, @{b }-@{ub } for subtraction, @{b }*@{ub } +for multiplication (it's the closest you can get to a multiplication sign +on a keyboard without using the letter @{b }x@{ub }), and @{b }/@{ub } for division (be careful +not to confuse the @{b }\\@{ub} used in strings with @{b }/@{ub } used for division). The +following are examples of expressions: + + 1+2+3+4 + 15-5 + 5*2 + 330/33 + -10+20 + 3*3+1 + +Each of these expressions yields ten as its result. The last example is +very carefully written to get the precedence correct (see +@{"Precedence and grouping" Link "Precedence and grouping" }). + + All the above expressions use integer operators, so they manipulate +integers, giving integers as results. @{fg shine }Floating-point@{fg text } numbers are also +supported by E, but using them is quite complicated (see +@{"Floating-Point Numbers" Link "FloatingPoint.guide/main" }). (Floating-point numbers can represent both very +small fractions and very large integers, but they have a limited accuracy, +i.e., a limited number of @{i }significant@{ui } digits.) + + +@ENDNODE + +@NODE "Logic and comparison" "Logic and comparison" +@Next "Precedence and grouping" +@Prev "Mathematics" +@Toc "Expressions" + +Logic and comparison +-------------------- + + Logic lies at the very heart of a computer. They rarely guess what to +do next; instead they rely on hard facts and precise reasoning. Consider +the password protection on most games. The computer must decide whether +you entered the correct number or word before it lets you play the game. +When you play the game it's constantly making decisions: did your laser +hit the alien?, have you got any lives left?, etc. Logic controls the +operation of a program. + + In E, the constants @{b }TRUE@{ub } and @{b }FALSE@{ub } represent the truth values true and +false (respectively), and the operators @{b }AND@{ub } and @{b }OR@{ub } are the standard logic +operators. The comparison operators are @{b }=@{ub } (equal to), @{b }>@{ub } (greater than), @{b }<@{ub } +(less than), @{b }>=@{ub } (greater than or equal to), @{b }<=@{ub } (less than or equal to) and +@{b }<>@{ub } (not equal to). All the following expressions are true: + + TRUE + TRUE AND TRUE + TRUE OR FALSE + 1=1 + 2>1 + 3<>0 + +And these are all false: + + FALSE + TRUE AND FALSE + FALSE OR FALSE + 0=2 + 2<1 + (2<1) AND (-1=0) + +The last example must use parentheses. We'll see why in the next section +(it's to do with precedence, again). + + The truth values @{b }TRUE@{ub } and @{b }FALSE@{ub } are actually numbers. This is how the +logic system works in E. @{b }TRUE@{ub } is the number -1 and @{b }FALSE@{ub } is zero. The +logic operators @{b }AND@{ub } and @{b }OR@{ub } expect such numbers as their parameters. In +fact, the @{b }AND@{ub } and @{b }OR@{ub } operators are really bit-wise operators (see +@{"Bitwise AND and OR" Link "MoreExpressions.guide/Bitwise AND and OR" }), so most of the time any non-zero number is taken to +be @{b }TRUE@{ub }. It can sometimes be convenient to rely on this knowledge, +although most of the time it is preferable (and more readable) to use a +slightly more explicit form. Also, these facts can cause a few subtle +problems as we shall see in the next section. + + +@ENDNODE + +@NODE "Precedence and grouping" "Precedence and grouping" +@Prev "Logic and comparison" +@Toc "Expressions" + +Precedence and grouping +----------------------- + + At school most of us are taught that multiplications must be done +before additions in a sum. In E it's different--there is no operator +precedence, and the normal order in which the operations are performed is +left-to-right, just like the expression is written. This means that +expressions like @{b }1+3*3@{ub } do not give the results a mathematician might +expect. In fact, @{b }1+3*3@{ub } represents the number 12 in E. This is because the +addition, @{b }1+3@{ub }, is done before the multiplication, since it occurs before +the multiplication. If the multiplication were written before the +addition it would be done first (like we would normally expect). +Therefore, @{b }3*3+1@{ub } represents the number 10 in E and in school mathematics. + + To overcome this difference we can use parentheses to group the +expression. If we'd written @{b }1+(3*3)@{ub } the result would be 10. This is +because we've forced E to do the multiplication first. Although this may +seem troublesome to begin with, it's actually a lot better than learning a +lot of rules for deciding which operator is done first (in C this can be a +real pain, and you usually end up writing the brackets in just to be +sure!). + + The logic examples above contained the expression: + + (2<1) AND (-1=0) + +This expression was false. If we'd left the parentheses out, it would +have been: + + 2<1 AND -1=0 + +This is actually interpreted the same as: + + ((2<1) AND -1) = 0 + +Now the number -1 shouldn't really be used to represent a truth value with +@{b }AND@{ub }, but we do know that @{b }TRUE@{ub } is the number -1, so E will make sense of +this and the E compiler won't complain. We will soon see how @{b }AND@{ub } and @{b }OR@{ub } +really work (see @{"Bitwise AND and OR" Link "MoreExpressions.guide/Bitwise AND and OR" }), but for now we'll just work out what +E would calculate for this expression: + + 1. Two is not less than one so @{b }2<1@{ub } can be replaced by @{b }FALSE@{ub }. + + (FALSE AND -1) = 0 + + 2. @{b }TRUE@{ub } is -1 so we can replace -1 by @{b }TRUE@{ub }. + + (FALSE AND TRUE) = 0 + + 3. @{b }FALSE AND TRUE@{ub } is @{b }FALSE@{ub }. + + (FALSE) = 0 + + 4. @{b }FALSE@{ub } is really the number zero, so we can replace it with zero. + + 0 = 0 + + 5. Zero is equal to zero, so the expression is @{b }TRUE@{ub }. + + TRUE + +So E calculates the expression to be true. But the original expression +(with parentheses) was false. Bracketing is therefore very important! It +is also very easy to do correctly. + + +@ENDNODE + +@NODE "Program Flow Control" "Program Flow Control" +@Next "Summary" +@Prev "Variables and Expressions" +@Toc "Contents.guide/main" + +Program Flow Control +******************** + + A computer program often needs to repeatedly execute a series of +statements or execute different statements according to the result of some +decision. For example, a program to print all the numbers between one and +a thousand would be very long and tedious to write if each print statement +had to be given individually--it would be much better to use a variable +and repeatedly print its value and increment it. + + Another aspect of flow control is choosing between different pieces of +code to execute. For instance, if something goes wrong a program may need +to decide whether to continue or print an error message and stop--this +part of a program is a typical example of a conditional block. + + + @{" Conditional Block " Link "Conditional Block" } + @{" Loops " Link "Loops" } + + +@ENDNODE + +@NODE "Conditional Block" "Conditional Block" +@Next "Loops" +@Toc "Program Flow Control" + +Conditional Block +================= + + There are two kinds of conditional block: @{b }IF@{ub } and @{b }SELECT@{ub }. Examples of +these blocks are given below as fragments of E code (i.e., the examples +are not complete E programs). + + IF x>0 + x:=x+1 + WriteF('Increment: x is now \\d\\n', x) + ELSEIF x<0 + x:=x-1 + WriteF('Decrement: x is now \\d\\n', x) + ELSE + WriteF('Zero: x is 0\\n') + ENDIF + +In the above @{b }IF@{ub } block, the first part checks if the value of @{b }x@{ub } is greater +than zero, and, if it is, @{b }x@{ub } is incremented and the new value is printed +(with a message saying it was incremented). The program will then skip +the rest of the block, and will execute the statements which follow the +@{b }ENDIF@{ub }. If, however, @{b }x@{ub } it is not greater than zero the @{b }ELSEIF@{ub } part is +checked, so if @{b }x@{ub } is less than zero it will be decremented and printed, and +the rest of the block is skipped. If @{b }x@{ub } is not greater than zero and not +less than zero the statements in the @{b }ELSE@{ub } part are executed, so a message +saying @{b }x@{ub } is zero is printed. The @{b }IF@{ub } conditional is described in more +detail below. + + + @{" IF block " Link "IF block" } + @{" IF expression " Link "IF expression" } + + SELECT x + CASE 0 + WriteF('x is zero\\n') + CASE 10 + WriteF('x is ten\\n') + CASE -2 + WriteF('x is -2\\n') + DEFAULT + WriteF('x is not zero, ten or -2\\n') + ENDSELECT + +The @{b }SELECT@{ub } block is similar to the @{b }IF@{ub } block--it does different things +depending on the value of @{b }x@{ub }. However, @{b }x@{ub } is only checked against specific +values, given in the series of @{b }CASE@{ub } statements. If it is not any of these +values the @{b }DEFAULT@{ub } part is executed. + + There's also a variation on the @{b }SELECT@{ub } block (known as the @{b }SELECT..OF@{ub } +block) which matches ranges of values and is quite fast. The two kinds of +@{b }SELECT@{ub } block are described in more detail below. + + + @{" SELECT block " Link "SELECT block" } + @{" SELECT..OF block " Link "SELECT..OF block" } + + +@ENDNODE + +@NODE "IF block" "IF block" +@Next "IF expression" +@Toc "Conditional Block" + +@{b }IF@{ub } block +-------- + + The @{b }IF@{ub } block has the following form (the bits like @{fg shine }expression@{fg text } are +descriptions of the kinds of E code which is allowed at that point--they +are not proper E code): + + IF @{fg shine }expressionA@{fg text } + @{fg shine }statementsA@{fg text } + ELSEIF @{fg shine }expressionB@{fg text } + @{fg shine }statementsB@{fg text } + ELSE + @{fg shine }statementsC@{fg text } + ENDIF + +This block means: + + @{b }*@{ub } If @{fg shine }expressionA@{fg text } is true (i.e., represents @{b }TRUE@{ub } or any non-zero + number) the code denoted by @{fg shine }statementsA@{fg text } is executed. + + @{b }*@{ub } If @{fg shine }expressionA@{fg text } is false (i.e., represents @{b }FALSE@{ub } or zero) and + @{fg shine }expressionB@{fg text } is true the @{fg shine }statementsB@{fg text } part is executed. + + @{b }*@{ub } If both @{fg shine }expressionA@{fg text } and @{fg shine }expressionB@{fg text } are false the @{fg shine }statementsC@{fg text } + part is executed. + +There does not need to be an @{b }ELSE@{ub } part but if one is present it must be +the last part (immediately before the @{b }ENDIF@{ub }). Also, there can be any +number of @{b }ELSEIF@{ub } parts between the @{b }IF@{ub } and @{b }ELSE@{ub } parts. + + An alternative to this vertical form (where each part is on a separate +line) is the horizontal form: + + IF @{fg shine }expression@{fg text } THEN @{fg shine }statementA@{fg text } ELSE @{fg shine }statementB@{fg text } + +This has the disadvantage of no @{b }ELSEIF@{ub } parts and having to cram everything +onto a single line. Notice the presence of the @{b }THEN@{ub } keyword to separate the +@{fg shine }expression@{fg text } and @{fg shine }statementA@{fg text }. This horizontal form is closely related to +the @{b }IF@{ub } expression, which is described below (see @{"IF expression" Link "IF expression" }). + + To help make things clearer here are a number of E code fragments which +illustrate the allowable @{b }IF@{ub } blocks: + + IF x>0 THEN x:=x+1 ELSE x:=0 + + IF x>0 + x:=x+1 + ELSE + x:=0 + ENDIF + + IF x=0 THEN WriteF('x is zero\\n') + + IF x=0 + WriteF('x is zero\\n') + ENDIF + + IF x<0 + Write('Negative x\\n') + ELSEIF x>2000 + Write('Too big x\\n') + ELSEIF (x=2000) OR (x=0) + Write('Worrying x\\n') + ENDIF + + IF x>0 + IF x>2000 + WriteF('Big x\\n') + ELSE + WriteF('OK x\\n') + ENDIF + ELSE + IF x<-800 THEN WriteF('Small x\\n') ELSE Write('Negative OK x') + ENDIF + +In the last example there are @{fg shine }nested@{fg text } @{b }IF@{ub } blocks (i.e., an @{b }IF@{ub } block within +an @{b }IF@{ub } block). There is no ambiguity in which @{b }ELSE@{ub } or @{b }ELSEIF@{ub } parts belong +to which @{b }IF@{ub } block because the beginning and end of the @{b }IF@{ub } blocks are +clearly marked. For instance, the first @{b }ELSE@{ub } line can be interpreted only +as being part of the innermost @{b }IF@{ub } block. + + As a matter of style the conditions on the @{b }IF@{ub } and @{b }ELSEIF@{ub } parts should +not @{fg shine }overlap@{fg text } (i.e., at most one of the conditions should be true). If +they do, however, the first one will take precedence. Therefore, the +following two fragments of E code do the same thing: + + IF x>0 + WriteF('x is bigger than zero\\n') + ELSEIF x>200 + WriteF('x is bigger than 200\\n') + ELSE + WriteF('x is too small\\n') + ENDIF + + IF x>0 + WriteF('x is bigger than zero\\n') + ELSE + WriteF('x is too small\\n') + ENDIF + +The @{b }ELSEIF@{ub } part of the first fragment checks whether @{b }x@{ub } is greater than 200. +But, if it is, the check in the @{b }IF@{ub } part would have been true (@{b }x@{ub } is +certainly greater than zero if it's greater than 200), and so only the +code in the @{b }IF@{ub } part is executed. The whole @{b }IF@{ub } block behaves as if the +@{b }ELSEIF@{ub } was not there. + + +@ENDNODE + +@NODE "IF expression" "IF expression" +@Next "SELECT block" +@Prev "IF block" +@Toc "Conditional Block" + +@{b }IF@{ub } expression +------------- + + @{b }IF@{ub } is such a commonly used construction that there is also an @{b }IF@{ub } +expression. The @{b }IF@{ub } block is a statement and it controls which lines of +code are executed, whereas the @{b }IF@{ub } expression is an expression and it +controls its own value. For example, the following @{b }IF@{ub } block: + + IF x>0 + y:=x+1 + ELSE + y:=0 + ENDIF + +can be written more succinctly using an @{b }IF@{ub } expression: + + y:=(IF x>0 THEN x+1 ELSE 0) + +The parentheses are unnecessary but they help to make the example more +readable. Since the @{b }IF@{ub } block is just choosing between two assignments to +@{b }y@{ub } it isn't really the lines of code that are different (they are both +assignments), rather it is the values that are assigned to @{b }y@{ub } that are +different. The @{b }IF@{ub } expression makes this similarity very clear. It +chooses the @{i }value@{ui } to be assigned in just the same way that the @{b }IF@{ub } block +choose the @{i }assignment@{ui }. + + The @{b }IF@{ub } expression has the following form: + + IF @{fg shine }exp@{fg text } THEN @{fg shine }expA@{fg text } ELSE @{fg shine }expB@{fg text } + +As you can see, @{b }IF@{ub } expressions are written like the horizontal form of the +@{b }IF@{ub } block. However, there must be an @{b }ELSE@{ub } part and there can be no @{b }ELSEIF@{ub } +parts. This means that the expression will always have a value (either +@{fg shine }expA@{fg text } or @{fg shine }expB@{fg text }, depending on the value of @{fg shine }exp@{fg text }), and it isn't cluttered +with lots of cases. + + Don't worry too much about @{b }IF@{ub } expressions, since there are only useful +in a handful of cases and can always be rewritten as a more wordy @{b }IF@{ub } block. +Having said that they are very elegant and a lot more readable than the +equivalent @{b }IF@{ub } block. + + +@ENDNODE + +@NODE "SELECT block" "SELECT block" +@Next "SELECT..OF block" +@Prev "IF expression" +@Toc "Conditional Block" + +@{b }SELECT@{ub } block +------------ + + The @{b }SELECT@{ub } block has the following form: + + SELECT @{fg shine }variable@{fg text } + CASE @{fg shine }expressionA@{fg text } + @{fg shine }statementsA@{fg text } + CASE @{fg shine }expressionB@{fg text } + @{fg shine }statementsB@{fg text } + DEFAULT + @{fg shine }statementsC@{fg text } + ENDSELECT + +The value of the selection variable (denoted by @{fg shine }variable@{fg text } in the @{b }SELECT@{ub } +part) is compared with the value of the expression in each of the @{b }CASE@{ub } +parts in turn. If there's a match, the statements in the (first) matching +@{b }CASE@{ub } part are executed. There can be any number of @{b }CASE@{ub } parts between the +@{b }SELECT@{ub } and @{b }DEFAULT@{ub } parts. If there is no match, the statements in the +@{b }DEFAULT@{ub } part are executed. There does not need to be a @{b }DEFAULT@{ub } part but +if one is present it must be the last part (immediately before the +@{b }ENDSELECT@{ub }). + + It should be clear that @{b }SELECT@{ub } blocks can be rewritten as @{b }IF@{ub } blocks, +with the checks on the @{b }IF@{ub } and @{b }ELSEIF@{ub } parts being equality checks on the +selection variable. For example, the following code fragments are +equivalent: + + SELECT x + CASE 22 + WriteF('x is 22\\n') + CASE (y+z)/2 + WriteF('x is (y+x)/2\\n') + DEFAULT + WriteF('x isn't anything significant\\n') + ENDSELECT + + IF x=22 + WriteF('x is 22\\n') + ELSEIF x=(y+z)/2 + WriteF('x is (y+x)/2\\n') + ELSE + WriteF('x isn't anything significant\\n') + ENDIF + +Notice that the @{b }IF@{ub } and @{b }ELSEIF@{ub } parts come from the @{b }CASE@{ub } parts, the @{b }ELSE@{ub } +part comes from the @{b }DEFAULT@{ub } part, and the order of the parts is preserved. +The advantage of the @{b }SELECT@{ub } block is that it's much easier to see that the +value of @{b }x@{ub } is being tested all the time, and also we don't have to keep +writing @{b }x=@{ub } in the checks. + + +@ENDNODE + +@NODE "SELECT..OF block" "SELECT..OF block" +@Prev "SELECT block" +@Toc "Conditional Block" + +@{b }SELECT..OF@{ub } block +---------------- + + The @{b }SELECT..OF@{ub } block is a bit more complicated than the normal @{b }SELECT@{ub } +block, but can be very useful. It has the following form: + + SELECT @{fg shine }maxrange@{fg text } OF @{fg shine }expression@{fg text } + CASE @{fg shine }constA@{fg text } + @{fg shine }statementsA@{fg text } + CASE @{fg shine }constB1@{fg text } TO @{fg shine }constB2@{fg text } + @{fg shine }statementsB@{fg text } + CASE @{fg shine }range1@{fg text }, @{fg shine }range2@{fg text } + @{fg shine }statementsC@{fg text } + DEFAULT + @{fg shine }statementsD@{fg text } + ENDSELECT + + The value to be matched is @{fg shine }expression@{fg text }, which can be any expression, +not just a variable like in the normal @{b }SELECT@{ub } block. However, the +@{fg shine }maxrange@{fg text }, @{fg shine }constA@{fg text }, @{fg shine }constB1@{fg text } and @{fg shine }constB2@{fg text } must all be explicit numbers, +i.e., constants (see @{"Constants" Link "Constants.guide/main" }). @{fg shine }maxrange@{fg text } must be a positive constant +and the other constants must all be between zero and @{fg shine }maxrange@{fg text } (including +zero but excluding @{fg shine }maxrange@{fg text }). + + The @{b }CASE@{ub } values to be matched are specified using @{fg shine }ranges@{fg text }. A simple +range is a single constant (the first @{b }CASE@{ub } above). The more general range +is shown in the second @{b }CASE@{ub }, using the @{b }TO@{ub } keyword (@{fg shine }constB2@{fg text } must be +greater than @{fg shine }constB1@{fg text }). A general @{b }CASE@{ub } in the @{b }SELECT..OF@{ub } block can +specify a number of possible ranges to match against by separating each +range with a comma, as in the third @{b }CASE@{ub } above. For example, the +following @{b }CASE@{ub } lines are equivalent and can be used to match any number +from one to five (inclusive): + + CASE 1 TO 5 + + CASE 1, 2, 3, 4, 5 + + CASE 1 TO 3, 3 TO 5 + + CASE 1, 2 TO 3, 4, 5 + + CASE 1, 5, 2, 4, 3 + + CASE 2 TO 3, 5, 1, 4 + + If the value of the @{fg shine }expression@{fg text } is less than zero, greater than or +equal to @{fg shine }maxrange@{fg text }, or it does not match any of the constants in the @{b }CASE@{ub } +ranges, then the statements in the @{b }DEFAULT@{ub } part are executed. Otherwise +the statements in the first matching @{b }CASE@{ub } part are executed. As in the +normal @{b }SELECT@{ub } block, there does not need to be a @{b }DEFAULT@{ub } part. + + The following @{b }SELECT..OF@{ub } block prints the (numeric) day of the month +nicely: + + SELECT 32 OF day + CASE 1, 21, 31 + WriteF('The \\dst day of the month\\n', day) + CASE 2, 22 + WriteF('The \\dnd day of the month\\n', day) + CASE 3, 23 + WriteF('The \\drd day of the month\\n', day) + CASE 4 TO 20, 24 TO 30 + WriteF('The \\dth day of the month\\n', day) + DEFAULT + WriteF('Error: invalid day=\\d\\n', day) + ENDSELECT + +The @{fg shine }maxrange@{fg text } for this block is 32, since 31 is the maximum of the values +used in the @{b }CASE@{ub } parts. If the value of @{b }day@{ub } was 100, for instance, then +the statements in the @{b }DEFAULT@{ub } part would be executed, signalling an +invalid day. + + This example can be rewritten as an @{b }IF@{ub } block: + + IF (day=1) OR (day=21) OR (day=31) + WriteF('The \\dst day of the month\\n', day) + ELSEIF (day=2) OR (day=22) + WriteF('The \\dnd day of the month\\n', day) + ELSEIF (day=3) OR (day=23) + WriteF('The \\drd day of the month\\n', day) + ELSEIF ((4<=day) AND (day<=20)) OR ((24<=day) AND (day<=30)) + WriteF('The \\dth day of the month\\n', day) + ELSE + WriteF('Error: invalid day=\\d\\n', day) + ENDIF + +The comma separating two ranges in the @{b }CASE@{ub } part has been replaced by an +@{b }OR@{ub } of two comparison expressions, and the @{b }TO@{ub } range has been replaced +by an @{b }AND@{ub } of two comparisons. (It is worth noticing the careful +bracketing of the resulting expressions.) + + Clearly, the @{b }SELECT..OF@{ub } block is much more readable than the equivalent +@{b }IF@{ub } block. It is also a lot faster, mainly because none of the comparisons +present in @{b }IF@{ub } block have to be done in the @{b }SELECT..OF@{ub } version. Instead +the value to be matched is used to immediately locate the correct @{b }CASE@{ub } +part. However, it's not all good news: the @{fg shine }maxrange@{fg text } value directly +affects the size of compiled executable, so it is recommended that +@{b }SELECT..OF@{ub } blocks be used only with small @{fg shine }maxrange@{fg text } values. See the +`Reference Manual' for more details. + + +@ENDNODE + +@NODE "Loops" "Loops" +@Prev "Conditional Block" +@Toc "Program Flow Control" + +Loops +===== + + Loops are all about making a program execute a series of statements +over and over again. Probably the simplest loop to understand is the @{b }FOR@{ub } +loop. There are other kinds of loops, but they are easier to understand +once we know how to use a @{b }FOR@{ub } loop. + + + @{" FOR loop " Link "FOR loop" } + @{" WHILE loop " Link "WHILE loop" } + @{" REPEAT..UNTIL loop " Link "REPEAT..UNTIL loop" } + + +@ENDNODE + +@NODE "FOR loop" "FOR loop" +@Next "WHILE loop" +@Toc "Loops" + +@{b }FOR@{ub } loop +-------- + + If you want to write a program to print the numbers one to 100 you can +either type each number and wear out your fingers, or you can use a single +variable and a small @{b }FOR@{ub } loop. Try compiling this E program (the space +after the @{b }\\d@{ub } in the string is needed to separate the printed numbers): + + PROC main() + DEF x + FOR x:=1 TO 100 + WriteF('\\d ', x) + ENDFOR + WriteF('\\n') + ENDPROC + +When you run this you'll get all the numbers from one to 100 printed, just +like we wanted. It works by using the (local) variable @{b }x@{ub } to hold the +number to be printed. The @{b }FOR@{ub } loop starts off by setting the value of @{b }x@{ub } +to one (the bit that looks like an assignment). Then the statements +between the @{b }FOR@{ub } and @{b }ENDFOR@{ub } lines are executed (so the value of @{b }x@{ub } gets +printed). When the program reaches the @{b }ENDFOR@{ub } it increments @{b }x@{ub } and checks +to see if it is bigger than 100 (the limit we set with the @{b }TO@{ub } part). If +it is, the loop is finished and the statements after the @{b }ENDFOR@{ub } are +executed. If, however, it wasn't bigger than 100, the statements between +the @{b }FOR@{ub } and @{b }ENDFOR@{ub } lines are executed all over again, and this time @{b }x@{ub } is +one bigger since it has been incremented. In fact, this program does +exactly the same as the following program (the @{b }...@{ub } is not E code--it +stands for the 97 other @{b }WriteF@{ub } statements): + + PROC main() + WriteF('\\d ', 1) + WriteF('\\d ', 2) + ... + WriteF('\\d ', 100) + WriteF('\\n') + ENDPROC + + The general form of the @{b }FOR@{ub } loop is as follows: + + FOR @{fg shine }var@{fg text } := @{fg shine }expressionA@{fg text } TO @{fg shine }expressionB@{fg text } STEP @{fg shine }number@{fg text } + @{fg shine }statements@{fg text } + ENDFOR + +The @{fg shine }var@{fg text } bit stands for the loop variable (in the example above this was +@{b }x@{ub }). The @{fg shine }expressionA@{fg text } bit gives the start value for the loop variable +and the @{fg shine }expressionB@{fg text } bit gives the last allowable value for it. The @{b }STEP@{ub } +part allows you to specify the value (given by @{fg shine }number@{fg text }) which is added to +the loop variable on each loop. Unlike the values given for the start and +end (which can be arbitrary expressions), the @{b }STEP@{ub } value must be a +constant (see @{"Constants" Link "Constants.guide/main" }). The @{b }STEP@{ub } value defaults to one if the @{b }STEP@{ub } part +is omitted (as in our example). Negative @{b }STEP@{ub } values are allowed, but in +this case the check used at the end of each loop is whether the loop +variable is @{i }less than@{ui } the value in the @{b }TO@{ub } part. Zero is not allowed as +the @{b }STEP@{ub } value. + + As with the @{b }IF@{ub } block there is a horizontal form of a @{b }FOR@{ub } loop: + + FOR @{fg shine }var@{fg text } := @{fg shine }expA@{fg text } TO @{fg shine }expB@{fg text } STEP @{fg shine }expC@{fg text } DO @{fg shine }statement@{fg text } + + +@ENDNODE + +@NODE "WHILE loop" "WHILE loop" +@Next "REPEAT..UNTIL loop" +@Prev "FOR loop" +@Toc "Loops" + +@{b }WHILE@{ub } loop +---------- + + The @{b }FOR@{ub } loop used a loop variable and checked whether that variable had +gone past its limit. A @{b }WHILE@{ub } loop allows you to specify your own loop +check. For instance, this program does the same as the program in the +previous section: + + PROC main() + DEF x + x:=1 + WHILE x<=100 + WriteF('\\d ', x) + x:=x+1 + ENDWHILE + WriteF('\\n') + ENDPROC + +We've replaced the @{b }FOR@{ub } loop with an initialisation of @{b }x@{ub } and a @{b }WHILE@{ub } loop +with an extra statement to increment @{b }x@{ub }. We can now see the inner workings +of the @{b }FOR@{ub } loop and, in fact, this is exactly how the @{b }FOR@{ub } loop works. + + It is important to know that our check, @{b }x<=100@{ub }, is done before the loop +statements are executed. This means that the loop statements might not +even be executed once. For instance, if we'd made the check @{b }x>=100@{ub } it +would be false at the beginning of the loop (since @{b }x@{ub } is initialised to one +in the assignment before the loop). Therefore, the loop would have +terminated immediately and execution would pass straight to the statements +after the @{b }ENDWHILE@{ub }. + + Here's a more complicated example: + + PROC main() + DEF x,y + x:=1 + y:=2 + WHILE (x<10) AND (y<10) + WriteF('x is \\d and y is \\d\\n', x, y) + x:=x+2 + y:=y+2 + ENDWHILE + ENDPROC + +We've used two (local) variables this time. As soon as one of them is ten +or more the loop is terminated. A bit of inspection of the code reveals +that @{b }x@{ub } is initialised to one, and keeps having two added to it. It will, +therefore, always be an odd number. Similarly, @{b }y@{ub } will always be even. +The @{b }WHILE@{ub } check shows that it won't print any numbers which are greater +than or equal to ten. From this and the fact that @{b }x@{ub } starts at one and @{b }y@{ub } +at two we can decide that the last pair of numbers will be seven and eight. +Run the program to confirm this. It should produce the following output: + + x is 1 and y is 2 + x is 3 and y is 4 + x is 5 and y is 6 + x is 7 and y is 8 + + Like the @{b }FOR@{ub } loop, there is a horizontal form of the @{b }WHILE@{ub } loop: + + WHILE @{fg shine }expression@{fg text } DO @{fg shine }statement@{fg text } + + Loop termination is always a big problem. @{b }FOR@{ub } loops are guaranteed to +eventually reach their limit (if you don't mess with the loop variable, +that is). However, @{b }WHILE@{ub } loops (and all other loops) may go on forever +and never terminate. For example, if the loop check were @{b }1<2@{ub } it would +always be true and nothing the loop could do would prevent it being true! +You must therefore take care that your loops terminate in some way if you +want to program to finish. There is a sneaky way of terminating loops +using the @{b }JUMP@{ub } statement, but we'll ignore that for now. + + +@ENDNODE + +@NODE "REPEAT..UNTIL loop" "REPEAT..UNTIL loop" +@Prev "WHILE loop" +@Toc "Loops" + +@{b }REPEAT..UNTIL@{ub } loop +------------------ + + A @{b }REPEAT..UNTIL@{ub } loop is very similar to a @{b }WHILE@{ub } loop. The only +difference is where you specify the loop check, and when and how the check +is performed. To illustrate this, here's the program from the previous +two sections rewritten using a @{b }REPEAT..UNTIL@{ub } loop (try to spot the subtle +differences): + + PROC main() + DEF x + x:=1 + REPEAT + WriteF('\\d ', x) + x:=x+1 + UNTIL x>100 + WriteF('\\n') + ENDPROC + +Just as in the @{b }WHILE@{ub } loop version we've got an initialisation of @{b }x@{ub } and an +extra statement in the loop to increment @{b }x@{ub }. However, this time the loop +check is specified at the end of the loop (in the @{b }UNTIL@{ub } part), and the +check is only performed at the end of each loop. This difference means +that the code in a @{b }REPEAT..UNTIL@{ub } loop will be executed at least once, +whereas the code in a @{b }WHILE@{ub } loop may never be executed. Also, the logical +sense of the check follows the English: a @{b }REPEAT..UNTIL@{ub } loop executes +@{i }until@{ui } the check is true, whereas the @{b }WHILE@{ub } loop executes @{i }while@{ui } the +check is true. Therefore, the @{b }REPEAT..UNTIL@{ub } loop executes while the check +is false! This may seem confusing at first, but just remember to read the +code as if it were English and you'll get the correct interpretation. + + +@ENDNODE + +@NODE "Summary" "Summary" +@Next "Format.guide/main" +@Prev "Program Flow Control" +@Toc "Contents.guide/main" + +Summary +******* + + This is the end of Part One, which was hopefully enough to get you +started. If you've grasped the main concepts you are good position to +attack Part Two, which covers the E language in more detail. + + This is probably a good time to look at the different parts of one of +the examples from the previous sections, since we've now used quite a bit +of E. The following examination uses the @{b }WHILE@{ub } loop example. Just to make +things easier to follow, each line has been numbered (don't try to compile +it with the line numbers on!). + + 1. PROC main() + 2. DEF x,y + 3. x:=1 + 4. y:=2 + 5. WHILE (x<10) AND (y<10) + 6. WriteF('x is \\d and y is \\d\\n', x, y) + 7. x:=x+2 + 8. y:=y+2 + 9. ENDWHILE + 10. ENDPROC + +Hopefully, you should be able to recognise all the features listed in the +table below. If you don't then you might need to go back over the +previous chapters, or find a much better programming guide than this! + + @{i }Line(s)@{ui } @{i }Observation@{ui } + --------------------------------------------------------- + 1-10 The procedure definition. + + 1 The declaration of the procedure @{b }main@{ub }, with no + parameters. + + 2 The declaration of local variables @{b }x@{ub } and @{b }y@{ub }. + + 3, 4 Initialisation of @{b }x@{ub } and @{b }y@{ub } using assignment + statements. + + 5-9 The @{b }WHILE@{ub } loop. + + 5 The loop check for the @{b }WHILE@{ub } loop using the + logical operator @{b }AND@{ub }, the comparison operator + @{b }<@{ub }, and parentheses to group the expression. + + 6 The call to the (built-in) procedure @{b }WriteF@{ub } + using parameters. Notice the string, the place + holders for numbers, @{b }\\d@{ub }, and the linefeed, + @{b }\\n@{ub }. + + 7, 8 Assignments to @{b }x@{ub } and @{b }y@{ub }, adding two to + their values. + + 9 The marker for the end of the @{b }WHILE@{ub } loop. + + 10 The marker for the end of the procedure. + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Memory.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Memory.guide new file mode 100644 index 0000000..38616b5 --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Memory.guide @@ -0,0 +1,557 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Memory Allocation" +@Next "FloatingPoint.guide/main" +@Prev "Exceptions.guide/main" +@Toc "Contents.guide/main" + +Memory Allocation +***************** + + When a program is running memory is being used in various different +ways. In order to use any memory it must first be @{fg shine }allocated@{fg text }, which is +simply a way of marking memory as being `in use'. This is to prevent the +same piece of memory being used for different data storage (e.g., by +different programs), and so helps prevent corruption of the data stored +there. There are two general ways in which memory can be allocated: +dynamically and statically. + + + @{" Static Allocation " Link "Static Allocation" } + @{" Deallocation of Memory " Link "Deallocation of Memory" } + @{" Dynamic Allocation " Link "Dynamic Allocation" } + @{" NEW and END Operators " Link "NEW and END Operators" } + + +@ENDNODE + +@NODE "Static Allocation" "Static Allocation" +@Next "Deallocation of Memory" +@Toc "main" + +Static Allocation +================= + + @{fg shine }Statically@{fg text } allocated memory is memory allocated by the program for +variables and static data like string constants, lists and typed lists +(see @{"Static data" Link "Types.guide/Static data" }). Every variable in a program requires some memory in +which to store its value. Variables declared to be of type @{b }ARRAY@{ub }, @{b }LIST@{ub }, +@{b }STRING@{ub } or any object require two lots of memory: one to hold the value of +the pointer and one to hold the large amount of data (e.g., the elements +in an @{b }ARRAY@{ub }). In fact, such declarations are merely @{b }PTR TO @{ub }@{fg shine }type@{fg text }@{b }@{ub } +declarations together with an initialisation of the pointer to the address +of some (statically) allocated memory to hold the data. The following +example shows very similar declarations, with the difference being that in +the second case (using @{b }PTR@{ub }) only memory to hold the pointer values is +allocated. The first case also allocates memory to hold the appropriate +size of array, object and E-string. + + DEF a[20]:ARRAY, m:myobj, s[10]:STRING + + DEF a:PTR TO CHAR, m:PTR TO myobj, s:PTR TO CHAR + + The pointers in the second case are not initialised by the declaration +and, therefore, they are not valid pointers. This means that they should +not be dereferenced in any way, until they have been initialised to the +address of some allocated memory. This usually involves dynamic +allocation of memory (see @{"Dynamic Allocation" Link "Dynamic Allocation" }). + + +@ENDNODE + +@NODE "Deallocation of Memory" "Deallocation of Memory" +@Next "Dynamic Allocation" +@Prev "Static Allocation" +@Toc "main" + +Deallocation of Memory +====================== + + When memory is allocated it is, conceptually, marked as being `in use'. +This means that this piece of memory cannot be allocated again, so a +different piece will be allocated (if any is available) when the program +wants to allocate some more. In this way, variables are allocated +different pieces of memory, and so their values can be distinct. But +there is only a certain amount of memory available, and if it could not be +marked as `not in use' again it would soon run out (and the program would +come to a nasty end). This is what @{fg shine }deallocation@{fg text } does: it marks +previously allocated memory as being `not in use' and so makes it +available for allocation again. However, memory should be deallocated +only when it is actually no longer in use, and this is where things get a +bit complicated. + + Memory is such a vital resource in every computer that it is important +to use as little of it as necessary and to deallocate it whenever possible. +This is why a programming language like E handles most of the memory +allocation for variables. The memory allocated for variables can be +automatically deallocated when it is no longer possible for the program to +use that variable. However, this automatic deallocation is not useful for +global variables, since they can be used from any procedure and so can be +deallocated only when the program terminates. A procedure's local +variables, on the other hand, are allocated when the procedure is called +but cannot be used after the procedure returns. They can, therefore, be +deallocated when the procedure returns. + + Pointers, as always, can cause big problems. The following example +shows why you need to be careful when using pointers as the return value +of a procedure. + + /* This is an example of what *NOT* to do */ + PROC fullname(first, last) + DEF full[40]:STRING + StrCopy(full, first) + StrAdd(full, ' ') + StrAdd(full, last) + ENDPROC full + + PROC main() + WriteF('Name is \\s\\n', fullname('Fred', 'Flintstone')) + ENDPROC + +On first sight this seems fine, and, in fact, it may even work correctly +if you run it once or twice (but be careful: it could crash your machine). +The problem is that the procedure @{b }fullname@{ub } returns the value of the local +variable @{b }full@{ub }, which is a pointer to some statically allocated memory for +the E-string and this memory will be deallocated when the procedure +returns. This means that the return value of any call to @{b }fullname@{ub } is the +address of recently deallocated memory, so it is invalid to dereference it. +But the call to @{b }WriteF@{ub } does just that: it dereferences the result of +@{b }fullname@{ub } in order to print the E-string it points to. This is a very +common problem, because it is such an easy thing to do. The fact that it +may, on many occasions, appear to work makes it much harder to find, too. +The solution, in this case, is to use dynamic allocation (see +@{"Dynamic Allocation" Link "Dynamic Allocation" }). + + If you're still a bit sceptical that this really is a problem, try the +above @{b }fullname@{ub } procedure definition with either of these replacement @{b }main@{ub } +procedures, but be aware, again, that each one has the potential to crash +your machine. + + /* This might not print the correct string */ + PROC main() + DEF f + f:=fullname('Fred', 'Flintstone') + WriteF('Name is \\s\\n', f) + ENDPROC + + /* This will definitely print g instead of f */ + PROC main() + DEF f, g + f:=fullname('Fred', 'Flintstone') + g:=fullname('Barney', 'Rubble') + WriteF('Name is \\s\\n', f) + ENDPROC + +(The reason why things go wrong is outlined above, but the reasons why +each prints what it does is beyond the scope of this Guide.) + + +@ENDNODE + +@NODE "Dynamic Allocation" "Dynamic Allocation" +@Next "NEW and END Operators" +@Prev "Deallocation of Memory" +@Toc "main" + +Dynamic Allocation +================== + + @{fg shine }Dynamically@{fg text } allocated memory is any memory that is not statically +allocated. To allocate memory dynamically you can use the @{b }List@{ub } and @{b }String@{ub } +functions, all flavours of @{b }New@{ub }, and the versatile @{b }NEW@{ub } operator. But +because the memory is dynamically allocated it must be explicitly +deallocated when no longer needed. In all the above cases, though, any +memory that is still allocated when the program terminates will be +deallocated automatically. + + Another way to allocate memory dynamically is to use the Amiga system +functions based on @{b }AllocMem@{ub }. However, these functions require that the +memory allocated using them be deallocated (using functions like @{b }FreeMem@{ub }) +before the program terminates, or else it will never be deallocated (not +until your machine is rebooted, anyway). It is safer, therefore, to try +to use the E functions for dynamic allocation whenever possible. + + There are many reasons why you might want to use dynamic allocation, +and most of them involve initialisation of pointers. For example, the +declarations in the section about static allocation can be extended to +give initialisations for the pointers declared in the second @{b }DEF@{ub } line (see +@{"Static Allocation" Link "Static Allocation" }). + + DEF a[20]:ARRAY, m:myobj, s[10]:STRING + + DEF a:PTR TO CHAR, m:PTR TO myobj, s:PTR TO CHAR + a:=New(20) + m:=New(SIZEOF myobj) + s:=String(20) + +These are initialisations to dynamically allocated memory, whereas the +first line of declarations initialise similar pointers to statically +allocated memory. If these sections of code were part of a procedure +then, since they would now be local variables, there would be one other, +significant difference: the dynamically allocated memory would not +automatically be deallocated when the procedure returns, whereas the +statically allocated memory would. This means that we can solve the +deallocation problem (see @{"Deallocation of Memory" Link "Deallocation of Memory" }). + + /* This is the correct way of doing it */ + PROC fullname(first, last) + DEF full + full:=String(40) + StrCopy(full, first) + StrAdd(full, ' ') + StrAdd(full, last) + ENDPROC full + + PROC main() + DEF f, g + WriteF('Name is \\s\\n', fullname('Fred', 'Flintstone')) + f:=fullname('Fred', 'Flintstone') + g:=fullname('Barney', 'Rubble') + WriteF('Name is \\s\\n', f) + ENDPROC + + The memory for the E-string pointed to by @{b }full@{ub } is now allocated +dynamically, using @{b }String@{ub }, and is not deallocated until the end of the +program. This means that it is quite valid to pass the value of @{b }full@{ub } as +the result of the procedure @{b }fullname@{ub }, and it is quite valid to dereference +the result by printing it using @{b }WriteF@{ub }. However, this has caused one last +problem: the memory is not deallocated until the end of the program, so is +potentially wasted since it could be used, for example, to hold the +results of subsequent calls. Of course, the memory can be deallocated +only when the data it stores is no longer required. The following +replacement @{b }main@{ub } procedure shows when you might want to deallocate the +E-string (using @{b }DisposeLink@{ub }). + + PROC main() + DEF f, g + f:=fullname('Fred', 'Flintstone') + WriteF('Name is \\s, f points to $\\h\\n', f, f) + /* Try this with and without the next DisposeLink line */ + DisposeLink(f) + g:=fullname('Barney', 'Rubble') + WriteF('Name is \\s, g points to $\\h\\n', g, g) + DisposeLink(g) + ENDPROC + + If you run this with the @{b }DisposeLink(f)@{ub } line you'll probably find that +@{b }g@{ub } will be a pointer to the same memory as @{b }f@{ub }. This is because the call +to @{b }DisposeLink@{ub } has deallocated the memory pointed to by @{b }f@{ub }, so it can be +reused to store the E-string pointed to by @{b }g@{ub }. If you comment out (or +delete) the @{b }DisposeLink@{ub } line, then you will find that @{b }f@{ub } and @{b }g@{ub } always point +to different memory. + + In some ways it is best to never do any deallocation, because of the +problems you can get into if you deallocate memory too early (i.e., before +you've finished with the data it contains). Of course, it is safe (but +temporarily wasteful) to do this with the E dynamic allocation functions, +but it is very wasteful (and wrong) to do this with the Amiga system +functions like @{b }AllocMem@{ub }. + + Another benefit of using dynamic allocation is that the size of the +arrays, E-lists and E-strings that can be created can be the result of any +expression, so is not restricted to constant values. (Remember that the +size given on @{b }ARRAY@{ub }, @{b }LIST@{ub } and @{b }STRING@{ub } declarations must be a constant.) +This means that the @{b }fullname@{ub } procedure can be made more efficient and +allocate only the amount of memory it needs for the E-string it creates. + + PROC fullname(first, last) + DEF full + /* The extra +1 is for the added space */ + full:=String(StrLen(first)+StrLen(last)+1) + StrCopy(full, first) + StrAdd(full, ' ') + StrAdd(full, last) + ENDPROC full + +However, it may be very complicated or inefficient to calculate the +correct size. In these cases, a quick, constant estimate might be better, +overall. + + The various functions for allocating memory dynamically have +corresponding functions for deallocating that memory. The following table +shows some of the more common pairings. + + Allocation Deallocation + ------------------------------ + New Dispose + NewR Dispose + List DisposeLink + String DisposeLink + NEW END + FastNew FastDispose + AllocMem FreeMem + AllocVec FreeVec + AllocDosObject FreeDosObject + +@{b }NEW@{ub } and @{b }END@{ub } are versatile and powerful operators, discussed in the +following section. The functions beginning with @{b }Alloc-@{ub } are Amiga system +functions and are paired with similarly suffixed functions with a @{b }Free-@{ub } +prefix. See the `Rom Kernel Reference Manual' for more details. + + +@ENDNODE + +@NODE "NEW and END Operators" "NEW and END Operators" +@Prev "Dynamic Allocation" +@Toc "main" + +@{b }NEW@{ub } and @{b }END@{ub } Operators +===================== + + To help deal with dynamic allocation and deallocation of memory there +are two, powerful operators, @{b }NEW@{ub } and @{b }END@{ub }. The @{b }NEW@{ub } operator is very +versatile, and similar in operation to the @{b }New@{ub } family of built-in +functions (see @{"System support functions" Link "BuiltIns.guide/System support functions" }). The @{b }END@{ub } operator is the +deallocating complement of @{b }NEW@{ub } (so it is similar to the @{b }Dispose@{ub } family of +built-in functions). The major difference between @{b }NEW@{ub } and the various +flavours of @{b }New@{ub } is that @{b }NEW@{ub } allocates memory based on the types of its +arguments. + + + @{" Object and simple typed allocation " Link "Object and simple typed allocation" } + @{" Array allocation " Link "Array allocation" } + @{" List and typed list allocation " Link "List and typed list allocation" } + @{" OOP object allocation " Link "OOP object allocation" } + + +@ENDNODE + +@NODE "Object and simple typed allocation" "Object and simple typed allocation" +@Next "Array allocation" +@Toc "NEW and END Operators" + +Object and simple typed allocation +---------------------------------- + + The following sections of code are roughly equivalent and serve to show +the function of @{b }NEW@{ub }, and how it is closely related to @{b }NewR@{ub }. (The @{fg shine }type@{fg text } +can be any object or simple type.) + + DEF p:PTR TO @{fg shine }type@{fg text } + NEW p + + DEF p:PTR TO @{fg shine }type@{fg text } + p:=NewR(SIZEOF @{fg shine }type@{fg text }) + +Notice that the use of @{b }NEW@{ub } is not like a function call, as there are no +parentheses around the parameter @{b }p@{ub }. This is because @{b }NEW@{ub } is an operator +rather than a function. It works differently from a function, since it +also needs to know the types of its arguments. This means that the +declaration of @{b }p@{ub } is very important, since it governs how much memory is +allocated by @{b }NEW@{ub }. The version using @{b }NewR@{ub } explicitly gives the amount of +memory to be allocated (using the @{b }SIZEOF@{ub } operator), so in this case the +declared type of @{b }p@{ub } is not so important for correct allocation. + + The next example shows how @{b }NEW@{ub } can be used to initialise several +pointers at once. The second section of code is roughly equivalent, but +uses @{b }NewR@{ub }. (Remember that the default type of a variable is @{b }LONG@{ub }, which +is actually @{b }PTR TO CHAR@{ub }.) + + DEF p:PTR TO LONG, q:PTR TO myobj, r + NEW p, q, r + + DEF p:PTR TO LONG, q:PTR TO myobj, r + p:=NewR(SIZEOF LONG) + q:=NewR(SIZEOF myobj) + r:=NewR(SIZEOF CHAR) + + These first two examples have shown the statement form of @{b }NEW@{ub }. There +is also an expression form, which has one parameter and returns the +address of the newly allocated memory as well as initialising the argument +pointer to this address. + + DEF p:PTR TO myobj, q:PTR TO myobj + q:=NEW p + + DEF p:PTR TO myobj, q:PTR TO myobj + q:=(p:=NewR(SIZEOF @{fg shine }type@{fg text })) + +This may not seem desperately useful, but it's also the way that @{b }NEW@{ub } is +used to allocate copies of lists and typed lists (see +@{"List and typed list allocation" Link "List and typed list allocation" }). + + To deallocate memory allocated using @{b }NEW@{ub } you use the @{b }END@{ub } statement with +the pointers that you want to deallocate. To work properly, @{b }END@{ub } requires +that the type of each pointer matches the type used when it was allocated +with @{b }NEW@{ub }. Failure to do this will result in an incorrect amount of memory +being deallocated, and this can cause many subtle problems in a program. +You must also be careful not to deallocate the same memory twice, and to +this end the pointers given to @{b }END@{ub } are re-initialised to @{b }NIL@{ub } after the +memory they point to is deallocated (it is quite safe to use @{b }END@{ub } with a +pointer which is @{b }NIL@{ub }). This does not catch all problems, however, since +more than one pointer can point to the same piece of memory, as shown in +the example below. + + DEF p:PTR TO LONG, q:PTR TO LONG + q:=NEW p + p[]:=-24 + q[]:=613 + END p + /* p is now NIL, but q is now invalid but not NIL */ + + The first assignment initialises @{b }q@{ub } to be the same as @{b }p@{ub } (which is +initialised by @{b }NEW@{ub }). @{i }Both@{ui } the next two assignments change the value +pointed to by @{i }both@{ui } @{b }p@{ub } and @{b }q@{ub }. The memory allocated to store this value is +then deallocated, using @{b }END@{ub }, and this also sets @{b }p@{ub } to @{b }NIL@{ub }. However, the +address stored in @{b }q@{ub } is not altered, and still points to the memory that +has just been deallocated. This means that @{b }q@{ub } now has a plausible, but +invalid, pointer value. The only thing that can safely be done with @{b }q@{ub } is +re-initialise it. One of the @{i }worst@{ui } things that could be done is to use it +with @{b }END@{ub }, which would deallocate the same memory again, and potentially +crash your machine. So, in summary, don't deallocate the same pointer +value more than once, and keep track of which variables point to the same +memory as others. + + Just as a use of @{b }NEW@{ub } has a simple (but rough) equivalent using @{b }NewR@{ub }, +@{b }END@{ub } has an equivalent using @{b }Dispose@{ub }, as shown by the following +sections of code. + + END p + + IF p + Dispose(p) + p:=NIL + ENDIF + +In fact, it's a tiny bit more complicated than that, since OOP objects are +allocated and deallocated using @{b }NEW@{ub } and @{b }END@{ub } (see @{"Object Oriented E" Link "OOE.guide/main" }). + + +@ENDNODE + +@NODE "Array allocation" "Array allocation" +@Next "List and typed list allocation" +@Prev "Object and simple typed allocation" +@Toc "NEW and END Operators" + +Array allocation +---------------- + + Arrays can also be allocated using @{b }NEW@{ub }, and this works in a very +similar way to that outlined in the previous section. The difference is +that the size of the array must also be supplied, in both the use of @{b }NEW@{ub } +and @{b }END@{ub }. Of course, the size supplied to @{b }END@{ub } must be the same as the size +supplied to the appropriate use of @{b }NEW@{ub }. All this extra effort also gains +you the ability to create an array of a size which is not a constant +(unlike variables of type @{b }ARRAY@{ub }). This means that the size supplied to +@{b }NEW@{ub } and @{b }END@{ub } can be the result of an arbitrary expression. + + DEF a:PTR TO LONG, b:PTR TO myobj, s + NEW a[10] /* A dynamic array of LONG */ + s:=my_random(20) + NEW b[s] /* A dynamic array of myobj */ + /* ...some other code... */ + END a[10], b[s] + +The @{b }my_random@{ub } function stands for some arbitrary calculation, to show that +@{b }s@{ub } does not have to be a constant. This form of @{b }NEW@{ub } can also be used as an +expression, as before. + + +@ENDNODE + +@NODE "List and typed list allocation" "List and typed list allocation" +@Next "OOP object allocation" +@Prev "Array allocation" +@Toc "NEW and END Operators" + +List and typed list allocation +------------------------------ + + Lists and typed lists are usually static data, but @{b }NEW@{ub } can be used to +create dynamically allocated versions. This form of @{b }NEW@{ub } can be used only +as an expression, and it takes the list (or typed list) as its argument +and returns the address of the dynamically allocated copy of the list. +Deallocation of the memory allocated in this way is a bit more complicated +than before, but you can, of course, let it be deallocated automatically +at the end of the program. + + The following example shows how simple it is to use @{b }NEW@{ub } to cure the +static data problem described previously (see @{"Static data" Link "Types.guide/Static data" }). The +difference from the original, incorrect program is very subtle. + + PROC main() + DEF i, a[10]:ARRAY OF LONG, p:PTR TO LONG + FOR i:=0 TO 9 + a[i]:=NEW [1, i, i*i] + /* a[i] is now dynamically allocated */ + ENDFOR + FOR i:=0 TO 9 + p:=a[i] + WriteF('a[\\d] is an array at address \\d\\n', i, p) + WriteF(' and the second element is \\d\\n', p[1]) + ENDFOR + ENDPROC + +The minor alteration is to prefix the list with @{b }NEW@{ub }, thereby making the +list dynamic. This means that each @{b }a[i]@{ub } is now a different list, rather +than the same, static list of the original version of the program. + + Typed lists are allocated in a similar way, and the following example +also shows how to deallocate this memory. Basically, you need to know how +long the new array is (i.e., how many elements there are), since a typed +list is really just an initialised array. You can then deallocate it like +a normal array, remembering to use an appropriately typed pointer. +Object-typed lists are restricted (when used with @{b }NEW@{ub }) to an array of at +most one object, so is useful only for allocating an initialised object +(not really an array). Notice how, in the following code, the pointer @{b }q@{ub } +can be treated both as an object and as an array of one object (see +@{"Element selection and element types" Link "Types.guide/Element selection and element types" }). + + OBJECT myobj + x:INT, y:LONG, z:INT + ENDOBJECT + + PROC main() + DEF p:PTR TO INT, q:PTR TO myobj + p:=NEW [1, 9, 3, 7, 6]:INT + q:=NEW [1, 2]:myobj + WriteF('Last element in array p is \\d\\n', p[4]) + WriteF('Object q is x=\\d, y=\\d, z=\\d\\n', + q.x, q.y, q.z) + WriteF('Array q is q[0].x=\\d, q[0].y=\\d, q[0].z=\\d\\n', + q[].x, q[].y, q[].z) + END p[5], q + ENDPROC + +The dynamically allocated version of an object-typed list differs from the +static version in another way: it always has memory allocated for a whole +number of objects, so a partially initialised object is padded with zero +elements. The static version does not allocate this extra padding, so you +must be careful not to access any element beyond those mentioned in the +list. + + The deallocation of @{b }NEW@{ub } copies of normal lists can, as ever, be left to +be done automatically at the end of the program. If you want to +deallocate them before this time you must use the function +@{b }FastDisposeList@{ub }, passing the address of the list as the only argument. +You @{i }must@{ui } not use @{b }END@{ub } or any other method of deallocation. @{b }FastDisposeList@{ub } +is the only safe way of deallocating lists allocated using @{b }NEW@{ub }. + + +@ENDNODE + +@NODE "OOP object allocation" "OOP object allocation" +@Prev "List and typed list allocation" +@Toc "NEW and END Operators" + +OOP object allocation +--------------------- + + Currently, the only way to create OOP objects in E is to use @{b }NEW@{ub } and +the only safe way to destroy them is to use @{b }END@{ub }. This is probably the +most common use of @{b }NEW@{ub } and @{b }END@{ub } and is described in detail later (see +@{"Objects in E" Link "OOE.guide/Objects in E" }). + + +@ENDNODE + diff --git a/amigae33a/E_v3.3a/Docs/BeginnersGuide/Modules.guide b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Modules.guide new file mode 100644 index 0000000..e4021e0 --- /dev/null +++ b/amigae33a/E_v3.3a/Docs/BeginnersGuide/Modules.guide @@ -0,0 +1,260 @@ +@database beginner.guide + +@Master beginner + +@Width 75 + + +This is the AmigaGuide® file beginner.guide, produced by Makeinfo-1.55 from +the input file beginner. + + +@NODE "main" "Modules" +@Next "Exceptions.guide/main" +@Prev "BuiltIns.guide/main" +@Toc "Contents.guide/main" + +Modules +******* + + A @{fg shine }module@{fg text } is the E equivalent of a C header file and an Assembly +include file. It can contain various object and constant definitions, and +also library function offsets and library base variables. This information is +necessary for the correct use of a library. + + A @{fg shine }code module@{fg text } is an extension of the module idea. As well as object +and constant definitions, a code module can contain procedures and global +variables. Code modules are like C and Assembly object files. + + + @{" Using Modules " Link "Using Modules" } + @{" Amiga System Modules " Link "Amiga System Modules" } + @{" Non-Standard Modules " Link "Non-Standard Modules" } + @{" Example Module Use " Link "Example Module Use" } + @{" Code Modules " Link "Code Modules" } + + +@ENDNODE + +@NODE "Using Modules" "Using Modules" +@Next "Amiga System Modules" +@Toc "main" + +Using Modules +============= + + To use the definitions in a particular module you use the @{b }MODULE@{ub } +statement at the beginning of your program (before the first procedure +definition). You follow the @{b }MODULE@{ub } keyword by a comma-separated list of +strings, each of which is the filename (with path if necessary) of a +module (without the @{b }.m@{ub } extension--since every module file name must end +with @{b }.m@{ub }). The filenames (and paths) are all relative to the logical +volume @{b }Emodules:@{ub } (which can be set-up using an @{b }assign@{ub } as described in the +`Reference Manual'), unless the first character of the string is @{b }*@{ub }. In +this case the files are relative to the directory of the current source +file. For instance, the statement: + + MODULE 'fred', 'dir/barney', '*mymod' + +will try to load the files @{b }Emodules:fred.m@{ub }, @{b }Emodules:dir/barney.m@{ub } and +@{b }mymod.m@{ub }. If it can't find these files or they aren't proper modules the E +compiler will complain. + + All the definitions in the modules included in this way are available +to every procedure in the program. To see what a module contains you can +use the @{b }showmodule@{ub } program that comes with the Amiga E distribution. + + +@ENDNODE + +@NODE "Amiga System Modules" "Amiga System Modules" +@Next "Non-Standard Modules" +@Prev "Using Modules" +@Toc "main" + +Amiga System Modules +==================== + + Amiga E comes with the standard Amiga system include files as E modules. +The AmigaDOS 2.04 modules are supplied with E version 2.1, and the +AmigaDOS 3.0 modules are supplied with E version 3.0. However, modules +are much more useful in E version 3.0 (see @{"Code Modules" Link "Code Modules" }). If you want to +use any of the standard Amiga libraries properly you will need to +investigate the modules for that library. The top-level @{b }.m@{ub } files in +@{b }Emodules:@{ub } contain the library function offsets, and those in directories +in @{b }Emodules:@{ub } contain constant and object definitions for the appropriate +library. For instance, the module @{b }asl@{ub } (i.e., the file @{b }Emodules:asl.m@{ub }) +contains the ASL library function offsets and @{b }libraries/asl@{ub } contains the +ASL library constants and objects. + + If you are going to use, say, the ASL library then you need to open the +library using the @{b }OpenLibrary@{ub } function (an Amiga system function) before +you can use any of the library functions. You also need to define the +library function offsets by using the @{b }MODULE@{ub } statement. However, the DOS, +Exec, Graphics and Intuition libraries don't need to be opened and their +function offsets are built in to E. That's why you won't find, for +example, a @{b }dos.m@{ub } file in @{b }Emodules:@{ub }. The constants and objects for these +libraries still need to be included via modules (they are not built in to +E). + + +@ENDNODE + +@NODE "Non-Standard Modules" "Non-Standard Modules" +@Next "Example Module Use" +@Prev "Amiga System Modules" +@Toc "main" + +Non-Standard Modules +==================== + + Several non-standard library modules are also supplied with Amiga E. To +make your own modules you need the @{b }pragma2module@{ub } and @{b }iconvert@{ub } programs. +These convert standard format C header files and Assembly include files to +modules. The C header file should contain pragmas for function offsets, +and the Assembly include file should contain constant and structure +definitions (the Assembly structures will be converted to objects). +However, unless you're trying to do really advanced things you probably +don't need to worry about any of this! + + +@ENDNODE + +@NODE "Example Module Use" "Example Module Use" +@Next "Code Modules" +@Prev "Non-Standard Modules" +@Toc "main" + +Example Module Use +================== + + The gadget example program in Part Three shows how to use constants +from the module @{b }intuition/intuition@{ub } (see @{"Gadgets" Link "Examples.guide/Gadgets" }), and the IDCMP example +program shows the object @{b }gadget@{ub } from that module being used (see +@{"IDCMP Messages" Link "Examples.guide/IDCMP Messages" }). The following program uses the modules for the Reqtools +library, which is not a standard Amiga system library but a commonly used +one, and the appropriate modules are supplied with Amiga E. To run this +program, you will, of course, need the @{b }reqtools.library@{ub } in @{b }Libs:@{ub }. + + MODULE 'reqtools' + + PROC main() + DEF col + IF (reqtoolsbase:=OpenLibrary('reqtools.library',37))<>NIL + IF (col:=RtPaletteRequestA('Select a colour', 0,0))<>-1 + RtEZRequestA('You picked colour \\d', + 'I did|I can\\at remember',0,[col],0) + ENDIF + CloseLibrary(reqtoolsbase) + ELSE + WriteF('Could not open reqtools.library, version 37+\\n') + ENDIF + ENDPROC + +The @{b }reqtoolsbase@{ub } variable is the library base variable for the Reqtools +library. This is defined in the module @{b }reqtools@{ub } and you @{i }must@{ui } store the +result of the @{b }OpenLibrary@{ub } call in this variable if you are going to use +any of the functions from the Reqtools library. (You can find out which +variable to use for other libraries by running the @{b }showmodule@{ub } program on +the library module.) The two functions the program uses are +@{b }RtPaletteRequestA@{ub } and @{b }RtEZRequestA@{ub }. Without the inclusion of the @{b }reqtools@{ub } +module and the setting up of the @{b }reqtoolsbase@{ub } variable you would not be +able to use these functions. In fact, if you didn't have the @{b }MODULE@{ub } line +you wouldn't even be able to compile the program because the compiler +wouldn't know where the functions came from and would complain bitterly. + + Notice that the Reqtools library is closed before the program +terminates (if it had been successfully opened). This is always +necessary: if you succeed in opening a library you @{i }must@{ui } close it when +you're finished with it. + + +@ENDNODE + +@NODE "Code Modules" "Code Modules" +@Prev "Example Module Use" +@Toc "main" + +Code Modules +============ + + You can also make modules containing procedure definitions and some +global variables. These are called @{fg shine }code modules@{fg text } and can be extremely +useful. This section briefly outlines their construction and use. For +in-depth details see the `Reference Manual'. + + Code modules can be made by using the E compiler as you would to make +an executable, except you put the statement @{b }OPT MODULE@{ub } at the start of the +code. Also, any definitions that are to be accessed from outside the +module need to be marked with the @{b }EXPORT@{ub } keyword. Alternatively, all +definitions can be exported using @{b }OPT EXPORT@{ub } at the start of the code. +You include the definitions from this module in your program using @{b }MODULE@{ub } +in the normal way. + + The following code is an example of a small module: + + OPT MODULE + + EXPORT CONST MAX_LEN=20 + + EXPORT OBJECT fullname + firstname, surname + ENDOBJECT + + EXPORT PROC printname(p:PTR TO fullname) + IF short(p.surname) + WriteF('Hello, \\s \\s\\n', p.firstname, p.surname) + ELSE + WriteF('Gosh, you have a long name\\n') + ENDIF + ENDPROC + + PROC short(s) + RETURN StrLen(s)