`8 #•phù &<ÖCø@Eúÿô$´‘g: < AúT/?< NA\><Èyÿ‚By"ÿ‚@a$QÏÿê><æyÿ‚Byÿ‚@aQÏÿêNu<<èNqNqQÎÿúNu BUDGIE UK VIRUS FREE ! All Circuits Operational.... ------------------------------ Distributed under Licence ***** ½ 1990 BUDGIE UK *****  ˆÿÿÿÿo€   ðÿ à @`€ Àà! #@%`'€) +ðÿ-à/1 3@5`7€9 ;Àÿÿÿ?A C@E`ÿI KÀMàOQ S@U`W€Y [À]à_a c@e`ÿi kÀmàoq sðÿÿow€ÿ¯{ðÿ}àÿðÿƒ@…`ÿÿÿÿ‹Ààÿ ‘ “@ •` —€ ™  ›À à Ÿ ¡ £@ ¥` §€ ©  «À ÿï ¯ ± ³@ µ` ·€ ¹  »À ½à ¿ Á Ã@ Å` Ç€ É  ËÀ ÿï Ï Ñ Ó@ Õ` ×€ ÿ¯ ÛÀ Ýà ßÿ/ã@å`ç€ÿ¯ëÀíàïñ ó@õðÿ÷€ù ûÀýàÿ!Aa ¡ÿÿÿ áñÿ!A!¡Áá!!#A%a')¡+Á-á/1!—B5a79ñÿ;Áÿÿÿ?A!CAEaGI¡KÁMáOQ!SAUaWY¡[Á]ñÿÿÿÿa!cAeagi¡kÁmáoq!sAuawy¡{Á}á!ƒA…a‡‰¡‹Áá‘!“A•a—™¡›Á១!£A¥a§ÿ¯ÞÁ­á¯±ñÿ³Aµa·¹¡»Á½á¿Á!ÃAÅaÇÉ¡ËÁÍáÏÑñÿÓAÕa×Ù¡ÛÁÝñÿßá!ãAåaçé¡ëÁíáÿóñÿÿOõ¡%ÿù¡ûÁýáÿ " B b ‚ ¢  â !"!B!b!ÿ-â"/#1"#3B#5b#7‚#9¢#;Â#=â#?$A"$CB$Eb$G‚$I¢$KòÿMâ$O%Q"%SB%UòÿW‚%Yòÿ[Â%]â%_&a"&cB&eb&g‚&i¢&kÂ&mâ&o'q"'sB'ub'w‚'y¢'{Â'}â'("(ƒB(…b(‡‚(‰¢(‹Â(â()‘")“B)•b)ÿ)™¢)›Â)â)Ÿ*¡"*£òÿÿÿÿÿo€   ðÿ à @`€ Àà! #@%`'€) +ðÿ-à/1 3@5`7€9 ;Àÿÿÿ?A C@E`ÿI KÀMàOQ S@U`W€Y [À]à_a c@e`ÿi kÀmàoq sðÿÿow€ÿ¯{ðÿ}àÿðÿƒ@…`ÿÿÿÿ‹Ààÿ ‘ “@ •` —€ ™  ›À à Ÿ ¡ £@ ¥` §€ ©  «À ÿï ¯ ± ³@ µ` ·€ ¹  »À ½à ¿ Á Ã@ Å` Ç€ É  ËÀ ÿï Ï Ñ Ó@ Õ` ×€ ÿ¯ ÛÀ Ýà ßÿ/ã@å`ç€ÿ¯ëÀíàïñ ó@õðÿ÷€ù ûÀýàÿ!Aa ¡ÿÿÿ áñÿ!A!¡Áá!!#A%a')¡+Á-á/1!—B5a79ñÿ;Áÿÿÿ?A!CAEaGI¡KÁMáOQ!SAUaWY¡[Á]ñÿÿÿÿa!cAeagi¡kÁmáoq!sAuawy¡{Á}á!ƒA…a‡‰¡‹Áá‘!“A•a—™¡›Á១!£A¥a§ÿ¯ÞÁ­á¯±ñÿ³Aµa·¹¡»Á½á¿Á!ÃAÅaÇÉ¡ËÁÍáÏÑñÿÓAÕa×Ù¡ÛÁÝñÿßá!ãAåaçé¡ëÁíáÿóñÿÿOõ¡%ÿù¡ûÁýáÿ " B b ‚ ¢  â !"!B!b!ÿ-â"/#1"#3B#5b#7‚#9¢#;Â#=â#?$A"$CB$Eb$G‚$I¢$KòÿMâ$O%Q"%SB%UòÿW‚%Yòÿ[Â%]â%_&a"&cB&eb&g‚&i¢&kÂ&mâ&o'q"'sB'ub'w‚'y¢'{Â'}â'("(ƒB(…b(‡‚(‰¢(‹Â(â()‘")“B)•b)ÿ)™¢)›Â)â)Ÿ*¡"*£òÿBUDGIE UK ;t COMMON At FONTS Yt tINCLUDES kt ‰NOTES ‹t SHELL  t =½BUK+t ñÜPENNY NEO µý÷€}DESKTOP INF0t öêå F2t ÷å G 4t øVÏ. < t.. < tGENST2 INF=t GENSÔÀÿ70ÿ. A t.. A tBUDGIE TITCt "DRUM1 SPLEt W~GAMES S Jt ,ØASCROLL UP Mt =dWRITER UK Ot >.!PENNY PI1Rt GB}HIGH SCOVt gê10@P`puvws77wfþþððÿÿÿÿÿÿ ?ÿŸ€€øÿ€€ÿ€€ÿ€€_þþþ`€€/o0ð@À/ôðð0 ÿÿÿ @À/ÿÿÿ0@À/ÿÿÿ0@À ?ÿ?ÿÀ@ÀPŸŸ`` €€`P øø`ÿÿ €€`Pÿÿ` €€`Pÿÿ` €€`_þ`ÿ€ €€`¯o0ð?ÿÀPÀÀ0¯õ0 ?üÀ+ÿ ÿ0PÀÀ0¯ÿ0?ÿÀPÀÀ0¯ÿ0?ÿÀPÀÀ0 ÀÿÿPÀÀ0P``ÿ€¨`àP `þ€€€Tÿ`¨`àP`ÿ€¨`àP`ÿ€¨`à_þŸþà¨`à¯oÏððT0ð ¯õÏóð@À«ÿ3ÿ<ÀT0ð ¯ÿÏÿðT0ð ¯ÿÏÿðT0ð _þàT0ð _Ÿà`ª˜x_ú à €€`Wÿdx€ª˜x_ÿઘx_ÿઘx_ÿઘx_Ÿà`ª˜x_ý àPÀÀ0¯ÿÌðª˜x_ÿઘx_ÿઘx_ÿઘx_Ÿà`ª˜x_þà¨`à_ÿઘx_ÿઘx_ÿઘx_ÿઘx_Ÿà`ª˜x_ÿàT0ð _ÿઘx_ÿઘx_ÿઘx_ÿðઘx_Ÿà`ª˜x_ÿÀઘx_ÿÿàT0ð ¯ÿÏðT0ð _ÿÿàT0ð _Ÿà`ª˜x_Ÿà`ª˜x_ÿÀઘx_€€à¨`àQøa~€¨`à_€€à¨`à_Ÿà`ª˜x_Ÿà`ª˜x_¿°à@ª˜x_€€à¨`à­û1>ÀPÀÀ0_ƒ€àPÀÀ0_ÿðઘx_Ÿà`ª˜x_Ÿà`ª˜x_¿¿à@T0ð Uú ` €€`_ýüàPÀÀ0_ÿઘx_Ÿà`ª˜x_Ÿà`ª˜x_ÿÀઘxUú ` €€`_þà¨`à_ÿઘx_Ÿà`ª˜x_Ÿà`ª˜x_ÿÀઘxUú ` €€`_þà¨`à_ÿઘx_Ÿà`ª˜x_Ÿà`ª˜x_ÿÀઘxUú ` €€`_þà¨`à_ÿઘx_Ÿà`ª˜x_Ÿà`ª˜x_ÿÀઘxUú ` €€`_þà¨`à_ÿðઘx_Ÿà`ª˜x_Ÿà`ª˜x_¿°à@ª˜xUú ` €€`_ýüàPÀÀ0_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜xUú ` €€`_‚à €€`_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜xUú ` €€`_½ƒà@À_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜xUú ` €€`_£Ÿà@À_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜x_Ÿà`ª˜xUú ` €€`_ Ÿà €€`_Ÿà`ª˜x_Ÿà`ª˜x_¿°à@ª˜x_Ÿà`ª˜x­û1>ÀPÀÀ0_¿€àPÀÀ0_Ÿà`ª˜x_Ÿà`ª˜x_ÿÀઘx_Ÿà`ª˜xQøa~€¨`à_€€à¨`à_ÿðઘx_ÿðઘx_ÿÀઘx_ÿðઘx¯ÿÏðT0ð _ÿÿàT0ð _ÿઘx_ÿઘx_ÿàT0ð _ÿઘx_ÿઘx_ÿઘx_ÿઘx_ÿઘx_þà¨`à_ÿઘx_ÿઘx_ÿઘx_ÿઘx¯ÿÌðT0ð _ý àPÀÀ0¯ÿÌðT0ð _ÿઘx_ÿઘx_þàT0ð Wþdx€¨`à_ú à €€`Wþdx€¨`à_ÿઘx_ÿઘx_þŸþà¨`à«ý3ü<ÀPÀÀ0¯õÏóð@À«ý3ü<ÀPÀÀ0¯ÿÏÿðT0ð ¯ÿÏÿðT0ð  ÀÿÿPÀÀ0Tÿ` €€`P `þ€€€Tÿ` €€`P`ÿ€¨`àP`ÿ€¨`à_þ`ÿ€ €€`+ý ÿ0@À¯õ0 ?üÀ+ý ÿ0@À¯ÿ0?ÿÀPÀÀ0¯ÿ0?ÿÀPÀÀ0 ?ÿ?ÿÀ@Àþþ€€P øø`þþ€€Pÿÿ` €€`Pÿÿ` €€`_þþþ`€€ ýüü /ôðð0 ýüü /ÿÿÿ0@À/ÿÿÿ0@ÀŽŠ‡…„}€v|yunrjfd__\X[YVZ]W]]Xc\dahdgfjhemifhhdeeceedkhmpww|~‚}„~ƒ€ƒ€„ƒ‚~€y|{xt{pxvrvtvpypvrvstvprrlllcca\W]RUTTSXXX`^`edfjklqst{}€…†Š‰ŽŽŒ‹ŠŒˆ‰Œ‡‘Ž‘—˜š›¡š¤¡¤¢£¤§¢§¦¥©¤¨¥£¢ŸŸ™™—”’“‹‘‹Ž‹ŽŒŽŽŽŽŽŽŒŒ‹Œ‹ŠŠ‰‰ˆ‡‡†„‰„†ˆ…†‰ˆ‡ˆ‹ŠŠŒ‹‡‹…„‡~~}xsrmidc`\[ZWVWVQVPOPMILGDFC?@?<==:<9;8:99<<>ADDHMLTUZ]aehnovvz~„…ŠŒ’“—œ™Ÿž¡¢¦¦ª««¯°°µ³µ·µ·¹·¶·´µ±±±­¬ª¨¢¦Ÿžœ™˜—”’’ŽŒ‹Š‡†…€{zuwrppjkhfcc_\YXTSTRQRTRTVVUXWXY[Z[][[_]\`^__`bcfflhnnorqtswuyz{€€…„ˆŒ‰ŽŒŒŠ‹Š‰‡‡†……‚„€€€}€}~}}€}€~~~~}|||{{}{|~‚€„„„†‡†‡ˆ†‡††……†††‡ˆˆˆŠ‹‹Œ““–—˜˜š˜˜™™——˜••””‘“Œ‹‰ˆ„†ƒ‚ƒ€‚€€~}zwŒkˆhœsy£_˜n”o€jži“m‡l{dT{£´‰gÖ‘» ”5§X?€OD9*0œ‹d“2E(WGcM3ˆ‡À6ߨg yàØ|¼c稱­dy³à\·ŠwŽ7†,Ž6†y,# j ;P'{;\+Py“£¦ÃÆŸ¸×ì¶Ì×éÒÇܤ¤¥¢•€Ÿ f]Y g:C#R[VXIE)R2OD80KlI5bL:MPJ@/X2QOD?R;2O"=*"E09D\(HSm@nt Šº»¨ÅÖÁÓàØçÖÈëßÖáèÇÐÍĤƿ·ŒŠŽ~obQgV0V=!1,'     /1F%72<9E]SWƒh{¨‚Ÿ¬˜ÍžÚì×òøãÿâû÷àôÿìæúîÐæÐÍÀ¹Á”¬•xˆJ‹PWL<A 9   *'/5&@?F3_:O^ClmYLpNYh\^eq}ƒ†»€Ž£—Š©¿’ÊЕÝȦæÈ»áä¨÷Ú¿ÿÈÝßãÃñÌÏêÍ×ÕÆÒä´ÞйÕÀ¯Ó²»Ò°ŸÐ¢µž“€gzb^l]JS@)C)(    &0/6>PFjSilyhsƒf‰lq‹ys“†„šƒxŽ€{}„ƒ—”}ºŽ’°¥‡·¬¿¤µœ™Ä¨¿ººÍɵϺ«Àº³°¾»Ä¸ÏËÄÌÕлçÀÏËϺѽ®Æ´®¶°§³˜žƒˆpipaYZP?M3?4374+30*   24+BC;6ZD]`mkt|‰|šƒ“Ÿu¨„Ÿ¢† wµz¢’¢ƒ²–´¦©º¦¯°£°¡°­Â砻دҿȭؠϴ·ÅÀ¿É»¿ÎĸƯ¿¬²ª´™Ÿ¢ˆ™—Štšk~l`fh[PIP7F2#;%0 $)"+0)7 7H1_N?SAH?>*O%18,8#5-) @;.*4E!>M.BGFAXOa^om‚‡”Ÿ›šÃ¥½´ÍºÖÉÛÙÖäÛéÛàéÞÛáÔãÏØÌÛÀÅÌ¿­¾ºŸ´£±™¤œ–•Ž’ˆŽ„Š—mš–‰|¥ƒ¢‘—œ–£¨™£¶«À—΢»±»ª¶¸¯¸©¿®¨¸³›­¬Ÿ–¦Š“Š~‚xm}eqYs`YdYRUT?Y@ID=8K.3:;?0+H%H1J1G@;K9P:WDOYRQgXcajXua]u_birZmuXrn`pp^do^_hXaT_XEPHH:D4B=-O0;T1QFUHeUU€Y|r…Œ‰šˆš• ¥š£¢Ÿ§š¦£—°“®—®˜ª£Ÿ¡£¡§  ¨¢¡¨ª¡®©ª¬®±³­¼³µÌ±ÎÈËËÛÍÓâÎÞÞÒÛßÖÒæÈÔÜËÎÐËÇÃÀ£«©œ˜™‘Žryvp^n\U`OMKL?D@8?1;+;0/80)72,76/@/>;?;F@;Q@KHGVIRK_JS`KaZ]Y`UeUWdR]dSba[aiagjeo`kpcfpl]vcojljskmxpu~„†„‚Œ‹’Œœ‘˜ž–œ™¤šœ§›©£©ªŸ¤¨¤¨¡ £—šŸ“‰˜ˆ‰~‡z‚€rƒ…„‘‹™‹›•“ ™§’¡§•œ Ÿ‹ –‹š‘ƒ‹‡ƒƒ€s„x}v~zp€wot{qpnzzz{€€…‚…ŽŒ•’”›š ©ž¯«­±·±¹¼²¼¾¹¸¹º¶¯°°ª¥¦£œ”œ‹„„trtbd^[NNTCCAH5F67@475;*;01722867:@3CC>FCO?WJQRU[S]Z_Ydg_lfoiqtnzwyz}…sz‰†‰ˆŒ–„š˜‘™›™›¡›¢ §¤¤©¤©ª³¢¶´¬¹·¶¶¼·»½¹¸Â²À»¼·À²½¸¶¸½³µ¼¯½µ³´µ¬²°­©¨ªž§Ÿ›‹™‰ˆŠ€Š|ƒ„q‹zw‚~qƒzw|z{€{y~v~vrwvhrjehcdZdT^TSWMRLSILNFGCI@;F8B;?:B:?C?DBOBMRLQYYUd`_keumsyu‚{€Š“‰—–’Œ“‘‡‰‡‰†ƒ|Šs{xordl[aY]MUOOLHOGMHLBKHGDLJHLNKRYMZV_Vd_camje{lyu‚u……~†Ž“”˜–—¢—§š§¢¡®Ÿ°¢·£¯­ªµ§¶®²±µµ²¼²¶º¯¼°¼¶±½³¼±Á¯½´³¼°¸´·¬¹±­´«²­¦±©¥¬«©¢©¥¤  ¢›ž•“•‹™‰‡…}wxqslnpapdeiaa``a[`XaS^XWZVYV^QVVWRSZPQWTLXMQQQNPROTQNXPSVWUP_M[UUWW[OcXXc]`ah`kilqpq|y{€ƒ„ƒŽ‹–˜•œ¡›¥¤¤¥§ª£­¦ª¨¥¬¤§¦£¥›©˜ž˜˜’ˆˆƒ€|syrpqmljgibdeXf[]\_\ZaZaXe[aa^g^dhghenimnjultounsxq{v}|}€„„††ˆ‡Š‘‹‘Œ““‘•—’—›–—œ•›–š™”Ÿ”š˜œ•˜šš›Ÿ– ™žš™˜šž˜˜ž—š–›•—™‘–”’‡ Ž‰š‡†‘„ŠƒŽyŠ}‡v{zzptxoonklchl``d]b]bSkZd\a]ch{lX@@=HCXTiiou~’†Œƒ‡v{rm^[VUQJQGXQ]_\tp~Ž›£ ª ¤¨›˜ž‹‰rwxtsurx‡~†˜£¨§³¼µÀ¼Ã¼¿¶¸­«Ÿšˆ|{lqfbhabcjjlqy{~Œ‰ŒŽˆˆŠ}vzsdceRWXCSRASVPZcekh~Œ–”––—‘‘Ž‚‡q{qgq`kjenipw~x‘‚š–Ÿ¢¦¤ª¬§¢«¦”œ›‡’…~€}oypousy{wƒ†€‘š‡¦š¡§ŸŸ¤Ž¥’Œ†}wysghfg[^e`_fhgs`~rwzu}v}njseZ`YJLDI9>@<8GOXaWLJM?=RR9=2913-/,).%+%$*$'%-")*',+0/53?8=D@DIDKJJLNORPS\V_cefmmlvoxxyx~w{zw~x}€ƒ‡„ŠŠŽŠ’Ž’“’”“™˜™™Ÿš™š˜™›–˜™•“–”’Ž‘Šˆ†€„}}xwrmiabSVNHH>@7813/+0*.).3+2594?@;FDDIHKLMNNQOSPURUXWZXa__dedfmgkpjnqpqwtz{}„ˆˆ–•šŸŸ¥ª­³¹¹ÀÅÅËÏÑÔÖÙÛÚÛÛÛÙÚØÚÓÖÖÓÑÐÐÍËÉÇÁÀºº®­¨¤››˜Œ‘ˆ‡ƒ{yxppmhgc^`\WWXQTPTNRPMSLRNSPQWUXX\Z]aacfgjkqpwrz|yƒ‡„Œ†Ž”——˜¡¢¡¤£¦¤¦¤¥¦£¨£§¥§¦©§©ª­ª¯«­®­¬®¬¨°«««­©­¨¨©¦¦¥¥¤¥£¢¢£žŸ¡œ›™”˜‘„ˆ„}zwpjja`]YSVPONKJMIILGKILLLPQOUSXWYY[]Ya[^_^^]a_`bacehfiljpnppuosrrrrvrvxwxz||€…ƒ‹ˆŒ”“œ˜Ÿ ¦§ª³®¶¹ºº¾¾»¿¾½½¼º¸¼³·¶³´¯²«¬¨¦Ÿž™•‘‹Š…ƒ~}vwtpmmkgfc`^]VXUVPSQPOQPMUOSRWSY[X_]abcggjllqpuqyw|~~…ˆ…‰Ž“”““”–––š—˜š–›–™˜•˜“–’—”“‘‘Œ‘ŽŒŽ‹Œ‹‡‹ˆ‡ˆ‡†ƒ…ƒƒ}{{v{usvoplliifeb`_X\USROMKIHED@A<=<9;897;7:;=>@CCFIJIOOOSTVXZZ\^^bacggkjplqrrttvrxvtywwwzwzz{}|{~~€ƒ‚†††ŠŒ‹’‘–—™›ž¡ ¦¦¨©ª¬«­­­®«±«®¬­«ª«¨¨¦£¢Ÿ››–“‘Ž‹ˆ…„€~wztsppljjggbfacbadabcdddhfiijomppssvxx|{~€ƒ…†ˆ‰‹‘”“—–•™™˜šš˜š›š›œš››šœ™›š›—š˜™–—˜•—•—•”•–““•“’”’’“‘’ŽŽŒ‹Šˆ‰‡„‡„€€~}|yyvvprplljibl[e^^TZZZUUWPZVOPQ^O^V}“YA&(-.EC_ev’¢™¢ªŸ ˜ Ÿ“‘›Šƒ‚uxkrwcde_l[^]j_beilmlyƒ‰x‡vŒ›¦¦¸·ÆÃÊÍÐÊÐÆÐÑƾ͸¶´°½Ÿ«§£¤”–’‰“~‚ˆw|tgnnacXX^LXGSRNSNWaOd`mfsx}†’‘’š¥£›¨­Ÿ³¡©©£¤›–¡”„–”€‡Œx„‡n~iq{jjhobVhWfOV[WYSUVVaW^ep_zlxŒŽ– –©–²¡¥¬¡¬¨©™¤§¡›ˆ—‡‡{~}q{pmhdmgZ__IeOGRMIHH;U?=JMIDQLO[OdVclknn|s„t‹‚‚ƒ‰z‰ˆ}zz…tjzwdqfn^jd^b\_V^SYVRKSOKQHCRLJKLOWOR]^Wekgkx}r…‘ŽŸ˜¡¥œª¤ª¨¢§° ¥¤—«˜——™”‹”€ˆ{‚‚r€uryonjrpejilbjl_x`optpt{Š}Šˆ–˜• ™Ÿ£¡¥ ¢©¥š¢¢Ÿ”Ÿ“–‘’Ž‡†‡|‡z}€tyvupvjmslgmgliflhuemrsow~p„ˆwŽŽ™•—¢¦ ‘« Ÿœ —£–ŸŽ‰‡Œ}ƒt{zospiph`ja]fZX]\QYTSYSQW[PYZ[`\bdfemmmtrwxvxƒ~}}ƒ~{z€uyusvnmkqegh_ed`c`\adX_`[a[_\cb_bcn`kpkxss{‡w‡†Ž˜‘›™©¤¤¨¯«­¬³«°³©ª°®¢¨§¥ £žœ¡•›™—‘˜‘ŽŒŽ‡ˆŒ††‡ƒ††‚„ƒ†…†„‰Š…‹Œ‘Ž—’–š›—ž›Ÿ™žžŸ–œ˜˜˜’Ž’ˆŠƒ‡|ztxurqukrgoiqdmeipbmjqftjstssyx~|‚…ƒ†Ž… ‡›˜–œ› —©˜šœ›™š‘••‘Š‹‡Šƒƒ€ƒy‚|vx}vqyqvmvlsqpnpsosopxpsvvvzzxx„~€ƒˆ€‚†ƒ‚„€}ƒ~x|wyuqnondlcf`b`[`W^XYVXYSVWXT[VV_YY^_b`bffkiolstw|w€€ƒ‚ˆƒ‹Š‹ŽŽŒŒŠŒŠ‡…‹‡ƒ…‡‚~~|}z~{|~zz€}|}}||„„€‡†‡‡‹‹‹‹’Œ•–••™‘“—Ž“”Š‘Šˆ‹€ƒˆ€zƒxzyxtwpurkqmpklhqkkomlsmlvntuts€v|€€‚‡„‡Ž‡’‘’˜–—–™™š–”›—–‘˜Ž”ŒŠˆˆƒ‡†}{~w{xzuwtxxrtwyovsvrvsvwuxxwy{x}u}{z~}xxx|yxvuuupmsgodffba_`X^X\VVYXRWWVWZSX\XY[]\`\a`feclilnsmvuwzzy…€††}Œƒ‡‡„„††…|~|}}x{xxyyuwzv{vxz|wz{~|‚‚€†„ƒ‰†ˆ‰Š‰ŽŽ‘“’–ŒŽŽ‹‰Šƒ€ƒƒ€~~~y|ywysussrprosqqqrxowryvxx{~z€ƒ…†ˆŠ‹Ž‘“”“•—˜˜—–›—–˜•––“–ŒŒŒ‡‰‡„‰‚ƒ„‚‚€}}}{}}{€~}€€}~„‚€ƒ‚ƒ…€ƒƒƒ€‚€|{{|xuyrtropmmhjfgecea`ab_^`^a\a`a`aabgceigkkkpnqssuzx{~|„ƒ…„‰ˆ†Š‰‹‰‹ˆ‰ˆ‰‡‡‡…„…ƒƒ„€ƒ€‚€€‚‚€‚„‚ƒ………‡†‡‰Š‰‹Œ‹ŒŽŽŽŽŽŠŽŽ‰Œ‡‰†‡‚‚ƒ|}yy{tvuussqpsnppmqqnpqrqsqtvtvvyvyzyz}}}‚…ƒ†‡…‡Š†‰ˆˆ‡‰‡…†‡„„…„€}~~||{}|z{{|{z{{}{{|}}}}€ƒƒƒ‚‚‚ƒ‚„€ƒƒ‚‚~~~}|{{zyvxvtssrornolmie€WrZŒWhpY?€?d|—v˜©ŒÏܶà·ÂŸ¤l;\('=š šÏÚïÿ¨ÿ¨¯Ù`·PO³Pd/,X, :1"L1@ohOר¯˜ËúæÏÿüëÿêÿØÛÓÿè‘ß Ÿ€Ÿ”-˜[  I?;h†ÇÀÑõ¯âÿÿÿýÿÿèËÿËõ¤ëÄ›¢¿À€ŠkchiSHOY 'FQ0'  %6??I_€]“‡¹¨¯¹ê ×øÄÿæÝ÷üÂôÖí­Û¸Çص¡¬x ‹g€v:PQ&H   +  38#*5&$CUIlfs`e¸l‘°‹Ãˆ¿°›ÂÍ«Ïث㺽áÆ®äÑ¡ÊÂÏ£ÌÊ­¬³Â‡Ë¦²ª–’ƒo¢pNpb]J\Mf,m`OpYgsl„_“€w„]ƒpl‹ppktlƒ@kH7ƒD?oHGe0;‚XYO)wkJ„jsxhf…˜}˜·°r×´£ìºþÙÙêÿÜÔðÓéÛÕÿÐåìÏÍéÍÎл¼»º›¦ ‡„r¤NoZRKT@?`+vP*IZ/@"7 1 AC;([(=uIiP-yH[¤H¨‹¦»²µÙ¦¿À¹×ÐÍáÔµí̼å¬ËÜ·Ì×ÀŸêǧȵ¶´ƒŸšzn‡pm~]—t‚pƒX{j^[X.`O8>) ! 1 #;$35G[ @3B67L,RB3;$-P+MEN;ED;E1}8?xF_l€K›Pm¤df¨`{°u¡šÈ­³¤´µÄºÇ̶òÊÑðàî×òìéößèíðÀñ¹ÛÌÍäÇΤ˭³œ«±˜Š|‡lzpsN[OPXgQCRCQG`5D47R>89LW8;>KC5F9g-fGZ)cL1XSHgJW`Uxc€c§`…‚‡¤{¼•§¨·ËÀ™Ë¸ÔË¿²õÀ»ü§ÓÀÏÊâÈÓàªØ¶Ä¿È°Ç©¾Ã¨ŸÀ«š ‘–y¦i¢plŸt ‡ |°®|¯§©˜‹«£~¥}Ÿzsf“P]oBC\K2AL)*  03,5J+M7R^VHohonyo‡h‡‡Œ›žš…®lŸ©›¨¤€™¬y•¬€Žš~‡”•t•z¤~•}˜z¤“¯˜°›¥˜Ä£¢£©¯¯¬¿ÀžžÃº·ÐÀ¯¸ÈÍöÈËȾÈÆ¥âÀ³Ð¥ëƳÐП½À™×¤˜¼¿¨¿´•®Âˆ™¨°•˜–°r©ŒŸ¤Ž€›{{®u”zxƒ^\cxGUg@OX kL1Pk5cb7L]T[xBcYc_heNLiURTNHPZ+V_0-H<=7.3))=5A'8!FK9S#?HWXQG‚w„¤Œž¯˜¯À¯Ô¸É±áÔçÐÉÓÔÑîØÊÅåÌÈ޵۽ȶŷôµ½”¬£†´‘–“‹…€z~pmzrp]‚^ˆO{hgmWxe‚WhbXcxQjsiko`_j]pWx@‹4sP_\OtD_oTM|SdcmHŽGqvuJ€€Y†€OŒ€qˆ‡}†ŒŠ™y¨™Ž‡œ˜–r†‹xgˆ`sxG€^rSƒMn€\}ju€“}ª€˜“œ“¡|£|’ƒ£ˆ’Šw–mŽoˆpkvlŠT|icjlmvlgkslƒƒy—œŒ£¦”½¥±Ä¼¼ËÌ»ÐÐÊÇè¿ÙÔÛÏÔËÖÉÐʹÊÁ­³º¯«±¬«¬›› Ž™x†{o~zn{Xfb]V\`OL\HFQI6CD/M2G0=8=5/E*M./N'E-S)Q0K8;E?:AL0N9CA?J:QAMRB[E`KaNSgR\ZkPgfbcir^}pn‰irx—Š“Œœ–Š …š„–‚Œ€…{{„‹†Ž—˜• ›œ¢˜£œ˜¡“˜›†”…‹„‡|€v|pqllbd]`OdF]BVDMB;M;I>;Q1NFKIOVLdSgcfrh‡o‹x›„™¥’²ž»«½°ÇºÇÈÇÉÌÆÑÍÍËÔÅÌÇѼ̺γÁ½³°¸ª³©¤¬›¡†ŸŽ‹ŠŠ‡v‡€o€xl|rkpmimj_p[i\h[]dOaXaR[T_TbYUdMf[``]nWepex_d€f‚f{uvzvƒr‡‚z’ƒŒ„¡…¢‹ž˜ž›Ÿš¢¨ŒŸ”‘š–Ž˜™Ž™Š§‘£—¥ ™®˜¶›©¬£«Ÿ£žŸ¤…“‘ƒ„ƒ„uzruird\dTSMO@G:78'B=3#)%#$%,%/+367;;ICGSRPdWh_u^oz}„ƒŽ‡š‰£œ›¢¡¤©©Ÿ°¡²­¥°¥³Ÿ²˜¹—°¡™­§”œ”–˜‹‘„˜€‹„‰€ƒ€{wzxu€qxqvtlmtgtgobl`khdchbjffjampmknups~j€{€„ƒš™…|ntq‚}‡‹˜Ÿ©¨¾¹Ç¿Æ¿É¹À¼½³±©¯¤¥§›¤›¢¤—¥ž¦¤©¦±©µ°²µ¸´½³½»µ¨»­©°¤®§¤¦ ˜£”•–„‹Šx|sgjcR[EN=><403)*&%&#"# !$#%(,)207<1FG?LNUWW`ghhzzx‹„•™£•¡¦› ¦£Ÿ ¦šž¢š™‘˜’”Ž‡Ž„†‰|}wpoviohichYhXgW[_[Y][YZ`_ZaeUjb_hc_gdejeeffmeegqZqf_lehfl^ocerkkjvrpztsˆƒ‚ƒ‚™Ž‰”—–™”Ÿœœ¬§¤µµ¯¼¾Å¾ÊÐÆÒÍÖÌÒÒÏÎÅÄÈÄ´À³°¯§¢£š—š‰„x|pnehT]ZFR=I>865:/3446?1?B9QDMRUW_`ar`urrv{u†~€‚‡~††‡‰„€Ž‰“‹Š‰†’ƒ‡“ƒ‹‹„ˆ…Ž‡ŒŒ…‹†ŽˆŽ‡”“Š”’‘‘’‰”ˆ‹ƒŠ‡€{„wywpnrffed`XfRV^VQVYIYUGXRJXRLWYG^TUaU_bfarjo{u~€‡†””›˜”ž–—ž”‘ “‘š–—š˜–¡œ£¥¥­­¬¶±¹»·»»¼¹º·µ·±³ª­­£¦¡£™Ÿ–––‘‡ƒƒ€~wtwjofbe]W\VRQRJOKLKIQJNNPPSVM_UWb`Xfi_mekomjwpsvvyxy{{…€„‰†‰ŠŒŒ‘“Œ—“‘””’‹”ŒŒ‰Œˆ†ˆƒƒ…}‚|{}zv{vutsqrmmngmgdgh_fcdadbbgaheegjfhlijlogplqlqotnxsvxyxu„qƒx~~|€{‚{}{{w~|{‡z‹ˆƒš‰œ™£œ¯©¯¸µÀÀÁÆÈÆÉÈÈÅÇÁÃÁ¾¼¼º±¶®¯¨¨œ£––‘‰…€€srnj`a\UWSIPGFHI?EIBGDLILROXVZ]baemgousxy~}„€…‡†ŒˆˆŒŒˆŽˆ‹…‡„†‚‚~y{v}vvuxtqvqvlupospprupvqtuuuwuwxtxzxw{w{xzyyxz}vwyvtxqstporlmmhhggccaca``a``dabcffgeojipnmqrnuqqwqptxnxvuz}y†ƒ„Ž˜Ÿ›§£®±³´»º¹À¹¿½º»»±º´¯²®©®¨Ÿª œœ•‹ˆ…ƒ~|vurqjlhibfbabcd`fejfnjqpsuvy|z~~€ƒ‚ƒƒˆ„‡…Š†‰†Š‡…ˆ†„„†…€€ƒy~{}||y}x}xw}xv{ywx{u}xx~w}xz}z€|y~|{|{{zzy~|tvprqsnqpnplqjpkmlnjlnhllikmfjligpeomkposmxpwuxwx|x{}xy}wxwupwlnpmjllinmmstu{|~ƒ‡‰‘”š› ¡¤¦§¨¨ªª¬ª¨®§¬«§¬¨©¤ª ¥¡œŸ˜˜”’Š‹ˆƒ||yuuqqnnnjljnhmllnmqotrvuwx|zz~ƒ„„††ˆˆ‰ˆŠˆŠ‹†Œ‡ˆ‡ˆ„ˆ†„†ƒ‚ƒƒ€€‚}€}||zyxvvvrqropnomnkllhkkhijfjheihggjfijjjknknppqtttyuxzx|z}z|z||z~|{}}|}€||~}}}|y}xyzuwursonlihidcdbdceehhmnovw{~…†ŽŽ“˜™œŸ ¢¤¤¦§¥¨¦¦¦¥§£¤¢¡ Ÿœ™™•“Ž‰‡…}}zwvsqqqnnooopqqrvtv{z}}‚€…‡†‹“‘“–”––™•˜™•˜–—••““’ŒŽ‰Šˆ…„‚~{zywvuvqrppnnnlljkhgjfggfgiehhhgiihgifihfjhiikjkkmnmppprrrsstsuttuutuwuvwxwyzzz||}€}}|}zxzvutqolcŽMxaMiS…X[ˆl—g’†Šª¿¹ÀšlII@K`Smc†ˆÁ¡ÃªÅ±½–¼– †ƒx{rkBuSdRMNQHOBN@cH__gTfpsŠo‡„Ÿ…£—šµž·¹§²¹Á±§ÀÀ¤Ä¡´¯¦“°“—ˆ”‡qmqbsMdN]KG@L:4L2B/@E>36P6ALSJL]_Lw]pkq{w{z‡Š„†€–“€¡‚‘‡€v†€rxwsdldm[bU[QShERU`MW`?`]be]T~Tsfspn‚v…wv€…ƒ{‰ƒŽx—ˆ‡ŽˆšŽ† “‡˜”Ÿ… ‡£z—„y‚~v]Š_jzc]bm^[bXmJbk_[UhWvXsfsl}pwˆsš„ŽŸŽ’§©™´­¯®¸½«³µ¼±±±²°¯ ¬§’°’Ÿ‹‡ˆ‹‚t‚qpxgsj…[{xj€k|y}wr‡Š‹—z—”£ˆš•Ž”—”‰Ÿz…n‡vpuln`ggYW_LN\P>ZHOO@C`>NXFV`C`d^manvm{w‰Š“—ž©¦š¬¨Ÿ¤§©š¥–Ÿ›Š’…}‡ruukeo]_a_ZOiPXcYTdgNkpXvl^ui{‚gŠ€uzˆŠŒ™Š‹˜Š“”Ž™„–~‘ˆ‰|~Š|n‰tq€utywour|{v~y‰|…‰‡ŽŽš–– ž§£ª¤­©±¦¶«²²®¶©¸ª«®¯¨£«œ©ž“Ÿ”Ž•‰„†Šv}vvrgqbgaa[\\MdLJZW@SQDZDKSRG\LSYX^Z]kbapmmpxswx~y‚ƒ‡yŒ}‡„„}‰†~‡ƒ€…‚}ƒ{}vx|tpwlkolbi`fa^\`][^Se_Zch_nkqoyx{…}‹ˆ‹Ž“Ž“™‘’–›Ž••‹„Œ|‹|{}yuf}Wt[_[YQSRGRGMMGFWISPZSjTkpc‹kˆ†•…£š›±£¶´´½Ã»ÁÄÇÁËÀÅÆÃÀ¾Ä²Áµ³®·¥§¥£¡•‘–ˆŽ‰…~‚uwynxnmnwgjxdqpqmr}lwyyw~}x„|~‡{ƒ‚†~ƒ„}‰|‚|‚|wu}swquqllpjdofchcgdagdehejiqgrnywp{~{ˆ|ˆ‡‡ˆŠŠ‹‹ŠŒ„Ž‹†„ƒ†„…‡}ƒ€ƒ~‡}{ƒ|ywx~stvshnpgeehab^`Z][YT\VTXM[SKSZKTYOYVY[eUenagvlu|rƒ€‚„‚—˜”™œš•§—ž ž›¦šŸ¤•¢¡™—¤“¢™•›¢Ž™žš—•‘š’”“”–‘Ž‘‘Ž‹˜‡‘‹“‡‹ˆ†‚‡€ˆ}|zvyoulpgoadg`\`aU`X]T]XZX[][Z_`_gWkifetpk{uy~}ƒ‡‚ˆ‰–†œŽ”“”’•—–Œ–‰‡‰}‚‚zw~purnnnlgphnfqnktoruzo|w{{zwƒzzv‚€t†vwtwzqxjvgqfcec[_ZZYYPWVOYRVV]T]cYficnppt~z}Š…ŒŽ•š– ¡¦¦¬ª°³­»³³Á°¼¸»¶½¸±Á¬¸³°¬­­¥§ £ —š––Ž‡‰ƒ…}~~vqxnvjolilgfggdecbgdafgffgiijmljtisspqvsszrxzuv{yv~vz‚wz}{~~~{z~{|}u‚xx{yt|tqytorrpqqmsquqxww~|}„‚†‹‚Ž‰ŒŠŠ‹‰Š‚‰€z}uxprkil^f^\WXQOMHHD?D>>@:?B=>EDIHMSRX]a_okqx{…Š‹–“œž¡¥©ª­±®´µ±¶´¸µ³¹±µ²°®±¬©«¨¤£§ŸŸ˜™˜“••‘ŒŠ‹Žˆ‡‡‡‰ˆ‰†ŠƒŠ„‡ˆ‚†€†€€~{y}yxysxvuovtlsplollmlllnkmlpmpsrvt{y{€‡„Š„‰Š‰‰ŽˆŒ‹‹ŠŠ‰„ˆ‚‡‚€„€€€€~€}€~€€}~}~{zxysutonmlhfgf``]`XXVUPPPGMHFDHBCFBDEEHIHMOORWT\]c`ikjtpyx~‡†Š‹‘’——˜™œœ £ž££Ÿ¨¢¦¢¨¡§¥£¤¦£¡¥£¡££Ÿ Ÿ¡ž›œœ™›•™–•‘“ŒŒ‡Šƒƒƒ|}zuytsrrmrmmmjlljilljjmjmolmrpntrttzt{||~ƒ€ˆ…ˆ‰‹‹Œ’‘“Ž‹Œ‰†‰‚…‚€~}wvywwwvwvvywxy{y|{{~}~{‚z€||{}xyvuuqpnnikgbf``Z]XVXPRNRJMNGLJJHMKKOMQRUUX^[dagjmpsxx€„…••™›ž¢¢¥¢§¦§¨«§©ª¨©§©¤§£¤Ÿ¤žž™›–˜‘•Š‹‰‡‡„ƒ‚‚€~|vv{ywxuzrytwxsyuvvvuuwswvsvswruttusuqxpuustuusutuvsxwvyxxy{{z}|~|}€~€~ƒ~‚€€‚€‚€‚‚€‚~‚‚€€€~€{{}z|xyxvutsppplikgeg_c``\]\YZZWZVYUYWXYV\Y\\^]_baeegillmsruwy{}††‡Š‹Ž‘“’•—”˜˜™™››™Ÿ›œžŸŸœŸ › ŸŸŸŸ›œšœš˜˜˜—•”–‘”’ŠŠ‹‡ˆ‡„†ƒ€€}|{|yxyvxtwtstrsqsprrorqsqrtsutvvwxxzy}{|}}}€€€‚€ƒ€ƒ€ƒ€€}}~}}|z{yyyxwwwuvuutrtssrsssrsrqsrosrproqoqnpnnmmnkmlkhlhgiapeep\mclbg_q_s^mdmhlsijrmurnvp|zxv|€„u€ŠˆŒ”†—–Œ›”Ÿ”œ—š„“’¨±¦“¥œmq‰Ÿ¤¯µ›˜ŒŠt‰‰œ£¢““Œ‘‰‡€~ˆy|xu}v}tquv|wpu‡€y‹s…m\Z`QbbmpwŠŽ€pox’œœ™›ž˜ŸŠ—‚ž¬»§¤œ›‘“‰†z‡uxlvqopr_]`eS]\LSXRl`YdhYaXeXSpsx}wpqmpw€ƒ|zbvbgikd}v‡xhqfltpmxyvlƒƒˆˆ‡€‹Šxzzw‡‘’€€z{zuwyt‡}lys\tolmxp„zksiiu€wyv}ek`j]g€u}„{u`{mks}y‚…‰—‰ˆ™‹™Ÿ™ŸªŸœ¤Ÿž¡¥¥©¬­¦²°£¥œšˆŽ”Š—‰zkqljbbh[d\[\Q[VMLPIKLSLXT@V@;C4:>K[\Kwcg€q—v‡¢†­˜¿©µÄÌÁÃǼľ˴ÁÕ•ßʇ¼ª—°—›¢ˆˆp‹k\[s,gH3H8-.48(&%0;-N-3?`?l@whW|nƒ’†£™¿ª–̼£ÈÆŸÂӷ̼ոô³©“¨¡w¡|vˆv`bMC]>0?4%!5     <;4]1GYRUrdc—[‰•€¯›Œ¼¯£²µÆ£¿ÉµÄÍË°ãÔ¯ñ¹ÓÙÍ¿ðÀÇð»ÛÚÃâÔÂéÉÖÛÀÓÕ¼ÍÈ·ÈÀ¿ Â©¹ ¯™š’”y”l}€_uqaRnJOYD8U45=74 O ,C1#:GITVP!eX<_y<€O¡x‘€² ‹Å§¬Á¶·Ó°ÉÔ°ÏеÎȷ׬ۼ£Ñº¬¼° ¹¨’­™Œ™{”„‚v|yqirm[rYc\Oj@aPWFYIG`Ja8UNFVITDbDM`=]`F]WL[^BY`E`N[PS\UUOmD_jHkfR^ƒJi€[q„a|k•…ŽšŽ”˜³• ¸§¤¹¿¡¿¸¿µÇº²Ñ­Àļ­Æ¨·°¬ª¯›¡­Ž™šŽŽŒŠ€|z{pyrbzj`rfXp`_dhYof_marnu]ƒlsxzvsˆqŒr‹~ƒ€‡z‰Œ†v˜v–z˜p€w m“…‹rŸx‡‰‹„”‚•ˆ“–‡’›¤vÎx¥°—¬§¬ŸÀ–˨±½¹³Æ¶»Â¿±Ç±ȳ¿¸Æ©º¼¥µ·­–Ä™©™¯œš“Ž‘’‚xŒum„nipxWwXdnMhV^PUeLRY]BV`EWPUSRNOb;cJRSOVG_AXNKNIVBTKL@WH@UJ8]F=VDM>WEFLKT=ZCSNUL[UUiWcenepiu|sz…‡††Ÿ‘’Ÿ£¢·Ÿ¤³ª­´¦·³©°¹«¶±°±°°±µ¡¸«¯¤³©¢­­£§¥¯¦‘Ø°££§ ›¶˜Ÿ´¡˜§¬Œ³š«¢ˆ¹—Ž©œ—š‹˜v—……xˆustgyhZkdEmPNXI8^A-X>37@6@8H7D@T8TNOJ[^Kb\gXt[wfspuu~r…z†‡ƒ˜‘ˆ™‹™—“¡• ¦˜©¤ ¥·˜´´Ÿ°´¹¥À°½´­Ç¹®ÂÀ·¼Ê±ÇºµÎ²Æ°Ê³¾±Ç³§Â³«´µ§§®¡¥ —¦—•Š‰ˆŠp‡pvpnkobclSaaPUdDQVR;_:?R3Q=J.O4?@;@1L-;A44E,9=9'M*2B1.7@%=<&;7*;8-3>01=4:2?=7C@CBMBQNAgHUlJjal]}ciŠf…z†‰†‹–…Ÿ–‘žœ£ ¡§¡¬ µ¢±¬£¼¤¸¤»¥·­¯¶°¯¸³¬¸´¬··°¸¶´´²¹¸µ¹¸´Ã©½¼²¸»µ²Ä¬¹¹·°º¶ªÁ¦¯¾£­´§¤©«¥ ¥¥›¡¢—–Ÿžˆ¥’Ž’–ƒ›ˆƒ”ŠŽ†ƒ…†y‰|†v€v„xy|}rv‚j}pwqntmpfqecjcd\g[]\TbIYOOGQFEJ?E@9G6;@/:=30)12;,<6/6D+N:KILMPiPfp[pvnƒmŠ†‚‰{˜}¥lŸ–z„™x‹„yx„rdjolnawb[palpcjsqep}ˆu•‡Ÿ–£«Ÿ³²³¾Á¶Ð¹Ô¶Ô¿ÊÈÂÎȱɸ¿²«¶°š©›§~©€†Œvy‚cktY\fW\Jg@TL]2F(ISOEtaoˆmqˆo–€«~Ÿ¨®µ˜Ÿ¸y¿Ž›š¾†«ªœ§ƒŽ¥ª‡¤ƒž~¥ƒŸz‚|Ž›xx‹„y›x‰‡…‹€™‰‰”{’£ˆ|¢Ÿ‘œ¶”‡Ž¢™¤˜§Ž“­ª¥®· Ÿ±Ÿš®·€Å¨›©²p¯mŸ¨Z„s XrhrVmEUh7[c4;P-cJKC8*S@:dJ;WP'f@YCI`GVNZ_d[id…fryr‹¡‡€›ž“¸ž¬’¯­³®©Ó¢™­ Ÿ¬˜§¿‹°³«…¼ª¯°½Ÿ³ª“¸±¬œ§§ Ÿš¤Ÿ¥ˆ¶Ž¤®¦¢«¹¨•½–¿À¶¹£ÂÃÛ³Ó¬¿Ä²»È’ÈÀŸ™½ ¡°—¬ˆ•€­rˆnˆxx|Z`]gYVCkR5IZ94#Z"3 30 2 ,$ ! !) 8 4  % &31-1.L?QChO_s\‹l{•|£ŒŸ”è‹Æ¥¾¯¾·¼¸»È±Ç´¹¸¸Ç´«À§Ã¸Â±µ¬¯° ½§º¤¿·¬”¨£¤¥£š¥“¤Ÿ¤–£¥£º¡¥¹“¿®´¿·©³È™Ê½²²Ì¸°É¨±À¦»°°°©¨°¡¨™œŒ›}–|{†gzo`itQg^N\YNN^>KPOBGR:WKDKVWJ_@[`QbZkRj\gf^x^gdyhfu`{`ynvitnj‚eoxhzrkwdh~cepggh_qZb_`NkTR_^ZR]CiG]ZXYZ\\aPcdJgX_ZTiNbZ\\e\]de`crfjsyn~}}‚‹”’–Ÿ˜™©žœ¹£¯°·¶·Â³Ë´ÍÈÁÓÂØÉÙÉ×ÒÇÜÊ×ÈÏÕ»ÆË˰άƸ²¹ª±¬¬©§ª §™¨—šš—˜„š‚Š‘{~s~}rqrogjbk`cj_`j_heuduxpz~x‰}ˆŠ‹•“”’Ž”“Œ“ˆ”„‹…ƒxxnqpq`ciW]X\H]HIRCFCJ5O<6>;H3N=IFMRKVT_Sfedhisfrxlzxzx{€qŒn‡v‚v„|u‚t}uvrwnpolcjbb^^YXdD^QKQQIMLMJRJNTMZQX[bRodgnwl{€yˆ„Š–”Ÿž¥§®²±¿¸¼Éȼ×ÊÎÏÞÄ×àÏÕÝØÉåÐÏÙÔÄØËÇÍÇÅÇÀ¾Ä´½±¼°ª°®Ÿ®¡£ œœ–œ‰Ÿˆ‘ˆŒŒ€†}}y~qtvgtklcvZmdga`lZffac`e_h^cdVmY`\_^YnTdYhS]hOc^_Wd`XdZ_]]ZWdMaP[VUXUYN`OYP_SS\U[X^SaX^O`[UWaR]\WZX]N\SZHbPU\U`ViVpaktmxyz‚…‰‰“’“œ—§¹˜¯¨­¬«¼¥¿©¹¶¬¼®¶²°®±³§±¬ª«£°™­›Ÿžžœ©…›’ˆŒ‡Š„‰…{ˆ€|‚~€‡€ˆ€‚Ž›•”¤”«š§«¥¨¯°§´©³§±°¢°¬¢­¤¢¢£˜žœ‘š‹”„€†|zwtpggb\VZJNN;I;<7:6/2212)9)4+;03?1>8C6JF@UNQVc[bliorv}ƒ‰“œ›˜¥¤ž¨¬Ÿ­®¦««­¢±§¤ª¡¨¡¡£™¢¥“””ŽŠ‘…‡‡„„„|‚~~}|{y|zz€pƒux|yxuusƒw{}wƒv|€~€{†~‚ƒ}Š|†~‡~ƒˆ~ˆ~†‚ƒ‚‚…‚ƒ‚†„€‡‡„‡„€…†ƒˆ„‰€‰€Š„Š‡ƒ‰}Š€‡~„z€yyw|{rsynlpkldnbqcjezejzk{q~y€}Ž€Œ‰’’ ‘Ÿ• ¡¢Ÿ§¢¦¨©ª¢¥ª¤ª¡¨ž®Ÿ£Ÿ¤›¢œžŸ˜œŸ‹ž›“‡……€…y‚}|tvrutrsmwprtlzntwxsxx}z~}~‹}†ŠŠ‡’Œ’’’˜”Ž—Œ‡˜Š„„…y€x|qspniij^`^[UUPNP@L?@8>37-4,.+&0#(*+#*.,'0.3/83?<>8>7;997;69<9<<>?CBGHLMQSZZ]ggjrwu}„…‰‘—›¥¦¦­®¯¶´·ºº¹½¿º¾¾¿º¾»º¸¹·´±´°©°¥©¥ ¡¡˜˜›’‘‰‹„ƒ‡|~‚zvvyxwvysyxsyuxvxt|uwzyv~xw~u|{xutyyvwxruyovtsqtpqppopnlpmljpgljlgjhiifjeidffdcfad`c`e`cgedikemlomrrvvwyzz}}~‚z„ƒ‚‡„ˆ…‡‡…‡‡ƒ†‡‚„‡~ˆ€„ƒ„‚„†ƒ‡„‹‡‡‰‘‘–‘—–—˜šš˜™˜Ÿ››žœœžšŸšœ›Ÿš›œ–˜•›’˜’—•ŒŽ‰Ž‡‡ˆ†ƒ†‚}‚|{{zz{txxqutnrplkmgfhcd`a_\\YXUVRSQLRJKOEKGHCHAAF=C?@>?=>?:?==?>A?BCCGFKJOORXW^^edlnruy}‚„‡Ž’˜›¡¤§©¬®±²µµ¶ºµ¼¹¹¹»·¹»¶¸¶µ´³¯­°¨©©¤£¡Ÿš™˜“’“ŽŽŒ‹‡‰†„†ƒƒ‚}€|~~}{}{{|zzy|xyzxxzywywvyuyuwuwvuwswsrtrrptmpnmnlljkgkfgidefcecaa``a^`c_bcedgghkimmonsptttxvyzz{|}|}€€‚ƒ‚ƒƒ‚ƒ‚ƒ‚„‚„ƒ„ƒ„…„††††ˆ‡ˆŠ‹‰Œ‘““–•–š—›››Ÿœ¡ŸŸ žž¡žŸŸŸŸ¡œŸžžœ›œ—™™•—–““‘‘ŽŽŠ‰‰†…ƒ„€~}{{ywwuvtrtopomlmhiifefdbab__^\^[YYYVVUTSQSQOPONNMMKKJJJIHIJGHHHGHHHHJIKJLMNNOTQVWXZ^_a]wPk_h‰{€€—z”˜‰ ˜Ÿœ•À¸™Á•¹¬¿ÙÂp-­Ÿ¿¸·¸³¼§¶æÙŒ€JK@?qyƒŽ¾§Ø³Õ´È¨Ã”«‡†jpbaMFKU4Q;DCHCHQD[I[]Wp[‚aƒsŠwˆŠ“ƒž† ŠŸŠŽŽœˆ™Ž‘—„‡Œ{Ž†„Žxv€€€‚‡|„m‘y‰z‡‚‚~“u”€Šˆ ‡œª‘¤¥ ®£ª²Ÿ¶ª»£ÀŸ»¦µ²¢¼™·›­™œ Œœ„wŽ|…hzz[vZmUVZF]A^F9LCX@cHe\[n\uc{et€o€}ƒƒ…‚‹ˆŒ•x›–†“ŠŽŽ’‡—žžšŠ‹“‰…—œ}—†‘ƒ‹Ž†ŠŽ~’}•|—|“|‘‚‹Œƒ‘€–‘ƒƒ|•{‘~z‹„„†‰z‚u’p™rzƒ€zˆn‰qy~jttjqbf_`V`OaI]QOXM]RYVV`Uc[lSp[qdilmpowlyp{vy€n…o„y„rŽ}‡ƒŠ}”€—†‘ŽŠ“Š•ŒŽ•‰œŠ”‡“‰Ž‹‰‰‘ˆ”‰˜Ž—œŒ¢™œ£ «³ª±±³¬À®É°Å¶Ã¸Å¸¿¼½¼¹¹º¯¼¢¾¡¶—¨“ —‹‹ƒ€uwpmdf_YUMOHGJ3B/=+01(*$/&,&$%&&(),.233C5L876160--6'-6'07*<28<>FAAUHSV[X`]jcjnqun}x|€ƒ}Œ€Ž‡†‹‰ŽŒ‰Œ‹†‰‡ˆ€†ˆ‚ˆˆ|ˆˆz‰†‚ƒŒ‡ˆ‰†‚ŒˆŠ‚‹‚ƒŒ‡ƒ‡…‹x‡~zŒxƒw‡w„}€}}{}r‚~yxryusvnojhkfagcXjaSgcTh`aabaff_fkcilmhgrjnlufkmlmgflp]reghkekiduhhvrsvzy{xƒ|†……‡‹‡ŽŽŽ•“•š“œ˜š šœ¦™£¦£¢®§©¨°®¯­¶­¶±³º°»º³º¹¹¸ºº³½»¬¿²®¼¬²±¨­«¢£«–ž¡••†‹‰€{lrrghdaS_RKWBJF@;D39=.62-6.-6.4708;4=@=BGLCRO[R_a`einkxp{}yƒ…ƒ„‡‘ŽŽ—Ž‘”“’ŒœŠ˜‹’–„”“ƒ•„•Žˆ‘“–Ž‡–ˆ‘‰–ŒŒ•ŠŽŽŠ‹‘„Ž„‰…‹†……€„Œ…ƒ†„‡€}‚~{|u|uutnpmkfhfcfad``d\c`d^i`afbi`kegjihhofmlfmifkfcfi^cc_b]d\aaaaah]kecpleqwhwtsw{u||†„†ˆŒ›•–ŸŸœ¡¥¡§§«©¯ª±±¯²´³´¸²¹¶µ¸¸µ¸¹¶·¶µ·´²·±±²°¬°¬©¬¨¥§£Ÿ£šž˜•“”ŒŽ‹‡„„€y~twqnlhe`bXYVULSKIFHBC@?>9>9=4E0B<<@@A?HCLHNQRR]U__c`nelvfn}z€x†‚Œ€Šˆ‡ŠŒ‡‹ŒŒˆŠŒŽŒŒ‡’Œ“‹Ž‘‹’’‹‹Ž‰ŒŒŒˆ‹“‡Ž‹Œ’ˆŽŒ‹‰Œ‰†‹ƒ„‡€‚z|xtxpslpkjmglfkgjhghkjhmjkmjoljqklmmlhnfjchf`d_^[_V\WWVWVWVWYU[[YX`\^`a`ceejfknnowsw~|~†ƒˆ’—›˜Ÿ££¥©­¬°±µ³¶¸¸µ¹·¸¸³»·²¶¸°´´®³®®®±¤¬­¥§ª¢¥¤ž£žœœž“›”““Ž‹†‚„‚€}€vzxptqlklajc_`aV\\SVTRNQLNLLHMJJJMKIQKPMSOTRYWY\[a_cgfhmkqotszty||{‚}ƒ†‚††‰‡‰‰ŠŠŒŠŒ‡‘ŽŒ“Œ’ŽŽ‘Œ‘ŒŽ’‰”‹Ž‘”“’‘’Ž‘ŠŽŠŠ‰ˆ„‡ƒ~|y|wvuvoupqrqotppssmttnxoupvpsrorlrjoihhfbc`^]\WYXSXRSSVPSVPUVSWXVW[XY^\_`ceciiklpptxw‹…Ž‘•–›Ÿœ«¢«­¯°³·´¹¸¹»·¼ºº¹¸ºµ·µ´±°²ª°¨«¦§££¢ž ›š™–•”‘‘Œ‹‰ˆ††„ƒ‚}€{{|wwwurvpppmlljgifcg`ab_^_\[[ZYXXYWXWXTYWVYYW[[X^][_``adbefhgiljnooqtssxsxyx|{}~…ƒ„†ˆ‡‡Š‡‹‡Œ‹Š‹‹‹‰Ž‰‹Š‹ŽŒŽŽŽ‘Ž‘Ž‘‘’‘Ž‘ŽŒ‹Ž‰‰Š††…ƒ~~z|zxxvwuwwvwwwvxuwvvgames dc.b 27,"E",10,13,27,"b",4 dc.b " BUDGIE UK are the creators of ",10,13 dc.b " many fine games for the ST. ",10,13 dc.b " They are distributed through ",10,10,13 dc.b 27,"b",15 dc.b " LICENSED DISTRIBUTORS ",10,10,13 dc.b 27,"b",4 dc.b "Royalties are paid to all our writers. ",10,13 dc.b "A list of Licensed Distributors ",10,13 dc.b "is available from the Budgie Office. ",10,10,13 dc.b "----------------------------------------",10,13 check3 dc.b "The following BUDGIE titles ",10,13 dc.b " are now available: ",10,13 dc.b "----------------------------------------",10,13,0 games1 dc.b 27,"E" dc.b 27,"b",4,"Damonoid" dc.b 27,"b",6," by Camy Maertens. ",10,13 dc.b "20 planets, no less, have",10,13 dc.b "to be protected from Damonoid and its ",10,13 dc.b "invading fleet. Action is fast. Time is ",10,13 dc.b "running out. Any enemy impact on your ",10,13 dc.b "planet causes havoc. You can sustain 13 ",10,13 dc.b "direct hits. But, should the Damonoid ",10,13 dc.b "itself land, the result would be fatal! ",10,13 dc.b 27,"b",4,"FOOTBALL 88" dc.b 27,"b",6," by Simon Rush. A complete ",10,13 dc.b " manager game. Very addictive ",10,13 dc.b "This Football Manager is extremely easy ",10,13 dc.b "to play and contains many features that ",10,13 dc.b "sets it apart from other offerings, ",10,13 dc.b "its multi-user capability being one of ",10,13 dc.b "them.If you are a budding soccer supremo",10,13 dc.b "this game is undoubtedly for you!",10,13 dc.b 27,"b",4,"BLITZ III" dc.b 27,"b",6," by Camy Maertens. ",10,13 dc.b "This is a bombing raid with a different ",10,13 dc.b "scenario: three aircraft fly in ",10,13 dc.b "formation, all under joystick control. ",10,13 dc.b "The aim of the game is to destroy the ",10,13 dc.b "city before too much altitude is lost. ",10,13 dc.b "'Challenging game..' ST Format Feb 89 ",0 games2 dc.b 27,"E" dc.b 27,"b",4,"OTHELLO" dc.b 27,"b",6," by Jim Holmwood. ",10,13 dc.b "Entirely mouse controlled and ",10,13 dc.b "playing a mean game. You may find it ",10,13 dc.b "difficult to beat the computer, but this",10,13 dc.b "will maintain its appeal. ",10,13 dc.b "Two versions are included on this disk: ",10,13 dc.b "one mono and the other colour. ",10,10,13 dc.b 27,"b",4,"PRO DARTS" dc.b 27,"b",6," by Martyn Carr ",10,13 dc.b "This is a mouse controlled simulation, ",10,13 dc.b "5O1 down. All darts addicts ",10,13 dc.b "will love this game and the somewhat ",10,13 dc.b "hesitant pointer (too much beer perhaps)",10,13 dc.b "Speech commentary adds to the realism. ",10,13 dc.b 27,"b",4,"BALL ZONE" dc.b 27,"b",6," by Ian Grainger an incredible",10,13 dc.b "Arkanoid type game, only better. ",10,13 dc.b "Needless to say, this game is mouse ",10,13 dc.b "controlled and has many levels. But the",10,13 dc.b "main attractions are the time counter ",10,13 dc.b "which dramatically increases the tension",10,13 dc.b "and, also, the reassuring presence of ",10,13 dc.b "base line tiles which will rescue you ",10,13 dc.b "in desparate situations. ",0 games3 dc.b 27,"E",27,"b",4,"DR BORIS " dc.b 27,"b",6," by Alex Dewdney ",10,13 dc.b "a TNT maniac is on the loose, lighting ",10,13 dc.b "explosive devices in a maze of ",10,13 dc.b "increasingly dangerous alleys. You have",10,13 dc.b "1O seconds to defuse the bombs before ",10,13 dc.b "the inevitable blast. There are many ",10,13 dc.b "obstructions in your path, including ",10,13 dc.b "walls and...skulls. ",10,13 dc.b "Also on this disk, by the same author, ",10,13 dc.b 27,"b",4,"PUZZLER ",27,"b",6 dc.b " a diabolical brain teaser. ",10,10,13 dc.b 27,"b",4,"SPECULATOR" dc.b 27,"b",6," by Camy Maertens ",10,13 dc.b "You start with 5OOO points and have to ",10,13 dc.b "correctly guess the direction of the ",10,13 dc.b "market. Trends develop, reversals occur",10,13 dc.b "and sudden panics can cause havoc with ",10,13 dc.b "the soundest strategies. ",10,13 dc.b "The Index 'point and figure' chart ",10,13 dc.b "unfolds before your eyes and reveals ",10,13 dc.b "your profits or ...losses. ",0 games4 dc.b 27,"E" dc.b 27,"b",4,"MONEYSPINNER" dc.b 27,"b",6," by Jim Holmwood",10,13 dc.b "The slot machine is alive ! ",10,13 dc.b "This accolade winning Budgie UK classic ",10,13 dc.b "incorporates all the usual features : ",10,13 dc.b "nudges, gambles, holds, and some more. ",10,13 dc.b "The scrolling is smooth and once again, ",10,13 dc.b "the game is mouse controlled. ",10,13 dc.b "State of the Art gambling! ",10,13 dc.b "'A very enjoyable game to say the least'",10,13 dc.b "ST Action December 88. ",10,10,13 dc.b 27,"b",4,"TYCOON" dc.b 27,"b",6," by Simon Rush. ",10,13 dc.b "A multi-player mineral exploring game. ",10,13 dc.b "The objective is to survey, test drill ",10,13 dc.b "and eventually exploit various sites to ",10,13 dc.b "extract valuable minerals. Mines have ",10,13 dc.b "different levels of profitability. ",10,13,0 games5 dc.b 27,"E" dc.b 27,"b",4,"ACE INVADERS" dc.b 27,"b",6," by Gary Wheaton",10,13 dc.b "The DEFINITIVE Space Invader ! ",10,13 dc.b "Everything the all-time classic is or ",10,13 dc.b "should be is in this game: speed, sound",10,13 dc.b "drama, excitement. ",10,13 dc.b "All collectors and connoisseurs will ",10,13 dc.b "treasure this disk. There is nothing to ",10,13 dc.b "touch it, even commercial. ",10,13 dc.b "Three Stars ST Format August 89. ",10,10,13 dc.b 27,"b",4,"ZENITH" dc.b 27,"b",6," by Gary Wheaton",10,13 dc.b "A space combat for two players. ",10,13 dc.b "Mouse v. Joystick. Several convoys of ",10,13 dc.b "aliens fly through space, wave after ",10,13 dc.b "wave. Your mission is to intercept them.",10,13 dc.b "Your opponent has the same ambition and ",10,13 dc.b "his space ship has to be destroyed. ",10,13 dc.b "The ensuing battle is a delight for all ",10,13 dc.b "arcade fanatics. Another classic! ",0 games6 dc.b 27,"E" dc.b 27,"b",4,"GOLDRUSH" dc.b 27,"b",6," by Mark Annetts ",10,13 dc.b "A multi-level platform pursuit. ",10,13 dc.b "The aim is to collect the gold while ",10,13 dc.b "avoiding your pursuer. Joystick control.",10,13 dc.b "The puzzles are the main attraction of ",10,13 dc.b "this platform game. This is the thinking",10,13 dc.b "man's version of Loderunner. ",10,13 dc.b "Also on same disk:",27,"b",4,"ZERPHOD",10,13 dc.b 27,"b",6,"by Ian Grainger",10,13 dc.b "3D maze challenge. Find the modules ",10,13 dc.b "before time runs out,avoid the nasties. ",10,10,13 dc.b 27,"b",4,"PERILS of PENFOLD" dc.b 27,"b",6," by Philip Bishop ",10,13 dc.b "A superb graphic adventure with caves to",10,13 dc.b "explore, potions and spells to gather, ",10,13 dc.b "ghosts and flying knives to avoid and ",10,13 dc.b "puzzles to solve.",10,13 dc.b "Also included on this disk, by the same ",10,13 dc.b "author: LINE of FOUR a fiendish connect ",10,13 dc.b "game that will give hours of pleasure ",10,13 dc.b "...or frustration! ",0 games7 dc.b 27,"E" dc.b 27,"b",4,"WORD FIND PUZZLE GENERATOR",10,13 dc.b 27,"b",6," by Keith Bearman",10,13 dc.b "Medium res and hi res monochrome.",10,13 dc.b "You can play the puzzles on your",10,13 dc.b "monitor or print them on paper.",10,13 dc.b "Because of its expandability, this",10,13 dc.b "program will keep you busy for",10,13 dc.b "a very long time.",10,13 dc.b "A fantastic screen/printer font",10,13 dc.b "manager by Jeremy Hughes is included!",10,10,13 dc.b 27,"b",4,"MAKE A BREAK" dc.b 27,"b",6," by Martyn Brown",10,13 dc.b "of 17Bit Software",10,13 dc.b "A extremely powerful (and colourful)",10,13 dc.b "quizz game set in a snooker ",10,13 dc.b "environment",10,13 dc.b "Subjects covered are varied: arts,",10,13 dc.b "sports, the past, music, books,",10,13 dc.b "the world, etc..Version 1.1",10,13 dc.b "Five stars ST FORMAT december 89",0 games8 dc.b 27,"E" dc.b 27,"b",4,"PARABELLUM" dc.b 27,"b",6," by Alex Dewdney",10,13 dc.b "Confined to the deepest dungeon of",10,13 dc.b "the underworld, you must progress",10,13 dc.b "from chamber to chamber until you",10,13 dc.b "escape. Evil creatures lurk in every",10,13 dc.b "corner: the task is daunting!",10,13 dc.b "This is a challenging platform game",10,13 dc.b "with lasting appeal.",10,10,13 dc.b 27,"b",4,"TRI HELI" dc.b 27,"b",6," by Gary Wheaton",10,13 dc.b "of The Shapeshifters",10,13 dc.b "A pixel feast if ever there was one!",10,13 dc.b "Two blindingly fast games on one disk,",10,13 dc.b "plus several demos, all compacted to",10,13 dc.b "give you hours of arcade entertainment.",10,13 dc.b "TRI-HELI and COSMOS are superb examples",10,13 dc.b "of 8-bit classics now at last",10,13 dc.b "gracing the Atari ST.",0 games9 dc.b 27,"E" dc.b 27,"b",4,"OPERATION ANGELICA" dc.b 27,"b",6," by Camy Maertens",10,13 dc.b "Your mission is to rescue British troops",10,13 dc.b "stranded on Buff Cove.",10,13 dc.b "The island has been mined. ",10,13 dc.b "Time is critical and enemy aircraft",10,13 dc.b "are bombing you relentlessly...",10,13 dc.b "Nine action-packed levels !",10,10,13 dc.b 27,"b",4,"IMPULSE" dc.b 27,"b",6," by Ian Grainger",10,13 dc.b "At last, a totally new concept!",10,13 dc.b "Each scene holds a detonator,",10,13 dc.b "strategically situated, and thoroughly",10,13 dc.b "guarded. First, marauding aliens",10,13 dc.b "have to be destroyed, using your",10,13 dc.b "rotating gun turrets. Angles are",10,13 dc.b "critical if the phaser ray is not to",10,13 dc.b "rebound on you. Eventually, the",10,13 dc.b "detonator is exposed and has to be hit",10,13 dc.b "Eleven levels of trajectories,",10,13 dc.b "bounces and deflections!",0 games10 dc.b 27,"E" dc.b 27,"b",4,"BANDIT" dc.b 27,"b",6," by Gary Wheaton & Shapeshifters",10,13 dc.b "Electronic slot machine with nudges",10,13 dc.b "up and down, holds, shoot-outs and",10,13 dc.b "a delightful page three bonus.",10,13 dc.b "Excellent music, superlative graphics.",10,13 dc.b "Only the Shapeshifters could have",10,13 dc.b "brought you this awesome arcade",10,13 dc.b "bonanza!",10,13 dc.b "Also on same disk, the Spartan demo.",10,10,13 dc.b 27,"b",4,"SPACE BLOB",10,13 dc.b 27,"b",6," by Robin Edwards",10,13 dc.b "An immensely enjoyable platform game.",10,13 dc.b "Fifteen levels and three bonus screens.",10,13 dc.b "Collect the crystals and avoid the",10,13 dc.b "baddies. Try not to land on rugged",10,13 dc.b "terrain: Space Blob likes his landings",10,13 dc.b "soft and gentle.",10,13 dc.b "Also on same disk: HAPPY the anti-virus",10,13 dc.b "smiling face. And more goodies!",0 games11 dc.b 27,"E" dc.b 27,"b",4,"SLIPPERY SID",10,13 dc.b 27,"b",6," by Neil Scrimgeour",10,13 dc.b "Emprisoned in a set of mazes, Sid has",10,13 dc.b "to munch his way through large",10,13 dc.b "quantities of pills. As he munches,",10,13 dc.b "he grows longer, shedding the odd tail",10,13 dc.b "just to confuse you. Nine mazes.",10,10,13 dc.b 27,"b",4,"SCARY",10,13 dc.b 27,"b",6," by Eddie Bryan",10,13 dc.b "The haunted mansion in which your girl",10,13 dc.b "friend has been abducted is a den of",10,13 dc.b "evil and unnatural.",10,13 dc.b "Many rooms have to be searched before",10,13 dc.b "you can rescue her.",10,10,13 dc.b 27,"b",4,"CARRIER ATTACK",10,13 dc.b 27,"b",6," by Keith Bearman",10,13 dc.b "Rediscover the drama and excitement",10,13 dc.b "of Battleships.",10,13 dc.b "Ten levels of computer intelligence.",10,13 dc.b "Naval strategy of the highest order.",0 games12 dc.b 27,"E" dc.b 27,"b",4,"PSICOTIC",10,13 dc.b 27,"b",6," by Philip Rankin",10,13 dc.b "A space combat against forces",10,13 dc.b "attacking from the East.",10,13 dc.b "Extra armement can be gained",10,13 dc.b "during the engagements.",10,13 dc.b "Dare and survive!",10,10,13 dc.b 27,"b",4,"SUB HUNT",10,13 dc.b 27,"b",6," by Oliver Bros",10,13 dc.b "A two player game set in some of the",10,13 dc.b "globe's hot spots: Tropics, Arctic,",10,13 dc.b "and Persian Gulf.",10,13 dc.b "Busy shipping lanes are under threat",10,13 dc.b "Protect allied vessels and destroy",10,13 dc.b "enemy cargo. Helicoper v submarine.",10,13 dc.b "Also on same disk:",10,13 dc.b 27,"b",4,"SEA FISHERMAN",10,13 dc.b 27,"b",6," by Paul Dowers",10,13 dc.b "A fishing simulator",10,13 dc.b "on the ST..! Prepare for exciting",10,13 dc.b "action, but do take a book with you,",10,13 dc.b "just in case...",0 games13 dc.b 27,"E" dc.b 27,"b",4,"DEATH CAMP",10,13 dc.b 27,"b",6," by Dave Blower",10,13 dc.b "The first text-based adventure from",10,13 dc.b "Budgie UK. Ample illustrations are",10,13 dc.b "nevertheless provided to convey",10,13 dc.b "the true atmosphere.",10,13 dc.b "The Japanese POW camp is your ",10,13 dc.b "nightmare. Your objective: to escape!",10,10,13 dc.b 27,"b",4,"A QUEST for GALAXIA",10,13 dc.b 27,"b",6," by Gary Wheaton + Shapeshifters",10,13 dc.b "Part two of Budgie's tribute to the",10,13 dc.b "all-time classics.",10,13 dc.b "Rediscover the thrill and excitement",10,13 dc.b "of an immortal game.",10,13 dc.b "10 levels of galactic chaos.",10,13 dc.b "High scores saved to disk.",10,13 dc.b "This game is without a doubt, the",10,13 dc.b "jewel in the Budgie collection.",10,13 dc.b "The Shapeshifters at their best!",0 games14 dc.b 27,"E" dc.b 27,"b",4,"INFERNO",10,13 dc.b 27,"b",6," by Simon Brown",10,13 dc.b "Your task is to control a cunning",10,13 dc.b "demon in his bid to return to his cosy",10,13 dc.b "fire in hell.",10,13 dc.b "Your progress through a maze of",10,13 dc.b "tunnels is hazardous as boulders,",10,13 dc.b "skulls and un-hatched eggs are ever",10,13 dc.b "present.",10,13 dc.b "A fine variation of the boulderdash",10,13 dc.b "theme.",10,13 dc.b 27,"b",4,"RUNAWAY",10,13 dc.b 27,"b",6," by Chris Skellern",10,13 dc.b "Guide a drone ship through the tunnels",10,13 dc.b "of the moon. The ship is out of control",10,13 dc.b "and cannot slow down!",10,13 dc.b "There is fuel on board, but friction",10,13 dc.b "against the tunnel walls depletes your",10,13 dc.b "shields.",10,13 dc.b "The pace is frantic. The journey is",10,13 dc.b "tortuous and unforgiving.",10,13 dc.b "From the author of Sprite Master.",10,13,0 games15 dc.b 27,"E" dc.b 27,"b",4,"ROTATUS",10,13 dc.b 27,"b",6," by Simon Brown",10,13 dc.b "A rotating experience in outer space.",10,13 dc.b "On the edge of the galaxy, your ship",10,13 dc.b "attempts to land on the nearest planet.",10,13 dc.b "Asteroids and boulders continuously",10,13 dc.b "cross your paths.",10,13 dc.b "Space marauders also gyrate on a",10,13 dc.b "collision course. Avoid them or",10,13 dc.b "shoot them!",10,13,0 games16 dc.b 27,"E" dc.b 27,"b",6,"DOUBLE SIDED COMPILATIONS:",10,13 dc.b "520K memory OK but ONE MEG drive needed.",10,10,13 dc.b 27,"b",4 dc.b "Perils of Penfold - Line of Four",10,13 dc.b "Goldrush - Zerphod",10,13 dc.b "-----------------",10,13 dc.b "Ace Invaders /Zenith /Tri Heli - Cosmos",10,13 dc.b "--------------------------------------",10,13 dc.b "Football 88 /Parabellum",10,13 dc.b "-----------------------",10,13 dc.b "Make a Break /Blitz /Word Generator",10,13 dc.b "-----------------------------------",10,13 dc.b "Dr Boris - Puzzler /Pro Darts /Maelstrom",10,13 dc.b "---------------------------------------",10,13 dc.b "Damonoid /Speculator /Othello",10,13 dc.b "-----------------------------",10,13 dc.b "Ball Zone /Moneyspinner",10,13 dc.b "-----------------------",10,13 dc.b "Football /Moneyspinner /Tri Heli",10,13 dc.b "--------------------------------",10,13,0 games17 dc.b 27,"E" dc.b "Bandit /Slippery Sid /Space Blob",10,13 dc.b "--------------------------------",10,13 dc.b "Angelica /Psicotic /Galaxia",10,13 dc.b "---------------------------",10,13 dc.b "Carrier Attack /Sub Hunt - Fisherman",10,13 dc.b "-----------------------------------",10,13 dc.b "Impulse /Scary",10,13,0 EVEN Budgie UK\ Originals\ &&&&&&&&&&&&&&\\\\ 1 Damonoid\ 2 Football 88\ 3 Blitz\ 4 Othello \ 5 Pro Darts\ 6 Dr Boris \ Puzzler\ 7 Ball Zone \ 8 Speculator \\\\ 9 Tycoon \ 10 Moneyspinner\ 11 Maelstrom\ 12 Ace Invaders \ 13 Zenith \ 14 Goldrush \ Zerphod \ 15 Line of Four\ Perils of Penfold\\\\ 16 Wordfind Puzzle\ 17 Parabellum\ 18 Make a Break\ 19 Tri Heli\ Cosmos\ 20 Operation Angelica\ 21 Impulse\ 22 Bandit\ 23 Space Blob\\\\ 24 Slippery Sid\ 25 Scary\ 26 Carrier Attack\ 27 Psicotic\ 28 Sub Hunt\ Sea Fisherman\ 29 Death Camp\ 30 Quest for Galaxia\\\ ** coming soon **@\\\ Final Lap|\ Sea King |\ Beyond Berkwood|\ Hostile Reception|\\\\\\ press SPACE@\ to stop...@\\\ press ESC@\ to exit@\\\\ ...\...\...\...\ ...\\\\\\ ] ` žB§?< NA\#Àà0<Cùÿ‚@AùÀ0ÙQÈÿüùÿ‚`¾a–üÿ‚`\a8a„ù¾ÿ‚`0<Cùÿ‚@AùÀ2ØQÈÿü/9à?< NA\BgNAa>Aù™Cù aPa Eù 3ù´ÿ‚B3ù¸ÿ‚H3ù¸ÿ‚J3ù¸ÿ‚@°< d3üè`°°<]gÿ¶°<\faxa®3üè`Œ°<@f& y&èdx><%žyèâ3üè`8°<|fH y&èd><%žyè3üè`3üè`*3ü²/a~.QÏÿî`°< f3ü²a`yè`ò°<IfKù Êšü.aN`Ø°<%fCù^(|`–°<!f$Kùîšü.ay´yU´`–°<:fKù šü.aò`|°<;fKùΚü.aØ`b°<!fKùîšü.a¾`H°<'fKùšü.a¤`.°<.fKùDšü.aŠ`°<,fKùèšü.ap`ú°<(fKù0šü.aV`à°<)fKù^šü.a<`Æ°<0d!Àü.€î"@(|`z°<:d0Àü.€´"@(|`X°<@d:Àü.€ "@(|`6°<œfCùP(|`°<~fCùº(|`°<wfCù¦(|`î°<mfCù(|`Ö°<^fCù~(|`¾°<jfKùàšü.aD`ΰ<ifKù²šü.a*`´°<ffKù(šü.a`š°<lfKù<šü.aö`€°<tfy´y´°|[eaÀü.€B"@(|`AÀü\€ê"@(|`*I"<0$<¬3ü²a²ap¸ügata °<HfRy¸°<PfSy¸°<af3ù¶´3ùº¸°<KfRy´°<MfSy´°<9f ?<NAT°<fû¦NuÛü."M"<0$<¬3ü²ayèaÆNuTyè.<Gù’ íˆÀüÐAAâH@ÿøйä @B€B„06H@HCâ¨â«(HDHCBC ƒÿÿÿÿ „ÿÿÿÿÇhhH@ÉPP¼|gRB€0H@â¨Çh h H@hhB€0H@â¨Çh h H@ÉhhB€0H@â¨ÇhhH@ÉhhÐü QÏÿpNu69² <«"<a"QËÿî<<Cùè"<0$<¬aÿNuÀü Ð¹ä @a "|Ñü .<40HB40éšHB1‚ÓüQÏÿæQÉÿÐNuHçð yäÐüàCè@"< $H&I J"K <<0‘PHPIQÈÿøQÉÿêLßNuCù€<<"<0$<¬aþx<<Nu?<NNT#ÀäNu.9f¾¹fgÿøNu?</?<=NAP3À¼ y¼k*/ /<}?9¼?<?NAßü ?9¼?<>NAXNu?<ÿ?<NAXH@NuAù«a&3À´3À¶Ñüa3À¸3ÀºNuB€B(0(0é‰Ð0á‰ÐNu/?< NA\NuÿÿfE\common\scroll*.*wwüüþþÿχ‡ÿ?ÿ?ÿxxðð€€ÀÀààððxx<<ÿÿÿÿÿÿððððÿÿÿÿÿÿðððððÿÿÿÿÿÿðøü|<<|øðø|<<<|üøð?ÿÿÿÿøððððððððððøÿÿÿ?ÿðøü|<<<<|üøðÿÿÿÿÿÿððððððððððððÿÿÿÿÿÿðøü|<<<<<<<<<<|üøðÿÿÿÿÿÿððððÿÿÿÿÿÿðððððÿÿÿÿÿÿüüüüüüÿÿÿÿÿÿððððÿÿÿÿÿÿððððððððüüü?ÿÿÿÿøððððððððððøÿÿÿ?ÿðøü|<<üüü<<|üøððððððððÿÿÿÿÿÿðððððððð<<<<<<<üüü<<<<<<<<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxððøÿÿÿ?ÿ<<<<<<<<<<<<<<|üøðððððððð>ÿüÿøÿüð>ðððððððøðàÀ€€Ààðø|ðððððððððððððððÿÿÿÿÿÿüüüþÿÿÿ‡÷‡÷ÏóÏóÿñþñþðüðüðxðxð0ð0ððüüüü¼¼<<<<<<<<<<<<€€ÀÀyàyàxðxðxxxxx‡Ïÿþüüþÿχ>|ø|øðàÀ€€Ààðø|ðø|>‡Ïÿþüxxxxxxxx<|øðàÀ€ÿÿÿÿÿÿ>|øðàÀ€>ÿÿÿàààÀ€øøøüÿþÿþðþÿþÿþððÿþÿþþðððððÿüÿþÿþðððððððÿþÿþÿüüÿþÿþðððððððÿþÿþüþÿþÿþðððððððÿþÿþþüÿþÿþððÿþÿþÿüððÿþÿþü>~|xxþþþxxxxxxxxxxüÿþÿþðððððððÿþÿþþðÿþüðððððÿüÿþÿþðððððððððð<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<üüøððððððøñðóà÷Àÿ€ÿÿ€÷Àóàñððøð|ð><<<<<<<<<<<<<<<<<<~|ÿþÿþóÎóÎóÎóÎóÎóÎóÎóÎóÎóÎÿüÿþÿþððððððððððüÿþÿþðððððððÿþÿþüÿüÿþÿþðððððððÿþÿþÿüððððþÿþÿþðððððððÿþÿþþÿüÿþÿþððððððððððüÿþÿþððÿüÿþþðÿþÿþüÿÿ€¿ù¿ù¿ù‡ùƒù€€€ÿÿ<~<~<~<~<~<~<~<~<~<~<~?þüppx8<<8xpðààÀÀóžóžóžóžóžóžóžóžóžóžÿþÿþþþðø>||>øðàÀàð>ø||ø>ðððxx<<<<xxððààÀÀ€?€?üüüøðàÀ€>üüüxxxxxxxxxxxxxxxxxxðððððððððààààÿüÿüÿüààààÿüÿüÿüàààà€€?øüÿþóžóžó€ÿøü?þžóžóžÿþü?ø€ÿÿÿÿxxxxxxxx>~þøððððððððððøþ~>øüþ>>þüø€Ã†ãŽsœ;¸ðàÿþÿþÿþàð;¸sœãŽÃ†€€€€€€?ø?ø?ø€€€€€xxxx8xxp?ø?ø?øxxxx<xðàÀ€<xðàxxxxxxxxxxxxxxxx8xxppðàÀ€<8<€Ààðp?ø?ø?ø?ø?ø?ø€Ààðx8xðàÀ€?øüÿþðààþüø€€€€€€€?øüÿþø>ððððððððððø>ÿþü?øøøøx>x|xxxxxxxxxxxxx?øüÿþø>ð>?þüÿøøðððÿþÿþÿþ?øüÿþø>ð>üøü>ðø>ÿþü?øøøøøøx>x|xøxÿþÿþÿþxxxxxxÿþÿþÿþððððÿøÿüÿþ>ðø>ÿþü?ø?øüÿþø>ðððÿøÿüÿþø>ðððø>ÿþü?øÿþÿþÿþ>|øðàÀ€>|øðà?øüÿþø>ððø>ü?øüø>ðððø>ÿþü?ø?øüÿþø>ððø>ÿþþ?þðø>ÿþü?øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ><8888ÿüÿüÿü8888ûþÿþÿþ€ÀàðãƒÁ‡ÁãŸ>>|øóçÎŒ >|øøðàÀ€àð88ðà<ÿŒÿþcþüxDisk error@\text file not found \\]2<h4<z"|$aåÖ2<Ì4<<KAÀü\€ê"@(|*I3ü²aå¦Ûü."M"<Ü$<3ü²aå†   $  """"&6 œD6((  "#34DEUVWfgw:‹ÿþà1Ÿ€ÿ„þÿÿÿÿõ†õ† yÿÿÛß ÿÿÿÆ€€ùÿÿÿ ÿ‰vÿÿq—q—Žhÿÿ¸Gûÿÿ½½rBÿÿ?ô?ôÀ ÿÿ_ý_ý ÿÿÕÿ€ÿÿÊÿÿÿÿOÿðÿÿ~€€ÿÿ5¿5¿5¿Ê@“ýlÿÿ–Ûi$ÿÿHÿäkÙ€ÿÿ'Ög@ÿ¿æ¿€ÿÿöö ýÿÿø`ø`Ÿÿÿâ\\ý£ÿÿeÃeÚ<ÿÿa-a-žÒÿÿDÉÀ?ÿÿÿïÿÿÿ ##ûÜÿÿçûÿÿÉÉ6ÿÿÿÿøÿÿÿÿ¢ÿþÿÿêÿÿi999ÿÆú‘ûÿûÿ!=þÂÿÿpð€ÿÿå^@@ÿ¿t ÷ÿÿ{¾ÿÿÿþ÷þ÷ÿÿ7¬3 È_ÿÿÀØØÿ'ÿÿKWKW´¨ÿÿ~~æÿÿÛþÀ?ÿÿÿÿÿÿÿ''oØÿÿ' ßÿÿÿoobÿÿͺßÿ ÿÿ&&ÿùÿÿ´ÿÿ]ÿüï€ÿÿÿÿ‰S÷¬ÿÿîÀÿÿ’ï p`ÿŸiD·ÿÿñ÷¾÷ÿÿ°°bOÿÿ\íX`§Ÿÿÿ€XXÿ§ÿÿÃÃ<ãÿÿeÛeÛš$ÿÿgRÿÿÿÿÄ@ÿÿÿÿ€ €€ÿÿ!ÿþÿÿ  ßþÿÿ*™?ÿÀÿÿ.‹ÿôÿÿlÿýàˆˆˆÿwþÿÿÿÿÿ€Xÿ§ÿÿ½ìBÿÿÞ^!ÿÿâÞ'ÿÿ3~þ~ÿÿìÿÿÿtt‹ÿÿÿääéÿÿXXÿ§ÿÿKHKH´·ÿÿïÔ€ÿÿÿ@€@¿ÿÿÿ ßÿÿÿ€íÿÿÿ ­¥ÿZÿÿ÷¿ÿÿÿÿ&Oÿðÿÿû ÿÿøÇÇÇÿ8ÿàÿÿÿÿ ÿïÿÿòþÿÿŽ ÿÿéÎ7ÿÿøL¿L³ÿÿKŒKŒ´sÿÿº*¼ Cßÿÿ& ù÷ÿÿ˜˜ÿgÿÿÃÃ<íÿÿ_ôÀ?ÿÿÿ€Bÿÿÿÿ( ßÿÿÿ0 ïÿÿÿttû‹ÿÿþáÿáÿÿÇÿøÿÿ¿î@ÿÿx ÿöߪßÿßÿ @ ÿßÿÿËÿ ÿÿ“Ý,ÿÿôË3ÿÿ»þéÿÿ  äöÿÿi oÿÿÿHÿ÷ÿÿð2`2ŸÍÿÿàeàešÿÿOúÿÿÿÿP‚ïÿÿÿJûÿÿÿA@¿ÿÿÿ » »öDÿÿïÿÿÿÿÿ€YÀv?€ÿÿí€ÿÿ†ÿü÷÷÷ÿ÷ÿ0ÿçÿÿ7õÈÿþ¿€ÿÿFf?¿ÿÿNÜÜ0#ÿÿ  ôçÿÿaˆe€šÿÿ!““þlÿÿ‚ååýÿÿ  €_ÿÿkÑÄ ?ÿÿÿà ÿÿÿÿBýÿÿÿJ ÿÿÿÿWþèÿÿùù€ÿÿÿåÿúÿÿŸ¿`ÿÿhÿÿûÿûÿûÿ€ÿÿÿÿ›ÿaÿþs¹ˆFÿÿ‘·~?ÿÿ/þ/Ðÿÿ܀܀#ÿÿ ñÿÿÿ‰--þÒÿÿ`á`!ŸÞÿÿ6€6Éÿÿ[ØD ¿ÿÿÿÀÿþÿÿ¤ ÿÿÿÿ€@€ÿÿÿ(²’ÿmÿÿk€k€”ÿÿ¿Ãÿüÿÿîéÿÿsé ÿöUþÕÿÕÿ*kÿÿÿÿþìÿÿ?€ÿÿ€Ÿ7ÿÿüÿåÿÿÁ€Á>ÿÿÿ„€èÿÿ+  üóÿÿÿÿÿÿ"ö"ÀÝ?ÿÿñÿÿÿÿ À@ÿ¿ÿÿÿÿÿÿàÿÿÿÿÿýÿÿ__à ÿÿåðåÿÿÿúûÿÿ ÿ÷H?H?H?·Àü ÿÿÿÿ >ßÀÿÿ߀ÿÿÂO?·ÿÿ¿˜ÿçÿÿ þóÿÿƒ€þÿÿ`ÿþÿÿçÿÿÿ@À@¿ÿÿÿFÍÿÿÿÿ @@ÿ¿ÿÿÿÿÿÿjyÿÿÿÿÿûÿÿÿ®ÿ¿@ÿÿ®î?ÀÿÿÿûÿÿêÿîH?H?H?·À©ŠÿÿÿÿŽÿpÿÿÖw)ˆÿÿ±ÿÿþ‚ÿýÿÿ2p2`ÍŸÿÿY_ ÿÿÿ ÿýÿÿ80íÏÿÿÿÿÿÿNúÿÿÿÿ¡¡ÿ^ÿÿ@‚ÿÿÿÿðÿÿÿÿ´´ÿKÿÿd{d{›„ÿÿýCý|€ÿÿý€ÿÿ/°@ÿÿ=??ÿÀ|@ÿÿ€8ïàÿÿÿçÿÿ€Ç?ÿÿgçûÿÿ%¬%¬ÚSÿÿûÿÿÿÀ!€þÿÿ00Ïþÿÿxx‡ÿÿÿ'ˆÿÿÿÿõ~õ~ ÿÿˆ€ÿÿÿì!ÿÿÿÿ† ÿóÿÿ[ß[ߤ ÿÿþþÿÿÿ)jÖ”ÿÿi€€ÿÿ///æÐîÿÿÿÿBÿàÿÿÇã8ÿÿJY?±ÿÿ=@ÿ@¿ÿÿa€a€žÿÿùÿÿÿ&  ûôÿÿ00ÿÏÿÿríÿÿÿoÅÿþÿÿq|#  ÿß@À?ÿÿÿ@ÿÿÿÿ€@@ÿ¿ÿÿ¿¿â@ÿÿÑèÑÿ.ÿÿpèÿÿ×àh@@ÿ¿‘>>>~Áîÿÿÿÿä ÿôÿÿÝÓ" ÿÿ(s»ÿÿDG¸éÿÿ##ÿÜÿÿ ûÿÿÿøÿùÿÿ@þÿÿÿïÿÿÿa$`Ÿùÿþ2‘Â"ôÿ¨£¸@EÿÿGèÿÿÿÿçÿÿÿ66ìÉÿÿÿøÿÿÿÿˆ÷ìÿÿïðÿÿz~~ùµƒÿÿÿÿ ßðÿÿqàŽÿÿ÷ÿÿÍ 2óÿÿBBÿ½ÿÿDD»ÿÿÿ €ÿÿÿÿ<  çóÿÿÿöÿÿ¶9>oÃÿüü¢ûÿ –‚æCYÿÿÜþ¾ÿÿþÿÿÿÿÿüÿÿ„Pûÿÿÿ;Àÿÿÿÿ€üÿÿÿ¡Ñ€~þžj¦™¸ÀÏ0µH*ÿþ‘loÿÿÿûÿÿÿDD»þÿÿ£ý£ÿ\ÿÿ'½ØÿÿÿÙÿÿÐ@@ÿ¿ÝÿÝÿÝÿ"z ÿôÿÿ ûöÿÿž+ûÿÿÛ‚Û‚$}ÿÿÿçÿÿ'£%€ÜûÿûÂÿÿÿÿ@ ÿóÿÿ Oðà Ç ÀëË4úÿpð/ÿÿ` ÿßÿÿíÿÿÿßôßÿ ÿÿþøÿÿ½ÿBÿÿr!ÿþ¼y¼y¼yC†ÿáÿÿÿþBT¿»ÿÿž°°Oÿÿ`@¿ûÿÿÿÿÿÿbøÿÿÿû<ÿÿÿÿ€__ÿ ÿÿEûª0ÀïP’l€ì­rÑ*ÿàÿÿÀÀÿ?ÿÿííïÿÿòõòÿ ÿÿ‰ öòÿÿËÿ4ÿÿlÿïmïmÿmÿ’ÿÿèÿÿ`¦¿ßÿÿãÿÿÿG‚C¼ýÿÿ ÿÿÿÿ$ ûÿÿÿ¶ýÿÿÿÿà ÿßÿÿëÿ¬0Àá(Ëô/ƒ€tV[©¤.»Ð€ ÿ؆ÿýÿÿDÿûÿÿ— —hðÿÿØÏ÷8ÿÿ¬ýSÿÿù¿ ÿô«»»ïDÙtÙ~Ù&€Šqýžÿÿ–ŒŒsÿÿœ˜gëÿÿ  ûßÿÿ†žùÿÿÿkÿÿÿÿ„ÿÿÿÿ-w¢€0À×)à€pÔ€<-úÿÿàÿïÿÿ±±ûNÿÿµ·áHÿÿe(ÿÿÿÿwàˆÿÿJèÿÿÂÙÂÙÂÙ=&>#?ý?þÀ- þßÿÿ¿  öÿÿkk”ÿÿÿ @ÿÿÿÿ;üÿÿÿ¡·@ÿÿÿÿàDÿûÿÿÎëâ ðÆ Œ ìÌ{T?0ÿÿÿÿïÿÿÿß_ß €ÿÿö@ÿÿÿÿ‡×ø(ÿÿßt ÿÿB ÿß±Z±_±_N )‚ÿÿÿÿ?ÿçÿÿ``Ÿÿÿÿ!b þßÿÿ/ÿÿÿÿºtÿÿÿÿ Ê€Ê5ÿÿƒþ„ ÀßĈƒ°?4ÿÿÿÿÿèÿÿÈáÈá7ÿÿøÿÿÿÿÿøÿÿßh ÿÿ“ô“ô“ôl ëþÿàœ`ÿŸÿÿ€ÿ€ÿÿÀÀ÷?ÿÿ’ïÿÿÿXO@ ¿ÿÿÿÿyÿÿÿÿäõÖÿ(ÿÿ¨ð€3ˆ2Œ œã @ÿÿÿÿÿÿÿÿÿýÿÿïÁïþÿÿÿäÿÿëõÿÿ$ðððû7à7þ7ÿÈ ÿßÿÿ¹€yÿÿÿ’ïoÿÿ ÿÿÿÿ»îÿÿÿÿÿûÿÿÿÿЄÿøÿÿ£¿|@€£0ðÔÌs?†ÿÿÿÿ ÿÿÿÿBÿýÿÿQØ_ÿ ÿÿKþ´ÿÿS¿¤ÿÿ°ÿ÷000Ïà°Šÿÿÿÿÿ óÿÿ€€þÿÿ˜–ÿíÿÿ ÿÿÿÿóýÿÿÿÿ0Aÿ„ÿø×öèH'%¤Ú[?îkÿÿÿÿ@ÿÿÿÿÄÿüÿÿþØÿÿÿÿDxû‡ÿÿ¿}@ÿÿ¨‘ÿÿPõPþPÿ¯¨ÿÿÿÿapá`ŸÿÿXX§ÿÿÿàÿÿÿÿŸûÿÿÿïÞ ÿÿÿÿàÖôÿÿà_$ ÿ¡@?Ö”ÿûÿÿMÿÿÿÿhÿýÿÿðÿ€ÿÿD@ÿ¿ÿÿžÿaÿÿüÿÿ à þ ÿòH!ÿßÿÿsó ÿÿÿ80Ï÷ÿÿ?ðÿÿÿÿ ïÿÿÿÿßå ÿÿÿÿ£8^üœÿàAàh& Õ?I`ÿÿÿÿÿÿÿÿ€@€ÿÿÿ_ÿ_ÿ ÿÿ`ÿøÿÿxú€ÿÿÂ```ÿŸßá_ÿ_þ :‹ÿûÿÿûÿÿÿAâ@À¿?ÿÿÿ ÿÿÿÿDÿÿÿÿëO°ÿÿÿÿÑ*Ùþÿàw«€<Ô+hÿÿÿÿ„€ÿÿÿÎÿñÿÿ_þþ€ÿÿÿðÿÿ=r€ÿÿÿÿ_ò_ý_þ êÿðÿÿx0ûÏÿÿ ù÷ÿÿîÿÿÿÿ™‹4ÿÿÿÿ_µ Jÿÿÿÿašûþ$ÿÀ?€À€!Ý äÿÿÿÿ„ûÿÿÿÿÿÿÿFyù€ÿÿ€Œÿsÿÿüúÿÿ   ïöWû_þ_ÿ ¨XÿøÿÿÉÁÉ6~ÿÿ@@¿ÿÿÿ;bÿÿÿÿÿÿÿÿÿç¿@ÿÿÿÿðp÷ïHÿ€îãÀGÓ/oòÿÿÿÿÿÿÿÿŠ€ÿÿÿíïÿÿÿàÿøÿÿwÚˆÿÿNÿý‚s~ý€"pÿðÿÿ–°–°iOÿÿBHÿÿÿÿ›ÿÿÿÿÿÿÿÿÿ§¿X@ÿÿÿÿÁß`þÿ€È€ÿ›>”oÿÿÿ"FÿÿÿÿQ¨ÿÿÿÿÓÛû$ÿÿé=þÀÿÿíìÿÿÄÿûpz{ÿ„ÿ±ÿñÿÿ††yÿÿÿ!÷ÿÿÿÿôÿÿÿÿ.îÿÿÿÿVý©ÿÿÿÿÁ­*þPÿ€§À ßöý0Ïÿÿÿ¡ÿÿÿÿÄTÿÿÿÿ€//ÿÐÿÿ ?ÿÀÿÿ÷ÿÿÿ¨"ÿÿ„þÿÿÿ·÷øÿÿŒŒÿsÿÿ ÿÿÿÿ»P€ÿÿÿÿÿÿÿÿ÷öÿÿÿÿ«lüÿäø€K÷ ‹½@ÿÿÿ ÿÿÿÿ´ ÿÿÿÿOOÿ°ÿÿ¬Hÿ·ÿÿoýÿÿøÿÿÿúÿè8Ïà0ÿÿ  þöÿÿ€÷ÿÿÿúöÿÿÿÿÚûÿÿÿÿøÞ ÿÿÿÿ ™„þøÿêJÿ Ä`¿ÿÿ€ÿÿÿÿ´ÿÿÿÿ$ÿðÿÿfƹ€ÿÿ}€ÿÿÛ_$€ÿÿò]ÿâ–ÁÖÁ)>ÿÿ€ÿçÿÿÿïÿÿõªÿÿÿÿ´pÿÿÿÿ=Þ ÿÿÿÿ©ððÿ瀗پ¨7ÿÿ€cÿÿÿÿ0ÿÿÿÿlÿïÿÿ«)¿ÿ@ÿÿ@Mÿ²ÿÿ?ÿÀÿÿaƒÿüôô þÿÿ óöÿÿ3,0Ïÿÿÿ¿ôÿÿÿÿ{×(ÿÿÿÿŸÛ`$ÿÿÿÿòxÿø€ÿÿA'€ž$[ÿ?ÿ€ ÿÿÿÿÿýÿÿííïÿÿÿ²ÿÿÿÿÿþÿÿó÷ ÿÿïÄÿþÖ2Ò2-Íÿÿp`Ÿûÿÿ‹€çÿÿü|ÿÿÿÿë¯ÿÿÿÿcÓœ,ÿÿÿÿÊðêü-B+ÿ º¨Wÿ?ÿ‚ÿÿÿÿ1 ÿÿÿÿ2Ó2SͬÿÿÀÿðÿÿþ€ÿÿÛû$ÿÿÿ ÿô % %óÚÿÿ¬‚¬Sÿÿÿ~çÿÿÿý=ÿÿÿÿíýÿÿÿÿü»Dÿÿÿÿ…oPù€þé #ï÷]<ÿÿ ÿÿÿÿódÿÿÿÿ`Ç`Ÿøÿÿ~è€ÿÿ$÷ÿÿÿ=çÂÿÿÿàÿþDaDa»žÿÿ€@€ÿÿÿÚûçÿÿÿgéÿÿÿÿÿçÿÿÿÿlÚ“$ÿÿÿÿ„ðúüì(_Â2ÿÿà ÿÿÿÿ÷°ÿÿÿÿääùÿÿŽÿíÿÿÀÿÿÿÿCþ¼ÿÿ¡€ÿþÖÖ)ÿÿÿ0 ßÿÿÿ¿@þÿÿÿc|œ€ÿÿÿÿÿúÿÿÿÿq7žÈÿÿÿÿÅàúüP óŽ?rÿÿÛ'ÿÿÿÿ|€ÿýÿÿ@@¿þÿÿöÿàÿÿÀ¡ÿþÿÿB–½iÿÿÙä$ÿúVT«ÿÿÿ% ß÷ÿÿþçÿÿÿkà”ÿÿÿÿýÜ#ÿÿÿÿ€ãÿÿÿÿÞPàôø*ˆþkÏ]9ÿÿ÷ÿÿÿÿÿMö0ÿÿÿÿ==ÂýÿÿÿÿìÿÿƒDÿÿÿÿ…¹úFÿÿçâÿüx0ëÏÿÿ*(÷×ÿÿ÷ÿÿÿÿ÷øÿÿÿÿûl“ÿÿÿÿ\b ÿÿÿÿèàø õ ã/ÿÿèc ÿÿÿÿÝ ÿÿÿÿ ÿÿÿÿÿÿýÿÿûôÿÿÿÿ@¿ÿÿÿoÁÿþÁú~ÿÿd@$Ûÿÿÿ\B\¼§ÿÿÿê{€ÿÿÿÿ\í#ÿÿÿÿààÿÿÿÿäømú7 ÿÿÿ£LÿÿÿÿÿôÿÿÿÿäoÿÿÿrÿsÿŒÿÿñ ÷ÿÿÿÿÿÿÿ/ðÐÿþ@@¿ÿÿÿ€ ÷ÿÿ=ÂïÿÿÿÛþ$ÿÿÿÿÿ°ÿÿÿÿçèÿÿÿÿ€#äôø lùæt‹ÿÿðàÿÿÿÿÐðÿÿÿÿ°@ÿÿÿÿ??þÀÿÿÏlÿÿÿÿtÿûÿÿ-ÕÒ)ÿþDD»ÿÿÿ@‚‚ÿÿÿOñÿÿÿÿ¤[[¤ÿÿÿÿ~ÿÿÿÿAÿþÿÿÿÿ‘aÀà CçÑÜ*ƒÿ?ôô ÿÿÿÿË­4ÿÿÿÿHæÿýÿÿ ÿôÿÿo¯ï€ÿÿüÿÿÿÿ<ŒÃqÿþVV©ÿÿÿSÿÿÿÿ?Äÿÿÿÿð€ÿÿÿÿ-ñÒÿÿÿÿ÷ÿHÿÿÿÿ  Ðà…¶Å(<ÿÿ?ðÿÿÿÿÿÿ.¿ÑÿÿÿÿòöÿÿÿÿÐÏÏÿ0ÿÿž®Þÿ!ÿÿÝ ÿÿÿÿ~ÿþ ÿÿÿÿ@Æÿÿÿÿ§ÿ!`ÿÿÿÿÐ"/ÝÿÿÿÿoS¬ÿÿÿÿúŸõ`ÿÿÿÿ<ä À@?Ð8-‡ÿÿÿøÐ?ÿÿÿÿ}ø‚ÿÿÿÿPàÿÿÿÿ„ÿèÿÿý=ý¿@ÿÿú ÿÿÿÿ<ÿÁÿþ!íþÿÿÀÿÿÿÿåÿå$ÿÿÿÿ|Ÿƒ`ÿÿÿÿßw ‹ÿÿÿÿücüÿÿÿÿñt À  ÷ñx ‡ÿÿÿþÿÿÿÿÿÿÿüÿÿÿÿmôÿÿÿÿÀFÿùÿÿ|Ï|σ0ÿÿ¿Àÿÿÿÿ` ßñÿþûúÿÿRrýÿÿÿ—÷•Lÿÿÿÿž:@ÿÿÿÿÿÿÿÿÿþíîÿÿÿÿüö àð÷€@„G¨~ñÿø˜ÿÿÿÿÿ÷ÿÿÿÿÿqÐÿÿÿÿjÿÿÿÿþþ€ÿÿV¸ßÿ ÿÿáGÿøÿÿ@@¿ÿÿÿ  ôÿÿÿ÷owÐÿÿÿÿ€­ÒÿÿÿÿÍÿ2'ÿÿÿÿÿý¤ÿþÿÿµÇ @€¤¥_z°ÿÿÿüøÿÿÿÿÿB/½ÐÿÿÿÿŸ­ÿÿÿÿèÿûÿÿß^ß_  ÿÿŸ{Ÿÿ`ÿÿ@%ÿÀÿþ¤#ûþÿÿCCüýÿÿàÏà4?ÿÿÿÀ?rÿÿÿÿ¾Aÿÿÿÿÿÿþþÿÿÿÿ\÷ Àý@…Þ\£ÿÿý–ÿÿÿÿÿBnýÿÿÿÿb¿ÿÿÿÿÔ€ÿÿÿÿ1ê1ïÎÿÿ/ñÿÿÿÿd3ÿÌÿÿ`@¿ïÿÿKPCüÿÿÿ”ÿ„DÿÿÿÄ¿;@ÿÿÿÿýíÿÿÿÿÿþ4€ÿÿÿÿSÀ´H€¢ à†±ÿÿþþÿÿÿÿÿÿäÿÿÿÿç}‚ÿÿÿÿ ÿÿÿÿ]½]½¢BÿÿÛ¨ÿÿÿÿÈQÿ¤ÿÿ ûÿÿÿ`K KÿÿÿÿÿÿØ@ÿÿÿÿH_· ÿÿÿÿÿÿ9ÿÿÿÿÿý÷ÉÿþÿÿÁ>@€^€ ` o•ïÿÿûýÿÿÿÿÿJÁõ¾ÿÿÿÿóÿ ÿÿÿÿæ$ÿÿÿÿCCù¼ÿÿ÷øÿÿÿÿÖ„ÿúÿÿ˜ûÿÿÿÔûD;ÿÿÿÿÿìÿÓÿÿÿÿ0Ï€ÿÿÿÿ{ÿ€ÿÿÿÿÿü(xÿÿÿÿ/“€@€ "@ ðÁ¾±Ïÿÿÿwÿÿÿÿÿð ÿßÿÿÿÿžÿaÿÿÿÿþlÿÿÿÿŒ óøÿÿÛÛý$ÿÿôÿûÿþþÿÿÿ|¿|¿ÿÿÿÿÿÿ¿àÿÿÿÿÚ%øÿÿÿÿöÿ ?ÿÿÿÿÿÿÿáÿþÿÿ7Õ@€àÝ"ïþ\/ègÿÿÿ¿ïÿÿÿÿýÿïÿÿÿÿß/ Ðÿÿÿÿ>öÁÿÿÿÿ‹‹ãtÿÿÿÿ€ÿÿíÿúÿÿ¬ÎÀû?ÿÿRÿR·ÿÿÿÿÿÿÿ¼ÿÿÿÿ ߀ÿÿÿÿûÿ/ÿÿÿÿÿÿÿáÿþÿÿ"ú@€n÷$ëðm?+—ÿÿÿûÿÿÿÿÿ’ÿéÿÿÿÿæûÿÿÿÿï€ÿÿÿÿÈH·áÿÿç×çß ÿÿûbû|€ÿÿb`ÿŸÿÿþÿNÿÿÿÿÿÿÿûìÿÿÿÿßÿÀÿÿÿÿ¦?YÜÿÿÿÿÿáî@ÿþÿÿo÷€÷ÿ@$@;Œ×ð2Oÿÿý¿ÿÿÿÿÔ ÿÿÿÿÿÿ¤…[xÿÿÿÿé¾ÿÿÿÿÇ··øHÿÿŸ¯Ÿ¿`@ÿÿÞ‚ÿþÿü(``ÿŸÿÿ\\§ÿÿÿÿÿæÿÿÿÿÿû?dÿÿÿÿç¹ÿÿÿÿÿú~Áÿþÿÿçÿ€kþ`€[ÉèîÇ?ÿÿþïÿÿÿÿßüÿÿÿÿÿÿ.Ñÿÿÿÿÿ{´€ÿÿÿÿÿñÿÿ`ß`ߟ ÿÿ@þàÿÿ#jbÿŸÿÿ——ïÿÿÿÿÿÿöÿÿÿÿÿÿ~@ÿÿÿÿ}ÿ‚ÿÿÿÿÿï÷‘ÿþÿÿžÿ @€ÿûî ]˜DÝ_#£_?ÿÿÝÿÿÿÿÿo`ÿÿÿÿÿÿ% Úÿÿÿÿÿþ€ÿÿÿÿ’íþÿÿ§ë§ëXÿÿ·ð·þHÿÿ¨ ÿûÿÿOŸ—ÿÿÿÿ¿¿„ÿÿÿÿìÿÓÿÿÿÿÿàÿÿÿÿÿûÿáÿþÿÿÿ÷€€þ{„è"W¥ècèœÃ?ÿÿ¯ÿÿÿÿÿøÿÿÿÿÿÿ¢]ÿÿÿÿÿúþÿÿÿÿÿþÿÿÓÓä,ÿÿŸÂŸþ`ÿÿcaÿŸÿÿ__ÿÿÿÿþÿáÿÿÿÿÿÿ?àÿÿÿÿô ¿ÿÿÿÿÿúþûÿýÿþOÿàЃ/|ÿøþï³îBf¹:§ÿÿ÷Mÿÿÿÿÿßùÿÿÿÿÿÿ°ÿÿÿÿÿ™uf€ÿÿÿÿ©ÿûÿÿèàüÿÿ¸þæÿÿº0ÿÿÿÿ§ß!ßÿÿÿÿ¿üûÿÿÿÿÿÿ¼ÿÿÿÿù‡ÿÿÿÿÿÿ¿óÿýÿþ_ÿ ¸¿@Üt0·ÿ×ß c§ý w¿ÿýþ¿ÿÿÿÿÓ¨ÿÿÿÿÿÿ#ßÿÿÿÿÿ×ú ÿÿÿÿþZÿÿÿÿÒP¯éÿÿNN~±€ÿÿ±s1sþŸÿÿåÿåÿÿÿÿÿÿÿØÿÿÿÿÿÿ{ìÿÿÿÿÆ_9¢ÿÿÿÿÿý?ùÿÿÿþÏÿ0„‡xãb#½ŒB¿ÿùðÇ¿ÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿE•¿ÿÿÿÿÿïÿÿÿÿÿª@ÿÿÿÿh ßçÿÿ=>ÿÀÿÿ¨J¨Bÿ¿ÿÿ—ÿ•¿ÿÿÿÿÿÿÿðÿÿÿÿÿÿÿæÿÿÿÿ¼_C¬ÿÿÿÿÿûœ#ÿýÿþ×ý(‰¤GøMª€k ”âÿúüË¿ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ¹ÿÿÿÿÿÿÀÿ€ÿÿÿÿí­ÿÿÿÿ‚}üÿÿ¹$9>ÆÀÿÿ)?(ÿÿÿÿ÷ÿwÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿöÿÿÿÿÈ_7¯ÿÿÿÿÿÿþÇÿúÿüÿëïþÎð&ÝÉ0` ÿßïñ"ow¿ÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿJÿÿÿÿÿÿÿáÿÿÿÿî"ÿÿÿÿÿçÿÿdådî›ÿÿü ô ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿„ÿÿÿÿ~ÿÿÿÿÿÿòÿíÿþÿÿ耑%Ó·,¸@£®ãñê ëÏÿð‚· ÷o?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCoÿÿÿÿÿÿˆE÷ºÿÿÿÿóÿÿÿÿÿ’ÿÿÿÿ‘‘înÿÿúŸø‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿáÿÿÿÿß Ÿÿÿÿÿÿýü…ÿøÿþ“>  o óp€ 7Épp Sÿ¬›ôä…£?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿ¨Mÿ²ÿÿÿÿÌU ÿÿÿÿBÿÿÿÿööüÿÿ¿—¿—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿üÿûÿÿÿÿßÿ.ÿÿÿÿÿøï÷ÿúÿüü`"!Áþþ(¿×`º~“þl¡óþ ¨éo¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿÀÿüÿÿÿÿ|è€ÿÿÿÿj0ÿÿÿÿÿáÿþº_ºVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØÿÿÿÿÿÿ §ÿÿÿÿþýýQÿÿÿþÛ¼ B”™bàþÿ …Ñû>ýsWõ¾ M?²ÀíŸæŸ¿_?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿiXþ·ÿÿÿÿ>Á€ÿÿÿÿêçÿÿÿÿˆ~ÿ€ÿÿÿßùßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿßÿ§ÿÿÿÿÿÿùþ¡ÿüÿþûp²æR~o€¢ÌSr<Út¿îŠ=·‚@¤¯­×Bÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÿÿÿÚì$ÿÿÿÿúÿÿÿÿ@^^ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿß÷ÿÿÿÿÿúÿçÿýÿþÓþ(Ùœ$ãüÿžÏ01Š.ˆßwäzû…ïÇío¿_?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²ÿýÿÿÿÿÿäÿÿÿÿõfÿÿÿÿËÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿóÿìÿÿÿÿÿ¸ÿÿÿÿÿû¿ÂÿýÿþÿóÀ-eK|wƒ€ñ iÿž2¤/ßÿ™­ŸR`¬éŽ?ß?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòBÿýÿÿÿÿÜÍ#2ÿÿÿÿ× ÿÿÿÿ¥ƒÿýÿþëÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿÿÿÿ.Ÿÿÿÿÿÿùÿêÿýÿþ=óÀu°€ÿÿlŠ?÷ÀLùM³pŸÇà¸BT.Ÿß?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº„ÿÿÿÿÿÿŸë`ÿÿÿÿ/ÛÀÿÿÿÿjÿüÿÿÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÿÿÿÿÿŸÿÿÿÿÿÿþÿûÿýÿþ5Îà1øƒ÷ÿ+<Ð?ÿÀ&ÿÿ×ЀèþÅ¿Ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿ…Ìú3ÿÿÿÿ¿û@ÿÿÿÿ«Áÿþÿÿ÷ÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿßÿÿÿÿÿøÿùÿüÿþºÓ@ ’h{퇾‘ñÿàþêÿÕè„¿?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíìÿÿÿÿÿÿ¿û@ÿÿÿÿÓÖ(ÿÿÿÿ¿#ÿýÿþÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿýÿñÿüÿþ–€pÄ™ÿÿß›ËÌà0haûþÌŸoàp€.á­Ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDë»ÿÿÿÿÿÛ$ÿÿÿÿÓ ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿüÿþ¯p‚q/çø?øÀÖKtï€h½(IèðÒçè¸@ß·ë¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿûÿÿÿÿÿÿÿ @ÿÿÿÿÿÿnê‘ÿÿÿÿ×õ ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿûÿýÿþ»ä‹`Oòžððá†Öiÿà1rZð#ü1®ÇP˜`ï‡øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºuÿÿÿÿÿÿoûðÿÿÿÿ¿ÿ@ÿÿÿÿŸà`ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿþÿÿoz0 €`_×gÐЀ/Ñÿáÿþ÷£Àð}þ°'3øœ`ÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè°÷ÿÿÿÿÿ´ãKÿÿÿÿpØÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿþÿÿÀø€E:ÕãÐÿÐ/åd/x€ÿÿ^dJ|<ƒÿ-õðûÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿFÙù&ÿÿÿÿ`æÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿƒ/í>ÀCY{;„øC—@¿ãÿü¡¯Àÿ†ëÅèÚc<œ_ÿ Áÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©Jÿÿÿÿÿÿ¾ðAÿÿÿÿWø¬ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÿF™!@>€À°¥€|¯ØàáÿþöŸ’àq reöþ ½õÂÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèbÿÿÿÿÿÿÁ~ïÿÿÿÿ´ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿ¶{À8€À+‘änÇÁÈ?çÿøâ$]î€ݸä"#ÿÜÿ¯€Çÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿ¢@ÿÿÿÿÿ@ü¿ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô§çà¸À@vrŽys÷•æÿøñÔwî$ú÷ ÿþžÿ Æ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿû ÿÿÿÿÿÿ‰öÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÙÊ–Áàà’wïýpØOÈ?ïÿð2ÿø P ìŸþÿCü¼ˆÿxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH@ÿ¿ÿÿÿÿ®ýàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿ|½µã;ÀÀ|ûîùj‘žc¿«Ìÿð`¶?NÀªÑöÏý?þ1þîUÿÓÿ+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿ/ÿñÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûû— Áàð{Eï=9ƒÀÝ·ÿèÿðóÁÏ¿³þÉüGþ?ÿ¿þà;ÿÝÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÄÿÿÿÿÿÿ`2ÿÍÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈέôÓàù7áwò(ÀoîæÿñÿøT îŸ`…ûVýËÿ?þ[Ãd?€íÿ‹ÿsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä ÌT¡†Ãù0ã/W?°ÀÎïÿ÷ÿøhLé6ßç0ëøçùßü?þʺõV9×ÿGÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÓ#ÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…p®ÁòÁþ¢ýõÿòßù¿éñÿþÁìp,Çì8'ûoýüÿþMLòé/ßÿßÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¹ÿÿÿÿÿÿÄ„ÿxÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÄ—úÂáÿ%6;Æ?ñÀ/ùðÿøÿÿ 1a1Îÿ+úþÿýÿþ.ýÑÇ'ÿŸÿ?ÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿv¿ÿÿÿÿÿÿý ÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÄ~ò€áÿ:Âvqý?õûÿûÿüNÄ5óàÅð?ÿÿýÿþÖÙ©Á+ÿËÿgÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá[Ï¿âñÿE~?€ÿÿ¯úþÿüÿÿij!pÿÿ{ùÿþÿýÿþàÿÇ*OÿÏÿ_ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÃÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿøêñÿ#÷ÿüÿÿÿüþÿÿÿÿÃ<Í?ÿÿÿùÿýÿÿÿþ¿ïô/ÿßÿ_ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþöÂÅ?ãÿ`ÿáÿÿý¿ÿÿþÿÿ (Ì3ÿÿÿÿ×ÿüÿúÿü—aö Ú?¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿþgÿÿÿÿÿÿý ÿðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛMÏÀô?ãÿéÿÿÿÿÿÿÿÿÿÿÿgÓà/Ÿÿÿÿ×ÿÿÿúÿü0òI Þ?¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿkÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá/ñàìóÿö`@ý¿ÿÿÿÿÿÿÿÿÿ/çÿÿÿÿÿÿÖÿøÿýÿþP»r]Î?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþßÿÿÿÿÿÿûÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäŸóàìóÿÅ’’úmÿÿßÿÿÿÿÿÿÿ o÷ÿÿÿÿÿÿÇÿýÿúÿüI,dŸ7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÿÿÿÿÿÿþ4ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúwì0ûñÿé·–þiÿÿÿÿþÿÿÿÿìÿÿÿÿÿÿ×ÿøÿýÿþëÈP׋ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü)úàýóÿKl mô“ÿÿýÿþÿÿÿÿv ÿÿÿÿÿü‰ÿðÿûÿüIåa—?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷®ÿ ü_óÿ„ðqàÿÿ¿óÿýÿþÿÿßÿÿÿÿÿà”ÿâÿúÿýηC_¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýðñðôûÿ¹Ý>=Àÿÿ¯ÿÿûÿüÿÿ+_hÿ—ÿÿÿÿËÿöÿúÿýÃ'òÿ‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÞùøðÿÿVËX¨ —ÿÿþÿûÿüÿÿÓðÿÿÿÿøáÿþÿúÿý<Rÿ ÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPýÐô/ûÿ¼| ;@ÿÿúÿûÿüÿÿÿõ? ÿÿÿôŸÿîÿöÿù Ïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷—ý÷ôûÿ’¼â«Gýÿøÿôÿøÿÿ »ÿÿÿ Ìÿ,ÿýÿòa¿öŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúmûúýÿ$:ÆÆùÿçûùÿýÿþ)Å?ÿÿÿøõÿÿõÿúRŸýßÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽûÿúýÿöüž{xá‡í"‚Ùýÿþ.¤¦¡ÿ_ÿéÿ ÿøÿö¶^Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"ÿ=þÿÿgã üð@’V$Hï¿ÅŠµ…4Ëÿ@!¿ÙÿýÿþÐOÿQ€³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ£þÜþÿÿã0ì0Ïÿ‘¥¹ˆ†ÿÛ"Û!x߇ÿð áÿöÿø§oþWÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_þ þÿÿŽ…~ÿÿå¡ÿÿÿ-s°ÿÏÿ£`\šÿíÿðõï÷Ï ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ`þ€ÿÿúoÿÿÿŒÃþ?ÿÿÿŽ«Â ßÿÿ’ym½ÿÒÿàß?Ó¿/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ þðþÿÿ0Øøÿÿ !þÿÿÿÿCʧÈÀ7ÿÿo“OÿèÿðžÿÏÿ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGþØÿ ÿÿûøÿÿ•Ä ;ÿÿÿÿrÛòà ÿÿ/Þÿéÿðÿßÿ_ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿ|ÿ€ÿÿ¦Þ_üÿÿt€ ÿÿÿÿÞíàÿÿœ¤ƒ#Çÿÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿþÿ€ÿÿP{øÿÿôÑ .ÿÿÿÿ9Þðàÿÿ[¼,ÿÙÿÿÿÿÿÿÿÿüÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ®ÿÐÿÿY\'üÿÿ A¿ÿÿÿÿL÷ýøÿÿ]× ÿîÿñßÿ_ÿýÿÿÿøýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÿ¿ÿÀÿÿc˜CåCü¼2¸I‡€ÿÿ;ÂÂÂü=ÿÿ—ñOÿÿà?ÿ~ÿÿÿÿùÉúÿüÿÿWÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿ·ÿÈÿÿiloÿ|¿‚dÿãé˜þgÿÿŒ#ÿÐÿàtÿ÷ÿÿ?ÿýlø)ÿÐÿÿÞž~a¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÀÿÿˆ‚÷üü‘oÿÿ¢n»îDÿÿ~ ÿÀÿà»ÿìÿÿÿû2ø6ÿÆÿùÌ^¡?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÿÎÿðÿÿû˜ÀÃç<š—hÿÿÞÙØ 'ÿ1‘®ÿÿÀoÿ)ÿÛÿÿöÀ÷øÿçS.`™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿþÿÀÿÿÍ”:`ÿü¢íÿ3Ïãðàÿÿe¹×þ€ÿÿÿßÿ?ÿòðàøïÿ;îàÀÿÿ»ÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿ÷ÿøÿÿîÿ´<ÿò˷÷·þHÊ&Ãî<ÿÿ:+ÿÀÿð/ÿãÿÿÿÿÀþÿÿÿ'þÀÿÿ¿ÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿàÿÿÉì@ÿ€l3ÛÿÄ?ùùùÿÿTÿ ÿÀoÿÿïÿÿü€üÀü?ÿÿÿàÿÿ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà´ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõÿàÿÿÔ|/°?ÿÀlÌ|ÿÿŸ²Ÿò` ÿÿ°‘ïÿ@ÿ€Ÿÿ¿ÿoÿÿÿ€ÿüÿÿÿ ÿðÿÿíÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿ÷ÿøÿÿ¡Gþ†ÿøþ/ _üÿ§Ïÿ0ÿÿڢؿ'ÿÀ¿ÿÿïÿÿþþÿÿÿÿÿàÿÿ5'ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû„ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿÿÿðÿÿèúÿÿjga?`Ÿÿ3¿3¿Ì@ÿÿ¤°úOAÿ€ÿ¿ÿïÿÿüüÿÿÿÿÿáÿþxøæøÿ?ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿôÿðÿÿð÷/ÿüÛ?ÿÿýñÿýÿÿÙ3Ù?&@ÿ€ßÿ_ÿÿÿ?ÿøøÿÿÿÿÿðÿÿòn1éðÿ?ÿOÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû´ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿóÿðÿÿŠ¬{Àÿÿ‡tœÿÿ‡÷úÿÿÀ3Àï?@ÿ€?ÿÿßÿ?ÿððÿÿÿÿÿüÿÿÅ)Ê ?ßÿßÿ?ÿ×ÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿôÿó‰Àyÿÿÿ©÷ÿÿÿ˜éŸÿ`ÿÿ‡‡~yþÿÿ¿ÿÿÿÿääûÿÿÿÿüÿÿÊ7ÿÿÿ¯ÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„ÿÿÿÿÿÿ(Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿóÿõÿøh‡”‡xÿÿ¯ø¿ø@ÿÿnoþÿÿ?á/@ÿ€_ÿÿÿÿ?ÿÀÀÿÿÿÿÿüÿÿüúÿÿ¨9±ûFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿÿÿÿÿÿ«^ÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿóÿýÿð³d‰ÿÿÿ¤õõÿ ÿÿ`û€ÿÿ˜Ã;~„ÿ¿ÿÿ¿ÿÿ€€ÿÿÿÿÿüÿÿ8æˆùÿÿ'¿Áýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„ÿÿÿÿÿÿ(Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿúÿ÷ÿùïL¸ûÿÿOOú°ÿÿâ~ÿ‚ÿÿëÚúü…ÿ?ÿ¿ÿÿÿÿÿÿÿÿÿüÿÿïK‡ÿðM7Å0ÂÏ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÈÿÿÿÿÿÿ>ÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿÿÿÿÿÿªÞÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÿáÿòÿùIÞ@¿ÿÿ|ÿ€ÿÿ!óþÿÿ‘ÿ·ÿÀþ_þÿÿ?ÿÿÿÿÿÿüÿÿ§bÀZyÿ‡ÈРÿÿÿ/ÿÿÿÿÿüÿÿÿÿÿÿÌÌÿÿÿÿÿÿœÏÿÿÿÿÿÿ<ïÿÿÿÿÿÿÿ½ÿÿÿÿÿÿ«BÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÙÿÇÿãdh€ÿÿÿ ./ÿÐÿÿKô<ÿÿ…K@ÿÿ€üüÿÿÿÿïÿÿÿÿüÿÿ×ûÿkdÿŸŸ€ÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÌÌÿÿÿÿÿÿÉÿÿÿÿÿÿÿ<¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›ÿßÿçÿƒ=áx‡~ÿÿyažàÿÿñèÿÿïø‡ÿ?ÿÀ?øÿøÿÿÿ€ÿÿÿÿÿÿÿÿ~¢~Ö ÿÿbõðüÿÿ÷ÿÿÿÿÿüÿÿÿÿÿÿÌÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWmÂ3¿ŠÿÇbð/ðÀÐÿÑÿ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöµñƒüøúvþ‰ùÿÿüÿàxÁxx‡ÿO×Ôÿ¹ÿþÿþ¿þ¿ÿÿ|ÿÿÿÿ€ÿþÿÿïÓü#ÿã„dR¹ŸøàQÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàoëàðþ±þÁüÿþ|4ãÿ€8àøøÿ¿ÙŸ—Ýÿî_ÿ¿ÿ¿ÿÿø?ÿÿÿÿÀÿÿÿÿª‰Öp ÿü rI#/ßðûz?yÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿÿÿÿÿÿÿÿøCÿÿÿÿÿÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐ÷ÏðàÿŽþ7ÿGÿøþëÿÿ(óèèÿ?ÖîÿÞÿçÿÿŸÿ¿ÿÿð€ÿÿÿÿàÿøÿÿ´¤¶&HÿÿÍÞ¸^ï¡p«_X?ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ™ÿÿÿÿÿÿÿû_ÿÿÿÿÿÿíoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ߯àGÀÀ?úXþ(üˆÿ÷—»ÿ¿ÿ@èÀù0øÿ‚ÿFÿêÿÿÿÿÿÿÿÿàÿàÿÿÿÿðÿûÿÿ&,"_Ú?ýÿ{àcü¼ÀŠÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ“ÿÿÿÿÿÿÿûCÿÿÿÿÿÿáoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¸€ÀÿÚÿúÿJÿµ”«—¿—¿h@|7üÏüÿß‹ÿè?Õÿã?ÿ_ÿ?ÿÿÿñÿðÿÿÿÿø ÿçÿÿ¾–~‡ÿÿ©¸&<ÏÃðPo0óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ‡ÿÿÿÿÿÿÿû_ÿÿÿÿÿÿïoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþ¿·@ÿ ÿpÿàÿŸ¢  ï_1.Þïÿ¥ÿ´ÿŠÿÁÿÿÿÿÿÿÿÿÿÿøÿÿÿÿð#ÿüÿÿþ¯_‰˜Fçÿ¬éï|/ƒÐÑoLÃÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ“ÿÿÿÿÿÿÿø_ÿÿÿÿÿÿï ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿþÿü€/ÿÚÿòÿòÿ×ÿþ ¸Hÿÿÿÿœÿ¢ÿÁÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàzÿ­ÿÿ¼öÿ’0mÏÿ‰ªêþ ô|ï¤ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿüÿüÐÿëÿØÿøÿç ÷ÿ³ÿÿ–ÿ·ÿèÿÀ?ÿÿ¿ÿÿÿÿÿÿÿÿÿÀ‹óÿ<ÿÿGdUl’Ÿïÿæƒw‡àøѳ‡pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿøÿø@3 ÿÐÿÔÿüÿã=AþþààNàÿÿàÿ…ÿºÿÀ?ÿ_ÿÿÿ?ÿÿÿÿ€ÿÿÿÿ®Öüyÿÿ€¡«à$ßÿ¡‡¶Gðø÷"áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿüÿ ÿÀ€7 ÿæÿþÿîÿñ(ÿäÑëÐÐ/ÿÿXÿ7ÿÀÿ€Wÿ¯ÿÿÿÿÿÿàÿÿÿÿøüæÿÿ¯ÅWÁ>ÿÿ$7ŸÇàøå[Gð¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHþðÿ€ÿ'ÿÍÿéÿéÿöz4B4B4½Ën‡gÿÿÿVÿAþ ÿõÿÿÿÿþÿðÿÿÿÿì ùóÿü<Ãþÿÿ Þ.Ïáð»q‡ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0þDÿÿ€ ÿúÿòÿúÿý ÿÿÒ#ÿÿÿ"ÿ|ÿÀÿ€¯ëÿøÿøÿÿÿÿò ÿýÿþ¸‘·€oÿM óðüƒ¸xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÿ ÿþr ùÿøÿüÿÿ9—æÿðÓÿïÿ«ÿ´ÿ@ÿ€ÿþßþþ?ÿÿh<…Ãþÿÿ¡ÍÀ?ÿÿ]7áèþÓ9øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀØ À€€¿ÿÿüÿþÿÿ¾‡_€€àë··ÿO^ÿ°ÿ@ÿ€ÿßÿ#ÿÿÿ?ãáÿÿ¿Ø?ØÀ'ÿÿë³èüÿ }àøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿpÿ ÿÀ ÿþÿÿÿþÿÿ¼=_üüà#¼×ÿüþHÿ`ÿÿ€ IÿÿÉÖËÅÖÿÿV»¿é@ÿÿ^‡÷àøÿ¾‰Àx?ÿÿÿÿÿÿÿîˆÿÿÿÿÿÿ´DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæAnø! ÿÿþÿÿÿÿ!^V¾þèαïÿüœÿ þÀÿhÿOÿüCùöuÿŽIB‰v€ÿÿ¨¿`@ÿ€$(Åø?ÿÿÿÿÿÿÿî»ÿÿÿÿÿÿ•Ýÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿúÿþÿù@€ ?ÿÿþÿÿÿÿçàøøHßþ?ýªý€ÿ@þ‡…p5{QžÀÿ?“cï<ÿÿ“Wlxÿ€š¯  ü_ÿÿÿÿÿÿÿî¸ÿÿÿÿÿÿ¤Eÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿàÿÀÿÀ ÿÿÿÿÿÿ¹?ÂÀƒÿül þ»ÿ_?ÿ þÀýþ4Te(|ȃ÷@B½üÿÿXg§ßÿàqècÿÿÿÿÿÿÿî»ÿÿÿÿÿÿ§]ÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøø ÿÿÿÿÿÿÿÿÿíÿàdAùÿÿÿ÷û€ôø˜G?ýE úÿ[`Ÿàÿÿm£mÃ’ÿü>ÿþÿÿÿÿÿÿÿâˆÿÿÿÿÿÿ´Dÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€À€¿ÿ?ÿÿÿÿq¶€ÇÿøÄûcü¿ñþÀøü, îøìÿ 9}àÿÿÚpÚa%ÿþ¡öÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿüŸÿ¿ÿ?ÿÿþHãˆÃ÷üÃn3¿üÿâðõüø §Q Ðü/ÿ®^àÿÿ(fvÿ†ÿù?ö?p?Àÿ¿ÿÿÿÿÿ„ÿÿÿÿÿÿ!ÿÿÿÿÿÿDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô€øøð?ÿŸÿ_ÿ?ÿø/õÏáðþNÝñoÿ„ öüøóªèŠuÿdósr€ ÿÿnjlÿÿÿ—‘pÿÿ¿ÿ?ÿÿÿÿµÿÿÿÿÿÿ­kÿÿÿÿÿÿ^ÿÿÿÿÿÿÿÿÿÿüÿÿÿýÿþœ€¿ÿ¿ÿ_ÿ?ÿð‹í áôþaù|‚ÿÿÀþèð É 8òÿó/ðÀÿÿh ÿðÿÿßÔ0ÿÿÿÿÿÿÿ„ÿÿÿÿÿÿ-kÿÿÿÿÿÿ^ÿÿÿÿÿÿÿÿÿÿõÿàÿÈÿðàþÿÏÿ/ÿÿì§úGðøÿªï¿@Aÿÿ]€¤ðø‚3vs ÿ’8ø`ÿÿ€ÿøÿÿf± pÿÿ¿ÿÿÿÿÿ½ÿÿÿÿÿÿmkÿÿÿÿÿÿ^ÿÿÿÿÿÿÿÿÿÿíÿ€ÿ€ÿ€`?ÿÿïÿÿäÏðøðÿA½}‚ÿÿA®øð"ƒ{ÿñf÷ö ÿÿ‰€üÿÿü(øÿÿŸÿÿÿÿÿ½ÿÿÿÿÿÿ¡ÿÿÿÿÿÿFÿÿÿÿÿÿÿÿÿÿÿÿÿ ¿ÿOÿßÿ?ÿôŽî÷ðø =úBÿÿŽÀàdàà '0ÿÿÿ_Ô_÷ ÿÿïðÿÿ_ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþ ÿßÿÏÿ?ÿYôæ7÷ÈøÖ»(TÿÿÈp À®ž~£…€€ÿ¿]ÿ~€ÿÿÐ4/üÿÿ?ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüügÿgÿoÿŸÿ±Îîûðüßøÿÿ€ÀàQu Í\Ä'Ä;ÿ¿Žÿÿÿÿ2ýÎÿÿÏÿßÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøø ¿ÿŸÿÿÿÉŒö÷ðø-Úñ ÿÿp€@€N9H ø_øÿ'ÿ~€ÿÿl “ÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿððððKÿÿƒÿÿÿùýFÿøþѬ#ÿSP€àË”)ÐÐ/ CßþÿÿÑþ>ÿÿoÿÇÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀ|ÿGÿƒÿÿÿúPü£þüÿZ>´ýÿ$@ À3p0ðáÿÿÿûôÿÿ¯ÿ§ÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀ Ãÿ÷ÿÿÿÿÿ8úßÿàü°6oÇ?øÿÀ€ üü«Ñ„.€ÿéþ ÿ÷ÿoÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€šÿgÿÿÿüúÿþøÿ,=çÇøÿà@€bÿâöà àÿ0ŽÏqÿÿÏÿÇÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/?Àÿÿÿÿÿ0ÿÃþüÿ5d£Ž_ð?ÿx€€¶‹m©ÿ†ÿ€'åßûÿÿ¯ÿ§ÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþF¡ÿÿÿÿþ þoÿpÿ€»ôøGè?ÿH€€(G?wÿ`ÿ`ŸïMóÿÿ?ÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿüù—Æ¿ÿÿÿ;ÿÿ¾ÿÀ¦æ…[ð?ÿÚ€€÷éïàÿàbpŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿü“Ÿgÿ¿ÿÿÿ8ÿáÿ¾ÿÀ ÅÄsà?ÿÀ€  êèÿèãÚýÿÿ§ÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿü×ÿ/ÿÿÿÿÿ’ÿîÿ±ÿÀºrG Ýÿþ€ õà=ý5ûÿÿÇÿÃÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿø‚ÿ¿ÿÿÿÿÿ“ÿÖÿÙÿà—æßgo™ÿþЀÁ @Ü?üã ÿÿÿ·ÿ“ÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿø&ÿÿ¿ÿÿÿÜÿÑÿÿÿàgσýÿþ @`€i=—ÿGïïÿÿ•ÿ•ÿkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿðÿðÿðgÿÏÿ¿ÿÿÿßÿáÿïÿð¯†ÿøÿÿ~À€u ý„ƒÿ€ÿïÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿðÿðÿðÿðÿ¿ÿÿÿÿÿõÿèÿýÿó¾wÿÿøÿÿÀ€ ?ÿVAý@¿ÿœÿ"ÿÁÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿàÿàÿàÿà¿ÿÿÿÿÿÿÿÍÿëÿïÿ÷üûÿÿñÿþð€ ^®þ¿ë°° OðUÿ­ÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿþÿÿÿàÿàÿàÿàŸÿÿÿ?ÿÿÿûÿþÿóÿÿ~÷ÿøÿÿÈÀ€ÿšÃšìšðeX¿§ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿÀÿÀÿÀÿÿÿ¿ÿÿÿüÿûÿ÷ÿÿü©ÿðÿþÿÿ<À€Ê=áþþõÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿ€ÿ€ÿ€ÿÿÿÿÿÿÿûÿ÷ÿÿÿÿóêÿóÿýÿþ:ÀýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿþÿÀÿ ÿ€ÿ€ÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿóÿýÿþÿÿ7‚@€¿²ÿOÿÿÿ÷ÿÿÿÿÿÿÿèÿþÿÿÿÿÿàÿ€ÿ€ÿ€ÿ?ÿßÿ?ÿÿÿÿÿÿÿÿÿÿüÿþÿÿÿÿØ@€-u» ¿ÿÿÏÿÿÿÿÿÿî ÿþÿÿÿÿÿÐÿÿÿÿ?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿñÿüÿþÿÿo€ ô qá¡l¿þûÿÿÿÿÿÿøbÿüÿþÿÿÿÀÿÿÿ ÿÿŸÿ_ÿ?ÿÿÿÿÿÿÿÿÿÿøÿþÿÿÿÿo€P€ A‘€wdöY¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿ6?ÿ?ÿßÿ?ÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿ\€`€u‡ø rûÿÞÆßo Ÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿ€ÿÿ_ÿ?ÿßÿ?ÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿ¶È€;Ãüûûûûÿl;âÿßÿ?ÿÿÿÿÿÿñÿÿÿÿÿÿþ€ÿþþŸÿÿoÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ €tÀ€»þ¢Áý?ÿÿyÝ&aJ(aZHПAèBXBa`ÇaXGâOZÀÀRGÇab Çah ÇQÎÿ¸Nua6GHGâdD‡Nua&Gÿ GàdôGPHGNuaGÿ G,dôG2HGNu/.:næãŸ,HFF@æ^½G#Ç{&,NuaàGÿHGNuaÖGþHGNuAú$ô"H0<ÿ2àQÈÿü2<ÿ0D@2ÀQÉÿøAúÖ0<ÿ2ØQÈÿüNupga`öNuAúIaJgBA€Sf("zI¢NÑ lV @n4»Ð@Ð@#ûV`JgØNuD $ > z ˜ ÖHz ?< NA\`Print error!`õhSkÚ??aì20QÉÿòNuS ¬d¼SSáHÐ @@dª3ÁVr3ÀVpÂü tðÄ@âJÒB#ÁVtNuaxàØEØAk"⺠â¸3@H@8ÀB±DÙQ3@Cé QËÿä` â¨3@H@QCé QËÿîVECúGNrÂQÒEAeP¹Vt`òÛQ0@@dNuCúG*BY0@2€Àü #ÀVtNu?<NNTU@`$f Hz ?< NA\`Colour only!`òþBg?<NNXBgHyÿÿÿÿHyÿÿÿÿ?<NNOï HzX?<NN\?<NNT#ÀVlB¹VtB¹VpB9V @ <ÀÀ2<ÇtB˜ ÀQÊÿúâXgH@ãXH@QÉÿæNuüQfPùQd#üœV\`RpPÂ6<AxAúEòRPk„2RA²Cd|QÂ"X$XÂDfPŠ!JÿürãÒåÑåéÿøåéÿðåéÿèåéÿàåéÿØåéÿÐåéÿÈåéÿÀåéÿ¸åéÿ°åéÿ¨åéÿ åéÿ˜åéÿåéÿˆåéÿ€åéÿxåéÿpåéÿhCéÿ`Eêÿ`QÉÿ¦QÈÿ‚Jk¾NuTˆPˆ`î#ü V <кEœ#ÀV :EŽ€ #ÀVB9QeüQfPùQd#üÒV\Nu#üÿÿÿ`V <y@кER#ÀV <e@кE>#ÀVB9Qeü]QfQùQd#üÒV\NuS9Qeda2< a„"zDüÓÀ#ÉVd0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘P‰Pˆ0‘Nu zD. :D&"HÓÀ0‘1i1i1i1i 1i((1i001i881i@@1iHH1iPP1iXX1i``1ihh1ipp1ixx1i€€1iˆˆ1i1i˜˜ÑÀÓÀQÉÿ†Nu zCèN/:Cò#úCêVlB¹VpB¹Vta~#ßVlNu <$ØкCÈ":CÀ@$<àvÿAúCfx0à À ÁЂ҂CQÌÿðNu zC”0< §r0PˆQÈÿúü¡Qe#úC.VdNu#ü Vp#üVtPùQd3üÀH3üP3üpVpÀÓÀÛÀá:>(.Àü €Qg(@RG| €ü f€ÿÿÿð€00À{H@À|Aú pÜQÈÿüAúpÜQÈÿüGúêaù R  eIú=É~QÎÿ®Sj~bJ9Qdk :=°]jcÇQfCúBF3ÙH3ÙP3ÙVüÓpÀÛÀáNuAú=qpAr9t9vbxÀV ZoQÌÿðÐ [e`ôÁÂxü0QÌÿúS 0dt9SQËÿÂNuAúAÊ0ú0ú0ºNu THE WINNERSTHE WINNERS(9@3UwUUUUpppppDDDDUUUUppppppDpppUppppppppDpUpppppDDppUUpppppp{*{ô{ô{*€ÀÀ8€ÀÀ€àð°ðàÀà``àÀÀàp0pàÀÀàp 0 0pàÀàð8   8ðàÀð 0 0ðÀàø      øààø0 0 0 0 0 0 øà€?àpp`0ÀÀÀÀÀ`0pp?à€àø80 ``````0 8øàà?øp` ÀÀÀÀÀÀÀ` p?øààø8p`ÀÀÀÀÀÀ`p8øà@@@ À@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      ¶¸ä lÔøPd¼\pˆ”ä<hÀpœôLxÐðHˆ´$„Ü  ` Œ ¸ ä < h ” ì D p È x ¤  ` Œ ¸`¸h?€áÀÀÀÀÀÀÀÀÀáÀs€3 33 ?À?À3 À3 À3 ÀcÀÆ1€Œ#Ø6pÀüÀü ÀÌ ÀÌüÿÏÀüÿÏÀÀÀÀÀüÿÏÀüÿÏÀ ÀÌ ÀÌ ÀÌ ÀÌüÿÏÀüÿÏÀÀÀÀÀüÿÏÀüÿÏÀ ÀÌ ÀÌÀüÀüÎJ{à?{ðqJ0aJ0Ã{ðÇ{àÍJÍJÇ{ÀÃ{ðaJ8qJ?{ {ŒJÌJÌÿ{Œÿ{ÁJ8ÁJpÿ{àÿ{€JÎ0xÌ;Ìsxã1ÇŽ8p8àqÀãŒÇÎ3Ü3øð ðø80 3Ì3Ì1Œ 8 pà8aðp30c0ÇŒ`ÌÀÀÌa€Æa€ÃÁ€` Àp`?óàáà??333cÆÌøpÀÀ8ÀpÀãÀÇÀÎÌÌÌÌÌÌÌÌÎÇÀãÀpÀ8ÀÀÀüþÇÀñÀøÀÀ À À À À À À À ÀÀ8ÀñÀÀÇþü|7ì3Ì1ÃŒ8ç~8p¢Ô  8 j Ï  3 e — É û - _ ’ Ä ö ( Z Œ ¾ ð " T † ¸ êN€±ãGy«ÝAr¤Ö:lÏ3d–Èú+]Àò$U‡¹êM°âEv¨Ù <nŸÐ3e–Çù*[Œ¾ï Q‚´åGx©Ú <mžÏ1b“Äõ&W‡¸éJ{¬Ý > o Ÿ Ð!!1!a!’!Â!ó"#"T"„"µ"å##F#v#¦#×$$7$g$—$È$ø%(%X%ˆ%¸%è&&H&x&¨&Ø''7'g'—'Ç'÷(&(V(†(µ(å))D)t)£)Ó**2*a*‘*À*ð++N+}+­+Ü, ,:,j,™,È,÷-&-U-„-³-â..@.n..Ì.û/*/X/‡/¶/ä00A0p0ž0Í0û1*1X1‡1µ1ã22@2n2œ2Ê2ø3&3U3ƒ3±3ß4 4:4h4–4Ä4ò55M5{5¨5Ö6616_6Œ6º6ç77B7o7œ7Ê7÷8$8Q8~8«8Ù9939`9Œ9¹9æ::@:l:™:Æ:ò;;L;x;¥;Ñ;þ<*><>h>“>¿>ë??C?n?š?Å?ñ@@H@s@Ÿ@Ê@öA!ALAwA¢AÎAùB$BOBzB¥BÐBúC%CPC{C¥CÐCûD%DPDzD¥DÏDùE$ENExE£EÍE÷F!FKFuFŸFÉFóGGFGpGšGÃGíHH@HiH“H¼HåII8IaIŠI´IÝJJ/JXJ€J©JÒJûK$KLKuKKÆKîLL?LhLL¸LàM M1MYMM©MÑMùN NHNpN˜N¿NçOO6O]O…O¬OÔOûP"PIPpP—P¾PåQ Q3QZQQ¨QÎQõRRBRhRRµRÜSS(SNStS›SÁSçT T2TXT~T¤TÉTïUU:U`U…UªUÐUõVV?VdVŠV¯VÓVøWWBWgW‹W°WÕWùXXBXgX‹X¯XÓXøYY@YdYˆY¬YÏYóZZ;Z^Z‚Z¥ZÉZì[[3[V[y[œ[¿[â\\(\K\n\‘\³\Ö\ù]]>]`]‚]¥]Ç]é^ ^-^O^q^“^µ^×^ø__<_]__ _Â_ã``%`G`h`‰`ª`Ë`ëa a-aNanaa¯aÐaðbb1bQbqb‘b±bÑbñcc1cQcpcc¯cÏcîdd-dLdld‹dªdÉdèee%eDece‚e e¿eÝeüff8fVfuf“f±fÏfíg g(gFgdggŸg¼gÚg÷hh2hOhlh‰h¦hÃhàhüii6iRioi‹i¨iÄiàiýjj5jQjmj‰j¤jÀjÜjøkk/kJkekkœk·kÒkíll#l>lYltlŽl©lÃlÞlømm-mGmam{m•m¯mÉmãmýnn0nJncn|n–n¯nÈnánûoo,oEo^owoo¨oÁoÙoòp p"p:pSpkpƒp›p²pÊpâpúqq)q@qXqoq†qq´qËqâqùrr'r>rTrkrr˜r®rÄrÛrñsss3sIs_stsŠsŸsµsÊsàsõt t t5tJt_tttˆtt²tÆtÛtðuuu-uAuUuiu}u‘u¥u¸uÌuàuóvvv-vAvTvgvzvv v³vÆvØvëvþww"w5wGwYwkw}ww¡w³wÅw×wèwúx xx.x?xPxbxsx„x”x¥x¶xÇx×xèxøy yy)y9yJyZyjyyy‰y™y©y¸yÈy×yæyözzz#z2zAzPz_zmz|z‹z™z¨z¶zÄzÒzàzîzü{ {{&{3{A{O{\{i{w{„{‘{ž{«{¸{Å{Ò{Þ{ë{ø||||)|5|A|M|Y|e|q|}|ˆ|”|Ÿ|«|¶|Á|Í|Ø|ã|î|ù}}}}$}.}9}C}M}W}b}l}v}€}‰}“}}¦}°}¹}Ã}Ì}Õ}ß}è}ñ}ú~~ ~~~%~.~6~>~G~O~W~_~g~o~w~~~†~~•~œ~¤~«~²~¹~À~Ç~Î~Õ~Ü~â~é~ï~ö~ü !&,27=BHMRW\afkpty}‚†Š“—›Ÿ¢¦ª­±´¸»¾ÁÄÇÊÍÐÒÕØÚÜßáãåçéëìîðñóôõö÷øùúûüýýþþþÿÿÿš"8(  ò*ªd¦Š\bH&n2ª  R  > >. Z tt.. Z tA1_FAT FON[t uA2_DIGT2FON]t yA2_SQUATFONat |A2_ELEGAFONdt A1_ELEGAFONft ‚FONTISH it ‡¡8@<`22ñö` |||||||| (|`à```f >``22``220zzf[fö`|88þ0 |þîx8 º::‚¸¸ºººx Ø8îf>fl8~~f|8üüîþ~þ||ü88ü>øþþþî|þîàîþ|ü|ü~þîîîîîþ~`~p8ü>øþþþî|þîàîþ|ü|ü~þîîîîîþ0<î <Ö06|Ö~8~~~nþþ<8>>|`l|00xþ<88þÆ<@@ ÆÆÀÀÆÆÆ@(8îf~fl8~~f8þxþþîþþþþþàþ||þ~üþþþî|þîàþþþþþþþþîîîîîþ~`~88|þ~üþþþî|þîàþþþþþþþþîîîîîþ0~îfºffffº~øfºffºî8f<LL LL~þÊÆÆUfv|~~8~n<>~nþ6~n>~Ö~8~>~n6<~þ~l ~þpD|xH<$,4ºþÖfp@ ÆÆÀÀÆÆÆpÐ8îÿ`l88~~<8þøþþîþþþþþ88~ðþæþþþþþþþî|þîàþþþþþþþþîîîþîþ~`~8þþþþþþþî|þîàþþþþþþþþîîîþîþ0f||<~Ø||<0ff<<##fØ<<<Ê‚‚Qæfv  ff > þ6ff>Öf6ff2fbfb`~|fÆ0||àÆ~8>l|H0f$æg’ü’Ã< @@ °ÆÆÀÀÆÆÆ|@.8îÿ` 88p<8 îøîààîî88<~xÂîîðîàààî8îàþîîîîîà8îîî|îp0l îîðîàààî8îàþîîîîîà8îîî|î0bfî<<î<<<<<<888î~`vØ<î~&&<  f ff 6 Æ6f6Öf6fv÷öf`~08füÆBÆÖÖÀÆ~8|88H0Ã$ƒÁÖüº‘<@8 °‚::º¸¸‚ºº~x9à8îf|p8pÿþ~ î¸~þþààîþ88x~<Úîîàîþþîþ8üàþîîîîîü8îîþ|þp0lîîàîþþîþ8üàþîîîîîü8îîþ|þ88ò`î~>î>>|~~~888îf`Þ~î~fffîîf0~f>8~f~ff,,°>~n~ÿÞfffÊ¢ªff<  f fff Æ6v>öf6v><™Üf`ülf‚BÆ<’’ÀÆ~p~@H`HçƒÁÆø8‘<¸|||||||88îf>p8pÿþ~î8þþþüüþþð<Öîþàîþþîþ8øàþîîîîîþ8îîþ8þf6ØfnfÛÞfffÊ¢²ff<  f fff Æ6v6öf6vf8™ˆ|`¨ Æf0‚~Æf’’üÆ~~8~ÐHx0çægÖúºŒþ>>`fffþ~|{øfîffffîî`þf>fff~~f002ll>fvnÛØ~~fz¢ºffn 6 f fff Æ66Æf6f8ïˆf`( Æf0‚BlB’’üÆ~8>Ð$Ã,4’ò’Œ<øyžÆÀÆÆ~ø8ÿ6Þp<80î8à~þî<~xpÜþîàîààîî8þàþîîþîü8îîþ|8ðp þîàîààîî8þàþîîþîü8îîþ|8ð88f`î~~þ~~`~~~þ~`ÿøfîffffîîf0~f~fff~ff0~~nfØ6~fv~ßØ~~f ºªffn 6 f ff0n Æ6~6Æf60n|þ~~~6þæ>löf`(0Æf0ÆfªfÖÖÀÆ~`Ø@LÆb|`(`l |~î~||àÆ~Ø< <|îîp<a†º¸::ºº:~8þ~~88`þ8þþþþþþ88p~îþ~üþàþî|üîþîîþàúîþ8þ|þî8þ~~ÿîþ~üþàþî|üîþîîþàúîþ8þ|þî8þ0ÿ~þ~~î~~~~~~<<<îf~ÿÞ~þ~~~>þþl~<~~ff><~` 2°~~~~ÿþff~ ||öö0lÆl`þ8]øþàþî|øîþîî|à|îü8|8îî8þ~~ÿîü>øþàþî|øîþîî|à|îü8|8îî8þ0<|>>î>>>>>><<<îf~Þ<|<>>||ÿ`p><<>ff<`?><¼¼~ff< 08`ðþÀð>Æ~~~p <ppà ~@`~~€€<|0@€|àTàà88|8x<<ÿç~ðð |||Æ|||||xð8ffx8~p|>`?~~s f0gg~gggsg@xpf f0f0f`f ?f00ffff 44ÆÆØ44044f z~~ñfö``fþ< ><0 8888x<$8™ÿÃÃ<ÀÀ ÆÆÀÀÆÆ`ø (8fÿ>f6fcp`l6c ~0cc3fgf``cs f0wcccf`gggsgf`À`` 0 `<fff0xff:f60XX<<ÌÌ6lXX<ØXXÊÃÃ[ff|~|~n<>~l>6~f>xÖ|>þ~6÷6þf<<6pf~2l|ll þf$öoÃþ™Ó<þß ÆÆÀÀÆÆ 66ff Öl ff6<8™vffþ08l~60`c~c v333c3` 3ck<3 0 ž4`f<<<<`f>|66Ø<`wcw~osgcwppgs<gpgggpgwsgog7 cs`gcs |8ssscpscs 4ff~>`~~~ff|øffffffff`0`cw 0`sgcwppgsgggs`gp8sv8kssps6><0bff<0f0~fffn><`0 ÃÖ6l~fffØØfff ½­ööf~6 f 6~>n<~~~4 þì ~ <‚fÜf`lfll|@>0`sps<~g~ggpwggxÿ8ss8cspp6f~p~><>>>><<<<<><>~|`><<>fff0 †ŸØ><<<~~~f ÃÃ0  Øv|`lþ8f~~~p0<~`qŽT80~p8|`<<<@@ff< ~~p`øHÀ<`Digital 2<<ÿç~ðð |||Æ|||||xð|ll8808|8|þþ~þ||`8ü~øþþ~ö|>ÎàÆæ|ü|ü~þööîöîþøàÀ<<À|8pf f0f0f`f ?f00ffff 44ÆÆØ44044f z~~ñfö``fþ< ><0 8888x<$8™ÿÃÃ<ÀÀ ÆÆÀÀÆÆ`ø (|lþ~æl08f8îøÆÜààîî88 0<<|æàìàààö| ÜàîöîîîÎà|ööîöîà@À|ü|~|0~ÜÎ~l>6~f>xÖ|>þ~6÷6þf<<6pf~2l|ll þf$öoÃþ™Ó<þß ÆÆÀÀÆÆ 66ff Öl ff6<8™vffþ08l~f>|66Ø<`~~~ff|øffffffff`0f888`þþþþþþxþþ88 ~0`öþþüþðþö|üÞþîîþðüÞþ|þxîÞ|þø ~þþþþ8~Þ~<Þ<îÞþþþð~>þ|þþ~þbff<0f0~fffn><`0 ÃÖ6l~fffØØfff ½­ööf~6 f 6~>n<~~~4 þì ~ <‚fÜf`lfllöü~øþð~ö|xÞþîî|ðvÞü||0ÆÞ|þøÿ~ü~~~8Þ~<Þ~îÞ|ü~ð|~8lîþp~><>>>><<<<<><>~|`><<>fff0 †ŸØ><<<~~~f ÃÃ0  Øv|`lþ8f~~~p0<~`qŽT88pp|xà|8|`<<<@@ff< ~~p`øHÀ<`Squat font<<ÿç< ðp |||Æ|||||àV$$b08$888|<|88 8<|>ü~~>B|?B@‚B<|<|<|BB‚BD|<€<@@@p 02>f f0f0f0f >f00fffD8 42<<bb22=>022fz<<ñ"÷``fþ< ><88x~<$8™ÿÃB$€€ ÆÆÀÀÆÆ€þš$$<¤H D0DDDDHDDD"BBBB@@BBD@ÆbBBBBDBB‚BD @(@"@@ LB0f $f f <$0Hf f <"DD0000XLB$$HLLBH LL8ŠBB["f|~|~n<>~l>6~f>xÖ|>þ~6÷6þf<<6@B~ 2$<DDf$öoÃþ™‘$þœ ÆÆÀÀÆÆ|àVV$~@È0 ~LP(@@DD~FBB@B@@@BH@ªRBBBB BB‚$D D<|<>< >|pDü|<|>x>|BB’BB|@B<<<<<<<<<888B<~|H<<<BBBB< DÈ<8B(*$$<|H<<<Š¹Uî"v   6f > 66ff Öl ff6<(™vffþ08l~|HBJF’NBBBŠ¡¥Q""<  f 6f f 66v<6 Öl fvfD™Ü|blllf~fÜTÖ~B~~D0çÃÁÃù™Ø‘BTž| °ÆÀÆÆ~øö”~&” $ d|DD~DBB@B@@BBH@‚FB@RHBBª$ >B@B~ BBp’BBBB@< BB’B(@B~>>>>@~~~~~|~HBBBBBBBB@ B>BBBJ>< **$$>BRJžH~~Bz¡¹Q""n  f 6ff 666 Öl f f‚ïÈf`l0llfffÌTÖ@B2PD|x$föo™óÃp~8˜ÆÀÆÆB $xJˆ @D DDD DD BBBB@@BBDD@‚BB@JDDB$ÆB@ bB@B@ >BH’BBbF@"B$’$> DBB@BBBB@@@@BB@HBBBBB>BB< 8RBBBBF$ D_HBBbRHBBB ¥úúf~6 f 6~>n<~~~4 þì ~ <fÜf`lfll|<>> B|DD|’B<\:@|>|B| 0|<>>>>>><>>>>>>BB~~N<<<>><<~L>><>BB~~ ><|<~>BB< BB0  Øv|`lþ8B|<<`<<0`qŽZ8<8@||à€@ <<p`øHÀ<`Elegant` ||||||||€f800 ~ff0002f >ñ`|880 |þî` |8 º::‚¸¸ººº|`fl>–l8<<< ~>~<<<<|>ü~~>f~ffÆff~Àx<`` `8à>f 606f0f0$Øf00fff>f<0 0,pp00>~,Lf~z|Ö~8~~~nþþ<8>~|`D|0>~<88þÆ< `l ÆÆÀÀÆÆÆ`flfœl0 Z$ff ffffff~ffff``ff f`ÆffffffffÆffÀf `6` `00ff666~nþ6~n>~Ö~8~>~n6<~þ~l ÀÆ0 D|x&<$,4ºþÖB x` ÆÆÀÀÆÆÆxfþflh0 ~ f8ff``ff`fBffff``ff l`îffffffffÆff ``0``00f0 f f <<~Øf f þ6ff>Öf6ff2fbfb`~|fÆ0||ÀÆ~>D|H f$æg’ü’‘H`l °ÆÆÀÀÆÆÆ` flp80 < f `` ff ~0Bff`f```f l`îvffffpffÆ$f ``0``00`ff`Øff>`fìf6f66n=~ØfffÊ]Qf>  f ff 6 Æ6f6Öf6fv÷öf`~08füÆBÆÖÖÀÆ 0|88H&Ã$ƒÁÖüº•F8`8 °‚::º¸¸‚ºº||&dfl830 ~f ,|| ff ^ff`f```f x`þvffff8ffÖ><|>|8fþ|<|>n>~ffÛff~0``f<<<<<><<<888ff`~þ<<öf6v><™Üf`ülf‚BÆ<’’ÀÆþ`@H>çƒÁÆø8™Al¸|||||||I’l0{0 Zþ~f,ff$l6fvnÛÞfffʱUff<  f fff Æ6v6öf6vf<™ˆ|`¨ Æf0‚~Æf’’üÆ~ 0~HçægÖúºŒ‘Fj><9œ‚¸:::ºº:KÒþ0Ú0 0fLff>`~Zff`f``ff x`Önf|fxffþ<0f`ff0ff xÛffff`p0ffÛ$Ã,4’ò’Œ˜j06yžÆÀÆÆ~OòllÎ0 0f0þff0 ^ff`f``ff l`Ænf`flffî$0>f`f~0ff xÛffff`<0ffÛf0 ‚`f~>>>>`~~~ff`Øffffffff``~c>fffnff``nfØ>fvvßØfff >ffn 6 f ff0n Æ6~6Æf60n|þ~~~6þæ>Böf`(0Æf0ÆfªfÖÖÀÆ~`Ø@LÃb|`(`l |~î~||ÀÆØ<0<|îîp<h06a†º¸::ºº:<° |Ì{0 À<<~< <<0<<`f|<ü~`|<>>0>f< c<Ûf<|>`|>þf>~0<>>>>>><>>><<>><<þn><<>ff<` ?H><<¼~ff< <öö0ll`þ8]üÿþÿþÿþÿþÿþü€ÀÀÀÀ€8|üüüøðà?À€ÿþüøp?øüÿþÿþþþþþþþþþþþþþþþÿþÿþü?øÀ?àààà?ààààà?øüüü?øøÿüÿþÿþÿþþþüþÿüÿþÿþÿþÿþÿüüÿþÿþÿþþü?ø?øüþÿþÿþÿþÿþü||þþþþþþþþþþÿþÿþÿþþþþþþ|ÿüÿþÿþÿþÿþÿüþüþþÿþÿþÿþÿüø?üþÿþÿþÿþÿüþÿüþþÿþÿþÿþÿþü?øüÿþÿþÿþÿþþþüøðððððà?øüüüüü>øüþþÿþÿþÿþÿþü?ø?øüÿþÿþÿþÿþþþþþþÿþÿþÿþÿüøÀààààÀÀààààÀÀààààÀÀààààÀÀ€üÿþÿþÿþÿþÿþüüÿþÿþÿþÿþÿþüüÿþÿþÿþxþþüøàððððàà?øüüÿþþþþþÿþÿþÿþÿþÿþþþþþ||ÿÀÿðÿøÿøüøüøÿðÿøü|ü>ü~ÿþÿþÿþÿüð?üþþÿ~þ<þþþþ<ÿ~þþ?üðÿàÿøÿüÿüþþþ~þ~þ>þ>þ>þ~ÿþÿþÿþÿüüÿþÿþÿþÿüþÿøÿøþÿüÿþÿþÿþÿþüüÿþÿþÿþÿüÿÿøÿøÿÿÿÿÿÿ~ð?üþþþ<üüüýþýþüþþ~þþ?üð||þþþþþþþþþþÿþÿþþþþþþþþþþþþþ||?øüüü?øààààà?øüüü?øþþþþþþþþþþÿþÿüÿüÿøà~<ÿ~ÿþÿþÿþÿüÿøÿðÿøÿüÿþÿþÿþÿ~~<~ÿÿÿÿÿÿÿüÿþÿþÿþÿþÿþÿþüx<ü~þþÿþÿþÿþÿþû¾ù>ü~ü~þþþþþþ||x<ü~þ~ÿ~ÿþÿþÿþûþùþüþüþþþþþþþ||üÿþÿþÿþþþþþþþþþþþþþþþÿþÿþÿþüøÿüÿþÿþÿ~ÿþÿþÿüÿøÿÿÿÿÿ~üÿþÿþÿþüþüþüþü~ü¾üÞüîûöýúþü~øÿüÿþÿþÿ~ÿþÿþÿüÿøÿ|ÿ~ÿ~ÿ~ÿ~~<?üþÿþÿþÿþÿüþüþþÿþÿþÿþÿüøüÿþÿþÿþÿþÿþÿþüààààààÀ||þþþþþþþþþþþþþþþþþþÿþÿþÿþü?ø||þþþþþþþþþþþþþþþþþþü?øðàÀ||þþþþþþü~ü~ù>û¾ÿþÿþÿþÿþþþü~x<x<ü~þþÿþÿþü?øð?øüÿþÿþþþü~x<x<ü~þþÿþÿþü?øðààààààÀüÿþÿþÿþÿþüøð?àüÿþÿþÿþÿþü. l t‰.. l tSOUNDS S mt Š¨MACROS S pt ²tINCLUDE1S tt ­§INCLUDE2S yt ͉.INCLUDE3S |t ÙmINCLUDE4S t áPINCLUDE5S „t é 1INCLUDE6S ‡t ö’Qsoundlist dc.b 00,26,30,26,22,32,30,36,60,42,44,42,22,22 dc.b 32,34,28,26,34,22,52,34,32,32,38,32,34 dc.b 30,30,30,98 (98 end) even soundoffset dc.w 0,26,56,82,104,136,166,202,262,304,348,390,412,434 dc.w 466,500,528,554,588,610,662,696,728,760,798,830,864 dc.w 894,924,954 snd0 DC.B 2,216 \laser medium pitch, med/long repeat DC.B 3,4,4,219,5,5,7,254,8,16,11,223,12,118 DC.B 13,0,128,0,129,0,22,0,255,0 EVEN snd1 DC.B 0,140 \laser, low pitch long DC.B 1,1,2,216,3,4,4,219,5,5,7,254,8,16 DC.B 11,207,12,88,13,0,128,0,129,0,41,0,255,0 EVEN snd2 DC.B 2,216 \same but slower/wavy DC.B 3,4,4,219,5,5,7,254,8,16,11,223,12,118 DC.B 13,0,128,0,129,0,22,0,255,0 EVEN snd3 DC.B 0,0 \electronic high pitch same as 0 DC.B 1,0,7,254,8,16,11,207,12,88,13,0,128,0 DC.B 129,0,41,0,255,0 EVEN snd4 DC.B 0,82 \winding sound DC.B 1,2,2,251,3,13,4,34,5,0,7,248,8,16 DC.B 11,0,12,86,13,0,128,0,129,0,11,0,130,0,255,0 EVEN snd5 DC.B 0,210 \C note low octave long Damonoid DC.B 1,3,2,232,3,3,4,209,5,7,7,248,8,16 DC.B 9,16,10,16,11,111,12,163,13,0,128,0,255,0 EVEN snd6 DC.B 0,$34 channel A DC.B 1,0 2150 hz \bell DC.B 2,0 channel DC.B 3,0 B DC.B 4,0 channel DC.B 5,0 C DC.B 6,0 NOISE DC.B 7,$FE enable A only ($fe = 254) DC.B 8,$10 enable A envelope DC.B 9,0 B off DC.B 10,0 C off DC.B 11,0 single attack... DC.B 12,$10 ...envelope DC.B 13,9 ...shape 1001 DC.B 130,100 delay DC.B 7,255,8,0,255,0 switch off? Not sure. EVEN snd7 DC.B 0,$FE \ambulance long DC.B 1,0,2,0,3,0,4,0,5,0,6,0 DC.B 7,$FE,8,11,9,0,10,0,11,0,12,0 DC.B 13,0,130,20 DC.B 0,$56,1,1,130,20 DC.B 0,$FE,1,0,130,20 DC.B 0,$56,1,1,130,20 DC.B 8,0,9,0,130,50 DC.B 7,255,8,0,255,0 EVEN snd8 DC.B 0,0 \gun fire DC.B 1,0,2,0,3,0,4,0,5,0,6,15 DC.B 7,199,8,16,9,16,10,16,11,0,12,16 DC.B 13,0,130,25 DC.B 8,0,9,0,130,50 DC.B 7,255,8,0,255,0 EVEN snd9 DC.B 0,2 \muffled gun fire (longer duration) DC.B 1,15,2,2,3,15,4,0,5,0,6,10 DC.B 7,199,8,16,9,16,10,16,11,0,12,80 DC.B 13,0,130,20 DC.B 8,0,9,0,10,0,13,100 DC.B 7,255,8,0,255,0 EVEN snd10 DC.B 0,0 \high pitch fire DC.B 1,0,2,0,3,0,4,0,5,0,6,0 DC.B 7,254,8,15,9,0,10,0,11,0,12,0 DC.B 13,0,128,60,129,0,-2,40,130,2 DC.B 7,255,8,0,255,0 snd11 DC.B 0,$40,1,1,2,$38,3,1,8,16,9,16,12,20,13,0,11,20 DC.B 7,%11111100,$FF,0 ;PEARL CAUGHT 22 snd12 DC.B 0,$40,1,0,2,$78,3,0,8,16,9,16,12,20,13,0,11,20 DC.B 7,%11111100,$FF,0 ;ICON SELECTED 22 snd13 DC.B 0,$56,1,0,2,$56,3,0,8,16,9,15,12,1 DC.B 13,10,11,50,7,%11111100,$80,16,$81,9,-1,0 DC.B $FF,0,8,0,$FF,0 ;brikhit 32 snd14 DC.B 0,2,1,15,2,2,3,15,8,16,9,16,12,20,13,10 DC.B 11,20,7,%11111100 DC.B $80,240,$81,1,-16,0,$FF,10,8,0,9,0,$FF,0 ;BOUNCE snd15 DC.B 0,2,1,0,2,2,3,16,8,13,9,13,7,%11110100 DC.B $80,15,$81,6,-1,0,$FF,5,8,5,9,5,$FF,0 ;ZAP snd16 DC.B 0,0,1,15,8,15,12,0,13,4,11,20,7,%11111110 DC.B $80,0,$81,1,1,15,$FF,1,8,0,$FF,0 ;FIRE snd17 DC.B 0,8,1,2,2,12,3,4,8,16,9,16,12,20,13,9 DC.B 11,20,7,%11111100 DC.B $80,200,$81,0,-20,0,$FF,1,8,0,9,0,$FF,0 ;BOUNCE snd18 DC.B 0,0,1,0,8,16,12,70,13,0,11,20,7,%11111110 DC.B $80,0,$81,1,1,255,$FF,0 ;DEAD snd19 DC.B 0,100,1,4,2,101,3,4,8,15,9,15 DC.B 11,0,12,30,7,%11111100 DC.B $FF,5,1,3,3,3,$FF,5,1,2,3,2,$FF,5,1,1,3,1 DC.B $FF,5,1,0,3,0 DC.B $FF,5,13,0,8,16,9,16,$FF,0 ;XTRA snd20 DC.B 0,8,1,2,8,16,12,25,13,9,11,20,7,%11111110 DC.B $80,0,$81,1,1,15,$80,0,$81,1,1,15,$FF,50 DC.B 8,0,9,0,$FF,0 ;BADHIT snd21 DC.B 0,32,1,0,2,80,3,0,8,15,9,16,12,1 DC.B 13,10,11,100,7,%11111100,$80,16,$81,8,-1,0 DC.B $FF,12,9,0,$FF,0 snd22 DC.B 0,20,1,0,2,48,3,0,8,15,9,16,12,1 DC.B 13,10,11,50,7,%11111100,$80,16,$81,8,-1,0 DC.B $FF,10,9,0,$FF,0 ; FACEHIT 32 snd23 DC.B 0,27,1,0,2,48,3,0,8,16,9,16,12,10 DC.B 13,10,11,0,6,30,7,%11111100,$FF,40 DC.B $80,15,$81,8,-1,0,7,%11110100 DC.B $FF,10,9,0,$FF,0 ; FADER 38 snd24 DC.B 0,100,1,5,2,80,3,1,8,15,11,0,12,70,7,%11110110 DC.B $80,0,$81,6,1,31,$FF,3,12,40,13,0,8,16,$FF,0 (32) snd25 DC.B 0,100,1,5,2,80,3,1,8,15,11,0,12,70,7,%11110110 DC.B $80,31,$81,6,-1,0,$FF,3,12,40,13,0,8,16,$FF,0 (34) snd26 dc.b 0,0,1,13,2,0,3,12,4,0,5,15,6,0 rock dc.b 7,$C0,8,16,9,16,10,16,11,0,12,44 dc.b 13,2,130,160 (30) snd27 dc.b 0,0,1,13,2,0,3,12,4,0,5,15,6,0 ship dc.b 7,$F8,8,16,9,16,10,16,11,200,12,200 dc.b 13,2,130,250 (30) snd28 dc.b 3,3,3,%100000,16 dc.b 5,0,64,0 dc.b 4,101 dc.b 4,91 dc.b 4,81 dc.b 4,71 dc.b 4,61 dc.b 4,51 dc.b 4,41 dc.b 4,31 dc.b 4,21 dc.b 4,11 dc.b 255 (s0) silence DC.B 7,%00111111,0,255,0 neutral DC.B 0,254,1,0,2,0,3,0,4,0,5,0,6,0,7,254,8,14 DC.B 9,0,10,0,11,0,12,0,13,0,130,20,8,0,130,0,255,0 EVEN * B U D G I E U K December 13, 1989 *-----------MACROS--- (79) ------------------------------------------- * load font mode show vsync * getkey waitkey print printat printatt * home ink pen border rawconio * inkey replay bindec * mfree take take_two sprite restore * sprit restor draw save back * on off flash grabr * grab grab_two blank block blockk * pixelread pixelreadd pixelplot pixelplott startup * cursor clear cls wait sound * scroll palette copyscreen copybytes copywords * copylongs reserve readd writee * open create read write close * bios xbios gemdos string pushi * show_mouse hide_mouse before after getjoy * joystick jiffy delay reveall reveal * acia key silence * The vast majority of these macros need the Budgie UK * include.s files to work. Some also need the Budgie shell.s itself * Values are normally immediate (ex: pixelplot $44e,20,20,8) * Sometimes registers are expected. Such macros usually have * their LAST letter repeated : (ex:pixelplott $44e,d5,d6,d4) * anybody sending new routines or macros, or reporting bugs * will receive the latest version + our thanks load macro \1,\2 move.l #\1,a0 say move.l #file,a0 move.l #\2,a6 say move.l #file_ptr,a6 jsr bload say bsr bload endm * ex : load file,file_ptr (# not necessary in this case), where.. * file dc.b "apic.pi1",0 * file_ptr dc.l 0 * file_ptr will contain the start address given by gem * no need to reserve memory. the routine will do it *-------------------------- * fonts must be loaded in advance. * ex: load font_1,a1_ptr load font_2,a2_ptr * a1_ptr holds 8*16 fonts (4114 bytes) a2_ptr holds 8*8 (2066 bytes) * font format is the one used by Jeremy Hughes in his fontsel.acc * now font macro may be used. Ex: font 16 (will call large font) font macro \1 move.w #\1,d6 dc.w $a000 initialize A-line move.l a0,a_line_start move.l (a1)+,d0 6*6 font move.l (a1)+,fontaddress_8 move.l (a1),fontaddress_16 cmp.w #8,d6 beq fnt\@ move.l a1_ptr,a1 jsr fnt_16 bra done\@ fnt\@ move.l a2_ptr,a1 jsr fnt_8 done\@ nop endm * will switch to user font, either 8*8 or 8*16 * ex: font 8 (will switch to 8*8 font held in a2_ptr) * font 16 (will switch to 8*16 font held in a1_ptr) * see full example in ALL Budgie games, shell, guardian etc... *--------------------- mode macro \1 move.l #\1,d0 cmp.l #1,d0 beq med\@ tst.l d0 beq low\@ bra v\@ if not 0 or 1, ignore low\@ jsr setlowrez bra v\@ med\@ jsr setmedrez v\@ vsync endm * ex: mode 0 (set low res) *------------------------- show macro \1 move.l \1,$45e jsr vtsync endm * will show a particular screen, or anything else in memory * at the next vertical blank * ex show physbase, show screen_0, show $44e+512 * show work_screen, etc... *--------------------- vsync macro move.l $466,d0 waitv\@ cmp.l $466,d0 beq waitv\@ endm * will wait for vertical blank * ex vsync * note: D0 will obviously be corrupted. (save if necessary) * can be used as a time delay * ex: vsync vsync vsync will delay things 3/50th of sec *--------------------------- getkey macro movem.l d1-d2/a0-a2,-(sp) move.w #$07,-(sp) trap #1 addq.l #2,sp andi.w #$df,d0 force upper case movem.l (sp)+,d1-d2/a0-a2 endm * waits for a key to be hit (unlike rawconio/inkey which doesn't wait) * the answer is a byte returned in D0 (ascii) * to get the scan value: swap d0 * see examples in shell.s etc... *---------------------- waitkey macro movem.l d1-d2/a0-a2,-(sp) move.w #$07,-(sp) trap #1 addq.l #2,sp andi.w #$df,d0 movem.l (sp)+,d1-d2/a0-a2 endm * same as getkey *------------- print macro \1 move.l #\1,a0 jsr printline endm * ex: print message * message dc.b "hello",10,13,0 * prints a string at CURRENT cursor position * if unsure as to where cursor is, use: home print message * alternatively, use the more precise 'printat' *----------------------------- home macro \1 move.l #pr_home,a0 jsr printline endm * cursor back to home position * ex: home pr_home dc.b 27,"H",0 even *------------------------ printat macro \1,\2,\3,\4 move.b #\1,pr_col+2 the ink move.b #\2,d1 add.b #32,d1 move.b d1,pr_loc+2 the row move.b #\3,d2 add.b #32,d2 move.b d2,pr_loc+3 the column move.l \4,a0 move.l a0,-(sp) move.l #pr_col,a0 jsr printline print ink and pos move.l (sp)+,a0 retrieve the address of message jsr printline print it endm pr_col dc.b 27,"b",15 no zero here! ,0 pr_loc dc.b 27,"Y",32,32,0,0 dynamic variables, liable to change! null dc.b 0 even * ex: printat 12,2,8,#message+4 where * 12 is the ink (0-15), 2 is row (0-23), 8 is column (0-39) * and last parameter, with a hash, is an address * (the message itself which is terminated with a null) * note registers will be corrupted by printline *---------------------------------------------- printatt macro \1,\2,\3 move.b \1,pr_col+2 the ink move.b \2,d1 add.b #32,d1 move.b d1,pr_loc+2 the row move.b \3,d2 add.b #32,d2 move.b d2,pr_loc+3 the column move.l a0,-(sp) save from corruption move.l #pr_col,a0 jsr printline print ink and pos move.l (sp)+,a0 retrieve the address of message jsr printline print it endm * similar to previous macro except that registers are used: * \1 \2 \3 are data regs (byte size) address is assumed to be a0 * ex: bindec d0 (go change value in d0 into a string) * move.b #1,d0 (ink) * move.b #3,d1 (4th row) * move.b #0,d2 (first column) * printatt d0,d1,d2 (being understood as string at a0) *------------------------ ink macro \1 move.b #\1,pr_ink+2 the ink lea pr_ink,a0 jsr printline print it home necessary to activate it endm * ex: ink 4 (0-15) will take the color in palette #4 * and print with it from now on pr_ink dc.b 27,"b",15,0 even *------------ pen macro \1 move.w #\1,$ff825e ink 15 endm border macro \1 move.w #\1,$ff8240 endm * ex: pen $777 (white) * ex: border $700 (red) * ex: show screen_0 pen $700 home string * will print hello in red on screen zero * note palette #15 ($ff825e) will become red * ink uses one of the 16 colors, pen uses ANY shade in color 15 *---------------------------- rawconio macro move.w #$ff,-(sp) move.w #6,-(sp) trap #1 addq.l #4,sp endm * checks whether a key has been hit (answer in D0) * if D0 is zero, no key: continue with program * ex: rawconio tst.b d0 ... to get scan code: swap d0 inkey macro move.w #$ff,-(sp) move.w #6,-(sp) trap #1 addq.l #4,sp endm * same as above * ex: inkey swap d0 cmp.b #1,d0 beq escape *------------------------------ * make sure include5.s is included before calling this macro replay macro \1,\2,\3 move.l \1,a5 move.l #\2,d5 move.l #\3,d4 jsr r_eplay endm * replays a sample at a certain location, at a certain speed * ex replay drum_ptr,7448,2 * (sample address held in drum_ptr,7448 bytes,speed 2 *----------------------------- * next macro displays any Long Word in 2, 10 or 16 bindec macro \1,\2 movem.l d0-d7/a1-a6,-(sp) move.l \1,d0 the number to convert (L) move.l #\2,d1 the base: 2, 10, or 16 bsr printn move.l #\2,d0 base again cmp.l #2,d0 binary beq base2\@ cmp.l #10,d0 decimal beq base10\@ move.l #num_buff+4,a0 hex bra done\@ base2\@ move.l #num_buff+4,a0 binary bra done\@ base10\@ move.l #num_buff+4,a0 decimal done\@ movem.l (sp)+,d0-d7/a1-a6 endm * ex: bindec d0,16 reveals in hex what is in d0 * then to actually see the number, use printat c,x,y,a0 * where c is color, x-y is cursor position, a0 is the result * note. the printed result will take 16 characters no less, like this: * 4509 * f8000 * 1111000011110000 * to ignore leading spaces: add.l #x,a0 * ex: expected answer is 4509 (0000000000004509) * to get it left justified: bindec d0,10 add.l #12,a0 printat 1,0,0,a0 * in this case, the first 12 blank spaces will be ignored *---------------------------------------------------------------- * next one not tested yet mfree macro \1 move.l \1,-(sp) address in handle onto stack move.w #$49,-(sp) trap #1 addq.l #6,sp tst.l d0 bmi error\@ bra ok\@ error\@ string < MFREE ERROR > ok\@ nop endm * frees an area of memory (tune, picture..) no longer needed * ex: mfree welcome_ptr * same as: move.l #welcome_ptr,a6: bsr m_free * ex: reserve 160 mfree d0 * the above line reserved 160 bytes then immediately gave it back *------------ take macro \1,\2,\3,\4,\5,\6 move.l \1,a0 origin screen move.l \2,a1 dest screen move.w #\3,d0 origin 0 to 32000 move.w #\4,d1 to screen 0 to 32000 move.w #\5,d2 height 1 to 200 move.w #\6,d3 width 1 to 160 jsr fromto endm * this is a VERY important macro for graphic movement * origin and destination screens are first specified, them * origin & destination locations (0-32000) in multiples of 8, * and finally the height (1-200) and width of the block (8-160) * ex: take spr_screen,buffer_screen,504,504,60,48 o-d-o-d-h-w * use take_two if screen swapping is used * or use this command TWICE, once for each screen * NOTE both Final Lap and Moneyspinner use take * Speculator uses an old macro (graber) *------------------------------------ take_two macro \1,\2,\3,\4,\5 screen+34 expected in A0 move.l \1,a0 origin screen move.w #\2,d0 origin on Degas 0 to 32000 move.w #\3,d1 to screen 0 to 32000 move.w #\4,d2 height 1 to 200 move.w #\5,d3 width 1 to 160 bsr from_two draw on both screens at once endm * used to draw a sprite on two screens at once i.e. TWICE * origin screen needed in a0, destination both logical_screen * AND physical_screen * ex: take_two spr_screen,0,16000,50,48 * use take if only one screen is active *-------------------------------------- * now grab (same as take, BUT registers are used) grab macro \1,\2,\3,\4,\5,\6 move.l \1,a0 origin screen move.l \2,a1 dest screen move.w d6,d0 origin 0 to 32000 move.w d7,d1 to screen 0 to 32000 move.w #\5,d2 height 1 to 200 move.w #\6,d3 width 1 to 160 jsr fromto endm * uses two registers d6 and d7 to indicate the locations * ex: grab spr_screen,current_screen,d6,d7,60,48 * move from sprite screen to current screen, an object at d6, * to destination d7, size 60*48 (d6 & d7 are 0-32000) *----------------------------------------------------- * now grab_two (registers are still used but we print on TWO screens) grab_two macro \1,\2,\3,\4,\5 move.l \1,a0 origin screen move.w d6,d0 origin 0 to 32000 move.w d7,d1 to screen 0 to 32000 move.w #\4,d2 height 1 to 200 move.w #\5,d3 width 1 to 160 jsr from_two endm * uses two registers d6 and d7 to indicate the locations * ex: grab_two spr_screen,d6,d7,60,48 * move from sprite screen to both screens, an object at d6, * to destination d7, size 60*48 (d6 & d7 are 0-32000) *------------------------------------------ sprite macro \1 move.l #\1,d0 move.l spr_screen,a0 default origin move.l logical_screen,a1 default destination jsr draw_sprite endm * ex: sprite 0 (go and draw sprite 0) * sprite 5 (go and draw sprite 5) * a sprite parameter-block must have been defined first * it is held in an array called 'sprites' * a typical sprite system would be: * jsr initialize_sprite_0, then, every v/blank: * jsr coord_sprite_0 restore 0 sprite 0 * read 'sprites' in shell.s to see what a parameter block is restore macro \1 move.l #\1,d0 move.l back_screen,a0 default origin move.l logical_screen,a1 default destination jsr rest_sprite endm * see above. restore always comes before actual draw. * see example in shell.s on macro \1 move.l #\1,d0 lsl.l #5,d0 mult by 32 lea sprites,a6 add.l d0,a6 right sprite slot move.b #1,29(a6) turn it on endm off macro \1 move.l #\1,d0 lsl.l #5,d0 mult by 32 lea sprites,a6 add.l d0,a6 right sprite slot clr.b 29(a6) turn it off endm * ex: on 3 (turn fourth sprite on) * ex: off 0 (turn first sprite off) (joystick sprite off) *----------------------- flash macro \2 move.w #\1,d7 loop: number of flashes sub.w #1,d7 fl\@ not $ff8240 wait \2 delay inside flash not $ff8240 wait \2 dbra d7,fl\@ endm * ex: flash 2,5 2 flashes each lasting 5 vb's * or flash 1,10 1 longer flash * flash 0,0 will result in a bomb (nonsense) *-------------------------------------------------- * with the next macros, origin AND destination to be specified in a0-a1 sprit macro \3 move.l #\1,d0 move.l \2,a0 origin move.l \3,a1 destination jsr draw_sprite endm spritt macro \3 move.l \2,a0 sprite # expected in d0 (L) move.l \3,a1 destination jsr draw_sprite endm restor macro \3 move.l #\1,d0 move.l \2,a0 origin move.l \3,a1 destination jsr rest_sprite endm * * ex: sprit 2,screen_2,image_pointer * means sprite 2 will be pulled from screen_2, and drawn * not on logical_screen as usual, but on image_pointer * or anywhere in memory. * sprite parameters are still found in the usual place (in sprites array) * ex: restor 2,buffer_screen,image_pointer * this is still under development *----------------------------------------- * Another set still under development is back,save,draw * these are fairly slow, but easy and logical ways of displaying sprites: * first way for vsync, then back, then save, then draw * sprites are once again defined in the usual array * in this case, because background is SAVED as found, rather than * replaced as assumed, a buffer is required for storing it. * see example in shell.s draw macro \3 move.l #\1,d0 move.l \2,a0 origin move.l \3,a1 destination jsr draw_sprite endm save macro \3 move.l #\1,d0 move.l \2,a0 origin move.l #\3,a1 destination a definite buffer jsr save_sprite endm back macro \2 move.l #\1,d0 move.l #\2,a0 origin (a buffer) jsr back_sprite endm *------------------------ blank macro \1,\2,\3,\4\,5 blank part of current screen move.l \1,a1 destination screen move.l #\2,d0 color 0 to 15 move.w #\3,d1 screen 0 to 32000 move.w #\4,d2 height 1 to 200 move.w #\5,d3 width 16 to 320 (in 16's) jsr blanken endm * ex blank $44e,12,16000,50,320 * a block 50*320 will be drawn at location 16000, in color 12 * color 0-15/location 0-32000 (mult of 8)/height 1-200/width 16-320 (16's) *----------------- * next one very similar to take except that the block being drawn * is fully ored with the background. * It is therefore slower, but blends better * another difference is the use of chunks to indicate the width * (1 chunk = 16 pixels) this is to be compatible with Lawson's ideas block macro \1,\2,\3,\4,\5,\6 move.l \1,a0 origin screen move.l \2,a1 dest screen add.l #\3,a0 precise location (16 boundary) add.lw #\4,a1 precise location (16 boundary) move.w #\5,d6 chunks (1 to 20) move.w #\6,d7 height (1 to 200 usually) jsr or_block fully ored with destination endm * ex: block screen_1,$44e,16080,960,3,11 * from screen_1 to current, a block 3 chunks wide, 11 lines deep * arguments 3 and 4 must be multiples of 8 (16 boundary) *---------------------------------- blockk macro \1,\2,\3,\4,\5,\6 move.l \1,a0 origin screen move.l \2,a1 dest screen add.l \3,a0 precise location (16 boundary) add.l \4,a1 precise location (16 boundary) move.w \5,d6 chunks (1 to 20) move.w \6,d7 height (1 to 200 usually) jsr or_block fully ored with destination endm * same as previous, except that registers are expected * ex: blockk screen_1,$44e,d0,d1,d2,d3 * again arguments 3 and 4 must be multiples of 8 *------------------- * next one will plot a pixel anywhere, in any color * takes 1 h/b to execute. Use sparringly. pixelplot macro \1,\2,\3,\4 move.l \1,a0 the screen required move.w #\2,d0 x position (horizontal) 0-320 move.w #\3,d1 y position (vertical) 0-200 move.w #\4,d2 color (0-15) jsr piplot endm * ex pixelplot $44e,7,100,1 current screen,x pos 7,y line 100,color 1 *----------------------- pixelplott macro \1,\2,\3,\4 move.l \1,a0 the screen required move.w \2,d0 x position (horizontal) 0-320 move.w \3,d1 y position (vertical) 0-200 move.w \4,d2 color (0-15) jsr piplot endm * last letter 't' is repeated. Therefore this macro reads * registers rather than immediate values. * the registers are not fool-checked. Therefore, attention must * be paid not to put 350 for instance in argument 2 or a negative value... * ex pixelplott $44e,d5,d6,d2 current screen,x pos,y pos,color *------------------------------------------------------------ * next one is ideal with collision detections * takes about 1 h/b to execute, ie fast enough, but not to be abused pixelread macro \1,\2,\3 move.l \1,a0 the screen required move.w #\2,d0 x position (horizontal) 0-320 move.w #\3,d1 y position (vertical) 0-200 jsr piread endm * ex pixelread $44e,7,100 current screen, horiz 7, vert 100 * answer will be returned in d2 (w: 0-15) *---------------------- pixelreadd macro \1,\2,\3 move.l \1,a0 the screen required move.w \2,d0 x position (horizontal) 0-320 move.w \3,d1 y position (vertical) 0-200 jsr piread endm * ex pixelreadd $44e,d5,d6 current screen, x,y * answer will be returned in d2 (w: 0-15) *------------------------- startup macro movea.l a7,a5 save stack pointer move.l #stack,a7 set up local stack movea.l 4(a5),a5 standard start up procedure move.l 12(a5),d0 add.l 20(a5),d0 add.l 28(a5),d0 addi.l #256,d0 move.l d0,-(a7) move.l a5,-(a7) clr.w -(a7) move.l d0,proglength move.w #$4a,-(a7) trap #1 lea 12(a7),a7 endm * used at the very begining of a program * (give back to gem all unwanted memory) *--------------------------------------- cursor macro \1 move.w #\1,-(a7) 0=off 1=on 2=flash 3=steady move.w #21,-(a7) trap #14 addq.l #4,a7 endm * ex: cursor 0 cursor off *----------------------------------- * this one clears a particular screen (very quickly!) * all registers smashed! Save if necessary. clear macro \1 move.l \1,a0 add.l #$7d00,a0 ; end of screen moveq.l #0,d0 move.l d0,d1 move.l d1,d2 move.l d2,d3 move.l d3,d4 move.l d4,d5 move.l d5,d6 move.l d6,a1 move.l a1,a2 move.l a2,a3 move.l a3,a4 move.l a4,a5 move.l a5,a6 moveq.w #15-1,d7 loop clr\@ movem.l d0-d6/a1-a6,-(a0) each line clears 52 bytes movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) movem.l d0-d6/a1-a6,-(a0) dbf d7,clr\@ 41*52*15=31980 movem.l d0-d4,-(a0) add 20=32000 endm * ex: clear screen_0 or clear $44E *----------------------------------- * this one clears current screen only * (but not as quickly) * to clear current screen QUICKLY, type clear $44e cls macro movem.l d0-d1/a0,-(sp) move.l $44e,a0 move.w #8000/4-1,d0 moveq #0,d1 erase\@ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ dbra d0,erase\@ movem.l (sp)+,d0-d1/a0 endm * ex: cls (ie clear current screen) *------------ delay macro \1 move.w #\1,d5 jsr delay endm * ex: delay 8 (waits about 1/2 sec) previously known as 'wait' *-------------------------- wait macro \1 movem.l d5-d6,-(sp) move.w #\1,d6 loop\@ move.l $466,d5 same\@ cmp.l $466,d5 beq same\@ dbra d6,loop\@ movem.l (sp)+,d5-d6 endm * ex: wait 50 (wait 1 second, if in 50hz) *------------------------ jiffy macro \1 move.l d5,-(sp) move.w #\1,d5 waitj\@ nop waste 4 cycles nop nop nop nop dbra d5,waitj\@ another 10 cycles move.l (sp)+,d5 endm * ex: jiffy 1000 (waits 1000*30 cycles) (1/5th of vb) * ex jiffy 10000 (waits 2 v/b) (1/25th sec) * alternatively, vsync vsync would do the same * to wait 1/50th sec, just use 'vsync' or 'wait 1' *---------------------------- sound macro \1 lea \1,a0 jsr dosound endm * ex sound snd8 * snd8 dc.b 0,1,0,4,0,8,etc.. *-------------------------- * will scroll a block on itself, x amount of times scroll macro \1,\2,\3,\4 move.w #\1,d2 # of times move.w #\2,d3 width move.w #\3,d4 bottom left pos + margin move.w #\4,d5 the height jsr scrol endm * ex: scroll 64,64,10303,64 * see example in shell.s where the Budgie logo is scrolled *------------------ palette macro 1 move.l d6,-(sp) lea \1,a0 move.l #$ff8240,a1 move.w #15,d6 d6 will be corrupted palt\@ move.w (a0)+,(a1)+ dbra d6,palt\@ move.l (sp)+,d6 endm * will display a palette * ex: palette palet * or palette screen-32 * to save current palette: jsr save_pal * palette will be stored in a buffer called 'palet' *------------------ * next macro copies a 32k screen from one place to another * for ultimate speed, use movem.l technique as described * in 'clear' macro or in shell's vertical scroll. copyscreen macro 1,2 ;very useful one move.l \1,a0 move.l \2,a1 move.l #8000/4-1,d0 csc\@ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ dbra d0,csc\@ endm * will copy one screen to another * ex copyscreen screen_0,screen_1 * or copyscreen $44e,screen_1 * or copyscreen $44e,a1 (use a0 as origin, a1 as dest) * *---------------------------- copybytes macro 1,2,3 move.l \1,a0 move.l \2,a1 move.l #\3,d0 this # precludes the use of registers copyb\@ move.b (a0)+,(a1)+ when calling ( must be an actual dbra d0,copyb\@ number like 32000..) endm * ex: copybytes spr_screen,$44e,16000 copies half a screen * or copybytes #palette,a4,34 from palette to wherever * note use of # if actual address, but not if pointer (indirect) *---------------------------- copywords macro 1,2,3 move.l \1,a0 move.l \2,a1 move.l #\3,d0 copyw\@ move.w (a0)+,(a1)+ dbra d0,copyw\@ endm *---------------------------- copylongs macro 1,2,3 move.l \1,a0 move.l \2,a1 move.l #\3,d0 copyl\@ move.l (a0)+,(a1)+ dbra d0,copyl\@ endm *--------------------- reserve macro 1 ex: reserve 32100 move.l #\1,d0 jsr res_mem endm * ex: reserve 32000 move.l d0,buffer_start open file * read buffer_start,29000 close * buffer_start dc.l 0 * file dc.b "jenny.pi1",0 *---------------- * with open, an error check should be made tst.w d0 bmi exit open macro 1 lea.l \1,a0 jsr openfile endm *----------- create macro 1 lea.l \1,a0 jsr f_create endm *----------- read macro 1,2 move.l \1,a0 move.l #\2,d0 jsr readfile endm * ex: open jenny tst.w d0 bmi exit * read #palete,34 read $44e,32000 close * jenny dc.b "jenny.pi1",0 * palete ds.w 17 * again note the use of # when appropriate * next, same with bytes in a register readd macro 1,2 move.l \1,a0 move.l \2,d0 jsr readfile endm *------------------ write macro 1,2 move.l \1,a0 move.l #\2,d0 jsr writefile endm * ex: create fred write #palete,34 write physbase,24000 close * fred dc.b "dump.pic",0 * palete ds.w 17 * physbase dc.l 0 * more details & examples on Include #7, and Final Lap * see how high scores are read and written in Final Lap * nexT, same with bytes in a register writee macro 1,2 move.l \1,a0 move.l \2,d0 jsr writefile endm *------------ close macro jsr closefile endm *------------ bios macro \1,\2 move.w #\1,-(sp) trap #13 addq.l #\2,sp endm xbios macro \1,\2 move.w #\1,-(sp) trap #14 add.l #\2,sp endm gemdos macro Call number, stack reset pushi.w \1 trap #1 ifgt \2-8 lea \2(sp),sp elseif addq.l #\2,sp endc endm *----------- * the next macros are all related [Booker 1988] String macro String to print. Cconwsi string\@ BRA.S dstring\@ string\@ DC.B '\1',13,10,0 dstring\@ EVEN ENDM pushi MACRO Immediate data. IFEQ \1 CLR.\0 -(SP) ELSEIF MOVE.\0 #\1,-(SP) ENDC ENDM Cconwsi MACRO string addr PEA \1 gemdos 9,6 C_CONWS,6 ENDM *ex : string will print hello at current cursor position *-------------- show_mouse macro dc.a $a000 initialize movea.l 4(A0),A1 Crlin. CLR.W 2(A1) MOVE.W #1,6(A1) movea.l 8(A0),A0 Ptsin. CLR.W (A0) DC.W $A009 ENDM hide_mouse macro dc.w $a000 movea.l 8(A0),A0 CLR.W (A0) DC.W $A00A ENDM make_mouse macro dc.w $a000 movea.l 8(A0),A0 Intin. LEA 6(A0),A0 move.l #1,(A0)+ Pen colour=1,mask colour=0. MOVEQ #8-1,D0 LEA \1,A1 a\@ move.l (A1)+,(A0)+ move.l (A1)+,(A0)+ DBRA D0,a\@ DC.W $A00B ENDM *------------ grabr macro \1,\2,\3,\4,\5,\6 move.l \1,a0 origin screen move.l \2,a1 dest screen move.l d6,d0 origin 0 to 32000 move.l d7,d1 to screen 0 to 32000 sub.w #1,d2 adjust height for loop ( 1 to 200) 11/89 jsr fromtoo endm * virtually same as grab, except that height & width are registers * uses registers throughout * ex: grab spr_screen,current_screen,d6,d7,d2,d3 * move from sprite screen to current screen, an object at d6, * to destination d7, size 60*48 (d6 & d7 are 0-32000) *-------------- * for time speed only * first install the hbl routine, see shell.s * now calling before and after, before and after a sprite is drawn, * will reveal how many h/blanks have elapsed during that time * (there are about 312 blanks at 50hz) * if a screen is not completely redrawn within 312 h/b, * a frame will missed. Missing two frames will cause jerky sprites before macro \1 move.w #\1,d0 say 1 lsl.w #1,d0 double for word boundary lea before,a0 array of several 'befores' add.w d0,a0 add offset move.w hbl_ct,(a0) store h/b counter there endm after macro \1 move.w #\1,d0 lsl.w #1,d0 lea after,a0 array of several 'afters' add.w d0,a0 move.w hbl_ct,(a0) endm * ex: before 1 bsr do_something after 1 * now these 2 'stopwatches' must be revealed in some way: * put them in the k_star routine! * now pressing '*' will reveal the time elapsed in horizontal scanlines *----------------- reveall macro \1\2\3\4 move.l \2,-(sp) move.l \3,-(sp) move.l \4,-(sp) move.l \1,d0 move.l #10,d1 decimal (hex is 16, binary is 2) jsr printn move.l (sp)+,\4 move.l (sp)+,\3 move.l (sp)+,\2 printatt \2,\3,\4,#num_buff+14 endm * ex: reveall my_score,2,0,12 * will print on screen, in decimal, a L word held in my_score * in color 2, row 0, line 12 * reveall stands for reveal long *----------------- reveal macro \1 movem.l d0-d7/a0-a6,-(sp) clr.l d0 clean entry move.w \1,d0 WORD on this occasion move.l #10,d1 decimal jsr printn printat 15,0,0,#num_buff+14 movem.l (sp)+,d0-d7/a0-a6 endm * ex: reveal d3 or reveal score or reveal $44e * will print on screen, in decimal, a word * at position 0,0 in ink 15 *-------------------------- getjoy macro clr.b joyport1 joy\@ move.b joyport1,d7 tst.b d7 beq joy\@ endm * waits for joystick to be moved & reports result in D7 * does for joystick what 'getkey' does for keyboard * ex: joystick btst #7,d7 beq fire * if bit 7 in d7 is set: fire has been pressed * other bits: 0 up 1 down 2 left 3 right * save D7 before calling if necessary * joystick routine to be set up once with jsr initjoy *---------------------------------------------------- joystick macro move.b joyport1,d7 clr.b joyport1 avoid repetition endm * merely peeks joystick at a given time * similar to 'rawconio' on the keyboard * reads information in D7, then moves on * note: auto repeat on fire button is off with this macro * to keep it on, don't use this macro, use: btst #7,joyport1 bne fire *--------------------- * acia reads the keyboard acia. Useful when k/b interrupt disabled * acia returns k/b mouse and joystick bytes * this routine is therefore a bit erratic. * Best not touch the mouse acia macro \1 move.b \1,d7 bh\@ cmp.b $fffc02,d7 read acia direct bne bh\@ endm * ex: acia 57 (wait for space to be hit) *------------------------------------------- key macro move.l d7,-(sp) move.b $fffc02,d7 k\@ cmp.b $fffc02,d7 beq k\@ move.l (sp)+,d7 endm * ex: key * this macro is used for debugging * interrupts program anywhere without affecting a single register * program will resume if keyboard or joy/ mouse touched *------------ silence macro movem.l d0/a0,-(sp) lea $ff8800,a0 move.b #0,d0 lp\@ move.b d0,(a0) move.b #255,2(a0) add.b #1,d0 cmp.b #16,d0 bmi lp\@ movem.l (sp)+,d0/a0 endm * ex: silence (after some sound effect that must not linger on) *------------ even *----------------- include1.s ----- October 26, 1989 * BLOAD file loading system * F_WRITE file writing system * OPENFILE/READFILE/WRITEFILE/CLOSEFILE chiefly used by macros * M_FREE relinquish obsolete memory space * GETLIN input a string * PRINTLINE trap call to print string (now in macro form) * CURSORON/OFF MOUSEON/OFF various system calls * GETKEY/VTSYNC now completely replaced with macros * RAWCONIO read k/board and carry on (basic INKEY$) * SUPERIN/OUT supervisor mode * GETREZ resolution * QUIT proper return to desktop * QUIT_STAY stay resident * BINDEC binary to decimal * BINHEX not checked Use MURRAY'S routine instead * BINASCII not checked * PRINTN Janice Murray's universal number routine * DELAY use wait macro instead * RANDOM/ trap call * INITJOY/RESMOUSE switch joystick on/off * INITMOUS/RESMOUS switch mouse on/off * SCROL Simon Rush's vertical scroll see macro * SETPAL see macro (palette) * REVEAL/REVEAL_REGS Camy's revelations * REVEAL_QUICK more revealing * FROMTO/FROM_TWO Camy's memory transfers (see various macros) * BLANKEN used by blank macro to draw a blank box * DEGAS_LOAD Camy's file loading, using macros * SETLOWRES etc trap calls * DOSOUND trap call see sound macro * SORT Camy's bubble sort * ENABLE_VBI/ DISABLE_VBI standard routine * RST_HORIZONTAL_BLANK standard routine * SPECIFY1/ rebuilds a screen at random ******************************************************************** * IMPORTANT NOTE. A lot of these routines are now replaced * * with MACROS. See macros file. It is virtually unneccesary * * to study how these routines work. Unless you want to modify them.* * Just use the MACROS instead * * ex: no need to say lea default,a0 jsr setpal * * just say palette default * * Finally, the INCLUDE files don't work without the SHELL, * * and the SHELL doesn't work without the INCLUDE files. * * They are part of the same package: all or nothing. * ******************************************************************** * Load routine * >> see MACROS << * IN filename in A0(L) * file_ptr in A6(L) * and possibly a direct load address in A3(L) * in which case set 'load_address' to 1 * OUT handle is D0 (L) * save any important register before calling. * virtuall ALL disk operations use macros! See macro list. * 'load' macro uses bload * 'read' macro on the other hand, uses routines further on * see degas_load routine further on as an example.. * Full example in Budgie shell.s * * * * * * * * EXAMPLES * * * * * * * * * * * * * * * * * * bset #0,load_address flag: precise load address * move.l #jenny,a0 file name on disk * move.l lady_screen,a3 where to load it in memory * sub.l #34,a3 deduct palette and res * bsr bload * bclr #0,load_address all done: clear bit zero * >>>>> ANOTHER better EXAMPLE using macros <<<<<<<<<<<<<<< * reserve 32034 * move.l d0,lady_screen save start address given by gem * open jenny file name * read my_palette,34 read 34 bytes in palette loc * read lady_screen,32000 read 32000 at this address * close * lady_screen dc.l 0 * jenny dc.b "jenny.pi1",0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * whatever follows is now purely irrelevant. * Anyone trying to work out what it does would struggle * So would we. bload move.l a0,a4 save that name bsr get_size tst.w d0 bmi getsize_error can't find this file:exit bsr dta size returned in d3 move.l d3,file_size added 10/89 btst #0,load_address if set: load at specified address bne bl_1 and no need to reserve memory bsr mmalloc reserve memory bl_1 move.l a4,a0 get that name again bsr f_open_read open file tst.w d0 bmi open_error if negative:error. Exit bsr f_read read that block. If error, Close bsr f_close close file in any case bl_exit rts er_exit bset #0,loaderror string < E R R O R > move.w #$222,$ff8240 rts getsize_error home string move.w #$700,$ff8240 getkey rts exit bload open_error home string move.w #$070,$ff8240 rts exit bload read_error string home move.w #$007,$ff8240 getkey rts close_error string home move.w #$077,$ff8240 getkey rts gemdos_error home string getkey rts * GET SIZE of a file * in A0 address of filename (L) * out D3 size of file (L) * D0 error channel (W) get_size CLR.W -(SP) check for file and get size MOVE.L A0,-(SP) filename MOVE.W #$4E,-(SP) TRAP #1 ADDQ.L #8,SP rts file_size dc.l 0 dta MOVE.W #$2F,-(SP) TRAP #1 get Data Transfer Address ADDQ.L #2,SP MOVE.L D0,A0 put addr of DTA into A0 MOVE.L 26(A0),D3 put file size into D3 MOVE.L #1,D0 26th byte of data RTS mmalloc MOVE.L d3,-(A7) # of bytes to allocate MOVE.W #$48,-(A7) TRAP #1 ADDQ.L #6,A7 TST.L D0 BEQ malloc_error BTST #0,D0 even address? BEQ storemmalloc ADDQ.L #1,D0 make pointer addr even storemmalloc MOVE.L D0,A3 store start address move.l d0,(a6) also in pointer RTS malloc_error string getkey rts *---------- * OPEN A FILE TO READ * A0 points to file name * out: handle/error returned in D0 then put in D2 f_open_read MOVE.W #0,-(SP) open file (#2 if read/write) MOVE.L A0,-(SP) filename MOVE.W #$3D,-(SP) TRAP #1 addq.l #8,SP MOVE.W D0,D2 MOVE.W D0,handle RTS * READ BLOCK sequentially from disk to memory buffer * D2 file handle A3 address of buffer to read to * D3 number of bytes to read f_read MOVE.L A3,-(SP) read a buffer full at A3 MOVE.L D3,-(SP) read D3 bytes MOVE.W handle,-(SP) handle MOVE.W #$3F,-(SP) TRAP #1 ADD.L #12,SP tst.l d0 test length (L) bmi read_error rts * CLOSE FILE with D2 handle f_close MOVE.W handle,-(SP) MOVE.W #$3E,-(SP) TRAP #1 ADDQ.L #4,SP tst.w d0 bmi close_error rts notfound DC.B "file not found",10,13,0 even handle DS.W 1 loaderror DC.W 0 load_address DC.W 0 * BSAVE (open, write, then close) * IN : A0 address of filename (L) A3 save from this address (L) * IN : D3 length (number of bytes) bsave BSR f_create TST.W D0 BMI erw_exit BSR f_write write it MOVE.W D0,-(SP) preserve file status BSR f_close MOVE.W (SP)+,D0 tst.w d0 bmi erw_er RTS erw_exit string rts erw_er string rts *------------ * CREATE a file to write * A0 points to file name * out: handle/error returned in D0 then put in D2 f_create MOVE.W #0,-(SP) MOVE.L A0,-(SP) filename MOVE.W #$3c,-(SP) 3c is actually create a file TRAP #1 ADD.L #8,SP MOVE.W D0,D2 move.w d0,handle bsr dta size returned in d3 added 10/89 move.l d3,file_size RTS *---------- * WRITE BLOCK to disk * D2 file handle A3 address of buffer * D3 number of bytes to write f_write MOVE.L A3,-(SP) buffer to write from MOVE.L D3,-(SP) number of bytes MOVE.W handle,-(SP) handle MOVE.W #$40,-(SP) TRAP #1 ADD.L #12,SP RTS * OPEN existing FILE to READ/WRITE * IN A0 address of filename * OUT D0 handle openfile open_file move.w #0,-(sp) 0=read 2=read/ write move.l a0,-(sp) file name move.w #$3d,-(sp) trap #1 addq.l #8,sp tst.w d0 added 11/89 bmi open_exit bsr dta size returned in d3 added 10/89 move.l d3,file_size open_exit rts * calling routine should check for a negative D0 (error) * (tst.w d0 bmi error) *---------- * ALLOCATE MEMORY * Expect file_ptr in A6 m_malloc MOVE.L F_SIZE(PC),-(A7) # of bytes to allocate MOVE.W #$48,-(A7) TRAP #1 ADDQ.L #6,A7 TST.L D0 BEQ GEMDOS_ERROR BTST #0,D0 even address? BEQ STOREM_MALLOC ADDQ.L #1,D0 make pointer addr even storem_malloc MOVE.L D0,(A6) store pointer address RTS f_size dc.l 0 *----------------------------------------------- readfile move.l a0,-(sp) ;used by read macro move.l d0,-(sp) move.w handle,-(sp) move.w #$3f,-(sp) trap #1 add.l #12,sp rts writefile move.l a0,-(sp) ;used by write macro move.l d0,-(sp) move.w handle,-(sp) move.w #$40,-(sp) trap #1 add.l #12,sp rts closefile move.w handle,-(sp) ;used by close macro move.w #$3e,-(sp) trap #1 addq.l #4,sp rts *------------ * final version * >>>>> ex:move.l welcome_ptr,a6: bsr mfree <<<<< * >>>>> use MACRO instead : mfree welcome_ptr <<<<< mfree MOVE.L a6,-(A7) MOVE.W #$49,-(A7) TRAP #1 ADDQ.L #6,A7 TST.L D0 BMI GEMDOS_ERROR RTS *----------- * EXPECTS FILE POINTER ADDRESS IN A6 * >>>>> ex:move.l #welcome_ptr,a6: bsr m_free <<<<< * still occasionally used 7/89 m_free MOVE.L (A6),-(A7) MOVE.W #$49,-(A7) TRAP #1 ADDQ.L #6,A7 TST.L D0 BMI GEMDOS_ERROR RTS *------------- * vertical sync * >>>>> use 'vsync' macro instead <<<<< vtsync MOVEM.L D0-D2/A0-A2,-(SP) MOVE.W #37,-(SP) TRAP #14 ADDQ.L #2,SP MOVEM.L (SP)+,D0-D2/A0-A2 RTS *---------- * INPUT returns result in a buffer pointed at by A0 * and length of input in D0 * prompt has to be printed separately * calling getlin gives a clean empty buffer for the string * calling getline lives the previous entry in (ideal for repeats) * >>> see examples in Final Lap and Speculator (enter name) <<<< getlin clearkeybuff move.l #keybuff+2,a0 move.w #15,d0 clkb move.b #0,(a0)+ dbra d0,clkb getline move.l #keybuff,A0 MOVE.L A0,-(SP) MOVE.B #20,(A0)+ 20max in 1st byte MOVE.B #0,(A0)+ blank 2nd byte MOVE.W #$A,-(SP) call gemdos TRAP #1 ADDQ.L #6,SP move.l #keybuff,A0 MOVE.B (A0),D0 ADD.W D0,A0 MOVE.W #0,(A0) RTS no problems so far * >>>>> to recall name: MOVE.L #keybuff+2,A0 BSR printline <<<<< keybuff DS.B 32 inbuff DS.B 32 *-------------------- * print a line of text * now superseded by macros: print, printat, string (all calling this routine) * in A0: address of string ending with a zero byte printline movem.l d0-d3/a0-a3,-(sp) move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp movem.l (sp)+,d0-d3/a0-a3 rts cursor DC.B 27,"Y",32,32,0 EVEN * * * * * * * * EXAMPLE * * * * * * * * * * * * * * * * * * lea message,a0 * bsr printline * message dc.b "hello",13,10,0 * or using a macro : print message * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *----------------- cursoron MOVE.W #1,-(SP) MOVE.W #21,-(SP) TRAP #14 ADDQ.L #4,SP RTS *------------ cursoroff MOVEM.L D0-D3/A0-A3,-(SP) CLR.W -(SP) MOVE.W #21,-(SP) TRAP #14 MOVEM.L (SP)+,A0-A3/D0-D3 RTS *------------ mouseon DC.W $A000 initialize A line MOVE.L 4(A0),A1 get address of control array MOVE.L 8(A0),A2 get address of intin array CLR.W 2(A1) MOVE.W #1,6(A1) DC.W $A009 line A showmouse routine RTS *------------ mouseoff DC.W $A000 initialize A line DC.W $A00A RTS *------------ getkey move.w #$07,-(sp) trap #1 addq.l #2,sp andi.w #$df,d0 force upper case rts answer in D0. Swap D0 to get scan code * use 'getkey' macro instead *------------ * this one looks up the keyboard buffer but doesn't wait * same as INKEYS in Basic * Again, there is a macro to do this. rawconio move.w #$ff,-(sp) move.w #6,-(sp) trap #1 addq.l #4,sp rts *---------------------------------------------- * other possible way is to read the acia direct. * as soon as the acia has signalled the 68901 mfp that a key * has been detected, the resulting mfp interrupt should be acknowledged * tested 31/10/89 works with all interrupts off (move.w #$2700,sr) * see macro calle 'acia' get_acia .a clr.b d0 move.b $fffc02,d0 fffc02 k/board acia data.... tst.b d0 beq .a bclr #6,$fffa11 acknowledge key press interrupt rts * then cmpi.b #$01, d0 ... or whatever key is tested *---------- * As soon as all unnecessary memory has been given back * to Gem, we go supervisor. Ex: jsr superin superin movem.l d0-d5/a0-a5,-(sp) move.l #$1,-(sp) move.w #32,-(sp) trap #1 addq.l #6,sp clr.l -(sp) enter supervisor mode move.w #32,-(sp) trap #1 addq.l #6,sp move.l d0,savestk save old stack pointer movem.l (sp)+,d0-d5/a0-a5 rts savestk DS.L 1 *---------- * Next routine is activately automatically on exit from shell. * jsr kwit is the proper way to exit the shell superout movem.l d0-d5/a0-a5,-(sp) move.l savestk,-(sp) exit supervisor move.w #32,-(sp) trap #1 addq.l #6,sp movem.l (sp)+,d0-d5/a0-a5 rts *---------- ** get screen rez into D0 getrez move.w #4,-(sp) trap #14 addq.l #2,sp rts *---------- * this routine is for Budgie games only * the shell does a 'jsr kwit' which then comes here quith bsr rst_horizontal_blank if there was one quit bsr resmouse bsr clearbuf quits move.l physbase,$45e call this exit label if no.. move.l #atari_palette,A0 ..interrupts were used BSR setpal btst #7,$fffa01 monochrome ? beq qu2 bsr setmedrez qu2 move.w #$007,$ff8244 blue background move.w #$005,$ff8246 blue ink bset #1,$484 key repeat still supervisor bsr superout move.w #2,-(sp) default values move.w #15,-(sp) key repeat rate move.w #35,-(sp) trap #14 addq.l #6,sp move.w #0,-(sp) move.w #$4c,-(sp) trap #1 * to quit and stay resident : quit_stay clr.w -(sp) move.l proglength,-(sp) move.w $31,-(sp) trap #1 even atari_palette DC.W $777,$700,$007,$005,$007,$707,$77,$555,$333 DC.W $733,$373,$773,$337,$737,$377,$0 proglength dc.l 0 prog_start dc.l 0 *----------- * BINDEC binary to decimal ascii * enter with D0 as binary number * and A0 as address of 6-byte buffer for string * >>>>> examples in Speculator and Final Lap <<<<<<<<< * also in shell.s under k_star (reveal all registers) * there is now a macro called 'bindec' which will return * a given binary number (L) in A0 bindec movem.l d0-d1/a0,-(sp) MOVE.B #' ',D1 TST.W D0 BPL.S notneg MOVE.B #"-",D1 NEG.W D0 notneg MOVE.B D1,(A0)+ ADDA.L #4,A0 this figure previously 5 but some MOVE.W #4,D1 failure on display caused a change to 4... binloop EXT.L D0 DIVS #10,D0 SWAP D0 MOVE.B D0,-(A0) ADD.B #"0",(A0) SWAP D0 DBRA D1,binloop movem.l (sp)+,d0-d1/a0 RTS *---------- * PRINTN [ Janice Murray March 1989 ] * will print any L number in D0 (max 652000 approx) * in base specified in D1 (2-10-16) Default 10 (decimal) * the result is stored in a 20 byte-long string, starting from the end! * leading nulls will force gemdos $09 to home position * and only real digits towards the end of the string will be printed. * I have therefore substituted nulls with spaces * to recall: printat 11,12,0,num_buff+14 which will print on screen * at location 12-0 in ink 11 a number 6 digit long (20-14=6) * printat 11,12,0,num_buff+16 will only print the last 4 digits, and so on * ex: >>> move.l physbase,d0 move.l #16,d1 bsr printn <<<<< * ex >>>>> in shell.s (under k_star) <<<<< printn and.l #$ff,d1 cmp.l #16,d1 hex? beq .go cmp.l #2,d1 binary? beq .go move.l #10,d1 ok decimal .go lea num_buff(pc),a0 we'll put result her move.w #19,d7 clean up 20 byte- buffer .cl move.b #" ",(a0)+ spaces (originally clr.b) dbra d7,.cl .lp1 divu d1,d0 number is continuously divided by base right down to 1 swap d0 d0 low is remainder addi.w #"0",d0 make into digit cmpi.w #"9",d0 digit or letter? ble .ok addq.w #7,d0 letter! .ok move.b d0,-(a0) store character (staring from end) clr.w d0 swap d0 d0 low: quotient bne .lp1 another one? rts num_buff ds.b 20 20 digit buffer dc.b 0 end marker ds.l 6 safety even *----------- * time delay expects a figure in D5 ** * note: D5 is NOT saved. Save if necessary prior to calling delay move.l d0,-(sp) outer move.w #5000,D0 inner loops inner tst.w D0 dbeq D0,inner tst.w D5 dbeq D5,outer move.l (sp)+,d0 rts *------------ * gemdos random random movem.l d1-d3/a0-a3,-(sp) move.w #17,-(sp) answer in D0 (L) trap #14 addq.l #2,sp movem.l (sp)+,d1-d3/a0-a3 rts *---------- * Joysticks * [ ST World ] * call initjoy once to initialize * see full example in Budgie shell.s * there is now a macro (getjoy) that waits for a button press * and another one (joystick) that merely peeks the state of joystick initjoy MOVE.W #$14,-(SP) IKBDcommand to send joystick MOVE.W #4,-(SP) packages to IKBD MOVE.W #3,-(SP) TRAP #13 ADDQ.L #6,SP MOVE.W #34,-(SP) get address of IKBD vector table TRAP #14 ADDQ.L #2,SP MOVEA.L D0,A0 ADDA.L #24,A0 move to joy vector address in table LEA oldpack(PC),A1 MOVE.L (A0),(A1) save original packet handler address LEA joypacket(PC),A1 address of new packet handler MOVE.L A1,(A0) modify joystick vector to point RTS to our routine *---------- * Joystick packet handler (called by o/s) * joypacket MOVEM.L A0/A1,-(SP) A0 points to addr of joy data LEA joyport0(PC),A1 load addr of our new register MOVE.B 1(A0),(A1) move joystick data to our loc MOVE.B 2(A0),1(A1) and the same for port 1 MOVEM.L (SP)+,A0/A1 RTS * return to normal mouse control * resmouse MOVE.W #34,-(SP) address of IKBD vector table TRAP #14 ADDQ.L #2,SP MOVEA.L D0,A0 ADDA.L #24,A0 move to joy vector address in table (24) MOVE.L oldpack(PC),(A0) restore original pack hndler MOVE.W #128,-(SP) reset keyboard processor to MOVE.W #4,-(SP) power up state MOVE.W #3,-(SP) TRAP #13 ADDQ.L #6,SP MOVE.W #1,-(SP) MOVE.W #4,-(SP) and again MOVE.W #3,-(SP) TRAP #13 ADDQ.L #6,SP RTS oldpack DC.L 0 storage for old packet handler address joyport0 DC.B 0 joyport1 DC.B 0 *------------ * call initmous once ONLY to initialize * example in >>>>> MONEYSPINNER <<<<< initmous MOVE.W #$08,-(SP) IKBD command to send relative mouse MOVE.W #4,-(SP) packages from now on MOVE.W #3,-(SP) TRAP #13 ADDQ.L #6,SP MOVE.W #34,-(SP) get address of IKBD vector table TRAP #14 ADDQ.L #2,SP MOVEA.L D0,A0 ADDA.L #16,A0 mouse vector address in table LEA oldpak(PC),A1 MOVE.L (A0),(A1) save original packet handler address LEA mouspacket(PC),A1 address of new packet handler MOVE.L A1,(A0) modify vector to point RTS to our routine *---------- * Mouse packet handler (called by o/s) * * see MONEYSPINNER for details mouspacket movem.l a0/a1,-(sp) A0 points to addr of packet received lea mse_packet(pc),a1 A1 is where we store it clr d0 move.b (a0),(a1) header (buttons) move.b 1(a0),d0 x movement ext d0 make it a word (added nov 88) add.w d0,2(a1) new x position (lateral 0-320) tst.w 2(a1) below 0 ? bpl .m1 ok clr.w 2(a1) keep it at 0 .m1 cmp.w #302,2(a1) too large? off screen bmi .m2 no ok move.w #302,2(a1) hold it there .m2 clr d0 move.b 2(a0),d0 y movement ext d0 add.w d0,4(a1) new y position (vertical 0-200) tst.w 4(a1) below 0 ? bpl .m3 ok clr.w 4(a1) keep it at 0 .m3 cmp.w #186,4(a1) too large? off bottom? bmi .m4 no ok move.w #186,4(a1) hold it there .m4 movem.l (sp)+,a0/a1 rts * return to normal mouse control * resmous MOVE.W #34,-(SP) address of IKBD vector table TRAP #14 ADDQ.L #2,SP MOVEA.L D0,A0 ADDA.L #16,a0 mouse vector MOVE.L oldpak(PC),(A0) restore original pack hndler MOVE.W #128,-(SP) reset keyboard processor to MOVE.W #4,-(SP) power up state MOVE.W #3,-(SP) TRAP #13 ADDQ.L #6,SP and again MOVE.W #1,-(SP) data to write 128 and 1 = reset MOVE.W #4,-(SP) 4 is ikbd MOVE.W #3,-(SP) 3 is chr out TRAP #13 ADDQ.L #6,SP RTS oldpak DC.L 0 storage for old packet handler address mse_packet DC.B 0 button dc.b 0 empty byte (not used) dc.w 160 x 0 to 320 max dc.w 20 y 0 to 200 max dc.b 0,0,0,0,0,0 even *----------- * VERTICAL SCROLL [ Simon Rush ] May 20, 1987 * there is a macro to call it (called 'scroll') * see full example in shell.s under 'opening sequence' * this routine merely scrolls a block on itself. * for scenery scrolling, see the example inside shell.s * by pressing V * expects times in D2, width in D3, * left corner + margin in D4 and height in D5 * macro example in all budgie shells under 'opening sequence' * modified aug 89 (B is now L) ~~ much faster scrol move.w d3,d6 width lsr #2,d3 divide by 4 .scrol MOVE.L $44e,A1 origin ADD.W D4,A1 bottom left corner MOVE.L $44e,A2 destination add.l #160,A2 ADD.W D4,A2 bottom left MOVE.W D5,D1 height .a MOVE.W D3,D0 .lp MOVE.l (A1)+,(A2)+ DBRA D0,.lp loop SUB.L #164,A1 SUB.W D6,A1 SUB.L #164,A2 SUB.W D6,A2 DBRA D1,.a MOVE.L $44e,A2 adda.w #160,A2 ADD.W D4,A2 MOVE.W D3,D0 ADD.L #160,A1 .s MOVE.l (A2)+,(A1)+ DBRA D0,.s DBRA D2,.scrol RTS *------------ * increment palette color register 0 (border) [ Rik Haynes ] Jul 87 * expects a number in D3 (10000 = 2 seconds approx) * Again, we now have a macro, called 'flash' flashes movem.l d0-d3/a0,-(sp) lea $ff8240,a0 register address move.w #0,(a0) start with black fla1 ADD #61,(A0) increment contents CMP.W #$770,(A0) BMI fla2 MOVE.W #0,(A0) reset color fla2 MOVE.L #256,D1 fla3 DBRA D1,fla3 DBRA D3,fla1 movem.l (sp)+,d0-d3/a0 rts *------------ flashes_b movem.l d0-d3/a0,-(sp) lea $ff8240,a0 register address move.l (a0),-(sp) save original color fla00 move.w #0,(a0) start with black move.l #200,d1 fla11 dbra d1,fla11 delay move.w #$777,(a0) move.l #200,d1 fla22 dbra d1,fla22 delay dbra d3,fla00 number of iterations required move.l (sp)+,(a0) restore original color movem.l (sp)+,d0-d3/a0 rts *------------ * new palette expects address in A0 * see macro called 'palette' setpal movem.l d0-d2/a0-a2,-(sp) move.l a0,-(sp) move.w #6,-(sp) trap #14 addq.l #6,sp movem.l (sp)+,d0-d2/a0-a2 rts *---------- * here is how to save a palette movem.l $ff8240,d0-d7 movem.l d0-d7,palet *--------------------------- * here is how to quickly turn screen black movem.l blanks(pc),d0-d7 ; all nulls movem.l d0-d7,$ff8240 ; all colors are now black blanks ds.w 16 *---------------- * REVEAL [ Camy Maertens ] July 1 1987 * will reveal the contents of D0 * >>> see 'reveall' macro <<< reveal LEA errbuf(PC),A0 BSR bindec BSR printline RTS errbuf DS.B 6 DC.B 10,13,0 EVEN *----------- * reveal_regs: EXAMPLE >>>> in shell.s under k_star <<<<<< reveal_regs move.l d0,-(sp) move.l d7,-(sp) save originals move.l d6,-(sp) move.l d5,-(sp) move.l d4,-(sp) move.l d3,-(sp) move.l d2,-(sp) move.l d1,-(sp) move.l d0,-(sp) lea errbuf,A0 clr.l (A0) move.l (sp)+,d0 bsr bindec print errbuf string < > or print c_r move.l (sp)+,d0 lea errbuf,A0 bsr bindec print errbuf string < > move.l (sp)+,d0 lea errbuf,A0 bsr bindec print errbuf string < > move.l (sp)+,d0 lea errbuf,A0 bsr bindec print errbuf string < > move.l (sp)+,d0 lea errbuf,A0 bsr bindec print errbuf string < > move.l (sp)+,d0 lea errbuf,A0 bsr bindec print errbuf string < > move.l (sp)+,d0 lea errbuf,A0 bsr bindec print errbuf string < > move.l (sp)+,d0 lea errbuf,A0 bsr bindec print errbuf string < > move.l (sp)+,d0 rts *------------ * address of cursor NEEDED in A0 reveal_quick MOVEM.L D1-D7/A0-A6,-(SP) MOVE.L D0,-(SP) BSR printline MOVE.L (SP)+,D0 LEA errbuf(PC),A0 BSR bindec BSR printline MOVEM.L (SP)+,D1-D7/A0-A6 RTS *------------- c_r DC.B 13,0 l_f DC.B 10,0 space DC.B " ",0 EVEN *------------- * from to routine [ Camy Maertens ] July 1 1987 * expects 'from' in D0 'to' in D1 Height in D2 Width in D3 * also expected origin screen in A0 (ex: spr_screen or lady_screen..) * destination screen in A1 (ex: $44e or physbase...) * this routine now obsolete on its own. Replaced by several MACROS: * grab, take, block... all moving blocks around. * modified Aug 89 (see ~) fromto MOVEM.L A0-A1/D0-D4,-(SP) MOVE.W #160,D4 SUB.W D3,D4 this will be the offset for each line lsr.w #2,d3 divide by 4 sub.w #1,d3 loop ADDA.w D0,A0 A0 is always the Origin ADDA.w D1,A1 A1 is always the Destination MOVE.W D2,D0 height .f1 MOVE.W D3,D1 width .f2 MOVE.L (A0)+,(A1)+ DBRA D1,.f2 ADD.W D4,A0 ADD.W D4,A1 DBRA D0,.f1 MOVEM.L (SP)+,A0-A1/D0-D4 RTS *---------- * this one needed by 'grabr' macro (Aug 89) fromtoo MOVEM.L A0-A1/D0-D4,-(SP) MOVE.W #160,D4 SUB.W D3,D4 this will be the offset for each line lsr.w #2,d3 divide by 4 sub.w #1,d3 loop ADDA.l D0,A0 A0 is always the Origin ADDA.l D1,A1 A1 is always the Destination MOVE.W D2,D0 height .fto1 MOVE.W D3,D1 width .fto2 MOVE.L (A0)+,(A1)+ DBRA D1,.fto2 ADD.W D4,A0 ADD.W D4,A1 DBRA D0,.fto1 MOVEM.L (SP)+,A0-A1/D0-D4 RTS *------------- * Blank out a block on screen (Camy Maertens July 15, 1988) * Block height 1 to 200 width 1 to 320 * Again, no need to call this routine. * use 'blank' macro instead * Synthax for calling: BLANK long,word,word,word * Ex: BLANK 12,16000,47,64 (color-location-height-width) * BLANK d0,d1,d2,d3 (L-W-W-W) * Limits are d0:0-15 d1:0-32000 d2:1-200 d3:16-320 (in 16's) * 'BLANK' is a macro * note: writing 1 L to screen (say $ffffffff) plots 8 to 16 pixels * writing the next L will give these 16 pixels their final color * if the command was move.l #$ffffffff,(a1)+ then * the marker has to be moved by 156 to get back to the * beginning of the next line (add.l #156,a1) * so with 2 commands to write a true 16 pixels, the sequence is * move.l d0,(a1)+ move.l d0,(a1)+ add.l #152,(a0) * or move.l (a0)+,(a1)+ move.l (a0)+.(a1)+ add.l #152,(a0) * height is expected in d2 blanken movem.l A0-A1/D0-D6,-(SP) add.w d1,a1 the final, precise, position move.w d3,d5 save width lsr.w #4,d5 divide width by 16 sub.w #1,d5 adjust for dbra loop lsr.w #1,d3 16 becomes 8 for line complement move.w #160,d4 sub.w d3,d4 say 160-8=152 move.l #color_table,a2 lsl.l #3,d0 multiply by 8 move.l 0(a2,d0),d6 the first long word move.l 4(a2,d0),d7 the second longword .hei move.w d5,d1 width .wi move.l d6,(a1)+ plot first L word move.l d7,(a1)+ plot second dbra d1,.wi add.w d4,a1 the line complement dbra d2,.hei the height movem.l (sp)+,a0-a1/d0-d6 rts color_table dc.l $00000000,$00000000 color #0 (border) dc.l $ffff0000,$00000000 color #1 dc.l $0000ffff,$00000000 color #2 dc.l $ffffffff,$00000000 color #3 dc.l $00000000,$ffff0000 color #4 dc.l $ffff0000,$ffff0000 color #5 dc.l $0000ffff,$ffff0000 color #6 dc.l $ffffffff,$ffff0000 color #7 dc.l $00000000,$0000ffff color #8 dc.l $ffff0000,$0000ffff color #9 dc.l $0000ffff,$0000ffff color #10 dc.l $ffffffff,$0000ffff color #11 dc.l $00000000,$ffffffff color #12 dc.l $ffff0000,$ffffffff color #13 dc.l $0000ffff,$ffffffff color #14 dc.l $ffffffff,$ffffffff color #15 *---------- * this one asks for a Degas filename and loads it if found * version two (July 88 Camy Maertens) using macros * specific to Budgie environment only * destination expected in a6 degas_load bsr getline input filename move.l a6,$45e target screen : these two vsync ..lines must stay open keybuff+2 recall that name tst.w d0 if error, we don't come bmi degas8 back here (rts during open) read #palette_x,34 Must be a # read $44e,32000 actual data close palette palette_x+2 getkey rts degas8 not $ff8240 error warning rts palette_x ds.w 20 *---------- phys_base move.w #2,-(sp) trap #14 addq.l #2,sp rts physbase dc.l 0 logical_screen dc.l 0 physical_screen dc.l 0 save_screen dc.l 0 *---------- * next routine now replaced with a macro: * to set low res, just type 'mode 0' (macro) <<<<< setlowrez CLR.W -(A7) 0=low res MOVE.L physbase,-(A7) -1=ignore physbase MOVE.L physbase,-(A7) -1=ignore logbase MOVE.W #5,-(A7) TRAP #14 LEA $0C(A7),A7 rts setmedrez move.w #1,-(A7) 0=low res MOVE.L physbase,-(A7) -1=ignore physbase MOVE.L physbase,-(A7) -1=ignore logbase MOVE.W #5,-(A7) TRAP #14 LEA $0C(A7),A7 rts *------------ * expects start address of sound data in A0 * use 'sound' MACRO instead! <<<<< dosound movem.l a0-a6/d0-d6,-(sp) MOVE.L A0,-(SP) MOVE.W #$20,-(SP) TRAP #14 ADDQ.L #6,SP movem.l (sp)+,a0-a6/d0-d6 RTS EVEN * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * EXAMPLE * lea snd14,a0 * jsr dosound * or using a macro: sound snd14 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * BUBBLE sort high score table [ Camy Maertens ] Sept 1 1987 *The array is as follows: DC.W 8 records * DC.W 8 pointers DC.B 10*16 characters DC.B 8 blank bytes * Not a universal routine. But the principle is there. * array expected in a0 ex: lea high_scores,a0 jsr sort sort MOVE.w #6,d3 # of checks required (7 for an 8 array)[w] MOVE.L A0,A4 \preserve it sor1 MOVE.L A0,A1 \and again MOVE.W (A1),D1 \first cell in the array ADDA.W #2,A0 MOVE.L A0,A2 \and this is the next one MOVE.W (A2),D2 BSR sort_compare \go and see which is greatest DBRA D3,sor1 RTS sort_compare CMP.W D1,D2 BGT sor2 \if first is greater,no action RTS sor2 EXG D1,D2 swap them round MOVE.W D1,(A1) replace them in... MOVE.W D2,(A2) ... appropriate locations ADDA.W #16,A1 now get the positioners ADDA.W #16,A2 MOVE.W (A1),D1 and swap them as well MOVE.W (A2),D2 MOVE.W D1,(A2) MOVE.W D2,(A1) no need to use EXG really bset #0,sor8 indicate a swap took place RTS EVEN sor8 DC.W 1 internal flag *----------------- * SET a Sequence of VBI routines [ C.Maertens ] 20/9/87 * Each routine has to be enabled or disabled separately * Address of routine expected in A5 * ex: move.l #music,a5 jsr enable_vbi * first available slot is usually the second one, first being gem * move.l #myroutine,$4d2 also does the same job (not recommended) * see example of TWO vbi's at once in Operation Angelica enable_vbi movem.l a0-a5,-(sp) move.l $456,a0 enab1 tst.l (a0) is is nought? (free) beq enab2 adda.l #4,a0 bra enab1 enab2 move.l a5,(a0) slot in this routine movem.l (sp)+,a0-a5 rts *------------ disable_vbi movem.l d0/a0-a5,-(sp) a5 holds address of routine move.l $456,a0 disab1 cmp.l (a0),a5 contents of $456 same as routine? beq disab2 disab3 adda.w #4,a0 try next one bra disab1 disab2 move.l #0,(a0) switch it off movem.l (sp)+,d0/a0-a5 rts *------------ clearbuf MOVE.W #$B,-(A7) constat call $00=nothing $ffff=yes TRAP #1 character in buffer? ADDQ.L #2,A7 TST.W D0 if zero, nothing there BEQ clearnd MOVE.W #7,-(A7) gemdos conin no echo TRAP #1 gets character.. ADDQ.L #2,A7 ..from buffer BRA clearbuf clearnd RTS *------------ anybuff MOVE.W #$B,-(A7) TRAP #1 character in buffer? ADDQ.L #2,A7 answer in D0 RTS *------------ * random rebuilds a specified screen * origin expected in A0 (ex: lady_screen) * destination is current screen * example in the 'opening_sequence' of most Budgie games specify1 bsr random move.l d0,d1 and.l #%111110011111000,d1 restrict to 32000 & div by 8 move.w d1,d0 origin & destination same move.w #8,d2 height move.w #8,d3 width move.l $44e,a1 bsr fromto or from_to for single screen rts *------------ * this version also expects origin screen in A0 (ex: spr_screen) * destination will be both logical and physical * used for control panels etc.. see Operation Angelica * also expected D0,D1,D2,D3 * of course a 'grab' macro, used twice, will do the same from_two MOVEM.L A0-A2/D0-D4,-(SP) MOVE.W #160,D4 SUB.W D3,D4 this will be the offset for each line lsr.w #2,d3 divide by 4 sub.w #1,d3 adjust for loop move.l logical_screen,a1 move.l physical_screen,a2 ADDA.W D0,A0 ADDA.W D1,A1 ADDA.W D1,A2 MOVE.W D2,D0 height .f1 MOVE.W D3,D1 width .f2 MOVE.l (A0),(A1)+ move.l (A0)+,(A2)+ DBRA D1,.f2 ADD.W D4,A0 ADD.W D4,A1 add.w d4,a2 DBRA D0,.f1 MOVEM.L (SP)+,A0-A2/D0-D4 RTS even * ----------- end of include ------------ * * INCLUDE 2 Oct 16, 1989 *------------------------------------------------------ * FADEIN Damon. not tested yet * SET_HORIZONTAL_BLANK Kenn Garroch's h/blank * RST_HORIZONTAL_BLANK * INSTALL_VBI Frank's quick vbi re-vector * PICDUMP Frank's screen dump to disk * OR_BLOCK block drawing with oring * COMPACT compact a Degas file * DECOMPACT decompact * VIEW_ARRAY view bytes in dec, hex or binary * + various mfp trap calls *---------------------------------------------------- * fadein Oct 89 not tested yet fadein subi.w #1,flag2 bne fadeend addq.w #2,flag2 move.w store2(pc),d3 tst.w inout beq fadeend add.w inout(pc),d3 move.w d3,store2 beq skip4 cmpi.w #$0010,d3 bne skip8 skip4 clr.w inout skip8 moveq.w #$f,d4 lea palet,a0 ; address of 16 words lea $ff8240,a1 fadeloop move.w (a0)+,d0 move.w d0,d1 asr.w #4,d1 move.w d1,d2 asr.w #4,d2 andi.w #$0007,d0 andi.w #$0007,d1 andi.w #$0007,d2 mulu d3,d0 mulu d3,d1 mulu d3,d2 asr.w #4,d0 asl.w #4,d2 andi.w #$0007,d0 andi.w #$0070,d1 andi.w #$0700,d2 or.w d1,d0 or.w d2,d0 move.w d0,(a1)+ dbf d4,fadeloop fadeend rts inout dc.w 0 (1 or $ffff) flag2 dc.w 2 store2 dc.w 0 *------------------------------------------ * Horizontal blank [Ken Garroch] Sept 5 1987 * Expects address of my routine in A0 set_horizontal_blank move.l d0,-(sp) MOVE SR,D0 get status register OR #$7,D0 set no interrupts MOVE D0,SR MOVE.L $68,hbl_vector save old vector MOVE.L A0,$68 point to our routine MOVE SR,D0 AND #$F8FF,D0 set interrupt level to zero MOVE D0,SR put back move.l (sp)+,d0 RTS * there is an example in the shell.s used to count how long * a particular routine takes (by peeking the h/b line, before * and after the routine. H/blank routines are very processor intensive. *---------- * all h/b routines must be disabled prior to returning to desktop rst_horizontal_blank move.l d0,-(sp) MOVE SR,D0 get status register OR #$7,D0 set no interrupts MOVE D0,SR MOVE.L hbl_vector,$68 reset old vector MOVE SR,D0 AND #$F8FF,D0 set interrupt level to zero MOVE D0,SR move.l (sp)+,d0 RTS hbl_vector DS.L 1 *---------------- * PICDUMP * Press Alt-Help to dump screen to disk rather than printer * To use, call install_vbi * then read vbi_request1 (flag) * from main program, and if set * clear it. * Exit to be finalized install_vbi eol EQU 0 ;setup constant bsr superin move.l $70,exitvbi+2 ;get system vbi vector/save it move.l #vbi_routine1,$70 ;set my vbi as first bsr superout RTS ;This is the easy way to install a vertical blank interupt ;enabling it to be the first to execute, the reason for the need to be ;first is to reset the hard copy dump flag after our disk dump ;otherwise we would also get a print out. vbi_routine1 tst.w $4ee ;alt/help key pressed bne exitvbi ;no bset #0,vbi_request1 YES move.w #$ffff,$4ee ;reset alt/help flag exitvbi jmp $ffff ;exit to old system vbi vbi_request1 DC.W 0 * note the use of JMP to unknown * this vbi_request flag will now be tested by the main prog *---------------------------------------------------------- * Now the PICDUMP routine * I've excluded the rez checks and assume LOW RES * screen expected in 'save_screen' (L) * see example in shell.s when you press D picdump movem.l d0-d5/a0-a5,-(sp) save_palette move.b $44c,paleta+1 ;move res header lea $ff8240,a0 ;now copy palette lea paleta+2,a1 ;to header \note precise pointer move.w #15,d0 ;copy 16 words ccolor MOVE.W (A0)+,(A1)+ to our buffer DBRA D0,ccolor move.l #fname,a0 BSR f_create MOVE.L #fname,A0 MOVE.L #paleta,A3 move.l #34,D3 BSR f_write MOVE.L #fname,A0 MOVE.L save_screen,a3 screen address MOVE.L #32000,D3 BSR f_write BSR f_close movem.l (sp)+,d0-d5/a0-a5 RTS paleta dc.b 0,0 flag for res ds.w 16 palette fname dc.b 'APIC.PI1',0 EOL even *------------- * puts a block on screen, eored with background * must start on a 16 boundary * expected: a0 origin (L), a1 destination (L), * d6 number of chunks (W) (1 chunk=16 pixels) d7 height (W) * max chunks:20 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * EXAMPLE * move.l spr_screen,a0 move.l $44e,a1 move.w #8,d6 * move.w #70,d7 jsr or_block * there is a MACRO for it, called 'block' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * or_block move.w #160,d0 move.w d6,d5 save chunk number for now lsl #3,d6 chunks times 8 sub.w d6,d0 say 160-32 (line offset) move.w d0,d4 save it as a line offset move.w d5,d6 retrieve chunk number sub.w #1,d6 adjust for loop sub.w #1,d7 loop, height .lp move.w d6,d5 loop, chunks .loop movem.l (a0)+,d2/d3 get all 4 planes in one go move.l d2,d0 combine... or.l d3,d0 ...the lot of them. move.w d0,d1 convert result.. swap d0 into.. or.w d1,d0 ..a mask not.w d0 now invert it clr.l d1 move.w d0,d1 put mask in lower word of D1 swap d1 now it's in the high word move.w d0,d1 now it's in both and.l d1,(a1) merge.. or.l d2,(a1)+ ..all this lot... and.l d1,(a1) ...with... or.l d3,(a1)+ ...the background on actual screen. dbra d5,.loop add.w d4,a0 line offset add.w d4,a1 dbra d7,.lp rts *------------------------- * how to save 1/2 a degas_screen from utility_screen to disk * no palette is saved at this point half_degas print prompt2 "enter file name..say bill.pic." bsr getline input filename vsync create keybuff+2 recall that name move.l #16000,d0 length writee utility_screen,d0 write to disk close rts prompt2 dc.b "give it a name (***.pic)",10,13,0 even *------------------------- * how to view a number of BYTES in an array, anywhere, * a0 to point to array. * currently, successive numbers do not scroll (fixed position) * ex: lea my_array,a0 jsr view_array * hit key to progress through array. Hit UNDO to exit. view_array flash 6,2 lllpp clr.l store move.b (a0)+,store+3 get that byte move.l a0,-(sp) preserve a0 bindec store,10 10=dec 16=hex 2=bin printat 7,20,22,a0 show it (always same position) getkey move.l (sp)+,a0 swap d0 cmp.b #$61,d0 undo to quit bne lllpp rts *-------------------------- * mfp end-of-interrupt timer bits: timer A bit 5 of $fffa0f * B bit 0 od $fffa0f C bit 5 of $fffa11 D bit 4 of $fffa11 * these must be bclr prior to rte * delay modes: 0 stop timer 1 divide by 4 2 divide by 10 * 3 divide by 16 4 divide by 50 5 divide by 64 * 6 divide by 100 7 divide by 200 * timers are normally used in delay modes, (rather than pulse mode) * the mfp operates at 2457600 hz: to get an interrupt every 3.9 milliseconds: * put 4 in control and 256 in data. Another example: * 2457600/50=49152 then 49152/192=256 256 hz= 5.1 seconds * disable MFP expects interrupt # in D0 (w) di_mfp move d0,-(sp) move.w #26,-(sp) trap #14 addq.l #4,sp rts *------------ * enable MFP expects interrupt # in D0 (W) en_mfp move.w d0,-(sp) move.w #27,-(sp) trap #14 addq.l #4,sp rts *------------ * set line interrupt timer B expects D0 and D1 (W) * also called xbtimer See Anatony. stimb move.l #-1,-(sp) timer B (line counter) move.w d0,-(sp) data move.w d1,-(sp) control move.w #1,-(sp) timer 0=A user move.w #31,-(sp) timer 1=B h/blank count trap #14 timer 2=C system timer add.l #12,sp rts *------------ * initialize an MFP timer * see Kenn Garroch's articles in folder xbtimer move.l a0,-(sp) address of our routine move.w d0,-(sp) data like 2 (2 lines per count move.w d1,-(sp) control like 8 for h/blank move.w #0,-(sp) timer 0=A 1=B 2=C 3=D move.w #31,-(sp) trap #14 add.l #12,sp rts *------------ * same as above see k. Garroch's ST Update Sept 87 and PCW April 89 inimfp move.l d0,-(sp) address of routine move.w d1,-(sp) say 8 for vector 8 (h/b) move.w #13,-(sp) trap #14 addq.l #8,sp rts *------------ * works best if pictures has lots of $0's (blank background) or $ff's * a prompt will ask for a reference byte (0 or f) * Camy Maertens October 9, 1989 compact show lady_screen cls font 16 home print prompt bsr getline input filename vsync ..lines must stay open keybuff+2 recall that name tst.w d0 if error, we don't come bmi comp9 back here (rts during open) read #palette_x,34 Must be a # print prompt_3 getkey 0 or f swap d0 cmp.b #$70,d0 keypad 0 beq .zer cmp.b #$0b,d0 top 0 beq .zer cmp.b #$21,d0 f beq .f .zer move.b #0,reference_byte bra .ov .f move.b #$ff,reference_byte .ov read $44e,32000 actual data close palette palette_x+2 move.l #32000,d7 32000 bytes to check move.l lady_screen,a0 origin move.l utility_screen,a1 destination clr.l d6 move.b reference_byte,d6 usually $00 or $ff .next sub.l #1,d7 loop beq .end move.b (a0)+,d0 one byte at a time tst.w b_flag if set : repeat beq .notset bra .set .notset move.b d0,(a1)+ not set: we store it add.l #1,storel length counter ; now let's examine this byte to see if it is same as reference byte .set cmp.b d6,d0 same as reference byte? beq .zero same tst.b z_ct zero last time around? beq .eq no clr.b z_ct yes. ok no more add.w #1,a1 next destination move.b d0,(a1)+ store this latest non-zero value add.l #2,storel .eq clr.w b_flag not zero: flag clear bra .next goto next byte .zero move.w #1,b_flag zero: set flag add.b #1,z_ct number of successive zeroes move.b z_ct,(a1) cmp.b #125,z_ct byte cmp not accurate above 127 bne .next sub.b #1,z_ct adjust move.b z_ct,(a1) move.b #1,z_ct restart at one move.b d6,1(a1) another zero move.b #1,2(a1) store that one add.w #2,a1 new pointer add.l #2,storel length bra .next goto next byte .end * ok now we save this compacted file to disk * no palette is saved at this point print prompt2 "enter file name..." bsr getline input filename vsync create keybuff+2 recall that name write #palette_x,34 write #reference_byte,1 move.l storel,d0 recall length writee utility_screen,d0 write to disk close comp9 rts z_ct dc.b 0,0 successive zeroes b_flag dc.w 0 zero on/off flag reference_byte dc.b 0,0 prompt_3 dc.b "reference_byte",13,10,0 even * storel can now be printed to reveal the number of bytes * beware not to print onto the compacted screen as it will * be corrupted!!! : bindec storel,10 printat 7,23,0,a0 *------------------------- * decompact: see compact first * a compacted picture previously loaded in utility_screen * will be re-built in spr_screen (or wherever) * the format is : 2 bytes res, 32 bytes palette, 1 byte reference, data... * number of bytes expected in d7, destination in a1 decompact clr.l storel used as a byte counter only clr.l d5 clr.l d6 move.l utility_screen,a0 origin (dest in a1) move.b reference_byte,d6 .next sub.l #1,d7 decrement loop beq .out out move.b (a0),d0 analyse one byte... move.b d0,(a1) ..and rebuild it cmp.b d6,d0 same as reference? beq .zero add.w #1,a0 add.l #1,storel for internal use only add.w #1,a1 bra .next .zero clr.l d5 move.b 1(a0),d5 special loop... tst.b d5 (avoid negative number beq .out at all cost) .ok sub.w #1,d5 ...for zeroes only .zloop move.b d6,(a1)+ dbra d5,.zloop add.w #2,a0 add.l #2,storel bra .next .out rts *------------------ * check for multiples of 8 using AND mask ex: ; move.w soso,d0 ; and #7,d0 ... says K Garroch * include 3 January 4, 1990 *------------------------------ * ASPRITE sprites, using chunks * DISAP Simon's venetian blind * PIPLOT pixel plot * PIREAD * READ_SECTOR\WRITE_SECTOR * BOOT_SECTOR how to create an executionable boot sector * SAVE_PAL \BLACK_PAL \INVERT * TRANSPARENT merge two pictures *--------------------------------------------------------- * SPRITES may be drawn in a variety of ways. Macros are available. * At the other extreme, data may be moved from spr_screen to destination * using pre-shifted pictures, and not a single loop (see Final Lap) * a chunk is 16 pixel wide * sprite screen expected in A0 * and several other parameters asprite move.l a1,a3 save destination screen add.l d4,a0 precise origin was a4 add.l d5,a1 precise loc (16 boundary) lea sprite_store,a2 destination:sprite data with mask move.l d1,-(sp) save start pixel move.w 8(a6),d7 height sub.w #1,d7 .row_loop move.w 10(a6),d4 chunks sub.w #1,d4 -1 for loop .chunk_loop movem.l (a0)+,d2/d3 create a mask of that sprite move.l d2,d0 combine... or.l d3,d0 ...the lot of them. move.w d0,d1 convert result.. swap d0 into.. or.w d1,d0 ..a mask not.w d0 now invert it move.w d0,(a2)+ store mask move.l d2,(a2)+ store planes move.l d3,(a2)+ .. .. * move.l (a1)+,(a3)+ if saving.. * move.l (a1)+,(a3)+ ..a buffer is needed dbra d4,.chunk_loop add.l a4,a0 offset add.l a5,a1 offset dbra d7,.row_loop printsprite move.l (sp)+,d0 retrieve start pixel lea sprite_store,a0 created a moment ago move.l a3,a1 retrieve destination screen.. add.l d5,a1 precise loc (16 boundary) move.w 8(a6),d7 height sub.w #1,d7 .loop1 move.w 10(a6),d6 sub.w #1,d6 moveq #-1,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 .loop2 move.w (a0)+,d1 mask move.w (a0)+,d2 plane 1 move.w (a0)+,d3 plane 2 etc move.w (a0)+,d4 move.w (a0),d5 lsr.l d0,d1 shift mask into place lsr.l d0,d2 shift planes into place lsr.l d0,d3 lsr.l d0,d4 lsr.l d0,d5 and.w d1,(a1) or.w d2,(a1)+ now write plane 1 and.w d1,(a1) or.w d3,(a1)+ and so on and.w d1,(a1) or.w d4,(a1)+ and d1,(a1) or d5,(a1)+ subq.l #8,a0 move.l (a0),d1 addq.l #2,a0 move.l (a0),d2 addq.l #2,a0 move.l (a0),d3 addq.l #2,a0 move.l (a0),d4 addq.l #2,a0 move.l (a0),d5 addq.l #2,a0 dbra d6,.loop2 move.w #-1,d1 clr.w d2 clr.w d3 clr.w d4 clr.w d5 lsr.l d0,d1 lsr.l d0,d2 lsr.l d0,d3 lsr.l d0,d4 lsr.l d0,d5 and.w d1,(a1) or.w d2,(a1)+ and.w d1,(a1) or.w d3,(a1)+ and.w d1,(a1) or.w d4,(a1)+ and.w d1,(a1) or.w d5,(a1)+ add.l a5,a1 (2*chunks)-8 dbra d7,.loop1 rts sprite_store ds.w 1300 enough for a sprite 3 chunks * 20 ds.w 1300 but bigger sprites need more room! *------------ * disappear (Venitian blind) [ Simon Rush 23.9.88 ] * just call by jsr disap disap move.l $44e,a0 add.l #1600,a0 move.l a0,a3 move.l a0,a2 move.l a0,a1 sub.l #160,a0 add.l #160,a2 move.l #9,d2 lp2 move.l #9,d1 lp1 move.l #359,d0 lp move.l -(a0),-(a1) move.l (a2)+,(A3)+ dbra d0,lp move.l #39,d0 lp4 move.l #0,-(a1) move.l #0,(a3)+ dbra d0,lp4 add.l #4640,a0 add.l #4800,a1 add.l #1600,a3 add.l #1760,a2 dbra d1,lp1 sub.l #32000,a0 sub.l #32000,a1 sub.l #32000,a2 sub.l #32000,a3 wait 2 dbra d2,lp2 rts *----------- * pixel plot based on J Lawson's system * use MACRO instead <<<< * enter with A0 screen address * d0,d1 lateral,vertical coord x-y (W) d2 color(W) piplot mulu #160,d1 (160 bytes per row) move.w d0,d3 save lateral (horizontal) lsr.w #1,d3 and.w #$fff8,d3 horizontal offset add.w d3,d1 combine vert & horiz offsets adda d1,a0 correct word on screen and.w #$f,d0 correct pixel neg d0 add.w #15,d0 correct bit * now actually write pixel in color held in d2 moveq #4-1,d3 4 planes loop .loop move.w (a0),d1 read screen lsr.w #1,d2 is it a set bit? bcs.s .set_bit yes bclr d0,d1 bra.s .write_back .set_bit bset d0,d1 .write_back move.w d1,(a0)+ dbra d3,.loop rts *--------- * pixel read * use MACRO instead ! * answer in D2 (W) piread clr.w d2 will return color 0 to 15 mulu #160,d1 move.w d0,d3 lsr.w #1,d3 and.w #$fff8,d3 horizontal offset add.w d3,d1 combine vert & horiz offsets adda d1,a0 correct word on screen and.w #$f,d0 correct pixel neg d0 reverse add.w #15,d0 correct bit moveq #0,d4 bits to create 0 to 15 (0-1-2-3) moveq #4-1,d3 4 planes loop .loop move.w (a0)+,d1 read screen, one word at a time btst d0,d1 bne .set bclr d4,d2 bra .clear .set bset d4,d2 .clear add.w #1,d4 dbra d3,.loop rts *---------- * FLOPRD read disk sector (currently set on boot sector) read_sector move.w #1,-(sp) number of sectors to read (1-9) move.w #0,-(sp) side number selected (0-1) move.w #0,-(sp) track number (0-79) move.w #1,-(sp) sector number (0-9) move.w #0,-(sp) device: 0 for A etc.. clr.l -(sp) filler (unused) move.l #read_buffer,-(sp) 512 bytes times sectors read move.w #8,-(sp) trap #14 add.l #20,sp tst.w d0 beq read_ok local label not recommended bra disk_error read_ok rts read_buffer ds.b 512 can be used for other purposes even *------------------------------- * WRITE SECTOR currently set to write boot sector write_sector move.w #1,-(sp) 1 sector to write move.w #0,-(sp) on side 0 move.w #0,-(sp) track zero move.w #1,-(sp) sector 1 (not zero) move.w #0,-(sp) drive A clr.l -(sp) move.l #read_buffer,-(sp) move.w #9,-(sp) trap #14 add.l #20,sp tst.w d0 error? beq wr_sc_ok bra disk_error wr_sc_ok rts *-------------------------------- * the next XBIOS call produces an executable boot sector * ie it reads a buffer and checksums it * the buffer must be ready in advance: the first two bytes being $60 $38 * meaning BRA $38 bytes. The code starts at byte 58 * so first prepare a 512 byte buffer by loading an existing valid * boot sector in it, using read_sector routine * Put a $60 and $38 in bytes 0-1 Copy code from somewhere else * to bytes 58 onwards. Then call boot_sector to checksum it. * Then call write_sector to save it. It should now be executable * boot_sector move.w #1,-(sp) executable move.w #-1,-(sp) disk type no change move.l #-1,-(sp) same serial number move.l #read_buffer,-(sp) move.w #18,-(sp) trap #14 add.l #14,sp rts *---------------------------------------------------- disk_error cmp.w #-17,d0 beq insertdisk cmp.w #-13,d0 beq writeon cmp.w #-2,d0 beq drivenot tst.w d0 bmi diskerror rts insertdisk pen $070 home string getkey rts writeon pen $070 home string getkey rts drivenot pen $070 home string getkey rts diskerror pen $070 home string getkey rts *---------- * one way of saving the entire palette in one go save_pal movem.l $ff8240,d0-d7 movem.l d0-d7,palet rts * one way of blanking the screen by making all colors black black_pal movem.l coal(pc),d0-d7 movem.l d0-d7,$ff8240 rts coal ds.w 16 * how to invert the screen invert move.l $44e,a0 move.l #8000-1,d0 loop .lp not.l (a0)+ invert dbra d0,.lp rts *---------- * screen one expected in a0 * screen two (destination) in a1 (currently physical) * color 0 will be transparent transparent move.l $44e,a1 move.l a0,a2 duplicate origin move.l a1,a3 and destination move.w #4000-1,d7 loop .lp move.w (a0)+,d0 get first plane word or.w (a0)+,d0 or it with next one or.w (a0)+,d0 and next or.w (a0)+,d0 eori.w #-1,d0 invert to obtain mask and.w d0,(a1)+ mask with destination and.w d0,(a1)+ and.w d0,(a1)+ and.w d0,(a1)+ move.l (a2)+,d1 source L or.l d1,(a3)+ or with the new destination move.l (a2)+,d1 or.l d1,(a3)+ dbra d7,.lp rts *---------- * INCLUDE 4 November 23, 1989 *---------------------------------------------------------------* * FNT_8 (16) Camy's font routine * SET_SCREEN trap 14 call * LEAD_ZERO Kane's erase leading zeroes * VERT Gareth's vertical screen scroll (selected planes) * JEFF_SCROLL adapted from Jeff Lawson's super fast vertical scroll *---------------------------------------------------------------* * access to font routines [ C. Maertens March 88 ] * after a DC.W $A000 call, A0 returns a pointer to A-line variables * which I stored in a_line_start * while A1 returns address of 3 system fonts * this routine expects the address of customized font data in A1 * otherwise a zero (L) must be passed in A1 to use system font. * in this routine here, A0 points to font header (not A-line) * A4 will point to A-line * the fonts used are a1 or a2 fonts as defined by Jeremy Hughes * in his Fontkit PD program: 2096 bytes in mono, 4116 in color * there is a routine in ST World Dec 88 that will copy system font * to a soft location and change a single character and * commute between rom and soft font * we now have a macro that will handle this routine! * Full example in Shell.s and all Budgie games fnt_8 move.l fontaddress_8,a0 $fc96ca/fd2ca6 tos8/9 bra fnta fnt_16 move.l fontaddress_16,a0 $fc9cce/fd3702 tos8/9 fnta move.l a_line_start,a4 $293a /2994? suba.l #6,a4 deduct 6 bytes (why?) move.w $52(a0),d0 height of character (82 dec in the header) move.w d0,-$28(a4) merken? move.w $8(a4),d1 bytes per screen line mulu d0,d1 times height of character move.w d1,-$22(a4) yields bytes per line moveq #0,d1 move.w $2(a4),d1 raster lines on screen divu d0,d1 divide by font height subq.w #1,d1 minus move.w d1,-$24(a4) yields max cursor line moveq #0,d1 move.w -6(a4),d1 screen width in bits divu $34(a0),d1 divide by max char width subq.w #1,d1 minus 1 move.w d1,-$26(a4) yields max cursor column move.w $50(a0),-8(a4) width of form move.w $24(a0),-$a(a4) smallest ascii code in font move.w $26(a0),-$c(a4) largest cmp.l #0,a1 if zero, use standard data beq fnt1a move.l a1,-$10(a4) else use mine bra fnt2a fnt1a move.l $4c(a0),-$10(a4) standard data fnt2a move.l $48(a0),-$4(a4) pointer to offset table rts a_line_start dc.l 0 fontaddress_8 dc.l 0 fontaddress_16 dc.l 0 * there is a macro called font 8 (font 16) that will activate * any font previously loaded. See shell.s for full details *--------------------------------------------------------- * a font is 4096 bytes in hi-res (256 characters * 16 lines) * 512 bytes * 8 sectors = 4096 * the first 256 bytes cover the top line of the 256 characters, * the next 256 bytes cover the next scan line etc.. * IMG files are 32*32 *-------------------- set_screen move.w d0,-(sp) ;do a set_screen operation move.l a0,-(sp) ;rez in d0 move.l a0,-(sp) ;base addr in a0 move.w #5,-(sp) ;sets logbase and physbase trap #14 add.l #12,sp rts *------------ res_mem move.l d0,-(sp) ;reserve memory move.w #$48,-(sp) ;amount in d0 trap #1 addq.l #6,sp rts *------------ * edit a string of ASCII decimal characters by replacing * leading zeroes with blanks [ G.Kane 1986 ] * string to be edited expected in A0 (L) (or pointer?) * length of string expected in D2 * examples in Speculator and Final Lap lead_zeroes char_0 equ '0' blank_sp equ ' ' movem.l d0-d2/a0,-(sp) moveq #char_0,d0 initialize with ascii 0 moveq #blank_sp,d1 same tst.w d2 beq.s lead9 if length =0 then done subq.w #1,d2 adjust ctr for dbra lead1 cmp.b (a0)+,d0 is current char zero? bne.s lead9 move.b d1,-1(a0) replace zero with blank dbra d2,lead1 lead9 movem.l (sp)+,d0-d2/a0 rts * see examples in shell.s in speculator, final lap and moneyspinner * used for scores, time and other numeric variables * usually called prior to printing an ascii value on screen *------------ * adapted from JL's vertical scroll routine [ January 1989 ] * Full working example in 'Operation Angelica' and 'Sea King' * address of variables block expected in A6 * image_start in -12 (L) logical_screen in -8 physical_screen in -4 * scroll_index in 0 scroll_direction in +2 image_size-200 in +6 (w) * scroll_stepper in scroll_stepper (w) * weird effects when origin and destination are same or nearby * see end of this section jeff_scroll main_loop movea.l logical_screen,a0 logical screen to write to add.l #20*160,a0 sea king line ONLY movea.l image_start,a1 origin screen (image start) move scroll_index,d0 the pointer along the origin (1 line a time) bsr scroll_120 120 bytes wide (3/4 screen wide) * at this point we bsr toggle_screens rts (bra main_loop ) *------------------------------- scroll_120 movem.l d1-d7/a2-a6,-(a7) save registers mulu #160,d0 adda.l d0,a1 final start address move.l a1,image_position store for subsequent use move #163-1,-(a7) number of lines on screen (normally 199) scroll_frame_lp2 movem.l (a1)+,d0-d7/a2-a6 52 bytes movem.l d0-d7/a2-a6,(a0) movem.l (a1)+,d0-d7/a2-a6 52+52=104 bytes movem.l d0-d7/a2-a6,52(a0) movem.l (a1)+,d0-d3 movem.l d0-d3,104(a0) 104+28=120 lea 160(a0),a0 to start of line 2 destination add.l #40,a1 to start of line 2 origin (160-120=40) subq #1,(a7) deduct 1 from loop counter bne.s scroll_frame_lp2 addq.l #2,a7 reset the stack pointer movem.l (a1)+,d0-d7/a2-a4 now the last line movem.l d0-d7/a2-a4,(a0) 44 bytes movem.l (a1)+,d0-d7/a2-a4 movem.l d0-d7/a2-a4,44(a0) +44 again movem.l (a1)+,d0-d7 movem.l d0-d7,88(a0) +32=120 movem.l (a7)+,d1-d7/a2-a6 restore registers rts *--------------- scroll160 movea.l logical_screen,a0 movea.l image_start,a1 move scroll_index,d0 bsr scroll_160 160 bytes wide * at this point we bsr toggle_screens rts (bra main_loop ) scroll_160 * this one scrolls the whole width (160 bytes) movem.l d1-d7/a2-a6,-(a7) mulu #160,d0 adda.l d0,a1 move #113,-(a7) number of loops required 153 scroll_lp2 movem.l (a1)+,d0-d7/a2-a6 52 bytes movem.l d0-d7/a2-a6,(a0) movem.l (a1)+,d0-d7/a2-a6 52+52=104 bytes movem.l d0-d7/a2-a6,52(a0) movem.l (a1)+,d0-d7/a2-a6 now 156 movem.l d0-d7/a2-a6,104(a0) movem.l (a1)+,d0-d7/a2-a6 now 208 movem.l d0-d7/a2-a6,156(a0) lea 208(a0),a0 to start of line 2 destination subq #1,(a7) deduct 1 from loop counter bne.s scroll_lp2 addq.l #2,a7 reset the stack pointer movem.l (a1)+,d0-d7/a2-a4 now the last line movem.l d0-d7/a2-a4,(a0) 44 bytes movem.l (a1)+,d0-d7/a2-a4 movem.l d0-d7/a2-a4,44(a0) +44 again movem.l (a1)+,d0-d7/a2-a4 movem.l d0-d7/a2-a4,88(a0) movem.l (a1)+,d0-d7/a2-a4 movem.l d0-d7/a2-a4,132(a0) movem.l (a7)+,d1-d7/a2-a6 restore registers rts * total 147046 cycles *--------------- * scroll_variables scroll_index dc.w 0 vert scroll index offset 0 scroll_direction dc.w 1 scroll direction +2 scroll_stepper dc.w 0 scroll incr image_size dc.w 400 size of scenery minus 200 image_start dc.l 0 image_position dc.l 0 image_start + scroll_index * 160 *-------------------------------------------- * include 5 * not always included automatically * routines may be pulled using F3-Alt I * sound routines: R_EPLAY (ST replay) *------------------------------------ * sound REPLAY system [ RACINE 2-bit system ] * see example in shell.s * load the tune, pass the parameters, then jsr r_eplay * there is also a macro <<< * see numerous examples in shell.s speculator.s moneyspinner.s etc... * Registers used: * IN A5 start address D5 length of tune D4 frequency 0-7 * not used: * even mfp EQU $FFFA00 the multi-function peripheral 68901 iera EQU mfp+7 Interrupt Enable Register A (reg#4) ; initially found as holding 30 ; bit 5 is timer A so poke 32 in this register ; any disabled bit is ignored. ierb EQU mfp+9 not needed. Poke a 0 in this one (reg#5) ; initially found as 100 ipra EQU mfp+11 Interrupt pending register (reg#6) ; not used by this routine isra EQU mfp+15 Interrupt service regs (not used) imra EQU mfp+19 Interrupt Mask regs (reg#8) ; initially found as 30 ; in our case set to 32 again (bit 6 set) imrb EQU mfp+21 (reg#9) set to 0 ; again found as 100 vector EQU mfp+23 bit 3 is cleared when in ; automatic end of Interrupt mode. ; initially found as 72 tacr EQU mfp+25 Timer A control reg#13 first ; disabled with 0 then reset with appropriate number ; initially found as 0 tadr EQU mfp+31 Timer A data reg#14 ; initially found with 255 isrvec EQU $134 ; SR initially found as 8196 ($2004) 00100000 00000100 * THE PROGRAMME * r_eplay add.l a5,d5 BSR savemfp save natural MFP conditions ; SR was 8196 ($2004) 00100000 00000100 ; iera 30 ierb 100 imra 30 imrb 100 tacr 0 tadr 255 vector 72 MOVE.W #$2700,SR interrupts off LEA inull,A0 move.l a0,$134 interr routine vector ; $134 is user application /timer A initially disabled ; $120 is Timer B (H/B ct) $ etc ($100 to $140 MFP int vectors) BSR setfreq held in D4 ; at this point tacr has changed from 0 to 5 ; and tadr is still 255 BSR enabmfp set mfp running ; imra 30 now 32 iera 30 now 32 ierb & imrb 100 now 0 ; vector 72 now 3 BSR setsnd set up sound registers ; basically all set to 0, except channel 7 (mixing) set to $FF lea $ff8800,a4 sound chip lea snd_out,a3 lookup tables LEA ireplay,a0 set up output code address move.l a0,$134 ST inuse MOVE.W #$2500,SR enable level 6 interrupts ; that's % 10010100 00000000 * now wait for thr interrupt to do its business move.l #shades,a0 idle btst #0,colorwave beq idle1 move.w (a0),$ff8240 add.w #1,(a0) cmp.w #$700,(a0) bmi idle1 move.w #0,(a0) idle1 nop nop nop idle2 lea $fffc00,a1 acia k/board address move.b 0(a1),d1 get acia status btst #7,d1 interrupt request? beq idle3 tst.b $a32 keyboard state bne idle3 move.b 2(a1),d0 get data from acia cmp.b #$f6,d0 keypress? above, it's not bcc idle3 no. some other package * cmp.b #$39,d0 space? * bne idle3 move.b #1,keyhit bra ex_it idle3 TST.B inuse sample finished? BNE.S idle br if not ex_it MOVE.W #$2700,SR disable interrupts BSR oldmfp restore original mfp data BSR enmouse enable mouse bsr flushout stop flood from k/board intson MOVE.W #$2000,SR restore ints for o.s. RTS shades DC.W 0 colorwave dc.w 0 keyhit DC.b 0,0,0,0 *------------ flushout btst.b #0,$fffc00 kbdcont beq.s flush9 is it working?? move.b $fffc02,d0 kbddata bra.s flushout flush9 rts *------------ * THE INTERRUPT SERVICE ROUTINES * inull RTE * replay from memory ireplay movem.l a2-a3,-(sp) full a0-a6 cut out sound! MOVE.B (A5)+,D7 read from ram CMP.L D5,A5 exceeded end stop BGE.S haltrep branch if so * output routine a note is played each time we come here. AND.W #$FF,D7 mask rubbish ADD.B #$80,D7 sign value LSL.W #3,D7 double L word offset MOVE.L 0(A3,D7.W),D3 get data #1 MOVE.W 4(A3,D7.W),D2 get data #2 MOVEP.L D3,0(A4) play #1 MOVEP.W D2,0(A4) play #2 sub.w #6,d6 the next four lines... tst.w d6 smooth out the scroll lines.. bne ire2 and have varied effects... * move.w #$000,$ff8240 according to d6 setting... move.w #65000,d6 and the sub.w increment ire2 movem.l (sp)+,a2-a3 RTE haltrep MOVE.W #$2700,SR LEA inull,a0 remove replay int move.l a0,$134 SF inuse MOVE.W #$2500,SR movem.l (sp)+,a2-a3 RTE * here is a sample routine running on MFP interrupt 8 (h/b counter) int_2 move.l a0,-(sp) move.w shades,$ff8240 add.w #1,shades cmp.w #$770,shades bmi int_29 move.w #0,shades int_29 lea.l $fffa01,a0 K.Garroch uses it.. bclr #0,14(a0) to exit a h/b mfp interrupt move.l (sp)+,a0 rte * THE SYSTEM SUB-ROUTINES * SAVEMFP MOVE.B iera,mfpmem preserve mfp registers ... MOVE.B ierb,mfpmem+1 ... in temporary storage MOVE.B imra,mfpmem+2 MOVE.B imrb,mfpmem+3 MOVE.B tadr,mfpmem+4 MOVE.B tacr,mfpmem+5 MOVE.B vector,mfpmem+6 RTS OLDMFP MOVE.B mfpmem+6,vector restore them MOVE.B mfpmem+5,tacr MOVE.B mfpmem+4,tadr MOVE.B mfpmem+3,imrb MOVE.B mfpmem+2,imra MOVE.B mfpmem+1,ierb MOVE.B mfpmem,iera RTS * IKBD enable/disable dismous movem.l d0-d3/a0-a3,-(sp) PEA skbddis keyboard off string address ($12,1A) MOVE.W #1,-(A7) length of string -1 MOVE.W #25,-(A7) (ikbdws) send order TRAP #14 ADDQ.L #8,A7 movem.l (sp)+,d0-d3/a0-a3 RTS enmouse movem.l d0-d3/a0-a3,-(sp) PEA skbden keys on again / string address ($8) MOVE.W #0,-(A7) length of string -1 MOVE.W #25,-(A7) (ikbdws) send order TRAP #14 ADDQ.L #8,A7 movem.l (sp)+,d0-d3/a0-a3 RTS skbddis DC.B $12,$1A maybe it should be $13 (stop reporting) skbden DC.B $8 maybe it should be $11 (resume)...(see yello.s) ; 524 * set MFP timer to generate interrupts (D4 freq 0 to 7) SETFREQ MOVE.B #0,tacr disable timer MFP + $19 AND.W #7,D4 ensure 0-7 LEA freqtab,a0 get freq xref address LSL.W #1,D4 convert to word table offset MOVE.W 0(a0,D4.W),D4 & get mfp data MOVE.B D4,tacr LSB = control reg byte MPF + $19 LSR.W #8,D4 shift down next byte MOVE.B D4,tadr next = data reg byte MFP + $1F RTS enabmfp MOVE.B #32,imra MFP + $13 MOVE.B #0,imrb MFP + $15 MOVE.B #32,iera MFP + $7 MOVE.B #0,ierb MFP + $9 BCLR.B #3,vector MFP + $17 RTS * set up sound registers 0-10 SETSND MOVE.B #0,$ff8800 channel A MOVE.B #0,$ff8802 MOVE.B #1,$ff8800 command register MOVE.B #0,$ff8802 data register MOVE.B #0,$ff8802 MOVE.B #2,$ff8800 channel B MOVE.B #0,$ff8802 MOVE.B #3,$ff8800 MOVE.B #0,$ff8802 MOVE.B #4,$ff8800 channel C MOVE.B #0,$ff8802 MOVE.B #5,$ff8800 MOVE.B #0,$ff8802 MOVE.B #7,$ff8800 set up channel mixing & port 'A' I/O MOVE.B #$FF,$ff8802 MOVE.B #8,$ff8800 set all volumes to zero MOVE.B #0,$ff8802 MOVE.B #9,$ff8800 MOVE.B #0,$ff8802 MOVE.B #10,$ff8800 MOVE.B #0,$ff8802 RTS *---------- * INTERNAL SOUND LOOKUP TABLE. EVEN SND_OUT DC.W $80C,$90B,$A09,0,$80C,$90B,$A09,0 DC.W $80D,$908,$A08,0,$80B,$90B,$A0B,0 DC.W $80D,$909,$A05,0,$80C,$90B,$A08,0 DC.W $80D,$909,$A02,0,$80D,$908,$A06,0 DC.W $80C,$90B,$A07,0,$80D,$907,$A07,0 DC.W $80C,$90B,$A06,0,$80C,$90A,$A09,0 DC.W $80B,$90B,$A0A,0,$80C,$90B,$A02,0 DC.W $80C,$90B,$A00,0,$80C,$90A,$A08,0 DC.W $80D,$906,$A04,0,$80D,$905,$A05,0 DC.W $80D,$905,$A04,0,$80C,$909,$A09,0 DC.W $80D,$904,$A03,0,$80B,$90B,$A09,0 DC.W $80C,$90A,$A05,0,$80B,$90A,$A0A,0 DC.W $80C,$909,$A08,0,$80B,$90B,$A08,0 DC.W $80C,$90A,$A00,0,$80C,$90A,$A00,0 DC.W $80C,$909,$A07,0,$80B,$90B,$A07,0 DC.W $80C,$909,$A06,0,$80B,$90B,$A06,0 DC.W $80B,$90A,$A09,0,$80B,$90B,$A05,0 DC.W $80A,$90A,$A0A,0,$80B,$90B,$A02,0 DC.W $80B,$90A,$A08,0,$80C,$907,$A07,0 DC.W $80C,$908,$A04,0,$80C,$907,$A06,0 DC.W $80B,$909,$A09,0,$80C,$906,$A06,0 DC.W $80A,$90A,$A09,0,$80C,$907,$A03,0 DC.W $80B,$90A,$A05,0,$80B,$909,$A08,0 DC.W $80B,$90A,$A03,0,$80A,$90A,$A08,0 DC.W $80B,$90A,$A00,0,$80B,$909,$A07,0 DC.W $80B,$908,$A08,0,$80A,$90A,$A07,0 DC.W $80A,$909,$A09,0,$80C,$901,$A01,0 DC.W $80A,$90A,$A06,0,$80B,$908,$A07,0 DC.W $80A,$90A,$A05,0,$80A,$909,$A08,0 DC.W $80A,$90A,$A02,0,$80A,$90A,$A01,0 DC.W $80A,$90A,$A00,0,$809,$909,$A09,0 DC.W $80A,$908,$A08,0,$80B,$908,$A01,0 DC.W $80A,$909,$A06,0,$80B,$907,$A04,0 DC.W $80A,$909,$A05,0,$809,$909,$A08,0 DC.W $80A,$909,$A03,0,$80A,$908,$A06,0 DC.W $80A,$909,$A00,0,$809,$909,$A07,0 DC.W $809,$908,$A08,0,$80A,$908,$A04,0 DC.W $809,$909,$A06,0,$80A,$908,$A01,0 DC.W $809,$909,$A05,0,$809,$908,$A07,0 DC.W $808,$908,$A08,0,$809,$909,$A02,0 DC.W $809,$908,$A06,0,$809,$909,$A00,0 DC.W $809,$907,$A07,0,$808,$908,$A07,0 DC.W $809,$907,$A06,0,$809,$908,$A02,0 DC.W $808,$908,$A06,0,$809,$906,$A06,0 DC.W $808,$907,$A07,0,$808,$908,$A04,0 DC.W $808,$907,$A06,0,$808,$908,$A02,0 DC.W $807,$907,$A07,0,$808,$906,$A06,0 DC.W $808,$907,$A04,0,$807,$907,$A06,0 DC.W $808,$906,$A05,0,$808,$906,$A04,0 DC.W $807,$906,$A06,0,$807,$907,$A04,0 DC.W $808,$905,$A04,0,$806,$906,$A06,0 DC.W $807,$906,$A04,0,$807,$905,$A05,0 DC.W $806,$906,$A05,0,$806,$906,$A04,0 DC.W $806,$905,$A05,0,$806,$906,$A02,0 DC.W $806,$905,$A04,0,$805,$905,$A05,0 DC.W $806,$905,$A02,0,$805,$905,$A04,0 DC.W $805,$904,$A04,0,$805,$905,$A02,0 DC.W $804,$904,$A04,0,$804,$904,$A03,0 DC.W $804,$904,$A02,0,$804,$903,$A03,0 DC.W $803,$903,$A03,0,$803,$903,$A02,0 DC.W $803,$902,$A02,0,$802,$902,$A02,0 DC.W $802,$902,$A01,0,$801,$901,$A01,0 DC.W $802,$901,$A00,0,$801,$901,$A00,0 DC.W $801,$900,$A00,0,$800,$900,$A00,0 DC.W $80E,$90D,$A0C,0,$80F,$903,$A00,0 DC.W $80F,$903,$A00,0,$80F,$903,$A00,0 DC.W $80F,$903,$A00,0,$80F,$903,$A00,0 DC.W $80F,$903,$A00,0,$80E,$90D,$A0B,0 DC.W $80E,$90D,$A0B,0,$80E,$90D,$A0B,0 DC.W $80E,$90D,$A0B,0,$80E,$90D,$A0B,0 DC.W $80E,$90D,$A0B,0,$80E,$90D,$A0B,0 DC.W $80E,$90D,$A0A,0,$80E,$90D,$A0A,0 DC.W $80E,$90D,$A0A,0,$80E,$90D,$A0A,0 DC.W $80E,$90C,$A0C,0,$80E,$90D,$A00,0 DC.W $80D,$90D,$A0D,0,$80D,$90D,$A0D,0 DC.W $80D,$90D,$A0D,0,$80D,$90D,$A0D,0 DC.W $80D,$90D,$A0D,0,$80D,$90D,$A0D,0 DC.W $80E,$90C,$A0B,0,$80E,$90C,$A0B,0 DC.W $80E,$90C,$A0B,0,$80E,$90C,$A0B,0 DC.W $80E,$90C,$A0B,0,$80E,$90C,$A0B,0 DC.W $80E,$90C,$A0B,0,$80E,$90C,$A0B,0 DC.W $80E,$90C,$A0A,0,$80E,$90C,$A0A,0 DC.W $80E,$90C,$A0A,0,$80E,$90C,$A0A,0 DC.W $80D,$90D,$A0C,0,$80D,$90D,$A0C,0 DC.W $80E,$90C,$A09,0,$80E,$90C,$A09,0 DC.W $80E,$90C,$A05,0,$80E,$90C,$A00,0 DC.W $80E,$90C,$A00,0,$80E,$90B,$A0B,0 DC.W $80E,$90B,$A0B,0,$80E,$90B,$A0B,0 DC.W $80E,$90B,$A0B,0,$80E,$90B,$A0A,0 DC.W $80E,$90B,$A0A,0,$80E,$90B,$A0A,0 DC.W $80D,$90D,$A0B,0,$80D,$90D,$A0B,0 DC.W $80D,$90D,$A0B,0,$80E,$90B,$A09,0 DC.W $80E,$90B,$A09,0,$80E,$90B,$A09,0 DC.W $80D,$90C,$A0C,0,$80D,$90D,$A0A,0 DC.W $80E,$90B,$A07,0,$80E,$90B,$A00,0 DC.W $80E,$90B,$A00,0,$80D,$90D,$A09,0 DC.W $80D,$90D,$A09,0,$80E,$90A,$A09,0 DC.W $80D,$90D,$A08,0,$80D,$90D,$A07,0 DC.W $80D,$90D,$A04,0,$80D,$90D,$A00,0 DC.W $80E,$90A,$A04,0,$80E,$909,$A09,0 DC.W $80E,$909,$A09,0,$80D,$90C,$A0B,0 DC.W $80E,$909,$A08,0,$80E,$909,$A08,0 DC.W $80E,$909,$A07,0,$80E,$908,$A08,0 DC.W $80E,$909,$A01,0,$80C,$90C,$A0C,0 DC.W $80D,$90C,$A0A,0,$80E,$908,$A06,0 DC.W $80E,$907,$A07,0,$80E,$908,$A00,0 DC.W $80E,$907,$A05,0,$80E,$906,$A06,0 DC.W $80D,$90C,$A09,0,$80E,$905,$A05,0 DC.W $80E,$904,$A04,0,$80D,$90C,$A08,0 DC.W $80D,$90B,$A0B,0,$80E,$900,$A00,0 DC.W $80D,$90C,$A06,0,$80D,$90C,$A05,0 DC.W $80D,$90C,$A02,0,$80C,$90C,$A0B,0 DC.W $80C,$90C,$A0B,0,$80D,$90B,$A0A,0 DC.W $80D,$90B,$A0A,0,$80D,$90B,$A0A,0 DC.W $80D,$90B,$A0A,0,$80C,$90C,$A0A,0 DC.W $80C,$90C,$A0A,0,$80C,$90C,$A0A,0 DC.W $80D,$90B,$A09,0,$80D,$90B,$A09,0 DC.W $80D,$90A,$A0A,0,$80D,$90A,$A0A,0 DC.W $80D,$90A,$A0A,0,$80C,$90C,$A09,0 DC.W $80C,$90C,$A09,0,$80C,$90C,$A09,0 DC.W $80D,$90B,$A06,0,$80C,$90B,$A0B,0 DC.W $80C,$90C,$A08,0,$80D,$90B,$A00,0 DC.W $80D,$90B,$A00,0,$80C,$90C,$A07,0 DC.W $80C,$90C,$A06,0,$80C,$90C,$A05,0 DC.W $80C,$90C,$A03,0,$80C,$90C,$A01,0 DC.W $80C,$90B,$A0A,0,$80D,$90A,$A05,0 DC.W $80D,$90A,$A04,0,$80D,$90A,$A02,0 DC.W $80D,$909,$A08,0,$80D,$909,$A08,0 * MFP/FREQUENCY TABLE * EVEN FREQTAB DC.W $506 DC.W $505 DC.W $405 DC.W $2901 DC.W $1F01 DC.W $802 DC.W $405 DC.W $405 * DEFINE PROGRAM STORAGE EVEN mfpmem DS.B 8 inuse DS.B 1 even *---include6.s ----- obsolete or seldom used * include 6 * not included automatically * routines must be pulled using F3-Alt I * BIN_DEC DEC_BIN Peter Hibbs * COLOR CYCLING * WHEATON NESSAGE SCROLLER * BINASCII BINHEX * POPPLE VERTICAL SCREEN SCROLLER * GARROCH RANDOM * REVEAL_ALL * REVEAL_BIT * SPARKS SCREN FILL * CAMY'S SIMPLE SPRITE * GRAY'S STARFIELD * COLLISION DETECTION * POPPLE'S LEFT/RIGHT SCROLL * MARVEY'S FLIP * PIXEL PLOT (Chris Skellern) * KEYBOARD BUFFER *---------------------------------------------------- * bin_dec [ Peter Hibbs Aug 89 ] * enter with d0.l as a binary value * exit with d0.w holding ascii character in low byte bin_dec movem.l d0-d2/a0,-(sp) tst.l d0 beq bd5 display answer as 0 move.l d0,d2 move.l #10-1,d1 loop notice the L move.l #dtable-4,a0 look up table bd1 adda.l #4,a0 next table entry move.w #"0"-1,d0 ascii 0 less 1 bd2 addq #1,d0 inc ascii value sub.l (a0),d2 value power of 10 bcc bd2 repeat till underflow add.l (a0),d2 restore last value cmp.b #"0",d0 bne bd3 btst #31,d1 flag beq bd4 bd3 bset #31,d1 set flag bsr output_char bd4 dbra d1,bd1 repeat till done bd6 movem.l (sp)+,d0-d2/a0 rts bd5 move.w #'0',d0 bsr output_char bra bd6 output_char movem.l a0-a2/d0-d2,-(sp) move.w d0,-(sp) push character move.w #2,-(sp) trap #1 display character at cursor addq.l #4,sp movem.l (sp)+,a0-a2/d0-d2 rts dtable dc.l 1000000000,100000000,10000000,1000000,100000,10000 dc.l 1000,100,10,1 * dec_bin entry a0 points to decimal value in ram * mustn't start with a nought * exit d0.l value in binary dec_bin movem.l d1/a0-a1,-(sp) db1 add.l #1,a0 next address bsr number_check bcc db1 yes. repeat sub.l #1,a0 lea dtable+36,a1 point to last entry clr.l d0 db2 clr.l d1 move.b (a0),d1 fetch number sub.b #"0"+1,d1 set up repeats db3 add.l (a1),d0 add decimal power dbra d1,db3 sub.l #1,a0 next decimal power sub.l #4,a1 next table entry bsr number_check outside limits? bcc db2 no. repeat movem.l (sp)+,d1/a0-a1 rts * tst (a0) for numerical value in ascii (0-9) * entry a0 points to ram address holding character * exit: carry set to 1 if out of range * carry cleared to 0 if numeric value (48-57) number_check cmp.b #48,(a0) ascii for 0 bcs nchk1 return if (a0) < '0' cmp.b #'9'+1,(a0) check if above 9 (ascii 58) eor #1,ccr invert carry flag! nchk1 rts * extraordinary use of carry to determine a range! * the cmp.b #'9' is merely used to force a status read *----------------------------------------------------- * Color Cycling [ Camy Maertens ] 18 Sept 87 * enter with 3 color numbers in D1,D2,D3 (W) ex: 0 to 30 * and delay in D4 (L) ex:MOVE.L #1000,D4 (average) * note: double the numbers ie color 3 is entered as six * word boundary reason. Not quite working cycling MOVEM.L D4-D6/A0-A3,-(SP) clr.l d6 lea $ff8240,a0 lea 0(a0,d1),a1 lea 0(a0,d2),a2 lea 0(a0,d3),a3 MOVE.L #2,D5 (3 loops) c_cyc1 MOVE.w (A1),d6 temp store MOVE.w (A3),(A1) MOVE.w (A2),(A3) MOVE.w d6,(A2) c_cyc2 dbra d4,c_cyc2 delay move.l $466,d0 wait_cc cmp.l $466,d0 wait vt sync beq wait_cc DBRA D5,c_cyc1 MOVEM.L (SP)+,D4-D6/A0-A3 RTS *------------ * COLOR CYCLING Jan 1988 * Degas holds its info as follows: * 32042 right boundary 32024 left boundary (0-15) * 32058 cycling speed (0-128) speed=(128-cycling speed)*90 * direction 32050 0 left 1 off 2 right * This routine cycles the first six colors col_cycling movem.l d0-d7,-(sp) clr.l d0 move.l #5,d3 counter colcyc1 move.w $ff824a,d0 move.w $ff8248,$ff824a move.w $ff8246,$ff8248 move.w $ff8244,$ff8246 move.w $ff8242,$ff8244 move.w $ff8240,$ff8242 move.w d0,$ff8240 wait 4 dbra d3,colcyc1 movem.l (sp)+,d0-d7 rts *----------- * Wheaton scroll [Gary Wheaton September 22 1988] * this one scrolls a message right to left at the bottom of screen * provided a degas file called 'alphabet.pi1' has first been loaded * to use, just jsr garycode wheaton_scroll garycode move.l $466,d7 .wait cmp.l $466,d7 beq .wait MOVE #24,D2 24 move.l $44e,a1 add.l lin,a1 ADD.L #160,A1 .lp MOVE.L A1,A0 \SCROLL SCREEN BYTES MOVE #19,D1 19 .p2 MOVE.B -1(A0),D0 MOVE.B D0,D3 LSR.B #4,D0 CMP #18,D1 BEQ .ms OR.B D0,-8(A0) .ms ASL.B #4,D3 MOVE.B D3,-1(A0) MOVE.B (A0),D0 MOVE.B D0,D3 LSR.B #4,D0 OR.B D0,-1(A0) ASL.B #4,D3 MOVE.B D3,(A0) ADD.L #8,A0 DBRA D1,.p2 .op ADD.L #160,A1 DBRA D2,.lp MOVE.L #TXT,A0 get start of text in file 'text.s' EOR.B #1,MPP BNE.S OKK ADD #1,PPIX CMP #4,PPIX BNE.S OKK ADD #1,INDX MOVE #0,PPIX OKK ADD INDX,A0 MOVE.B (A0),D0 character to print CMP.B #0,D0 BNE.S FGH MOVE #0,INDX reset scroll on 0 fgh cmp.b #32,d0 bne .g move.b #91,d0 space, just after Z .g SUB #65,D0 a= ascii 65 MOVE PPIX,D1 AND #1,D1 MOVE PPIX,D2 AND #65534,D2 ASL #2,D2 ASL #4,D0 ADD D1,D0 ADD D2,D0 sdf DIVU #160,D0 \GET CHR FROM DEGAS SCREEN MOVE D0,D1 MULU #50,D1 MOVE.L D0,DDD CLR.L D0 MOVE DDD,D0 MULU #160,D1 MOVE.L alpha_ptr,a4 adda.w #34,a4 ADD D0,A4 ADD D1,A4 move.l $44e,a0 add.l lin,a0 add.l #152,a0 add.l #160,a0 MOVE #151,D6 KLP MOVE.B (A4),D0 CMP.B #0,MPP BNE WES LSR.B #4,D0 BRA DFV WES AND.B #15,D0 DFV OR.B D0,(A0) P3 ADD.L #160,A0 ADD.L #320,A4 ADD #2,D6 CMP #200,D6 BLT KLP RTS DDD DC.L 0 MPX DC.B 0,0 MPP DC.B 0,1 VT DC.W 0 INDX DC.W 0 PPIX DC.W 0 txt dc.b "hello",0 lin dc.l 16000 alpha_ptr dc.l 0 alphabetfile dc.b "alphabet.pi1" even *---------- binascii movea.l #string+16,a0 16 moveq #15,d0 15 move.b #'0',d1 move.w number,d2 l binas1 move.b d1,-(a0) ror.w #1,d2 w bcc.s binas2 addi.b #1,(a0) binas2 dbra d0,binas1 rts string dc.b 16 number dc.l 0 *---------------- * binhex- binary to ASCII hex * Enter with: * d0=binary (long) * a0=output buffer (8 bytes) binhex movem.l d0-d2/a1,-(sp) lea.l hextab,a1 adda.l #8,a0 move.l #7,d1 hexlp1 move.l d0,d2 andi.l #15,d2 move.b 0(a1,d2.l),-(a0) lsr.l #4,d0 dbra d1,hexlp1 movem.l (sp)+,d0-d2/a1 rts hextab dc.b '0123456789abcdef' even *------------ * vertical screen scroll * POPPLE * Whole screen 1 pixel UP. (12 times in this example) 1 plane only. vert movem.l a0-a3,-(sp) move.l $44e,a0 ; put screen end in a0 add #480,a0 [see below] lea.l 320(a0),a1 ; find pixel above a0 move.l #11,d1 number of scrolls up (1 pixel a time) ; 12 * 2 = 24 lines to go handle move.l a0,a2 ; save a0, screen end move.l a1,a3 ; save a1, point above a0 vloop2 move.l a2,a0 ; reset screen end move.l a3,a1 ; reset point above screen end move.l #3900,d0 ; 8k of long words, do 32k screen vloop move.w (a1),(a0) ; decrement and move contents addq #8,a0 addq #8,a1 ; alternatively move.w (a1)+,(a0)+ 4 times and no addq ; all 4 planes will go up but not so smooth dbra d0,vloop ; loop repeat 3900 times dbra d1,vloop2 ; loop number of screen lines to shift movem.l (sp)+,a0-a3 rts * [ we start with 480/320/11 normal speed normal spacing * 480/160/22 is slower. same spacing * 480/480/7 is faster same spacing * 480/480/15 is as fast, larger spacing * 480/960/7 is very fast * 480/1120 catches a lines 480/1280 catches 2 and so on. no good *] *------------ * returns random number in D0 * note: preserve any active D0 prior to calling * ex: bsr random and.w #127,d0 randm move.l rnd1,d0 $462,d0 lsl.l #1,d0 btst #23,d0 bne.s rndh btst #1,d0 bne.s rndl rts rndh btst #1,d0 bne rndhl rndl addq.l #1,d0 rndhl rts *---------------------- * Reveal D0 through D7 in Decimal [ Camy Maertens ] * replaced by reveal_regs in include1 reveal_all move.l d0,-(sp) modified march 89 move.l d7,-(sp) save originals move.l d6,-(sp) move.l d5,-(sp) move.l d4,-(sp) move.l d3,-(sp) move.l d2,-(sp) move.l d1,-(sp) move.l d0,-(sp) print cursor12 lea errbuf(PC),A0 move.l (sp)+,d0 retrieve d0 bsr bindec bsr printline print space move.l (sp)+,d0 retrieve d1 LEA errbuf(PC),A0 BSR bindec BSR printline print space move.l (sp)+,d0 retrieve d2 LEA errbuf(PC),A0 BSR bindec BSR printline print space move.l (sp)+,d0 retrieve d3 LEA errbuf(PC),A0 BSR bindec BSR printline print cursor13 move.l (sp)+,d0 retrieve d4 LEA errbuf(PC),A0 BSR bindec BSR printline print space move.l (sp)+,d0 retrieve d5 LEA errbuf(PC),A0 BSR bindec BSR printline print space move.l (sp)+,d0 retrieve d6 LEA errbuf(PC),A0 BSR bindec BSR printline print space move.l (sp)+,d0 retrieve d7 LEA errbuf(PC),A0 BSR bindec BSR printline move.l (sp)+,d0 final retrieve (march 89) RTS cursor12 DC.B 27,"Y",42,32,0 cursor13 DC.B 27,"Y",44,32,0 *--------------------------- * REVEAL BIT * enter with the Long Word to be revealed in D0 * if a carriage return is required, move.w #1,line_down reveal_bit MOVEM.L D0-D7/A0-A6,-(SP) move.l d0,d7 lea line_down(pc),a0 cmp.w #0,(a0) beq rev6 print linedown_1 rev6 print c_r rev6a MOVE.W #31,D5 rev2 BTST d5,d7 BEQ rev4 bra rev3 rev8 CMP.W #24,D5 BEQ rev7 CMP.W #16,D5 BEQ rev7 CMP.W #8,D5 BEQ rev7 rev5 DBRA D5,rev2 bra rev1 print c_r DBRA D5,rev1 rev1 BSR getkey MOVEM.L (SP)+,D0-D7/A0-A6 RTS rev3 LEA one_bit(PC),A0 BSR printline BRA rev8 rev4 LEA nought_bit(PC),A0 BSR printline BRA rev8 rev7 LEA space(PC),A0 BSR printline BRA rev5 c_r DC.B 13,0 was " ",13,0 l_f DC.B 10,0 space DC.B " ",0 line_down DC.B 0 linedown_1 DC.B " ",13,10,0 one_bit DC.B "1",0 nought_bit DC.B "0",0 EVEN *------------- * Routine to fill screen with block pointed to by a0 * Malcolm Sparks May 1989 scr_fill move.l a0,a6 Get block address movem.l (a6),d0-d7/a0-a5 Move data into register block move.l logical_screen,a6 add #32000,a6 Blitting goes backwards ; No 68000 option to post-increment ; 571*14 + 6 fills up the whole screen REPT 571 Repeats faster than DBRA constructs movem.l d0-d7/a0-a5,-(a6) Blit on ENDR movem.l d0-d5,-(a6) rts Return to main program *---------- * how to display a 16*16 sprite [ Camy ] * quick version * spr_screen expected in A0 action ADDA.L #114,A0 LEA a_buffer(PC),A2 MOVE.L new_pos,A1 MOVE.L old_pos,A3 MOVE.W #13,D3 height .a2 MOVE.W #3,D4 width 16-1 .a3 MOVE.L (A2),(A3)+ RESTORE MOVE.L (A1),(A2)+ SAVE TARGET MOVE.L (A0)+,(A1)+ PRINT DBRA D4,.a3 ADD.W #144,A0 ADD.W #144,A1 ADD.W #144,A3 DBRA D3,.a2 RTS old_pos DS.L 1 new_pos DS.L 1 a_buffer DS.W 200 *------------ spriteroutine * (used by drawinvader) restores background OK * expects sprite buffer in A2 and * degas data in A0, newpos (target) in A1 * and oldpos (current) in A3 * sprite is assumed to be 16 * 16 MOVE.W #15,D3 height .a2 MOVE.W #7,D4 width 16-1 .a3 MOVE.w (A2)+,(A3)+ restore DBRA D4,.a3 ADD.W #144,A3 DBRA D3,.a2 add.w #-256,a2 MOVE.W #15,D3 .a5 MOVE.W #7,D4 .a6 MOVE.w (a1),(a2)+ save target MOVE.w (A0)+,(a1)+ print to screen DBRA D4,.a6 ADD.W #144,A0 ADD.W #144,A1 DBRA D3,.a5 rts *------------ * this one is used by Deflector and co, * sprout2 MOVE.W #6,D3 height .a2 MOVE.W #7,D4 width 16-1 .a3 move.w #0,(a3)+ keep it black ;; MOVE.w (A2)+,(A3)+ restore DBRA D4,.a3 ADD.W #144,A3 DBRA D3,.a2 MOVE.W #6,D3 .a5 MOVE.W #7,D4 .a6 MOVE.w (A1),(A2)+ save target MOVE.w (A0)+,(A1)+ print to screen DBRA D4,.a6 ADD.W #144,A0 ADD.W #144,A1 DBRA D3,.a5 RTS *------------ * Universal Collision Detect [ Camy Maertens Oct 87 ] * Initially all objects are 8 by 8 collision_detect MOVE.W D4,D5 ADD.W #8,D5 MOVE.W D6,D7 ADD.W #8,D7 MOVE.W D0,D1 ADD.W #8,D1 MOVE.W D2,D3 ADD.W #12,D3 was 14, but down to 12 CMP.W D7,D2 top cc /bottom c BGT no_hit CMP.W D6,D3 top c /bottom cc BMI no_hit CMP.W D5,D0 top aa /bottom a BGT no_hit CMP.W D4,D1 top a /bottom aa BMI no_hit bset #0,collision rts no_hit bclr #0,collision RTS collision DC.W 0 *-------------- * this one, quite by accident, was perfect to detect two sprites: * ball and bat both 16*8, both moved by si's routines (L coord) * routine expects loose sprite (ball) x in d4 y in d6 * joystick/defender x (horiz) in d0 and y (altitude) in d2 detect MOVE.l D4,D5 d4 is BALL x horizontal left ADD.l #8,D5 d5 is BALL xx horizontal right MOVE.l D6,D7 d6 is BALL y altitude top ADD.l #8,D7 d7 is BALL yy altitude bottom MOVE.l D0,D1 d0 is JOY x horizontal left ADD.l #8,D1 d1 is JOY xx horizontal right MOVE.l D2,D3 d2 is JOY y altitude top ADD.l #10,D3 d3 is JOY yy altitude bottom CMP.l D7,D2 top cc /bottom c BGT no_hitt CMP.l D6,D3 top c/bottom cc BMI no_hitt CMP.l D5,D0 top aa /bottom a BGT no_hitt CMP.l D4,D1 top a /bottom aa BMI no_hitt bset #0,collision rts no_hitt bclr #0,collision RTS *-------------------------- * Fast horizontal Screen flip - Low res only. * left becomes right/ right becomes left * Marvey Mills - 03/01/88 * Example in SHELL.S (press G) * * IN: address of screen to be flipped in A0 * All other registers unaffected. * example: move.l $44e,a0 bsr f_flip (example in Final Lap) f_flip movem.l a1/d0-d4,-(sp) ;save the reggies move.l a0,a1 ;setup pointer to second block add.l #152,a1 ;a1 now points to last block of line move.w #199,d1 ;200 lines to flip flipline move.w #9,d2 ;setup loop count for block flip flipblok move.w (a0),d3 ;plane 1 word flip routine move.w (a1),d4 ;and bit reversals in Dx registers lsr.w #1,d4 ;for greater speed move.w #15,d0 ;setup bit reverse loop shftlp1 roxl.w #1,d3 ;flip bits in data registers roxr.w #1,d4 ;for greater speed dbra d0,shftlp1 ;til all done move.w d3,(a0) ;save out to memory move.w d4,(a1) move.w 2(a0),d3 ;plane 2 word flip move.w 2(a1),d4 lsr.w #1,d4 move.w #15,d0 shftlp2 roxl.w #1,d3 roxr.w #1,d4 dbra d0,shftlp2 move.w d3,2(a0) move.w d4,2(a1) move.w 4(a0),d3 ;plane 3 word flip move.w 4(a1),d4 lsr.w #1,d4 move.w #15,d0 shftlp3 roxl.w #1,d3 roxr.w #1,d4 dbra d0,shftlp3 move.w d3,4(a0) move.w d4,4(a1) move.w 6(a0),d3 ;plane 4 word flip move.w 6(a1),d4 lsr.w #1,d4 move.w #15,d0 shftlp4 roxl.w #1,d3 roxr.w #1,d4 dbra d0,shftlp4 move.w d3,6(a0) move.w d4,6(a1) addq.l #8,a0 ;block done- bump to next block subq.l #8,a1 dbra d2,flipblok ;all blocks done? add.l #80,a0 ;yes - bump to next line add.l #240,a1 dbra d1,flipline ;all lines done? movem.l (sp)+,a1/d0-d4 ;yep - restore reggies rts * ex: move.l $44e,a0 jsr f_flip *-------------------------------- * STARFIELD [Gary Wheaton October 88 ] * PLOTTER & GET POINT [ G.Wheaton. ] * with a dual screen, the problem is unplotting the correct screen * This routine plots a number of dots (stars) on the screen, * then replaces those dots with black, * then moves them about when joystick is moved * as used in Zenith and Ace invaders starfield MOVE $FF8240,bck MOVE #0,$ff8240 BRA STAR * at this point Gary has a trap call (joy vector) JOY DC.W 0 HJTB DC.B 0,0,0,0,1,1,1,0,-1,-1,-1 VJTB DC.B 0,-1,1,0,0,-1,1,0,0,-1,1 STAR MOVE.L #HTAB,A4 * bsr vtsync CLR.L D0 MOVE JOY,A0 MOVE.B (A0),D0 move.b joyport1,d0 CLR D4 CLR D6 MOVE.B HJTB(PC,D0),D4 \HZ MOVE.B VJTB(PC,D0),D6 \VT LP0 MOVE.B #0,D5 this must be the unplot MOVE (A4),D0 MOVE.B 91(A4),D1 BSR CPLOTT MOVE 180(A4),D0 CMP.B #10,D4 BGT OK move.b #2,d4 test only CMP.B #0,D4 BEQ OK1 BMI RIGHT SUB D0,(A4) BPL OK1 MOVE #320,(A4) MOVE.B 91(A4),D1 ROL.B #1,D1 RANDOMIZE VERT A BIT MOVE.B D1,91(A4) BRA OK1 RIGHT ADD D0,(A4) CMP #320,(A4) BLT OK1 CLR (A4) *\SHOULD RAND HERE ALSO OK1 CMP.B #0,D6 BEQ OK BPL UP SUB D0,90(A4) BPL OK2 MOVE #199,90(A4) BRA OK2 UP ADD D0,90(A4) CMP #200,90(A4) BLT OK2 CLR 90(A4) OK2 OK MOVE.B 91(A4),D1 \V MOVE (A4),D0 MOVE.B D1,D5 BSR CPLOTT SUB.L #2,A4 CMP.L #TR,A4 BGT LP0 * dbra d7,star SM * DC.W $A009 SHOW MOUSE MOVE bck,$FF8240 RTS exit (bombs quite ok) should call trap bck dc.w 0 *----------- CPLOTT AND.L #15,D5 color AND #255,D1 x CMP #320,D0 y BLT PLO RTS PLO MOVE D0,D3 LSR.W #3,D0 MOVE D0,D2 AND #7,D3 AND #1,D0 AND #65534,D2 ASL #2,D2 ADD D2,D0 MULU #160,D1 ADD.W D1,D0 MOVE.L a6,a0 work_screen,a0 $44E,A0 MOVE.L #ZZ,A0 (zz=physbase) ADD.L D0,A0 MOVE.L A0,A1 MOVE.B TBL(PC,D3),D0 \GET MASK PLOK AND.B D0,(A0) \C.0:PL.X,Y AND.B D0,2(A0) \ AND.B D0,4(A0) AND.B D0,6(A0) CMP.B #0,D5 \COLOR TO PLOT BNE COLO \IF>0 THEN PLOT RTS \ELSE RTS *--------- * \COLOR 0 MASKS tbl DC.B 127,255-64,223,239 DC.B 247,251,253,254 COLO EOR.B #255,D0 \REVERSE BIT PATTN ASL #2,D5 \COL*4 MOVE.L #XGOTO,A0 ADD.W D5,A0 MOVE.L (A0),A0 JMP (A0) \GOTO COLOR C15 OR.B D0,6(A1) \COLOR 15 C14 OR.B D0,2(A1) C10 OR.B D0,(A1) C2 OR.B D0,4(A1) RTS *---------- C3 OR.B D0,4(A1) C1 OR.B D0,6(A1) \COLOR 1 ENTRY RTS C5 OR.B D0,2(A1) OR.B D0,6(A1) RTS C7 OR.B D0,6(A1) C6 OR.B D0,4(A1) C4 OR.B D0,2(A1) RTS C11 OR.B D0,4(A1) C9 OR.B D0,6(A1) C8 OR.B D0,(A1) RTS C13 OR.B D0,6(A1) C12 OR.B D0,(A1) OR.B D0,2(A1) RTS C16 RTS * \ JSR TABLE interesting way XGOTO DC.L C1,C1,C2,C3,C4,C5,C6,C7,C8 DC.L C9,C10,C11,C12,C13,C14,C15,C16 * \\\\\23 TR DC.W 0,20,30,120,319,200,230,290 DC.W 80,140,134,180,240,290,199 DC.W 50,95,130,180,234,256,300 DC.W 8,16,23,30,40,48,54,62,78,83 DC.W 100,105,115,123,134,140,150 DC.W 156,160,170,178,188,198 HTAB DC.W 1 DC.W 0,20,30,120,119,100,130,190 DC.W 80,140,134,180,140,190,199 DC.W 50,95,130,180,134,156,10 DC.W 8,16,23,30,40,48,54,62,78,83 DC.W 100,105,115,123,134,140,150 DC.W 156,160,170,178,188,198 DC.W 1,2,3,2,1,6,2,2,3,2,4,1,2,5,4 DC.W 1,2,1,6,4,2,2,2 DC.W 2,1,6,4,2,1,3,4,3,5,2,2,1,1,2 DC.W 1,2,3,1,2,3,1,1 *--------------- * lateral scroll [ Gareth Pople Nov 1988 ] [ 1 plane only ] * if more planes need to be scrolled, see example in Final Lap * needed: a1 (L) position say 24000 d1 (L) height (1 to 200) * d3 (L) pixels to move (1 to 8) scroll_left move.l $44e,a0 add.l a1,a0 ex: 16000 (half way down) .lines move.l #0,a1 ; reset line pointer far left add.l #160,a0 ; add 160 lines pointer move.l #19,d7 ; do 20 lots of 4 words .line move (a0,a1),d2 swap d2 move 8(a0,a1),d2 rol.l d3,d2 was #4,d2 (pixels to scroll) swap d2 move d2,(a0,a1) add.l #8,a1 dbra d7,.line dbra d1,.lines rts scroll_right move.l $44e,a0 add.l a1,a0 ex: 16000 (half way down) .lines move.l #160,a1 ; reset line pointer far right add.l #160,a0 ; add 160 lines pointer (no change) move.l #19,d7 ; do 20 lots of 4 words .line move 8(a0,a1),d2 swap d2 move 0(a0,a1),d2 ror.l d3,d2 ror instead of rol swap d2 move d2,8(a0,a1) add.l #-8,a1 go backwards towards the left dbra d7,.line dbra d1,.lines rts *---------------------- *R69 *plot a single pixel onto screen *enter with a0=scrn_address * d1/d2=x/y values and d5.b =colour plot_pix move.w d2,d4 lsl.w #7,d2 lsl.w #5,d4 add.w d2,d4 move.w d1,d2 andi.w #$fff0,d2 lsr.w #1,d2 add.w d2,d4 ext.l d4 adda.l d4,a0 andi.l #$f,d1 andi.l #$f,d5 bne.s not_rdz col_zero move.l #$7fff7fff,d2 ror.l d1,d2 and.l d2,(a0)+ and.l d2,(a0) bra ex_rdraw not_rdz lea pix_pdat(pc),a2 lsl.w #3,d5 adda.l d5,a2 move.l (a2)+,d0 move.l (a2)+,d2 move.l #$7fff7fff,d3 lsr.l d1,d0 lsr.l d1,d2 ror.l d1,d3 and.l d3,(a0) or.l d0,(a0)+ and.l d3,(a0) or.l d2,(a0) ex_rdraw rts pix_pdat dc.w 0,0,0,0 dc.w $8000,$0,$0,$0 dc.w 0,$8000,0,0 dc.w $8000,$8000,0,0 dc.w 0,0,$8000,0 dc.w $8000,0,$8000,0 dc.w 0,$8000,$8000,0 dc.w $8000,$8000,$8000,0 dc.w 0,0,0,$8000 dc.w $8000,0,0,$8000 dc.w 0,$8000,0,$8000 dc.w $8000,$8000,0,$8000 dc.w 0,0,$8000,$8000 dc.w $8000,0,$8000,$8000 dc.w $0,$8000,$8000,$8000 dc.w $8000,$8000,$8000,$8000 even *--------------- lea 3086,a4 move.w 3510,d1 move.w 0(a4,d1),d0 ext.l d0 pad leading word with noughts bindec d0,16 convert binary to hex ascii printat 15,9,2,a0 let's see it RTS *---------- . ‹ t .. ‹ tCODE_1 DOCt QSHELL_A DOCÁt ?ASSEMB_1DOC+t ¤SPRITES1DOC—t 3pSPRITES2DOC›t :ð Machine Code in Plain English ----------------------------- Programming in machine code has always carried mysterious connotations. Probably because the instructions, being executed, one for one, by the main processor, have always been typically non-English like. Programmers who think nothing of handling Basic commands like goto or a=a+1, simply go numb when confronted with austere and stern codes such as jmp or add.w #1,a. Yet, they are one and the same. They do precisely the same thing. Being cryptic is not the only machine code shortcoming. Machine instructions are also notoriously simple. They only do one thing. No elaborate routines, just one simple operation at a time. They add, jump, compare or shift things. To execute a command like PRINT "HELLO", dozens, possibly hundreds of machine operations are required: the address of the string "hello" has to be found, the shape of the letter H has to be ascertained, the location of the screen has to be looked up, the position, height and width of the cursor has to be calculated, and the colour of the ink established. Then pixels have to be lit up for the top row of the letter H, and then the next row, and so on. All in all, a daunting task! Fortunately, such a complex programming feat need only be undertaken once. And more often then not, it's been done by somebody else already. So all you have to do, is to call a proven, established routine to do the job for you. Printing the letter H to the screen, for instance, has already been programmed by the Atari and GEM systems programmers. The routine is already in the Operating system, somewhere in ROM. Our task is now simpler. This is how a machine code programmer would print the string "hello" on the screen: move.l #string,-(sp) get address of string and push it on stack move.w #9,-(sp) call 9th gemdos routine trap #1 tell the 68000 processor to go to it addq.l #6,sp restore the stack as we found it ....... string dc.b "hello",0 our string! It can be seen from the above example that a vast number of instructions has been reduced to just four. The actual machine work of course hasn't changed. All we are doing is to tell someone who knows how to write a string to the screen to do it for us. The number of machine cycles remains the same: literally thousands of operations, but the number of instructions needed to activate them was down to four. We can even reduce the number of instructions further, right down to one in fact, and remedy the first problem associated with low level languages at the same time. First, we'll give our print routine a name, say print_hello. Each time, we want the word "hello" to appear on screen, all we have to type is BSR print_hello This means Branch Sub Routine print_hello The subroutine is usually terminated with a RTS instruction, ie RETURN Suitably labelled subroutines are a giant step towards the clarity offered by a high level language, such as Basic. Macros are another way or making your code plainer: macros are a name given to a set of pre-defined instructions. Many programmers, including the ones at Budgie UK, no longer use system calls (TRAP) like the one above, or even subroutines (like BSR print_hello). Instead we merely say PRINT hello. How close to plain English Basic can you get... Except of course, that our 'plain' instruction will be executed at eight million cycles a second, in glorious machine code! I hope to bring you more examples of to-days human face of machine code in another article. Camy Maertens Programmer with Budgie UK July 1989 Shell 41 (Jan 1 1990) The SHELL.S program is the building block of some of the games written by Budgie UK. It needs Devpac 2 (GenST2) to operate. Open shell folder. Double click on shell.s Click on 'assemble'. Choose 'disk assembly' rather than 'memory' unless you have 1 meg RAM. Name the object code T.PRG or whatever. The source code will take about 20 seconds to assemble to hard disk. More to floppy. The resulting object code can be run like a normal Gem program by double clicking over it. When SHELL.S is assembled, it automatically appends a few libraries which must be stored on the disk you are working from. A typical working disk should be Double Sided and have on it: SHELL INCLUDES COMMON FONTS GenST2.PRG GenST2.INF Desktop.INF Inside SHELL is: SHELL_40.S or whatever version is current HISCORES.ASC TEXT.S Inside INCLUDES is : INCLUDE1.S INCLUDE2.S INCLUDE3.S INCLUDE4.S INCLUDE5.S INCLUDE6.S not essential INCLUDE7.S not essential SOUNDS.S MACROS.S Inside COMMON is: BUDGIE.TIT a small degas picture GAMES.S DRUM1.SPL some unimportant sampling PENNY.PI1 introduction picture WRITER.UK another binary file (incbin) etc... Inside FONTS are 8 and 16 pixel fonts When SHELL.S is being assembled, it will expect to find the INCLUDE files. INCLUDE1.S contains such things as file reading routines, bios trap calls, supervisor mode, quit, reveal,joystick, mouse, from_to, sort, vbi, bindec, etc.. INCLUDE2.S contains h/blank, pic_dump, view array etc.. INCLUDE3.S contains pixel plot, sprite, boot sectors, etc.. INCLUDE4.S contains fonts, scroll, etc.. INCLUDE5.S contains replay SOUNDS.S contains mainly sound effects TEXT.S contains ascii messages, hi-scores tables, etc.. GAMES.S contains an ascii list of all Budgie games Presently SHELL.S expects to find these files and folders on DRIVE A. Do change if required. So, what does SHELL.S do anyway? The shell is an ENVIRONMENT from which to control a game and call any macros and subroutines that may be required. Let's be more specific: 1. It 'includes' a few handy macros 2. It then goes into supervisor mode 3. It gives back to gem (m_shrink) any memory it doesn't need to start with. 4. It finds out where ram top is 5. It asks gem to reserve some space (malloc) for work areas which will be needed later on (spare screens, buffers,..) I also asks gem to reserve space for files to be loaded soon (sprites for instance) 6. It initializes the A-line so that we may change the fonts later on. 7. It hides the mouse, the cursor, etc.. 8. It goes into low res, unless monochrome is detected 9. It loads the new fonts from disk, and some tunes. 10. It installs the horizontal blank interrupt routine, if any 11. It resets the bombs vectors 12. It installs the vertical blank interrupt routine, if any 13. It does the same with the mfp interrupts 14. It checks whether ascii files have been interfered with... 15. It checks whether the boot sector is still clean (virus) 16. It executes the opening sequence (title page, etc..) 17. It initializes the sprites 18. It installs the joystick handler routine 19. It installs the mouse handler routine (optional) 20. It declares some of the main initial variables 21. It declares logical_screen and physical_screen 22. It builds up the required scenery 23. It goes on the the MAIN LOOP, called 'main' Fine, the prolog is over. Now for the MAIN LOOP. This is the conductor of the orchestra. The program counter comes back to this LOOP 50 times a second, even if there is nothing to do (if PAUSED for instance). Our program is therefore said to be running at 50 frames. 50 frames means smooth graphics. What does this MAIN LOOP do? 1. It reads the JOYSTICK (or mouse). If there is a request, a BRAnch is made to this appropriate routine 2. It reads the KEYBOARD. If a key has been hit, again a suitable BRAnch is made. Approx 33 keys can be detected. With the exception of ESC, P, and Functions, most of them are for de-bugging purposes. A BRAnch to one of these routines is terminated with a BRAnch back to main (and not with RTS) 3. It then swaps the 2 video pointers so that at the next vertical blank, graphic operations will be directed to the screen NOT being displayed 4. It now waits for the vertical blank. At this point, the video chip redraws the screen (which is the one we were working on during the LAST cycle) 5. The coordinates for all 'automatic' sprites are now being updated 6. Software vertical scroll is executed if asked for 6. The clock is updated. So is the score, etc.. 7. It checks whether the level or the game is finished 8. All sprites are RESTORED. The background is temporarily spriteless 9. Individual PIXELS are read and drawn (if required) 10. All targeted backgrounds are SAVED unless unnecessary 11. Finally, all sprites are DRAWN in their new positions. All this restoring/saving/drawing takes place on the screen which is NOT BEING SHOWN (logbase) 12. it now checks whether such minor things as Pause or Slow Motion are required. 13. at this point, a 1/50th of a second has almost elapsed and it's time to go back to MAIN ! The main KEYS which are possibly implemented are: H toggle 50/60 Hz * debug Z pople's scroller F font loader F1 restart game F2-F3 copyright notice and credits F4-F8 Budgie ads F9 reset hi-score table F10 display Options screen HELP load Help screen ENTER similar thing X clear currenAssembly language for games programmers --------------------------------------- Introduction 1. VIDEO CHIP and VIDEO RAM No matter what sort of program one might wish to write, the result will eventually have to appear on the SCREEN. How the screen is organised and how bytes of data become pixels of colour must therefore be understood. Whatever you see in front of you is a collection of pixels (64000 of them in low res color mode) Each pixel is coloured by the electron guns which get their information from the video chip (shifter) The video chip's job is to find out what colour the pixel ought to be, and notify the electron guns accordingly. It does this 50 times a second when runing at 50hz. The video chip (shifter) has to get that information from somewhere. That somewhere is a place in your ST's memory called video ram. That can be anywhere in user ram, so long as you tell shifter about it. When the machine is powered up, the operating system in rom tells video shifter that it intends to use a 32k block of memory starting at $78000 (or $f8000 on a 1040) as its video ram. Whatever then gets put in that ram area will be the basis of the image that will appear on screen. Fill that 32k with nothing but noughts and you'll get a blank picture. Put 32000 random values (0 to 255), and you'll get 64000 random dots on the screen. The way video shifter interprets the bytes stored in video ram and converts that into actual coloured pixels is described in many books. It is based on the interleaved principle. A pain if ever there was one. Let's recap. The picture on screen is there courtesy of video chip It actually draws it (refreshes it), 50 times a second. It is a mistake to believe the 68000 chip draws the screen. The screen is drawn by the video chip. All the 68000 chip does is to tell the video chip where the relevant data is in ram. TOS usually puts video data at $78000 which happens to be the last 32k of free user ram. If you want your screen memory to be somewhere else, you must notify video shifter. Why do we need various screen memory locations: 1. to store spare pictures that will be recalled later 2. to construct sprites on a work screen while another is being displayed 3. to simulate animation 4. to simulate vertical scrolling 5. to display messages that must not overwrite existing scenery There are several ways to tell shifter where to get its screen data from. The easiest one is to ask the vertical blank interrupt routine to do it for us: Suppose you've got a picture starting at location $60000 (currently not on view), that you would like displayed. Right now, the picture you're looking at on screen comes from data held at $78000. The instruction is: move.l #$60000,$45e That's all you've got to do. Within 1/50th sec, the vb interrupt routine will spot your request and notify video shifter to display, until further notice, a screen starting at $60000 That screen will now be drawn, over and over again, (50 times a second) by video shifter (who must be the hardest working chip in the ST) The old picture at $78000 is still in memory. We're just not seeing it. Move.l #$78000,$45e and there it shows up again! You've guessed by now that $45e is a systems variable where TOS goes each vertical blank to see if you need a different screen to show. Move.l #78000,$45 means 'put the number $78000 inside location $45' ------------------------------------------------------------------- 2. SCREEN MEMORY IN LOW RES The most sensible way to construct a screen picture would be one byte one pixel. This way we would need 64k to define 64000 pixels They would all be stored sequentially. Each would be any of 256 colors. Atari (like Commodore) have chosen the plane system. Atari's four planes need 32k and yield 16 possible colors. The Amiga has five planes and 32 possible colors. It is not possible to address a single individual pixel on the ST. Instead 16 consecutive pixels are addressed together. And furthermore, they must start on a boundary of 16. In other words, we may address pixels 0 thru 15, or 32 thru 47, or 16016 thru 16031, and so on. Say you want to change pixel number 3 (currently yellow), and make it red. You'll have to redraw ALL pixels from 0 thru 15, making sure that only number 3 is different. On an ST, the cardinal rule is: EVERYTHING revolves around the number 16. If you need a sprite, make it 16 pixels wide (or 32, or 64). NO sprite is 15 pixels wide. If you want to position something on screen, put it on a 16 boundary. If you need a large character set, make it 16 pixels wide. If you want to split the screen in 19 columns, forget it. Make it 20 columns instead. (320 divided by 20 is SIXTEEN). Remember, ignore sixteen at your peril. Before we start describing the interleave system (known as 'planes'), observe that a screen memory block is made up of 32000 bytes. There are 200 visible scanlines per screen. That's 160 bytes required to draw a single line. Say our video ram is at $78000. The first four words will be analysed by shifter to light up the first 16 pixels. There is the first rule; FOUR words (ie 8 bytes) are required to draw a block of 16 pixels. So, word $78000-78001, and word $78002-$78003, and word $78004-$78005 and word $78006-$78007 will ALL be needed for shifter to DRAW pixels 0 thru 15. The next 4 words ($78008...$7800e) will draw pixels 16 thru 31 The next 4 words will draw pixels 32 thru 47 and so on This system is so awkward that programmers (Budgie's included) hurry writing routines and macros that will insulate them from such punishment. It is therefore indispensible that all graphic related macros supplied by Budgie are promptly read and put to good use. From this harrowing discovery, we will remember the fundamental facts: 160 bytes per scanline 32000 bytes per screen 4 consecutive words required to draw 16 consecutive pixels, with above words starting on strict boundaries: a set of 4 words ought to start on a multiple of 8 address yielding a set a pixels which will start on a 16 boundary It is ESSENTIAL therefore that any screen held in memory should start on a clean boundary. Budgie programmers ensure their screens are stored at an address which is a multiple of 256 or even a multiple of 1280. 1280 is one of those magic numbers which is divisible by 8, by 256 and by 160. Any block from that screen that needs moving somewhere else should preferrably start on a clean boundary, have a clean width, and travel to a clean location. By clean, we mean multiples of ..16 The purists amongst machine language programmers will scorn our quest for simplicity and efficiency. However, if a task has some latitude, there is no point in deliberately chosing complicated methods to execute it. One might argue why machine language needs being used at all. What's wrong with good old basic? The problem is that while games programs spend 99% of their time doing nothing, waiting for an input from the player, when they do spring to life, blindingly fast speed is required if jerky graphics are not to marr the effect. No high level language can provide that guarantee. Only a direct link with the machine's main and auxilliary processors can achieve total control and the required speed. Back to the screen. If you're interested in how those famous 16 pixels are converted from data into colour dots, here is an example: First word in screen memory, at $78000 contains %00000000 00000010 Say second word (at $78002) contains %00000000 00000001 Third %00000000 00000000 Fourth %00000000 00000101 From this arrangement, we will obtain the following 16 pixels starting from left to right: pixels 0 thru 12 will be color 0 (bits 0,0,0,0) pixel 13 will be color 8 (bits 1,0,0,0) that's 8 in binary pixel 14 will be color 1 (bits 0,0,0,1) that's 1 in binary pixel 15 will be color 10 (bits 1,0,1,0) that's 10 in binary weird arrangement indeed... As a practical illustration, in order to clear a screen (ie make all pixels color 0), all we have to do is to place in screen memory (at $78000 onwards, or wherever screen is), 16000 words each containing %00000000 00000000 (code for color 0) here is the actual m/l code: move.w #16000-1,d0 set up a loop counter move.l #$78000,a0 start of screen address .lp move.w #0,(a0)+ put a nought in that location, then increment dbra d0,.lp repeat 16000 times (Those 'move' and 'dbra' will be explained later) --------------------------------------------------------- 3. 68000 CHIP : DATA REGISTERS There are 8 data registers (accumulators d0-d7) used for storing data and performing calculations upon them There are 8 address registers, (of which one, a7, is used as a stack pointer). Address registers point to locations in memory. They are extensively used in arrays. Because data registers are 32 bit long, large numbers can be placed in them without problem. You are allowed to place 32 bits in them in one go, or just 16 bits, or just 8 bits Examples are the best explanation as to how data registers work: MOVE.W #8000,D0 means put 8000 in register (accumulator) D0 MOVE.W 8000,D0 means put the CONTENTS of location 8000 in D0 MOVE.W $8000,D0 put CONTENTS of $8000 in register D0 It is essential that the hash # should not be forgotten if an immediate value is to be handled. Failure will almost certainly result in bombs. ADD.W #100,D0 add 100 to whatever is in D0 ADD.W 100,d0 get the contents of location 100, and add it to whatever is in D0 Note. Memory locations from 0 to $800 are in protected area. They must be accessed in supervisor mode. Otherwise: bombs. All Budgie programs operate in continuous supervisor mode. this is a byte: 255 another way of putting it: $FF or %11111111 this is a word: 8192 another way of putting it: $2000 this is a long word: 491520 another way of putting it: $78000 now D0 is a 32 bit data register (like an accumulator or a calculator). Say it contains 11111111 11111111 11111111 11111111 MOVE.B #5,d0 makes it 11111111 11111111 11111111 00000101 notice ONLY the last 8 bits were affected, as we specified BYTE MOVE.W #5,D0 makes it 11111111 11111111 00000000 00000101 now, the last 16 bits were affected, as we specified WORD MOVE.L #5,D0 makes it 00000000 00000000 00000000 00000101 now, all 32 are affected, because we put a LONG in it As this is absolutely important, we'll have some more examples: This time, say D0 starts with 00000000 00000000 00000000 00000000 as it would do after this instruction MOVE.L #0,D0 In other words we have cleared D0. Another way of clearing D0 is CLR.L D0 now, let's put a few things in D0: MOVE.B #5,d0 makes it 00000000 00000000 00000000 00000101 ie 5 MOVE.W #5,D0 makes it 00000000 00000000 00000000 00000101 still 5 MOVE.L #5,D0 makes it 00000000 00000000 00000000 00000101 still 5 CLR.L D0 00000000 00000000 00000000 00000000 MOVE.B #257,D0 not allowed (255 maximum) MOVE.W #257,D0 00000000 00000000 00000001 00000001 MOVE.L #257,D0 00000000 00000000 00000001 00000001 now, let's add a few things CLR.L D0 00000000 00000000 00000000 00000000 ie 0 ADD.B #5,D0 00000000 00000000 00000000 00000101 ie 5 ADD.W #1,D0 00000000 00000000 00000000 00000110 ie 6 ADD.L #1,D0 00000000 00000000 00000000 00000111 ie 7 ADD.W D0,D0 00000000 00000000 00000000 00001110 ie 14 ADD.W #-1,D0 00000000 00000000 00000000 00001101 ie 13 SUB.B #1,D0 00000000 00000000 00000000 00001100 ie 12 MOVE.W #$FFFF,D0 00000000 00000000 11111111 11111111 ie 65535 MOVE.B #0,D0 00000000 00000000 11111111 00000000 notice that this last instruction didn't quite clear the entire register MOVE.W #2,D0 00000000 00000000 00000000 00000010 ie 2 notice this one did clear the 3rd byte LSL.W #1,D0 00000000 00000000 00000000 00000100 ie 4 logical shift left is used for sprite shifting and plain multiplying LSL.W #1 means multiply by 2 LSL.L #2 multiply by 4 LSL.W #3 multiply by 8 LSL.W #4 multiply by 16 LSR.W #2,D0 00000000 00000000 00000000 00000001 ie 1 LSR.W #1 divide by 2 LSR.W #2 divide by 4 MOVE.W #$FFFF,D0 00000000 00000000 11111111 11111111 AND.W #255,D0 00000000 00000000 00000000 11111111 AND.B #%00001111,D0 00000000 00000000 00000000 00001111 AND.B #%11110010,D0 00000000 00000000 00000000 00000010 OR.B #%11110000,D0 00000000 00000000 00000000 11110010 CLR.B D0 00000000 00000000 00000000 00000000 NOT.W D0 00000000 00000000 11111111 11111111 NOT.B D0 00000000 00000000 11111111 00000000 (NOT reverses the specified bits) CLR.W D0 00000000 00000000 00000000 00000000 NOT.L D0 11111111 11111111 11111111 11111111 CLR.W D0 11111111 11111111 00000000 00000000 SWAP D0 00000000 00000000 11111111 11111111 SWAP D0 11111111 11111111 00000000 00000000 MOVE.W #2080,D0 11111111 11111111 00001000 00100000 notice high word has remained intact: if one were to PEEK D0 as a byte, the answer would be 32. Peek D0 as a word, and the answer is 2080 Peek it as a Long, and the answer is 4294903840 This multiple capability of registers makes it important to adopt certain rules of discipline: In doubt, clear all registers before using them, and try to stick to a common size (words). Once you've started putting a word number in a data register, don't switch to longs or bytes. Start with words, and stay with words. Ex: MOVE.W #400,D0 ADD.W #20,D0 don't: MOVE.W #400,D0 ADD.B #20,D0 (asking for trouble) MOVE.W #2081,D0 11111111 11111111 00001000 00100001 CLR.B D0 11111111 11111111 11111111 00000000 the above doesn't completely clear a data register, but it is handy if you want to make the value divisible by 256 CLR.W.D0 11111111 11111111 00000000 00000000 the above still hasn't cleared the entire register. it is safe as long as you don't use anything larger than words CLR.L D0 00000000 00000000 00000000 00000000 this was the only truly safe way of clearing a register MOVE.W #2081,D0 11111111 11111111 00001000 00100001 BCLR #0,D0 11111111 11111111 00001000 00100000 the above meant bit-clear bit zero (useful to make numbers even) BSET #2,D0 11111111 11111111 00001000 00100100 above instruct set bit 2 (useful as on/off flags) 4. 68000 CHIP : ADDRESS REGISTERS Now let's see what an address register is. Address registers are very partial to byte operations. MOVE.B #75,A0 for instance is not allowed ADD.B #1,A0 not allowed ADD.W #1,A0 is allowed Use W or better still L, and keep those addresses EVEN !! An address register is a POINTER. It points to a memory location. There are 8 address registers A0-A7 but A7 is used as a stack pointer We'll therefore use A0 to A6 MOVE.L #$ff8240,A0 A0 now POINTS to location $ff8240 (video palette) MOVE.L #$78000,A0 A0 now POINTS to location $78000 (ie physbase on 520) MOVE.l $44E,A0 means put the CONTENTS of $44e in A0 as it happens, $44e contains the current screen address, say $78000 therefore MOVE.L $44E,A0 had the same effect as MOVE.L #$78000,A0 Notice the hash before $78000 Had we not put a hash before $78000, we probably would have put ZERO inside A0, with disastrous effects. If we want to blank the first screen location, we would do it like this MOVE.L $44e,A0 /A0 now points to say $78000 MOVE.B #0,(A0) /location $78000 now contains a nought! Notice we can access a BYTE in memory with above instruction. It is known as INDIRECT addressing. Whenever the address register is between parenthesis (A0), you're in INDIRECT mode. MOVE.B #0,(A0) means 'find out where A0 POINTS TO, and wherever that is, put a nought in that location' MOVE.L #$78000,A0 MOVE.B #0,(A0) The above instruction puts a zero byte inside location $78000 MOVE.B (A0),D0 The above did the opposite. It extracted a byte FROM location $78000 (for instance to have a look at it, and change it, or copy it somewhere else) Of course address registers are not always necessary. We can peek and poke memory cells DIRECT, without using address registers Instead of: MOVE.L #$78000,A0 MOVE.B (A0),D0 we could have said: MOVE.B $78000,D0 (put the byte at $78000 in D0) Equally: MOVE.L #$78000,A0 MOVE.B #0,(A0) (put a nought inside $78000) could have been: MOVE.B #0, $78000 But address registers are indispensible, when successive locations have to be addressed, and in arrays. Say we want to blank the first 10 bytes of screen memory: MOVE.L $44e,A0 /put contents of $44e inside A0 /A0 now points to say $78000 MOVE.L #0,(A0) /$78000-1-2-3 now cleared MOVE.L #0,4(A0) /$78004-5-6-7 now cleared MOVE.W #0,8(A0) /$78008-9 now cleared Notice MOVE.L #0 cleared FOUR bytes in one go, MOVE.W #0 only cleared TWO bytes, and MOVE.B #0 would clear only one. Also 4(A0) meant 4 bytes past whatever A0 points to Say A0 points to $78000 MOVE.B #255,$1000(A0) will slot a 255 inside location $79000 More examples: MOVE.B #5,(A0) a 5 (00000101) is slotted in location $78000 MOVE.W #5,(A0) 00000000 is slotted in $78000 and 00000101 is slotted in $78001 MOVE.L #5,(A0) 00000000 is slotted in $78000,$78001,$78002 and 00000101 is slotted in $78003 MOVE.B #5,8(A0) 00000101 is slotted in $78008 say D0 contains 2 MOVE.W #5,0(A0,D0) 00000000 is slotted in $78002 00000101 is slotted in $78003 The last instruction is often used with arrays: We know A0 points to $78000, We know D0 holds a 2, (A0,D0) therefore POINTS to $78002 0(A0,D0) is the same. It too points to $78002 4(A0,D0) would point to $78006 MOVE.W #5,4(A0,D0) will therefore slot 2 bytes (move.w is 2 bytes) starting at location $78006 (ie a nought will go in $78006, and a 5 will go in $78007) MOVE.W #5,$20(A0,D0) a 5 will be slotted in the WORD starting at $78022 The trick when you see once of those composite instructions, is to add ALL the components to reach the final address Remember: MOVE.W #5,0(A0,D0) is NOT the same as MOVE.L #5,0(A0,D0) !! They will both POINT to location $78002, BUT the first one will put a nought in $78002, and a 5 in $78003 the second will put a nought in $78002, $78003, $78004 and 5 in $78005 Now let's see how to increment address registers (ie to make them point further and further along...) MOVE.L #60000,A2 A2 points to memory location $60000 ADD.L #2,A2 A2 now points to location $60002 MOVE.L #$100,D0 D0 contains $100 ADD.L D0,A2 A2 now points to location $60102 MOVE.B #0,(A2) a BYTE zero has just been slotted inside memory location $60102 overwriting anything that was there MOVE.B #0,(A2)+ Same thing again, but, having slotted the byte inside $60102, A2 is THEN incremented by ONE and now POINTS to $60103 ! A2 was incremented by one because of the Byte instruction MOVE.B #7,(A2)+ same thing again (except that this time we put a 7 inside $60103). A2 now points to $60104 MOVE.W #0,(A2)+ A word zero is slotted inside $60104-60105, A2 now points to $60106 (TWO bytes further along) MOVE.L #0,(A2)+ A2 now points to $6010A (FOUR bytes further) A practical example is called for. Suppose we have a picture showing on screen at $78000. Suppose we want to make a REPLICA of that picture (in order to do some work on it, or prevent it from being erased by a text message, or whatever) MOVE.L #$78000,A0 that's where picture is (origin) MOVE.L A0,A1 duplicate A0 SUB.L #32768,A1 A1 now points to $70000 (destination) MOVE.W #32000-1,D0 data register used as loop counter loop MOVE.B (A0)+,(A1)+ copy one byte from origin to destination THEN, increment BOTH pointers DBRA D0,loop repeat until counter reaches nought We now have TWO pictures in memory! Having safely tucked that picture away at $70000, we now decide to erase the original one, (at $78000). This is how it's done: MOVE.L #$78000,A0 that's where picture is MOVE.W #32000-1,D0 data register used as loop counter loop MOVE.B #0,(A0)+ erase one byte at a time DBRA D0,loop 32000 times The original picture has now disappeared. The screen is blank. Now some more examples to be absolutely clear about it: MOVE.W #255,D0 use D0 as an offset LEA $78000,A0 same as MOVE.L #$78000,A0 MOVE.B #5,0(A0,D0) will slot a 5 in location $780FF (LEA means load effective address: same as MOVE.W #.....,A0) Please note $FF is same as 255, and $8000 is same as 32000. How to clear the screen. (A bit faster this time) MOVE.W #16000-1,D7 set up a counter. Use D7 or any D register MOVE.W #0,D0 zero means blank (no pixel lit up) MOVE.L $44E,A0 tell A0 to point to current screen loop MOVE.W D0,(A0)+ put nought in loc, then increment by TWO DBRA D0,loop deduct 1 from loop counter, check if zero reached, if not go back to loop because we blanked 16 bits at a time (one word), only 16000 iterations were necessary Now, let's be quicker still MOVE.W #8000-1,D7 loop counter MOVE.L $44E,A0 location $44E holds current screen address loop MOVE.L #0,(A0)+ put a long word (that's 4 bytes in one go) into that location then tell A0 to point FOUR bytes further along DBRA D0,loop until loop reaches zero Here's yet another way, without using a loop MOVE.W #16000,D0 counter: 16000 times MOVE.L $44E,A0 addresses are Long words again MOVE.W #0,(A0) blank first 2 bytes ADD.W #2,A0 move pointer 2 bytes along SUB.W #1,D0 deduct 1 from counter CMP.W #0,D0 is it zero? ( TST.W D0 is same) BNE again No. Then do it again Here's another faster way MOVE.W #2000-1,D0 loop (getting shorter) MOVE.L $44E,A0 destination loop MOVE.L #0,(A0)+ 4 bytes in one go MOVE.L #0,(A0)+ and again MOVE.L #0,(A0)+ and again MOVE.L #0,(A0)+ and again DBRA D0,loop Once again, how to copy a screen from physbase to somewhere else in memory MOVE.W #8000-1,D0 set up a loop: 8000 times 4 bytes = 32K MOVE.L $44E,A0 origin screen (say current screen) MOVE.L A0,A1 A1 now same as A0 SUB.L #32000,A1 A1 now points 32000 bytes BELOW screen loop MOVE.L (A0)+,(a1)+ copy FOUR bytes in one go! DBRA D0,loop All done in a flash! The actual time taken was as follows: MOVE.L (A0)+,(A1)+ takes 20 cycles DBRA takes 10 cycles -------------- 30 cycles times 8000 = 240000 cycles 8 million cycles divided by 240000 = 1/33 of a second Not quite fast enough to do the job within one video refresh (1/50th) To speed up this operation, we could have TYPED the line 'MOVE.L (a0)+,(A1)+' 8000 times (!) and done away with the loop or used the MOVEM.L instruction (multiple move) A final point about byte operations with address registers. We've already seen that address registers may be incremented by ANY number, even 1, as long as the instruction is W or better still L MOVE.L #$78333,A0 is acceptable ADD.L #1,A0 is still acceptable (A0 now points to $78334) ADD.B #1,A0 is not allowed However, if we want to EXTRACT information from an UNEVEN pointer, (say A0 contains $78333), only a BYTE may be reached. Anything else will result in an address error and bomb. ex: MOVE.L #$78333,A0 MOVE.B (A0),D0 is OK MOVE.L #$78333,A0 MOVE.W (A0),D0 will bomb MOVE.L #$78333,A0 MOVE.L (A0),D0 will bomb MOVE.L #$78332,A0 MOVE.W (A0),D0 is perfectly OK (all even) Same rule applies if we INSERT values where the register POINTS: MOVE.L #$78332,A0 MOVE.W D0,(A0) is OK MOVE.L #$78332,A0 MOVE.L #1,(A0) is still OK MOVE.L #$78332,A0 MOVE.B #1,(A0) is still OK MOVE.L #$78333,A0 MOVE.L #1,(A0) will bomb! In doubt, keep those addresses EVEN, and only put words in them. 5. 68000 INSTRUCTIONS Now some elementary comparisons between assembly language and Basic BASIC ASSEMBLY LANGUAGE ---------------------------------------------------------------- GOTO bill BRA bill /if bill is within 32K or JMP bill /no matter where bill is GOSUB bill BSR bill or JSR bill score=score+1 ADD.W #1,score /unlike 6502 code, where we say add to score,1 in 68000, we say add 1 to score or LEA score,A0 /load effective address of score in A0 ADD.W #1,(A0) /add one to score score=10 MOVE.W #10,score /again, we say: put a 10 in score score=result MOVE.W result,score /put 'result' inside 'score' or LEA result,A0 /get address of result LEA score,A1 /get address of score MOVE.W (A0),(A1) /put one inside the other or MOVE.W result,D0 LEA score,A1 MOVE.W D0,(A1) PRINT "hello" PRINT message /this is a macro message DC.B "hello",10,13,0 CLS CLS /this is another macro BLOAD "degas.pi1",physbase LOAD degas,degas_ptr /disk operations are all covered by macros; /in many ways, far easier than in basic! POKE $45e,255 MOVE.W #255,$45e /notice the 68000 convention: poke 255 inside $45e POKE physbase,33 MOVE.W #33,physbase /notice the hash meaning an ACTUAL number, as opposed to a location CONTENTS POKE 20000,0 MOVE.W #0,20000 POKE bill,10 MOVE.W #10,bill POKE bill+4,10 MOVE.W #10,bill+4 or LEA bill,A0 /get bill's address ADD.W #4,A0 /go 4 BYTES further one MOVE.W #10,(A0) /at that point, slot a 10 in or MOVE.L #bill,A0 /same as LEA bill,A0 MOVE.W #10,4(A0) /put a 10 in bill+4 /note: addresses are usually referred to as /Long words, hence MOVE.L #bill,A0 /data on the other hand is very often word: /hence MOVE.W #10,4(A0) FOR loop=1 TO 32000 MOVE.W #32000-1,D0 /set up a counter do something loop do something NEXT DBRA D0,loop /fantastic instruction /meaning: deduct one from counter, check if /zero is reached and if not, go back to loop PEEK bill MOVE.W bill,D0 /contents of bill /now inside D0 register IF score>result THEN MOVE.W score,D1 GOTO bill MOVE.W result,D0 CMP.W D0,D1 BGT bill /branch if greater than /note comparisions are again the opposite /way to 6502: ex: CMP.W #5,D0 means compare with 5, D0 BGT fred /means: if D0 is greater than 5, /then branch to fred IF scoreB}HISCORESASC¦t ^dINCLUDEDS ©t _)SHELL_41S «t `#SHELL_41PRG5t ïvTEXT S Qt «TITLE PI1»t ²B}SPRITES PICÂt ÒŒ,SHELL_1 S t ©&HBLOB PI1ut ,B}MUG_BOOTS {t Lï&RASTER2CS €t Vÿùˆ'\úˆûˆü˜µ©þ2/Ëÿ\'íO3¿þ?þˆýˆÿÿÿÿ#ÿÿQRÿÿ•oÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý'¯Pø:xúÿ*ÿÿ¢Dû{ü"¦@Yÿÿÿÿÿ(((×ÿÿÿ(ªÿÿ­ÿÿw_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿðˆ»DøPÇÿ8ÿÿ„äü÷š€$€ÿÿÿÿÿÿÿÿ¡ÿÿP«ÿÿÚÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"ÿÿÿÿBÿÿÿÿDÿÿÿÿ%ÿÿÿÿ@ÿÿø‚2¯ Pðó ƒÿ|ÿÿhø‘q?s€Œÿÿÿÿýÿÿÿµÿÿ¯vÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ ÿÿÿÿ…Dÿÿÿÿÿÿÿÿ$ÿÿÿÿQÿÿá07Èðb+Ô€t ýþaÿñ…?=ÀÂ?ÿÿÿÿÿÿ ÿÿ¬TÿÿR¯ÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”¡ÿÿÿÿÿÿÿÿ$ÿÿàtŸ`ðVþà~Xxÿ‡Ûç<ÿ÷Àðã ÿÿÿÿÿÿ ÿÿQÿÿ­úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"ÿÿÿÿB$ÿÿÿÿPRÿÿÿÿŒ“ÿÿÿÿ ÿÿÿÿJÿÿÿÿ@%ÿÿäT&|ƒàl%-tÒ‹÷Çÿÿà$ßÿÿ²^`á€ÿÿÿÿÿÿ`ÿÿFfÿÿUoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿ„ÿÿÿÿ*¤ÿÿÿÿR ÿÿÿÿ±Aÿÿÿÿ4ÿÿÄPMP¯àµHÿ÷üåÿÿýîý!Çhø€ÿÿ ÿÿ‚ÿÿ“ÿÿ½ÿÿ¯ÿÿÿwÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿ@ÿÿÿÿJ)ÿÿÿÿÐ ÿÿÿÿ$Òÿÿÿÿ žÿÿÿÿj¤ÿÿÌ<îd›ào‰ÿïö¶€ÿYññýñŸã°üPÿÿÿÿÿø rÿA Át‹Ït€pðAœðAvð‰vðÿóÿÿâ¡ÿÿÿ‘Rÿÿÿÿ*ÔÿÿÿÿQ(ÿÿÿÿ•Aÿÿÿÿ ˆÿÿèí@¿Àüœÿÿ"÷ÜÿÿxíþíOáøþÿÿÿÿÿý Šÿu]ß _ßU׊(u×ÿß ÿß÷Ý"÷Ýv÷‰˜v÷uŠuÿÿ,ÿÿÿÿ*­ÿÿÿÿ´­ÿÿÿÿ‹Rÿÿÿÿ¬Tÿÿÿÿ`UÿÿÜp¾À?ÀñÄ?ÿÿ?üÿÿãzzÿz…Í/ò¸ÿPÿÿÿÿ ÿý©úÿÁ _Át‹Ïtÿß ÿß÷Ý*÷Ýv÷‰ v÷ ˜ó ?ÿ«?ÿÿÿÀ¹ÿÿÿÿOÑÿÿÿÿb5ÿÿÿÿÊ•ÿÿÿÿµ¤ÿÿ•eµ ÿÀ÷¯oÿïÃÜüÿÿ‘k…û~ p€ÿÿÿÿ„ÿý uŠÿu_ý _ýeuŠˆuwÿß ÿß÷Ý"÷Ýv÷‰v÷u šuÿÿh”ÿÿÿÿ*ÿÿÿÿÑ'ÿÿÿÿQÍÿÿÿÿ<¥ÿÿÿÿeUÿÿgV‰ÿÀøòóÿó ¾å¿ÿ@€’|’ü’m¦¨>ÐÁÿÿÿÿ ÿø1Šÿu]Á <_Ázo€pðAÜðA}ï÷ÿåªÿÿÿêµÿÿÿÿN™ÿÿÿÿ­jÿÿÿÿÎÖÿÿÿÿ[«ÿÿ†éÏPÿ€´F ÆÿÆ9ìÿ¯ÿ¿@¡þ¡þ¡^LOr¤~Pÿÿÿÿ Vÿÿeÿÿ»ÿÿÿ¿ÿÿÿÿÿÿÿÿÿ†ÿÿÿÿ”Qÿÿÿÿ¢ÖÿÿÿÿZuÿÿÿÿ­•ÿÿÿÿófÿÿÿÿµYÿÿÿÿÒIÿÿÿÿÚhÿÿ@•(É×€`ƒÿƒ|21¿ï¿¿@@M½ýÿ!>X?`Àÿÿ@ÿÿ‚ÿÿtßÿÿïÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿÿÿÿ$ÿÿÿÿíRÿÿÿÿéuÿÿÿÿͶÿÿÿÿª¥ÿÿÿÿ-÷ÿÿÿÿE‹ÿÿ†“ŽQo€ÑU?UÿUª*`?ÿ?ÿÀÀõÀõÀ ?Ÿ=`ðàÿÿÿÿ*ÿÿ“·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTÿÿÿÿ@Hÿÿÿÿ«šÿÿÿÿ§ÿÿÿÿ.Ïÿÿÿÿ-ÿÿÿÿÕ¬ÿÿÿÿúIÿÿÿÿ¾êÿÿ\!\`ƒŸ€£‡ÿøÕß÷ßÿ  ì ä ß"7<Ä?ðÀÿÿÿÿUÔÿÿNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿ++ÿÿÿÿ*Wÿÿÿÿî»ÿÿÿÿß»ÿÿÿÿÕûÿÿÿÿ»ßÿÿÿÿ©ÿÿÿÿn±ÿÿŠ;¨8WÇ€pÿzÿrº¿û¿ÿ@€õ€õ€ ·ÌøàÿÿÿÿEÿÿúßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†ÿÿÿÿˆÔÿÿÿÿª¨ÿÿÿÿåÿÿÿÿzÞÿÿÿÿ¿ïÿÿÿÿ~ÕÿÿÿÿÛhÿÿÿÿùKÿÿ!àÇ€ßÿßÿß ÚŒßóßÿ  ÿ,í ó„_™ øpÿÿÿÿ"0ÿðô>AüAçAðøðA{A0A×¾0A0v0AÿÿóAÿÿÿ×ÿÿÿÿo­ÿÿþÿôšÿÿÿÿþ·ÿÿÿÿ¸ŸÿÿÿÿTýÿÿÙÙøF€i÷}÷}‚Ÿ÷Ÿÿ` ÍÿÍÿÍ2?Âøàÿÿÿÿ†ÿ÷UÝ _ý÷U¢÷U÷€H÷_0‰_w÷¢ w÷uת2u×ßÿ÷Ôßÿÿÿ½~ÿÿÿÿÕ{ÿÿÿÿß÷ÿÿÿÿóÞÿÿÿÿ÷tÿÿÿÿþ•ÿÿKzèÅ€0Sþÿþ€ÆßñÏÿ0+ôÿôÿô opòø€ÿÿÿÿµÿ÷Cü¼CüUÈ¢UðððAœbApw×npw×þm×Ãÿ>«Ãÿÿÿ¯ïÿÿÿÿ÷¿ÿÿõÿðí ÿÿûÿYÚÿÿÿÿ¯ûÿÿÿÿã¶ÿÿ«SøŒÀ 'ÿÿ€âÞïáïÿæÿïÿæ:›0d?üÀÿÿÿÿÝCÿ÷Vÿ _ÿ×U¢×U÷‚ ÷}÷Æ }÷w…ºwu׺u×ßÿûþßÿÿï««ÿÿÿÿþýÿÿÿ{ÿ{„ÿÿÿÿÿoÿÿÿÿófÿÿÿÿ^ªÿÿ©ŠWÀ¯RÿÿÿVßñ×ÿ(ÒÿÒÿÒ-üðrÿüÿÿÿÿ*°ÿðü _üUÇ"U÷ø÷A¼õA0wÏN0wuÐÿçuÐAÿþkAÿÿÿü×ÿÿÿÿ}·ÿÿÿýºxÿÿÿÿÝÿÿÿÿÿ®½ÿÿÿÿûoÿÿ QXŽ§ÀD¡ïûæû­nïñïÿ…jjÿj•°‹¹p¾ø@ÿÿÿÿUíÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿÿÿÿU-ÿÿÿÿÕ]ÿÿÿÿûÛÿÿÿÿoýÿÿÿÿßïÿÿ÷ß÷Ï ÿÿÿÿ¿ªÿÿÿÿ»ëÿÿÿÿ¶Úÿÿ±‹OÀo—ÿ¿ÿ·H(E=ú=ÿÂöÿöÿö tñø•x€ÿÿÿÿª¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿe›ÿÿÿÿVãÿÿýÿüöÿÿÿÿÝ÷ÿÿþÿþÿÿÿýÿýÿÿßÿV¾ ÿÿÿÿþ¾ÿÿÿÿ­µÿÿˆ#¸pÀx?ÿÿ€ñ}óòñÿ­þ­þ­RÌñɃÎz0ÿÿ€ÿÿw½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£!ÿÿÿÿªoÿÿÿÿk.ÿÿÿÿyÝÿÿÿþÿüÿÿÿÿoÿÿÿÿÿÿýÿÿþÿúßÿÿÿÿËýÿÿÿÿs{ÿÿâvæñ)à ÿÿÿûÒ¢ûýûÿ‡E_ÿM²]qy~ò€ÿÿ ÿÿ­×ÿÿÿÿÿÿÿÿÿÿÿÿ$ÿÿÿÿÿÿÿÿ©ÿÿÿÿÞûÿÿÿ÷ïwÿÿûÿ›ÿÿÿÿ_ÿ€ÿÿëÿÊ÷ÿÿÿÿÿ½ÿÿÿÿ·ÖÿÿÿÿîÜÿÿ¥g`ŸÀ²úøÿÿ§õwú÷ÿùãÿÿc žò`ÿÿ€Dÿÿ×ÿÿÿÿÿÿÿÿÿÿÿÿ€HÿÿÿÿI ÿÿÿÿµÿÿÿÿ£Þÿÿÿÿýîÿÿþÿü¿ÿÿÿÿ?€ÿÿÿß÷Ÿ ÿÿÿÿ×ïÿÿç÷eçÿÿÿÿßõÿÿƒ`§ïHÀ¯à _€Çâ?ýÿÿø;@ÿ¿aí îòÿÿ€ÿÿû÷ÿÿ¿ÿÿÿÿÁ>ÿÁ÷p ÷Awœ¬Awÿÿ-vÿÿÿÿÿýÿÿÿ_ÿ€ÿÿÿßßß ÿÿÿÿïÿÿûÿûÿÿÿ¿ý¿ù@ÿÿÿýëyÿÿÿÿ»VÿÿƦ¯ _ÀQóŽ ÿÿŒÅ~úþÿpž€ÿf¤)çôÿÿDÿÿ®ÿÿÿÿÿÿÿÿ÷ÿ÷w÷Lw÷]wªŠ]wÿÿ×¥ÿÿÿÿêÖÿÿÿÛÿÙ$ÿÿoÿ-{ÿÿ÷¿÷¿@ÿÿn€€ÿÿÿÿÿ÷ÿÿ÷ÿu^ÿÿÿÿíÿÿÿ@˜1ÏŽ?À`3ŸÌÿÿ‘míýÿŠ•*ÿÿ kâáøÿÿÿÿûÿÿÿÿÿÿÿÿ÷R©ÿ÷wðˆwð]w&ÿ]wÿÿ¬ýÿÿ÷ÿ÷ýÿÿÿÿÿ«ÿÿÿÿ÷ÿÿÿÿ÷ÿ÷ÿÿÿÿÿ÷ÿÿÿ€ÿÿÿÿûûÿÿÿÿߺÿÿÀ€Àÿ/ÀHî·ÿÿ £[\ûÿÌs ÿÿ;_ú4ûðÿÿHÿÿÿÿÿÿÿÿÿÿÿ÷ ÿ÷wýªwýÝwzØÝwüòW>üóÏÿ;çÏÿÿÛÛÛ$ÿÿßÿþ ÿÿÿþûþÿÿÿÿïþÿÿþÿüþÿÿÿþ€ÿÿÿÿ}µÿÿÌêß?à9ÀÿÿÕC*¼ÿÿb@þ¿Š_j ë`ÿÿHÿÿûÿÿÿÿÿÿÿÿ÷"Hÿ÷ýpªýÁ=Áüó«ÞüóÏÿÿÏÿÿ¿ÿ›@ÿÿÿÿÿÿÿûÿûÿÿÿïÿëÿÿÿÿÿÿÿÿÿÿý»ÿÿÿÿûïÿÿŒ¤÷Fàø öô¶ìÿÿZ ðôÄß0 ñ`ÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿH-ÿÿÿÿFÿÿÿÿ(Dÿÿÿÿoÿÿÿÿßÿÿÿÿÿÿwÿÿúÿòÿÿÿ·ö·öH ÿÿ»ÿ»ÿDÿÿÿÿÿöÿÿÿÿ÷õÿÿÿÿ¯ºÿÿð–è·WàÐ1èG Hü?ÿÀþðÐ04ñàÿÿÿÿÿÿÿÿÿÿ$ÿÿÿÿ€ÿÿÿÿ©XÿÿÿÿKÿÿÿj€ÿÿÿÿöîÿÿÿÿÛÿÿÿÛëÛë$ÿÿýý€ÿÿï¿ë+@ÿÿþÿôÿÿÿ?ÿ€ÿÿÿÿûõÿÿÊaó/ð €eà“7`øŸÿˆŒ"¢Ý]õ? q`ÿÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿTUÿÿÿÿ«ÿÿÿÿ,êÿÿÿÿÿÿÿÿ½¿½Bÿÿûýûýÿÿÿÿÿÿÿÿ¾ß¾ßA ÿÿÿ¿ÿ¿@ÿÿ__ €ÿÿ÷ÿ÷zÿÿÿ¿¯7@ÿÿõpUµø pC¿êÁ†Ý@¬¿pØ ìÿß á@?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰©ÿÿÿÿU0ÿÿÿþê¼ÿÿÿÿ9îÿÿÿÿýµÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÞîÞ!ÿÿº×ª×E(ÿÿßÿßÝ ÿÿßÿIl ÿÿú3•óø £P”ýìÖw øÿÿpÊþ-å_`áÀ?ÿÿ‘ÿÿÿÿÿÿÿÿAÿÿÿÿTÿÿÿÿA×ÿÿÿÿ_ËÿÿÿÿÖ¿ÿÿÿýßýÿÿÿÿÿÿÿÿÿ¼ÿ¼Cÿÿíþéþÿÿÿÿ€ÿÿ®´.´QKÿÿ±ÿ±ÿNÿÿ¿ÿŸo@ÿÿøåsõü âøúüÿ;K„Üß :äÈ ÷ó€Àþ?ÿÿÿÿÿÿÿÿÿÿ$ÿÿÿÿR›ÿÿÿÿ¾½ÿÿÿÿ•¯ÿÿÿûÿúÿÿÿÿÿÿÿÿÿ~ÿ~ÿÿ·ù·ùHÿÿ߯߯ Pÿÿõýôü ÿÿ ª ªóUÿÿöïöï ÿÿÿÿÿ|ÿÿþçÐ÷ÿóýÚþ%b ÜÿŸ`Æâýþ,¿IÀþ?ÿÿB"ÿÿÿÿÿÿÿÿJÿÿÿÿ…TÿÿÿÿÕÏÿÿÿÿï­ÿÿÿÿÛÿÿÿÿÿýÿÿÿÿÙÿÙ&ÿÿ÷÷êÿÿÿôÿô ÿÿ¾[¾[A¤ÿÿmBmB’½ÿÿ==€ÿÿÿÿ¿ïÿÿþ0ööÿ ‰á¾ Ÿß`‘Y~Þÿß O|ðÿþ‰?€ €~ÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿz«ÿÿÿÿ«Uÿÿÿÿmÿÿÿÿ÷ÿÿÿï¿ïÿÿïúïúÿÿú©ú©Vÿÿóÿóÿ ÿÿîýîýÿÿììbÿÿÃîî<ÿÿÿÿÿšÿÿþ#ØÛûÿh@o¿mÿ’à4ÿÿÿÿ€oïïþ$!!€Þÿÿ ÿÿÿÿÿÿÿÿJÿÿÿÿŠªÿÿÿÿTÝÿÿ·ÿ—ÕHÿÿÿÿÿÿÿÿÛûÙû$ÿÿ»ý»ýDÿÿ~~~~ÿÿ~~€ÿÿÿJÿJµÿÿª’ª’UmÿÿªóªóU ÿÿ_ï æ ÿÿý›±ïÿþD¿þþà ¿¯?Àp<ÿþÿþ€üÿÿA@ÿÿÿÿÿÿÿÿD¥ÿÿÿÿUUÿÿÿÿÿkÿÿÿÿeÿÿÿÿÿÿÿÿï~ï~ÿÿÿ]ÿ]¢ÿÿûóûó ÿÿöÖöÖ )ÿÿr]r]¢ÿÿSkSk¬”ÿÿuNuNŠ±ÿÿýÿùýÿÿø&Ûßÿþ³õ÷ý÷ýÕ…€zÕÿýÿÝ"crcœÿÿÿˆ"ÿÿÿÿÿÿÿÿQÿÿÿÿê·ÿÿÿÿWÕÿÿÿþÿ^ÿÿÿûÿ»ÿÿú®ú®QÿÿûÿûÿÿÿË—Ë—4hÿÿíþíþÿÿü§ü§Xÿÿ< 8 ÃóÿÿS{S{¬„ÿÿÿ_^€ÿÿýáïÿþVjÿzþj•É!ß!ß! Þ‰îëîë#Üÿÿÿ"¤ÿÿÿÿÿÿÿÿD-ÿÿÿÿ+ëÿÿÿÿ½ÿÿÿÿï­îÿÿûÿûÿÿÿÿ¿ÿ¿@ÿÿæfæf™ÿÿ}|}|‚ƒÿÿëýëýÿÿƒZƒZ|¥ÿÿøóøó ÿÿK¾K¾´Aÿÿÿÿýÿÿý2]ÏÿþÔÿÕÿÔ+R„€€€¾ý¿ý¿@¡ÿòBãÿÿÿ@ÿÿÿÿ ÿÿÿÿR“ÿÿÿÿjûÿÿÿÿÿÿÿÿþÿúÿÿþ½ü½BÿÿÛýÛý$ÿÿÿùÿùÿÿÔ­Ô­+Rÿÿï¯î¯Pÿÿh?h?—ÀÿÿÞˆÞˆ!wÿÿ®ï®¥QÿÿÁÿ%ÿÿÿD²ÿ€¢ÿòÿâ Ž~€>€ÁMzOzO…°Pÿòò ÿÿÿ¤ÿÿÿÿ+ÿÿÿÿ-]ÿÿÿÿ§Oÿÿÿÿ÷[ÿÿÿÿÿÿÿÿó¶Ó¶ Iÿÿþ÷þ÷ÿÿ2W2Wͨÿÿ¯äPÿÿ7é7éÈÿÿŸmŸm`’ÿÿýKÍK´ÿÿEýAýºÿÿ…ÿ_ûÿÿònŸÿàE ¿ìÿìCÿ€ÿ,6]7<7ÃÈ£ÿò!ò ÿÿÿEÿÿÿÿ*ÿÿÿÿ@¢ÿÿÿÿêÿÿÿÿÿ½ÿÿÿÿÿÿÿÿÿÿßÿß ÿÿ¿é¿é@ÿÿÏ­Ï­0Rÿÿ66Éèÿÿm m ’ßÿÿ#ÿ#ûÜÿÿúFF¹ÿÿ¿Û·Ø@$ÿÿÿ ÿÿýâXÿðÿûÿûˆw€€€€×ºß¸ßG QÿðÈðÿÿÿRÿÿÿÿBÿÿÿÿ-Oÿÿÿÿµmÿÿýÿù¯ÿÿÿ÷ÿ÷ÿÿõõ €ÿÿw¯w¯ˆPÿÿ¸ý¸ýGÿÿ››d€ÿÿbbäÿÿÿÿÿ´ÿÿúÅJÅ:ÿÿþ¾€ÿÿ‰Ÿ€ €ÿÿâíÏÿøïÿÿÿ@ëÀùÀ?ñ}íù€ÿððÿÿÿ$ÿÿÿÿÿÿÿÿD ÿÿÿÿsïÿÿÿW€ÿÿ½û½ûBÿÿþÿþßÿÿûùûùÿÿ]]¢äÿÿ®ï¬ïQÿÿÚÚ%êÿÿ¿ÿ½@@ÿÿñbbÿÿ?Ê.HÀ4ÿÿßE@ÿ¿ÿüR¯ ÿòH·ÿÿÿ+Þÿûî›âgÿÿÿ§ÿñTðÿÿÿÈ’ÿÿÿÿª…ÿÿÿÿ+kÿÿÿÿ®ýÿÿÿÿûÿÿÿÿîÿîÿÿ÷íöíÿÿô³ô³ Lÿÿϯϯ0Pÿÿxöxö‡ ÿÿR¬R¬­SÿÿÿÿÀÿÿó ÿÿÿwöWôˆÿÿ{ÿÿÿ¿ñ¾Ç@ÿü†íÿÿTèþþyPGÿ=ÿ‡ÿààÿÿÿÿÿÿÿ*ÿÿÿÿ”ªÿÿÿÛ€ÿÿÿÿÿßÿÿÿßûß ÿÿ}Ü}Ü‚#ÿÿ]\]\¢£ÿÿÒfÒf-™ÿÿö_ö_  ÿÿ¿½ç@ÿÿÿýxÿÿÀ?âÿÿw´´ˆHÿÿÖÿòüñÿÿð—!ÿþ ÷ÿÿÿ<°Ÿþ`´ ÿÿGÿÕÐ/ÿÿÿ…PÿÿÿÿRÿÿÿÿ*UÿÿÿßîÝ ÿÿûÿû÷ÿÿ¿k¿k@”ÿÿ÷ÿ÷ÿÿÿëSëS¬ÿÿ%©%©ÚVÿÿ Ø Øö'ÿÿÿòêÿÿÿíÿÿ…@@z¿ÿÿÿÜ2Ø ÿÿ¿ª@ùÿÿò*çÿü@ì¿ÿÿdÁû€ÿÿV@7ÿ÷ÿGÿààÿÿÿ(%ÿÿÿÿuÿÿÿÿŠ»ÿÿÿÿ]ïÿÿÿÿïÿÿÿÿ×ÿ×(ÿÿwýwýˆÿÿ¾¿¾¿A@ÿÿhWhW—¨ÿÿn„n„‘{ÿÿÿ0èÿÿüÒÿÿˆ ˆ wôÿÿÿÝØ ÿÿü?¹€øÿâ ÿüûÿÿÿ˜ßçßÿ ñ{ÿóÿ OÿÒ*À?ÿÿÿÿÿÿÿ¦¨ÿÿÿÿuŽÿÿÿÿ÷þÿÿý?ý€ÿÿÿÿÿÿÿÿßÒßÒ -ÿÿÕËÕË*4ÿÿFÐFй/ÿÿDMDM»²ÿÿ_ÿ[€ ÿÿ[ÿÿ""Ýnÿÿý9}1Àÿÿý,àøçÉÿæ ôïÿÿJ ÿÿÿûì ï÷ïÿ/ÿ`@`ŸÿÿÿRÿÿÿÿ)Uÿÿÿÿª³ÿÿÿÿ¯ýÿÿÿëÿêÿÿ¿¿¿¿@@ÿÿ¿®¿®@Qÿÿì§ì§XÿÿZ7Z7¥Èÿÿ))Öþÿÿÿp€ÿÿìÿÿ,],\Ó ÿÿþ»^±@ÿÿüÇðøü4-=ÿ€€ÿÿÿªUÿÿþÿ-½ÿ­ÿRoÿáTàÿÿÿE4ÿÿÿÿT+ÿÿÿÿU]ÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿïüïüÿÿßûßû ÿÿãSãS¬ÿÿœœëcÿÿ»»ÿDÿÿÿöàÿÿ‚ÿÿh•h—hÿÿ--BÒ€ÿÿøÐd|ÿƒ¦7'ÿÈ põÿýQƒûÿùÿWÿÿìïÿààÿÿÿ¢ÿÿÿÿ Pÿÿÿÿ+µÿÿÿÿëÿÿÿý¾ý¾AÿÿÝûÝû"ÿÿº+º+EÔÿÿZZ¥bÿÿ1X1XΧÿÿ§¦ÿXÿÿÿàÿÿ@ÿÿ&+&!ÙÐÿÿV¿V¦©@ÿÿï†ppÿ#7ÿÈHû·ÿÿ1Âþ=ÿÿŸÿ—ÿhÿåVàÿÿÿÚÿÿÿÿÔMÿÿÿÿªïÿÿÿÿÿÿÿÿûÿûÿÿÝõÝõ" ÿÿÞÿÞÿ!ÿÿ„¢„¢{]ÿÿ­@­@R¿ÿÿÿýþÿÿýàÿÿ€ ÿ÷ËðËð4ÿÿ¹ÿ¹…Fÿÿó> ÿÿèÌÿÏÿ4ÿËÿÿ8ãüÿáÿÿÿŸÿÀÀ?ÿÿÿ¤ÿÿÿÿGÑÿÿÿÿUWÿÿÿÿßÿÿÿÿ÷ÿ÷ÿÿßß bÿÿ%%Úàÿÿé•é•jÿÿš€š€eÿÿ££*\€ÿÿ÷ÿÿÿÿ44ËàÿÿsÿsœŒÿÿh?!ÿþL€ß‹ÿtÿÿ€ˆ=ÿÂ"áÿÿßÿÅÀ?ÿÿÿD›ÿÿÿÿj.ÿÿÿÿ¯îÿÿÿÿÿþÿÿÿÿÿÿÿÿã~ã~ÿÿýæýæÿÿaaížÿÿH@H@·¿ÿÿÿààÿÿò€ÿÿÿÿÀªÀŠ?EÿÿÇÿÇ8ÿÿÒ?S "ýþ®OÿÏ0 ûòÿÿ—yWy¨†DSÿ¯ÿ_ÿÈVÀ?ÿÿÿ©@ÿÿÿÿ•Iÿÿÿÿe_ÿÿÿÿûýÿÿ¯o¯oPÿÿ~®~®QÿÿѪѪ.Uÿÿ´¯´¯KPÿÿPP¯øÿÿ¿þ½@ÿÿˆÿÿÿÿZJü…ÿÿ•ÿ•$jÿÿ1ŸÃüþYÿÏ0…æzÿÿ׿ÿÿñ"ÿÿÿÿQ@¿ÿÿÿ•ÿÿÿÿT®ÿÿÿÿ›ýÿÿÿÿ¿ÿÿÿ÷û÷ûÿÿß[ß[ ¤ÿÿ<³<³ÃLÿÿ’’måÿÿ ÿöÿÿÿÿ¸ÿÿQÿÿ;34ýϨk¨ W”ÿÿWöWF¨ ÿÿú^ŒAAñ¾q ÏçÆ87TÈ«ÿÿí{„ÿÿÒ ÿÿÿÿ¦”€ÿÿÿ¦¨ÿÿÿÿ«Uÿÿÿÿhëÿÿÿß÷Ÿ ÿÿÿþÿþÿÿýûýûÿÿßJßJ µÿÿEEºÿÿÿ¯®÷PÿÿÿÝ€ÿÿÿÿ Jÿÿê*ÿÿÿ?ý<Àÿÿö&áþ¼ ŠgŒp?÷Àÿÿéº öÿ|Cÿ¿ÿÿ!ÿÿÿÿHÿÿÿÿUmÿÿÿÿ[ÿÿÿ¿€ÿÿþýþýÿÿÝ~Ý~"ÿÿ´"´"KÝÿÿqqŽoÿÿÿðÿÿÿÿv€ÿÿ ÿÿ!p!`!oÞŸ£Ô£T\+ÿÿã|€ÿÿ¯ô0>ÁÿpLÃ?ð?ÿÀÿÿÄßù 2 ÿÿÿÿÿUBÿÿÿÿBÿÿÿÿ¢¤ÿÿÿÿ¥÷ÿÿ¿ÿµÿ@ÿÿ÷ÿ÷ÿÿÿ¦—¦—Yhÿÿ·[·[H¤ÿÿƒˆƒˆ|wÿÿÿÀüÿÿõÿÿÿÿˆÈ×ü?CØBX¼'ÿÿ¯î¤hPÿÿ æv>ÁÿðD+Ã?ð:õÀ ÿÿ! þßþÿþÿÿÀÿÿÿÿÿÿÿÿ _ÿÿÿÿ_®ÿÿÿÿßÿÿÿßþßþ ÿÿÿþÿþÿÿ¨Ô¨ÔW+ÿÿåÿÿÿÿz€ÿÿÜ(ÿÿÿÿSàWàS߬?  øôÿÿ‰{€qÿþ€áððÿ@DwC€¿àúàÿÿ§ÿÿÿäÿüÿüÿÿTeÿÿÿÿAPÿÿÿÿjªÿÿÿÿ«ÿÿÿÿûÿûÿÿë¾ë¾Aÿÿþ×þ×(ÿÿ××(íÿÿ¸¸GùÿÿÿõàÿÿM@ÿÿÿý^__¾ SSø¬ÿÿÞ÷Þç!ÿø_Z@@A¿¿ÅŸ@ÿ€t\€ÿÿþ¯þ/ÐXÿùÿøÿÿ€€ÿÿÿÿ ÿÿÿÿEÿÿÿÿý¾ÿÿ¿ý¿ý@ÿÿÿûÿûÿÿ-U-UÒªÿÿ¬Ì¬ÌS3ÿÿ  ßäÿÿÿDÿÿ€ÿÿýí˜@¿€Ÿ¿` EEñºÿÿÝVÝ^"–ÿé~-°þš„>ÿ.äûÿ‚'þwˆàÿ–ÿðÿÿVÿÿÿÿd’ÿÿÿÿ2½ÿÿÿÿUkÿÿÿÿþÿÿÿßþßþ ÿÿþõþõ ÿÿ’“’“mlÿÿ_\~ ÿÿÿRÿÿÿÿ#§#ÿÜ¡ þ ÿuÿÎÎâ1ÿÿ2ã2àÍ`ÿŸôÄoø¦À?ÿ8#À ÿß RÿÿÿÿŸüXÿÀ?ÿÿÿÿÿÿ $ÿÿÿÿÅBÿÿÿÿÛÿÿÿÿþÿþÿÿýý€ÿÿ×]×](¢ÿÿ»¬»¬DSÿÿÿ€ìÿÿõÿÿÿÿ (; ßìCýÿïÿ*Åïÿÿ—Ÿ–€h€ÿr.1øÀ¹þ€!ß¹AþÿÀ?ÿÿÿ†ù%ÿÿÿÿi«ÿÿÿÿ@ÿÿÿÿ½ÿÿÿÿ¯ÿÿÿïo€ÿÿÿÏÿÏ0ÿÿl³l³“LÿÿFXFX¹§ÿÿÿ@øÿÿèHÿÿÿþ'Ú7ß'ßØ óþÿÿO"O"€ÝÿÿÚàÚ$ÿþÍûÿÿ›÷`ÿÿn*ÿÕV ÿÿÿéÿÐüÿÿÿÿÿÿÿRÿÿÿÿ×_ÿÿÿÿ]·ÿÿ÷ÿçÿÿÿíÿíÿÿÿ›¬›¬dSÿÿ¹¹Fÿÿÿÿr€ÿÿÿÿþþèÌêÿèÿ>@Â@ý¿ÿªmŠm’ÿÿ'7$8Ø?ÿÀ¸=Gÿÿßàÿÿþÿú-WB¨¿ÿ£ÿ[øÿÿÿ!(ÿÿÿÿ ÿÿÿÿ¨¡ÿÿÿÿïÿÿÿþûþÿÿÿŸÿŸ`ÿÿvùvù‰ÿÿ[D[D¤»ÿÿÿúàÿÿÿÿ¢¢¢ÿ]ðõÿðÿìûÿÿÉ 6ýÿÿÈ|Ƀ1ÿþ@þ¿ÿÿ ïðÿÿÿÈ ÿõÿ _ÿ‡ÿz&øÿÿÿˆ”ÿÿÿÿ”ÿÿÿÿÓMÿÿÿÿËÿÿÿÿÿÿÿÿ×~×~(ÿÿý.ý.Ñÿÿ­ƒ­ƒR|ÿÿÿ¥ ÿÿÿûUÿïÍÅßúßÿ Ø!!÷ÞÿP\P\/£ÿÿ–pŠmÿð ÿóÿÿÿðÿÿÿàÿÿI I¶ÿÿä(ðÿÿÿDÿÿÿÿ)ÿÿÿÿZÕÿÿÿÿwÿÿÿþÿþÿÿÿÿ?ÿ?Àÿÿå»å»DÿÿÞ?Þ>!ÀÿÿÿxÀÿÿÿ÷ )ª ÷_ÒOÿ°÷ÿ€@¯üÿŒÇŒÇs8ÿÿ (ÿ×ÿà€ÿÿÿÿü"ÿÿÿÔÿÿ26É?ÿÔ‰ðÿÿÿTÿÿÿÿ @ÿÿÿÿ¥-ÿÿÿÿ­÷ÿÿÿÿïÿÿÿï_ï€ÿÿ¾Ï¾ÏA0ÿÿùùu€ÿÿþ ÿÿ(ÿ÷ÎvÎÿÎ÷1ä.ÿÐÿÿ  øÿAA¾áÿÿÜ)#ÿ_û€ÿûÿÿƒú|ÿÿÿÿÿÿ\þÿÿÿ àÿÿÿÿÿÿÿŠÿÿÿÿ]ÿÿÿýíÿÿÿîßîÿÿÕ¼Õ¼*Cÿÿõvõv ‰ÿÿhÿhà—ÿÿýÿÿŽŽýqѹûûo‘rþƒÿü+A)þÐ?ÿYXë¦ÿÿyÄGî¿Æ9@ÿÿÿ€ýþÿÿ¿û@ÿÿ¡ÿÿÿ©àÿÿÿ#qÿÿÿÿ «ÿÿÿÿjˆÿÿýÿèÿÿÿÿëÿëÿÿýý€ÿÿ¯5¯5PÊÿÿìÿì€ÿÿö€ÿÿ v$v v߉Jßÿßä Kƒôÿÿ{ñÿÿRòRð­ ÿþb µú4Ëÿÿÿÿdÿ“ÿÿÿ€ÿÿßö ÿÿŸÿPÀ?ÿÿÿTÿÿÿÿÿÿÿÿ×wÿÿÿû¿óÿÿûôûô ÿÿßjßj •ÿÿÜÛÜÛ#$ÿÿëÿjÿÿù@ÿÿˆ·‰¿ˆ¿w@ÌTÿÿÿÿ¡€`ÿàÿãÿÿ  ÷[ÿüØ=[ø[¤HAÿÿÿÿtÿ‹ÿÿWÿ¨ÿÿÿÿÿÿ¿ÿQEÀ?ÿÿÿŠ¨ÿÿÿÿHÿÿÿÿjÝÿÿÿÿÚ¿ÿÿÔÔ+ýÿÿ µ µßJÿÿ3·3·ÌHÿÿïÿäÿÿêÀÿÿZ}~ÿZ¥€(ÿÿÿÿ€ÿpðÿ(ÿÇÿÿ!C!JÞµÿøˆj¿èâ¿ÿ¿ÿ@,ÿÓÿÿÿúÿÿ‚ý}ÿÿ?ÿÀ À?ÿÿÿ$ÿÿÿÿÿÿÿÿ¿óÿÿÿò÷ò ÿÿÿÿÿÿ**ÿÕÿÿŠþŠþuÿÿÿþàÿÿ¼ÿÿ Ъÿ*ÿÕ@ïùïüÿüÿÿPPÿÿÿMƒM˜²wÿàP>ÑÐ?/Àªÿÿÿÿÿéÿÿ¨ÿWÿÿþðÿÿÿÿJÀ?ÿÿÿ)¨ÿÿÿÿ€ ÿÿÿÿÕ_ÿÿÿ _ _ÿÿÿÿÿÿÿÿÿÿ__ý ÿÿýw€ÿÿòÿþÚ¤ÿÿûÿÿâÿù¾ü @ÿÿ  ÿÿÿlCý¿ÿÀ"=&¿"?ÝÀ"¿ÿŸÿ`ÿéÿÿ@ÿ¿ÿÿ\¿ ÿÿ_ÿÀ À?ÿÿÿDÿÿÿÿ4ÿÿÿÿªþÿÿîîÿÿÿÿÿÿÿÿÿÿÿ»ºÿDÿÿ÷¿ÿÿÜ ÿÿ1ûÿ»ÿD5ÿÈÿúÿø€ÿÿÂBÿ=ÿÿŒêˆ¦s^ÿ6U7ûÈ€É×ÿÓÿ,@Žÿñÿÿÿþÿÿsÿ€ÿÿ_ÿ€€ÿÿÿˆÿÿÿÿ€Dÿÿÿÿ½ÿÿÿÐÐ/ÿÿÿÿÿÿÿÿïÿÿ÷ôÿÿÿ€Ûÿÿñÿêrÿÿ€;ÿƒÿôÿà€ÿÿ€€þÿÿY7PO¦¿ÿA*×Gÿ¸Q"ÿÿ ÿôÿ€ ÿÿÿÿïÿÿÿÿÿÂÿÿÿÿ"ÿÿÿÿ ÿÿÿÿïwÿÿ  _ÿÿÿÿÿÿÿ‚‚ÿ}ÿÿÿàþÿÿ5ÿÿü  ÿòÿÿ¿ÿ@·ñÿèÿààÿÿ@@ü¿ÿÿ4à&Épþžž¯ž¯aP¬MÿÿÿÿPGÿøýÿÈpÿÿÿÏþÿþÿÿÿÿÿÿÄÿÿÿÿ€ÿÿÿÿùïÿÿ ßÿÿÿÿÿÿÿïÿÿÿoÿmÿÿ^ÿÿýÿêA¾ÿ€[?¤Üÿ@?ÿÀ@?ÿÿùëÿÿ5Ä+.Ääø/ o[/ Ðô®ÿ®¿Q@*øÿ€Š·üÿÿ?õ ÿü¿ÿÿÿÿÿÿÿÿÿ €ÿÿÿø·øÿÿÿÿÿÿÿþÿÿ¨¨íWÿÿ³ðÿÿÿÿR /'ÿØVú©ÿÿüÿþ€ÿ ÿÿÿ ñýÿÿGÀlQ³ÀÀ?}d}í}e‚š®Êÿÿÿû@ÿüÿÿ€Æ~øþß zpÿðÿ€ÿÿÿÿ…ÿÿÿÿÿÿûðû°ÿÿ€€ÿÿÿ’’ÿmÿÿ òpÿÿÙÐ ÿÿÿÿè?ÿà½ýBÿÿñPýÿþÿÿÿ÷ÿÿÿÆ<1~O<€Ã5Ü¿ÿ7ÞÈ!ÑÿÿÛ$€°ÿþÿÿœ}ðüÿÐ/èÿà?ÿÿÿÿÿ•ÿÿÿÿÿÿÿÌ·Ì3ÿÿÿÿÿÿ©©ûVÿÿtötö‹ ÿÿðàÿÿ ÿÿP0?ÿÀþðÿÿ†ÿ XòÿþVÿÿÿRPï¬ÿÿÐ;L»¼;Äÿ¿ÿÿÿÿ‚ª×ÿ×ÿ(Aÿþÿÿ¦áÿÿ¡_ÿo¿ÿ€$€ÿÿÿ !ÿÿÿÿ€ÿÿÿßþÿÿ ÿßÿÿ•û•ûjÿÿÿÿÿ¿ÿÿð€à€€ÿWÿÿ€¿?ÿÀø€ÿÿ ÿ$BÜÿü¬ÿÿÿ22Íùÿþà›WhC¼àjêÿâÿÑÿÿûÿè ÿÿÿÿš<Ãÿÿ€ÿ ÿ€ÿÀ@¿ÿÿÿÿÿÿÿÿÿÿ@¿@¿ÿÿ  ßúÿÿ^ö^ô¡ ÿÿÿÿþ ÿÿô Lppûÿÿ‘zþ€Þˆ ÿ÷qÿ@¢°ÿøxÿÿÿ`@ Ÿòÿü±˜u½õ b_oNO±° µÿÿÿÿ„ÿÿÿÿ„ ßÿÿ€ÿÀÿ€;ÿ€€ÿÿÿX‰ÿÿÿÿÿÿÿÿÿÿÿ€€÷ÿÿuÿuýŠÿÿÿÿÀÿÿåPø ðò$ÿÿðÿÿú ÿý\ÿ =`ÿ¸˜GÿÿÿÀÀ?åÿø ¹ÿûü¹FÀhêýÈü7Õÿÿÿÿi ÿÿÿïÈ¿ÿÿÿ ýýÿÿ€€ÿÿÿÿÿÿÿ"ÿÿýH}H·ÿÿÿÿíÿÿÿÿÿPÿÿÿèÿÿS€úøøçÿE¿Àÿú@)@ÿ×8‘÷@gÀ?ÿðpþÿÿÀ^ÀE?«ÿðûøûýûù‰_ïëáŠÿÿ_ÿ Dÿïÿï€ ?ÿŸÿ`L!þ ü!Þ{€€ÿÿÿAÿÿÿÿÿÿÚÚ%ÿÿÿ-2-2ÒÍÿÿÿÿú ÿÿþÿû ýùð¸ÿÿ8Àÿøƒû‡xzïk€ÿàÀüÿÿ3ÿßÿà…@ïj¯@P¿è·ýýìHÿÿ€ -ÿÿÿýÈÿÿÿÿAýBüA¾ ÿÿÿÿÿÿÿÿHÿÿâÈâÈ7ÿÿkk”€ÿÿ¿ÿ´@ÿÿ° ÿõƒûûðrzrÿÒaþüÎÓ¢|nX§xù9ÿÿÈÈ7ùÿÿfþ¾ÿÁÀÔ½Ð/ãQ[ûQû®UBÿÿÿÿ*²ÿÿÿ÷ )ßÿßÿ Pú‚Úƒ%|ÿÿÿÿÿÿÿÿÿä"d"Ýÿÿ—ÿ—ûhÿÿÿþBÿÿÃó÷÷üèÿÿïÿ@R@@¿ÿñëüqó(÷ç÷ï@/ÿÿÀ @ ?òÿÿËú{ÿ„Xë[ÃY<¦ÐÊöÿÒÿ-ˆEÿÿÿÿI ÿúûúŠ¿ÿŸï`CÆïÅïÇ8ÿÿOÿÿÿÿÿÿÿ ‰ ‰_vÿÿ«ÿ«ÿTÿÿÿô ÿÿ"ÿÿüÿÿÿÿÀÐÀ?ÿa­Ôþ#ûÁÈ÷ÿïÿÀÿÿÀÀ?ÿÿÿ  7ôwÿˆ ª çõòû¿ú¿@ €ÿÿÿ÷+ªÿïï€%ßÿßÿ P'ý%Ü'#Ø€€€í ÿÿÿÿÿÿÿêFêF¹ÿÿ¿ÿ¿j@ÿÿÿÔHÿÿ?ÿÿàAû¿ÿÿÔÔÔ+ÿ]„òÿÅì,ûÿÿÿ€ÿÿÿ÷ÿÿBF@®½fÿ™È´è½È´7Kœ)¾ÿœc€¥ÿÿÿÿACûûùëHßÿßÿ ëþíüï €(€ €ßoÿÿÿÿÿÿÈhÈh7—ÿÿ¿ÿ·Ú@ÿÿÿ €ÿÿÀuߊßÿ ÿÿÿÿø"øøÿ!t¡èþøùÿ?ð.0Àÿÿÿïÿÿ RòÐÿ/€B€ý"[ÿä€ÿÿÿ€´÷ÿ÷þЯÿçþ¼ýüñ€’ €í¢¢¢]ÿÿÿÿÿh¯h¯—PÿÿÿÿýPÿÿý ÿÿÇßø ÿÿ¾ÀA?ÿÿhêèÿ2ÄÆþ9rÿùÿÿÿÿÿxxý‡ÿÿH@Aÿ¶ëÿ€ Ð)€ ß‹TŸÿ›ÿd!ÿÿÿÿG¿ï¿ï@ ßÿÏÿ0.¤þªþ®Q­’ro¡@©@¡@^¿ÿÿÿÿbbèÿÿÿÿöÄÿÿú†ÿùðÿÿÿ¡_ÿÿ8!øøÿ -ðìÿßú"øÿ  _ÿÿÿðàÿÿÿ1È0ßÍßþ (DéFèD»hëÿƒÿ|ÿÿÿÿ”¥ÿÿÿï Ïÿçÿuõ õ óÖªÖªÖª)U¹ð»ð¹ðFÿÿÿÿ¿¿è@ÿÿßÿÝP ÿÿôÿà½ÿÀÿÿÿÐ/ÿÿúøÿ¿Áøþ¸ÿýÿЀЀ/ÿÿåÿÿÿ*%`Óü€€ jà ô(€½ÿ=ÿ¨ÿþÿþXþ­þr€×ÿÇÿ8‚ZêVâ^¡‚ªª«‚ª}UøWøGø¸ÿ@ÿÿ Ý Ýß"ÿÿÿÿêÿÿ€8??ÿÀ;Àÿÿáÿÿ @ôðÿS€ðÿe}#-þÿôô ~ÿÿ` þÿÿ.{#€Ïÿðá"gñ#Ü4€ÿÿ€ÿÿÿÿ ¥ûÿº·EH`C×ÿ÷ÿ6@¶]¶LI³FÑFÕFѹ.å^ÿþÿþÿÿÿƒ¿ƒ¿|@ÿÿÿÿî€ÿÿPH_Oÿ°ôþÿÿÿÀ?ÿÿR úz…ÿ·àÐÿÄÿ8ÿÿËË4ÿÿÿCHC½7þÿ ¯'ßÿàÅ =ý õ¾ÿßé ÿúÿúð¿õ¿ô@ o÷g÷˜„ Õ5Ä;â$ 5*$ ÛßÚ#ÿûÿûÿ@ÿÿ??À€ÿÿÿÿ²ÿÿi~þ€Áuÿÿÿðÿÿ ÜÜ#ÿV€ðýôÿpÿÿä6d6Éÿÿ€R€R|-ÿÿf—ûÈø %øÿ<ÿ}ÿ‚P"¯ÿÿ€DúþØþ'pWÇÿóÿ C {€{„ЗÔ×З/hàVÿþÿþÿÿÿœ×œ×c(ÿÿÿÿèÿÿ£üÿþÀ—ÿÿöàÿÿR úúÿPpùôÿtµÿÿÞ€Þ€!ÿÿädøÿÿéŸ^Œ?€Âž’~ý5!¿þ?ÿÀûûÿù.²ÿÿ~ûˆï~ï~ ƨö öß Š>«?‹?tÀ‘ÿúÿúÿ€ÿÿv×v׉(ÿÿÿ÷qÿÿLÃü ÿó u(×ÿÿêÿÿ¨üüÿ V ° Ðôâÿ ÿÿÕB•B*½ÿÿ ÁAö>ùÿ/>#Ü€³OoÿO°ÄïîÏÿ0T«ýÿù€Kêÿ¢Ï]0Q5ë¿û¿@((u(1×ÎVzVÿV©€Óÿÿÿÿ?ÿÿÿÛûÛû$ÿÿÿýäÿÿøÿû×ïÿîô ÿÿ@üüÿOðüòÿ7 ÿÿú„ú„{ÿÿ£"ô\ûÿÒ$¼¾ÿAÆDžÖ~Æ9ªÿøÿÿøûÿûæ×ï×ç(¸£å÷ð÷  ã c_œ_lÿo_o ªÿÿÿÿ?ÿÿÿoÿoýÿÿÿúØÿÿàÿå+(×ÿÿhÿÿ þþÿ ³Ðüñÿ*ÿÿöš&š eÿÿÇ Äì8óÿ물­ÿR0FoþF¹p ôÿ€ø ÷ÿò ó!û·ó' ØD0ø0ü0Ï‘¡åáþOcO÷O÷°Qÿþÿþ?ÿÿÿÿÿÿÿÿÿÿÜ ÿÿ*/à+ÿÔÓP¯ÿþ¸ÿÿþþÿÝ°øñÿwÿÿö@ö@ ¿ÿÿS‡\¼xãÿR¼ õ€0o ÿúï$ÿø¯ÿPüGïÿï"Ukbîáþýÿ!V••üj?t?À€ÿÿÿÿ¿ÿ€€ÿÿÿÿÿÿÿÿàìÿÿ¬8¿Á¯þP/`Ÿÿÿ4 ÿÿýü÷ >Ðüøÿÿÿû¤»¤[ÿÿ“ˆXèçÿ€üÿûáDïÿÎ1ˆÿßßÿ øoÿÿÿÔþ—ô‡ xÙŒþçßï z/®/þ/ПHŸÿŸÿ`ÿÿÿÿ?ÿÿÿöÿòï ÿÿÿРÿÿ2T? ?ÿÀqÓðÿö½ÿÿþ þ÷ +¯ð”ðøÿ¿ÿÿääþÿÿCW9P¸¨ÇÿG¡¸ÿÿÅ_?ÿÿÿ®þP¿ÿ@ðÄîÿæÒÀÒëÒÉ-6Âßÿ×ÿ(‘‘U‘nþ7Òwÿ7ÿÈ$ÿúÿø?ÿÿÿÿÿþýÿÿÿÀPÿÿèpÿƒÿü‚¯àÿÿ~ÿ€þ€þ€Îtèø÷ãÿÿèè÷ÿÿ§KÐH0°Ïÿ‰þvÿÿ€ïÿïÀýÿÿÿqoÿÿÿÞ¿ÞÞí!PþúþÚþ%"**ÿÕ’`›ÿšÿe Iÿýÿý?ÿÿÿÿÿýRÿÿþ€ÿøÐåÿÿú_×Ð/ÿ¿žþÿÁ?ÿÿ/—Г°lú; ;ÄÿÿáUáUªÿÿG1pàÿWù(ÿÿ€ÿÿ÷úøÿÿd,nþ,ÓêÜêÿêÿêþÿþúþ•UþþÑ€÷ÿóÿ B,ÿþÿü?ÿÿÿÿÿý¼ÿÿûÿþ!Àþü€ _ _ÿ.ÿÿ19Ï»ÿ;Ä ®_D ðüúÿÿPP¯þÿÿ_àRá¡þÏë0ÿÿ@¿ÿÿÿVè©ÿÿÓz/úÿúÀ½ÕÀç?¤üöþ¶üI £*« £õ\†hßÿŸÿ`­ÿýÿýÿÿ€€ÿÿÿô ÿÿô ÿöŽ¿ð@WÏÀ?ÿþÿÿéx|ÿx‡(½¯(/àÐý ÿÿÿÿäÿÿîW Aá þþÿÿ€€ÿÿ°ðÿÿˆ°}µý°OL în÷‘vñÿõ~ñFRWGÿ¸‚·ÿ·ÿHBÕÿÿÿýÿÿÿÿÿk€ÿÿÐ - ÿòƒüÿèž¿€ÿÿÿÿx®‡¿ÿ®Q ÿ_ ààÿ……zÿÿedï™ÿþ´Â¥Á@?þ~ýÿÿ­GR¸ÿÿÿa ÿßšÿšýšeˆHÝ]ˆLw³ÏpÿúÿðQøÕýUøª•Tÿÿÿÿ¥ÿõÿõ ÿÿÿÿÿÚÿÿhÿè $ô/ÿЀÿûVÿÿ´“K¿ÿŸ`د «àTÿ  _ÿÿÿûÿül€Gƒ€þ¿ÿ€ÿþýÿÿüÿÿëUãïpp¯p ò’ô×õÒõ- t<~¿t?‹À¸€ÿÿÿÿTÿþÿüÿ@ÿÿÿÿU€ÿÿ€_ÿè(ø?ÿÀ;ßÿÿûÿÿzl…ýÿü.± à€¿Ð Ð/ÿÿêåÿÿü<üÂÿü ¿€ÿÿÿÿÿ–DCÿ¿ Õ*Õ *õ"}¯"Ý€A¿ëëàˆ*­­oR¤ÿÿÿÿ‚ÿ×ÿÒ-ÿÿ€ÿÿÿø¨ÿÿ°··ÿH±áþ€ÿÿÿÿ†ÿÿükÿÿ€Á™ÿ ßà ÿÐÐ/ÿÿ\Zý®ÿñ|î$Åÿü`ëàÿ¯ïÿÿ*HGý¿ÃëUÃ<ïyEzïxo‡jêÿÿþî ^¿¾áA(ÿÿÿÿPÿþÿþÿÿ€ÿÿÿÕRÿÿ"?ûÀ.пÿ@ûÿÿÿƒÿÿ¾A«ÿ¡^^ÿ ÿàÿöv ÿÿÀÎú.ÿñùl ‚ÿü$¸ô¨ Wzµÿÿš‡û Ê’Ê5ýOM_Oû°nÿ&¿Ù@Fšïÿïß ÀÿÿÿÿAÿùÿøÿÿÿÿÿðhÿÿü ÿÿ÷x ~þÿÿÿþà ÿßþªþÿþaÿ à€ÿß ‡ ÿÿûiûTœÿãýVEˆÿüv€ïÿý1 ôÿ%ýÿ¿Ÿÿ`EëßÿMï²`Ðûÿ{ÿ„ ÿ_ÿÿÿâÿàÿÿÿÿÿÈÿÿ ÿÿî´P@üÿÕûÿÿúÏÿ÷þZÿÿû°õ ñàÿ{ÿÿÿsÿh¸ÿÇúðŠƒÿüL¯áPQQ®û„g¤[ÿARþý ­_÷ä }ÿ}ÿ‚¨ÿÿÿÿÀø?ÿÿÿÈÿÀ?ÿÿÿÿÿ@ÿÿo¡oþoÿðüüÿÿÿúÑÿïþkÿÿÿÄÿ Þà!ÿÿŠÿÿñ£±‘0ÿÏúÔ‡ ÿøò¸øø»ª»UDðŠø~þ\]\ÿ£ ^½=ñ ßÿßw ˆ’@ÿÿÿÿ;ÔÄ+ÿÿÿýÿÿÿÿÿúÿÿ‚—þ‡ÿxa†üþ×ÿÿÿ}g‚”ÿëþÿÿý’_0_ð ÿWÿÿ¬§¬PSpÿñ¹ÿøþDÿýU]ª¢£àøø@RBÿ½U¿ÿ>ÿÁÑ ÿÿÿÿÿÿÿÿ^á ÿÿ þõ€üÿÿÿÿòƒÿüEoþOÿ°Âøøÿÿÿÿýrÿïþ`õÿô Õ€ÿ Ýà"ÿÿUÿÿëÏB àÿõ¼( ÿøÿ¿ÿ@Eÿÿþüÿ÷°êþÿºÿE- ÿÿÿ€Hÿêÿÿ}Þ€!ÿÿwý‚ðÿÿÿ@ÿÿè ÿòèÿøïÿËŠøðïÿÿÿ÷©Hÿ÷ÿÿÿÿþ¢ÿÿà¿ÿÓÿÿt_t ŠÀÿ?ñy’ÿøžŒ`ÿðRÿý,ýÿü3ÿì Z»ÿ²ûMÑÿÿÿÿ ÿõÿÿøáûÿÿ÷  àÿÿÿÿÿÐhjhÿ—+¿Ô?ÿÀ€ ðô?ÿÿÿÿ|Œÿóþ+ÿÿïÄ ïïðÿÿ ÿÿî¿e@Àþ?ëç †‘ÿx;ûÄÿþ  _  _àHêÿèDåOD»ð€‘îÿ®ÿQ ÿÿÿÿ½ÿBÿÿän óÿ?ÿ¨€ÿÿÿÿÿŸŸŸÿ` ?ÿÀïÿ?ðÀÿÿÿÿü³Bÿýÿÿÿ ¤_ððÿÿ«ÿÿÿî„€üõ| ‹ÿp½ú@ÿÿê/ÿÿÁ?Õÿ~À™Ð»À™?f&b¿ÿ?ÿÀ€ÿÿÿÿwèˆÿÿFŸ> ÁþÿÿBÿÿÿÿ€ÿÿswwúˆÞ¿ ?ÿÀààïÿÿÿÿØ$ÿûÿ)ÿÿýF€ïÏð0ÿÿ ÿÿë@€üë+³þxî€ÿÿýýÿÿAÿkÿC¼R(×}Òy-†oO°€ÿÿÿÿhü—ÿÿcøøÿßÿÿÿÿÿÿ±û»íD½ý@ÿÿ7¿°@ÿÿÿÿÿZ¢ÿý~’ÿÿüÿÿðÿÿCÿÿúuøÿï|·‹þp«ýTÿÿþÐ/ÿÿJ‚ÿ×ÿÃ<@h®@¿ñ@ ûÿùÿÿûÿÿ×þ(ÿø¯Ðàÿßÿÿÿÿÿÿ(¸-¿(¾×Añúÿþ À€?wßÿÿþ¦Zÿý„~ÿþ¢A÷Ò§°XÿÿMÿÿ÷YøÿÞ6¡!þp/ÿÐÿÿê ßÿþ+„ÿ®ÿ†yPfÓwÒf-™Ðÿÿßÿ ÿôÿÿÿ  ÿð¿`€ÿ¿ÿÿÿÿ$ÿÿO¤OÿOÿ° øôÿÿ``ÿàÿÿÿÿÃ?ÿü>ˆÿþFÕï$ïÔ ÿÿÿÿìÿâñÿê i£þpýbÿÿ\£ÿÿÿ bª÷ªæUÀê¯èðDÿÿýÿÿëÿÿÿ€+ÿÀ'÷åÿî ÿÿÿÿÿÿ¹ »ÿ»ÿDW¨ÿü€ÿÃ<¿^€ÿÿ^­ÿþ_ÿÿ÷„1ߨ×Ø(ÿÿ ÿÿåÿPãÿœ,‹a‡þpwþˆÿÿP ¯ÿÿÿ†¿þ¿ö¿ @€bª÷‚r}€ÿÿßï «ÿTÿÿôÿÿ/ÿ|ÿ½ÿBÿÿÿÿÿÿ:€ÿ?ÿÀ¿¡@ÿú@yÿõ ÜýÀ?ÿÿ¢Xÿûž„ÿPSõ õÐ ÿÿÿÿÉÿäãÿä$a³Ÿÿ`*ùÕÿÿ@¿ÿÿþÂìïÿîïý_¼Cð@ÿÿÿÿúèÿÿè×þ?¾àÿ{ÿÿÿÿÿ@ÿÿäÿþÿÿ}d€'ÿØ/ÿïÏ©À?ÿWÓ+ÿò ?@¿ÿÿ´Xÿˆýøÿÿ%ÿÿ{ÿ¨Çÿì I—Ÿþ`)óÖ ÿÿ¨Wÿÿÿ†_þÿö_  Ÿ¿·¿7@È@hÿÿÿÿïþÿÿPþøý@?ÿçÿ@Dÿÿÿÿÿÿè ÿõÿÿýÿàM÷ÿe{àÿÿ¡Xÿù€€ÿqõ€áðÿÿIÿÿ»ÿèÇÿ$“aŸþ`E_º ÿÿÐ/ÿÿÿñÿû¾ùAT õTo«ÿÿÿÿ^ø ÿÿ²õèû÷ €ÿÏÿ€ÿÿÿÿÿÿ#ÿÜÿ€ð„¯ÿP¨ýÿî¨À?ÿð ÿùOÅ@?¿ÿôrÿ‚ÿò ÿÿÿÿW½pÿ½¡1–AŸþ`¿è@ÿÿ ßÿÿÿ¬cþ÷üó µÿ÷õ÷ @(ÿÿÿÿ ~ö€ÿÿÐèà÷߀ÿÿÿ ÿÿÿÿÿÿÀ­ÿRÿÿÑI_þ P÷ÿ_W€ÿ_òÿøW€@¿þ¹4ûĹôF õÿÿÿõаÿhºa—ÿ`kí”ÿÿD¢¿÷ÿ³LV„ÿï÷¯PI@ÿÿïÿ€ÿÿÿÿÿèÿÿ ?ÒÀÿþÿÿ?ÿÿÿÿÿÿÿ{ÿ„ÿÿ¢¿ý@ ÿÿœŠ€ÿ'îÿüO†À¿ÿŠ0ßÈøpíþÿÿ àÿù5ñþàß÷ ÿÿ Bÿïÿï‰@ûÿëÿ* ÿÿûÿ@ÿÿÿÿÝüÿÿ(/~À€ ßüÿÿÿÿ ÿÿ÷÷ÿÿÞù ÿÿƒ$ü€ÿÿUÑÀ€? ñ ÿüH ¿_ý€½:ÿÖÿêßÿÿþOáÀ?ÿz·`€ÿàuýŠÿÿDE¿ÿþ÷ €ÿÿÿÿ ÿÿÿ€ÿÿÿÿ?òÀÿÿ@¿þ€€ÿñÿÿÿÿÿÿçÿ÷ÿ+ýÔÿÿ P ÿòÿÿMÀ?ÿ…q€ ü[Æ?oÿ€V$ÿÊ_ö Uýÿþž@À?ÿ÷ýp ÿà߯ PÿÿÿÿÿÿH@ÿÿÿÿ ÿÿÿÿÿÿÿÿ—¬hÿþƒúÿÿûÿçÿÿÿÿçÿ¨8Çÿ_ê ÿþØ [þ¤ïÿBÀÀ@?¿F¸D»üOÀh>Wþ€^ÿàÿü§úÿüs€€ÿvö@ €ÿà¿ô@ ÿÿ ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿþÿÿoãÿü×øÿÿ¿00ÿÏÿ÷ÿÿ_ÿpÿ¿Ô@ÿÿSWÿ¨ÿí¥àÿ| ßþ"Ø'/ÿÀ,¶ÿÊÿö5ûÿü=€€ÿ÷ïÀÿàÿ¨Wÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐàÿü`ßÀ ÿÿ@ÿÿÿþÿÿ6¿ðÿÿÿÿô€ÿÿ÷ÿ2€ðÿP¼T«þ[àxgÿ€*”ÿàïü¯öÿø~¿ÿÿqÅ €ÿà»ÐD/ÿÿÿÿÿÿ„2ÿÍÿÿûÿÿÿ ßýÿÿÿHÿðƒÿÐ@?ÿÿ?€€þÿðÿøÿÿðÿýÿþUú€¿þHèû))ÖþÀ*?5ÿÀNŽÿúÿöò ÿør‡ÿÿ ÷0@/ÿÀýÿÿÿ@ÿÿÿÿÿêÿÿµ@J¿ÿÿ@¿þÿÿ^£ ÿñE¿ààÿùÿƒþÿÿéÿðî÷ðÿÐÿêôÿ÷ÿÿðþ–V©ô ÿà!ûàûüèÿñú/ÿÿãÇÀð/ÿÀºEÿÿÿÿûÿÿ*úÕÿÿéÿÿÿ€ýÿÿÿBÿç ÿÀÀ?ÿáÿÿÿÿ£/ÿÀçÞðÿ<ßßë ÀÿßU¿dø$Û£Œ«¡T_èÿàõrñ~äPÿãô‡ÿÿÃ@¯ÿÀê€ÿÿ ÿõÿÿ˜¿g@ÿÿ6VÉ©ÿÿ€-Òÿÿý+4ÿÏÿ€€ÿ›ÿçÿÿ« ßÿ†ÿpðÿr wöˆ8ÿÿÿNü õ“Ðè/ú„ ÿð-ÿâÿþÙÿãªÿÿÇ€â_ÿ€¹Fÿÿÿ5÷Êÿÿg~˜ÿÿýªUÿÿ€ñÿÿº 1ÿßÿÿÿÿ ÿÿûW@¿þ§¿PðÿUÿé€ÿÿ©€«þTÄüûŠª¨UW‚l ÿpÌÿöÿúÞ$ÿã°/ÿÿÆï`ÿ€D»ÿÿÿZþ¥ÿÿ¼ÿCÿÿÿÕ*ÿÿBÿ½ÿÿíLjÿ¶?ÿÿÿÿ€ÿÿù]=ÿüjððÿ&êoÿûðV‰ÿð(ÿÿ"vâ‰XJÅÿ8 ûóûÿ°8ÿÇ ÿÿ‡ Ã?ÿ€‘nïÿÿÿùÿÿÿÿÿÿÿ4Ëÿÿ‰ävÿÿȦÿ^ÿüÿÿÿÿÿèºD ÿð'ßððÿM_ÿ €AÿÀ?UaÿþÀÿÿ†¶†¿y@Â>¦Eÿ8 ‰ÿñûÿµH0ÿÏ@ ÿÿÇ9fŸÿÿüÿÿ-ûÒÿÿÿÿÿÿÿïÿÿN°*ÿÕhMDþ¼ÿ ÿÿÿÿÿÿ¸p˜'ÿÀw{ððÿ”Hÿÿ¿ÿÿþÿÿ…BÀð? 1!wÞˆJxå"ÿšÿáïÿ&Ppÿ ÿÿzÅ?ÿG¬¸Sÿÿ÷ÿÿÿÿÿÿÿÿ°Oÿÿ¸B”ýkR‡B½púí ÿóÿþ ÿÿAÔ`+Ÿÿ=þøøÿáÿÿ?þÿõ/ ÐÿÿÃcâü˜EMo²AÓ2ÿ ÿûûýä€àÿ€ ÿÿþÿèÿÿ^ÿ¡ÿÿ¿µÿÿÿÿÿÿí^ ~òbXøÀ?ÿWppÿÿè-ÿü“€€ÿ[køøÿÿÿý¼ÿP ¯ÿÿÿ\è èÿ¡£÷\Z¼jƒ›ÿùÿÿààÿ?ÿÿ¬´‹þUÿªÿÿÿÿÿÿï_ÿÿßýÿÿÂ*ºýED óÿ®À@ÿ¿ÿ¨¾Aÿðÿÿÿ=Þøøÿ©ÿý ôx ÿôô þ‚</íÐoû!½¨¢Y_Äÿùÿÿ$ààÿ¿ ÿÿ2 ÿü«oTÿÿÿÿÿÿÞµÿÿ£ÿÿÿòM>Áãÿ8€Äÿx€€þÿ¤|ÿÀÿÿÿÛwøøÿÿûèàÿ€ÐÐ/ÿÆí òøD$D »ß€¥]ÿƒ„ùÿÿÀÀþ? ?ÿÿ=åšøWÿ¨ÿÿÿÿÿÿûÍÿÿUÿÿÕÐW¨ç·ÿäÿhÿñÿú‚ ² ÿÿÿÿxøøÿ€ÿÿÐÀ/?ÿÿ  _ÿøb=ÿÀ±±NëˆO^@¤¿Dÿùý€€€ÿ,ÿÿ|iÿø½ÿBÿÿÿÿÿÿ~à@ÿ¿ƒ¿ÿÿ¢?1ÀÎ_ú°@?ÿÿãÿú6üøyÿÿÿS÷øøÿÿû“ €_ÿÇÿÀÀ?ÿÿÀÿàÀ Ô¨+WA· ÿßýÿÿŠ€€þU~ÿÿmwÿøÿ€ÿÿÿûÿÿ›Tÿÿ(jÿÿ$oîï ÿÿoÿØx‡ÿàt;ô ðàÿÿÿýüüÿüÿÑ€/ÿÿÿÿÿÁ(ÿøÿF€¹FGEÀ»¿‚Uøÿÿƒüÿ,~`ÿÿ¢oÿðÿÿÿÿïÿÿÿä!ÿÿx(×ÿhÚ€$þŠ€ÿýÿààÿá±øàÌ3ÿÿÿ¯¦üüÿ­þ ]ÿüÿªÿÿÿðŠÿþû¢?ªÀU€K ßÀƒ?üÿÿÿÿDþ(ÿÿ{¿'ÿðê¾ÿÿßúÿÿ‹Fÿý8ÿïu‡ê€ødÿø_ÿÀÀ?ÿò!ðà€ÿÿÿU_üüÿÕýF8äÿþ?ÿÔÿÿÿü@ÿÿ=dOåp€VcV ©ßÀ9?üÿÿT†ùÿ¸ühÿÿàú,€ðª×ÿÿÿþÿÿ°ÿÿ÷ÿ/_/ ÐÀ?à@ÿðÿ ÿÿáO/èðïÿÿÿ)ºüüÿ› þdø‹À€8øþÿýÿÿÿÿüÿÿ(Ž3ÞÿÁï÷ÿÿê6 ñð…zÿÿÿUUüüÿöÃúø‡£€Pðÿ¿~¿@ÿÿÿÿÿ€ÿÿ•XýàƒW€¨Á?ÖÿS¬PŽ†yÿQü(ÿÿÖ^ÿàë÷A¾ÿÿöÿÿÿÿ@ H·ÿƒþÈ8ÿ€ëøøÿÿÿÿÿxÇÀ?ð(×ÿÿÿªüüÿõ!Óõ ø ç"ÿàÿÿ­ÿÿÿöÿöø ÿÿd…ÿøúú°Oà>ÿè¸<¼CÿaùÐÿÿ"?@ÿàI:ÿï¿ùÿÿ)Á…ïz!+ÿÔ_ùÀ?ÿððøÿûÿÿò_Ð/ðÀ?ÿÿÿ(·üüÿûX+ý ðMHÀ·À?·ÿ¿Hÿÿ¶¿¶–I@ÿÿÀª€þz²ÿð`Öþƒ|ð xðÿAý ÿÿÅ( "ßÀ_÷ÿ®ÔÿÿÑ""þÝHNJüµ~äÿÿWÀÀð?ÿÿÿyO@¿ð*ÕÿÿÿhüüÿüÒÒ -ðÿ€þ¾þ¾Aÿÿ²×²ÖM(ÿÿéa¿ÀþDaþð芿ÿ›d©Jhèÿ¹€@ÿÿ­ˆ¿ˆwÀ@U@¿ÿÝjÿÿ•ïj–s¿è@ïÐÿÿr=wwˆÿìÿÿÿúOÀ?ðÐ/ÿÿÿDŸüüÿð o  ø_÷ÿï­ï­Rÿÿp€ÿÿø0€_`ÿ€˜ÿøð<ýÿý ààÿ û*@÷ÿˆý!BÞ€*ÿÿzÀ@ÿ¿%oú¿ÿ@À?ÿ@ÿÿ ûþþÿÿùÿÿSO@¿ðæÿÿÿTþþÿÿ×—×(ÿÿÿÿ­ÿÿÿïõïõ ÿÿo·o¶HÿÿøPopÿ€(ÿø¸ªÿÿÿÁààþ÷¡çÿË”ÿÔ+€ÒUÒ-ÿ¡Ð€ÿ H ßõ ÿúÿ?ÿü£ÿøðÿ_ßÿÿ±Ÿ €ðÚ %_ÿÿ«üüÿÿÿ½ÿÿÿþÿ¶ÿÿÞÞ!äÿÿOO€°ÿÿü€ÿàÿøt± {ÿù’ððÿçÿàAàÿº»D€—úÿl‚ÿýWÐWÿ¨gõÐ0ÿØ;ÿämààÿ¿uÿÿr ÿø´Kÿÿÿ4üüÿÿÿŸmÿÿÿÿ…ÿÿ;Á;ÁÄ>ÿÿ_o_o ÿÿð€ÿðÿüXýÿýÈøøì÷Ó€ÿ ÿ䀓IÒ-ÿĪªûU©«þT?§€€ÿñÿ¿þ@ ú€€ÿöÿÿÿÓW@¿øé@¿ÿÿŠüüÿÿÿªÚÿÿÿÿsÿÿÑ<Ñ<.Ãÿÿþ›î›dÿÿø†€‹Œÿpÿú/&ÿÿ÷Øçÿþ¿@ïààÿ€q¿û!!Þ÷TUþªWô¨ þÿÿÿ‚ þüüßÿÿÝ%ÿÿpÿøê”kÿÿuüüÿÿÿM´ÿÿÿÿ„ßÿÿ«ÿ«ÿTÿÿÿïeîÿÿüØýÞÿ ûüô £ÿ_îÏØð'ßÿ /ÿäƒàþ ©ýÂÒ-ë„®ýQÏ¿ @`¥þÿÿ øøð}½ÿÿk×ÿÿ²‹€øÔ(+×ÿÿƒþþÿÿÿIÿÿÿýu]ÿÿww{ˆ€ÿÿÿÿZüÿÿð+m.ÿÐÿþûÿûÉñðÿÿ_ÏÁ@¿þ]ÿIi–ÿPU_ª „zýÿ¿àÿÿ&à?àÀÒoÿÿßþÿÿñÿøûÅ:ÿÿA4¼üÿÿÿÿÿÿÿkÿÿÿÿý$ÿÿÿÿÿÿø€¾¿ÿ@ÿ÷† ÿÿlüü€Ÿÿ€€þ'ÿ>Š¾ŠAu¡«ÿT#ßhÿï‡ÿø@ ÿÿÿÿ¹ÿÿ¶Šÿÿ2ÿøúºEÿÿ¦üüÿëÿÿÿÿ–ÿÿÿÿ#@ÿÿÿÿ€ÿÿà‘þ»ÿDÿî–üüT¢puðˆ?Þÿüÿÿ¼ýUªIA_ÿ ¿@À?ÿzÿà€/üüÿ©nÿÿ½êÿÿÑÿøÿ@¿ÿÿˆlüÿ( ÿÿßÿÿÿÿÿˆÿÿÿÿÿÿ ~ÿ€€ÿÿ‡€qñLP#°ð€Ôÿü#ÿÿýÿ«T´ÿòoÿÿÿð$?ÿÀZððÿ»õÿÿ·—ÿÿ²ÿøýbÿÿ ”Üüÿÿÿ;ýÿÿýÿÿÙtÿÿAþþ€mû€G@¿ü@ x|xƒ‡îÿü ÿÿWëÿÿA÷ÿpÿþÿÿ€¨ÿÿÿ­€€ÿÝ_ÿÿjìÿÿP ÿøþ@¿ÿÿ"üüÿÿÿ!ÿÿNóÿÿ·êÿÿšåÿþ@¿€«Þ¡e_à P¼°<Ãÿè ÿüÿÿ¨ÿÿùÿÿúÿÿ ÿÿð[ÿÿnêÿÿê‘ÿÿ”¡ _øy¡^ÿÿŠüüÿĔԔĔ;kÿÿ [ÿÿý ÿÿ ôÿþ€€d¬bRž}€ dàñø ÿüÿÿÿïçÿ‘`ÿÿÀÿÿ©?øøè-Õÿÿ½¿ÿÿ”§ÿÿT€øÿ€ÿÿüüÿ‹î«î‹îtUUUªí$ÿÿZÀÿÿŸàÿú@}ý€¬V¯mS³€Ñ€ðŸø€€øÿÿXÿÄ8ÿÿÿÿí ÿÿ¨DÿÀÿÀ?);ÿÿE½ÿÿkxÿÿOÿøzQ®ÿÿüüÿÿÙÿÛÿÛ$‚ĪĂÄ};  ßÿª ÿÿ.7/È/ÿЯÀ9VÅ®Š#÷üø@€øÿõ<7óÿÿÿÿÿúÿëÂþþÿ¶\ÿÿÞÿÿD…ÿÿ>„€øÿ¤[ÿÿ@üüÿÊ×ÿÿÿÿ¯úÿúÿúÀÀÀ?ÿÿþ__  ÿôý€ÝøM¼€@ A€@¿Wð°ðø ñxÿÃÀ€ÿÿÿÿÀ4??ÿÀoððÿY¡ÿÿQTÿÿ])ÿÿHÿø½÷ÿÿ…üüÿ%(ÿÿÿÿHìýìüì°°°Oÿÿå‚?¯Àÿp@߀6Âý~¾@@@¿ÿ1ðHx‡ðLüpàÿÿ@ÿÿTêÿÿ¡¨ÿ¿þ@À€ÿï¯ÿÿT¸ÿÿ£Rÿÿµ@@¿ø?oÿÿ üüÿ@ÿÿÿÿ`ÿõõð  J õ߯¯¯üP¨þÿÿÿ@uì€%A§½X}ÀÐÀ?ÿ)ï4 <Ãðÿpðÿþÿÿ…]ÿÿ‚ þ þöNwÿÿY‘ÿÿJ¥ÿÿ„ÿÿ¨ªUø _ÿÿ"üüÿÿÿÿÿ¯ÿÿÿ¿@ŸÞ¿ÞŸÞ`!]‡]×]‡¢xA>þÀÿÿþ€Nc¢Ýû@@@¿ÿd:áñÿÿÿ ÿÿàÿÿ_ððð;ëÿÿÖßÿÿ4–ÿÿj•ÿÿ--m’øÀ?ÿÿüüÿ ¬õSÿÿÿÿÿÿ¯ìÿýÿì,öÿ/÷Ðtþ€ÿÿ€í}Ov _þ€ÿÿðãÿèÿÿÿÿÿÂÿý@ÿ€€ÿë½ÿÿ[hÿÿ«µÿÿD ÿÿ“ ýø¨ðWÿüüÿ!_Þ ÿÿ`ŸÿÿÿªRÿÿïÿšXßÿßû hü€ÿÿ€ÿÕVæ°Ïþ ÿ÷Uªìƒü|úÿÿïÿÿŒÿðüüÿ<êÿÿõoÿÿTVÿÿIÿÿqAàø!°(O×ÿüüÿ ÿòÿÿøÿÿÿÿÿÿÿ@ ÿÿÿÿÐáÿÿÿz…¯`ŸÿÿãÀ8øèÈ$$$ÿÛ¿ÿÿþ?ÿà õððÿ÷>ÿÿÒÿÿª¨ÿÿ’"ÿÿÅè  ÿðë¨üWÿÿüüÿ÷ÿÿÿþ¤[ÿÿ@¿ÿÿÿÿÿÿÿ¿á@ÿþ€öè`4Kø€ÿñ§A§°§ðX@ïÿÿÿÿÿñÿÿþ+O€ÿÿ>éÿÿz-ÿÿr ÿÿLßÿÿ§ˆÀzÿúhPi¯iÿ–ˆüüÿ}ÿ‚ÿÿÿûÿÿ£\ûÿÿ _÷ÿÿÿ‚ÿüÿªÈåWý€ÿøˆKùøý@OzP¯ÿÿÿÿÿÈø øô½wÿÿõÿÿW³ÿÿTìÿÿ£uÿø\ýÿüQ€SÿQÿ®üüÿ÷åÿÿWÿÿÿÕ€*ÿÿê¥ZÿÿÿÿøÝH Àç4Kÿ€ÿðà¿à?ÀÿààÿÿþÿÿbE}ÀÀ€?âÍÿÿ ÿÿ ÿÿ‰ÿÿ^©0?ÿÀÐÔ/ÔÿÔ+_è_÷_ÿ ©(Pøÿ~Ý€ÿÿ-ÿÿÿ÷ÿÿÿÿ~€ÿÿ¥ÿè?ÿ€™gxGÿ€68?ÿÀ^‚À?ð?ÿ€€ÿÿóÿüýüÿ]»ÿÿ²Íÿÿÿÿ&$ÿÿÉlƒÿþkýkùk”C¢WýGÿ¸†|üÿÿ ÿÿp_ ßÿÿÿÿÿýýÿÿH¸¿ÿ@Zÿ…³uJÿ€À€è?ðÑFÀ?ýÿÿÿÿÿYÿàƒ´`À?ÿ·Tÿÿ%ÿÿDÿÿ‘Jÿÿ+À ?ÿðÚ•Ú•Ú•%j~Õúÿ€pˆøÿþÔÿÿh±P¯ÿn¤ÿÿ¿ýÿúH_ÿ SöÿÛrzEÿ€%€(€,Ó¿þ$” ßÿwÿÿÿüHwÿ€2OÿÿoÝÿÿˆ@ÿÿ(ÿÿDÿÿLZsúú€±kµk±kN”ú‚ÿýÿÿñøÿ÷²ÿÿ+!ÿÞºIÿÿ_€ÿÿÐÿþ ø«øøM±}Bÿ€À ÀÀ?ã/ÿ(àÿÿÿÿôA¸ðúI¸ÿÿëòÿÿcÿÿÌ@ÿÿ£ÿüœúøœc*ÜjÝ*ÜÕ#4ýÿ€ø!øÿÞÝÿÿCþÿÿÿ·ÿø–à–ýiüpÿpúÅÿ`Cà|à_ 'ÿÀ€ÿëþÿÿ;€àÿ6OÿÿÍ/ÿÿì©ÿÿK(ÿÿÀÑÿÕÿ*ÀBÅBÀB?½swwúˆ ÿüÿÿðˆøÿ¯(ÿÿÿÿ ÿÿ <<þÀÀ¡þ^:·¥Hÿ̸<ÃÿpAðäðG¸Gÿ”ãÿßãÿü!äØøÿ’ªÿÿµaÿÿfÿÿ€ÿÿOïQO°îÿ÷‰µ«¿‰·vHHWÿ¨ÿÿôøÿQÿÿïÿ—@ŠuÿI±Kû´ÜÞù!Âp?ÿN;žáÿ«óüòï “ÿŠ˜gÿ„ ÿê@ÿÿ$ÿÿÿÿ A E Aô¾WÄÿÕ_Ä ;ÿÿþúRˆWÿS߬ ¿ú@ÿÿTøÿ  bT*°  JACK KNIFE... CLIVE CLUTCH. ERIC BODGE... PETER PIT.... FLAT TYRE.... BOB CARR..... FRED JGJG FRED * routines needed by a specific program ** Nov 25 1989 **** Budgie UK Shell 41 *------------------------------------------** * compiles to 65K * This is the backbone of many Budgie UK games. * Two screens are toggled to display the physical picture. * Sprites are drawn is several different ways. * See debate regarding the merit of each in a separate file. * In all cases, several degas screens are held in memory. * It is from these screens that the backdrops and sprites * are pulled to create the picture that is actually viewed. * The Shell and include files are updted SEVERAL times a month * write for latest update. * If you want to modify this game shell, the most obvious place * to start is with the Degas pictures. * Try changing the title page, then the background picture, * then substitute your sprites for our sprites. On a dot for dot basis. * Future versions of the shell.s will include collision detect * based both on x-y coordinates and pixel read * Then try changing the sprite coordinate updates, etc.. * Shell updates can be obtained from Budgie UK, free of charge. * Send disk and stamp to Budgie UK, Rayleigh * The shell is updated 10 to 20 times a year. * Your routines and macros welcome! * Source code to Operation Angelica and Sea King available: * send œ3.95 to Budgie UK sl equ $ff8800 sound chip sd equ sl+2 red equ $700 green equ $070 blue equ $007 white equ $777 black equ $000 yellow equ $770 grey equ $444 bra start include "a:\includes\macros.s" start startup memory management jsr superin supervisor mode is essential * find default physbase (ie ramtop minus 32000) * usually $78000 or $f8000 jsr phys_base get physbase move.l d0,physbase used by exit routine divu #1280,d0 make start of heap... mulu #1280,d0 divisible by both 160 and 256 add.l #1280,d0 remove this line if too close to rom move.l d0,screen_0 the one nearest to ROM. move.l d0,$45e initial screen IMPORTANT sub.l #27*1280,d0 boundary is ok move.l d0,screen_1 we'll toggle between 0 and 1 * these two screens (screen_0 and screen_1) are the screens * that the viewer will actually see. They are also referred to * as logical_screen and physical_screen. One v/blank, screen_0 * will be shown, the next, screen_1 will be shown. * They are right at the top of free memory. * The program on the other hand, is right at the bottom. * The free space in the middle is called the heap. * It is used for storing all those sprites, backdrops, * music, fonts and workscreens. * this section merely cleans up memory, so that we may inspect it * later on, using the cursor keys (debugging only) clear screen_0 show screen_0 reserve 160 one way of finding start of heap move.l d0,a0 move.l screen_0,a1 move.l #0,d1 .lp move.l d1,(a0)+ fill it up with noughts cmp.l a0,a1 bgt .lp mfree d0 no longer needed * we now reserve memory from the vacant area above the program itself * (ie the heap) in this case it is for 6 screens of sprites, etc move.l #1288*160,-(sp) (6 screens + spare space) move.w #$48,-(sp) trap #1 malloc addq.l #6,a7 tst.l d0 error bne mallok .error string wait 200 * start address of block returned in d0 mallok divu #1280,d0 make start of heap... mulu #1280,d0 divisible by both... add.l #1280,d0 160 and 256 * now divide it up (all screens on a 1280 boundary...) move.l d0,utility_screen messages, high scores, etc.. add.l #33280,d0 33280 is divis. by 1280 move.l d0,spr_screen sprites (pi1) or pic add.l #33280,d0 move.l d0,back_screen background (pi1) add.l #33280,d0 move.l d0,screen_3 more bits and pieces (pi1) add.l #33280,d0 move.l d0,buffer_screen mainly work screen for buffers etc.. add.l #33280,d0 move.l d0,lady_screen bonus screen (pi1) * now initialize A-line and fonts dc.w $a000 initialize A-line move.l a0,a_line_start move.l (a1)+,d0 6*6 font move.l (a1)+,fontaddress_8 move.l (a1),fontaddress_16 dc.w $a000 hide_mouse btst #7,$fffa01 mfp monochrome detect beq no_curs if on skip mode 0 low res no_curs cursor 0 bclr #0,$484 no keyclick bclr #1,$484 no repeat key move.l #dtaddress,-(sp) address of 44-byte DTA buffer move.w #$1a,-(sp) set DTA address trap #1 addq.l #6,sp move.w #-1,-(sp) read current k/b status move.w #-1,-(sp) ie repeat rate, etc.. move.w #35,-(sp) trap #14 addq.l #6,sp move.w d0,d1 and store it away: move.w d0,d2 we'll modify it when key scrolling... lsr #8,d1 ...is needed and.w #%0000000011111111,d1 and.w #%0000000011111111,d2 move.w d1,k_delay normally 15 move.w d2,k_repeat normally 2 * At this point, VB and HB routines * have not been set up. * Exit must be by calling QUITS. * now load our own fonts load a1_font,a1_ptr font 16 pixels load a2_font,a2_ptr font 8 pixels * now a horizontal blank routine: to count each h/line! * only used for debugging. Counter reset to zero each v/blank * As long as counter doesn't go above 300, we're within one frame * This h/blank routine itself takes about 20 lines to execute * Must be removed when all debugging and testing done. * It can be toggled on/off by pressing J * All graphic operations to be calculated, erased, and drawn * within ONE frame ie 1/50th of a sec, or approx 300 h/lines * by putting a breakpoint before and after the vsync routine, * we know exactly how many h/lines have passed to draw all * the sprites. Just press *, and read value in 'after' move.l #hbl_r2,a0 address of my routine bsr set_horizontal_blank skip for now bset #0,h_blank useful for exit routine. * now we reset the bombs vectors lea on_error,a0 move.l a0,$000008 change error vectors... move.l a0,$00000C ..with our own routine move.l a0,$000010 no more bombs: just a post-mortem * now install the various v/blank routines if any lea music,a5 address of routine bsr enable_vbi plays a tune providing flag is ok * next routine security only move.l #check1+22,a0 on file called 'games.s' cmp.b #"B",(a0) is Budgie still there? bne kwit move.l #check2+10,a0 Budgie interference checks cmp.b #"B",(a0) bne kwit * this routine checks for virus on boot sector jsr read_sector read boot sector lea read_buffer,a0 this buffer is 512 bytes long clr.l d0 move.b 180(a0),d0 virus check cmp.b #"S",d0 S for viruS bne virus not there? Something's wrong bra passed_test virus home ink 15 string < VIRUS..?!> string getkey cmp.b #$10,d0 Q beq kwit cmp.b #$13,d0 R beq repair passed_test *~~~~~~~~~~~~~~~~~~~~~~~~~INTRO~~~~~~~~~~~~~~~~~~~~~~~~~~~~* * now the game proper. First an opening sequence (title screen etc..) * and some variable initialization intro1 cls clear current screen ;;; jsr compact this line only if a degas file needs compacting bsr opening_sequence load music, sprites etc.. jsr initialize_sprites define their sizes etc... intro2 bsr initjoy setjoystick * we come here at the beginning of a game and usually after a level intro3 nop do not remove move.b #%01100000,joystick my ship (joystick) w 5.3.89 * the above flag is a status flag for sprites (BYTE only) * this byte is updated when joystick is activated * the eight bits (7-6-5-4-3-2-1-0) are as follows: * fire,request,moving,vacant,right,left,down,up intro4 cls clear current screen bsr clearbuf this line not essential bsr initjoy needed after a f1 call! border $0 black border clr.w clock_timer used by certain games... move.w #99,time store clock start time palette palet show palette vsync very first time (27/3/89) move.l screen_0,logical_screen move.l screen_1,physical_screen bset #0,video 0/1 from now on, each v/b clear screen_0 clear screen_1 * now, in case we want to scroll a long image: a place to start from * say spr_screen, or wherever (in practice, we would store our * long image, just AFTER the last reserved bank, in a place called * the free heap (see memory map to see where the heap is) * the long image mustn't be too long, else it catches up with * logical and physical screens at the top end of the heap. move.l spr_screen,image_start move.w #200,scroll_index move.w #1,scroll_direction move.w #1,scroll_stepper * copy background onto log and phys copyscreen back_screen,screen_0 copyscreen back_screen,screen_1 vsync *~~~~~~~ MAIN LOOP ~~~~~~~~~~~~~~~ * this is the main prog: it reads the joystick * then the keyboard, then waits for the vbi, * when the vbi sync arrives, we have 1/50th sec to do * everything (one frame). Take any longer, and you have jerky graphics * By everything, we mean update & draw all automatic sprites, * draw joystick sprite, update clock, scores and various checks * and then we come back right HERE main clr.l d0 btst #7,joystick has my ship collided beq main1 if 0 he is free from trouble wait 200 else, freeze him for 4 seconds clr.l d0 bclr #7,joystick de-freeze our ship border 0 black main1 lea sprites,a6 start of sprites array tst.b 29(a6) 29th byte: joysprite active? beq raw no: no need to update coordinates clr.b joystick dec 8 1989 move.b joyport1(pc),d7 read joystick tst.b d7 any message? beq raw no bit activated bsr bittest a bit is activated. Which one? raw bsr random cut out if not needed (to save time) move.l d0,rnd1 save that random number move.l d0,rnd2 * having read the joystick, we now read the keyboard raw1 clr.l d0 bsr rawconio go read the keyboard swap d0 get scan code rather than ascii * determine if a key has been hit, and act accordingly raw2 cmp.b #$01,d0 ESC quit beq kwit cmp.b #$3B,d0 F1 restart beq k_f1 cmp.b #$3C,d0 F2 credits beq k_f2 cmp.b #$3D,d0 F3 hints beq k_f3 cmp.b #$3E,d0 F4 budgie list beq k_f4 cmp.b #$3f,d0 F5 beq k_f5 cmp.b #$40,d0 F6 beq k_f6 cmp.b #$41,d0 F7 beq k_f7 cmp.b #$42,d0 F8 call message writer.prg beq k_f8 cmp.b #$43,d0 F9 reset hi-score beq k_f9 cmp.b #$44,d0 F10 Options beq k_f10 cmp.b #$23,d0 H Hertz beq k_h cmp.b #$2C,d0 Z beq k_z cmp.b #$2d,d0 X clear screen beq k_x cmp.b #$2e,d0 C single cycle beq k_c cmp.b #$2f,d0 V scroll flag beq k_v cmp.b #$52,d0 INSERT beq k_insert cmp.b #$70,d0 pad 0 (joystick sprite) beq k_pad0 cmp.b #$6d,d0 pad 1 other sprites beq k_pad1 cmp.b #$6e,d0 pad 2 beq k_pad2 cmp.b #$6f,d0 pad 3 beq k_pad3 cmp.b #$6a,d0 pad 4 beq k_pad4 cmp.b #$6b,d0 pad 5 beq k_pad5 cmp.b #$6c,d0 pad 6 beq k_pad0 cmp.b #$72,d0 enter (load help file) beq k_enter cmp.b #$32,d0 M (music toggle) beq k_m cmp.b #$20,d0 Dump screen beq k_d cmp.b #$19,d0 Pause beq k_p cmp.b #$21,d0 F Font beq k_f cmp.b #$22,d0 G reset beq k_g cmp.b #$24,d0 J toggle H/blank beq k_j cmp.b #$26,d0 Load (pi1) beq k_l cmp.b #$62,d0 Help beq k_help cmp.b #$39,d0 space (sound) beq k_space cmp.b #$12,d0 E beq k_e cmp.b #$48,d0 UP (h/w scroll) beq k_up cmp.b #$50,d0 DOWN beq k_down cmp.b #$2,d0 1 show various screens in memory beq k_one cmp.b #$3,d0 2 beq k_two cmp.b #$4,d0 3 beq k_three cmp.b #$5,d0 4 beq k_four cmp.b #$6,d0 5 beq k_five cmp.b #$7,d0 6 beq k_six cmp.b #$66,d0 * debugging beq k_star cmp.b #$4b,d0 left cursor beq k_left cmp.b #$4d,d0 right cursor beq k_right btst #0,pause if pause is on skip everything bne main * video swap: this is the point where we toggle screens * they will actually be toggled in a split second, when the * vertical blank arrives. At that point, the main v/b routine * will ask video shifter to draw the new screen, and by doing so, * reveal the sprites that were drawn 1/50th sec ago. jsr toggle_screens move.l logical_screen,work_screen move.l physical_screen,current_screen move.l physical_screen,$44e bchg #0,video change flag after 0 the h/b raster right now (below 300 hopefully) * Now we wait for the vertical blank. * this is the START of a frame. We've got to be back here within 1/50 sec!!! vsync <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< clr.w hbl_ct reset h/b counter before 0 these lines here: debugging only clr.w bill add.w #1,clock_timer needed by another routine * now we update all automatic sprites coordinates * the only sprite NOT updated here is the joystick one (sprite zero) * which is updated as soon as joystick has moved. See bittest. bsr coord_sprite_1 update x coordinate bsr coord_sprite_2 and next one bsr coord_sprite_3 * next section to do with scrolling jsr soft_scroll * next section to do with time bsr time_update or altitude, speed, whatever.. tst.w time end of game? bmi end_of_level btst #0,game_over bne end_of_game * now we restore all the old backgrounds if appropriate * only sprites that are active are 'restored' * there are TWO kinds of sprites: some store background in a BUFFER * and retrieve it later. Others, restore a KNOWN scenery. * First, if scenery scrolls, we never restore anything (no point) btst #0,scroll_flag scrolling background? bne norest * here is the standard type of sprite. It follows this pattern: * vsync - back - save - draw - * it means wait for vsync, change coordinates if necessary, then * restore any BACKground from buffer, * SAVE the background we're about to erase, * and finally DRAW a sprite on screen. * Here is an example: back 5,buffer_5 (only sprites 5 and 6 OK at the moment) * Now comes another type of sprite. It follows this pattern: * restore - sprite meaning RESTORE a KNOWN scenery onto screen, * then draw that particular SPRITE. * There is no need to save anything in a buffer as we KNOW * what the scenery is (usually a degas.pi1 sleeping in the background) * this system is ok with static, unchanging scenery. * here are some examples: restore 0 restore background (joysprite) restore 1 restore background restore 2 restore 3 * this is the point where the screen is temporarily spriteless * any check to see whether we are passing over a certain background * is done here, courtesy of pixelread routine jsr readthepixel answer returned in d2 (0-15) * next section is a pixel plot. No relevant to the sprite cycle.skip. norest btst #0,dot need leave a trace? beq nodot no lea sprites,a6 move.w 12(a6),d5 x move.w 14(a6),d6 y add.w #16,d5 add.w #18,d6 move.w #15,d2 ink pixelplott logical_screen,d5,d6,d2 bclr #0,dot reset nodot * now at last, we draw that lot. * First the sprites where no background was saved in the first place, * ie the ones with KNOWN backgrounds (ex background.pi1) * the sprites themselves are held in a degas.pi1 picture somewhere * in memory. That picture is usually called 'sprites.pi1' * It is held in a memory screen called 'spr_screen' * It is a straight matter of copying the sprites from the * spr_screen onto logical_screen. sprite 0 joystick sprite sprite 1 next sprite in the array sprite 2 and so on sprite 3 * next follows a variation. The sprite data is not held in * 'spr_screen' as expected, but somewhere else. * The destination screen may also be specified. ; sprit 4,lady_screen,logical_screen example only * Now, we will draw the other type of sprites: the ones with * SAVEd backgrounds. * First, prior to drawing, we have to SAVE the background in a buffer * background 5 will go in buffer 5, 6 in 6, and so on * make sure these buffers exists in the first place. See very END of prog * here is the synthax: save 5,logical_screen,buffer_5 example only * now that the background is safely tucked away in its buffer, * we can at last DRAW that sprite. * Again, we have to specify origin and destination, which will often * be 'spr_screen' and 'logical_screen' draw 5,spr_screen,logical_screen * and that's it! All done. Time to rush home to catch the v/blank. * follows some unimportant stuff ; bindec hbl_ct,10 one way of revealing a variable ; printat 6,6,6,a0 but slow! example only draw5 btst #0,single_step beq draw9 bclr #0,single_step jsr getkey swap d0 cmp.b #$2e,d0 C? bne draw9 bset #0,single_step draw9 bra main end of cycle. go back to start. *------------------------------------------------------------------ * All done! From here onwards, we have all the subroutines: * First, subroutines ending with 'bra main' * These were called from the main 'read keyboard' section * As we BRAnched to here, we will BRAnch back (no RTS) * let's find out what is to be done when a key has been hit: * SPACE reveals some of the sound effects library * Use in conjunction with M (music) * Press UP/DOWN key to activate key-repeat k_space bclr #0,single_step add.w #$102,$ff8240 visual feed back k_mm clr.l d7 clr.l d6 clr.l d5 move.l #snd_ctr,a0 * add.w #2,(a0) move.w (a0),d7 0-2-4-6-8 etc.. move.l #soundoffset,a1 add.w d7,a1 push the pointer one notch move.w (a1),d6 the length of that tune cmp.w #98,d6 end? beq k_m9 move.l #snd0,a0 add.w d6,a0 move.l a0,-(sp) bsr dosound and start playing there move.l (sp)+,a0 add.b #1,1(a0) getkey swap d0 cmp.b #$39,d0 beq k_space add.w #2,snd_ctr bra main k_m9 move.w #0,snd_ctr reset counter move.w #0,snd_inc bra main snd_inc dc.w 0 snd_ctr dc.w 0 *---------------- * M toggles music on/off (vertical blank routine) k_m bchg #0,musicon toggle music 0/1 silence bra main *--------- k_insert bra main *------------------- * Pressing these keys on the key pad will toggle sprites on/off * the 29th byte in a sprite parameter block determines on/off k_pad0 lea sprites,a6 bchg #0,29(a6) bra main k_pad1 lea sprites,a6 add.l #32,a6 each block is 32 bytes long bchg #0,29(a6) bra main k_pad2 lea sprites,a6 add.l #64,a6 bchg #0,29(a6) bra main k_pad3 lea sprites,a6 add.l #96,a6 bchg #0,29(a6) bra main k_pad4 lea sprites,a6 add.l #128,a6 bchg #0,29(a6) bra main k_pad5 lea sprites,a6 add.l #160,a6 bchg #0,29(a6) bra main k_pad6 lea sprites,a6 add.l #192,a6 bchg #0,29(a6) bra main *------------------ * At this point, we CHAIN another PRG and pass control to it chainer move.b #0,musicon turn music on move.l #hbl_r2,a0 bsr rst_horizontal_blank stop h/blank bclr #0,h_blank move.l $44e,save_screen save current screen move.l lady_screen,a0 point somewhere safe sub.l #256,a0 move.l a0,$45e vsync cls blank $44e,8,0,28,320 draw 2 small bands at the top.. blank $44e,5,4480,24,320 .. for no particular reason move.l #environment,-(sp) needed by gem move.l #environment,-(sp) move.l chain_prog,-(sp) m_writer.prg or whatever move.w #0,-(sp) chain this routine move.w #$4b,-(sp) execute it trap #1 adda.l #$10,sp show save_screen recall old screen move.l #hbl_r2,a0 restore interrupt bsr set_horizontal_blank bset #0,h_blank resume mode 0 back to shell, in low res move.l #palet,a0 retrieve our palette bsr setpal bset #0,load_address move.l #background,a0 reload some graphics as previous... move.l utility_screen,a3 ...prog corrupted them add.l #-34,a3 jsr bload bclr #0,load_address move.l #8000-1,d0 copy them to ... move.l utility_screen,a0 move.l screen_0,a1 ... screen 0 move.l screen_1,a2 ... and 1 .cop move.l (a0),(a1)+ copy all move.l (a0)+,(a2)+ dbra d0,.cop font 8 move.b #1,musicon music off silence clear sound chip bra main even lo0 ds.w 64 environment dc.b 0,0,0,0,0,0 writer dc.b "a:\common\writer.uk",0 scorer dc.b "a:\common\high.sco",0 even chain_prog dc.l 0 holds address of ANY prog name above *----------- k_undo bsr end_of_game bra intro3 *--------------------- * J toggles the h/b routine on/off * The h/b routine is used to count the raster position * Pressing fire will actually reveal it. * But it is very time consuming. k_j btst #0,h_blank toggle beq k_jj move.l #hbl_r2,a0 address of my h/b routine jsr rst_horizontal_blank bclr #0,h_blank bra main k_jj move.l #hbl_r2,a0 jsr set_horizontal_blank bset #0,h_blank bra main *------------------- * H toggles between 50 and 60 H * 60 hertz allows less time to redraw the sprites k_h bsr vtsync bchg #0,hz toggle btst #0,hz bne k_h1 move.b #%11111110,$ff820a bra main k_h1 move.b #%11111100,$ff820a bra main hz dc.w 0 *---------------- * Pressing V will activate a scroll of 120 bytes wide (3/4 screen) * To work within one frame, all but the smallest sprites must be * deactivated. H/B interrupt also turned off. * The scroll is nothing more than a window of the long image * By pointing the window to a slightly different location (scroll_index) * each v/b, the screen appears to scroll * The variable image_start is used to define the top of that image * The actual scroll routine is held in include file * and will be executed during the main 'MAIN' loop k_v bchg #0,scroll_flag toggle scroll on/off btst #0,scroll_flag beq k_vv move.l #hbl_r2,a0 de-activate h/b routine bsr rst_horizontal_blank bclr #0,h_blank off 1 turn off all sprites,... off 2 ...except sprite 0 off 3 off 5 bra main k_vv move.l #hbl_r2,a0 bsr set_horizontal_blank bset #0,h_blank copyscreen back_screen,physical_screen copyscreen back_screen,logical_screen bra main *------------------- * F1 usually restarts the game * several games specific variables have to be reset k_f1 clr.w clock_timer move.w #99,time move.w #3,lives move.w #0,score silence clear utility_screen show utility_screen home ink 11 string bsr show_scores getkey bra intro4 skip opening sequence (malloc) *--------------------- k_f2 move.l $44e,save_screen show utility_screen cls print the_credits getkey show save_screen bra main *------------------- k_f3 move.l $44e,save_screen show utility_screen cls font 8 print source getkey show save_screen bra main *------------------- k_f4 move.l $44e,save_screen show utility_screen cls printat 7,0,0,#games getkey cls printat 6,0,0,#games1 getkey print games2 getkey print games3 getkey print games4 getkey print games5 getkey print games6 getkey print games7 getkey print games8 getkey print games9 getkey print games10 getkey print games11 getkey print games12 getkey print games13 getkey print games14 getkey print games15 getkey show save_screen bra main *-------------------- k_f5 move.l $44e,save_screen show utility_screen cls home print desert_island getkey cls font 16 home print desert1 font 8 getkey show save_screen bra main *------------------- k_f6 move.l $44e,save_screen show utility_screen cls printat 12,10,0,#mess_1 getkey cls printat 12,10,0,#mess_2 getkey cls printat 12,6,0,#mess_3 getkey show save_screen bra main *------------------- k_f7 lea writer,a0 name of program move.l a0,chain_prog to chain bra chainer go and get it cls bra main *------------------- k_f8 move.l $44e,save_screen show utility_screen cls printat 12,0,0,#rules_1 getkey printat 11,0,0,#rules_1 cls show save_screen bra main *------------------- k_f9 move.l $44e,save_screen show utility_screen cls jsr reset_high_scores show save_screen bra main *------------------- * F10 is used to display a list of options k_f10 font 16 move.l $44e,save_screen remember screen we're on show utility_screen cls print options print message to it getkey bsr disap show save_screen font 8 bra main *------------------- * Z will chain another program (in this case pople's message writer) * and activate it k_z lea writer,a0 name of program move.l a0,chain_prog to chain bra chainer go and get it cls bra main *-------------------- * Pressing X clears current screen k_x cls bra main *------------------- * Pressing C activates single_step execution (one v/b frame at a time) * Ideal for debugging and following sprites progress k_c bset #0,single_step bra main single_step dc.w 0 k_p bchg #0,pause bra main *------------------- * Pressing L will activate the degas_load routine * First a prompt will be displayed in utility_screen k_l move.l $44e,a6 save target screen show utility_screen cls font 8 print prompt dc.b 27,"Y", etc needed! bsr degas_load load Degas in a6 bra main *------------------- * This one loads a new 8*8 font from memory * Their names are defined at the end of this program k_f bchg #0,font_flag toggle flag btst #0,font_flag beq kf1 open a2_font2 elega*.fon bmi kf9 not found? bra kf2 kf1 open a2_font squa*.fon bmi kf9 kf2 read a2_ptr,2066 read 2066 bytes close kf9 bra main font_flag dc.w 0 *---------------- k_g bra main mode 1 move.l $0,(sp) move.l $4,a0 jmp (a0) total reset *------------------- * Now we can dump current screen to disk, as a pi1 file * It will be called 'apic.pi1' * First, Pause program by pressing P, then choose screen with * either 1,2,3,4,5,6 or use up/down to scroll through memory, * then press D (dump) k_d move.l $44e,save_screen this is a DUMP routine show utility_screen cls home font 16 ink 15 string < DUMP SCREEN to disk> string font 8 getkey swap d0 cmp.b #$15,d0 Y/y bne k_d6 bsr picdump k_d6 show save_screen bra main message_4 dc.b "dump screen to disk. Are you sure?",0 even *------------ * This k_e is not fully implemented. * It basically describes how a sprites may be QUICKLY put on screen * with full background masking, but ONLY on a 16 boundary k_e before 1 13 h/b's only move.l spr_screen,a0 this routine draws a sprite.. add.l #174*160-8,a0 ..held in spr_screen ... move.l logical_screen,a1 onto current screen.. add.l #86*160,a1 <86 lines down the screen +... add.l #144,a1 x coord MUST be a multiple of 8> move.l #26,d7 ..with full eoring. D7 is height .loop movem.l (a0)+,d2/d3 get all 4 planes in one go move.l d2,d0 combine... or.l d3,d0 ...the lot of them. move.w d0,d1 convert result.. swap d0 into.. or.w d1,d0 ..a mask not.w d0 now invert it clr.l d1 not essential? move.w d0,d1 put mask in lower word of D1 swap d1 now it's in the high word move.w d0,d1 now it's in both and.l d1,(a1) merge.. or.l d2,(a1)+ ..all this lot... and.l d1,(a1) ...with... or.l d3,(a1)+ ...the background on actual screen. add.w #160-8,a0 do next line add.w #160-8,a1 dbra d7,.loop after 1 stopwatch (13 h/b's elapsed) bra main * pressing * shows these various stopwatches *-------------------- * Next will load a certain file from disk. See k_help for details k_enter move.w #1,degas_file bra k_help * This routine will load a given file from disk (usually help.pi1) * However, depending on state of 'degas_file' variable, the file * chosen may vary. For instance, if 'degas_file' is set to 0, * help_pic may be loaded. If set to 1, penny_pic may be loaded k_help move.l $44e,save_screen save current screen clear utility_screen show utility_screen move.b #0,musicon switch music on tst.w degas_file 1=seaking.pi1 0=budgie.pi1 beq kh1 open penny_pic bra kh2 kh1 open help_pic load from disk kh2 bmi kwit if error, quit read #palet+34,34 store palette somewhere (#) palette palet+36 and now show it move.l utility_screen,a0 read a0,32000 read 32000 bytes (ie degas.pi1) close getkey show save_screen retrieve official screen palette palet retrieve official palette move.b #1,musicon music off silence clear any lingering noise move.w #0,degas_file default is budgie.pi1 bra main and carry on *------------------- * The next few routines will merely show the main screens held * in memory. First, P (Pause) will have to be hit. * Press P again, to resume normal program k_one show screen_0 bra main k_two show screen_1 bra main k_three show back_screen bra main k_four show spr_screen bra main k_five show utility_screen bra main k_six show lady_screen bra main k_seven show screen_3 bra main *------------------- * This is vertical hardware scrolling (1280 bytes at a time) * As there are 160 bytes per lines, this is equivalent to * scrolling 8 lines, up or down. * 1280 was chosen because it is divisible by 160 AND 256 ! * this routine also sets the auto-repeat key on k_up move.l $44e,save_screen (preserve where we are) k_up1 move.w #1,-(sp) shorten key delay to make thhings move.w #5,-(sp) smoother move.w #35,-(sp) trap #14 addq.l #6,sp bset #1,$484 repeat key on move.l $44e,a0 get current screen add.l incr,a0 raise it a bit (1280 bytes) move.l a0,$45e for update during next v/blank getkey swap d0 cmp.b #$48,d0 more up viewing beq k_up1 cmp.b #$50,d0 more down viewing beq k_down1 cmp.b #$26,d0 load: danger: prog will not come back... beq k_l here (palette and other settings lost) cmp.b #$2d,d0 clear beq k_x cmp.b #$20,d0 dump beq k_d move.w k_repeat,-(sp) 3 move.w k_delay,-(sp) 11 move.w #35,-(sp) trap #14 addq.l #6,sp move.l save_screen,$45e vsync bra main k_down move.l $44e,save_screen needed k_down1 move.w #1,-(sp) default values move.w #5,-(sp) move.w #35,-(sp) trap #14 addq.l #6,sp move.b #0,$a7c another way of speeding k/b move.b #0,$a7f bset #1,$484 repeat key on move.l $44e,a0 sub.l incr,a0 move.l a0,$45e getkey swap d0 cmp.b #$50,d0 more viewing beq k_down1 cmp.b #$48,d0 beq k_up1 cmp.b #$26,d0 load beq k_l cmp.b #$2d,d0 clear beq k_x cmp.b #$20,d0 dump beq k_d move.w k_repeat,-(sp) 3 move.w k_delay,-(sp) 11 move.w #35,-(sp) trap #14 addq.l #6,sp move.l save_screen,$45e vsync needed bra main k_left bra main k_right bra main *------------------- * This routine is used for debugging. * It reveals a lot of variables, either specific to this game, * or systems variables, like physical screen, joystick status, etc.. * An important variable is hbl_ct (the horizontal raster position) * Also: 'before' and 'after' used to time any given operation k_star movem.l d0-d7,-(sp) freeze registers movem.l d0-d7,-(sp) and again move.l $44e,save_screen save screen show utility_screen cls printat 1,16,0,#null ink 1 line 16 col 0 movem.l (sp)+,d0-d7 reveal original regs bsr reveal_regs all home ink 13 sand print reveal_text home ink 11 red clr.l d0 clr.l d1 clr.l d2 clr.l d3 clr.l d4 clr.l d5 clr.l d6 clr.l d7 lea before,a0 stopwatches array move.w (a0),d0 move.w 2(a0),d2 move.w 4(a0),d4 lea after,a0 move.w (a0),d1 move.w 2(a0),d3 move.w 4(a0),d5 move.w store,d6 move.w scroll_index,d7 bsr reveal_regs ink 15 grey printat 7,8,0,#null ink 1 line 16 col 0 clr.l d0 clr.l d1 clr.l d2 clr.l d3 clr.l d4 clr.l d5 clr.l d6 clr.l d7 move.w level,d0 more selected variables.. move.w lives,d1 ..to be revealed move.w store,d2 move.w store,d3 move.w score,d4 move.w score,d5 move.w score,d6 move.w score,d7 bsr reveal_regs move.l storel,d0 now reveal current screen.. move.l #10,d1 ..in hex (16) bsr printn printat 11,16,30,#num_buff+14 move.l screen_1,d0 reveal original physbase.. move.l #16,d1 hex ..in hex bsr printn printat 11,17,30,#num_buff+14 move.l back_screen,d0 sprites screen move.l #16,d1 bsr printn printat 11,18,30,#num_buff+14 move.l logical_screen,d0 move.l #16,d1 hex bsr printn printat 11,19,30,#num_buff+14 move.l physical_screen,d0 move.l #16,d1 bsr printn printat 11,20,30,#num_buff+14 move.l utility_screen,d0 move.l #16,d1 bsr printn printat 11,21,30,#num_buff+14 move.b joystick,d0 (joystick) ext.l d0 move.l #2,d1 ..in binary (2) bsr printn printat 11,22,29,#num_buff+11 move.l rnd1,d0 move.l #10,d1 bsr printn printat 11,23,30,#num_buff+14 getkey move.l save_screen,$45e vsync movem.l (sp)+,d0-d7 final retrieve bra main reveal_text dc.b 27,"H" dc.b 27,"Y",32,38," : before 0 (stopwatch)",10,13 d0 dc.b 27,"Y",33,38," : after 0",10,13 d1 dc.b 27,"Y",34,38," : before 1",10,13 d2 dc.b 27,"Y",35,38," : after 1",10,13 d3 dc.b 27,"Y",36,38," : before 2",10,13 d4 dc.b 27,"Y",37,38," : after 2",10,13 d5 dc.b 27,"Y",38,38," : store (w).....",10,13 d6 dc.b 27,"Y",39,38," : scroll index..",10,13 d7 dc.b 27,"Y",40,38," : level",10,13 dc.b 27,"Y",41,38," : lives",10,13 dc.b 27,"Y",42,38," : store",10,13 dc.b 27,"Y",43,38," : store",10,13 dc.b 27,"Y",44,38," : score",10,13 dc.b 27,"Y",45,38," : total_score..",10,13 dc.b 27,"Y",46,38," : detector music delay......",10,13 dc.b 27,"Y",47,38," : total_rescued..........",10,13 dc.b 27,"Y",48,37," D0 screen 0",10,13 dc.b 27,"Y",49,37," D1 screen 1 ",10,13 dc.b 27,"Y",50,37," D2 screen 2 ",10,13 dc.b 27,"Y",51,37," D3 logical ",10,13 dc.b 27,"Y",52,37," D4 physical ",10,13 dc.b 27,"Y",53,37," D5 workscreen ",10,13 dc.b 27,"Y",54,37," D6 joystick value",10,13 dc.b 27,"Y",55,37," D7 random ",0 even *----------- * The bomb trap vectors have been re-routed to come here, * to reveal state of registers and important variables. * Often, the program will continue, even after bombs! * But the stack will be corrupted, and exit to desktop not permitted. on_error bra k_star home font 16 string < FATAL ERROR! > string font 8 getkey bra kwit main *~~~~~~~~~~~~~~~~NOW REAL SUBROUTINES (with RTS endings)~~~~~~ opening_sequence * first we load the high scores, exactly inside the array bset #0,load_address flag (load at precise location) move.l #file_6,a0 which file to load move.l #high_scores,a3 where in program to load it bsr bload do it bclr #0,load_address done show screen_0 start somewhere font 8 home ink 1 string print 'here we go!' * another way of loading a file. This time, a truncated degas pic * (the Budgie logo) which we know is 6434 bytes long * again, no need to reserve memory: we'll load direct into * a pre-reserved screen, in this case: 'utility_screen' (workscreen) open budgie_pic bmi kwit read #palet-2,2 palet-2 is the res variable read #palet,32 must be a # (actual location) clear utility_screen move.l utility_screen,a0 add.l #9600,a0 just under half way read a0,6400 actual data: 6400 bytes long close palette palet on the other hand, no # here show utility_screen * next thing to load is the Budgie girl (a full degas.pi1) * we'll load here in a pre-reserved screen, called 'lady_screen' bset #0,load_address flag: load direct at A3 MOVE.L #penny_pic,a0 origin: penny.pi1 (on disk) MOVE.L lady_screen,a3 destination screen sub.l #34,a3 deduct palette and res jsr bload direct load bclr #0,load_address done * bra skip_opening scroll 34,108,98*160+24,34 scroll BUDGIE logo scroll 34,108,15704,34 scroll 34,108,15704,34 scroll 34,108,15704,34 scroll 32,108,15704,32 scroll 30,108,15704,30 scroll 28,108,15704,28 scroll 26,108,15704,26 scroll 24,108,15704,24 scroll 22,108,15704,22 scroll 20,108,15704,20 scroll 18,108,15704,18 scroll 16,108,15704,16 scroll 14,108,15704,14 scroll 12,108,15704,12 scroll 10,108,15704,10 scroll 10,108,15704,10 scroll 8,108,15704,8 scroll 8,108,15704,8 scroll 6,108,15704,6 scroll 6,108,15704,6 scroll 6,108,15704,6 rept 6 scroll 4,108,15704,4 repeated 6 times endr rept 6 scroll 2,108,15704,2 repeated 6 times endr * now, we will show the Budgie girl, by asking lady_screen * to come to the front move.l lady_screen,a0 add.l #-32,a0 bsr setpal show lady_screen clear utility_screen * we now load some digitized music for later use * this time, we don't specify any precise location where to load to. * gem will therefore reserve the necessary space for us, * returning its start address in drum_ptr * we are not using the 'jsr bload' as with the lady, * or the 'open/read/close' sequence as with the logo, * but instead the 'load' macro load drum,drum_ptr will be used later by ST replay * now, we load yet another degas.pi1 This time, the title page * As a precise location has already been reserved (back_screen), * we use the 'jsr bload' subroutine with the flag set bset #0,load_address flag set: precise load move.l #title_page,a0 name of file to load move.l back_screen,a3 where to load it sub.l #34,a3 deduct palette and res bsr bload direct load bclr #0,load_address done * here's another way we could have done it: * open title_page * read #palet-2,2 * read #palet,32 # it's an actual location * read back_screen,32000 no #, it's a pointer * close * now we set the palette move.l back_screen,a0 sub.l #32,a0 bsr setpal * At this point, although loaded, the title page still isn't showing * lady_screen is still showing. * now a routine to gradually rebuild the title page in back_screen * into 'utility_screen' move.l #3000,d7 .sploop move.l back_screen,a0 back_screen to be .. bsr specify1 ..rebuilt in utility_screen dbra d7,.sploop show back_screen now show all of it * now, we'll play that digitised music until a key is hit play_again replay drum_ptr,32343,3 digitised music tst.b keyhit interrupted? beq play_again silence cls * next is optional bsr enter_your_name bsr show_scores silence cut out sound chip skip_opening wait 50 1 sec (leave it) * more loading: this time, sprites, (compacted) * the routine for compacting a degas picture is further up * (jsr compact) see include2.s where the actual subroutine is. * note: the next few lines EXPECT a file called 'sprites.pic' * ie a compacted file. * if sprites.pi1 is not compacted, use the loading technique * already described with title page show lady_screen dummy screen cls clear it open sprites1 file name (sprites.pic) bmi kwit error? if so, get out read utility_screen,34 read palette first, anywhere read #reference_byte,1 move.l file_size,d0 get size sub.l #35,d0 palette already in readd utility_screen,d0 read rest of file close flash 3,1 move.l file_size,d7 known number of bytes sub.l #35,d7 less header move.l spr_screen,a1 destination to rebuild into jsr decompact do it * more loading: this time background. * the principle is exactly the same as with the title page bset #0,load_address move.l #background,a0 name of file move.l back_screen,a3 destination screen add.l #-34,a3 jsr bload bclr #0,load_address move.l back_screen,a0 spr_screen determines the.. sub.l #32,a0 ..official palette move.l #palet,a1 copywords a0,a1,16 store palette for later use palette palet final, official palette * some variables can be initialized here, if necessary... move.w #99,time 60 to 0 move.w #0,clock_timer 0 to 50 (50 = 1 sec) move.w #0,game_over move.w #1,level rts * end of opening sequence *------------------------ * this one is called by 'main' each time joystick has moved * joystick info in d7 is analysed * where bit 7 is fire, 3,2,1,0 are right/left/down/up bittest lea sprites,a6 add.l #0,a6 add 32 byte offset if necessary and.b #%10001111,d7 only interested in 5 states btst #7,d7 was it the fire bit? beq next1 move.l d7,-(sp) save D7 bsr fireproc move.l (sp)+,d7 next1 cmp.b #128,d7 fire only? in which case... beq next5 ...just exit (no change of status) and.b #%00001111,d7 fire not needed any more move.b d7,joystick preserve this record for drawing later btst #0,d7 or was it up? beq next2 bsr upcoord * bra next5 to avoid diagonals only next2 btst #1,D7 and so on beq next3 bsr downcoord next3 btst #2,D7 beq next4 bsr leftcoord next4 btst #3,D7 beq next5 bsr rightcoord next5 bset #6,joystick rts *------------ * the following coordinates are updated * whenever joystick is moved upcoord sub.w #1,14(a6) update y coordinate (1 pixel up) sub.l #160,4(a6) update absolute y position tst.w 14(a6) top limit bgt return ok within limits add.w #1,14(a6) no, too high add.l #160,4(a6) bra return downcoord add.w #1,14(a6) update y coord (1 down) add.l #160,4(a6) absolute y position: 160 bytes down cmp.w #180,14(a6) bottom limit bmi return sub.w #1,14(a6) sub.l #160,4(a6) bra return leftcoord sub.w #1,12(a6) update x coordinate (1 left) cmp.w #1,12(a6) left limit bgt return add.w #1,12(a6) bra return rightcoord add.w #1,12(a6) update x coord cmp.w #280,12(a6) right limit bmi return sub.w #1,12(a6) bra return fireproc ; bset #0,dot if set a dot will be drawn not $ff8240 reverse border ; wait 1 with this line on, we get a flash... not $ff8240 ...otherwise a line showing h/b raster sound snd12 move.b #1,musicon cut out music interrupt return rts *------------ * next routine used in Operation Angelica, to detect background color * in this example, we try to see whether sprite zero (BUDGIE) collides * with any light blue background (like the word BLOB). * We're only checking one spot, in this case the middle of BUDGIE sprite. readthepixel lea sprites,a6 address of Budgie sprite param block move.w 12(a6),d5 x move.w 14(a6),d6 y add.w #24,d5 centralize test add.w #4,d6 and.l #$ffff,d5 word only and.l #$ffff,d6 pixelreadd logical_screen,d5,d6 and.l #%00001111,d2 max 15 (0-15) ;; reveall d2 ;; debugging only (color 0 to 15) try it cmp.w #6,d2 color 6? (light blue) beq rr5 if so, do a flash bra rr9 if not, get out rr5 move.w #1000,d7 .r11 border $777 flash border dbra d7,.r11 move.w #1000,d7 .r12 border $0 dbra d7,.r12 move.w #1000,d7 .r13 border $777 dbra d7,.r13 border $0 bra rr9 rr6 move.l $44e,a0 add.l incr,a0 shake screen move.l a0,$45e vsync move.l $44e,a0 sub.l incr,a0 move.l a0,$45e vsync bra rr9 rr9 rts *---------- * In this example, a sprite moves 1 or several pixels at a time * sideways, left to right and then backwards * each sprite has a parameter block of 8 long words (32 bytes) * sprite_0 is the joystick sprite (with its own coordinates) * sprite_1 onwards are self-propelling sprites (aliens etc..) * collision detect is another routine, in its own right. coord_sprite_1 lea sprites,a6 the very beginning of the block array add.l #32,a6 offset (sprite 1) tst.b 29(a6) 29th byte determines on/off beq .out tst.b 28(a6) 28th byte is direction: 0 right/ 1 left bne .left add.w #5,12(a6) bytes 12-13 is the x coord cmp.w #280,12(a6) max right reached? bmi .okr move.b #1,28(a6) reverse direction flag .okr rts .left sub.w #5,12(a6) move 5 pixels to the left on the x coord cmp.w #7,12(a6) reached pixel 7? bgt .okl clr.b 28(a6) reverse direction flag .okl .out rts coord_sprite_2 lea sprites,a6 the very beginning of the block array add.l #64,a6 offset (sprite 2) tst.b 29(a6) 29th byte determines on/off beq .out tst.b 28(a6) 28th is direction: 0 right/ 1 left bne .left add.w #3,12(a6) cmp.w #280,12(a6) max right bmi .okr move.b #1,28(a6) reverse direction flag .okr rts .left sub.w #2,12(a6) move 2 pixels to the left cmp.w #1,12(a6) bgt .okl clr.b 28(a6) reverse direction flag .okl .out rts coord_sprite_3 lea sprites,a6 the very beginning of the block array add.l #96,a6 add offset for sprite 3 tst.b 29(a6) on/off beq .out tst.b 28(a6) test direction byte bne .left add.w #1,12(a6) x coord cmp.w #280,12(a6) max right bmi .okr move.b #1,28(a6) reverse direction flag .okr rts .left sub.w #1,12(a6) cmp.w #1,12(a6) bgt .okl clr.b 28(a6) reverse direction flag .okl .out rts *--------------------------- * Now we RESTORE all the backgrounds * * restoration of backgound occurs each v/blank just BEFORE * re-drawing the sprites. rest_sprite lea sprites,a6 start of sprite array lsl.l #5,d0 multiply a given number by 32 add.l d0,a6 add it to array to get precise sprite tst.l 24(a6) if this is zero: no restore needed bne .rest rts if zero, no restore wanted .rest * move.l logical_screen,a1 move.l 24(a6),d0 destination where to restore add.l d0,a1 * move.l back_screen,a0 add.l d0,a0 move.w 10(a6),d6 chunks lsl.w #4,d6 * 16 move.l #160,d0 sub.w d6,d0 this is the offset move.w 8(a6),d7 height sub.w #1,d7 .loop move.w 10(a6),d6 chunks sub.w #1,d6 .chunks move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ dbra d6,.chunks add.l d0,a0 add.l d0,a1 dbra d7,.loop tst.b 29(a6) sprite off by any chance? bne .rest9 no move.l 20(a6),24(a6) push next restore address for shadow screen clr.l 20(a6) and stop any further restoring afterwards .rest9 rts *------------- * sprites are drawn each v/blank whether they move or not, * First restore, then save, then draw * save & draw normally done in one pass, but not in this example. * if sprite is disabled, routine aborts * origin screen expected in a0 (say spr_screen) * see DRAW macro draw_sprite lea sprites,a6 start of sprite parameter array lsl.l #5,d0 add.l d0,a6 tst.b 29(a6) disabled? beq spr_out move.l 20(a6),24(a6) move.l 0(a6),d4 origin move.l 4(a6),d5 y destination (say 100 * 160) move.w 8(a6),d7 height move.w 10(a6),d6 chunks move.w 12(a6),d1 x clr.l d2 important move.w d1,d2 x again lsr.w #1,d2 halve (1 pixel is 1/2 byte) and.w #$fff8,d2 16 boundary (say 49 becomes 48) add.l d2,d5 (say 48+16000) move.l d5,16(a6) precise location in bytes move.l d5,20(a6) now, save it for later restore and.l #15,d1 precise x pixel (0-15) lsl.w #3,d6 chunks * 8 move.l #160,d0 sub.w d6,d0 this is the offset move.l d0,a4 say 152 subq.l #8,d0 move.l d0,a5 say 144 bsr asprite inside include3 spr_out rts * this routine saves a background before drawing a sprite on it. * origin (ie current screen itself) expected in a0 * destination (buffer like buffer_5) expected in a1 * if sprite is inactive, routine aborts * First L to go in buffer is start address of block to be saved * see SAVE macro save_sprite btst #0,video either screen_0 or screen_1 beq .s add.l #3200,a1 use buffer b instead .s lea sprites,a6 start of sprite parameter array lsl.l #5,d0 add.l d0,a6 tst.b 29(a6) active? beq spr_out if not, no need to save move.l 4(a6),d5 y destination (say 100 * 160) move.w 8(a6),d7 height move.w 10(a6),d6 chunks move.w 12(a6),d1 x clr.l d2 important move.w d1,d2 x again lsr.w #1,d2 halve (1 pixel is 1/2 byte) and.w #$fff8,d2 16 boundary (say 49 becomes 48) add.l d2,d5 (say 48+16000) lsl.w #3,d6 chunks * 8 move.l #136,d0 sub.w d6,d0 this is the offset move.l d0,a5 say 152 add.l d5,a0 total address move.l a0,(a1)+ store address first of all sub.w #1,d7 height loop .lp move.w 10(a6),d6 chunks sub.w #1,d6 .loop move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ *** move.l (a0)+,(a1)+ *** move.l (a0)+,(a1)+ dbra d6,.loop add.l a5,a0 add.l #8,a0 dbra d7,.lp rts * this routine restores a previously saved background, * just before re-drawing the sprite again. * Expects buffer address in a0 (like buffer_5) * First L in buffer is where to restore: * if zero, routine aborts * see BACK macro back_sprite btst #0,video either screen_0 or screen_1 beq .s add.l #3200,a0 use buffer b instead .s lea sprites,a6 start of sprite parameter array lsl.l #5,d0 add.l d0,a6 move.w 8(a6),d7 height move.w 10(a6),d6 chunks lsl.w #3,d6 chunks * 8 move.l #136,d0 sub.w d6,d0 this is the offset move.l d0,a5 say 152 move.l (a0),a1 retrieve destination move.l a0,a3 save for later tst.l (a0)+ beq .rts sub.w #1,d7 height loop .lp move.w 10(a6),d6 chunks sub.w #1,d6 .loop move.l (a0)+,(a1)+ move.l (a0)+,(a1)+ *** move.l (a0)+,(a1)+ **** move.l (a0)+,(a1)+ dbra d6,.loop add.l a5,a1 add.l #8,a1 dbra d7,.lp clr.l (a3) always 0 as first address .rts rts * the idea of putting a 0 in first buffer location is to prevent * unnecessary background restoring when sprite is not showing * the rule is: if background buffer starts with a 0, then * there is nothing to restore *------------------------- * Now an actual vbi ROUTINE * vbi music system Gary Wheaton Q EQU 1 *OCTAVES Z EQU 4 U EQU 2 *-------FLAG FOR MUSIC ON OR OFF move.b #1,musicon *-------TO SILENCE CHANNELS : sound silence (macro) music movem.l d0-d7/a0-a6,-(sp) tst.b musicon bne bypass MOVE.B #$7,SL MOVE.B #%11111000,SD CMP.B #1,FL BEQ.S PPP BSR SSET PPP ************** LEA _NOTE0,A0 LEA _NOTE1,A1 LEA _NOTE2,A2 CHAN0 ************** MOVE PNT0,D0 ADD D0,A0 MOVE.L (A0),D1 *GET NOTE 0 & DURATION CMP #$FFFF,D1 BNE.S CON2 CLR PNT0 *RESET TO START MOVE.L _NOTE0,D1 CON2 SUB #1,NP0 BNE.S STILLON MOVE.L D1,TMP0 *D1.W IS DURATION MOVE TMP0,TMP00 MOVE.B #15,VOL0 MOVE D1,NP0 *SET NEW DURATION ADD #4,PNT0 *& INC POINTER STILLON ***VOLUME CMP #0,TMP00 BNE.S RFF MOVE TMP0,TMP00 RFF *LSR #1,TMP00 *LSR #1,TMP00 CMP.B #0,VOL0 BEQ.S NV0 SUB.B #1,VOL0+1 BNE.S NV0 SUB.B #1,VOL0 MOVE.B #5,VOL0+1 NV0 MOVE.B #8,SL MOVE.B VOL0,SD MOVE.B #0,SL MOVE.B TMP00+1,SD MOVE.B #1,SL MOVE.B TMP00,SD CHAN1 *********************** MOVE PNT1,D0 ADD D0,A1 MOVE.L (A1),D1 *GET NOTE 1 & DURATION CMP #$FFFF,D1 BNE.S BON3 CLR PNT1 *RESET TO START MOVE.L _NOTE1,D1 BON3 SUB #1,NP1 BNE.S STILL MOVE.L D1,TMP1 *D1.W IS DURATION MOVE.B #14,VOL1 MOVE D1,NP1 *SET NEW DURATION ADD #4,PNT1 *& INC POINTER STILL ***VOLUME CMP.B #0,VOL1 BEQ.S NV1 SUB.B #1,VOL1+1 BNE.S NV1 SUB.B #1,VOL1 MOVE.B #3,VOL1+1 NV1 MOVE.B #9,SL MOVE.B VOL1,SD MOVE.B #2,SL MOVE.B TMP1+1,SD MOVE.B #3,SL MOVE.B TMP1,SD MOVE.B #6,SL MOVE.B TMP1+1,D0 LSR.B #1,D0 MOVE.B D0,SD CHAN2 *********************** MOVE PNT2,D0 ADD D0,A2 MOVE.L (A2),D1 *GET NOTE 1 & DURATION CMP #$FFFF,D1 BNE.S CON3 CLR PNT2 *RESET TO START MOVE.L _NOTE2,D1 CON3 SUB #1,NP2 BNE.S STI MOVE.L D1,TMP2 *D1.W IS DURATION MOVE.B #15,VOL2 MOVE D1,NP2 *SET NEW DURATION ADD #4,PNT2 *& INC POINTER STI ***VOLUME CMP.B #0,VOL2 BEQ.S NNN SUB.B #1,VOL2+1 BNE.S NNN SUB.B #1,VOL2 MOVE.B #11,VOL2+1 NNN MOVE VIB2+2,D0 ADD D0,VIB2 CMP #2,VIB2 BNE.S DD NEG VIB2+2 DD CMP #-2,VIB2 BNE.S NV NEG VIB2+2 NV MOVE TMP2,TMP22 MOVE VIB2,D0 ADD D0,TMP22 MOVE.B #10,SL MOVE.B VOL2,SD MOVE.B #4,SL MOVE.B TMP22+1,SD MOVE.B #5,SL MOVE.B TMP22,SD CD BYPASS movem.l (sp)+,d0-d7/a0-a6 rts killer jmp 0 SSV DC.L 0 *---------------------------------------------------------- * insert new data here use 0,1 as first two for each channel *----------delete from here to.............. **************DATAS*************** ***NOTE 1ST WORD. DURATION 2ND WORD *START DATA WITH--0,1 *END DATA WITH-$FFFF,$FFFF,0 _NOTE0 *lead tune DC.W 0,1,108*Z,12,108*Z,6,108*Z,6,108*Z,12,108*Z,6,108*Z,6,108*Z,12 DC.W 162*Z,12,128*Z,12,108*Z,12 DC.W 121*Z,12,121*Z,6,121*Z,6,121*Z,12,121*Z,6,121*Z,6,121*Z,12 DC.W 182*Z,12,144*Z,12,121*Z,12 DC.W 108*Z,12,108*Z,6,108*Z,6,108*Z,12,108*Z,6,108*Z,6,108*Z,12 DC.W 96*Z,12,91*Z,12,81*Z,12,91*Z,12,108*Z,12,121*Z,12,144*Z,12,162*Z,24,162*Z,24 ******** DC.W 108*Z,24,108*Z,18,108*Z,6,108*Z,12 DC.W 162*Z,12,128*Z,12,108*Z,12 DC.W 121*Z,24,121*Z,18,121*Z,6,121*Z,12 DC.W 182*Z,12,144*Z,12,121*Z,12 DC.W 108*Z,24,108*Z,18,108*Z,6,108*Z,12 DC.W 96*Z,12,91*Z,12,81*Z,12,91*Z,12,108*Z,12,121*Z,12,144*Z,12,162*Z,24,162*Z,24 DC.W $FFFF,$FFFF,0 *FLAG END _NOTE2 DC.W 0,1,108*8,12,108*16,12,162*8,24 DC.W 108*8,24,162*8,24 DC.W 121*8,12,121*16,12,182*8,24 DC.W 121*8,24,182*8,24 DC.W 108*8,12,108*16,12,162*8,24 DC.W 108*8,12,108*8,12,162*8,24 DC.W 121*8,12,121*8,12,182*8,24,162*8,24,162*8,24 *********** DC.W 108*8,12,108*16,12,162*8,24 DC.W 108*8,24,162*8,24 DC.W 121*8,12,121*16,12,182*8,24 DC.W 121*8,24,182*8,24 DC.W 108*8,12,108*16,12,162*8,24 DC.W 108*8,24,162*8,24 DC.W 121*8,12,81*8,12,182*8,12,121*8,12,162*8,24,162*8,24 DC.W $FFFF,$FFFF,0 _NOTE1 DC.W 0,1 DC.W 108*Q,12,96*Q,12,108*Q,12,114*Q,12,108*Q,48 DC.W 121*Q,12,108*Q,12,121*Q,12,128*Q,12,121*Q,48 DC.W 108*Q,12,96*Q,12,108*Q,12,114*Q,12,108*Q,48 DC.W 121*Q,12,144*Q,12,162*Q,12,182*Q,12,162*Q,24,162*Q,24 ************ DC.W 108*U,12,96*U,12,108*U,12,114*U,12,108*U,48 DC.W 121*U,12,108*U,12,121*U,12,128*U,12,121*U,48 DC.W 108*U,12,96*U,12,108*U,12,114*U,12,108*U,48 DC.W 121*U,12,144*U,12,162*U,12,182*U,12,162*U,12,217*U,12,162*U,24 DC.W $FFFF,$FFFF,0 *------------....here SSET MOVE _NOTE0+2,NP0 MOVE _NOTE1+2,NP1 MOVE _NOTE2+2,NP2 MOVE.B #1,FL RTS ***POINTERS TO NOTES MUST INC BY 4 PNT0 DC.W 0 PNT1 DC.W 0 PNT2 DC.W 0 ***TEMP REG TMP0 DC.L 0 TMP1 DC.L 0 TMP2 DC.L 0 TMP22 DC.W 0 TMP00 DC.W 0 ***NOTE IN PROGRESS NP0 DC.W 0 NP1 DC.W 0 NP2 DC.W 0 FL DC.B 0 *SE DC.B 0 *GL DC.B 2,0 VOL0 DC.B 15,3 VOL1 DC.B 15,4 VOL2 DC.B 15,2 MUSICON DC.B 0,0 VIB2 DC.W 0,1 *---------------- soft_scroll btst #0,scroll_flag scrolling background? beq noscrol move.w #1,scroll_stepper speed of scroll lea scroll_index,a0 (range 0-1000) lea scroll_direction,a1 tst.w (a1) bmi.s scrolup bra.s scroldo scrolup sub.w #1,(a0) cmp.w #2,(a0) bmi reverse bra scrolgo scroldo add.w #1,(a0) cmp.w #999,(a0) bmi.s scrolgo reverse neg (a1) reverse direction scrolgo jsr jeff_scroll go to it noscrol rts *----------------- * this one re-writes the boot sector repair lea read_buffer,a0 move.b #"B",2(a0) repair byte (B for Budgie) move.b #"S",180(a0) repair byte (S for viruS) jsr write_sector string getkey bra passed_test *--------- * ok tested 22/4 show_scores move.l $44e,save_screen show utility_screen cls home font 16 font 16 MUST be here... ink 11 ..before anything else. string < * > hi2a bset #0,sor8 sort finished flag (set=not finished) hi2 btst #0,sor8 beq hi3 bclr #0,sor8 lea high_scores,a0 bsr sort go and do that sort in include bra hi2 hi3 clr.l d3 \now let's print that lot lea high_scores,a2 \table starts with high scores move.l a2,a5 \preserve start address move.l a2,a3 \a3 is for the positioners move.l a2,a4 \a4 is the actual names adda.w #16,a3 \now we point to positioners adda.w #32,a4 \16 words further on, the names move.w #7,d7 loop 8 scores hi1 move.w (a2),d0 an actual score lea inbuff,a0 bsr bindec converts scores to readable ascii lea inbuff,a0 move.w #5,d2 bsr lead_zeroes lea inbuff,a0 bsr printline print space print space move.w (a3),d3 an actual positioner mulu #16,d3 adda.w d3,a4 the actual name wanted move.l a4,a0 a4 points to start of string... bsr printline ... which ends with 13,10,0 adda.w #2,a2 increment the score pointer adda.w #2,a3 increment the names pointer move.l a5,a4 but..restore the start address! adda.l #32,a4 plus 32 to reach first name lea snd5,a0 bsr dosound dbra d7,hi1 move.w #$007,$ff8240 blue border [RGB] font 8 * show save_screen separate hi9 rts *------------ * newrecord (to precede show_scores tested 22/4/89 newrecord movem.l a0-a6/d0-d7,-(sp) lea high_scores,a1 adda.w #160,a1 the newcomer in buffer 9 lea high_scores,a0 adda.w #14,a0 the lowest record move.w score,(a0) replace it lea high_scores,a0 adda.w #30,a0 clr.l d3 move.w (a0),d3 MUST be a Word mulu #16,d3 the offset lea high_scores,a0 adda.w #32,a0 lea 0(a0,d3),a4 actual name we want to remove move.l #12,d4 13 byte long entry nr2 move.b (a1)+,(a4)+ dbra d4,nr2 lea high_scores,a0 new: sept 89 jsr sort re-sort the table movem.l (sp)+,a0-a6/d0-d7 rts *------------ enter_your_name jsr clearbuf flush k/board as input is imminent move.l $44e,save_screen show utility_screen cls home font 16 ink 15 move.w #12,d5 move.l #high_scores,a5 adda.l #160,a5 .en7 move.b #46,(a5)+ put 13 full stops (ascii 46) dbra d5,.en7 move.l #keybuff+2,a0 move.w #12,d0 .lp move.b #32,(a0)+ clean my buffer dbra d0,.lp printat 2,4,0,#yourname jsr getlin input name (buffer is clean) move.w #12,d7 loop 12 to 11 24/4/89 move.l #keybuff+2,a0 from input buffer move.l #high_scores,a1 to hi-score table adda.l #160,a1 .en1 move.b (a0)+,d0 get a byte from input buffer cmp.b #32,d0 c/r and zeroes cause problems beq .en4 space is OK cmp.b #46,d0 beq .en4 dot os OK cmp.b #96,d0 97 is a bmi .en11 sub.b #32,d0 try to bring it down to Upper case cmp.b #90,d0 Z bgt .en2 still too high, forget it .en11 cmp.b #65,d0 less than A? bmi .en2 cmp.b #90,d0 greater than Z? bgt .en2 bra .en4 ok valid character .en2 move.b #32,d0 substitute space instead .en4 move.b d0,(a1)+ should be OK by now dbra d7,.en1 font 8 show save_screen .en9 rts yourname dc.b "Your Name...",10,13,0 even *------------------ * this is a horizontal blank routine, used for graphic timing * it should be removed when the game is debugged * it increments hbl_ct each horizontal line, so that one can always * tell where the raster is. Should never exceed 300. hbl_r2 add.w #1,hbl_ct rte *--------------- reset_high_scores print confirm getkey cmp.b #"Y",d0 beq r_h_s2 rts r_h_s2 move.l #7,d3 lea high_scores,a0 r_h_s1 move.w #0,(a0)+ dbra d3,r_h_s1 rts *------------ * universal mouse coverage detect (Nov 88) * expects current x-y position of mouse in d1,d2 (L) * expects address of 4 Long words in A0 ex: fruitpos dc.l 22,28,100,128 * answer in mouseloc (w) 0 or 1 no or yes * A0 will be corrupted. Save if necessary * ex: bsr read_the_mouse bsr mouse_pos tst.w mouseloc mouse_pos move.l 0(a0),d3 cmp.l d3,d1 left bmi .no move.l 4(a0),d3 cmp.l d3,d1 right bgt .no move.l 8(a0),d3 cmp.l d3,d2 top bmi .no move.l 12(a0),d3 cmp.l d3,d2 bottom bgt .no move.w #1,mouseloc ok to gamble rts .no move.w #0,mouseloc rts mouseloc dc.w 0 *--------------------------- ** toggle the two video screens toggle_screens lea logical_screen,a0 movea.l (a0),a1 logical and movea.l 4(a0),a2 physical pointers move.l a1,4(a0) now move.l a2,(a0) switched around move.l a1,$45e somehow this line is needed to tidy up screen records move #-1,-(a7) set_screen same res move.l a1,-(a7) new log move.l a2,-(a7) new phys move #5,-(a7) trap #14 lea 12(a7),a7 rts *--------------------------------------------- time_update cmp.w #50,clock_timer 50=1 second bgt .timeok rts not yet .timeok clr.w clock_timer lea time,a0 add.w #1,(a0) move.w (a0),d0 lea inbuff,a0 jsr bindec lea inbuff,a0 lea inbuff,a6 clr.l d0 move.b 3(a6),d0 tens sub.b #48,d0 48=ascii 0 lsl.b #3,d0 mul by 8 move.l spr_screen,a0 add.l #108*160,a0 make a variable later add.l d0,a0 final pos move.l logical_screen,a1 move.l physical_screen,a2 add.l #70*160+144,a1 add.l #70*160+144,a2 move.l 0(a0),(a1) top border black move.l 0(a0),(a2) move.l 160(a0),160(a1) move.l 160(a0),160(a2) move.l 320(a0),320(a1) move.l 320(a0),320(a2) move.l 480(a0),480(a1) move.l 480(a0),480(a2) move.l 640(a0),640(a1) move.l 640(a0),640(a2) move.l 800(a0),800(a1) move.l 800(a0),800(a2) move.l 960(a0),960(a1) move.l 960(a0),960(a2) move.l 1120(a0),1120(a1) move.l 1120(a0),1120(a2) move.l 1280(a0),1280(a1) move.l 1280(a0),1280(a2) move.l 1440(a0),1440(a1) move.l 1440(a0),1440(a2) move.l 1600(a0),1600(a1) move.l 1600(a0),1600(a2) move.l 1760(a0),1760(a1) move.l 1760(a0),1760(a2) move.l 1920(a0),1920(a1) move.l 1920(a0),1920(a2) move.l 2080(a0),2080(a1) move.l 2080(a0),2080(a2) move.l 2240(a0),2240(a1) move.l 2240(a0),2240(a2) move.l 2400(a0),2400(a1) move.l 2400(a0),2400(a2) sub.l d0,a0 reset origin at 0 clr.l d0 move.b 4(a6),d0 units sub.b #48,d0 48=ascii 0 lsl.b #3,d0 mul by 8 add.l d0,a0 final pos add.l #8,a1 screen: more 1 pos to the right add.l #8,a2 same move.l (a0),(a1) move.l (a0),(a2) move.l 160(a0),160(a1) move.l 160(a0),160(a2) move.l 320(a0),320(a1) move.l 320(a0),320(a2) move.l 480(a0),480(a1) move.l 480(a0),480(a2) move.l 640(a0),640(a1) move.l 640(a0),640(a2) move.l 800(a0),800(a1) move.l 800(a0),800(a2) move.l 960(a0),960(a1) move.l 960(a0),960(a2) move.l 1120(a0),1120(a1) move.l 1120(a0),1120(a2) move.l 1280(a0),1280(a1) move.l 1280(a0),1280(a2) move.l 1440(a0),1440(a1) move.l 1440(a0),1440(a2) move.l 1600(a0),1600(a1) move.l 1600(a0),1600(a2) move.l 1760(a0),1760(a1) move.l 1760(a0),1760(a2) move.l 1920(a0),1920(a1) move.l 1920(a0),1920(a2) move.l 2080(a0),2080(a1) move.l 2080(a0),2080(a2) move.l 2240(a0),2240(a1) move.l 2240(a0),2240(a2) move.l 2400(a0),2400(a1) move.l 2400(a0),2400(a2) add.w #8,bill rts *------------------------ * note: sprites are defined graphically on a degas.pi1 * picture, held in memory. Usually called sprites.pi1. or sprites.pic * usually held on a screen called spr_screen (see opening sequence) * Another degas.pi1 is required as a background picture. * This picture is then copied TWICE under physical_screen * and logical_screen (usually known as screen_0 and screen_1) * the background picture is needed to RESTORE a background * after a sprite has left it. * The information about sprites is held in an array called 'sprites' * Each sprite need 32 bytes to hold the required information * Therefore, info about second sprite is held at 'sprites'+32 * next one is at sprites+64 and so on * Finally, the sort of info stored in that array is * origin: its precise location on our degas picture (spr_screen) * destination: where we are about to draw it (ex:16000) middle of screen * height (anything up to 200 lines) * chunks (width) (1 chunk = 16 pixels) * initial x (anything from 0 to 319) * initial y (anything from 0 to 199) * restore address (for restoring background on one screen) * restore address (same thing, but, for the other screen) * lateral direction (left/right) * active/ inactive byte * last two bytes (30-31) unused initialize_sprites *-- 0 ----------------------------------------------------------- lea sprites,a6 start of sprite parameters array add.l #0,a6 joystick sprite usually first move.l #190*160+128,(a6) origin on Degas move.l #8000,4(a6) destination : y * 160 move.w #10,8(a6) height move.w #3,10(a6) chunks move.w #0,12(a6) initial x move.w #50,14(a6) initial y move.l #8000,16(a6) y * 160 + x move.l #0,20(a6) restore address (2 v/b away) move.l #0,24(a6) restore address (1 away) move.b #0,28(a6) going right move.b #1,29(a6) active *-- 1 ----------------------------------------------------------- lea sprites,a6 start of sprite parameters array add.l #32,a6 second sprite (ie sprite #1) move.l #160,(a6) origin on degas move.l #3200,4(a6) destination : y * 160 move.w #8,8(a6) height move.w #1,10(a6) chunks move.w #0,12(a6) initial x move.w #20,14(a6) initial y move.l #3200,16(a6) y*160 + xbyte move.l #0,20(a6) restore address (2 away) move.l #0,24(a6) restore address (1 away) move.b #0,28(a6) going right move.b #1,29(a6) active *-- 2 ----------------------------------------------------------- lea sprites,a6 add.l #64,a6 #2 move.l #168,(a6) move.l #8000,4(a6) move.w #18,8(a6) move.w #1,10(a6) chunks move.w #0,12(a6) move.w #50,14(a6) move.l #8000,16(a6) move.l #0,20(a6) move.b #0,28(a6) move.b #1,29(a6) *-- 3 ----------------------------------------------------------- lea sprites,a6 start of sprite parameters array add.l #96,a6 sprite #3 move.l #160,(a6) origin on degas (top of screen, far left) move.l #130*160,4(a6) initial destination : y * 160 move.w #6,8(a6) height move.w #9,10(a6) chunks (each chunk is 16 pixels wide) move.w #8,12(a6) initial x (here, far left) move.w #130,14(a6) initial y (half way down) move.l #130*160+80,16(a6) y*160 + xbyte move.l #0,20(a6) restore (2 v/b away) move.b #0,28(a6) going right move.b #1,29(a6) active *-- 4 ----------------------------------------------------------- lea sprites,a6 add.l #128,a6 sprite #4 move.l #160,(a6) move.l #8000,4(a6) move.w #18,8(a6) move.w #1,10(a6) chunks move.w #0,12(a6) move.w #50,14(a6) move.l #8000,16(a6) move.l #0,20(a6) move.b #0,28(a6) move.b #1,29(a6) *-- 5 ----------------------------------------------------------- lea sprites,a6 add.l #160,a6 sprite #5 move.l #106*160,(a6) origin move.l #24000,4(a6) initial destination move.w #16,8(a6) h move.w #3,10(a6) chunks move.w #160,12(a6) x ie byte 80 move.w #150,14(a6) y move.l #24080,16(a6) precise (0-32000) move.l #0,20(a6) move.b #0,28(a6) move.b #1,29(a6) *-- 6 ----------------------------------------------------------- lea sprites,a6 add.l #192,a6 sprite #6 move.l #16000,(a6) move.l #24000,4(a6) move.w #38,8(a6) h move.w #3,10(a6) ch move.w #160,12(a6) x ie byte 80 move.w #150,14(a6) y move.l #24080,16(a6) precise (0-32000) move.l #0,20(a6) move.b #0,28(a6) move.b #1,29(a6) rts *------------------------------------ * sprites parameter blocks * 0 (L) origin (0-32000) in 8's * 4 (L) destination y * 160 (0,160,320.....32000) * 8 (W) height (1-200) * 10 (W) chunks (1-8) * 12 (W) x (0-320) * 14 (W) y (0-199) * 16 (L) full location ie y + x (0-32000) * 20 (L) restore address (2 v/b away) * 24 (L) restore address (next v/b) (0-32000) * 28 (B) direction (0 right 1 left) * 29 (B) active flag (0 inactive 1 active) sprites ds.l 64 room for 8 sprites * some timings: a sprite 6 chunk wide, 20 lines high, takes 145 h/b to draw * then, there is saving and restoring.... *--------------------------------------------------------------- kup move.l $44e,a0 add.l incr,a0 move.l a0,$45e bsr vtsync rts kdown move.l $44e,a0 sub.l incr,a0 move.l a0,$45e bsr vtsync rts *----------- end_of_level silence silence sound chip move.w #0,clock_timer move.w #99,time or whatever figure is needed lea level,a0 add.w #1,(a0) move to next level show screen_1 give us a bonus move.l screen_1,a0 sub.l #32,a0 bsr setpal wait 50 move.l screen_0,$45e bsr vtsync move.l #palet,a0 bsr setpal bsr initjoy bra intro4 *------------------- end_of_game move.w #0,clock_timer lea snd5,a0 bsr dosound wait 8 bsr clearbuf e_o_g0 move.w score,score bsr newrecord lea high_scores,a3 lea file_6,a0 (hiscores.asc) bsr f_create move.l #356,d3 was #244,D3 bsr f_write bsr f_close bsr show_scores getkey e_o_g1 move.w #0,score move.w #0,game_over move.w #1,level ok bsr clearbuf rts *------------------ * this is the official quit routine (jsr kwit) kwit move.b #0,$fffa1b stabilise MFP interrupt btst #0,h_blank was a h/blk routine active beq kwi1 move.l #hbl_r2,a0 if so de-activate it bsr rst_horizontal_blank bclr #0,h_blank kwi1 move.l #music,a5 bsr disable_vbi disable the above v/blk routine silence bra quit restore the palette and final quit *--------------------------------- * this one un-scrambles a scrambled code on boot sector read_meadway_boot jsr read_sector read boot sector lea read_buffer,a0 this buffer is 512 bytes long add.w #78,a0 move.w #$200-80,d0 llpp move.b (a0),d1 eori.b #$ff,d1 move.b d1,(a0)+ dbra d0,llpp jsr boot_sector getkey bsr write_sector bra kwit *---------------------- create_boot_uk jsr read_sector read boot sector lea read_buffer,a0 this buffer is 512 bytes long move.b #$60,0(a0) "bra $3a bytes.. move.b #$38,1(a0) ..further away" add.w #$3a,a0 put code here lea new_buffer,a1 move.w #200,d7 loop .lll move.b (a1)+,(a0)+ transfer to official buffer dbra d7,.lll string string jsr boot_sector prepare executionable sector getkey jsr write_sector and write it to disk bra kwit *---------------------- * here is an actual code that will be stored on boot sector * and executed (if disk is made executable) * It flashes a welcome message. new_buffer lea budg(pc),a0 move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp move.w #100,d7 .lpp addi.w #$111,$ff8242 flashes subi.w #$111,$ff8240 bsr .slow dbra d7,.lpp move.w #30,d7 .lpl subi.w #$111,$ff8242 more flashes addi.w #$111,$ff8240 bsr .slow dbra d7,.lpl rts .slow move.w #1000,d6 delay between flashes .lps nop nop dbra d6,.lps rts budg dc.b 10,10,10,10,10,10,10,10,7 dc.b " BILL AVERY IS VIRUS FREE !",10,10,10,10,13 dc.b " ALL CIRCUITS OPERATIONAL..",10,13,0 ds.b 500 even *~~~~~~~~~~~~~~~~~~~~~~~INCLUDES~~~~~~~~~~~~~~~~~~~~~~~~~~~* even include "a:\includes\include1.s" even include "a:\includes\include2.s" even include "a:\includes\include3.s" even include "a:\includes\include4.s" even include "a:\includes\include5.s" st replay only even include "a:\shell\included.s" custimized routines even include "a:\includes\sounds.s" even include "a:\shell\text.s" even include "a:\common\games.s" even *~~~~~~~~~~~~~~~~~VARIABLES AND CONSTANTS~~~~~~~~~~~~~~~~~* rnd1 dc.l 0 these randoms are clearly visible.. rnd2 dc.l 0 ..in action rnd3 dc.l 0 defender dc.b 0 used to be a word, but a word is MUCH joystick dc.b 0 even better for bit testing dc.l 0 pause dc.w 0 status dc.w 0 status flag level dc.w 1 initial level game_over dc.w 0 k_repeat dc.w 0 normally 2 k_delay dc.w 0 normally 15 destroyed dc.w 0 ambline dc.l 0 a line number (0-1000++ store dc.w 0 debugging/ work variable storel dc.l 0 same, but Long records dc.l 0 dot dc.w 0 flag bset#0 to draw a dot hbl_ct dc.w 0 these three here used for debugging only: before ds.w 20 this is an ARRAY when various 'stopwatches' after ds.w 20 are slotted for revealing through k_star degas_file dc.w 0 incr dc.l 1280 used for hardware scrolling drum dc.b "a:\common\drum*.spl",0 penny_pic dc.b "a:\common\penny.pi1",0 budgie_pic dc.b "a:\common\budgie.tit",0 title_page dc.b "a:\shell\title.pi1",0 sprites1 dc.b "a:\shell\sprites.pic",0 <<<< compacted! ; if not compacted, call it sprites.pi1 ; and make sure to load it the proper, uncompacted, way background dc.b "a:\shell\blob.pi1",0 change as required help_pic dc.b "a:\shell\help*.pi1",0 " " a1_font dc.b "a:\fonts\a1_fat*.fon",0 change as required a2_font dc.b "a:\fonts\a2_squa*.fon",0 " " a2_font2 dc.b "a:\fonts\a2_elega*.fon",0 file_6 dc.b "a:\shell\hiscores.asc",0 even drum_ptr dc.l 0 a1_ptr dc.l 0 16*8 font a2_ptr dc.l 0 8*8 font top_screen dc.l 0 buffer_screen dc.l 0 all these are POINTERS spr_screen dc.l 0 where degas sprites will go cur_screen dc.l 0 work_screen dc.l 0 screen_0 dc.l 0 this one is a video screen screen_1 dc.l 0 and this is the other back_screen dc.l 0 screen_3 dc.l 0 lady_screen dc.l 0 utility_screen dc.l 0 sort of workscreen, for messages, etc.. current_screen dc.l 0 spare_screen dc.l 0 video_screen dc.l 0 screen_base dc.l 0 the very first screen, early in ram score dc.w 0 needed clock_timer dc.w 0 needed time dc.w 0 needed h_blank dc.w 0 a flag new_record dc.w 0 new_entry dc.w 0 cheat dc.w 0 bill dc.w 0 the time taken in 1 v/b 0 to 300 approx lives dc.w 3 freeze_ct dc.w 5 when my ship is hit by damonoid scroll_flag dc.w 0 on/off scroll flag slow dc.w 0 flag to slow down things video dc.w 0 bit 0 clear=screen 0 showing dtaddress ds.w 52 needed for disk routines res_word ds.w 1 these 17 words must stay together palet ds.w 16 start up palette sbuff ds.l 1 this address is the last one on the prog even *~~~~~~~~~~~~~~~~~~~THE STACK~~~~~~~~~~~~~~~~~~~~~~~~~~* ds.l 256 about 64 used on average stack dc.l 0 buffer_5 ds.w 1600 ds.w 1600 (buffer_5 + 3200 bytes) buffer_6 ds.w 1600 ds.w 1600 (buffer_6 + 3200 bytes) dc.b "--------------------------------------------" even * the above buffers and the dotted line are actually visible * when debugging with cursor keys. They are just before the start * of the heap, before utility_screen *~~~~~~~THE END~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ** Dec 29 1989 Budgie UK Shell 1 (commented) *** * This is the backbone of most Budgie games written in 68000 * Virtually all macros in the macro file may be activated * from this cut down shell. * The full shell is available to all Budgie UK members * this shell1.s is the first in the LINE by LINE comments series * Another such program is raster1c.s (multi-color interrupt) * write if required. * preferred assembler: DEVPAC2 from HiSoft *--------------------------------------------------------*** bra start ; bra means branch. (goto in basic) . Another way is to use jmp. ; bra can branch as far as 32565 bytes either way ; jmp can jump anywhere in the prog. ; we normally use bra because it is more efficient include "a:\includes\macros.s" ; ready-made 'basic-like' macros are an easy way of doing things ; include is a 'directive'. not an instruction as such. even ; let's play it safe, and continue with the next instruction... ; ... on an even boundary. 'even' is another 'directive' start startup ; now that the 'macros' are loaded, let's use the first one: ; startup is a collection of about 12 instructions giving to gem ; all the unwanted memory. we'll just retain what we need for ; this program. No more. ; 'start' was a 'label'. Just like labels in basic. ; labels start on the first position of a line. jsr superin ; from now on, we're in supervisor mode ; jsr means jump to sub-routine (gosub in basic) ; bsr (branch to sub-routine) would have done the same job as long ; as superin was not more than 32565 bytes away. jsr phys_base ; another subroutine (part of include1.s) :get default physbase move.l d0,physbase ; the sub-routine returns the address of default physbase in d0.l ; as we will need it upon exit, let's store it in a variable. ; The chances are that the address returned is either $78000 or $f8000 move.l d0,screen_0 ; we will give this address our video screen: situated right ; at the top of free ram, this address is totally safe sub.l * this source file CANNOT be assembled on its own. * it is merely part of 'shell.s' which calls it. high_scores DC.W 28,26,24,12,10,8,6,4 \to skip,adda.w 16 DC.W 0,1,2,3,4,5,6,7 \to skip, adda.w 16 DC.B "JACK KNIFE...",10,13,0 DC.B "CLIVE CLUTCH.",10,13,0 DC.B "ERIC BODGE...",10,13,0 DC.B "PETER PIT....",10,13,0 DC.B "FLAT TYRE....",10,13,0 DC.B "BOB CARR.....",10,13,0 DC.B "PAUL POSITION",10,13,0 DC.B "SHARP BEND...",10,13,0 dc.b ".............",10,13,0 hi_160 ds.b 400 DC.B 0 end of table next section was overwritten by hi_scores.asc! even rules_1 dc.b " FINAL LAP ",13,10 dc.b " ------------ ",13,10 dc.b "Press HELP or F/KEYS any time. ",10,10,13 dc.b "To restart a new HI-SCORE table, just ",10,13 dc.b "delete the file marked HISCORES.ASC ",10,13 dc.b "A new one will be created automatically.",10,13 dc.b "Alternatively, press F9... ",10,10,13 dc.b "This disk is protected against possible ",13,10 dc.b "viruses. ",10,13 dc.b "The program reads the boot sector at the",10,13 dc.b "beginning of each game and expects to ",10,13 dc.b "find certain bytes (ex: Budgie). ",10,13 dc.b "If these bytes are missing, a virus has ",10,13 dc.b "probably taken hold of the boot sector. ",10,13 dc.b "Never mind, it will be erradicated ",10,13 dc.b "automatically. ",10,13 dc.b "Do not use commercial protectors, as we ",10,13 dc.b "will merely treat them as another virus.",10,10,13 dc.b "Happy driving! ",10,13,0 *--------------- the_credits dc.b 27,"E",27,"b",7,10,13 dc.b "Coding : Camy Maertens",10,10,13 dc.b "Thanks to Simon Rush",10,13 dc.b " Gary Wheaton",10,13 dc.b " Gareth Pople",10,13 dc.b " and Jim Holmwood",10,10,13 dc.b " for many useful routines.",10,10,10,13 dc.b 27,"b",4 was 8 check1 dc.b 189," June 1989 BUDGIE UK",10,13 **** dc.b " All marketing rights ",10,13 dc.b " strictly reserved.",10,10,10,10,10,10,13 dc.b 27,"b",7 check2 dc.b " A BUDGIE UK production.",10,13,0 **** **** leave these check lines alone..particularly the letter B. source dc.b 27,"E",27,"b",6,10,13 dc.b " ",10,10,13 dc.b "The SHELL is written in Assembler, ",10,13 dc.b "using",10,13 dc.b "HISOFT's DEVPAC 2.",10,10,10,13 dc.b "Source code available to",10,13 dc.b "68000 Programmers",10,13 dc.b "and all Budgie UK members.",10,10,13 dc.b " BUDGIE UK",10,13 dc.b "5, Minster Close, Rayleigh, Essex, UK",13,10,0 options DC.B 27,"Y",33,32 DC.B "F1-F10 Messages",10,13 dc.b "Help/Enter HELP",10,13 dc.b "V S/W scroll",10,13 dc.b "H toggle 50/60 Hz",10,13 dc.b "P Pause then press 1-6",10,13 dc.b "C Slow motion",10,13 dc.b "X Erase screen",10,13 dc.b "L Load PI1",10,13 dc.b "* Debug",10,13 dc.b "D Dump screen",10,13 dc.b "M Music ",10,13 dc.b "UP/DOWN H/W scroll ESC quit",0 EVEN cursor_loc10 DC.B 27,"Y",42,32,0 10 down cursor_loc16 DC.B 27,"Y",48,32,0 16 down confirm DC.B 27,"Y",33,32 dc.b "RESET high scores TABLE",10,10,13 dc.b 27,"p"," confirm ",27,"q"," Y/N",10,13,0 prompt DC.B 27,"Y",33,32 dc.b "Load DEGAS file:",10,13 dc.b "Enter File name",10,13 dc.b "ex: que*.pi1",10,13,0 even *----------* license dc.b "Budgie products are LICENCEWARE.",10,13 dc.b "--------------------------------",10,10,13 dc.b "It means that only Licensed Distributors",10,13 dc.b "are allowed to sell our titles.",10,13 dc.b "The end user is authorized",10,13 dc.b "to copy this program or even give",10,13 dc.b "it away if he wishes.",10,10,13 dc.b "The price of this Program is pitched",10,13 dc.b "at or slightly above PD levels.",10,13 dc.b "Royalties are collected from the",10,13 dc.b "Licensees and forwarded to all ",10,13 dc.b "our authors.",10,10,13 dc.b "A list of Licensed Distributors",10,13 dc.b "is available from Budgie UK.",10,10,13 dc.b "Copyright and full marketing rights",10,13 dc.b "are held by Budgie UK",10,13,0 even stick_forward dc.b "stick forward!",10,13,0 even desert_island dc.b " Everyone has his own idea as to which",10,13 dc.b "his all-time favourite games are.",10,13 dc.b "If I were stranded on a desert island,",10,13 dc.b "with my computers and a generator,",10,13 dc.b "(another dumb assumption...)",10,13 dc.b "these would be my 10 desert island",10,13 dc.b "disks:",10,10,13,0 desert1 dc.b "International Soccer (C64)",10,13 dc.b "Last Starfighter (Atari 800)",10,13 dc.b "Arkanoid (Atari ST)",10,13 dc.b "Cyclons (C64)",10,13 dc.b "Leaderboard Executive (C64)",10,13 dc.b "Flight Simulator II (Atari ST)",10,13 dc.b "Psion Chess (Atari ST)",10,13 dc.b "River Raid (Atari 800)",10,13 dc.b "International Karate + (Atari ST)",10,13 dc.b "Speed King (C64)",10,10,13,0 desert2 dc.b "Imagine the horror of leaving out",10,13 dc.b "Boulderdash, Zolyx, Crazy Cars II,",10,13 dc.b "Buggy Boy, ace, Beach Head, Pitstop II,",10,13 dc.b "Drop Zone, Snapper, BBC Tennis,etc..",0 mess_1 dc.b "***************",10,13 dc.b "BUDGIE UK",10,13 dc.b "5 Minster Close",10,13 dc.b "Rayleigh Essex",10,13 dc.b "SS6 8SF",10,13 dc.b "United Kingdom",10,13 dc.b "***************",10,13,0 mess_2 dc.b " BUDGIE UK ",10,10,13 dc.b 27,"b",6 dc.b " Licenceware ",10,10,13 dc.b "The fairer face of PD.",10,10,13 dc.b "------------------------",10,13,0 mess_3 dc.b "BUDGIE UK now accounts for more",10,13 dc.b "than 55% of the ENTIRE budget",10,13 dc.b "production on the Atari ST !!!",10,10,13 dc.b " ***",10,13 dc.b "If you have a game you want to share",10,13 dc.b "with your fellow ST ers, contact",10,13 dc.b "BUDGIE UK for help, advice and",10,13 dc.b "exchange of routines.",10,13 dc.b "More than one hundred machine code",10,13 dc.b "routines available to members!",10,13 dc.b "We will particularly favour",10,13 dc.b "programs written in 68000 code",10,13 dc.b " (NO more STOS PLEASE ....)",10,10,13 dc.b 27,"b",4 dc.b ">>ALL AUTHORS RECEIVE ROYALTIES.<<",10,10,13 dc.b "----------------------------------",10,13,0 7F4"gA"WVwÿÿ¾ÿ¾ÿÿÿ½ÿ½ÿÿÿÿÿÿÿÿÿÞÿÞÿÿÿÿÿÿÿÿÿçÿçÿÿÿÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿ××ÿÿ¯ÿ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ¯ÿÿòòÿÿ]ë]ëÿÿ¿ÿ¿ÿÿÿ]U]Uÿÿú«ú«ÿÿÿ÷ÿ÷ÿÿ¿ë¿ëÿÿß÷ß÷ÿÿÿ÷ÿ÷ÿÿß¿ß¿ÿÿ77ÿÿÿÿÿÿÿÿ÷{÷{ÿÿïåïåÿÿöðöðÿÿÍÿÍÿÿÿ÷ÿ÷ÿÿ€ÿ€ÿ€???ÿÿÿ÷ÿ÷ÿÿ‡Ç‡ÇÿÿuÞuÞÿÿ¨1¨1ÿÿwÐwÐÿÿ‹®‹®ÿÿuÝuÝÿÿc¿c¿ÿÿþþþþÿÿ±ß±ßÿÿÿÿÿÿÿÿ ü üÿÿ""ÿÿŸÿŸÿÿÿÿÿÿÿÿÿþ»þ»ÿÿ+ÿ+ÿÿàmàmàÿmmÿÿó ó ÿÿ¯u¯uÿÿëÏëÏÿÿŽ¯Ž¯ÿÿ-U-Uÿÿß,ß,ÿÿVTVTÿÿ;®;®ÿÿï.ï.ÿÿ¹r¹rÿÿà&à&ÿÿÎæÎæÿÿ*Ç*Çÿÿ]]ÿÿ¤È¤Èÿÿ}ÿ}ÿÀÀÀÿÀÿÿ$ã$ãÿÿòþòþÿÿVVÿÿ·Ð·Ðÿÿ_®_®ÿÿjjÿÿ€µ€µÿÿ@Y@YÿÿP P ÿÿååÿÿ††ÿÿÿÿ((ÿÿ²²ÿÿ  ÿüÿÿÿÿÿÿÿøøøøÿÿ<<ÿÿEEÿÿÿÿÿÿÿÿ’’ÿÿÿÿÿÿ"T"Tÿÿµµÿÿppÿÿ€€ÿÿÿÿ¤€¤€ÿÿ’@’@ÿ€@€À?ÿÿÿÿÿÿÿÿÀÿÀÿØÿÀÿÿÿÿRˆRˆÿÿ€€ÿÿ ‚ ‚ÿÿUUÿÿIIÿÿ…µ…µÿÿÊÚÊÚÿÿ@‹@‹ÿÿ¯˜¯˜ÿÿ$$ÿÿÿÿ))ÿÿ²²ÿÿü`` @`ÿŸÿÿÿÿÿÿÿÿÀÿÀÿÜÿÀûmÉmÉÿÿˆMˆMÿýú‰ú‰wÿˆB‚B‚ÿÿÂÂÿÿÿÿÿÿÿÿ¶¶ÿÿ³³ÿÿi$i$ÿÿ¡‰¡‰ÿÿ ÿÿm$m$ÿÿ$À$À€? 0ÿÏÿÿÿÿÿÿÿÿÀÿÀÿÜÿÀ>ï))÷Þ!¦Ø¦Øç?Àÿÿ4 4 ß} ‚mmÿÿHHÿÿˆŒˆŒÿ¿@BB÷ÿDDÿÿ55ÿÿýûÀÀûÿû€÷þ?ïÿüààÿÿÿÿÿÿÿÁÿÀÿÝÿÀ?×(  ÿ€ÿêPP®ÏQ0ŠŠÿÿ»ÿD>úÁÿ¿@߀ ߀ ß €HH¿ÿ@ÿï þÿddÿøqÿ÷ÿüððÿÿÿÿÿÿÿÿÿÿÁÿÀÿÝÿÀ] ¢®±QN€€f÷™»þD € €ºëE€A€Aÿß ÿÿñwˆ®ÿQüÿÿÿë—hWz¨…ï×(.ðÑãÿÿÿüððÿÿÿÿÿÿÿÿÿÿÁÿÀÿÝÿÀŸcœ€ûïs•ŒjV©æ@@ï¾AWx¨‡eÕš*]R¢­êºEîºEºíEvý‰ý]¢µÝJ"ûÀçÿÿÿøøøÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀŠ­R€×Z(¥„>{Á»çD]u¢ŠHª·Uaî€ÿ÷Dþ»þûB½û‰~vÁü>ûÿ@¿  ÇÿÿÿøøøÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀÀÿÀ Aƾ0@¿þûÿ~ï‹èt hõ”Ø'ïX§ï*Õí(ë×Pá¯E/ºÐ( ×_’m@@ÿÿÿøøøÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀÀE¢À‚}¯P ïߊuû õûw퀒Hh§ûÿ ÿ_ íG˜@½úŠúuQý®ûïüÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀà Þà(×æ Y_¦0Éÿ(~×@~5Š×¡(^Ÿm`’B½ïJPµ¯In”"òd ˆ )¶Ö@`Ÿûk€€??ÿÿÿ???ÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀâàóDåª4XŠ¢A ÿÖ D»`ïý@í>G¨€ìË0H·óë¿@ ßÿÀo?ÿÿ÷~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀðóð A–ð($Ó¾@Ã?<ÀýwˆºªEUª°UOøI¶¯ÿ@ô³ L„p‚ u¬õQ Vþ¨ ÿ߀NüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀð†ðxä¯P ­RÊܸ#G1ÿ̺€Eën‘k¶”IH·ç¡^øõn ‘»ÿD_ÿ ÿÿ¼<øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀù¢òø A×I׶(ñBÕV ©aïaʮ5Qµ½UBªWWä¨%%bÚ”„öç f±æ³LrúUªWú¨¯ë¿ÿ@ -ÿÿxxñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀù$$øÛm%ý%Úl“íôXü^¡“»áD(*oºEÈ}ë€ÓÛ6$É% ¥ZðI$I$¶ÛÅ*í.Ñ°ç»ÿD º_û ñ|ÿüððóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀümÿüÏ÷Ïÿ0òþoI/I/¶ÐÄÅW:¨ó$û$Û’(’ümª%ûeš’¶ÆI9ªÚëß ´IöÉ 6&ÔÙ+u逇¨ÿûààçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀüääü-¯P$–ì–iÀØå'“’»mDakÿ€RLÿ~ã]ã€÷÷ÉGÉg6˜Höx÷‡ÀŸßÿ ±Öÿ×(s`÷€ÀÀÏÿÿ‡ÿ?ÿ?ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÀÿÀÿÞÿÀððþþþ oy|yÿ†  é&Ùÿ5ÿ5Ê—Ë—ëh/ ¿(@׶€¾ A_;Ö;)ļÙþÝ"4ˆvº‰E Í Í_2$ÀÿÏ€€?ÿ€ÿÀÿÀÿßÿÀwÿÿpÿÿ€ÿÿ¶¶IA_è pbíýÿúdúäèè÷  þô]ª]ê¢ÀÅ:ñ»ï»ïD‡*¯+PÔïÿ¿?€€?€ÿþþþÿþðððð?À?À?ß?Àoÿÿ`ÿÿ€ÿÿ²²ME<üðþøøÿüÿÀÿþþþ€€øy€ ÿÿÀÿÿ€ÿ€@ÿ€03!!ïÞ!UAUAª¾UAxxâ‡x‚‚}û‚ë÷[`[`¤Ÿ[`ÿÿÀáàðððÿà€€ÿãø?ÿÿÿï€ï€?€óÀóÀ;óÀÿÿàÿüüþüÿ«p«pT«p"*"*ÝÕ"*ñFñF¹ñF00ëÏ0––ýi–oþü?ÿ?ÿÿÿÿ‡€~ñððÿÿ?ÿÿü?ü?À?ÿÿÿ÷À÷À=÷À||à|ÿÿó££ï\£níní‘ní””åk”((ý×(¤€¤€[¤€üüÿÿÿÿÿÿÿüø<üðþÿÿðÿÿÀÿÀ?ÿÿÿÿÿÿÿàÿàÿàÀÀ=À ðÿÿÿü'ê'êØ'êÿíþ~þ~þ~åæåæåæÿ~€ÿÿÿÿÿÿÿÿÿáÀàðàððÿÿ€øÿøÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþùÿÿñ¿þŠŠuŠwíwíˆwí··ëH·”\”\k£”\ûøÿÿÿÿÿÿóÿóþ ðÿÿøðÿÿ??ð€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿààÿàÿÿÍ¿ü©p©p©p„2„2{Í„2µµJáµòòú òÿÀÿÿÿÿÿÿÿùÿùàøðxøx€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿ¿ÿÿÿßøÀ À òÀ )þ)þÖ)þ‡‡ïx‡ < <•Ãj<€€?x€ÿÿÿÿÿÿÿÿÿûÿûøƒÇÀ8€ÿÿü‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿàÿàÿÿ¿ÿÿÿßðá’á’má’„2„2{Í„2-6-6RÉ­6Á¶Á¶>IÁ¶àÀÿÿÿÿÿÿÿÿÿóüð ð>xþ‡ÿÿÿðÁÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿßÿÿÿïðæ à öà kmkm”’kmˆˆÿt‹2D2D»þDÜ`ÿÿÿÿÿÿÿÿÿÃáÀ<Àç€àÿÿÿàaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿààÿàÿÿïÿÿÿïàÝ÷À÷"À÷·M·MH²·Moo€ðC}C}ˆ‚w}—€—‡€¿°ÿÿÿÿÿÿÿÿÿï€ÿçÿÿÿÿÎÞ€Þ€Þ€ÿ¸ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿïÿÿÿ÷àii€”kN÷N÷oÿ…Ö…Ö8(Ç×ÛÛ$ÿÛ-€-‡-€°ÿÿÿÿÿÿþÿüøxgø`ÿÿÿÿÿÐÿÜÿÿÿÿÿÿÿÿÿÿïÿïÿïüüÿüÿÿ÷ÿÿÿ÷áÿ€÷ë÷ë÷ë{­{­ûíÇnÇnÿ€ÿ°ÿÿÿÿÿÿÿÿÿùÿáãÀßÀ?Àÿÿÿÿÿ½€½½€ÿÜ?ÿ?ÿ?ÿÿÿÿÿÿÿü?ü?Àü?þþÿþÿÿûÿÿÿ>>÷Á>êj€1Ž1Ž€ÿŠ¼Š¼!Þÿ€}€|îüZ€ZZ€ÿ0ÿÿÿÿÿÿÿÿÿçÿ‡ž~ÿÿÿÿÿ;ÿ;»`»a»`ÿì?ÿ¿ÿ?ÿÿÿÿÿÿÿÀÀ?€Àÿÿÿÿÿÿýÿÿÿ>>ûÁ>þ>€?ï{ï{ÿÿLfLf ßï©û©øÿø—€—€~0ÿÿÿÿÿÿÿÿÿžþððÿÿÿÿÿpÿpÿì?ÿ¿ÿ?ÿÿüÿüÿüÿÿÿÿÿ€ÿ€ÿ€ÿÿýÿÿÿ<<ûÃ<ÿõ5?Z×Z×ÿÿõËõËÿÿûøÿøÿ€ÿ€0ÿÿÿÿÿÿÿÿþyøx€€ÿÿÿÿÿ~þ~öàöáöàÿì?ÿ¿ÿ?ÿÿÀÿÀ?ÿÀÿÿþÿÿÀÿÀ?ÿÀÿÿþÿÿÿ<<ýÃ<ÿþï{ï{ÿÿv¾v¾ÿÿYwYpÿðÿ€ÿ€0ÿÿÿÿÿÿÿøùðáðÿÿÿÿÿÿþþþîÀîîÀÿ˜?ÿ¿ÿ?ÿüüÿüÿþüþÿàÿÿþÿÿÿ<<ýÃ<ÿü ’–’–ÿÿí•í•ÿÿŠwŠpÿðÿÿ€1ÿÿÿÿÿÿÿðÇààÿÿÿÿÿÿÿüÿÿÀÿÀ?ÿ¿ÿ?ÿÀÀ?ÿÀÿøøøÿðÿÿþÿÿÿ98ýÆ8ßÿ ÿÿÿÿÿÿ¬¶¬¶ÿÿÛïÛãÿã[X[€ü1ÿÿÿÿÿüÿà?€?€ÿÿÿÿÿÿÿýÿÿÀÿÁ?ü¿ü?üÿÿÿàðàÿøÿÿÿÿÿ98ýÆ8Ïý0Þ÷Þ÷ÿÿùíùíÿÿ“è“àÿçþqÿÿÿüÿðÿ€ÿÿÿÿÿÿÿÿÿùÿÿ€ÿ€0ÀŸÀ?ÀÿÿÿÀðÀÿüÿÿÿÿÿ98ýÆ8Çÿ8ÿÿÿÿÿÿ׿׿ÿÿÛæÛæÿﶶ ¶þáÿÿÿóÿÃÿüÿüÿÿÿÿÿÿÿûÿÿ€ÿ€0œÿÿÿÿ€ð€ÿþÿÿÿÿÿ;8ýÄ8‡ÿXÿÿÿÿÿÿûýûýÿÿ¶à¶àÿïþÃÿÿÿÏþüøÿøÿÿÿÿÿÿ€û€w€ww€ÿ €?ÿÿÿÿàÿÿÿÿÿÿÿ30ýÌ0ƒÿlÿÿÿÿÿÿ¶ÿ¶ÿÿÿÿÍÿÍ ÿßll7lý‡ÿÿÿ?ø?øðÿðÿÿÿÿÿÿwwówÿÿ`€?ÿÿÿÿàÿÿ€ÿÿ¿ÿÿ30ýÌ0Ãÿ4ÿÿÿÿÿÿÿÿÿÿÿÿ÷Ð÷ßÿß úwú úÿÿüÿàÿðÀÿÀÿÿÿÿÿÿîîöîÿîîîþÀÿÿÿ?ÿ<À<ÿÿÀ?ÿÿ¿ÿÿýøáÿÿÿÿÿÿÿ÷ÿ÷ÿÿÿÿÀÿÀÿßïøÿÿóÿƒÿÀ€?ÿ€ÿÿÿÿÿÿäÿÜÜÜþÀÿÿÿ?ÿ8À8ÿÿàÿÿ¿ÿÿýøñÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿÕÿß §ß àÿÿÏÿÿ€ÿÿÿÿÿÿÿ Ü ÜÜÿý€ÿÿÿÿ?ÿ0À0ÿÿàÿÿ¿ÿÿýøðÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿïÿïÿï€?Ÿ¿€€ÿÿ?ü?üÿÿÿÿÿÿÿþ » »k»ÿ¸¸<¸ý€ÿÿÿÿ?ÿ À ÿÿðÿÿßÿÿýøðÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿðÿð~~ÿüÿøÿøÿÿÀÿÿÿýàÿ<û€ÿÿÿÿÿ`€`ÿÿøÿÿßÿÿýððÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿøÿûÿøÿùùÿøÿàÿàÿÿ88¸ÿ8ÿÿÿówwçwÿppxpûÿÿÿÿÿ@€@ÿÿøÿÿßÿÿýððÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿ÷ÿàÿÀÿÀÿÿ003ÿ0ÿÿÿïvvçvÿààààGöÿÿÿÿð€ÿàÿÿÿßÿÿýðýÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿøÿðÿÀ@ÿ¿ÿþààïÿàÿÿÿŸô÷ÿÿ÷ÿÀ€ŒÿÿÿÿÿÿÿþÿüüüÿïÿÿýðýÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿøÿÀÿ?€þÿþ€€ÿ€ÿÿþ|ðððÀxÿÿÿÿüø?€ÿÿÿÿøøïøÿÿýàýÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿøþþÿùÿÿþÿÿÿ??ýÀ?ðôðÿ00À0ÿÿÿþø?ÃÀÿÿÿÿÿàÿàÿàÿÿóàýÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒÿƒÿ€øøÿ÷ÿÿÿÿÿÿÿqÿqÿ‚qÿð÷ðà>ààÿÿÿüð ÿùàÿÿÿÿÿïÿïÿïÀÀ?ÿÀÿŽýÿÿÿÿÿÿÿÿÿÿÿÿÿüüü00ÿïÿÿÿÿÿÿþïÿïÿïÿð÷ÿðÀýÀ?Àÿÿÿüà|ðÿÿÿÿÿ÷ÿ÷ÿ÷ÿ€ÿ€|ÿ€ÿpýÿÿÿÿÿÿÿÿÿÿÿÿÿóøóøðÿ ßÿÿÿÿÿ??ÿÀ?ŸÿŸÿŸÿøûÿ ø€û€€ÿÿÿüÀ,xÿÿÿÿÿ÷ÿ÷ÿ÷ÿüÿàÿà~?Àýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€àà@¿ÿÿÿÿÿþþÿþÿÿÿüýÿüçÿÿÿÿøÀ <ÿÿÿÿÿ÷ÿ÷ÿ÷ÿÿÿø€ñÿ ÿÿÿÿÿÿÿüÿüÿüÿÿÿ€ÿ€ÿÿÿÿÿýýøýÿÿÿÿÿÿþþøþÿÿÿÿ€æ&& žÿÿÿ÷ÿ÷ÿ÷üÿüðüðÀÿ?ðÿ ÿÿÿÿÿÿÿóÿóÿðÿÿÿÿÿþÿþÿÿÿóó€óÿÿÿÿÿÿÿÿÿüüÿüÿÿàxŽ@  Îÿÿÿ÷ÿ÷ÿ÷ãþã€ã€ÿþàÿÿÿÿÿÿÿÿðÿ÷ÿðÿÿÿÿÿÿÿÿøøüÿïÿïÿïÿÿÿÿÿÿÿÿÿÿÿÿøøÿøÿðø€pppïÿÿÿïÿïÿïøÿøÀÿ7ÿÿÿÿÿÿÿðÿ÷ÿðÿÿÿÿÿÿÿÿÿÿÿøP€xxx÷ÿÿÿèÿèÿèÿÀà?àÿ<Àñÿÿÿÿÿÿÿÿøÿûÿø?ÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ /øüüüsÿ€ÿçÿçÿçþþÿàáÿÿÿÿÿÿÿÿøÿûÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿüü  ¯ø???þþþyÿ?€?ÿÿÿøÿøððÿ€óÿ ÿÿÿÿÿÿÿøÿûÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ðð ‚ð ¯ø?€?€?€ÿÿÿ=?ÿ?À?ÿÿÿÀÿÀ€<Àÿÿÿÿÿÿÿÿÿÿÿøÿøÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚø @_ð???ÿÿÿð))ð ÀÿÿÿàààðpÿàÿÿÿÿÄ8ÿàÿÿÿÿþÀ•ð•ð ÀÿÿÿÀÀÀàpÿøÿÿÿÿÀ8ÿÿ€ÿðÿðÀÿÿUðUUð ÀÿÿÿÀÀÀàp?ÿÀÿÿÿÿÀÿþÿøÿøÀÿÿRðRRð ÿÀ÷÷÷ÀÀÀàpÿÿÿÿÿü€€€ÿÿþÿÿÿøÿøÀÿÿ***`ÿ€ãëëÿ÷ÿðÿ÷çpÿÿÿÿÿøÿÿððàÿÿÿÿÿÿøÿøÀðð* **aüAXÿáÿéÿé ÿçÿàÿçÿpÿÿÿÿÿàÿÿàÿààÿÿÿÿÿÿøÿøÀªüªªãóƒÿÀÿÖÿÖ ÿÏÿÀÿÏÿpÿÿÿÿÿÿÿÿÿÿÿÿ€ÿðÿðÀ”ú”•ãŒ ÿàÿàÿàÿÏÿÀÿÏÿpÿÿÿÿð÷ÿøüøÿþþþÿÿÿÿÿþÀÿPúPPãxxÿÿÿÿÿÿÿÿ€ÿÿ`ÿÿÿÿÀÕýêþêÿÿøøøÿÿÿÿÿÿÿÿÿþÿÿõÿãÀÀÿÿÿÿÿÿÿ‘ÿ€ÿ‘ÿ`ÿÿÿþÕüªþªÿÿÿðððÿÿÿÿÿÿÿÿÿÿÿðxxÿãÿ?ÿ?ÿ?ÿÿÿÿàÿÿÿðUüªþªÿÿÿÿàààÿÿÿÿÿÿÿÿÿÿÿ€€€ÿãü>ü>ü>>?ÿÀÿÿÿÀUüªþªÿÿÿÿ€€€ÿÿÿÿÿÿÿÿøÿxxÿãð>ð>ð>=?ÿÀÿÿÿUþªþªÿppÿÿÿÿ€?€€ÿÿÿÿÿÿÿ€ÿÿ€€ÿãÀÀÀ}ÿ€ÿÿøö*>*ÿÿÿÿÿÿÀÀÀÿÿÿÿÿøxxÿÿÿãûÿ€ÿÿð?Àÿÿÿÿÿÿÿ??ÿøààÿÿüÿÀÀÿÿÿàÿÿÿûÿÿÿÿÀÿøøÿÿÿÿÿÿÿøøøÿÿÿÿÿþþÿÿÿàÿÿÿûÿÿÿÿÿÿÿÀÀÿÿÿÿÿÿüüüÿÿþþÿÿÿÿÿàÿÿÿ öÿÿÿü?ÿÿÿ>>ÿÿÿÿÿÿÿÿÿàÿàÿÿÿÿÿÿÿàüüüæÿÿÿÀÿÿÿððÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿðÀÀÀ3Ìÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿ€ÿÀÿ€ÿÿÿÿÿÿÿÿÿð€g˜ÿÿüÿÿÿÿÿÿ}€}€ÿÿÿ_þ ÿðþ ÿÿÿÿÿÿÿÿÿðàÇÿ8ÿÿðÿÿÿÿÿÿÀÀÿÿý_þ ÿðþ ÿÿÿÿÿÿÿÿÿøðþpÿÿ€ÿÿÿÿÿÿxxÿÿõ_ú ÿðú ÿÿÿÿÿÿÿÿÿøÿÿøðÿþÿÿÿÿÿÿÿÿõ_ê ÿðê ÿÿÿÿÿÿÿÿÿü€üãàÿüÿÿÿÿÿÿÿÿ€€Õ_ª ÿðª ÿÿÿÿÿÿÿÿÿþðÿp?ÀÿÀ?ÿÿÿÿÿÿÿÿ||U_ª ÿðª ÿÿÿÿÿÿÿÿÿÿÿàÀ??Àüÿÿÿÿÿÿÿý÷öU_ª ÿðª ÿÿÿÿÿÿÿÿÿÿ€ÿÿ€øÿÿÿÿÿÿÿÿýwrU_ª ÿðª ÿÿÿÿÿÿÿÿÿÿàÿÿÿàÿÿÿÿÿÿÿÿÿÕ_* ð* ÿÿÿÿ<<ÿÿÿÿÿÿþÿÿøÀÿÿÿÿÿÿÿÿÿÿß s#ÿÿÿÿÿÿÀÀÿÿÿÿÿÿÿàÿà€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿþðÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿàÿÿÿÿÀÿÿÿÿÀÿðÿàÀ@€3ÿ<<ø`?`??€€€ü?ø?ü?ÿÀÿÀÿÿøðãø@À€À¿ÿàà ø_pp €€€ü?„€ÿÿåø/88À@@ÿ€€€þ_`` €€€ü?ÿÿåø/00À@@ÿÿÿÿÀÿÿÿ?  €€€ü???ÿÿÿÿÿÿãøâàÀ@@ÿÿÿÿ€ÿÿÿÿÿÿÿ?þ?þ €€€ü?ø?ü?ÿÿÿÿÿÿãøãøáðÀÀ€@ÿÿÿÿÿÿÿÿ?ÿ?ÿ €€€üø?ü?ÿÿÿÿ#øãðáøÀ€À@ÿÿÿüŸüÿüà ÿ?ÿ €€üü@?€€€øøÀÀÿÿÿ€üüüÿÿ@ÿ?€€€üü@ü?€€€øøø?? ÀÀÀÁ>ûϾsè¾sï>ï¾øÀøøø? @?€€€ü@üü?€€€øøø?? ÀÀÀß tЊ"""(ˆ"( ¢¨Àüøü`_?€€€@ü@ø@ü?€øðø0?/@À€Àß pŠ">#Ȉ"(¾Ï¢¨ü``@?ÿÿ@@@ü?c°oðlpÿðø00 @@Àß `Š"("(ˆ"(‚ "¨Àÿÿx`x`@à?ÿÿ@@@ü?ÿð ø00 @@À>ú"&sïˆsè¾ ¾¨Àÿÿÿÿÿÿÿÿøøà_ø?ÿÿÿÿÿÿÿÿüüøü?ÿàÿàÿàÿðøø ðø??/ÀÀ€Àÿÿÿÿÿÿÿÿø_üüø?ÿÿÿÿÿÿÿÿüüøü?ÿàÿàÿàÿð øøðø/??ÀÀ€Àÿÿÿÿÿÿÿÿ_ÿýþ?ÿÿÿÿÿÿÿÿøüüü?ÿðÿðÿàÿð ðøøø/??€ÀÀÀ_ÿÿÿÿúÿýú?þþþÿÿø?ø?ø?üÿðÿðÿððððø???€€€À|çÑ÷ß}÷Þ|ÿÿÿÿ?ÿ?þ? ÿÿÿÿÿÿ€üü?ü?ÿðÿð ø ø øÀÀÀ@AQTPDD@`ÿþ €€€€ü?ü?€€€ ø ø@ÀÀ@Aõ_WÞ|G‘|ÿÿ? ÿ?€ø?ø?ü?€€€ððø€€ÀADTPPDÿÿ?€ ?€€€øü??ü?€€€ðøø€À@À}DT_LGÑ|ÿûüÀ ÿ?¿?€€€ü?ü?ü?€€€øøøÀÀÀüüüü€ € ÿ?€ü?ÌÌÿ ðÿÿââãøÀßßÿÿ  ÿ?€ü?ÿÿãÿÿÐÿÐÿß?þ?þÿþ|çßxÑ}ÿÿÿÿÿÿÿÿÿ ÿ þÿ?€???ü?ÿÿÿÿÿÿÿÿââàãÿÿßÿþ@EQDQAÿÿÿÿÿÿÿÿý?þ?þü?€€€€ü?ü?ü?ü?ÿÿÿÿÿÿÿÿãÿãÿãÿãÿÿßÿßÿßÿßÿþÿþÿþÿþ|EQDÑ}ðÿÿÿÿÿÿÿÿýþ?þ?ü€€€€ü?ü?ü?ü?ÿÿÿÿÿÿÿÿãÿãÿãÿãÿÿßÿßÿßÿßÿþÿþÿþÿþEQDÿÿÿÿ¿ÿÿüø?ø?ø€€€€üüüü?ÿÿÿÿÿãÿÿßÿßÿßÿßÿþÿþÿþÿþ|å_Dß}``@?ÿà?€??ü?ÿÿÿÿÿÿààãÿÿßÿþÿÿÿÀÀ??À?€€€üüü?ǃǟœÿÿàÃÿ#ÿÃÿÿßÿßÿßÿþÿþÿþ}÷ÑT_}÷ÞAQTPDDQM÷ßWÞ|DQETPDDQ}Äô_DGÑçÀEòU÷ž>è¼yÏ€‰ >ûï"ûçˆE@EUQ"(¢€ˆ‰@"Š(¢€‚"ÈE@}UQ>È¢˜‰€>ú(¢€‚"¨DE@EUQ"(¢ˆˆ‰@ ¢(¢€‚"˜<å@EóÕ}÷ß"ï¾ùÏ€ù ›ï¾ø‡ˆ}ç€}÷‘÷Ñ}÷À@@E@UQAO@}÷À ÷ß}@Uô_y÷ÀP@AQE@UDA@@P@yñ ÷ßEÀUDñ}7ÀP@AAO@} ÷ß@@   bT*BdSÜS½QÎRîVìWéWÌW«6½¬D3ªªªªª«ª«ªªªªª«ª«ª«ªªª«ª«ª«ªªª«ªªªªª«ª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ª«ª¨ª¨ª¨ª¨ÿÿÿÿÿÿÿÀÀÀÀÿÿÿÿðÿÿ ÿÿÿÿÿÀÀÀÀ€€€ÿþÿþÿþ€€øÿÿÿÿÿÿ    ÿÿÿÿÿÿÿàààà€€ÿÿ €ÿÿÿþÀþÀðððÿþÿþÿþÀÀ 0xx„!ÿÿÿÿÿÿppp8 88 ÿÿÿÿÿÿÿðððð¿ý¿ýÿÿ €ÿÿÿþþøøøÿþÿþàà€  €}¾|>ÿÿÿÿÿÿø0øø|0|| ÿÿÿÿÿÿÿð ððð¿ý¿ý€ÿÿ €ÿÿÿÿþþü??ü?üÿþÿþððÀ ` ÐÀ}¾~~ƒÁððððødüü~˜þþ OŸ3p?ð?ðÿÿŸ'fÙßßÏÿ¿ÿÿð ððð° ° ÿÿ €ÿÿÿÿþþþþþÿþÿþøøÀ ` ÐÀ}¾~~ƒÁðÈøø?L OŸ3p?ð?ðÿÿŸ'æÙÿßÿßÏÿ°ÀðÀðÀàààà·í·íÿÿð €ÿÿÿxþþþþÿþÿþü??ü@0ð À@|>þƒÁððððàðð€&?€?€OŸ3h?è?èÿÿ   Ÿ'æÙÿßÿßÏÿ°0ð0ð0ÀÀÀÀ·í·íÿÿ ÿÿÿÿÿøÀÿÿÀÿÿÿÿÿÿÿþÿþÿþþþ@ 0ðÀ@<~~‚Aÿþÿþÿþ0880@ppOŸ3d?ä?äÿÿŸ'fÙßßÏÿ°ðð ¿ý¿ýÿÿøþþøøøÿþÿþÿþàà ``>|>|Àÿþÿþÿþ   OŸ3b?â?âÿÿ"""Ÿ'fÙßßÏÿ°ðð €€ÿÿþÀþÀðððÿþÿþÀÀ   P88bFÿþÿþÿþOŸ3b?â?âÿÿ"""Ÿ'fÙßßÏÿ°ðð ÿÿÿÿ€ÿÿÀÀÀÀ€€€ €€ 0<<ÿþÿþÿþOŸ3b?â?âÿÿ"""Ÿ'fÙßßÏÿ°ðð|OŸ3b?â?âÿÿ"""Ÿ'æÙÿßÿßÏÿ°ðð|OŸ3a?á?áÿÿbbbŸ'fÙßßÏÿ°ðð|OŸ3a?á?áÿÿB B B Ÿ'fÙßßÏÿ°ðð|OŸ3a?á?áÿÿB B B Ÿ'fÙßßÏÿ° ð ð |OŸ3a?á?áÿÿB@B@B@Ÿ'fÙßßÏÿ°ð𪪪ªª«ª«ªªªªª«ª«ªªªªª«ª«ªªªªª«ª«ª«ªªª«ª«ª«ª«ª«ªªª«ª«ª«ªªª«ªªª«ª«ª«ªªª«ª«8OŸ3`?à?àÿÿ‚@‚@‚@Ÿ'fÙßßÏÿ°0ð0ð0ÿþÿþÿþ ÿþÿþÿþÿ~~?ø?ø?øHOŸ3`?à?àÿÿ‚€‚€‚€Ÿ'fÙßßÏÿ°ÀðÀðÀ ÿüÿüÿü þþþƒ>>A‚üüü8OŸ3`?à?àÿÿ‚€‚€‚€Ÿ'fÙßßÏÿ¿ÿÿÿøÿøÿø ?þ?þ?þ?‡!„ÿþÿþÿþ8ÿÿÿÿÿÿÿÀÀÀÀÿðÿðÿðÿðþþþþˆÿþÿþÿþ8ÿÿÿÿÿÿÿàäààÿàÿàÿàÿàþþþþŸ ÿþÿþÿþ8ÿÿÿÿÿÿÿððððÿÀÿÀÿÀÿÀþþþþ¿ ÿþÿþÿþ8OŸ3?ÿ?ÿÿü€€€ùÿ6þþÿÿÿðÿðÿððôððÿ€ÿ€ÿ€ þþþÿ??Àÿþÿþÿþ8OŸ3`?à?àÿü@@@ùü6þþùÿ6þþððððÿÿÿ þþþÿÿÿþÿþÿþ8OŸ3`?à?àÿü   ùü6þþùÿ6þþàäààþþþ þþþÿþÿþÿþÿþÿþ8OŸ3`?à?àÿüùü6þþùÿ6þþÀÀÀÀüüüü~~~~ÿÀüüÀÿþÿþÿþ8OŸ3`?à?àÿü   ùü6þþùÿ6þþøøøø>>>>ýàø@ø@ ÿþÿþÿþ8OŸ3`?à?àÿü   ùü6þþùÿ6þþ ððððùðð`ð` ÿþÿþÿþ8OŸ3`?à?àÿüùü6þþùÿ6þþààà ñøàpàpˆüüü8OŸ3`?à?àÿü   ùü6þþùÿ6þþ ÀÀÀ áüÀxÀx!„?ø?ø?ø8OŸ3`?à?àÿü@#@#@#ùü6þþùÿ6þþ€€€ Áþ€|€|A‚ 8OŸ3?ÿ?ÿÿü€#€#€#ùü6þþùÿ6þþ)€ÿ€€€ 8OŸ3`?à?àÿü # # #ùü6þþùÿ6þþ#8OŸ3`?à?àÿüCCCùü6þþùÿ6þþ(8OŸ3`?à?àÿüƒƒƒùü6þþùÿ6þþªªª®ª«ª«ªªªªª«ª«ªªªªª«ª«ªªªªª«ª«ª«ªªª«ª«ª«ª«ª«ªªŸÿŸþŸÿŸÿª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ª«ª«ªªª«ª«(OŸ3`?à?àÿüÿÿÿùü6þþùÿ6þþ €€€ ÿ€ÿ€€ À àà8OŸ3`?à?àÿüƒƒƒùü6þþùÿ6þþÀÀÀ ÿ€ÿ€€ À àà8OŸ3`?à?àÿüùü6þþùÿ6þþ ààà ÿ€ÿ€€ À àà8OŸ3`?à?àÿü   ùü6þþùÿ6þþÀÀÀððððÿ€ÿ€€ À àà8OŸ3`?à?àÿü   ùü6þþùÿ6þþàààøøøø>>>>ÿ€ÿ€€ À ààÿÿÿÿÿÿ0OŸ3`?à?àÿüùü6þþùÿ6þþð„ððüüüü~~~~ÿ€ÿ€€ À ààÿÿÿÿÿÿ0OŸ3`?à?àÿü$$$ùü6þþùÿ6þþðÀððþþþ þþþÿÿðÿÿð€ À ààÿÿÿÿÿÿÿÿ0OŸ3?ÿ?ÿÿüÄÄÄùü6þþùÿ6þþðÄððÿÿÿ þþþÿÿðÿÿð€ À ààÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿà€ààÿ€ÿ€ÿ€ þþþÿÿðÿÿð€ À ààÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÀ„ÀÀÿÀÿÀÿÀÿÀþþþþÿ€ÿ€€€€ À ààÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿàÿàÿàÿàþþþþÿ€ÿ€€ À àà[ÿðÿðÿðÿðþþþþÿ€ÿ€€ À ààdÿøÿøÿø ?þ?þ?þÿ€ÿ€€ À àà[ÿüÿüÿü þþþÿ€ÿ€€ À ààdÿþÿþÿþ ÿþÿþÿþÿ€ÿ€À àà[ ªªªªªªªªªªªªªªªª|5N~<î~ 5N~<î~AFþ`ªªª®ª«ª«ªªªªª«ª«ªªªªª«ª«ªªªªª«ª«ª«ªªª«ª«ª«ª«ª«ªª¿ÿ¿ÿ¿ÿ¿ÿÿÿÿþÿÿÿÿª«ªªª«ª«ª«ª«ª«ª«øøøø7Ö|ÿþÿþÿþ ÿþÿþÿþÿþÿþ€ FÖ` ÿþÿþÿþ ÿþÿþÿþÿþÿþ€   (<Ö~ÿþÿþÿþ ÿþÿþÿþÿþÿþ€ (<Æ~ÀÄÀÀÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ€ :ààààÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ€ :ðôððÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ€ :ððððÿþÿþÿþ ÿþÿþÿþÿþÿþ€ :ðôððÿþÿþÿþ ÿþÿþÿþÿþÿþ€iààààÿþÿþÿþ ÿþÿþÿþÿþÿþ€iÀÄÀÀÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ€€€sÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ€lÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþ€uÿþÿþÿþ ÿþÿþÿþ€€€€€lÿþÿþÿþ ÿþÿþÿþ€€€€€uÿþÿþÿþ ÿþÿþÿþÿþÿþÿþÿþ?ÿ?ÿ?ÿ?ÿÿÿÿÿÿÿÿÿý ý ý ý ÿÿÿÿÿüÿüÿüÿüK|||!xxxx|ü<üü|þ>þþ|þ>þþ|þ>þþ|ü<üü|xxx||||||||||||||||||||||||Jª«ª«ª«ªª€€€€€€€€  ª«ª«ª«ªªª«ª«ª«ªªª¨ª¨ª¨ª¨|N?üø?ü?ü?üøøþþüüþþüüøø€€ÿ€ÿ€€€ÿÿÀÀ,üøþþþøøþþþþþþþþüüÿÀÿÀÿÀÿÀÿÀÿÀÿ€ÿ€ÿÀÿÀ,þøþþþøøþþþ~þþ|>|>x|x|ÿàÿàÿàÿàóÀóÀÿÀÿÀÿÀÿÀ,x~?øþþþøø€€||üüü|>|>|>x|x|x|áàáàààóÀóÀÀÀàà+x~x~øøþþüüøø€€||øøø|>|>|>x|x|x|áàáàààóÀóÀÀÀàà+x~x~øøüüðð=ø=øøø||ððð|>|>|>x|x|x|áàáàÿÀÿÀððñÀñÀÿÀÿÀ*x~x~øøøøÀÀyøyøüüüüàààþþþüüüáàáàÿ€ÿ€ððñÀñÀÿÀÿÀ*x~x~øøððððqþqþ||þþÀÀÀþþþ?ü?ü?üáàáàðÀðÀððñÀñÀàà+x~x~øøààüüþþ||~~ÀÀÀ|>|>|>|||ÿàÿàðàðàóÀóÀñÀñÀàà+x~x~øø?à?à||þþ||~~ÀÀÀ|>|>|>|||áàáàðàðàóÀóÀñÀñÀàà+x~øþ <|øx|~ÀÀ|>|>||áàáàÿàÿàóÀóÀñÀñÀÿÀÿÀ*þøþ ?üøü~ÀÀ|>|>üüáàáàÿÀÿÀÿÀÿÀÿ€ÿ€ÿÀÿÀ*þ?þþ ?üøø?þÀÀþþüüáàáàÿ€ÿ€€€ÿÿÀÀ*üþþ üø?ðüÀÀ?ü?üøø||||||||||||||||||||||||||||||||||||||||||||||||||||||xx||üüüüü|üüüüü|øüüüü|àÀÌÌÀ|pÀÌüøÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿü8ÀÌøøÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿüÀÌøÀÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿü üÌÜüÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿüüüüÜüÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿüüüüÎüÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿüø|xÎ|ÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿü*ÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿü*ÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿü*ÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿü*ÿÿÿÿÿÿÿÿ€?ÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿÿÿÿü||||||||||||||||îîîîîîîîîîîîîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿüîîîîîîîîîîîîîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿüþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿüþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿüþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿü|||||||||||||||ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿü*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿü*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿü*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿü*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿü*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿ?ÿ¿ÿÿÿÿÿÿüÿü|Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿü(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüàg˜ x߇€þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüç'Ø'7ØÈñŸ`ÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüà'Ø'&ØÙî~ÿÿÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüà'Ø''ØØ1Î~ÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüç'Ø''ØØ1ŸÎ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüà ß `ߟ1€Îÿÿˆˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüà ß ðß1€Îÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€?ÿ¿ÿ¿ÿÿÿÿÿÿÿÿüÿüÿüÿÿÿÿÿÿÿÿ#200*160,d0 ; we need another screen to display messages and other things ; let's subtract 32000 bytes from physbase ; that should be a safe place ; addresses are usually long words, hence the sub.l ; notice the hash (#) move.l d0,utility_screen ; now we put d0 in another variable as we will no doubt need it later on. ; the l after move is indispensable ; remember: addresses are always LONG. That's the safe way. dc.w $a000 ; special instruction: will cause an exception (software interrupt) ; program will be interrupted, execution will pass to a special vector ; where an operating system routine will be executed ; in this case: initialize A-line. Then, program resumes normally. move.l a0,a_line_start and find where fonts are kept move.l (a1)+,d0 6*6 font move.l (a1)+,fontaddress_8 8*8 move.l (a1),fontaddress_16 8*16 ; the above four lines are required by the font subroutine ; which is situated in include4.s We'll take them for granted. hide_mouse ; the above line is another 'macro' btst #7,$fffa01 ; above instruction means test bit 7 of register $fffa01 ; $fffa01 belongs to the mfp chip ; bit seven tells us whether monochrome is on ; bit 0 checks the centronics port, bit 4 k/board interrupts, etc.. beq hide if on, skip low res ; if bit seven is clear (0), we skip the low res instruction ; beq means branch if equal (to zero) mode 0 macro: low res ; if there is no monochrome, we come here and instruct the ; system to go low res. We use the 'mode' macro ; where 0 is low res and 1 is medium res hide cursor 0 ; another macro, this time to turn cursor off ; it is indispensable that all 75 macros currently in the library ; should be learned and understood bclr #0,$484 no keyclick bclr #1,$484 no repeat key ; the above two are bit instructions: a bit can be tested (btst), ; cleared (bclr) or set (bset) ; the above were cleared. $484 is a system variable. load a1_font,a1_ptr macro: font 16 pixels load a2_font,a2_ptr macro: font 8 pixels ; two more macros, meaning "load the font described in a1_font... ; ...and put its load address in a variable called a1_ptr" ; the load macro takes care of reserving the necessary memory ; required, so that there is no danger of that space being ; overwritten by something else reserve 512 ; anorther macro. We thought we would reserve 512 bytes ; as a safety buffer. Just a precaution. reserve 256*128 (32768 bytes) ; we will be needing yet another screen, this time to load ; a title page. We could have chosen 32000 bytes BEFORE ; the utility screen we defined earlier. ; Instead, rather than TELLING gem where to put our picture, ; we will do the proper thing and ASK. ; Gem will return the start address in do.l as usual. clr.b d0 ; As all screens should start on a 256 boundary, we make the start address ; divisible by 256, by clearing the last byte. (notice the b) move.l d0,penny_ptr ; we can now store that address (long word), in our pointer open penny ; another macro. 'penny' is a string variable defined at the end ; of this text. It actually says 'a:\common\penny1.pi1' ; try changing it with your own pi1 ; the file should now be duly opened. If it wasn't found, gem ; would report an error, and our routine (ie our macro) would ; automatically abort the load, and carry on. read #palet,2 ; another macro: we read 2 bytes at an address called palet ; if you check the end of prog, you will see that space has been ; reserved for the palet (16 words) ; the two bytes we have just read were the res, and will be ignored read #palet,32 ; so now we actually read the palette (32 bytes) ; the two bytes read earlier are overwritten read penny_ptr,32000 ; we go on on reading, this time 32000 bytes (or whatever) ; these 32000 will be loaded where 'penny_ptr' POINTS to. ; notice the absence of hash. penny_ptr is NOT an actual area, ; it merely is a POINTER to an area. ; the rule is: actual address:hash, pointer:no hash ; try replacing 32000 with 16000 and see what happens close ; the final macro is this series palette palet ; the above macro is very useful. It displays the palette ; referred to in the argument. ; try palette palet+2, or palette $78000, or palette $466 (the vb clock) show penny_ptr ; yet another macro. We now ask gemdos to display the picture we have ; just loaded. Gem will do it, in a fraction of a second, during ; the NEXT vertical blank interrupt ; All this macro does is: move.l penny_ptr,$45e ; $45e being the target screen NEXT vb ; while $44e is the CURRENT screen address ; If you want to know what screen you're looking at, just peek $44e ; if you want to look at another screen, just poke $45e ; (or use 'show' macro...) font 16 ; the above macro switches on the large font we had loaded earlier on home ; this macro is actually needed to activate it ; the cursor is placed at 'home position' 0,0 ink 7 ; the 'ink' macro chooses the ink. In this case, the eighth color (0-15) string < HIT SPACE> ; another handy macro. Prints to screen, at current cursor position, ; whatever string is enclosed in the brackets getkey ; macro: wait for key to be hit (answer returned in d0) lea vb_routine,a5 bsr enable_vbi ; load effective address of a routine called 'vb_routine' inside a5 ; then branch to another subroutine called 'enable_vbi' ; the 'enable_vbi' routine obviously expected an address in a5. ; this is a very simple vertical blank routine. It merely ; increments a counter 50 times a second show physbase ; we were showing penny. now we're back to physbase (still blank probably) home ink 3 string string font 8 ; enough large characters. Now we're back to smaller ones pen $700 ; pen is different from ink: it actually changes the palette color 15 ; now we're about to write in red. See macros for full details printat 15,5,0,#message ; a common macro: print in ink color 15, at location 5,0 ; a string found under 'message' ; notice the hash (essential). Make sure the message ends with a 0 ; forgetting the hash will probably bomb... wait 5 ; macro: wait 5 vertical blanks, ie 1/10th sec jsr initjoy initialize joystick ; jump to subroutine... font 16 *----------------------- main -------------------------------- * this is the actual application: ie the thing you want to do. * More often than not, all a program does is read the keyboard * or the joystick, and if either has been touched, go somewhere * to a sub-routine or a sub-program, and then come back right here * and wait, and wait... * In our case, keyboard is scanned for f1-f10-h-esc * then joystick is read for fire button only * then the border value is continuously displayed * on screen in hex (why not?) * and then, we start again... main clr.l d0 clr.l d7 ; d0 and d7 are used by the k/board and joystick routines ; it's a good idea to clean them up ; clr.l d0 means clear d0 (put a long word 0 in d0) ; same as move.l #0,d0 same as moveq.l #0,d0 inkey ; the above macro tests if keyboard has been hit ; if hit, answer is found in d0, with ascii value in lower word ; and scan value in upper word. ; if no key was hit, d0 contains $0 and we just carry on with the program swap d0 ; we're interested in the scan value, so we 'swap' low and high words cmp.b #1,d0 ; was the answer 1? If so escape must have been hit ; notice the synthax: compare with 1, register d0 ; the reference figure comes first, THEN the register being investigated beq kwit ; branch if equal (to one) to kwit cmp.b #$23,d0 ; compare with 'H' beq k_h cmp.b #$3b,d0 ; compare with 'F1' beq k_f1 cmp.b #$44,d0 ; compare with 'F10' beq k_f10 ; if we ever come here, it means none of the above keys were hit joystick ; macro: read joystick and move on (answer is returned in d7) btst #7,d7 ; test bit 7. If set (ie 1), fire was pressed ; bit 0 is for up, 1 for down, and so on... ; try replacing #7 with #0 bne flash_it ; branch if not equal (to 0) ie if fire was pressed move.l $466,d0 ; we need a fairly random number, which will also be ever-changing ; the v/b counter at $466 meets that requirement ; we move (ie copy) the CONTENTS of $466 into d0 ; whatever was in d0 is now overwritten bindec d0,16 ; macro: convert d0 register from binary to hex ascii ; so that we may be able to read it on the screen ; try bindec d0,10 or bindec d0,2 (decimal and binary ascii respectively) ; the ascii representation of the above number (in d0) will be stored ; in a workspace whose address is returned in a0 printat 15,9,2,a0 ; macro: let's see it. Having converted d0 into ascii, we now want to ; display it on screen. The above macro will display on current screen, ; in color 15, at location 9,2, a string pointed to by a0 ; try printat 3,2,2,a0 and see color and position change ; try printat 15,9,2,a1 and see what happens ; try printat 15,9,2,$466 and watch totally random strings ; being printed on screen vsync ; another macro: it waits for the video vertical blank ; its effect is to slow down the program to 50 frames a second ; not too important in this program, but essential in programs ; where sprites are drawn to screen bra main ; that's it: all done *-------------- subroutines/ subprograms ---------------- * any routine that ends with 'rts' is a straight sub-routine * anything that ends will 'bra main' is a mere diversion from main * we come here if f1 has been hit k_f1 move.w color,$ff8240 ; $ff8240 is the first palette register (ie border) ; color is a variable (w), being incremented 50 times a second ; by our vertical blank routine ; we move the CONTENTS of color inside $ff8240 move.l $44e,save_screen ; we're about to display another screen, so first we save the ; current screen. $44e contains its adddress (L) show utility_screen ; the above macro display any screen you like, in this case ; utility_screen, whose start address had previously been stored font 8 cls ; macro: clear current screen (ie fill it with 32000 noughts) ; clear $44e would have done the same job printat 7,0,0,#games ink 7 row 0 pos 0 getkey ; macro: unlike 'inkey', 'getkey' actually WAITS for a key to be hit cls printat 6,0,0,#games1 ; now print text starting at games1 ; in ink 6 location 0,0 blank $44e,1,(116*160)+88,41,144 ; above macro draws a rectangle, in color 1, position 116 y 88 x ; 41 pixels high, 144 pixels wide onto current screen take $44e,$44e,(0*160)+48,(120*160)+96,33,56 ; now grab a piece of screen from pos 0 y 48 x ; and duplicate it on same screen, pos 120 y 96 x ; size 33 pixels high, 112 pixels wide getkey show save_screen ; retrieve previous screen border $777 ; another macro: turn border white again font 16 bra main ; back to main loop *--------------------------------------------------- * we come here if f10 has been hit k_f10 font 16 move.l $44e,save_screen remember screen we're on show utility_screen cls home print games print message to it getkey bsr disap ; branch sub routine (venetian blind effect) show save_screen border $777 bra main back to main loop *----------------------------------------------- * we come here if 'h' has been hit * this is how to print 'HELLO' ..... (big deal!) k_h string getkey not $ff8240 ; not is an interesting instruction: all 0 bits become 1 ; and all 1's become 0's In this case, we reverse the color in $ff8240 wait 5 ; macro wait 5 vertical blanks (otherwise flash will be TOO quick) not $ff8240 ; reverse it again (flash) clear $44e ; macro: same as cls bra main *---------------------------------------------------- * this routine is slotted in the v/b queue * and will be executed 50 times a second in 50 hz vb_routine sub.w #1,color ; subtract 1 from the CONTENTS of color tst.w color ; test if zero ; cmp.w #0,color would have been the same, but slower bmi .v ; branch if minus ; once below zero, we've gone too far. Time to adjust it again! rts ; return from subroutine (same as 'return' in basic) .v move.w #$777,color ; put the number $777 inside color. Notice the hash (immediate value) rts ; labels such as '.v' have a dot in front of them. ; they are known as local labels *-------------------------------------------------- flash_it show penny_ptr not $ff8240 reverse border wait 7 not $ff8240 and again show physbase bra main *-------------------------------------------------- kwit move.l #vb_routine,a5 ; put the ADDRESS of vb_routine inside a5 (LONG word for addresses) ; (same as: lea vb_routine,a5) bsr disable_vbi ; disable the above v/blk routine bra quit ; restore palette and official quit *~~~~~~~~~~~~~~~~~~~~~~~INCLUDES~~~~~~~~~~~~~~~~~~~~~~~~~~~* * now we will include our libraries of routines, representing * thousands of hours from many dedicated contributors! EVEN INCLUDE "a:\includes\include1.s" EVEN INCLUDE "a:\includes\include2.s" EVEN INCLUDE "a:\includes\include3.s" EVEN INCLUDE "a:\includes\include4.s" EVEN *~~~~~~~~~~~~~~~~~VARIABLES AND CONSTANTS~~~~~~~~~~~~~~~~~* * there now follows a section with variables. * the things to remember are: * dc.w means DECLARE a word ( or DEFINE CONSTANT) * fred dc.w 3 means fred=3 with 2 bytes allocated to the variable fred * having made fred a word, its maximum value will therefore be 65535 * fred dc.w 3 actually means %00000000 00000011 * so if later you were to (mistakenly) say add.b #1,fred * fred would become %00000001 00000011 * the proper way is : add.w #1,fred * ie %00000000 00000100 * fred dc.l 3 means fred=3 with 4 bytes allocated to the variable fred * if we were to say move.l #3,fred * fred would look like this: %00000000 00000000 00000000 00000011 * as a rule, for numeric data variables, use dc.w * and for addresses (pointers) use dc.l * dc.b 2 means DECLARE a byte as '2' * dc.b 2,3,4,5 means DECLARE a byte as 2, then another as 3, etc.. * dc.b "hello fred",10,13,0 means DECLARE a byte as h, then another as e, * then l,l,o, ,f,r,e,d, than 10 (line feed), then 13 (c/return), then 0 * ds.b 10 means DEFINE SPACE for 10 bytes * it's the same as dc.b 0,0,0,0,0,0,0,0,0,0 * ds.w 5 means DEFINE SPACE for 10 bytes (5 words) * it's the same as dc.b 0,0,0,0,0,0,0,0,0,0 * ds.l 1 means DEFINE SPACE for 4 bytes (1 long word) * it's the same as dc.b 0,0,0,0 hbl_ct dc.w 0 before dc.w 0 position of horiz raster before test, after dc.w 0 and after. color dc.w 0 store dc.w 0 storel dc.l 0 a1_font dc.b "a:\fonts\a1_fat*.fon",0 a2_font dc.b "a:\fonts\a2_squa*.fon",0 even a1_ptr dc.l 1 pointer 16*8 font a2_ptr dc.l 1 pointer 8*8 font screen_0 dc.l 0 pointer screen_1 dc.l 0 more pointers screen_2 dc.l 0 screen_3 dc.l 0 spr_screen dc.l 0 utility_screen dc.l 0 lady_screen dc.l 0 penny dc.b "a:\common\penny.pi1",0 even penny_ptr dc.l 0 pointer prompt dc.b "hello",0 games dc.b "This is utility screen",10,13 dc.b "32000 bytes below physbase",10,10,13 dc.b "Handy for messages.",10,13,0 games1 dc.b "Libraries and macros",10,13 dc.b "are loaded during assembly",10,10,13 dc.b "On the right is an example of",10,13 dc.b "BLANK macro and TAKE macro",10,13,0 message dc.b "Notice the two new fonts now active",10,13 dc.b "They were loaded with LOAD macro",10,13 dc.b "and activated with FONT macro",10,10,13 dc.b "A value in hex is being displayed",10,13 dc.b "using the BINDEC, PRINTAT macros.",10,10,13 dc.b "Press F1 F10 Esc or Fire",10,13,0 even palet ds.w 16 means reserve 16 words (32 bytes) even *~~~~~~~~~~~~~~~~~~~THE STACK~~~~~~~~~~~~~~~~~~~~~~~~~~* ds.l 256 about 64 used on average stack dc.l 0 means declare 1 long word as zero *----------------------------------------------------------* * BUDGIE UK . BUDGIE UK . BUDGIE UK . BUDGIE UK . BUDGIE UK . * 5 MINSTER CLOSE, RAYLEIGH ESSEX SS6 8SF GREAT BRITAIN *----------------------------------------------------------* h, then another as e, * then l,l,o, ,f,r,e,d, than 10 (line feed), then 13 (c/return), then 0 * ds.b 10 means DEFINE SPACE for 10 bytes * it's the same as dc.b 0,0,0,0,0,0,0,0,0,0 * ds.w 5 means DEFINE SPACE for 10 bytes (5 words) * it's the same as dc.b 0,0,0,0,0,0,0,0,0,0 * ds.l 1 means DEFINE SPACE for 4 bytes (1 long word) * it's the same as dc.b 0,0,0,0 hbl_ct dc.w 0 before dc.w 0 position of horiz raster before test, after dc.w 0 and after. color dc.w 0 store dc.w 0 storel dc.l 0 a1_font dc.b "d:\fonts\a1_fat*.fon",0 a2_font dc.b "d:\fonts\a2_squa*.fon",0 even a1_ptr dc.l 1 pointer 16*8 font a2_ptr dc.l 1 pointer 8*8 font screen_0 dc.l 0 pointer screen_1 dc.l 0 more pointers screen_2 dc.l 0 screen_3 dc.l 0 spr_screen dc.l 0 utility_screen dc.l 0 lady_screen dc.l 0 penny dc.b "d:\common\penny.pi1",0 even penny_ptr dc.l 0 pointer prompt dc.b "hello",0 games dc.b "This is utility screen"`J`HbY b*O.|Ð*m - ЭЭ€// Bg#ÀR4?<JNAOï N¹QPN¹Xü#ÀY€üÀü€#ÀËJ#À^€‡#ÀËN yËJÑü}p"$&(*,"F$I&J(K*L,M~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~QÏÿZHàø#ùËJ^N¹P8 < N¹|Ò @"yËJ"< Á³Ènÿú/?<INA\J€k`"Hy¬?< NA\` MFREE ERROR Nq/<%?<HNA\J€fJHyâ?< NA\`error reserve screens Hç<<È*9fº¹fgÿøQÎÿîLß`€üÀü€#ÀË^€‚#ÀË>€‚#ÀËR€‚#ÀËV€‚#ÀË:€‚#ÀËZ #È|² #Ù|¶#Ñ|º   hBP  9ÿúg< <°¼gJ€g`N¹Y`N¹Y0 9f°¹fgÿø?<?<NNX¹„¹„/<ËŒ?<NA\?<ÿÿ?<ÿÿ?<#NN\24àIAÿBÿ3ÁÉÜ3ÂÉÚ |ÊÒ,|Ë.N¹LJ |Êç,|Ë2N¹LJ |A&aW¨ùËxAù)V#È#È #ÈKù7>aV* |“É BfDð |”( BfDâN¹wNAùw‚B€(´°<Sf`– |N¹PÄüAùN¹PÄ |N¹PÄHyô?< NA\` VIRUS..?! Hy?< NA\`Q to Quit R Repair Hç`à?<NAT@ßLß°<gD8°<g8˜HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßa%ÖN¹CÞaN Nqü`ÉÍHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßaUFaNn3üÿ‚@ByËt3ücËv/AùËö"|ÿ‚@<<2ØQÎÿü, 9f°¹fgÿø#ùËJY #ùËNYùËŠ yËJÑü}p"$&(*,"F$I&J(K*L,M~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~QÏÿZHàø yËNÑü}p"$&(*,"F$I&J(K*L,M~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~QÏÿZHàø#ùË>~3üÈ~3ü~3ü~ yËR"yËJ <Ï"Ø"Ø"Ø"ØQÈÿö yËR"yËN <Ï"Ø"Ø"Ø"ØQÈÿö 9f°¹fgÿøB€9ÉÍg4Hç<<È*9fº¹fgÿøQÎÿîLß`B€¹ÉÍ3üÿ‚@MùFJ.gB9ÉÍ:L%Jga+vaK„#ÀÉÀ#ÀÉÄB€aI–H@°<g@Ü°<;gÀ°<g X°<?g&°<@gd°<Agæ°<Bg°<CBudgie UK Licenceware PRODUCTIVITY range. Double-sided disk. Price 4.95 Budgie SHELL_38.S Sept 23, 1989 (c) September 1989 Budgie UK The SHELL needs DEVPAC2 in the root directory and preferably 1 meg memory Always double-click on shell_38.s The Budgie SHELL (with libraries) is updated several times a year. For update, write to Budgie UK, enclosing 2 pounds to cover blank disk, postage and copying charge. ------------------------------- t screen M a selection of sounds C single step V vertical scroll P Pause L Load a file (ex. spr*.pi1) D Dump current screen to disk 1-2-3-4-5-6 display these screens (first press P) UP/DOWN scroll through ram keypad 0-5 sprites on/off FIRE reveal horizontal raster (only if joysprite 0 is on) etc... (a1)+,d0 6*6 font move.l (a1)+,fontaddress_8 move.l (a1),fontaddress_16 hide_mouse btst #7,$fffa01 mfp monochrome detect beq hide mode 0 hide cursor 0 bclr #0,$484 no keyclick bclr #1,$484 no repeat key move.l #dtaddress,-(sp) address of 44-byte DTA buffer move.w #$1a,-(sp) set DTA address trap #1 addq.l #6,sp load a1_font,a1_ptr font 16 pixels load a2_font,a2_ptr font 8 pixels cls font 16 ink 15 move.w #$070,$ff825c move.w #$070,$ff825e printat 15,0,0,#mess1 getkey cls font 8 move.w #$070,$ff825c move.w #$007,$ff825e ink 15 printat 15,0,0,#mess2 jsr read_sector read boot sector ; lea new_buffer,a1 bsr copyg °<DgX°<#gr°<,g:°<-gf°<.g‚°</g„°<RgØ°<pgÔ°<mgÜ°<ngê°<ogø°<jg°<kg°<lg¤°<rg|°<2g^°< gh°<g(°<!g¶°<"g°<$gž°<&g°<bgH°<9g–°<g°°<Hgš°<Pg6°<gþ°<g °<g°<g"°<g.°<g:°<fgº°<Kgª°<Mg¦9ÉÒfþ N¹A®#ùY ËF#ùYËb#ùYNyËŠ0<ãHAùÊÐÀ0¹Éð 9f°¹fgÿøByÉð0<ãHAùÉòÐÀ0¹ÉðByË€yËta+Da+Ša+ÐN¹<˜a8:JyËvk=˜9ÉØf>,9ˆfz < |ÐN¹6à < yËR"yY N¹5° < yËR"yY N¹5° < yËR"yY N¹5° < yËR"yY N¹5°N¹49Éîg6MùF:. <.EF4< yY 024N¹vä¹Éî < yË>"yY N¹6 < yË>"yY N¹6 < yË>"yY N¹6 < yË>"yY N¹6 < yY "|ÐN¹6n < yË>"yY N¹69œg"¹œN¹QH@°<.f ùœ`û乜yÿ‚@B‡B†B… | Â>"|‰„ÒÇ<¼|bgB |‰ÀÐÆ/aMÔ _(Hç`à?<NAT@ßLßH@°<9gÿžy Â`ût3ü Â3ü À`û`y<’H瀀Aùÿˆ<€|ÿ°<kÿîLß`û*`û&MùFn`ûMùFÝü n`ûMùFÝü@n`úêMùFÝü`n`úÔMùFÝü€n`ú¾MùFÝü n`ú¨MùFÝüÀn`ú’ü<’ |A&aN‚¹Ëx#ùNY yËZ‘ü#È^ 9f°¹fgÿøHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß"yN <2<4<6<@N¹WŠ"yN <2<€4<6<@N¹WŠ/<ò/<ò/9 ?<?<KNAßü#ùY^N¹P8 |A&aMùËx <°¼gJ€g`N¹Y`N¹Y0 9f°¹fgÿø |ËöaGvùNæ |Ê­&yË^×üÿÿÿÞN¹LJ¹Næ <? yË^"yËJ$yËN"Ð$ØQÈÿú<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nqü<’H瀀Aùÿˆ<€|ÿ°<kÿîLß`ø®a:\common\writer.uka:\common\high.scoa8¼`õP9Ëxg |A&N¹[ ¹Ëx`÷Ð |A&N¹ZúùËx`÷¸a@Îy˜9˜füþÿ‚ `÷”üüÿ‚ `÷ˆyˆ9ˆgh |A&aKj¹Ëx <ëˆMùFÝÀB. <ëˆMùFÝÀB. <ëˆMùFÝÀB. <ëˆMùFÝÀB.`÷ |A&aJÞùËx yËR"yY <Ï"Ø"Ø"Ø"ØQÈÿö yËR"yY <Ï"Ø"Ø"Ø"ØQÈÿö`öºByËt3ücËv3üË‚3üËrH瀀Aùÿˆ<€|ÿ°<kÿîLß yË^Ñü}p"$&(*,"F$I&J(K*L,M~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~QÏÿZHàø#ùË^^N¹P8 |N¹PÄü AùN¹PÄ |N¹PÄHyÊ?< NA\`the heroes so far a+NHç`à?<NAT@ßLß`òŒ#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß |’ßN¹PÄHç`à?<NAT@ßLß#ùY^N¹P8`ô¸#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq |”@N¹PÄHç`à?<NAT@ßLß#ùY^N¹P8`ô #ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßü < Á <  |Ú/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLßHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßü < Á < Â#a000000 #b000000 #c7770007000600070055200505552220770557075055507703112501 #d #E 9B 02 #W 00 00 08 02 1E 16 08 A:\*.*@ #W 00 00 02 06 1E 12 00 @ #W 00 00 30 04 15 0C 00 @ #W 00 00 0F 0A 2A 0B 00 @ #M 00 00 00 FF A SHELL@ @ #M 01 03 00 FF B @ @ #T 07 03 02 FF BUGS@ @ #F FF 04 @ *.*@ #D FF 01 @ *.*@ #G 03 FF *.APP@ @ #G 03 FF *.PRG@ @ #F 03 04 *.TOS@ @ #P 03 04 *.TTP@ @ #G 03 04 GENST2.PRG@ *.S@ "#34DEUVWfgw . €ð:‹ÿþà1Ÿ€ÿ„þÿÿÿÿõ†õ† yÿÿÛß ÿÿÿÆ€€ùÿÿÿ ÿ‰vÿÿq—q—Žhÿÿ¸Gûÿÿ½½rBÿÿ?ô?ôÀ ÿÿ_ý_ý ÿÿÕÿ€ÿÿÊÿÿÿÿOÿðÿÿ~€€ÿÿ5¿5¿5¿Ê@“ýlÿÿ–Ûi$ÿÿHÿäkÙ€ÿÿ'Ög@ÿ¿æ¿€ÿÿöö ýÿÿø`ø`Ÿÿÿâ\\ý£ÿÿeÃeÚ<ÿÿa-a-žÒÿÿDÉÀ?ÿÿÿïÿÿÿ ##ûÜÿÿçûÿÿÉÉ6ÿÿÿÿøÿÿÿÿ¢ÿþÿÿêÿÿi999ÿÆú‘ûÿûÿ!=þÂÿÿpð€ÿÿå^@@ÿ¿t ÷ÿÿ{¾ÿÿÿþ÷þ÷ÿÿ7¬3 È_ÿÿÀØØÿ'ÿÿKWKW´¨ÿÿ~~æÿÿÛþÀ?ÿÿÿÿÿÿÿ''oØÿÿ' ßÿÿÿoobÿÿͺßÿ ÿÿ&&ÿùÿÿ´ÿÿ]ÿüï€ÿÿÿÿ‰S÷¬ÿÿîÀÿÿ’ï p`ÿŸiD·ÿÿñ÷¾÷ÿÿ°°bOÿÿ\íX`§Ÿÿÿ€XXÿ§ÿÿÃÃ<ãÿÿeÛeÛš$ÿÿgRÿÿÿÿÄ@ÿÿÿÿ€ €€ÿÿ!ÿþÿÿ  ßþÿÿ*™?ÿÀÿÿ.‹ÿôÿÿlÿýàˆˆˆÿwþÿÿÿÿÿ€Xÿ§ÿÿ½ìBÿÿÞ^!ÿÿâÞ'ÿÿ3~þ~ÿÿìÿÿÿtt‹ÿÿÿääéÿÿXXÿ§ÿÿKHKH´·ÿÿïÔ€ÿÿÿ@€@¿ÿÿÿ ßÿÿÿ€íÿÿÿ ­¥ÿZÿÿ÷¿ÿÿÿÿ&Oÿðÿÿû ÿÿøÇÇÇÿ8ÿàÿÿÿÿ ÿïÿÿòþÿÿŽ ÿÿéÎ7ÿÿøL¿L³ÿÿKŒKŒ´sÿÿº*¼ Cßÿÿ& ù÷ÿÿ˜˜ÿgÿÿÃÃ<íÿÿ_ôÀ?ÿÿÿ€Bÿÿÿÿ( ßÿÿÿ0 ïÿÿÿttû‹ÿÿþáÿáÿÿÇÿøÿÿ¿î@ÿÿx ÿöߪßÿßÿ @ ÿßÿÿËÿ ÿÿ“Ý,ÿÿôË3ÿÿ»þéÿÿ  äöÿÿi oÿÿÿHÿ÷ÿÿð2`2ŸÍÿÿàeàešÿÿOúÿÿÿÿP‚ïÿÿÿJûÿÿÿA@¿ÿÿÿ » »öDÿÿïÿÿÿÿÿ€YÀv?€ÿÿí€ÿÿ†ÿü÷÷÷ÿ÷ÿ0ÿçÿÿ7õÈÿþ¿€ÿÿFf?¿ÿÿNÜÜ0#ÿÿ  ôçÿÿaˆe€šÿÿ!““þlÿÿ‚ååýÿÿ  €_ÿÿkÑÄ ?ÿÿÿà ÿÿÿÿBýÿÿÿJ ÿÿÿÿWþèÿÿùù€ÿÿÿåÿúÿÿŸ¿`ÿÿhÿÿûÿûÿûÿ€ÿÿÿÿ›ÿaÿþs¹ˆFÿÿ‘·~?ÿÿ/þ/Ðÿÿ܀܀#ÿÿ ñÿÿÿ‰--þÒÿÿ`á`!ŸÞÿÿ6€6Éÿÿ[ØD ¿ÿÿÿÀÿþÿÿ¤ ÿÿÿÿ€@€ÿÿÿ(²’ÿmÿÿk€k€”ÿÿ¿Ãÿüÿÿîéÿÿsé ÿöUþÕÿÕÿ*kÿÿÿÿþìÿÿ?€ÿÿ€Ÿ7ÿÿüÿåÿÿÁ€Á>ÿÿÿ„€èÿÿ+  üóÿÿÿÿÿÿ"ö"ÀÝ?ÿÿñÿÿÿÿ À@ÿ¿ÿÿÿÿÿÿàÿÿÿÿÿýÿÿ__à ÿÿåðåÿÿÿúûÿÿ ÿ÷H?H?H?·Àü ÿÿÿÿ >ßÀÿÿ߀ÿÿÂO?·ÿÿ¿˜ÿçÿÿ þóÿÿƒ€þÿÿ`ÿþÿÿçÿÿÿ@À@¿ÿÿÿFÍÿÿÿÿ @@ÿ¿ÿÿÿÿÿÿjyÿÿÿÿÿûÿÿÿ®ÿ¿@ÿÿ®î?ÀÿÿÿûÿÿêÿîH?H?H?·À©ŠÿÿÿÿŽÿpÿÿÖw)ˆÿÿ±ÿÿþ‚ÿýÿÿ2p2`ÍŸÿÿY_ ÿÿÿ ÿýÿÿ80íÏÿÿÿÿÿÿNúÿÿÿÿ¡¡ÿ^ÿÿ@‚ÿÿÿÿðÿÿÿÿ´´ÿKÿÿd{d{›„ÿÿýCý|€ÿÿý€ÿÿ/°@ÿÿ=??ÿÀ|@ÿÿ€8ïàÿÿÿçÿÿ€Ç?ÿÿgçûÿÿ%¬%¬ÚSÿÿûÿÿÿÀ!€þÿÿ00Ïþÿÿxx‡ÿÿÿ'ˆÿÿÿÿõ~õ~ ÿÿˆ€ÿÿÿì!ÿÿÿÿ† ÿóÿÿ[ß[ߤ ÿÿþþÿÿÿ)jÖ”ÿÿi€€ÿÿ///æÐîÿÿÿÿBÿàÿÿÇã8ÿÿJY?±ÿÿ=@ÿ@¿ÿÿa€a€žÿÿùÿÿÿ&  ûôÿÿ00ÿÏÿÿríÿÿÿoÅÿþÿÿq|#  ÿß@À?ÿÿÿ@ÿÿÿÿ€@@ÿ¿ÿÿ¿¿â@ÿÿÑèÑÿ.ÿÿpèÿÿ×àh@@ÿ¿‘>>>~Áîÿÿÿÿä ÿôÿÿÝÓ" ÿÿ(s»ÿÿDG¸éÿÿ##ÿÜÿÿ ûÿÿÿøÿùÿÿ@þÿÿÿïÿÿÿa$`Ÿùÿþ2‘Â"ôÿ¨£¸@EÿÿGèÿÿÿÿçÿÿÿ66ìÉÿÿÿøÿÿÿÿˆ÷ìÿÿïðÿÿz~~ùµƒÿÿÿÿ ßðÿÿqàŽÿÿ÷ÿÿÍ 2óÿÿBBÿ½ÿÿDD»ÿÿÿ €ÿÿÿÿ<  çóÿÿÿöÿÿ¶9>oÃÿüü¢ûÿ –‚æCYÿÿÜþ¾ÿÿþÿÿÿÿÿüÿÿ„Pûÿÿÿ;Àÿÿÿÿ€üÿÿÿ¡Ñ€~þžj¦™¸ÀÏ0µH*ÿþ‘loÿÿÿûÿÿÿDD»þÿÿ£ý£ÿ\ÿÿ'½ØÿÿÿÙÿÿÐ@@ÿ¿ÝÿÝÿÝÿ"z ÿôÿÿ ûöÿÿž+ûÿÿÛ‚Û‚$}ÿÿÿçÿÿ'£%€ÜûÿûÂÿÿÿÿ@ ÿóÿÿ Oðà Ç ÀëË4úÿpð/ÿÿ` ÿßÿÿíÿÿÿßôßÿ ÿÿþøÿÿ½ÿBÿÿr!ÿþ¼y¼y¼yC†ÿáÿÿÿþBT¿»ÿÿž°°Oÿÿ`@¿ûÿÿÿÿÿÿbøÿÿÿû<ÿÿÿÿ€__ÿ ÿÿEûª0ÀïP’l€ì­rÑ*ÿàÿÿÀÀÿ?ÿÿííïÿÿòõòÿ ÿÿ‰ öòÿÿËÿ4ÿÿlÿïmïmÿmÿ’ÿÿèÿÿ`¦¿ßÿÿãÿÿÿG‚C¼ýÿÿ ÿÿÿÿ$ ûÿÿÿ¶ýÿÿÿÿà ÿßÿÿëÿ¬0Àá(Ëô/ƒ€tV[©¤.»Ð€ ÿ؆ÿýÿÿDÿûÿÿ— —hðÿÿØÏ÷8ÿÿ¬ýSÿÿù¿ ÿô«»»ïDÙtÙ~Ù&€Šqýžÿÿ–ŒŒsÿÿœ˜gëÿÿ  ûßÿÿ†žùÿÿÿkÿÿÿÿ„ÿÿÿÿ-w¢€0À×)à€pÔ€<-úÿÿàÿïÿÿ±±ûNÿÿµ·áHÿÿe(ÿÿÿÿwàˆÿÿJèÿÿÂÙÂÙÂÙ=&>#?ý?þÀ- þßÿÿ¿  öÿÿkk”ÿÿÿ @ÿÿÿÿ;üÿÿÿ¡·@ÿÿÿÿàDÿûÿÿÎëâ ðÆ Œ ìÌ{T?0ÿÿÿÿïÿÿÿß_ß €ÿÿö@ÿÿÿÿ‡×ø(ÿÿßt ÿÿB ÿß±Z±_±_N )‚ÿÿÿÿ?ÿçÿÿ``Ÿÿÿÿ!b þßÿÿ/ÿÿÿÿºtÿÿÿÿ Ê€Ê5ÿÿƒþ„ ÀßĈƒ°?4ÿÿÿÿÿèÿÿÈáÈá7ÿÿøÿÿÿÿÿøÿÿßh ÿÿ“ô“ô“ôl ëþÿàœ`ÿŸÿÿ€ÿ€ÿÿÀÀ÷?ÿÿ’ïÿÿÿXO@ ¿ÿÿÿÿyÿÿÿÿäõÖÿ(ÿÿ¨ð€3ˆ2Œ œã @ÿÿÿÿÿÿÿÿÿýÿÿïÁïþÿÿÿäÿÿëõÿÿ$ðððû7à7þ7ÿÈ ÿßÿÿ¹€yÿÿÿ’ïoÿÿ ÿÿÿÿ»îÿÿÿÿÿûÿÿÿÿЄÿøÿÿ£¿|@€£0ðÔÌs?†ÿÿÿÿ ÿÿÿÿBÿýÿÿQØ_ÿ ÿÿKþ´ÿÿS¿¤ÿÿ°ÿ÷000Ïà°Šÿÿÿÿÿ óÿÿ€€þÿÿ˜–ÿíÿÿ ÿÿÿÿóýÿÿÿÿ0Aÿ„ÿø×öèH'%¤Ú[?îkÿÿÿÿ@ÿÿÿÿÄÿüÿÿþØÿÿÿÿDxû‡ÿÿ¿}@ÿÿ¨‘ÿÿPõPþPÿ¯¨ÿÿÿÿapá`ŸÿÿXX§ÿÿÿàÿÿÿÿŸûÿÿÿïÞ ÿÿÿÿàÖôÿÿà_$ ÿ¡@?Ö”ÿûÿÿMÿÿÿÿhÿýÿÿðÿ€ÿÿD@ÿ¿ÿÿžÿaÿÿüÿÿ à þ ÿòH!ÿßÿÿsó ÿÿÿ80Ï÷ÿÿ?ðÿÿÿÿ ïÿÿÿÿßå ÿÿÿÿ£8^üœÿàAàh& Õ?I`ÿÿÿÿÿÿÿÿ€@€ÿÿÿ_ÿ_ÿ ÿÿ`ÿøÿÿxú€ÿÿÂ```ÿŸßá_ÿ_þ :‹ÿûÿÿûÿÿÿAâ@À¿?ÿÿÿ ÿÿÿÿDÿÿÿÿëO°ÿÿÿÿÑ*Ùþÿàw«€<Ô+hÿÿÿÿ„€ÿÿÿÎÿñÿÿ_þþ€ÿÿÿðÿÿ=r€ÿÿÿÿ_ò_ý_þ êÿðÿÿx0ûÏÿÿ ù÷ÿÿîÿÿÿÿ™‹4ÿÿÿÿ_µ Jÿÿÿÿašûþ$ÿÀ?€À€!Ý äÿÿÿÿ„ûÿÿÿÿÿÿÿFyù€ÿÿ€Œÿsÿÿüúÿÿ   ïöWû_þ_ÿ ¨XÿøÿÿÉÁÉ6~ÿÿ@@¿ÿÿÿ;bÿÿÿÿÿÿÿÿÿç¿@ÿÿÿÿðp÷ïHÿ€îãÀGÓ/oòÿÿÿÿÿÿÿÿŠ€ÿÿÿíïÿÿÿàÿøÿÿwÚˆÿÿNÿý‚s~ý€"pÿðÿÿ–°–°iOÿÿBHÿÿÿÿ›ÿÿÿÿÿÿÿÿÿ§¿X@ÿÿÿÿÁß`þÿ€È€ÿ›>”oÿÿÿ"FÿÿÿÿQ¨ÿÿÿÿÓÛû$ÿÿé=þÀÿÿíìÿÿÄÿûpz{ÿ„ÿ±ÿñÿÿ††yÿÿÿ!÷ÿÿÿÿôÿÿÿÿ.îÿÿÿÿVý©ÿÿÿÿÁ­*þPÿ€§À ßöý0Ïÿÿÿ¡ÿÿÿÿÄTÿÿÿÿ€//ÿÐÿÿ ?ÿÀÿÿ÷ÿÿÿ¨"ÿÿ„þÿÿÿ·÷øÿÿŒŒÿsÿÿ ÿÿÿÿ»P€ÿÿÿÿÿÿÿÿ÷öÿÿÿÿ«lüÿäø€K÷ ‹½@ÿÿÿ ÿÿÿÿ´ ÿÿÿÿOOÿ°ÿÿ¬Hÿ·ÿÿoýÿÿøÿÿÿúÿè8Ïà0ÿÿ  þöÿÿ€÷ÿÿÿúöÿÿÿÿÚûÿÿÿÿøÞ ÿÿÿÿ ™„þøÿêJÿ Ä`¿ÿÿ€ÿÿÿÿ´ÿÿÿÿ$ÿðÿÿfƹ€ÿÿ}€ÿÿÛ_$€ÿÿò]ÿâ–ÁÖÁ)>ÿÿ€ÿçÿÿÿïÿÿõªÿÿÿÿ´pÿÿÿÿ=Þ ÿÿÿÿ©ððÿ瀗پ¨7ÿÿ€cÿÿÿÿ0ÿÿÿÿlÿïÿÿ«)¿ÿ@ÿÿ@Mÿ²ÿÿ?ÿÀÿÿaƒÿüôô þÿÿ óöÿÿ3,0Ïÿÿÿ¿ôÿÿÿÿ{×(ÿÿÿÿŸÛ`$ÿÿÿÿòxÿø€ÿÿA'€ž$[ÿ?ÿ€ ÿÿÿÿÿýÿÿííïÿÿÿ²ÿÿÿÿÿþÿÿó÷ ÿÿïÄÿþÖ2Ò2-Íÿÿp`Ÿûÿÿ‹€çÿÿü|ÿÿÿÿë¯ÿÿÿÿcÓœ,ÿÿÿÿÊðêü-B+ÿ º¨Wÿ?ÿ‚ÿÿÿÿ1 ÿÿÿÿ2Ó2SͬÿÿÀÿðÿÿþ€ÿÿÛû$ÿÿÿ ÿô % %óÚÿÿ¬‚¬Sÿÿÿ~çÿÿÿý=ÿÿÿÿíýÿÿÿÿü»Dÿÿÿÿ…oPù€þé #ï÷]<ÿÿ ÿÿÿÿódÿÿÿÿ`Ç`Ÿøÿÿ~è€ÿÿ$÷ÿÿÿ=çÂÿÿÿàÿþDaDa»žÿÿ€@€ÿÿÿÚûçÿÿÿgéÿÿÿÿÿçÿÿÿÿlÚ“$ÿÿÿÿ„ðúüì(_Â2ÿÿà ÿÿÿÿ÷°ÿÿÿÿääùÿÿŽÿíÿÿÀÿÿÿÿCþ¼ÿÿ¡€ÿþÖÖ)ÿÿÿ0 ßÿÿÿ¿@þÿÿÿc|œ€ÿÿÿÿÿúÿÿÿÿq7žÈÿÿÿÿÅàúüP óŽ?rÿÿÛ'ÿÿÿÿ|€ÿýÿÿ@@¿þÿÿöÿàÿÿÀ¡ÿþÿÿB–½iÿÿÙä$ÿúVT«ÿÿÿ% ß÷ÿÿþçÿÿÿkà”ÿÿÿÿýÜ#ÿÿÿÿ€ãÿÿÿÿÞPàôø*ˆþkÏ]9ÿÿ÷ÿÿÿÿÿMö0ÿÿÿÿ==ÂýÿÿÿÿìÿÿƒDÿÿÿÿ…¹úFÿÿçâÿüx0ëÏÿÿ*(÷×ÿÿ÷ÿÿÿÿ÷øÿÿÿÿûl“ÿÿÿÿ\b ÿÿÿÿèàø õ ã/ÿÿèc ÿÿÿÿÝ ÿÿÿÿ ÿÿÿÿÿÿýÿÿûôÿÿÿÿ@¿ÿÿÿoÁÿþÁú~ÿÿd@$Ûÿÿÿ\B\¼§ÿÿÿê{€ÿÿÿÿ\í#ÿÿÿÿààÿÿÿÿäømú7 ÿÿÿ£LÿÿÿÿÿôÿÿÿÿäoÿÿÿrÿsÿŒÿÿñ ÷ÿÿÿÿÿÿÿ/ðÐÿþ@@¿ÿÿÿ€ ÷ÿÿ=ÂïÿÿÿÛþ$ÿÿÿÿÿ°ÿÿÿÿçèÿÿÿÿ€#äôø lùæt‹ÿÿðàÿÿÿÿÐðÿÿÿÿ°@ÿÿÿÿ??þÀÿÿÏlÿÿÿÿtÿûÿÿ-ÕÒ)ÿþDD»ÿÿÿ@‚‚ÿÿÿOñÿÿÿÿ¤[[¤ÿÿÿÿ~ÿÿÿÿAÿþÿÿÿÿ‘aÀà CçÑÜ*ƒÿ?ôô ÿÿÿÿË­4ÿÿÿÿHæÿýÿÿ ÿôÿÿo¯ï€ÿÿüÿÿÿÿ<ŒÃqÿþVV©ÿÿÿSÿÿÿÿ?Äÿÿÿÿð€ÿÿÿÿ-ñÒÿÿÿÿ÷ÿHÿÿÿÿ  Ðà…¶Å(<ÿÿ?ðÿÿÿÿÿÿ.¿ÑÿÿÿÿòöÿÿÿÿÐÏÏÿ0ÿÿž®Þÿ!ÿÿÝ ÿÿÿÿ~ÿþ ÿÿÿÿ@Æÿÿÿÿ§ÿ!`ÿÿÿÿÐ"/ÝÿÿÿÿoS¬ÿÿÿÿúŸõ`ÿÿÿÿ<ä À@?Ð8-‡ÿÿÿøÐ?ÿÿÿÿ}ø‚ÿÿÿÿPàÿÿÿÿ„ÿèÿÿý=ý¿@ÿÿú ÿÿÿÿ<ÿÁÿþ!íþÿÿÀÿÿÿÿåÿå$ÿÿÿÿ|Ÿƒ`ÿÿÿÿßw ‹ÿÿÿÿücüÿÿÿÿñt À  ÷ñx ‡ÿÿÿþÿÿÿÿÿÿÿüÿÿÿÿmôÿÿÿÿÀFÿùÿÿ|Ï|σ0ÿÿ¿Àÿÿÿÿ` ßñÿþûúÿÿRrýÿÿÿ—÷•Lÿÿÿÿž:@ÿÿÿÿÿÿÿÿÿþíîÿÿÿÿüö àð÷€@„G¨~ñÿø˜ÿÿÿÿÿ÷ÿÿÿÿÿqÐÿÿÿÿjÿÿÿÿþþ€ÿÿV¸ßÿ ÿÿáGÿøÿÿ@@¿ÿÿÿ  ôÿÿÿ÷owÐÿÿÿÿ€­ÒÿÿÿÿÍÿ2'ÿÿÿÿÿý¤ÿþÿÿµÇ @€¤¥_z°ÿÿÿüøÿÿÿÿÿB/½ÐÿÿÿÿŸ­ÿÿÿÿèÿûÿÿß^ß_  ÿÿŸ{Ÿÿ`ÿÿ@%ÿÀÿþ¤#ûþÿÿCCüýÿÿàÏà4?ÿÿÿÀ?rÿÿÿÿ¾Aÿÿÿÿÿÿþþÿÿÿÿ\÷ Àý@…Þ\£ÿÿý–ÿÿÿÿÿBnýÿÿÿÿb¿ÿÿÿÿÔ€ÿÿÿÿ1ê1ïÎÿÿ/ñÿÿÿÿd3ÿÌÿÿ`@¿ïÿÿKPCüÿÿÿ”ÿ„DÿÿÿÄ¿;@ÿÿÿÿýíÿÿÿÿÿþ4€ÿÿÿÿSÀ´H€¢ à†±ÿÿþþÿÿÿÿÿÿäÿÿÿÿç}‚ÿÿÿÿ ÿÿÿÿ]½]½¢BÿÿÛ¨ÿÿÿÿÈQÿ¤ÿÿ ûÿÿÿ`K KÿÿÿÿÿÿØ@ÿÿÿÿH_· ÿÿÿÿÿÿ9ÿÿÿÿÿý÷ÉÿþÿÿÁ>@€^€ ` o•ïÿÿûýÿÿÿÿÿJÁõ¾ÿÿÿÿóÿ ÿÿÿÿæ$ÿÿÿÿCCù¼ÿÿ÷øÿÿÿÿÖ„ÿúÿÿ˜ûÿÿÿÔûD;ÿÿÿÿÿìÿÓÿÿÿÿ0Ï€ÿÿÿÿ{ÿ€ÿÿÿÿÿü(xÿÿÿÿ/“€@€ "@ ðÁ¾±Ïÿÿÿwÿÿÿÿÿð ÿßÿÿÿÿžÿaÿÿÿÿþlÿÿÿÿŒ óøÿÿÛÛý$ÿÿôÿûÿþþÿÿÿ|¿|¿ÿÿÿÿÿÿ¿àÿÿÿÿÚ%øÿÿÿÿöÿ ?ÿÿÿÿÿÿÿáÿþÿÿ7Õ@€àÝ"ïþ\/ègÿÿÿ¿ïÿÿÿÿýÿïÿÿÿÿß/ Ðÿÿÿÿ>öÁÿÿÿÿ‹‹ãtÿÿÿÿ€ÿÿíÿúÿÿ¬ÎÀû?ÿÿRÿR·ÿÿÿÿÿÿÿ¼ÿÿÿÿ ߀ÿÿÿÿûÿ/ÿÿÿÿÿÿÿáÿþÿÿ"ú@€n÷$ëðm?+—ÿÿÿûÿÿÿÿÿ’ÿéÿÿÿÿæûÿÿÿÿï€ÿÿÿÿÈH·áÿÿç×çß ÿÿûbû|€ÿÿb`ÿŸÿÿþÿNÿÿÿÿÿÿÿûìÿÿÿÿßÿÀÿÿÿÿ¦?YÜÿÿÿÿÿáî@ÿþÿÿo÷€÷ÿ@$@;Œ×ð2Oÿÿý¿ÿÿÿÿÔ ÿÿÿÿÿÿ¤…[xÿÿÿÿé¾ÿÿÿÿÇ··øHÿÿŸ¯Ÿ¿`@ÿÿÞ‚ÿþÿü(``ÿŸÿÿ\\§ÿÿÿÿÿæÿÿÿÿÿû?dÿÿÿÿç¹ÿÿÿÿÿú~Áÿþÿÿçÿ€kþ`€[ÉèîÇ?ÿÿþïÿÿÿÿßüÿÿÿÿÿÿ.Ñÿÿÿÿÿ{´€ÿÿÿÿÿñÿÿ`ß`ߟ ÿÿ@þàÿÿ#jbÿŸÿÿ——ïÿÿÿÿÿÿöÿÿÿÿÿÿ~@ÿÿÿÿ}ÿ‚ÿÿÿÿÿï÷‘ÿþÿÿžÿ @€ÿûî ]˜DÝ_#£_?ÿÿÝÿÿÿÿÿo`ÿÿÿÿÿÿ% Úÿÿÿÿÿþ€ÿÿÿÿ’íþÿÿ§ë§ëXÿÿ·ð·þHÿÿ¨ ÿûÿÿOŸ—ÿÿÿÿ¿¿„ÿÿÿÿìÿÓÿÿÿÿÿàÿÿÿÿÿûÿáÿþÿÿÿ÷€€þ{„è"W¥ècèœÃ?ÿÿ¯ÿÿÿÿÿøÿÿÿÿÿÿ¢]ÿÿÿÿÿúþÿÿÿÿÿþÿÿÓÓä,ÿÿŸÂŸþ`ÿÿcaÿŸÿÿ__ÿÿÿÿþÿáÿÿÿÿÿÿ?àÿÿÿÿô ¿ÿÿÿÿÿúþûÿýÿþOÿàЃ/|ÿøþï³îBf¹:§ÿÿ÷Mÿÿÿÿÿßùÿÿÿÿÿÿ°ÿÿÿÿÿ™uf€ÿÿÿÿ©ÿûÿÿèàüÿÿ¸þæÿÿº0ÿÿÿÿ§ß!ßÿÿÿÿ¿üûÿÿÿÿÿÿ¼ÿÿÿÿù‡ÿÿÿÿÿÿ¿óÿýÿþ_ÿ ¸¿@Üt0·ÿ×ß c§ý w¿ÿýþ¿ÿÿÿÿÓ¨ÿÿÿÿÿÿ#ßÿÿÿÿÿ×ú ÿÿÿÿþZÿÿÿÿÒP¯éÿÿNN~±€ÿÿ±s1sþŸÿÿåÿåÿÿÿÿÿÿÿØÿÿÿÿÿÿ{ìÿÿÿÿÆ_9¢ÿÿÿÿÿý?ùÿÿÿþÏÿ0„‡xãb#½ŒB¿ÿùðÇ¿ÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿE•¿ÿÿÿÿÿïÿÿÿÿÿª@ÿÿÿÿh ßçÿÿ=>ÿÀÿÿ¨J¨Bÿ¿ÿÿ—ÿ•¿ÿÿÿÿÿÿÿðÿÿÿÿÿÿÿæÿÿÿÿ¼_C¬ÿÿÿÿÿûœ#ÿýÿþ×ý(‰¤GøMª€k ”âÿúüË¿ÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ¹ÿÿÿÿÿÿÀÿ€ÿÿÿÿí­ÿÿÿÿ‚}üÿÿ¹$9>ÆÀÿÿ)?(ÿÿÿÿ÷ÿwÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿöÿÿÿÿÈ_7¯ÿÿÿÿÿÿþÇÿúÿüÿëïþÎð&ÝÉ0` ÿßïñ"ow¿ÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿJÿÿÿÿÿÿÿáÿÿÿÿî"ÿÿÿÿÿçÿÿdådî›ÿÿü ô ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿„ÿÿÿÿ~ÿÿÿÿÿÿòÿíÿþÿÿ耑%Ó·,¸@£®ãñê ëÏÿð‚· ÷o?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCoÿÿÿÿÿÿˆE÷ºÿÿÿÿóÿÿÿÿÿ’ÿÿÿÿ‘‘înÿÿúŸø‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿáÿÿÿÿß Ÿÿÿÿÿÿýü…ÿøÿþ“>  o óp€ 7Épp Sÿ¬›ôä…£?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿ¨Mÿ²ÿÿÿÿÌU ÿÿÿÿBÿÿÿÿööüÿÿ¿—¿—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿üÿûÿÿÿÿßÿ.ÿÿÿÿÿøï÷ÿúÿüü`"!Áþþ(¿×`º~“þl¡óþ ¨éo¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿÀÿüÿÿÿÿ|è€ÿÿÿÿj0ÿÿÿÿÿáÿþº_ºVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØÿÿÿÿÿÿ §ÿÿÿÿþýýQÿÿÿþÛ¼ B”™bàþÿ …Ñû>ýsWõ¾ M?²ÀíŸæŸ¿_?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿiXþ·ÿÿÿÿ>Á€ÿÿÿÿêçÿÿÿÿˆ~ÿ€ÿÿÿßùßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿßÿ§ÿÿÿÿÿÿùþ¡ÿüÿþûp²æR~o€¢ÌSr<Út¿îŠ=·‚@¤¯­×Bÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÿÿÿÚì$ÿÿÿÿúÿÿÿÿ@^^ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿß÷ÿÿÿÿÿúÿçÿýÿþÓþ(Ùœ$ãüÿžÏ01Š.ˆßwäzû…ïÇío¿_?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²ÿýÿÿÿÿÿäÿÿÿÿõfÿÿÿÿËÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿóÿìÿÿÿÿÿ¸ÿÿÿÿÿû¿ÂÿýÿþÿóÀ-eK|wƒ€ñ iÿž2¤/ßÿ™­ŸR`¬éŽ?ß?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòBÿýÿÿÿÿÜÍ#2ÿÿÿÿ× ÿÿÿÿ¥ƒÿýÿþëÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿÿÿÿ.Ÿÿÿÿÿÿùÿêÿýÿþ=óÀu°€ÿÿlŠ?÷ÀLùM³pŸÇà¸BT.Ÿß?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº„ÿÿÿÿÿÿŸë`ÿÿÿÿ/ÛÀÿÿÿÿjÿüÿÿÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÿÿÿÿÿŸÿÿÿÿÿÿþÿûÿýÿþ5Îà1øƒ÷ÿ+<Ð?ÿÀ&ÿÿ×ЀèþÅ¿Ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿ…Ìú3ÿÿÿÿ¿û@ÿÿÿÿ«Áÿþÿÿ÷ÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿßÿÿÿÿÿøÿùÿüÿþºÓ@ ’h{퇾‘ñÿàþêÿÕè„¿?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíìÿÿÿÿÿÿ¿û@ÿÿÿÿÓÖ(ÿÿÿÿ¿#ÿýÿþÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿýÿñÿüÿþ–€pÄ™ÿÿß›ËÌà0haûþÌŸoàp€.á­Ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDë»ÿÿÿÿÿÛ$ÿÿÿÿÓ ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿüÿþ¯p‚q/çø?øÀÖKtï€h½(IèðÒçè¸@ß·ë¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿûÿÿÿÿÿÿÿ @ÿÿÿÿÿÿnê‘ÿÿÿÿ×õ ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿûÿýÿþ»ä‹`Oòžððá†Öiÿà1rZð#ü1®ÇP˜`ï‡øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºuÿÿÿÿÿÿoûðÿÿÿÿ¿ÿ@ÿÿÿÿŸà`ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿþÿÿoz0 €`_×gÐЀ/Ñÿáÿþ÷£Àð}þ°'3øœ`ÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè°÷ÿÿÿÿÿ´ãKÿÿÿÿpØÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿþÿÿÀø€E:ÕãÐÿÐ/åd/x€ÿÿ^dJ|<ƒÿ-õðûÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿFÙù&ÿÿÿÿ`æÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿƒ/í>ÀCY{;„øC—@¿ãÿü¡¯Àÿ†ëÅèÚc<œ_ÿ Áÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©Jÿÿÿÿÿÿ¾ðAÿÿÿÿWø¬ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÿF™!@>€À°¥€|¯ØàáÿþöŸ’àq reöþ ½õÂÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèbÿÿÿÿÿÿÁ~ïÿÿÿÿ´ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿ¶{À8€À+‘änÇÁÈ?çÿøâ$]î€ݸä"#ÿÜÿ¯€Çÿ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿ¢@ÿÿÿÿÿ@ü¿ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô§çà¸À@vrŽys÷•æÿøñÔwî$ú÷ ÿþžÿ Æ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿû ÿÿÿÿÿÿ‰öÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÙÊ–Áàà’wïýpØOÈ?ïÿð2ÿø P ìŸþÿCü¼ˆÿxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH@ÿ¿ÿÿÿÿ®ýàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿ|½µã;ÀÀ|ûîùj‘žc¿«Ìÿð`¶?NÀªÑöÏý?þ1þîUÿÓÿ+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿ/ÿñÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûû— Áàð{Eï=9ƒÀÝ·ÿèÿðóÁÏ¿³þÉüGþ?ÿ¿þà;ÿÝÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÄÿÿÿÿÿÿ`2ÿÍÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈέôÓàù7áwò(ÀoîæÿñÿøT îŸ`…ûVýËÿ?þ[Ãd?€íÿ‹ÿsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä ÌT¡†Ãù0ã/W?°ÀÎïÿ÷ÿøhLé6ßç0ëøçùßü?þʺõV9×ÿGÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÓ#ÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…p®ÁòÁþ¢ýõÿòßù¿éñÿþÁìp,Çì8'ûoýüÿþMLòé/ßÿßÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¹ÿÿÿÿÿÿÄ„ÿxÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÄ—úÂáÿ%6;Æ?ñÀ/ùðÿøÿÿ 1a1Îÿ+úþÿýÿþ.ýÑÇ'ÿŸÿ?ÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿv¿ÿÿÿÿÿÿý ÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÄ~ò€áÿ:Âvqý?õûÿûÿüNÄ5óàÅð?ÿÿýÿþÖÙ©Á+ÿËÿgÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá[Ï¿âñÿE~?€ÿÿ¯úþÿüÿÿij!pÿÿ{ùÿþÿýÿþàÿÇ*OÿÏÿ_ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÃÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿøêñÿ#÷ÿüÿÿÿüþÿÿÿÿÃ<Í?ÿÿÿùÿýÿÿÿþ¿ïô/ÿßÿ_ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþöÂÅ?ãÿ`ÿáÿÿý¿ÿÿþÿÿ (Ì3ÿÿÿÿ×ÿüÿúÿü—aö Ú?¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿþgÿÿÿÿÿÿý ÿðÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛMÏÀô?ãÿéÿÿÿÿÿÿÿÿÿÿÿgÓà/Ÿÿÿÿ×ÿÿÿúÿü0òI Þ?¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿkÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá/ñàìóÿö`@ý¿ÿÿÿÿÿÿÿÿÿ/çÿÿÿÿÿÿÖÿøÿýÿþP»r]Î?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþßÿÿÿÿÿÿûÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäŸóàìóÿÅ’’úmÿÿßÿÿÿÿÿÿÿ o÷ÿÿÿÿÿÿÇÿýÿúÿüI,dŸ7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÿÿÿÿÿÿþ4ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúwì0ûñÿé·–þiÿÿÿÿþÿÿÿÿìÿÿÿÿÿÿ×ÿøÿýÿþëÈP׋ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü)úàýóÿKl mô“ÿÿýÿþÿÿÿÿv ÿÿÿÿÿü‰ÿðÿûÿüIåa—?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤ÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷®ÿ ü_óÿ„ðqàÿÿ¿óÿýÿþÿÿßÿÿÿÿÿà”ÿâÿúÿýηC_¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýðñðôûÿ¹Ý>=Àÿÿ¯ÿÿûÿüÿÿ+_hÿ—ÿÿÿÿËÿöÿúÿýÃ'òÿ‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÞùøðÿÿVËX¨ —ÿÿþÿûÿüÿÿÓðÿÿÿÿøáÿþÿúÿý<Rÿ ÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPýÐô/ûÿ¼| ;@ÿÿúÿûÿüÿÿÿõ? ÿÿÿôŸÿîÿöÿù Ïçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷—ý÷ôûÿ’¼â«Gýÿøÿôÿøÿÿ »ÿÿÿ Ìÿ,ÿýÿòa¿öŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúmûúýÿ$:ÆÆùÿçûùÿýÿþ)Å?ÿÿÿøõÿÿõÿúRŸýßÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽûÿúýÿöüž{xá‡í"‚Ùýÿþ.¤¦¡ÿ_ÿéÿ ÿøÿö¶^Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"ÿ=þÿÿgã üð@’V$Hï¿ÅŠµ…4Ëÿ@!¿ÙÿýÿþÐOÿQ€³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ£þÜþÿÿã0ì0Ïÿ‘¥¹ˆ†ÿÛ"Û!x߇ÿð áÿöÿø§oþWÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_þ þÿÿŽ…~ÿÿå¡ÿÿÿ-s°ÿÏÿ£`\šÿíÿðõï÷Ï ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ`þ€ÿÿúoÿÿÿŒÃþ?ÿÿÿŽ«Â ßÿÿ’ym½ÿÒÿàß?Ó¿/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ þðþÿÿ0Øøÿÿ !þÿÿÿÿCʧÈÀ7ÿÿo“OÿèÿðžÿÏÿ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGþØÿ ÿÿûøÿÿ•Ä ;ÿÿÿÿrÛòà ÿÿ/Þÿéÿðÿßÿ_ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿ|ÿ€ÿÿ¦Þ_üÿÿt€ ÿÿÿÿÞíàÿÿœ¤ƒ#Çÿÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿþÿ€ÿÿP{øÿÿôÑ .ÿÿÿÿ9Þðàÿÿ[¼,ÿÙÿÿÿÿÿÿÿÿüÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ®ÿÐÿÿY\'üÿÿ A¿ÿÿÿÿL÷ýøÿÿ]× ÿîÿñßÿ_ÿýÿÿÿøýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÿ¿ÿÀÿÿc˜CåCü¼2¸I‡€ÿÿ;ÂÂÂü=ÿÿ—ñOÿÿà?ÿ~ÿÿÿÿùÉúÿüÿÿWÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿ·ÿÈÿÿiloÿ|¿‚dÿãé˜þgÿÿŒ#ÿÐÿàtÿ÷ÿÿ?ÿýlø)ÿÐÿÿÞž~a¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÀÿÿˆ‚÷üü‘oÿÿ¢n»îDÿÿ~ ÿÀÿà»ÿìÿÿÿû2ø6ÿÆÿùÌ^¡?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÿÎÿðÿÿû˜ÀÃç<š—hÿÿÞÙØ 'ÿ1‘®ÿÿÀoÿ)ÿÛÿÿöÀ÷øÿçS.`™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿþÿÀÿÿÍ”:`ÿü¢íÿ3Ïãðàÿÿe¹×þ€ÿÿÿßÿ?ÿòðàøïÿ;îàÀÿÿ»ÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿ÷ÿøÿÿîÿ´<ÿò˷÷·þHÊ&Ãî<ÿÿ:+ÿÀÿð/ÿãÿÿÿÿÀþÿÿÿ'þÀÿÿ¿ÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿàÿÿÉì@ÿ€l3ÛÿÄ?ùùùÿÿTÿ ÿÀoÿÿïÿÿü€üÀü?ÿÿÿàÿÿ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà´ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõÿàÿÿÔ|/°?ÿÀlÌ|ÿÿŸ²Ÿò` ÿÿ°‘ïÿ@ÿ€Ÿÿ¿ÿoÿÿÿ€ÿüÿÿÿ ÿðÿÿíÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿ÷ÿøÿÿ¡Gþ†ÿøþ/ _üÿ§Ïÿ0ÿÿڢؿ'ÿÀ¿ÿÿïÿÿþþÿÿÿÿÿàÿÿ5'ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû„ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿÿÿðÿÿèúÿÿjga?`Ÿÿ3¿3¿Ì@ÿÿ¤°úOAÿ€ÿ¿ÿïÿÿüüÿÿÿÿÿáÿþxøæøÿ?ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿôÿðÿÿð÷/ÿüÛ?ÿÿýñÿýÿÿÙ3Ù?&@ÿ€ßÿ_ÿÿÿ?ÿøøÿÿÿÿÿðÿÿòn1éðÿ?ÿOÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû´ÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿóÿðÿÿŠ¬{Àÿÿ‡tœÿÿ‡÷úÿÿÀ3Àï?@ÿ€?ÿÿßÿ?ÿððÿÿÿÿÿüÿÿÅ)Ê ?ßÿßÿ?ÿ×ÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿôÿó‰Àyÿÿÿ©÷ÿÿÿ˜éŸÿ`ÿÿ‡‡~yþÿÿ¿ÿÿÿÿääûÿÿÿÿüÿÿÊ7ÿÿÿ¯ÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„ÿÿÿÿÿÿ(Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿóÿõÿøh‡”‡xÿÿ¯ø¿ø@ÿÿnoþÿÿ?á/@ÿ€_ÿÿÿÿ?ÿÀÀÿÿÿÿÿüÿÿüúÿÿ¨9±ûFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿÿÿÿÿÿ«^ÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿóÿýÿð³d‰ÿÿÿ¤õõÿ ÿÿ`û€ÿÿ˜Ã;~„ÿ¿ÿÿ¿ÿÿ€€ÿÿÿÿÿüÿÿ8æˆùÿÿ'¿Áýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„ÿÿÿÿÿÿ(Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿúÿ÷ÿùïL¸ûÿÿOOú°ÿÿâ~ÿ‚ÿÿëÚúü…ÿ?ÿ¿ÿÿÿÿÿÿÿÿÿüÿÿïK‡ÿðM7Å0ÂÏ?ÿÿÿÿÿÿÿøÿÿÿÿÿÿÈÿÿÿÿÿÿ>ÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿÿÿÿÿÿªÞÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÿáÿòÿùIÞ@¿ÿÿ|ÿ€ÿÿ!óþÿÿ‘ÿ·ÿÀþ_þÿÿ?ÿÿÿÿÿÿüÿÿ§bÀZyÿ‡ÈРÿÿÿ/ÿÿÿÿÿüÿÿÿÿÿÿÌÌÿÿÿÿÿÿœÏÿÿÿÿÿÿ<ïÿÿÿÿÿÿÿ½ÿÿÿÿÿÿ«BÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÙÿÇÿãdh€ÿÿÿ ./ÿÐÿÿKô<ÿÿ…K@ÿÿ€üüÿÿÿÿïÿÿÿÿüÿÿ×ûÿkdÿŸŸ€ÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÌÌÿÿÿÿÿÿÉÿÿÿÿÿÿÿ<¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›ÿßÿçÿƒ=áx‡~ÿÿyažàÿÿñèÿÿïø‡ÿ?ÿÀ?øÿøÿÿÿ€ÿÿÿÿÿÿÿÿ~¢~Ö ÿÿbõðüÿÿ÷ÿÿÿÿÿüÿÿÿÿÿÿÌÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWmÂ3¿ŠÿÇbð/ðÀÐÿÑÿ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöµñƒüøúvþ‰ùÿÿüÿàxÁxx‡ÿO×Ôÿ¹ÿþÿþ¿þ¿ÿÿ|ÿÿÿÿ€ÿþÿÿïÓü#ÿã„dR¹ŸøàQÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàoëàðþ±þÁüÿþ|4ãÿ€8àøøÿ¿ÙŸ—Ýÿî_ÿ¿ÿ¿ÿÿø?ÿÿÿÿÀÿÿÿÿª‰Öp ÿü rI#/ßðûz?yÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿÿÿÿÿÿÿÿøCÿÿÿÿÿÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐ÷ÏðàÿŽþ7ÿGÿøþëÿÿ(óèèÿ?ÖîÿÞÿçÿÿŸÿ¿ÿÿð€ÿÿÿÿàÿøÿÿ´¤¶&HÿÿÍÞ¸^ï¡p«_X?ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ™ÿÿÿÿÿÿÿû_ÿÿÿÿÿÿíoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ߯àGÀÀ?úXþ(üˆÿ÷—»ÿ¿ÿ@èÀù0øÿ‚ÿFÿêÿÿÿÿÿÿÿÿàÿàÿÿÿÿðÿûÿÿ&,"_Ú?ýÿ{àcü¼ÀŠÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ“ÿÿÿÿÿÿÿûCÿÿÿÿÿÿáoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¸€ÀÿÚÿúÿJÿµ”«—¿—¿h@|7üÏüÿß‹ÿè?Õÿã?ÿ_ÿ?ÿÿÿñÿðÿÿÿÿø ÿçÿÿ¾–~‡ÿÿ©¸&<ÏÃðPo0óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ‡ÿÿÿÿÿÿÿû_ÿÿÿÿÿÿïoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþ¿·@ÿ ÿpÿàÿŸ¢  ï_1.Þïÿ¥ÿ´ÿŠÿÁÿÿÿÿÿÿÿÿÿÿøÿÿÿÿð#ÿüÿÿþ¯_‰˜Fçÿ¬éï|/ƒÐÑoLÃÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ“ÿÿÿÿÿÿÿø_ÿÿÿÿÿÿï ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿýÿþÿü€/ÿÚÿòÿòÿ×ÿþ ¸Hÿÿÿÿœÿ¢ÿÁÿÿÿÿÿÿÿÿÿÿþÿÿÿÿàzÿ­ÿÿ¼öÿ’0mÏÿ‰ªêþ ô|ï¤ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿÿ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿüÿüÐÿëÿØÿøÿç ÷ÿ³ÿÿ–ÿ·ÿèÿÀ?ÿÿ¿ÿÿÿÿÿÿÿÿÿÀ‹óÿ<ÿÿGdUl’Ÿïÿæƒw‡àøѳ‡pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿøÿø@3 ÿÐÿÔÿüÿã=AþþààNàÿÿàÿ…ÿºÿÀ?ÿ_ÿÿÿ?ÿÿÿÿ€ÿÿÿÿ®Öüyÿÿ€¡«à$ßÿ¡‡¶Gðø÷"áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿüÿ ÿÀ€7 ÿæÿþÿîÿñ(ÿäÑëÐÐ/ÿÿXÿ7ÿÀÿ€Wÿ¯ÿÿÿÿÿÿàÿÿÿÿøüæÿÿ¯ÅWÁ>ÿÿ$7ŸÇàøå[Gð¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHþðÿ€ÿ'ÿÍÿéÿéÿöz4B4B4½Ën‡gÿÿÿVÿAþ ÿõÿÿÿÿþÿðÿÿÿÿì ùóÿü<Ãþÿÿ Þ.Ïáð»q‡ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0þDÿÿ€ ÿúÿòÿúÿý ÿÿÒ#ÿÿÿ"ÿ|ÿÀÿ€¯ëÿøÿøÿÿÿÿò ÿýÿþ¸‘·€oÿM óðüƒ¸xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÿ ÿþr ùÿøÿüÿÿ9—æÿðÓÿïÿ«ÿ´ÿ@ÿ€ÿþßþþ?ÿÿh<…Ãþÿÿ¡ÍÀ?ÿÿ]7áèþÓ9øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀØ À€€¿ÿÿüÿþÿÿ¾‡_€€àë··ÿO^ÿ°ÿ@ÿ€ÿßÿ#ÿÿÿ?ãáÿÿ¿Ø?ØÀ'ÿÿë³èüÿ }àøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿpÿ ÿÀ ÿþÿÿÿþÿÿ¼=_üüà#¼×ÿüþHÿ`ÿÿ€ IÿÿÉÖËÅÖÿÿV»¿é@ÿÿ^‡÷àøÿ¾‰Àx?ÿÿÿÿÿÿÿîˆÿÿÿÿÿÿ´DÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæAnø! ÿÿþÿÿÿÿ!^V¾þèαïÿüœÿ þÀÿhÿOÿüCùöuÿŽIB‰v€ÿÿ¨¿`@ÿ€$(Åø?ÿÿÿÿÿÿÿî»ÿÿÿÿÿÿ•Ýÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿúÿþÿù@€ ?ÿÿþÿÿÿÿçàøøHßþ?ýªý€ÿ@þ‡…p5{QžÀÿ?“cï<ÿÿ“Wlxÿ€š¯  ü_ÿÿÿÿÿÿÿî¸ÿÿÿÿÿÿ¤Eÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿàÿÀÿÀ ÿÿÿÿÿÿ¹?ÂÀƒÿül þ»ÿ_?ÿ þÀýþ4Te(|ȃ÷@B½üÿÿXg§ßÿàqècÿÿÿÿÿÿÿî»ÿÿÿÿÿÿ§]ÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøø ÿÿÿÿÿÿÿÿÿíÿàdAùÿÿÿ÷û€ôø˜G?ýE úÿ[`Ÿàÿÿm£mÃ’ÿü>ÿþÿÿÿÿÿÿÿâˆÿÿÿÿÿÿ´Dÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€À€¿ÿ?ÿÿÿÿq¶€ÇÿøÄûcü¿ñþÀøü, îøìÿ 9}àÿÿÚpÚa%ÿþ¡öÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿüŸÿ¿ÿ?ÿÿþHãˆÃ÷üÃn3¿üÿâðõüø §Q Ðü/ÿ®^àÿÿ(fvÿ†ÿù?ö?p?Àÿ¿ÿÿÿÿÿ„ÿÿÿÿÿÿ!ÿÿÿÿÿÿDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô€øøð?ÿŸÿ_ÿ?ÿø/õÏáðþNÝñoÿ„ öüøóªèŠuÿdósr€ ÿÿnjlÿÿÿ—‘pÿÿ¿ÿ?ÿÿÿÿµÿÿÿÿÿÿ­kÿÿÿÿÿÿ^ÿÿÿÿÿÿÿÿÿÿüÿÿÿýÿþœ€¿ÿ¿ÿ_ÿ?ÿð‹í áôþaù|‚ÿÿÀþèð É 8òÿó/ðÀÿÿh ÿðÿÿßÔ0ÿÿÿÿÿÿÿ„ÿÿÿÿÿÿ-kÿÿÿÿÿÿ^ÿÿÿÿÿÿÿÿÿÿõÿàÿÈÿðàþÿÏÿ/ÿÿì§úGðøÿªï¿@Aÿÿ]€¤ðø‚3vs ÿ’8ø`ÿÿ€ÿøÿÿf± pÿÿ¿ÿÿÿÿÿ½ÿÿÿÿÿÿmkÿÿÿÿÿÿ^ÿÿÿÿÿÿÿÿÿÿíÿ€ÿ€ÿ€`?ÿÿïÿÿäÏðøðÿA½}‚ÿÿA®øð"ƒ{ÿñf÷ö ÿÿ‰€üÿÿü(øÿÿŸÿÿÿÿÿ½ÿÿÿÿÿÿ¡ÿÿÿÿÿÿFÿÿÿÿÿÿÿÿÿÿÿÿÿ ¿ÿOÿßÿ?ÿôŽî÷ðø =úBÿÿŽÀàdàà '0ÿÿÿ_Ô_÷ ÿÿïðÿÿ_ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþ ÿßÿÏÿ?ÿYôæ7÷ÈøÖ»(TÿÿÈp À®ž~£…€€ÿ¿]ÿ~€ÿÿÐ4/üÿÿ?ÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüügÿgÿoÿŸÿ±Îîûðüßøÿÿ€ÀàQu Í\Ä'Ä;ÿ¿Žÿÿÿÿ2ýÎÿÿÏÿßÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøø ¿ÿŸÿÿÿÉŒö÷ðø-Úñ ÿÿp€@€N9H ø_øÿ'ÿ~€ÿÿl “ÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿððððKÿÿƒÿÿÿùýFÿøþѬ#ÿSP€àË”)ÐÐ/ CßþÿÿÑþ>ÿÿoÿÇÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀ|ÿGÿƒÿÿÿúPü£þüÿZ>´ýÿ$@ À3p0ðáÿÿÿûôÿÿ¯ÿ§ÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀ Ãÿ÷ÿÿÿÿÿ8úßÿàü°6oÇ?øÿÀ€ üü«Ñ„.€ÿéþ ÿ÷ÿoÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€šÿgÿÿÿüúÿþøÿ,=çÇøÿà@€bÿâöà àÿ0ŽÏqÿÿÏÿÇÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/?Àÿÿÿÿÿ0ÿÃþüÿ5d£Ž_ð?ÿx€€¶‹m©ÿ†ÿ€'åßûÿÿ¯ÿ§ÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþF¡ÿÿÿÿþ þoÿpÿ€»ôøGè?ÿH€€(G?wÿ`ÿ`ŸïMóÿÿ?ÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿüù—Æ¿ÿÿÿ;ÿÿ¾ÿÀ¦æ…[ð?ÿÚ€€÷éïàÿàbpŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿü“Ÿgÿ¿ÿÿÿ8ÿáÿ¾ÿÀ ÅÄsà?ÿÀ€  êèÿèãÚýÿÿ§ÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿüÿü×ÿ/ÿÿÿÿÿ’ÿîÿ±ÿÀºrG Ýÿþ€ õà=ý5ûÿÿÇÿÃÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿø‚ÿ¿ÿÿÿÿÿ“ÿÖÿÙÿà—æßgo™ÿþЀÁ @Ü?üã ÿÿÿ·ÿ“ÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿø&ÿÿ¿ÿÿÿÜÿÑÿÿÿàgσýÿþ @`€i=—ÿGïïÿÿ•ÿ•ÿkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿðÿðÿðgÿÏÿ¿ÿÿÿßÿáÿïÿð¯†ÿøÿÿ~À€u ý„ƒÿ€ÿïÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿðÿðÿðÿðÿ¿ÿÿÿÿÿõÿèÿýÿó¾wÿÿøÿÿÀ€ ?ÿVAý@¿ÿœÿ"ÿÁÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿàÿàÿàÿà¿ÿÿÿÿÿÿÿÍÿëÿïÿ÷üûÿÿñÿþð€ ^®þ¿ë°° OðUÿ­ÿÿÿÿÿÿÿÿÿÿÿÿüÿüÿþÿÿÿàÿàÿàÿàŸÿÿÿ?ÿÿÿûÿþÿóÿÿ~÷ÿøÿÿÈÀ€ÿšÃšìšðeX¿§ÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿÀÿÀÿÀÿÿÿ¿ÿÿÿüÿûÿ÷ÿÿü©ÿðÿþÿÿ<À€Ê=áþþõÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÀÿ€ÿ€ÿ€ÿÿÿÿÿÿÿûÿ÷ÿÿÿÿóêÿóÿýÿþ:ÀýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿþÿÀÿ ÿ€ÿ€ÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿóÿýÿþÿÿ7‚@€¿²ÿOÿÿÿ÷ÿÿÿÿÿÿÿèÿþÿÿÿÿÿàÿ€ÿ€ÿ€ÿ?ÿßÿ?ÿÿÿÿÿÿÿÿÿÿüÿþÿÿÿÿØ@€-u» ¿ÿÿÏÿÿÿÿÿÿî ÿþÿÿÿÿÿÐÿÿÿÿ?ÿ¿ÿÿÿÿÿÿÿÿÿÿÿñÿüÿþÿÿo€ ô qá¡l¿þûÿÿÿÿÿÿøbÿüÿþÿÿÿÀÿÿÿ ÿÿŸÿ_ÿ?ÿÿÿÿÿÿÿÿÿÿøÿþÿÿÿÿo€P€ A‘€wdöY¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿ6?ÿ?ÿßÿ?ÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿ\€`€u‡ø rûÿÞÆßo Ÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿ€ÿÿ_ÿ?ÿßÿ?ÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿ¶È€;Ãüûûûûÿl;âÿßÿ?ÿÿÿÿÿÿñÿÿÿÿÿÿþ€ÿþþŸÿÿoÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ €tÀ€»þ¢Áý?ÿÿyÝû>û>û>ûï¾ï¾ï¾ï¾ïïïï¾ú¾ú¾ú¾ú¯€¯€¯€¯€"""" " " " "" " " " €ª€ª€ª€ª ¢ ¢ ¢ ¢Š Š Š Š "Š"Š"Š"Š    ((((¢Š¢Š¢Š¢Š¨¨¨¨"""" " " " "#Ê#Ê#Ê#Ê€«€«€«€«Ê¢Ê¢Ê¢Ê¢ûàûàûàûà>û>û>û>ûϾϾϾϾïïïハ¾Š¾Š¾Š¯€¯€¯€¯€""""    " " " " €ª€ª€ª€ª ¢ ¢ ¢ ¢ € € € € ¢ ¢ ¢ ¢‚‚‚‚****(Š(Š(Š(Š € € € €####ààààsïsïsïs€«€«€«ê¾ê¾ê¾ê¾˜€˜€˜€˜€ › › › ›ï¾ï¾ï¾ï¾))))¦û¦û¦û¦ûï€ï€ï€ï€ÿùÿÿà?þþÿÿÀÿÿùÿÿðÿ?þÿÿÀ}ð}÷È|ß|çß|ÿÿùÿÿøÿÿ€þÿÿÀE@DA@ÿÿùÿÿüÿÿÀÿþÿÿÀE4Èxß|A|ÿÿùÿÿþÿÿàÿþÿÿÀEH@PPAÿÿùÿÿÿÿÿðÿþÿÿÀð}÷Ï|ÐLá|ÿÿùÿÿÿ€ÿÿøÿþÿÿÀ?ÿÿùÿÿÿÀÿÿüÿþÿÿÀÿÿùÿÿÿà?ÿÿþÿþÿÿÀ9Î}ðyçÏ<€xÿüÿÿðþ?ÿ?ÿÀE‘‘AE@À@ÿøÿÿøÿüÿ€þÀESyàyçŽ8Oxÿðÿÿüÿøÿ€ÿüÀE6A€AD@ÿàÿüÿðÿÿøÀ9A€A7Þx€xÿÀÿ?üÿàÿƒÿðÀÿ€ÿüÿÀÿ‡ÿàÀÿÿüÿ€ÿÿÀÀ9EKKKðKè¼è¼è¼è¼sÀsÀsÀsÀÿÿüÿ€ÿÿ€ÀEERRRR¢¢¢¢Š Š Š Š ÿÿüÿ€ÿÿÀEP}cccàcÅ<Å<Å<Å<ú ú ú ú ÿ€ÿüÿ€ÿþÀE0ERRRR    Š Š Š Š `9EKKKðKâ â â â ‹À‹À‹À‹À`ÿàÿ?üÿ€ÿøÀÿÿøÿÿüÿÿÿÿøÀÿþÿÿÿðÿÿÿÿøÿÿÀÿÿÿÿÿÀÿÿÿÿøÿÿÀ€€€ÿÿáÿÿÿÿÿÿÿøÿÿÀððyȾr(œ‰à>sÏ€ÿÿùÿÿüÿÿÿÿøÿ??ÿÀøø‚,ˆ#(¢Š "(??üü‚*ˆ"¨¢‰À<#Ïýÿÿðÿ€ÿøÀþþ‚)ˆ"h¢ˆ "ˆþþyȈr'œ{À ro€ýÿÿ€ÿþÀüü?? ýÿÿ€ÿÿÀøøPPPýÿÿ€ÿÿ€Àðð8ŸEóˆô_ ýÿÿ€ÿÿÀÀððDPEHDPýÿÿ€ÿ‡ÿàÀüüààDžEçÈGÞ?ýÿÿ€ÿƒÿðÀþþøøD)HDPýÿÿ€ÿÿø àþþ?ü?ü8ßôOD_ÿýÿÿ€ÿ€ÿü??Àüüüüÿùÿÿ€ÿ€þ€þ?þ?þþþþÿñÿÿ€ÿ€?ÿ€ÿÿüü8óŸ8ä@9ðEðÿÿÿáÿÿ€ÿ€ÿþ€ÿÿø?ø?E@EEÿÿÿÁÿÿ€ÿ€ÿþ€ÇÇàððDá@Eà}àÿÿÿÿÿ€ÿ€ÿþ€ÃÃðøøDÀEEÿÿÿÿÿ€ÿ€ÿþ??Àááøüü9ã„8ä@9Eðÿÿþÿÿ€ÿ€ÿþ??À‡ð‡ðxþ?þ?ÿÿüÿÿ€ÿ€ÿþ??Àƒðƒð|~?~?ÿÿøÿÿ€ÿ€þ??Àøø~?~?~ âD8÷ßxÿÿðÿÿ€ÿ€<>>>™"™"™"™"ÿáÿáøøððçŸ<ðó€xãÎx‡ÀÿÿÇàÇàüüïÀïÀPAD@DDD„ÿÿƒàƒàüüððçž8àD@DCŸx‡€ñÇñÇñÇñÇœñœñœñœñ€€€€<<<<'<'<'<'<øøøøÿÿàà||ððD@D@QD„ˆˆˆˆˆˆˆˆ"‰"‰"‰"‰0000¢¢¢¢h¢h¢h¢h¢€€€€þþàà~~ààßyàC€xç‘x÷Àˆ‡ˆ‡ˆ‡ˆ‡>ñ>ñ>ñ>ñ¼¼¼¼¨¼¨¼¨¼¨¼ðððð~~àà~~ÀÀˆ€ˆ€ˆ€ˆ€¢‰¢‰¢‰¢‰¨¨¨¨(¨(¨(¨(¨€€€€~~ÿÿ>?>?€€ñÏñÏñÏñÏ"ñ"ñ"ñ"ñï€ï€ï€ï€&&&&'&'&'&'&øøøø??ÿÿ¿ÿ¿ÿ€€†ð"ûï<‹Ï€r/‰Ïœ{à??ÿÿ¿ÿ¿ÿŒˆ2"¢Š"‹(€Ê"‚¿ÿ¿ÿŸüŸü˜ð*#Ï<‹Âú¨€ª"ƒÀ{Ï{Ï{Ï{Ïûûûûç€ç€ç€ç€ÏÏÏÏ>y>y>y>yààààÿÿŸøŸø°ˆ&" (ŠŠh€š"‚‚(‚(‚(‚(ˆ"ˆ"ˆ"ˆ"(((( ‚ ‚ ‚ ‚þþàà ð"#é¦zŠ/‰Â{àsÏsÏsÏsÏ####ÇÇÇÇ’’’’ÏÏÏÏ‹ïú'"yà>‰Ï€sï¾{à¼ð‚ ˆŠ ""&ˆ Š"Š €€(ˆ"  À"ˆ  „ ‹é€"'"{ÀŠ"Š>x€&‹Â>˜À"Ⱦ˜˜00"ð€2!¼AÈ’ȾûÏ"óæ<ù眉à'@yÀ²ˆ €b#"B,”Œˆ‚(¢0ˆƒ¢‚Ê "@‚ ªˆ €b&z(’Ȉúiž<€†&ûωà'xžñÀ< p<@¾A"‹ï>0Çûïqà>Š/¢r'€r/¼ÀÇ3ï‹Ä>0 A"Š@ Ð( "€"?"Ê""#(Š("à)¦0ˆ¢Š$ 0©8B>"©€Š/<àʪ"‹Ä<0 A6 Š a pˆ‚" #ÿ@"˜|‚""h€‰H(à,²0Š"Š$ 0>yà"‹éa¾h¼#é€sÃÿ`"ˆ|‚"r'€p¦ðÇ0‰œ{Ǿ søÿàüð00óü‹€ÿÁðüø0ÿüÀ ÿÿÃùþø0ÿüÀ ÿÿãÿþüEEEEòòòòðððð8ÿüßà0ÿÿóÿþþ`EEEE|ÿþÿà0ÿÿÿÿþþà}}}}ââââàààà|ÿþÿàpÿÿÿÿÿÿðEEEE~ÿþ€ÿðxÿÿÿÿÿÀÿðEEEEóÏóÏóÏóÏàààà?ÿÿ€ÿðøÿÿÿÿÿ€Àÿð`€ÿÿÿÀÿøøÿÿÿÿÿ€Àÿø``ÀÿÿÿÀÿùüÿÏ0ÿÿÿÀ€Àÿøp`àÿÿÿÿàÿÿüïÉ6ÿÿÿáÀÀÏÿøøpð`ÿÿÿÿðŸ`ÿþÇ8~ÿÿÿñÀàßÿüøpø`ÿÿÿÿßøàÿÿÀ<Ï€0ÿñÀàÿÿÿüøüñÿ€ÿÿÿÿøðÿÿþÿ?ÀðÿûÀàÿÿÿüøþûÿ€ÿÿÿÿð ÏøÏÿ0ÿÿáøÿÿÀÀàÿùÿîüÿÿÿÀÿÿÿÿò ÎøÿpþÿáüÿÿàÀðÿùÿïüÿ€ÿÿàÿÿÿÿóŸ Þøƒÿ|üÿ óüÿÿáÀðÿùÿïƒ0ž`ÿÀÃÿÿðÿÿÿÿóþ þÿÿÿøÿ÷þÿÿñàðÿùÿïÏ0Ÿ`ÿðÃÿÿðÿÿÿÿóþ üÿÿÿðÿÿþÿÿûàø?ÿøçïÏ0àÿÿ?çÿýðÿÿÿÿóþ üÿ=ÿÂàÿÿÿÿÿÿðø?ÿøççÇ8Àðÿÿ€?·û@øøÿÿÿ€óþ üÿ<ÿÃÿÿÿÿ?ÿÀÿøøÿøG¸ã‡xæðÿÿà¿ñ@ðüÿÿþ€Áü>øÿÿãÿÿÿÿÿàÿüüÿÿøC¼á‚}öðÿÿÿÿŸá``ÿŸOÿ°þ?Àü~øÿÿãÿÿÿÿÿàÿþüçÿðüÀ?ýÿøÿÿÿÿŸà``ÿŸÿøü?À~ððÿÿ÷ÿÿÿÿÿàÿÿœüçÿðþÀ?ÿ?øÀ€ÿÿÿÿŸ€`ÿÿÿüÌ2àÿøÀ?ÿÿÿÿÿÿÿÿàÿÿüüçÿðþÀ?ÿÌà0€Àÿÿÿøðÿÿü?þÀˆváÿø€ÿÿÿÿÿÿÿÿàÿÿüüçùàÿ€ÿàðÀà`ÿÿÿðùÿÿü?üÀ€~áÿþ€ÿÿÿÿÿÿÿÿðÿÿüþãùàÿÿÿñø@€ð`ÿÿÿ€ÿÿÿÿÿÿ ÿóÿÿÿÿÿÿÿÿÿÿÿ€ÿÿüþAñ¾àÿÿ€ñø0À?øðÿÿþÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ?ÿÀü€üþpÿàÿ{þ„ñü0ÆÀÀüðÀÿÿøÿǾǾÿÿǾr/r/ÿÿr/€K€Kÿÿ€Kèžèžÿÿèž00ÿÿ0€x€xÿÿ€xÿÿààÿÿàÿÿÿÿü?ÀøþÏÿ0À?ÿ9þÆûþîÿ ÿø ÿÿàÿ((ÿÿ("("(ÿÿ"(RRÿÿR  ÿÿ 00ÿÿ0€€ÿÿ€ÿÿ ÿÿ ÿÿÿÿðàøÿ‡ÿxÀ?ÿþïÿÿþÿ  ÿü ÿþÿÿèèÿÿè"/"/ÿÿ"/ccÿÿcÅÅÿÿÅÿÿ€€ÿÿ€ÿÿÀÀÿÿÀÿÿÿÿÿÿ8Çÿÿ€€ÿ>ÿÁÿ€þÿ ÿþ ÿü ÿÿ((ÿÿ(!H!Hÿÿ!HRRÿÿRÿÿ00ÿÿ0€€ÿÿ€ÿÿÿÿÿÿÿÿÿÿ÷ÿÿø€ÿÿá>ÿÁ<Ãÿ ÿÿ ÿü ÿÿ'ˆ'ˆÿÿ'ˆppÿÿp€K€Kÿÿ€Kâ<â<ÿÿâ<00ÿÿ0€x€xÿÿ€xƒƒÿÿƒààÿÿàÿÿÿÿÿÿÿÿÿüÿÿÿñÿáçÿ  ÿÿ ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿûÿûÿÿ ÿÿ xÿxÿxžžÿÿž99ÿÿ9ß0ß0ÿÿß0ÑÑÿÿÑ}}ÿÿ}ÿÿààÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÿÿÀDÿDÿDÿÿEEÿÿEÿÿÿÿAAÿÿAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÿxÿxÿÿ}}ÿÿ}žžÿÿžÿÿyPyPÿÿyP==ÿÿ=ààÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>‹>‹ÿÿ>‹ÏœÏœÿÿÏœøøÿÿøð@ð@ÿ@ÿÿEEÿÿEPPÿÿPÿÿA0A0ÿÿA0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"Š"Šÿÿ"Š((ÿÿ(€€ÿÿ€ð@ð@ÿ@ÿÿD÷D÷ÿÿD÷Ÿ0Ÿ0ÿÿŸ0ÿÿ}}ÿÿ}ÿÿààÿÿàÿÿááÿÿáøøÿÿøGGÿÿG ÿÿ ""ÿÿ"çžçžÿÿçžÿÿÿÿ>Š>Šÿÿ>Š(ˆ(ˆÿÿ(ˆððÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€É€É€ÿÿÉ€ ÿÿ ""ÿÿ"  ÿÿ ÿÿÿÿ"Š"Šÿÿ"Š(ˆ(ˆÿÿ(ˆ€€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÿÿÁððÿÿðJ€J€ÿÿJ€ ÿÿ >>ÿÿ>Ç Ç ÿÿÇ ÿÿÿÿ>û>ûÿÿ>ûïœïœÿÿïœøøÿÿø==ÿÿ=ÿÿ9ã9ãÿÿ9ãÀÀÿÿÀÈÈÿÿÈxxÿÿxEEÿÿE÷Þ÷Þÿÿ÷Þÿÿÿÿ€€ÿÿ€L€L€ÿÿL€  ÿÿ ""ÿÿ"  ÿÿ ÿÿÿÿÿÿÿÿÿÿAAÿÿAPPÿÿPEEÿÿEÿÿÿÿDDÿÿDddÿÿdDDÿÿD``ÿÿ`ÿÿ€€ÿÿ€GGÿÿGÀÀÿÿÀ""ÿÿ"ïïÿÿïÿÿÿÿÿÿÿÿÿÿAAÿÿAŽŽÿÿŽEãEãÿÿE ÿÿ€÷ˆ÷ˆÿÿ÷ˆxxÿÿxTTÿÿTGžGžÿÿGžððÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘‘ÿÿ‘ÿÿAAÿÿAÿÿE@E@ÿÿE@@@ÿÿ@ÿÿ@@ÿÿ@LLÿÿLDDÿÿD``ÿÿ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’’ÿÿ’ÿÿ<<ÿÿ<ôÞôÞÿÿôÞ9797ÿÿ97€€ÿÿ€ÏÏÿÿÏ@@ÿÿ@DDÿÿDGÓGÓÿÿGÓÿÿøøÿÿøˆˆÿÿˆÿÿñÇñÇÿÿñǾ¾ÿÿ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ˆ€ˆÿÿ€ˆ ÿÿ Š(Š(ÿÿŠ( ÿÿ IIÿÿIÿÿÿÿÿÿ““ÿÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿ €ˆ€ˆÿÿ€ˆÿÿóèóèÿÿóè<<ÿÿ<IIÿÿIÿÿÿÿÿÿ‘‘ÿÿ‘€€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@@ÿÿ@€P€Pÿÿ€Pÿÿ‚(‚(ÿÿ‚( ÿÿ IIÿÿIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøÿÿø ÿÿ <<ÿÿ<‚'‚'ÿÿ‚'¾¾ÿÿ¾IIÿÿIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  €T** yet another LINE by LINE commented 68000 source file * from Budgie UK, based on a routine by MUG * These LINE by LINE commentaries are for absolute beginners * to 68000 machine language * Also available: raster2.s (multi-color interrupt) * and shell1.s (game backbone) * Budgie UK December 29, 1989 * 5 Minster Close Rayleigh Essex SS6 8SF * This routine will work in 50 or 60hz but not in 70hz *------------------------------------------------------- clr.l -(sp) ; decrement stack pointer by FOUR bytes, THEN clear that address ; clr.l means: put a LONG word zero (ie %00000000 00000000 00000000 00000000) move.w #$20,-(sp) ; once again, we decrement the stack pointer, THEN, we place the ; value $20 in the address pointed by it ; notice the hash ; move.w #$20,d0 means put $20 in d0 ; move.w $20,d0 means put the CONTENTS of location $20 in d0 trap #1 ; gem call: go supervisor addq.l #6,sp ; back to our program. We did decrement the stack pointer by 6 bytes, ; (ie one LONG and one WORD). We now increment it by 6 to restore ; it as we found it. addq.l means add quick a LONG word ; the above FOUR instructions were one of those many TRAP CALLS ; where ready-made routines in ROM OS are called. move.l d0,super ; the gem call we just made returned us an address in d0 which was ; the user stack. We shall need it again upon exit. ; let's store it for now in a variable called 'super' movem.l $ff8240,d0-d7 ; above instruction moves EIGHT consecutive LONG words in one go ; it's called multiple move. ; we take the contents of $ff8240, $ff8244, $ff8248, etc... ; and copy them in d0,d1,d2,d3,d4,d5,d6,d7 ; $ff8240 is where the palette is stored movem.l d0-d7,palette ; now we dump all eight registers, in one go, inside an array ; called 'palette'. The idea is to save default palette in a safe ; place so that we can retrieve it later when we exit ; have a look at 'palette' at the end of this prog: ; you'll find a RESERVED space for 16 words (ie 8 LONG words) pea text(pc) ; this means push effective address of text onto the stack ; text is a message that will be found at the end of this program ; this instruction is (pc) relative. It means it will work accurately ; no matter where in memory this program is loaded. ; (pc) relative coding is fairly rare. It has been adopted here ; because this program will end up on the boot sector ; move.l #text,-(sp) does the same job as pea text(pc) ; so does lea text,-(sp) ; but of course, they are NOT (pc) relative move.w #9,-(sp) ; the number 9 is now pushed onto the stack trap #1 ; another trap call: this time a string output routine addq.l #6,sp ; once again, we adjust stack pointer at the end of it pea off(pc) ; we push effective address of 'off' onto stack ; we intend to ask the ikbd to stop reporting mouse events clr.w -(sp) ; somehow a LONG zero is required, so we push that as well move.w #$19,-(sp) ; now we push function number $19 trap #14 ; the above trap instruction passes control to appropriate vector ; which in turn points to the right routine addq.l #8,sp ; rectify stack pointer when all done move.w #5,-(sp) ; disable #5 interrupt on mfp move.w #$1a,-(sp) ; function $1a deals with mfp interrupts trap #14 ; trap 14 does it addq.l #4,sp ; correct stack pointer (2 WORDS, hence addq.l FOUR bytes) lea pal_start(pc),a5 ; load effective address of pal_start inside a5 lea pal_end(pc),a6 ; now pal_end in a6 clr.l d2 ; move a nought in d2 (LONG word) ; d2 will be used as a counter. Sometimes we count backwards. ; In this case, we'll start at zero move.w #$777,$ff8242 ; put value $777 (white) inside $ff8242 (ink color) move.l $70,-(sp) ; $70 is the system vertical blank vector (pointer) ; we've got to perserve it. We can either store it in a variable ; or, like here, store it on the stack lea new_vb(pc),a0 ; load effective address of new vertical blank routine in A0 move.l a0,$70 ; now put the address in A0 inside $70. We now have a new ; vertical blank routine. ; Had we not required (pc) relative coding, the above two instructions ; could have been merged into one: move.l #new_vb,$70 ; ie put the ADDRESS of new routine inside $70 move.l $68,-(sp) lea new_hb(pc),a0 move.l a0,$68 ; same thing with the $68 vector (horizontal blank routine) andi #$f8ff,sr ; and the status register with $f8ff ; and.w would also have been ok. The assembler would change ; and.w into the more accurate andi (and immediate) ; notice the hash (#) (immediate value) ; the effect of this instruction is to set the interrupts level a cmp.b #$73,$fffc02 ; a is a label ; $fffc00 is the acia chip control register (the one that reports ; k/board and joystick interrupts from the ikbd) ; $fffc02 is the data register ; any byte received is stored in this register ; the above instruction checks $fffc02 against the value $73 ; above instruction NOT recommended in mono 70 hz bcc.s a ; branch if carry clear to a (the .s means short ie within 128 bytes) ; in doubt don't put the .s and let the assembler maximize the code ; if carry is clear (ie byte less than $74) we're not interested ; it's probably a mouse value ; the above two intructions will detect a keypress or a fire button ori #$0300,sr ; we're about to leave, so restore status register as normal move.l (sp)+,$68 restore vectors move.l (sp)+,$70 ; retrieve the two vectors saved on stack ; last first! notice the synthax, with + AFTER the (sp) move.w #5,-(sp) enable #5 interrupt move.w #$1b,-(sp) trap #14 addq.l #4,sp pea on(pc) resume mouse reporting clr.w -(sp) move.w #$19,-(sp) trap #14 addq.l #8,sp movem.l palette,d0-d7 movem.l d0-d7,$ff8240 ; retrieve palette from the array at 'palette' ; and multiple move all 16 WORDS in one go! superout move.l super,-(sp) ; retrieve user stack pointer from our safe variable move.w #$20,-(sp) trap #1 addq.l #6,sp ; we're now back in user mode quit move.w #0,-(sp) move.l #1024*6,-(sp) move.w #$31,-(sp) trap #1 ; terminate and stay resident super dc.l 0 ; the above long word reserved to store the old user stack address palette ds.w 16 ; above 16-word array used to use initial palette rts ; above rts needed if run from boot sector new_hb move.w #28-1,d1 ; put 27 in data register d1 ; we'll use it as a loop counter (28 times) .loop dbra d1,.loop ; deduct one from d1, check if reached zero, and if not go back to .loop ; the above two lines are a time delay ; equivalent to basic's for x=1 to 28:next addq.w #1,d3 ; add 1 to data register d3 cmp.w #150,d3 ; compare d3 with number 154 ; try changing this number to get different patterns ; but don't try 1 (bombs) bcc.s .a ; branch if carry clear to .a cmpi.w #$fff,(a5) ; check if the CONTENTS of location pointed to by a5 is $fff ; (our end of palette marker) bne.s .c ; branch if not equal to .c ; try removing above line: top pattern will disappear lea pal_start(pc),a5 ; load effective address of pal_start in a5 .c move.w (a5)+,$ff8240 ; get the word pointed to by a5, (ie the first word in the palette array) ; and put that color in $ff8240, (the border register), ; THEN, increment address register a5 by TWO rte ; return from exception (end of horiz blank interrupt routine) .a cmpi.w #$fff,(a6) bne.s .d ; removing above line will cancel bottom pattern lea pal_start(pc),a6 .d move.w (a6)+,$ff8240 rte ; above 4 lines already described, except that a6 is used new_vb moveq #0,d3 ; put a zero in d3: starting counter lea pal_start(pc),a5 ; try lea 0,a5 or try lea $466,a5 for random colors lea pal_end(pc),a6 ; don't try anything fancy with a6, as it gets DECREMENTED further down ; should it drop BELOW zero, bombs will appears... adda.l d2,a5 ; add d2 to a5 (ie: increment that address with our d2 counter ; which initially was nought) a5 now points somewhat HIGHER in memory ; ie further up the array ; add.l d2,a5 is also acceptable (adda.l d2,a5 is the proper version) suba.l d2,a6 ; subtract d2 from a6 (in other words: get a6 to point somewhat LOWER ; in memory). When adding and subtracting to address registers, use L addq.l #2,d2 ; increment our counter ; the q is not indispensible (add.l #2,d2 is also OK) cmpi.w #$fff,2(a5) ; see where a5 points to. ADD TWO BYTES to that location, ; and get that WORD. See whether it is $fff. ; suppose a5 points to $78000. The above instruction checks whether ; locations $78002-78003 contain $fff ; this addressing mode is essential in understanding how ARRAYS ; are accessed. Study it thoroughly. bne.s .a ; branch if not equal to .a moveq.w #0,d2 ; else reset counter .a rte ; end of vertical blank interrupt routine pal_start dc.w $000,$000,$101,$000 dc.w $101,$102,$101,$000 dc.w $000,$000,$101,$000 dc.w $101,$102,$101,$000 dc.w $000,$000,$101,$000 dc.w $101,$102,$101,$000 dc.w $000,$000,$101,$000 dc.w $101,$102,$101,$000 dc.w $000,$000,$101,$000 dc.w $101,$102,$101,$000 dc.w $000,$000,$101,$000 dc.w $101,$102,$101,$000 dc.w $000,$000,$101,$000 dc.w $101,$102,$101,$000 dc.w $101,$202,$301,$400 dc.w $401,$302,$200,$100 dc.w $220,$330,$441,$220 dc.w $101,$201,$301,$400 dc.w $501,$600,$703,$600 dc.w $500,$400,$301,$200 ; above 80 words are colors used by interrupt routines ; try changing them (range allowed $000 to $777) (R-G-B) ; you may delete some of them, or add more colors (up to a point) pal_en dc.w $0 pal_end dc.w $fff off dc.b $12,0,0 on dc.b $8,0,0 text dc.b 27,69 clear screen (mouse disappears) dc.b 27,98,1 ink color 1 try colors 2,3,stc.. dc.b 10,10,10,10,10,10,10,10,10,10,10,10,10 line feeds dc.b " Hello. Budgie UK presents",10,13,0 ******* this little program is commented line by line ******** * if you want a slightly more advanced assembly language * * program with line by line commentary, please write to * ***** Camy Maertens at Budgie UK *************************** ; this little one generates more than 16 colors in one line ! ; based on an idea from T. Crowther on the '64 (one or two centuries ago) ; ST programming and calculator typing by Es from TEX ! ; slightly modified to allow exit to desktop by Camy of Budgie UK * star or ; required if comment is at first character pos start ; a label must start at the first character position clr.l -(sp) ; supervisor mode on ; decrement stack pointer by 4, then put 4 nought bytes there move.w #$20,-(sp) ; decrement stack pointer (a7) by 2, then put $0020 in it ; # means immediate value ; w means word (2 bytes) trap #1 ; call gem routine number 20 that handles supervisor mode addq.l #6,sp ; restore stack pointer ; we deducted one long word in the first instruction ; then a word in the second instruction. That's a total of 6 bytes ; we must therefore now add 6 bytes to the stack pointer move.l d0,old_stack ; take address in D0 (returned to us by gem) and store it in ; a variable called old_stack ; addresses are usually Long words (ie 4 bytes) dc.w $a00a ; special instruction: causes an exception. turn mouse off move.w #$2700,sr ; put the value $2700 inside status register: shut all interrupts ! ; try #$2500,sr (allowing k/b interrupt) and see massive difference move.b #02,$ff820a ; put a byte $02 inside register $ff820a: activate 50 Hz vertical sync . move.w #32000,d0 ; put a value 32000 inside d0 ; must be Word. Highest possible byte is 127 or 255 ; highest possible word is 32768 signed or 65536 unsigned ; this one here is a loop . Highest loop allowed: 32768 loop: ; this is a label move.w #$777,$ff8240 ; put the word $0777 inside register $ff8240 ; ie make border white move.w #$766,$ff8240 ; now, put $0766 in it move.w #$755,$ff8240 ; and so on move.w #$744,$ff8240 move.w #$733,$ff8240 move.w #$722,$ff8240 move.w #$700,$ff8240 move.w #$710,$ff8240 move.w #$720,$ff8240 move.w #$730,$ff8240 move.w #$740,$ff8240 move.w #$750,$ff8240 move.w #$760,$ff8240 move.w #$770,$ff8240 move.w #$761,$ff8240 move.w #$752,$ff8240 move.w #$743,$ff8240 move.w #$734,$ff8240 move.w #$725,$ff8240 move.w #$716,$ff8240 move.w #$727,$ff8240 move.w #$737,$ff8240 move.w #$747,$ff8240 move.w #$757,$ff8240 move.w #$767,$ff8240 25 entries, but only 20 different colors dbra d0,loop ; deduct one from loop counter in D0, ; check whether counter has reached zero ; and if not, repeat operation: go back to label loop ; all in one instruction! (dbra) move.w #$2300,sr ; move a word $2300 in status register: restore interrupts dc.w $a009 ; illegal instruction. causes an exception: mouse back on move.l old_stack,-(sp) ; decrement stack pointer by 4 THEN ; put the contents of variable 'old_stack' on stack ; sp is the same as a7 move.w #$20,-(sp) ; same again; this time put $0020 there trap #1 ; causes an exception. turn supervisor off addq.l #6,sp ; add 6 bytes to register A7 (ie stack pointer) clr.l -(sp) ; decrement stack pointer by 4, then put $00000000 there trap #1 ; a gem call: quit. back to desk top old_stack dc.l 0 declare initial value as 0 oldpal ds.w 32 reserve space for 64 bytes ; dc.l 0 means define a long word with initial value 0 ; dc.l 3 means define a long word with initial value 3 ; ds.l 3 means reserve space for 3 long words (12 bytes) ; dc.b "hello",13,0 means reserve space for 7 bytes and put ; h-e-l-l-o-13-0 in them  |Ÿ±/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLß |£^N¹PÄHç`à?<NAT@ßLß |§N¹PÄHç`à?<NAT@ßLß |ªN¹PÄHç`à?<NAT@ßLß |¬·N¹PÄHç`à?<NAT@ßLß |¯”N¹PÄHç`à?<NAT@ßLß |² N¹PÄHç`à?<NAT@ßLß |´èN¹PÄHç`à?<NAT@ßLß |·)N¹PÄHç`à?<NAT@ßLß |¹²N¹PÄHç`à?<NAT@ßLß |¼(N¹PÄHç`à?<NAT@ßLß |¾uN¹PÄHç`à?<NAT@ßLß |À´N¹PÄHç`à?<NAT@ßLß |ÂòN¹PÄHç`à?<NAT@ßLß |ÅUN¹PÄHç`à?<NAT@ßLß#ùY^N¹P8`ñ4#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß |N¹PÄ |˜¼N¹PÄHç`à?<NAT@ßLßHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq |N¹PÄ |™ŸN¹PÄ<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4NqHç`à?<NAT@ßLß#ùY^N¹P8`ïî#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßü <  Á <  |›6/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLßHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßü <  Á <  |›Ÿ/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLßHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßü < Á <  |›û/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLß#ùY^N¹P8`îdAùø#È `óÄHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß`î0#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßü < Á <  |ä/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLßü < Á <  |ä/ |N¹PÄ _N¹PÄHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß#ùY^N¹P8`í.#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßN¹A0#ùY^N¹P8`ìÚ<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß |•1N¹PÄHç`à?<NAT@ßLßa[Z#ùY^N¹P8<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq`ëèAùø#È `ñHHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß`ë´HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß`ëùœ`ë„yÉÒ`ëv,yN#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq |–vN¹PÄa<`êìyˆ9ˆgAùÊýN¹Ok.`AùÊçN¹Ok yË2 <N¹OÔN¹P`ê˜`ê’ <°¼gJ€g`N¹Y`N¹Y0 9f°¹fgÿø.¹ yNÐ#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß |N¹PÄ<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4NqüAùN¹PÄ |N¹PÄHyŒ?< NA\` DUMP SCREEN to disk Hy´?< NA\`are you sure? << #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4NqHç`à?<NAT@ßLßH@°<fa=`#ùY^N¹P8`èædump screen to disk. Are you sure?0<ãHAùÉòÐÀ0¹Éð yË>Ñül¸"yY Óü5ÀÓü.<LØ €ƒ2H@€AF@B2HA2Ñ…™Ã‘‡™Ðü˜Òü˜QÏÿÖ0<ãHAùÊÐÀ0¹Éð`èF3üÊB`#ùNY yË^Ñü}p"$&(*,"F$I&J(K*L,M~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~QÏÿZHàø#ùË^^N¹P8ü<’JyÊBgAùÊ\N¹O`AùÊ¿N¹Ok(v |Ì <"N¹OÔ/AùÌ"|ÿ‚@<<2ØQÎÿü, yË^ H <}N¹OÔN¹PHç`à?<NAT@ßLß#ùY^N¹P8/AùËö"|ÿ‚@<<2ØQÎÿü,ü<’H瀀Aùÿˆ<€|ÿ°<kÿîLß3üÊB`æ\#ùËJ^N¹P8`æH#ùËN^N¹P8`æ4#ùËR^N¹P8`æ #ùË>^N¹P8`æ #ùË^^N¹P8`åø#ùËZ^N¹P8`åä#ùËV^N¹P8`åÐ#ùNY?<?<?<#NN\ù„ yNÑùÊD#È^Hç`à?<NAT@ßLßH@°<Hgÿº°<PgV°<&gùú°<-gù´°< gû?9ÉÚ?9ÉÜ?<#NN\#ùY^ 9f°¹fgÿø`å,#ùNY?<?<?<#NN\ü |ü ù„ yN‘ùÊD#È^Hç`à?<NAT@ßLßH@°<Pgÿª°<Hgþþ°<&gùF°<-gù°< gúb?9ÉÚ?9ÉÜ?<#NN\#ùY^ 9f°¹fgÿø`äx`ät`äpHçÿHçÿ#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßü < Á <  |/ |N¹PÄ _N¹PÄLßÿa2^ |N¹PÄü AùN¹PÄ |N¹PÄ |':N¹PÄ |N¹PÄü AùN¹PÄ |N¹PÄB€BB‚BƒB„B…B†B‡AùÉò04(8(AùÊ26(:(<9Éä>9~a1ºüAùN¹PÄ |N¹PÄü < Á <  |/ |N¹PÄ _N¹PÄB€BB‚BƒB„B…B†B‡09ÉÖ29Ë‚49Éä69Éä89Ër:9Ër<9Ër>9Ëra1 9Éæ"< a-äü < Á <  |RÐ/ |N¹PÄ _N¹PÄ 9ËN"<a-”ü < Á <  |RÐ/ |N¹PÄ _N¹PÄ 9ËR"<a-Dü < Á <  |RÐ/ |N¹PÄ _N¹PÄ 9Y "<a,ôü < Á <  |RÐ/ |N¹PÄ _N¹PÄ 9Y"<a,¤ü < Á <  |RÐ/ |N¹PÄ _N¹PÄ 9Ë^"<a,Tü < Á <  |RÐ/ |N¹PÄ _N¹PÄ9ÉÍHÀ"<a,ü < Á <  |RÍ/ |N¹PÄ _N¹PÄ 9ÉÀ"< a+²ü < Á <  |RÐ/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLß#ùY^ 9f°¹fgÿøLßÿ`ßæHY & : before 0 (stopwatch) Y!& : after 0 Y"& : before 1 Y#& : after 1 Y$& : before 2 Y%& : after 2 Y&& : store (w)..... Y'& : scroll index.. Y(& : level Y)& : lives Y*& : store Y+& : store Y,& : score Y-& : total_score.. Y.& : detector music delay...... Y/& : total_rescued.......... Y0% D0 screen 0 Y1% D1 screen 1 Y2% D2 screen 2 Y3% D3 logical Y4% D4 physical Y5% D5 workscreen Y6% D6 joystick value Y7% D7 random `ùX |N¹PÄ<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4NqHy)¶?< NA\` FATAL ERROR! Hy)Ø?< NA\`stack corrupted << #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4NqHç`à?<NAT@ßLß`8ùNæ |Ë&|¢a!ð¹Næ#ùËJ^N¹P8<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq |N¹PÄüAùN¹PÄ |N¹PÄHy*ð?< NA\`here we go! AùÊpN¹Okn |Ëô <N¹OÔ |Ëö < N¹OÔ yË^Ñü}p"$&(*,"F$I&J(K*L,M~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~QÏÿZHàø yË^Ñü%€ H <N¹OÔN¹P/AùËö"|ÿ‚@<<2ØQÎÿü,#ùË^^N¹P8ùNæ |Ê\&yËZ—ü"N¹LJ¹Næ4<"6<l8<=X:<"N¹Tn4<"6<l8<=X:<"N¹Tn4<"6<l8<=X:<"N¹Tn4<"6<l8<=X:<"N¹Tn4< 6<l8<=X:< N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4< 6<l8<=X:< N¹Tn4< 6<l8<=X:< N¹Tn4< 6<l8<=X:< N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn4<6<l8<=X:<N¹Tn yËZÑüÿÿÿàa%º#ùËZ^N¹P8 yË^Ñü}p"$&(*,"F$I&J(K*L,M~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~Hàþ~QÏÿZHàø |ÊH,|Ë*N¹LJùNæ |Ê…&yËR—ü"aĹNæ yËR‘ü a$Ž.< ¸ yËRa)dQÏÿô#ùËR^N¹P8*yË**<~W(<N¹~J9~ØgÿàH瀀Aùÿˆ<€|ÿ°<kÿîLßHçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßa a üH瀀Aùÿˆ<€|ÿ°<kÿîLßHç<<2*9fº¹fgÿøQÎÿîLß`#ùËZ^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLßAùʘN¹Ok yË^ <"N¹OÔ |`œ <N¹OÔ 9N€# yË^ N¹OÔN¹P><GFyÿ‚@Hç<<*9fº¹fgÿøQÎÿîLß`Fyÿ‚@Hç<<*9fº¹fgÿøQÎÿîLß`QÏÿ².9N‡#"yË>N¹`°ùNæ |Ê­&yËR×üÿÿÿÞN¹LJ¹Næ yËR‘ü "|Ëö H"I <2ØQÈÿü/AùËö"|ÿ‚@<<2ØQÎÿü,3ücËv3üËt3üÉØ3üÉÖNuMùFÝüg /aÖ.¾<€g<ÇÉÍga0gaLgajgaxùÉÍNun® Jnn’n® `€n®  n´khn® `Vn n nFn `<n n k,n `"Fyÿ‚@Fyÿ‚@Aù‹\N¹YLü<’NuMùF:. <.EF…ÿÿ†ÿÿ yY 02N¹w‚´|g`†><è3üwÿ‚@QÏÿö><è3üÿ‚@QÏÿö><è3üwÿ‚@QÏÿö3üÿ‚@`J yNÑùÊD#È^ 9f°¹fgÿø yN‘ùÊD#È^ 9f°¹fgÿø`NuMùFÝü J.g6J.fn n k|Nun n nB.NuMùFÝü@J.g6J.fn n k|Nun n nB.NuMùFÝü`J.g6J.fn n k|Nun n nB.NuMùFëˆÝÀJ®fNu .ÓÀÑÀ<. éN < F>.G<. F"Ø"Ø"Ø"ØQÎÿöÑÀÓÀQÏÿæJ.f -nB®NuMùFëˆÝÀJ.gJ-n(.*.>.<. 2. B‚4âJBÿøÚ‚-E-EçN < F(@Q€*@a*°Nu9ËŠgÓü €MùFëˆÝÀJ.gÿÜ*.>.<. 2. B‚4âJBÿøÚ‚çN <ˆF*@ÑÅ"ÈG<. F"Ø"ØQÎÿúÑÍÑüQÏÿæNu9ËŠgÑü €MùFëˆÝÀ>.<. çN <ˆF*@"P&HJ˜g$G<. F"Ø"ØQÎÿúÓÍÓüQÏÿæB“NuHçÿþJ9<’f|üÿˆüøÿˆ 9<ˆgaÜAù9ÖCù;ŽEù:Ü093ü~Aù~Cù~JQk`P Pk`P PçkDQN¹|þNuAùw‚|B|S´N¹y‚Hy= ?< NA\` repaired Hç`à?<NAT@ßLß`Ç #ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß |N¹PÄ<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nqü AùN¹PÄ |N¹PÄHy=ä?< NA\` * ùY¤9Y¤g¹Y¤Aù¢a@`ÿàBƒEù¢*J&J(JÖüØü ><0AùP¤aòAùP¤4<a>†AùP¤ab |W0N¹PÄ |W0N¹PÄ6ÆüØà La<ÔüÖü(MÙü AùŠHaªQÏÿš3üÿ‚@<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4NqNuHçÿþCù¢Òü Aù¢Ðü0¹ËrAù¢ÐüBƒ6ÆüAù¢Ðü Ið0(< ÙQÌÿüAù¢N¹Y`LßÿNuN¹Yì#ùNY#ùË^^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß |N¹PÄ<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4NqüAùN¹PÄ |N¹PÄ:< *|¢Ûü ü.QÍÿú |P†0< ü QÈÿúü < Á <  |A/ |N¹PÄ _N¹PÄN¹PJ>< |P†"|¢Óü °< g6°<.g.°<`k °<Zn°<Ak°<Zn`< ÀQÏÿ¾<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq#ùY^N¹P8NuYour Name... yÉðNs |–BN¹PÄHç`à?<NAT@ßLß°<YgNu&<Aù¢0üQËÿúNu&(²ƒk*&(²ƒn &(´ƒk&( ´ƒn 3üA¬Nu3üA¬NuAùY "P$h!I Š#É^?<ÿÿ/ / ?<NNOï Nu y2ËtnNuByËtAùËvP0AùP¤N¹RÑüC€ÑÀ"yY $yYÓü,PÕü,P"¨$¨#h  %h  #h@@%h@@#hàà%hàà#h€€%h€€#h  %h  #hÀÀ%hÀÀ#h``%h``#h%h#h  %h  #h@@%h@@#hàà%hàà#h€€%h€€#h  %h  #hÀÀ%hÀÀ#h ` `%h ` `‘ÀB€.0çÑÀÓüÕü"$#h  %h  #h@@%h@@#hàà%hàà#h€€%h€€#h  %h  #hÀÀ%hÀÀ#h``%h``#h%h#h  %h  #h@@%h@@#hàà%hàà#h€€%h€€#h  %h  #hÀÀ%hÀÀ#h ` `%h ` `yË€NuMùFÝü,¼w@-|@=| =| =| =|2-|@-|-|||MùFÝü ,¼ -| €=|=| =| =|-| €-|-|||MùFÝü@,¼¨-|@=|=| =| =|2-|@-|||MùFÝü`,¼ -|Q@=|=| =| =|‚-|Q-|||MùFÝü€,¼ -|@=|=| =| =|2-|@-|||MùFÝü ,¼B@-|]À=|=| =|  =|–-|^-|||MùFÝüÀ,¼>€-|]À=|&=| =|  =|–-|^-|||Nu yNÑùÊD#È^a Nu yN‘ùÊD#È^aúNuH瀀Aùÿˆ<€|ÿ°<kÿîLß3üËt3ücËvAùÉÖP#ùËN^N¹P8 yËN‘ü a ŒHç<<2*9fº¹fgÿøQÎÿîLß`#ùËJ^aj |Ëöa Ta <`¼¤3üËtAùŠHaZHç<<*9fº¹fgÿøQÎÿîLß`aÖ3ùËrËraöÎGù¢AùËa&<da:axaôèHç`à?<NAT@ßLß3üËr3üÉØ3üÉÖavNuüÿú9Ëxg |A&aŠ¹Ëx*|7>a H瀀Aùÿˆ<€|ÿ°<kÿîLß`ÐN¹wNAùw‚ÐüN0<° ÿÁQÈÿöN¹y¶Hç`à?<NAT@ßLßa0r`ÿfN¹wNAùw‚|`|8Ðü:CùI¦><ÈÙQÏÿüHyIR?< NA\`OK READY TO WRITE HyIv?< NA\` PRESS KEY N¹y¶Hç`à?<NAT@ßLßN¹y‚`þÖAúT/?< NA\><dyÿ‚Byÿ‚@a$QÏÿê><yÿ‚Byÿ‚@aQÏÿêNu<<èNqNqQÎÿúNu  BILL AVERY IS VIRUS FREE ! ALL CIRCUITS OPERATIONAL.. (Ha¸J@kbaÀ#ÃN9NæfaÀ LaJ@kŠaa8NuùNäHyLž?< NA\` E R R O R 3ü"ÿ‚@Nu |N¹PÄHyLÒ?< NA\`getsize/press key 3üÿ‚@Hç`à?<NAT@ßLßNu |N¹PÄHyM ?< NA\` open E 3üpÿ‚@NuHyMD?< NA\`read error |N¹PÄ3üÿ‚@Hç`à?<NAT@ßLßNuHyMŒ?< NA\`close error |N¹PÄ3üwÿ‚@Hç`à?<NAT@ßLßNu |N¹PÄHyMà?< NA\`gemdos error Hç`à?<NAT@ßLßNuBg/?<NNAPNu?</NAT @&( <Nu/?<HNA\J€ggR€&@,€NuHyN^?< NA\`malloc error Hç`à?<NAT@ßLßNu?</?<=NAP43ÀNâNu/ /?9Nâ?<?NAßü J€kþ~Nu?9Nâ?<>NAXJ@kþ°Nufile not found ahJ@ka„?aÿÀ0J@k0NuHyO?< NA\`ERROR. creating file.. NuHyOB?< NA\`write error Nu?</?<NAXNu/?<INA\J€ký¢Nu/?<INA\J€kýNuHçàà?<%NNTLßNu |P†0<üQÈÿú |P„/üü?< NA\ |P„ÐÀ0¼NuHçðð/?< NA\LßNuY ?<?<NNXNuHçððBg?<NNLßNu "h$hBi3|  Nu   Nu?<NAT@ßNu?<ÿ?<NAXNuB9ÿüJgÿô¹ÿúNuHçüü/<?< NA\B§?< NA\#ÀQxLß??NuHçüü/9Qx?< NA\Lß??Nu?<NNTNua €aºaD#ùY^ |Rap9ÿúgad3üÿ‚D3üÿ‚Fù„aÿ”?<?<?<#NN\?<?<LNABg/9R4?91NAwwU33ss77wHçÀ€< J@j<-D@ÁÑü2<HÀü H@0H@QÉÿîLßNuÿ²¼g²¼g"< Aú,><ü QÏÿú€ÁH@@0 @9o^@B@H@fÿæNu/0<ˆJ@WÈÿüJEWÍÿò NuHçpð?<NNTLßNu?<?<?<NM\?<"NNT @ÑüCúZ"Cú ‰NuHçÀCúL¨hLßNu?<"NNT @Ñü º$?<€?<?<NM\?<?<?<NM\Nu?<?<?<NM\?<"NNT @ÑüCú¢"Cú ‰NuHçÀCú”B@(H€ÑiJijBi i.k3|.B@(H€ÑiJijBi iºk3|ºLßNu?<"NNT @Ñü º$?<€?<?<NM\?<?<?<NM\Nu <äK"yNÒÄ$yNÕü ÔÄ20$ÙQÈÿü“ü¤’Æ•ü¤”ÆQÉÿæ$yNÔü ÔÄ0Óü "ÚQÈÿüQÊÿ°NuHçð€Aùÿ‚@0¼P= Ppk0¼"<QÉÿþQËÿäLßNuHçð€Aùÿ‚@/0¼"<ÈQÉÿþ0¼w"<ÈQÉÿþQËÿâ ŸLßNuHçàà/?<NN\LßNuLùÿÿ‚@HùÿËöLúÿ Hùÿÿ‚@Aú aü¸aû€ yË^ N¹OìN¹PNugive it a name (***.pic) ><GFyÿ‚@Hç<<*9fº¹fgÿøQÎÿîLß`Fyÿ‚@Hç<<*9fº¹fgÿøQÎÿîLß`QÏÿ²B¹ÉäØÉç/Hçÿ~ 9Éä"< aõ> < °¼g°¼ g |RÆ` |RÆ` |RÆLß~ÿü < Á <  H/ |N¹PÄ _N¹PÄHç`à?<NAT@ßLß _H@°<afÿLNu??<NNXNu??<NNXNu/<ÿÿÿÿ???<?<NNßü Nu/???<?<NNßü Nu/??< NNPNu#ùËZ^N¹P8HçÀ€ yN0<Ïr Á Á Á ÁQÈÿöLß<< #È|² #Ù|¶#Ñ|º¼|g"yË.N¹|>`"yË2N¹|4Nq |N¹PÄ |–vN¹PÄañª 9f°¹fgÿøAùP†N¹OJ@k |XÔ <"N¹OÔ |`žN¹PÄHç`à?<NAT@ßLßH@°<pg°< g °<!gü`œ` üÿ`œ yN <}N¹OÔN¹P/AùXÖ"|ÿ‚@<<2ØQÎÿü,.<} yËZ"yË^B†9`œ‡g¢Jy`šg`À¹Éæ°g,J9`˜gB9`˜ÒüÀ¹ÉæBy`š`ÿ¬3ü`š9`˜¹`˜ 9}`˜fÿŠ9`˜¹`˜ü`˜F|Òü¹Éæ`ÿX |\¢N¹PÄað" 9f°¹fgÿøAùP†N¹OR |XÔ <"N¹Oì |`œ <N¹Oì 9Éæ yË^ N¹OìN¹PNureference_byte B¹ÉæB…B† yË^9`œ‡gJ€°gÐü¹ÉæÒü`ÿØB…(JgEÆQÍÿüÐü¹Éæ`ÿ°Nu&IÑÄÓÅEùaì/>.G8. DLØ €ƒ2H@€AF@4À$Â$ÃQÌÿèÑÌÓÍQÏÿØ Aùaì"KÓÅ>.G<. Frÿtvxz2468:à©àªà«à¬à­ÃQ…YÃQ‡YÃQ‰YÃQ‹YQˆ"Tˆ$Tˆ&Tˆ(Tˆ*TˆQÎÿÄ2<ÿÿBBBCBDBEà©àªà«à¬à­ÃQ…YÃQ‡YÃQ‰YÃQ‹YÓÍQÏÿ†Nu yNÑü@&H$H"H‘ü Õü $< "< <g# &ÚQÈÿú <'#<&üQÈÿòÑü ÓüÀ×ü@ÕüàQÉÿ‘ü}“ü}•ü}—ü}Hç<<*9fº¹fgÿøQÎÿîLß`QÊÿ€NuÂü 6âKCÿøÒCÐÁ@D@@v2âJe`Á0ÁQËÿðNuBBÂü 6âKCÿøÒCÐÁ@D@@xv2f ‚` ÂDQËÿêNu?<?<?<?<?<B§/<w‚?<NNßüJ@g`ZNu?<?<?<?<?<B§/<w‚?< NNßüJ@g`&Nu?<?<ÿÿ/<ÿÿÿÿ/<w‚?<NNßüNu°|ÿïg°|ÿógz°|ÿþgæJ@kRNu3üpÿ‚^üAùN¹PÄ |N¹PÄ |N¹PÄHyz<Ÿ0€X€X€X @ÿÿÁYÁYÁYÁY"ƒ›"ƒ›QÏÿâNu y|¶` y|º(y|²™ü0(R9@ÿØ2,ÂÀ9AÿÞr2,‚ÀSA9AÿÜr2,ÿú‚è4SA9AÿÚ9hPÿø9h$ÿö9h&ÿô³üg )Iÿð`)hLÿð)hHÿüNu?//?<NNßü Nu/?<HNA\NuHçà€p0r JBgSB°fAÿÿQÊÿöLßNu yY Ñü €"y~09~aNuHç>Àü ÓÀ#É~ ?<¢LÙ|ÿHÐ|ÿLÙ|ÿHè|ÿ4LÙHèhAè Óü(SWfÖTLÙÿHÐÿLÙÿHèÿ,LÙÿHèÿXLß|þNu yY "y~09~aNuHç>Àü ÓÀ?<qLÙ|ÿHÐ|ÿLÙ|ÿHè|ÿ4LÙ|ÿHè|ÿhLÙ|ÿHè|ÿœAèÐSWfÒTLÙÿHÐÿLÙÿHèÿ,LÙÿHèÿXLÙÿHèÿ„Lß|þNuÚanFü'Aù~ð#È4a&aJapIùÿˆGùJAù~ò#È4Pù‰bFü% |~Ô9~Ög3Ðÿ‚@P Pk0¼NqNqNqCùÿü)g$J9 2f)°<ödü~Ø` J9‰bfœFü'aafaFü Nu9ÿüg9ÿü`îNuNsHç0»Ål.Gÿ€çO&3p43pÌŒFJFf<<ýèLß NsFü'Aù~ð#È4Qù‰bFü%Lß Ns/3ù~Ôÿ‚@y~Ô yp~Ôk 3ü~ÔAùÿú¨ _Nsùÿú‰Zùÿú ‰[ùÿú‰\ùÿú‰]ùÿú‰^ùÿú‰_ùÿú‰`Nuù‰`ÿúù‰_ÿúù‰^ÿúù‰]ÿúù‰\ÿúù‰[ÿú ù‰ZÿúNuHçððHy€J?<?<NNPLßNuHçððHy€L?<?<NNPLßNuüÿúDAù‰JãL80@ÄÿúàLÄÿúNuü ÿúüÿúü ÿúüÿú ¹ÿúNuüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿˆüÿÿˆüÿˆüÿˆü ÿˆüÿˆü ÿˆüÿˆNu                                                                                                                                                                                                                                                                                                                                                   ) $<*,* ""4" & "b8Rhˆ¦Ê0\†œ²Òô*Lb–¸Øø>`~œºØÛþ ß v €ÿŒØÛþ Ï X €)ÿØÛþ ß v €ÿþ Ï X €)ÿRû "ø V € ‚ÿÒèÑø   o £ €ÿ4þ  ‚dÿÿþþ ‚V‚þ‚V‚ ‚2ÿÿÇ    ‚ ‚2ÿÿ Ç   P ‚ dÿÿþ €<þ(‚ÿÿ@8   üÿ@x   üÿVV   2ü€ ÿÿÿ   ü€ððÿ  ÿ ô€ÿÿ ÿ  þ€ÿÿ    ü€Èìÿ ÿ F þ€ÿÿde  üÿÿÿÿÿ  ÿ  þ€€ÿ2 ÿ P   dü€ÿÿ ÿ0   2ü€ÿÿ ÿ0  üÿ(€ÿôÿ ÿdP Fö€ÿ ( ÿdP Fö€ÿÿ ( ÿ  À   , ‚   ø   È È ‚ú @e[QG=3) ÿ?ÿþþ ‚‚ÿ JACK KNIFE... CLIVE CLUTCH. ERIC BODGE... PETER PIT.... FLAT TYRE.... BOB CARR..... PAUL POSITION SHARP BEND... ............. FINAL LAP ------------ Press HELP or F/KEYS any time. To restart a new HI-SCORE table, just delete the file marked HISCORES.ASC A new one will be created automatically. Alternatively, press F9... This disk is protected against possible viruses. The program reads the boot sector at the beginning of each game and expects to find certain bytes (ex: Budgie). If these bytes are missing, a virus has probably taken hold of the boot sector. Never mind, it will be erradicated automatically. Do not use commercial protectors, as we will merely treat them as another virus. Happy driving! Eb Coding : Camy Maertens Thanks to Simon Rush Gary Wheaton Gareth Pople and Jim Holmwood for many useful routines. b½ June 1989 BUDGIE UK All marketing rights strictly reserved. b A BUDGIE UK production. Eb The SHELL is written in Assembler, using HISOFT's DEVPAC 2. Source code available to 68000 Programmers and all Budgie UK members. BUDGIE UK 5, Minster Close, Rayleigh, Essex, UK Y! F1-F10 Messages Help/Enter HELP V S/W scroll H toggle 50/60 Hz P Pause then press 1-6 C Slow motion X Erase screen L Load PI1 * Debug D Dump screen M Music UP/DOWN H/W scroll ESC quitY* Y0 Y! RESET high scores TABLE p confirm q Y/N Y! Load DEGAS file: Enter File name ex: que*.pi1 Budgie products are LICENCEWARE. -------------------------------- It means that only Licensed Distributors are allowed to sell our titles. The end user is authorized to copy this program or even give it away if he wishes. The price of this Program is pitched at or slightly above PD levels. Royalties are collected from the Licensees and forwarded to all our authors. A list of Licensed Distributors is available from Budgie UK. Copyright and full marketing rights are held by Budgie UK stick forward! Everyone has his own idea as to which his all-time favourite games are. If I were stranded on a desert island, with my computers and a generator, (another dumb assumption...) these would be my 10 desert island disks: International Soccer (C64) Last Starfighter (Atari 800) Arkanoid (Atari ST) Cyclons (C64) Leaderboard Executive (C64) Flight Simulator II (Atari ST) Psion Chess (Atari ST) River Raid (Atari 800) International Karate + (Atari ST) Speed King (C64) Imagine the horror of leaving out Boulderdash, Zolyx, Crazy Cars II, Buggy Boy, ace, Beach Head, Pitstop II, Drop Zone, Snapper, BBC Tennis,etc..*************** BUDGIE UK 5 Minster Close Rayleigh Essex SS6 8SF United Kingdom *************** BUDGIE UK b Licenceware The fairer face of PD. ------------------------ BUDGIE UK now accounts for more than 55% of the ENTIRE budget production on the Atari ST !!! *** If you have a game you want to share with your fellow ST ers, contact BUDGIE UK for help, advice and exchange of routines. More than one hundred machine code routines available to members! We will particularly favour programs written in 68000 code (NO more STOS PLEASE ....) b>>ALL AUTHORS RECEIVE ROYALTIES.<< ---------------------------------- E b BUDGIE UK are the creators of many fine games for the ST. They are distributed through b LICENSED DISTRIBUTORS bRoyalties are paid to all our writers. A list of Licensed Distributors is available from the Budgie Office. ---------------------------------------- The following BUDGIE titles are now available: ---------------------------------------- EbDamonoidb by Camy Maertens. 20 planets, no less, have to be protected from Damonoid and its invading fleet. Action is fast. Time is running out. Any enemy impact on your planet causes havoc. You can sustain 13 direct hits. But, should the Damonoid itself land, the result would be fatal! bFOOTBALL 88b by Simon Rush. A complete manager game. Very addictive This Football Manager is extremely easy to play and contains many features that sets it apart from other offerings, its multi-user capability being one of them.If you are a budding soccer supremo this game is undoubtedly for you! bBLITZ IIIb by Camy Maertens. This is a bombing raid with a different scenario: three aircraft fly in formation, all under joystick control. The aim of the game is to destroy the city before too much altitude is lost. 'Challenging game..' ST Format Feb 89 EbOTHELLOb by Jim Holmwood. Entirely mouse controlled and playing a mean game. You may find it difficult to beat the computer, but this will maintain its appeal. Two versions are included on this disk: one mono and the other colour. bPRO DARTSb by Martyn Carr This is a mouse controlled simulation, 5O1 down. All darts addicts will love this game and the somewhat hesitant pointer (too much beer perhaps) Speech commentary adds to the realism. bBALL ZONEb by Ian Grainger an incredible Arkanoid type game, only better. Needless to say, this game is mouse controlled and has many levels. But the main attractions are the time counter which dramatically increases the tension and, also, the reassuring presence of base line tiles which will rescue you in desparate situations. EbDR BORIS b by Alex Dewdney a TNT maniac is on the loose, lighting explosive devices in a maze of increasingly dangerous alleys. You have 1O seconds to defuse the bombs before the inevitable blast. There are many obstructions in your path, including walls and...skulls. Also on this disk, by the same author, bPUZZLER b a diabolical brain teaser. bSPECULATORb by Camy Maertens You start with 5OOO points and have to correctly guess the direction of the market. Trends develop, reversals occur and sudden panics can cause havoc with the soundest strategies. The Index 'point and figure' chart unfolds before your eyes and reveals your profits or ...losses. EbMONEYSPINNERb by Jim Holmwood The slot machine is alive ! This accolade winning Budgie UK classic incorporates all the usual features : nudges, gambles, holds, and some more. The scrolling is smooth and once again, the game is mouse controlled. State of the Art gambling! 'A very enjoyable game to say the least' ST Action December 88. bTYCOONb by Simon Rush. A multi-player mineral exploring game. The objective is to survey, test drill and eventually exploit various sites to extract valuable minerals. Mines have different levels of profitability. EbACE INVADERSb by Gary Wheaton The DEFINITIVE Space Invader ! Everything the all-time classic is or should be is in this game: speed, sound drama, excitement. All collectors and connoisseurs will treasure this disk. There is nothing to touch it, even commercial. Three Stars ST Format August 89. bZENITHb by Gary Wheaton A space combat for two players. Mouse v. Joystick. Several convoys of aliens fly through space, wave after wave. Your mission is to intercept them. Your opponent has the same ambition and his space ship has to be destroyed. The ensuing battle is a delight for all arcade fanatics. Another classic! EbGOLDRUSHb by Mark Annetts A multi-level platform pursuit. The aim is to collect the gold while avoiding your pursuer. Joystick control. The puzzles are the main attraction of this platform game. This is the thinking man's version of Loderunner. Also on same disk:bZERPHOD bby Ian Grainger 3D maze challenge. Find the modules before time runs out,avoid the nasties. bPERILS of PENFOLDb by Philip Bishop A superb graphic adventure with caves to explore, potions and spells to gather, ghosts and flying knives to avoid and puzzles to solve. Also included on this disk, by the same author: LINE of FOUR a fiendish connect game that will give hours of pleasure ...or frustration! EbWORD FIND PUZZLE GENERATOR b by Keith Bearman Medium res and hi res monochrome. You can play the puzzles on your monitor or print them on paper. Because of its expandability, this program will keep you busy for a very long time. A fantastic screen/printer font manager by Jeremy Hughes is included! bMAKE A BREAKb by Martyn Brown of 17Bit Software A extremely powerful (and colourful) quizz game set in a snooker environment Subjects covered are varied: arts, sports, the past, music, books, the world, etc..Version 1.1 Five stars ST FORMAT december 89EbPARABELLUMb by Alex Dewdney Confined to the deepest dungeon of the underworld, you must progress from chamber to chamber until you escape. Evil creatures lurk in every corner: the task is daunting! This is a challenging platform game with lasting appeal. bTRI HELIb by Gary Wheaton of The Shapeshifters A pixel feast if ever there was one! Two blindingly fast games on one disk, plus several demos, all compacted to give you hours of arcade entertainment. TRI-HELI and COSMOS are superb examples of 8-bit classics now at last gracing the Atari ST.EbOPERATION ANGELICAb by Camy Maertens Your mission is to rescue British troops stranded on Buff Cove. The island has been mined. Time is critical and enemy aircraft are bombing you relentlessly... Nine action-packed levels ! bIMPULSEb by Ian Grainger At last, a totally new concept! Each scene holds a detonator, strategically situated, and thoroughly guarded. First, marauding aliens have to be destroyed, using your rotating gun turrets. Angles are critical if the phaser ray is not to rebound on you. Eventually, the detonator is exposed and has to be hit Eleven levels of trajectories, bounces and deflections!EbBANDITb by Gary Wheaton & Shapeshifters Electronic slot machine with nudges up and down, holds, shoot-outs and a delightful page three bonus. Excellent music, superlative graphics. Only the Shapeshifters could have brought you this awesome arcade bonanza! Also on same disk, the Spartan demo. bSPACE BLOB b by Robin Edwards An immensely enjoyable platform game. Fifteen levels and three bonus screens. Collect the crystals and avoid the baddies. Try not to land on rugged terrain: Space Blob likes his landings soft and gentle. Also on same disk: HAPPY the anti-virus smiling face. And more goodies!EbSLIPPERY SID b by Neil Scrimgeour Emprisoned in a set of mazes, Sid has to munch his way through large quantities of pills. As he munches, he grows longer, shedding the odd tail just to confuse you. Nine mazes. bSCARY b by Eddie Bryan The haunted mansion in which your girl friend has been abducted is a den of evil and unnatural. Many rooms have to be searched before you can rescue her. bCARRIER ATTACK b by Keith Bearman Rediscover the drama and excitement of Battleships. Ten levels of computer intelligence. Naval strategy of the highest order.EbPSICOTIC b by Philip Rankin A space combat against forces attacking from the East. Extra armement can be gained during the engagements. Dare and survive! bSUB HUNT b by Oliver Bros A two player game set in some of the globe's hot spots: Tropics, Arctic, and Persian Gulf. Busy shipping lanes are under threat Protect allied vessels and destroy enemy cargo. Helicoper v submarine. Also on same disk: bSEA FISHERMAN b by Paul Dowers A fishing simulator on the ST..! Prepare for exciting action, but do take a book with you, just in case...EbDEATH CAMP b by Dave Blower The first text-based adventure from Budgie UK. Ample illustrations are nevertheless provided to convey the true atmosphere. The Japanese POW camp is your nightmare. Your objective: to escape! bA QUEST for GALAXIA b by Gary Wheaton + Shapeshifters Part two of Budgie's tribute to the all-time classics. Rediscover the thrill and excitement of an immortal game. 10 levels of galactic chaos. High scores saved to disk. This game is without a doubt, the jewel in the Budgie collection. The Shapeshifters at their best!EbINFERNO b by Simon Brown Your task is to control a cunning demon in his bid to return to his cosy fire in hell. Your progress through a maze of tunnels is hazardous as boulders, skulls and un-hatched eggs are ever present. A fine variation of the boulderdash theme. bRUNAWAY b by Chris Skellern Guide a drone ship through the tunnels of the moon. The ship is out of control and cannot slow down! There is fuel on board, but friction against the tunnel walls depletes your shields. The pace is frantic. The journey is tortuous and unforgiving. From the author of Sprite Master. EbROTATUS b by Simon Brown A rotating experience in outer space. On the edge of the galaxy, your ship attempts to land on the nearest planet. Asteroids and boulders continuously cross your paths. Space marauders also gyrate on a collision course. Avoid them or shoot them! EbDOUBLE SIDED COMPILATIONS: 520K memory OK but ONE MEG drive needed. bPerils of Penfold - Line of Four Goldrush - Zerphod ----------------- Ace Invaders /Zenith /Tri Heli - Cosmos -------------------------------------- Football 88 /Parabellum ----------------------- Make a Break /Blitz /Word Generator ----------------------------------- Dr Boris - Puzzler /Pro Darts /Maelstrom --------------------------------------- Damonoid /Speculator /Othello ----------------------------- Ball Zone /Moneyspinner ----------------------- Football /Moneyspinner /Tri Heli -------------------------------- EBandit /Slippery Sid /Space Blob -------------------------------- Angelica /Psicotic /Galaxia --------------------------- Carrier Attack /Sub Hunt - Fisherman ----------------------------------- Impulse /Scary a:\common\drum*.spla:\common\penny.pi1a:\common\budgie.tita:\shell\title.pi1a:\shell\sprites.pica:\shell\blob.pi1a:\shell\help*.pi1a:\fonts\a1_fat*.fona:\fonts\a2_squa*.fona:\fonts\a2_elega*.fona:\shell\hiscores.asc--------------------------------------------"Ô (6V 8 2,  n6(ÔÔ,.‚                  6 4 Z       ì  &  ,Ô D &  ,   (<  &@     (<< 2 (&  &    &   T ,   * ( &   (& * 4 J Ô     . $J"4J2 (  F  "* "     Ô   Ô ž &   ^   ,8š" Z""JJJb^bP     Œ6 (8 &   *   $    &     V  *: .  ¦VVNNNNX: 0. 2 4"$Â&(B$$$~F L,4 ,0Fø* RJ^       ªÀ zb¨* X""  Œ | *  ‚ ,  6        ",<48,>>JH>| º X P x     (ng from. A typical working disk should be Double Sided and have on it: SHELL INCLUDES COMMON FONTS GenST2.PRG GenST2.INF Desktop.INF Inside SHELL is: SHELL_41.S or whatever version is current HISCORES.ASC TEXT.S TITLE.PI1 SPRITES.PIC and other degas pictures Inside INCLUDES is : INCLUDE1.S INCLUDE2.S INCLUDE3.S INCLUDE4.S INCLUDE5.S INCLUDE6.S not essential INCLUDE7.S not essential SOUNDS.S MACROS.S Inside COMMON is: BUDGIE.TIT a small degas picture GAMES.S DRUM1.SPL some unimportant sampling PENNY.PI1 introduction picture WRITER.UK another binary file (incbin) etc... Inside FONTS are 8 and 16 pixel fonts When SHELL.S is being assembled, it will expect to find the INCLUDE files. INCLUDE1.S contains such things as file reading routines, bios trap calls, supervisor mode, quit, reveal,joystick, mouse, from_to, sort, vbi, bindec, etc.. INCLUDE2.S contains h/blank, pic_dump, view array etc.. INCLUDE3.S contains pixel plot, sprite, boot sectors, etc.. INCLUDE4.S contains fonts, scroll, etc.. INCLUDE5.S contains replay SOUNDS.S contains mainly sound effects TEXT.S contains ascii messages, hi-scores tables, etc.. GAMES.S contains an ascii list of all Budgie games Presently 'shell_41.s' expects to find these files and folders on DRIVE A. Do change if required. So, what does shell_41.s do anyway? The shell is an ENVIRONMENT from which to control a game and call any macros and subroutines that may be required. Let's be more specific: 1. It 'includes' a macros file (approx 75 macros) 2. It then goes into supervisor mode 3. It gives back to gem (m_shrink) any memory it doesn't need to start with. 4. It finds out where ram top is 5. It asks gem to reserve some space (malloc) for work areas which will be needed later on (spare screens, buffers,..) I also asks gem to reserve space for files to be loaded soon (sprites for instance) 6. It initializes the A-line so that we may change the fonts later on. 7. It hides the mouse, the cursor, etc.. 8. It goes into low res, unless monochrome is detected 9. It loads the new fonts from disk, and some tunes. 10. It installs the horizontal blank interrupt routine, if any 11. It resets the bombs vectors 12. It installs the vertical blank interrupt routine, if any 13. It does the same with the mfp interrupts 14. It checks whether ascii files have been interfered with... 15. It checks whether the boot sector is still clean (virus) 16. It executes the opening sequence (title page, music, etc..) 17. It initializes the sprites (sizes, locations, etc..) 18. It installs the joystick handler routine 19. It installs the mouse handler routine (optional) 20. It declares some of the main initial variables 21. It declares logical_screen and physical_screen 22. It builds up the required scenery 23. It goes on the the MAIN LOOP, called 'main' Fine, the prolog is over. Now for the MAIN LOOP. This is the conductor of the orchestra. The program counter comes back to this LOOP 50 times a second, even if there is nothing to do (if PAUSED for instance). Our program is therefore said to be running at 50 frames. 50 frames means smooth graphics. What does this MAIN LOOP do? 1. It reads the JOYSTICK (or mouse). If there is a request, a BRAnch is made to this appropriate routine 2. It reads the KEYBOARD. If a key has been hit, again a suitable BRAnch is made. Approx 33 keys are currently detected. With the exception of ESC, P, and Functions, most of them are for de-bugging purposes. A BRAnch to one of these routines is terminated with a BRAnch back to main (and not with RTS) 3. It then swaps the 2 video pointers so that at the next vertical blank, graphic operations will be directed to the screen NOT being displayed 4. It now waits for the vertical blank. At this point, the video chip redraws the screen (which is the one we were working on during the LAST cycle) 5. The coordinates for all 'automatic' sprites are now being updated 6. Software vertical scroll is executed if asked for 6. The clock is updated. So is the score, etc.. 7. It checks whether the level or the game is finished 8. All sprites are RESTORED. The background is temporarily spriteless 9. Individual PIXELS are read and drawn (if required) 10. All targeted backgrounds are SAVED unless unnecessary 11. Finally, all sprites are DRAWN in their new positions. All this restoring/saving/drawing takes place on the screen which is NOT BEING SHOWN (logical_screen) 12. it now checks whether such minor things as Pause or Slow Motion are required. 13. at this point, a 1/50th of a second has almost elapsed and it's time to go back to MAIN ! The main KEYS which are possibly implemented are: H toggle 50/60 Hz 60hz looks tremendous on the Atari SC1224 color monitor. But most television sets won't be able to handle it. In 60 hz, the picture is much steadier, because it is redrawn sixty times a second, rather than fifty times. On the other hand, the programmer has less time to complete his sprite operations, and may, in critical cases, miss a frame altogether. Default option is therefore 50 hz. * debug the programmer needs to know the state of important variables and data registers. Pressing * at any time will do just that. Of course, you have to define your variables first. An important programming variable, used for timing, is the before/after combination. If you want to know how long a routine takes, place a 'before' macro at the start of it, place an 'after' at the end of it, and press *. You will see how many horizontal blanks have elapsed during the routine. During a frame lasting 1/50th sec, approx 312 h/blanks are drawn, including top and bottom borders. 312 h/b's is therefore the time allowed to conduct an entire 'main' loop. If a standard, ready-made, library routine takes too long, it will have to be re-written. In Final Lap, all sprite routines are re-written, using hundreds of consecutive MOVE.L and thereby avoiding time-consuming loops and DBRA instructions. The 'before/after' timing system works on the horizontal blank interrupt. Therefore it has to be enabled by toggling the J key. Once the program is finished, such h/b interrupts should be removed as they themselves account for huge processor time. Z Pople's scroller Gareth Pople's vertical scroller is an ideal 'credits type' advertisement. This routine is included in the shell, not only to advertise Budgie's backlist, but to illustrate how your program can chain another one, and regain control afterwards. F font loader Two fonts are loaded as standard right at the beginning of the introduction. Pressing F will load one more. Fonts are standard GEM fonts, as used by Jeremy Hughes in his fantastic fontsel.acc. They are compatible with all well-behaved gem applications. 8*8 and 16*8 are included. F1 restart game games variables are reset and a jump is made to the intro of the program F2-F3 copyright notice and credits function keys are mainly used for messages, adverts, etc.. F4-F8 Budgie ads being in ascii format, the text can be changed at will F9 reset hi-score table there are two ways of resetting the high score table. one is pressing F9, the other is deleting highsco.asc from disk F10 display Options screen this display is activated in 8*16 font mode HELP load Help screen currently a most convincing degas picture ENTER similar thing but different picture X clear current screen debugging only M a selection of sounds C single step pressing C repeatedly will activate slow motion mode. ideal for debugging V vertical scroll a section of the screen is scrolled up or down. The size of the scrolling window and the speed may be changed by modifying the actual routine in include4.s (ask for Sea King source code) This routine accounts for 80% of all processing time. Therefore, all but the smallest sprites have to be disabled if the game is to run at 50 frames/sec P Pause continuously loops back to 'main' L Load a file (ex. spr*.pi1) any pi1 file (or any file for that matter) will be loaded at current screen address. To load a screen in a different memory location: press P (Pause), hit UP/DOWN cursors, press L (Load), and type file name. D Dump current screen to disk Again, a specific memory screen may be dumped to disk, under the name apic.pi1, by following the Pause, Cursors, Dump sequence 1-2-3-4-5-6 display these screens (first press P) there are several sprite screens, utility screens, video screens, etc.. in memory. They may all be view by pressing 1 thru 6 on the main keyboard UP/DOWN scroll through ram this is a most useful way of viewing your own memory, and checking that things that ought to be there, really are there, and at the right place. Going backwards from high memory, you will see the two video screens (screen_0 and screen_1) also known as physical and logical screens, then empty space (known as 'the heap' ie free available memory). The less free heap, the closer you are to 'out of memory' error. Then comes some digitized music, recognizable by its totally random pattern.. then a 2k 8*8 font, then a 4k 8*16, then two spare 32k screens, then the background screen, then the sprites, then the utility screen, then the end of your program, showing the stack, and an everchanging random variable, then after a while, more changing variables, this time belonging to gem and the operating system. Loading a pi1 picture here will cause a gigantic crash... keypad 0-5 sprites on/off these keys toggle sprites on and off. Too many sprites at any one time can cause a frame to be missed, and a jerk will occur. notice that sprites take much longer to draw if they are not on a 16 boundary. A 15 boundary is the worst, as 15 bits have to be shifted along, at a massive processor cost. If only we had a hardware sprite co-processor.. FIRE reveal horizontal raster Providing sprite 0 is active, (that's the joystick one), the exact location of the horizontal raster will be revealed. The lower, the more time elapsed. It may be so long as not being visible any longer, ie past the bottom border. That's the critical point. That's when the code has to be re-examined to make things more efficient, or certain sprites disabled to retain the whole game within a frame. Notice how the line varies according to the sprite shift position. Press J to disable the h/b interrupt and notice the big improvement. See the effect of switching to 60 hz. Disable one sprite and notice the improvement. Even the vertical blank music routine has an effect. In the end, it boils down to 312 rasters. Everything, from reading the keyboard, working out new positions, checking for collisions, drawing and erasing sprites, to scrolling the background has to be done in 312 rasters, if your game is to run, super-smooth, at 50 frames a second. Of course you may elect to run your game at 25 frames a second. Providing your sprites travel fairly small distances at a time, (like 1 or 2 pixels), this may not be too terrible. If your sprites are animated, ie are made up of two or more physical shapes, the inherent jerkiness of a 25 frame display will not be so obvious. Nearly all commercial games run at 25 frames a second. Flight simulators may run at only 8 frames a second. STOS games run at an irregular speed, depending on the pixel location of the sprite, the size and number of said sprites, and interrupt interference like moving the joystick. more to follow... Camy Maertens Budgie UK January 4, 1990 *--------------------------------------------------------