DOS$pCN @ hpHACz" <."<,xN:I(g)@N|"T2 ,H@22H@2""0<<2<a0<2<a0<2<a"K;|+TBm;|);|)383BmBmBm;|;|Cb,xNh,@AN)@&lp 2K$l$j"gJ<c  jPjj@j@jjj@0`K`zf2$l$j"@pf K:`<c   l"<"J09H<Pb <tRrQ(Q <QRE9fhCB,xNh @K+h&By;|`"T <.,xN.,xNvLNugraphics.library4<&<HA2"2@Q&<A2"2@QNuuhtopaz.fontdos.library8# HI DUDES ... ANOTHER NICE PRODUCT FROM FRANZ OF I.B.B. ... THIS TIME A NEW HOT UTILITY DISK ... BIG NEWS ABOUT OUR GROUP ... MANY STRONG GUYS ARE JOINING WITH OUR TEAM !!!... VERY SOON YOU WILL KNOW THEM ... ITALIAN BAD BOYS 'LЄ,)K  ^!mz;ѵ^ܺQp KHd"Q` !@I qI}!Cֶ#oٸl > ~wAO *pI#ɒ Y =SA(g0!J _^peKB!2Pxx(x NJ$܄D*!%)HÔ@xH0Ғt)HX5P!0(8 d o J$r " ]!rB;G9 /VX9S<.0V D=px @@`s!$xE)pQ0W*Hn}$"|PtA1) )"B/pǢ1̐z ó|eӬH "Hd',% ' "1x4‰'MD B@M0 !`_r @B,l TA pff 3?7 ܼ V5 *^ HgV #rNMNcX?B@0|, -,~2|뒚x aa x&  <4 +!yǃ1YĨ `ɀ@!QC`#@v F  b`@oP0|Z,.u# ~A@WDG@c| Pi>8X@O` pdn B=xkëy,7‚CPAxHppScG@I1\A<<偆[h yG!L@^ aqZ0! â RTt'N$$.vN<`p@`` 0x8p0!! @`4:| 6 Xx8  +Z@ F`=v lA݆~ "08PC@!ZR?deRp8x< <A݆ PrR|$G!CPJРDjp&FlAC=4OGP9P<L0ǃ!ƃRa 0Z,X&I1`t1Z T Mr`@%~LDxH zCA"Qvb 0;%FNP'P\" C$xC C /V%K4   @A@ -4xahz0c0T MAweW̩ .A А` 1P@b8B" XL k /I5('   D U饇WSÆ fG / -* [tZ((PPpORABs% ]O96||;&M[ΑmRh0 $)2hT@ pE "`#pOCx b.Hb Hx6 Y' ى IJ. & 8< 0cA@`ah{+"ZP0S#'Q=TwGt 4HAhP j">"E/(V;<x)<{|=00 44ËCGcb#G!ΟASGAq!%>46|g~77`:| M ~* @Td Ç`&}I+i#'$>p`&ǀ{ '80<ȳx | |, 4#T`(/e9*!* 08pLB1aР 04L.! 3w#OF#AAТ` @t !( PPP,X`DC#x 8DuhZZ-F JKp`#I'R  epG C:Dg-04 (x s F@:Pp\)(B ( %ltY"fPK@PR-@e`}Fn b!c@~@P~EI)px XdPQ_(80pqp Oq`ǎ-A!" <@?B0E;U ChQ0j] D20K1:Y@. ^ :φC(axHIx dPx`،48"@e` HpxYahdF'fp>C0@<,BPX #!P`'e'ⅵNcABo@0|;, F$bN /A BD,brd4J!} Z5Y+gJ \((0%B!A ۖ O\ !+$pm+Da^L *O {1ϟ WР)0< .4HE@&0,@5!0!Ғ#>d )G0 K@&"˿v+0@C"Mbg$@2W"N* Ѣ <-܁hQ:<%BP~&`"GM2I \0XT%A 1_ f; 1b >ހ&2̜ BIp! 3?A଑'C-RI` D D`(BXe` 8:53I'+*'0!!&' RP!"P[H-``A @ȺdNo(hLFpSAcpc$_# ʅ0T J ɔ8xT@cA)^@ X##THnAd9)/EZ0V@ (]@dN߿)a7$rRMaS@A4fjH&g#$ ,$D(pRQp1H2 30Hx`< f@;@+5)e⸔'p4q6u:80P}9 7ۀ P n #3nf;O8 Jv0؃rё0X'D֡0@`@O&N HP$2A` r@B5%8HR$N1 8@:@2 J Ѱ*200!/r)EkTs4zc ӑPHv^a|7DX 2Ƣg@- ʌJXl@8E",w , ŀ1 n(#$~a d2@b @emo"wɠ B 5T%?CO 0PP) S`q'"Q*(,r!z 2x*(! IXEN  f 0R;7>i%A8Մ\B TThEJ*$WL Xҡ0rKi&x)-Ւн( OX)@eS&B,'E7͑ #* *F\>6[$T6 [d,03/bV |``  " &("@F.y@x .l (lS0D;#%q% x$ 2RPL!I@p*@ <ԀqP0P ; @w@E|z0AaI(cU\ T UYª "0 0d*"C@,'zQ'FcYF~$ ;daH# xhPI@@ VZ41Eh!A0pH! ‘p(BT@G $ FH`\!46A^Eg}t#AO֑Ê AU=09yAE " L @#Ac?@-<9GπLsJ<ӐA^a3@oA1B4B2>( xh9(0@e#Ã1)dN@8vx``(GT]UW*H^$D 5b@p:x5"QÙB@bQ?b@GhH.*p(q0Pc   Ht?m]`s2 P DX %& giN 3pq`''GR6`b>=I~sL01D1Ү $] S|tIڟ<20\1G<8z?臋M _G"ڢ0 ӀDa%$Z8},F4<(4,D1qB=QX(0CE uC#OQ؊"@H@L 4> qǼ2< T`0φ> ]`Є[#p(.+'H;S2Th ^"44*(:J(xk*<*!>8rRGUTU_USPREAx`j0 Ct idwieP B]P@#`9@@DO0)A{T.`18 _ ]a){Aڂ ) `#!SY 5sЁ3#P<*qSI* , |N+$W#4:V,2\d7~h9F@Z!8@"0#N* lF_ ! |>8$ = ( $4箘D!$~+$ " ># `pHqPC@UG A%@CP NwH tn` O*a 7'ING:PaOl70b8X\EO=_`~`GwDC Xp`YIT!Q _DDHb HD32/ L83sT7!@C0 'P0#mƁ@ʒBD(, .0PA O`@ ⑄a ⌀ ,3_OHj cuS<(T@ )NE@by P1<@ 8G m@;:O@` |x*HhAWA0Hc#DqB HD ) $"UXp$aCF 8IKkkqU'J%B )ECAxc*?1GdAR!P%Ph(>0<6ąi0"3B 8馨 " NE,BC" K\- X_fx)pĀ*1xXTp,J IO C͂8i `q[w (W ),C $êOPX0/%DA/4qp@ATY0ЯDO`re[s8)0@6@4 @Q 爌|@H>8!ґ^ `)ĊԁX]B'><$ 80~PG;@x0R9D$;zOX@ ) 'K$`p?|Ty#c _ InD6 `57=@p` " ` ;tUxXqvGؠu*p@ՠ( O)$|!"0b?@z+8UC_@aPb,A$T2*,0T r A#!@1.@` p҄B5%! x  0Jf`{HAEOB\6 BF8  DHE .XH"01hb11 1؃|P0qXO*,9aΉp|h0D(*B#p׸ `AS ÆLDbj[ןkM5k @ 0@#@7 hx&p-ƒH &8P(0=?s. &8 d 86<4#)X'  0`c&O1XZܜp 8M#4 awpBcS`L`$!Ek2<t"BQfD^WM '@{4 D m- l6D 39p $@:&@p~8&qK>3KĞc8&9 5!cp} , D&*Q.q 'kV K`IR`FI0D!A $  )`@h"p]*R^3JBۈ@ MmSA@_20  (fP%LI N@D!&'7)f!Ru+;p*d H(H3HP&@HBE (AMS^@ (+@@/P}DNB/  cf;B aD`: P`0u:`UQacI-LRE0? #@yAp4s8 C`@# 3d(T06x dEYpqP0@,Xeh@ `0 `@KQ y%%_3 ~cR\p`gL3 8AVMoxAXR"-A6Dp0ffws?@a`$u P )! 4hЉODJl 4>'8JT@94/ XlPmI1r ל\F`@B@W('(0&r,``QbzXYǀ;(F@`(A (r&3C @'P gJf>@0 @@@ԐjAXP@pC '0LGLHRF@Gl@A*P6 ޠ!ĽO B@pG*f/€hL#AU x fr`ODCi!NZI %B#2 |LáS<.5r.QA+!#" RĞ a'" $I 4pĨz$t'K˕)%  qS]G'9x G -<20 8_rJFeW3LCj"άHaAQ ,7 0V! bbBAXX0$`9@^JPO߀#X.@ DBMOU LM|T3Ie$ CS |`wΆ} KLC)@d `" $`%kxB!a5K @%%<0b @P 29Q08t `aa7!Gnp&,$04meErhrp2, gH&XnX)(=I PG ТC%V':9YC(`9I@QA A`YaFf_tlP(UEfjvB'iJHdJ#QXN4 JZ9+9d( rᆡXP egWB@-+ .A R  `7E` j8=HZeZ9pځ) #Zuh3Xp0KFA;5 ]مJfC. x33| T0B`\1dA>y`3@8%ӅxW\@EP  hVP;;r ;itipKJˀ R`ZzWqvdsuyuhoq[\-+33KS[i8_ nMͥ*PTd, p#D%.&Z()/+T' *J*)o&Fh*h IiB@';kppmi Y18 /1)P ThDO-x$IHMm;+Pl`"I<  ъ R(! TXTMl`5Al@ !# !Pr`^#! r>^DP".=HG)0V0N!Ҁl4U R,}f$PZ)0 Jx-P @{y -R@` z" @ ۑT@h[ "AӃ ( lg2a6HF '$"]5"Cb;Bb Fi1_ai` b+,C ##@`GQFa (0C/ A5kP-6x/@"tBp j5.$*'<Ӝ6)Y$Ā*X!EFgBӸcp-6=*DF!C2bB"C? `SX7,lA vrFpf ؀ IqP J UzAg@ H!@6~ c8@io #.F c?3tT`AR ]"`!\fCAIdƸCG 3 zN85 8@x)~pV  ՉՕ0K@A|t 4UT Dz$Bf7&pAbS= $ :o4)` @B@ aA4ő# fRQHç* t&;H:7'#?9!(ކeD&BkN(1= N=ՕYLxdP`C83bk192'=$Pb8 8dD Όy@=͡: A TZ,bd2XPf B)0 w2iC`8teBI, Fb =PHi H; |`&`pyKkK+8Ns!FJbAJ@,` +2/i81{+ͬՙ $҅A  G9ɕձȁͅ$<}&T %Ї $@x!* 6R! A0- RQIi<KɀPf R`@ @8-AAGq 1Cq8$tC \y6pC<0T\>b;$( r"uz ` vh KLB.:do3 @E B ht8 C%'>HF.HCaI=PALx @(!\% RnC r)! F1@2 Q H  tDhA0Eʬ$}-9"8B:8XE^`D.qkGS>4i ( N A*0᙮P33@";H 08CfJAgr 7(A@ F8J۩ ``,$XAA@DI%h6|^D>P <@QCP4 HJAZ!@(1Р3"q#8:<'–-4&8D*F(,?`pp 92@d`!f% ǘP1 E Ik5 q$G6=@_LaL@`%$= $6;| '? ѻsjsdJJXHr枎b1; hX.alG*` 9BԐ,}-@ih@jtVu.!V!@ 8]X)x @ְA$A-10j,' un(+0 `EJ @ V|r@KA$ nBK Ah&Pa M 8֪D |XPU6>Dj #*\!O 56X i/XV!I:`H[V PƠ> / w "5 F%$!Pa"n n6p!u Н)a&B,8'XdPElT^GUA 2G`!Jga c`+G @1J9W'@ E_v@`C7J RT+2K5*5"F whG@H \@6q,A *P@@QJ `PP z  $j#`#9o` >0z8an`Wh@@Z$ o`l)#S Qh5^ň"?((P0 .p" Q-v$P 4cIi`*7B"C Zl[+}HMgYEsK5ATHƒ< VA.GBj2ZHD#C7|r H1B0#U E89ԡDlBA/ C2py 0}|V) *2h;_Uh(b@r#H%"ɑU‿ _"8xC|"$GH#H8жACÁH0AAt`Kx:9Q^  !X#% 0HY KfP?H?T Q@r8+*~ ԁ@O8܂Ϭ',#7M-l xB}RUT!` 5:0-=0?`dX0=>@@dS0)B@5&DG(ep E7ЀԂx~j9$(X`Ͳ :ŀFg1%|X[[Ak%t {9X] 3<}@f3@:x  C0@\|exd@x* @F&< b1X?f84@ A3O('ȃ3X?u!w3jee@Pc!B$A`"(p%/u1M! 0`<9hp\x D0Y}0@ 0d YaǐK*N+ëBv Дf *yCSV94l!p; P g  8z (@ 4G88pLD0DnB">A)D@A$!旅F(0$h L@ dH1-"CxB1Z)A\i nFQ dBp6AVAxq `E̚Đ K0>2?P@t`0A3 dd q, | >QZpd S C0%"Pb(0aV'.%NFd@0Amȑgj$SP)  !4`a&4.@ 7Dǘ <ׄ% )"A@!0>0H< Va` $=1_M f33aQ!Ybİvh8t &h`.w S< n/HDFQ( iԨ#aC+9Ѐ*8!| FH0mKsȈO@K$1:1BCK$A3* F@0AIEÂbăT*4JN9(c#1,J:  !O 0 㞙J*U @Ǎ-Ou@?e: Gz'/&d`gp)&*Qu w;ÃTx OA<@0"@C8jiZ-( d 1 *m&)O.E5*V# d PT@D 3Ǡ T1@\@L澁=CK% I<AT`2Ռ + UHP ! (` H!sLB @`0=@:Q"Q$F `90~"(0$s p#:A %`瀶؈LW vu(!0hH@ߐ {1t `!:SlZC;LjdO#,(` 69x R@ҲefGd ALipyOR@t'0'7$s6@6pPG85\8x `1Occ+; cq k+ IyO( zH NO)0Bah܀|/D+M AB!&bJH0( "e'@4Pa) )=!@ $L@DJL [" 0,$Dpe?N .q)EF"] .H fHA@A a?< 3A(:A Q`@ÀA&%!P<=r Pꀊ6ߛgd0['0 kH?$0aHڙh Z\!{k9+!K%E>V a Zh ( $=zz f1?>#B:G8d pF"p('1(I"M:ҘM82d /QP!p!]lRfC11 &dzrH iM P2 6`L  j`6H 7t@00HeȦ@$8Do fʪ hiP1 0 l sc1pU`'oq$0`EN0lBs%@!v1 <%8]\! M{AB8IÔ2q3*(EV )Y$ĔL,"lÁ*$.L,mo e.$6Qu QiJ?AMA" ba($#x- @ _IhЖ(@'84(lA%":(T*`cfvxBFab )'4+Q̊KDTPL@) T`P`4`0,L`!{ܨNDU@A r[@ `#p&1h\끓Hd%@!! C  2ґ(X##D(̀;P%s32f7$P&HLd@bf?xlK#`1@1`q R @!'0@~v#(N\ 9@ ,Y͠`$xP&pRQ s1!N`HS-.ce "%)CK%?))# G M@42rJB@K^1Y@|bT(-h$L D  ޥ2JAŎxs eHA'5*f(2,0PG H0А-  P/(ĺPP0 B\)CȐARE `- S2+X@F9Z`Ơ<(0$j(a2  y p^dgKI f@Gڔ3AP2 0BT a&0`AK++UP0(hJ``> Kga y Na6@tKf$p1fH #QgJ&`4AaboMC50x$J{g3H!B 2'0aT(  C:@0)O?Ҥ`Bd ^Pa)YN`"Rd#[RgB* "`2% =>QJa@^T' - 4XiG_}#`C=>D?8!xt@!$]x %Utπ!, v^tb@`@A/r"s 1 /p PP@*0axj H 8o T$2w.<  NQE,UNu}eGW @ aaep<1h@BS 8hʪ t*+4aB U/Qh'@@4^}>p>!f`dqjOH $LB CsYT)7˫Rʹ * 4(2~ J]%UW`CP #犈MTMF|ʪ"J + W ȁ8@ )/sbXqG ~2t@9P !:8p@n0&3"$ .(qe=:TYU`( >(,y /$꫐n0`B/``f/r…ÆA{"B2pPP,pN`<c<7  Ǩ)$f&aقT :H:Vz<`KB0,C ֋ \@&'"/!nH ~0>AIUa|q'Q'G;!0dg~?G99]ɬ{ <(_XD`dyb8Q 8J/: pP|L$i@h;CH?>q.1@p" tT+~09K%8ÙVqh{!TG(U_w*  h &7]~*,v(P' ᯈ Q Q `3'_p}3)@` #S}h&=~#Ðg,tȏAAr ʟ9ફ C|P | $b 8?%W ,JɏJʈq`8 /*('#06υ^Ã$ISS:†A!I"K┘&@ȳ o| 8(@ KhRT /(50uh&92x`}GcI( v?E;%t0A|"bp U0~_gEu%{K]C K&JCǼ|zBL(d >  X,#ȿ @W`bs > ӌ},à9@2y% \ ?dd`H1F NEAW} c}IE׭‚P Q .7@ $ x r0="CcT}Pp?SQ>.H?9@a'$1a~NA2uquOTx A1Z(2 @@BJ*ꇿjtBAa 7^-l'#`6G!8aIGV>Jʔ'4 Lm!d&?A!<1Pc 'Ay@L  p `5 G)t``d0IǀgAe@`&"2"4 p%A?AD4!ࡈ` j Z8*(ANƅa n.>^^P_* >ĥ[ 8#:P "|Ð8 10QࠣPqRFGu4H,!r'%2U͋lIbpM0  A+ @J Xd֖oBZ@pPjfPgG(<X$$$ poYx@_ KJ>0AT`*b.A BEadK2wjBChq. 'ST(1<}R H8o0% A(8~D \"Qs< Δ>Lo ˆ ɱ28&0J2! fP PE KR2Ų `3)B]B^e[d pC(0 `Pp<7"s"@@0 |DRpq,"3YDQFT1gD.L5 @aSA@j?C.A0BA  t>%8 D'&3Fd"E)ޠS 0 !@B)lx9B `(@( ;t`b`0e 0 =tA@ 2~x .!qq''4JT/G qH^ 2080AhP&I扏 .(44@@A`|%FBH`@8t`Q12|;, N#@ 4GD@aװ1yK d+1 ÝA P`Pz00@tnZ84@&BE <dAA0FHRr ^!A , T"T Pp AP2!L亓E 8r2 <~:t9t@a0E9EP0$>CDRa:42%@"SJ(r 8@J[@VdJVdH $:@ ᨇ; d''d$d |m8d"Ƞ r)PȠj0IœS!@9İ B/V {}n,BD@ JJPB AHX@jQā>1JO6xu !:vFx( ht] /PS@*!%)P,Pg U{ÁMU|2# GԄ@h/ P@TrPQB€"0(&<È~] >h =?9ͪ/h1,dw +$2I A)Q5C$H(Q*@L HQq6F2%n *E')6TsFVRP"Z XTRbF뒀0c`b)1{&ORO*u> !Fva ASdž x0 3f(x2^A @@HH(|¥%0P X<$s< @@#BA@Ax2`A!Yp0``@hx| RG*dA 0ؿ d22D`d1, 2ΫM۠B fj<ĕ_80yr . #Á(282 EP~,H&d++@/V QF!aq5:D,fB@@c ϱx fR h$Ps@@B'MiY %C'KA?! T'*!;tDdCM]AU`i#@  #1AX*\88NbQ@6YAT`0dD /I0@P`5,A@"@pAd*@XB@PFx.U`0*F)>(lŊp @'BO τBE(f$}@,P*ׇDI21I"A^A3& # @& c%! qB>S 4GRPB !hh |$)U4R8 9W ,3/s%p4@@: mR@20%  o>rG'9fIA E0%($+-,PYYTyـRV2p3(`c><Hh (P7'(J^ EHB0 0XHIxm&N%G,PpBI`f1TW;s`` F.Ȇ- +=P  EaBR6!?f``b @\I. _h8H ,}  2100l5C᭧$=0;dQA v$s"a PEh$iAn2ZI^@! %tR(O*tB "#D 6@ LʂD\n $J+FU%UD̮݀$u,"NŸ??"3':8?9M&`gU'<0`r <i9Yc@ 02r751|$T$m M3b& ; &$qf J1Rp]z[$WNr`D&  hEHM˙JE Zv*T, 2>}ǀq*RàQ ,$$$qe@H#pt?u)`*f4aIyܐ 8m`Nv4@@B 0 (Y PK XdJAtWC[ vH D napsQAYQ&?`uR6C@{ R<ї %0V,(00 /E .bz 3"F p.'npa';6R# Vl-9(*23&THC`["X69HJN(-ixu;8z[;j8Y[XsP5fgkcGOH@$,,6)Z\<|8xD$dT4t?BbR=2* J}jEuQ%MUIyo_F&fAe1q )i."fyhk ӰrpJ}_R  $BRR$(sva x3D!qdJA͘1ZUs% 8|Z 0a6$-?FB`Ăysi 0}!Jr?4vx H҅^T 1yu>Ci~ ,,/`'h*,yX`P[ \,>9#$b<3'RiA $4 xm)Bbfx'< (1a \r@JhZqԐL O>$Z ؀ЅQY2:  DNxBpC(<:AUZ PBR:]$tQĀϿѰ%$Չ4 FOy*ahVW99y[ &I@-`)0$.g q&Clph$D߀ &)O@@ ݰ&DU:ufJ0XOPp1kdЂd:"n$ R2X &#BImT"T4XPSDAŠGg|I@g%`%Pd$eȃ'a(%`$%.3/sw p(#|,$H<3d9DH'P,->"fXm@փ1EI"1'=Ki1zq2#B`bLi (9e*H,ڢ1f@R@a9+UHIw, P?pa@,iK !цa̮&a,Q$$A/i$Pv DR 8~Lm~A$"A(^ͦ_`U@ P2U  @.D( ,)G t< H P<X .@>@ X2 1 @s@/  HB "D`(ISUP) !*,-&4P? +)% @BPYTDRYZLȞ @y U@v2J$j@<   HHʛ;8lZdd<$(Vp$$H3:y40p& *bd,EX@`" ,'>d J4+`X@'1t0"1 Lajl YX`<#/gn`Blmh.5S'K3OQ''{'Bp|€"J@ :BE$ 0X5D$X4 $X0p |$82( B$:@> U`x | @  V i@ؠ68$  R ^e$  hQI`X | V Q8$  0R <  \@B I H Ċ J0k`R/@$(8$7 $(1I (?M`Xp@40` p`;p``,I` HĴ 4J!hA!A"lBA@!x(  bf( JHbb@8 NBH b~ '?yԇ @( @ P4C@)  ` @'  Ѐ8@A$z( $! BGY@" p ODh_ CF 8Z[9Y::xDΉ@EAT #!2`gav Ay@Ippppp p PK>AA@a ;"W@* } B>P0P $ Pt@ Fp$lA(0DP"xD1C G1H@``!@y@T$  S~~ X-E H!8 a5F `*A@@HHw3q0@3X$'@R9$!(J8@)0\J WAZ|CH@6@L!@ȄwFnR rAH4E0?(2 `p@P dD )@D^z̕N=4?WX/%'Av Ppew â0CL  '0ll$`e j`x@-*!@TDT@$ ށJ?=r~.P!O >E6fH8WQ!(GT^UIUQU5w/@}Aty D.@! X3 sS `! lIqՀ@@}W%?pˀ8  >;@qx@u(D$?P |ܜy$7rp7p3O"s`|!dAB谚UU@S/8/ڟB# N}(G@Q<IpPE{o,@D& *p2W.4kA<WP atf( AԀ{9tt?o.5( (2d< !"^P )`DAx"X@,p2<" A}B`0HPf% (c8%]BPT g@v ,_x$h` @2D J \pQ5a5)O]IA  fဢF_`U&$\R%@!L%8B( %%}WxAHs|D `%q$B  @4! ,3XNA *") QHJ—?&R3W\' D&>g YL< ]9 ~"$,&f@u^#A^2?rvΦN`t2w51p!4vt#l  h/0^0,z1(`TL | L`8x K`q `#F.fGd P@ɀ# ((2CIQh Qy0rT (]0R"g2P0 j,@,0 Na/nbuN2pB@0'@A4E Aŋў9' Em VP"& ' }Q C d0c"(OKt8@J U9 +&> `ȁ_@s,y .HeHa䥃06EAl@"! ! q v(% `fA3AGJI @pdA`'@zR |98 `QR)06) 0 x'HL}mHPj@+n8' Fx{lHI(n(OSH`,\e&@ T" iͫhe60Cax@@aDR fbfD)@=@r/0Ѕ}. ,؄ C.  ! a,P@b@@(X&@IAd(/HCQRP6J"E@``1IHLy#ń0;Чrl7.@R $ xD ed e `e@3WA$#h>A) F- @L4 2J &0h`3% a0F,`,@,(@ T \ ; " `C  rDk*? Qo@ []H B_RiEp(;{`vw:0Є|BvCM'GhPG8QJR@@ep@@2AePswN@vA4&cfpg ÁNAQ耀?b0):Bpa `=xGE ]Pc C liB$!?$TbIiPI p `Kh0P  0Ѕ@ @vzЊO! @$/L# b (8 6; ww$PP aPCDXf-p%$h) @DBD4(% A (DH@0Ă bDU^ )~ƈPP!J aCOPUK@-:AP B aK   EeDB$a"a* 'HK׈2!$$` h'h )X`3/,1!J!4 K*`0정`Y)` h D:} aD!j!r׀,RI(RXp6S ҌW`AaaA" DDp\ S4)#)PJFPA NQiFb8!~ A L8iB5e $'P;fC#X(`@(/a XY & O*0 Pr; @C0!K !@;@ @a rb"E = =ҰCz@C,1R'w @$Z$PD P!`(P5(cF BȐH>F90F@`Z'*.OP'I\dR ;% (B@A`a &8  B14T A,b49M`( . p,`Ph 2f1LX(VfF J39}WN@q !Ep>0]CA<*A$nԀpeZf3d4Y)$Nc,aEs$!@p!s0& 6" E Ak?` sC,"dt'3! }@!E9W~!Hw&$L8|B~)88 )(LQx By8(Ѕ|35 ` 8Az(P@s @sf(A E)tI  p8@ۀ}9WQ@N yD@ hbPA*@\ 4"2w2'J#%#P #  !?C`]'  znܠ@Ty2?#, 0T@$RC@4 tf) 4!_ Al hC n ̀IhG@Аt+P H$$ b`>f&pPU ~p  J$HY90A@R@ W٘Oٌ8hB@  8!n ]ɸ݈:F(+)(45< Bg qY* gE` $ :0PF'  iLo "Ā@؉!?eN@;(*@`12f D 7lAtKa-PzT  B A"APRpWa0Jw bȀQA>;TmB 'K }0ЄBOpN'\\ʏ P0@J@" ˆ-p`% &c7*/,@0-@6aB4W-D i? NIӡ}1p;L;9]D<9 BF|a$B<MSa\8q(BSP;D"h<A0 ̠, *olCidd'O@P& HH9D !p#rFJ,A@J ?  8Z[9Y::xN^@RIUY@N@^^EHF^XZP]yTFղl qRK `.MRa~b?4 CD#l#v(WpX,NNli'L"CHU d@&Hdx"4& ,ZSa FFDCx Iw3aEL+mzC~MZ,$A`@ 8 h|x~l(8 Q}<5L#0H_y?Y0ҠJ;DAl0`(!\LU҄FA^ 3?D[oB" dT pq"ddP_""@%  م`|<C  t # d Ӑ~FN~݀!;@pAp@<E@j)"! |nLZ ݄T;2n(Ot#P@&mo@;x|,`w@`  @΀!'7G0PB0;/WujP* @:b0 !D (@8@$8/# e#J)<  ')n Bxe+ @E@L!&Y/x 8/qb2 (0M:(O_: u'(0?Y##@.)=Y rA%@"se_C)vHB6ÄA C`0P_YS@21s!F̦L!zaA`N ,XX3KI})&b"K0@ $ YSP0 '@AA@C:G ! $ A/T FD` 0F" " Rf@p<@{F ´` P Ј? NQgh%<4\ׁC/Z6B( H+=pR@Jf3@_ .$2ZcXgiKg;KgeL gpX6glX$9 ad@wriQb0d;(Scrb=e/Lesefehler_n0). /x4Jg#ǟ.AMx!K(x3(&x# 2d7P Xc";"i2A=H0< ,MĠV hV*H(\,[: ,yPON#߳7.ERROR<07Ѐ--cNb o0(a Bootintro auf Diskette !)Sxpҹpg[QU4GFYi 4 X`5E`qXzK*fk䠲hM5& O+$\%n kr&=Akr!f:AD *XcM5T7XjP4?fkG9kGfp52Y{iG1FrPvZk X3` X'kfk MXh X3`-5fJ3`5,`,UL#h-! f Z k^ ݰ  k  ֈ X# h9 E Tc M v r Db j 5  X 9@9dAVAZAAAAAAX[Ah"A-DU Bk#BmBB4BBblvԠbB BB4BԠBk8B BC 5C8XBjLP^hԠCiC9xCXS`C-C& `CkCCCCDkDTEh"E"9III4IIRIZIJcIh I9A j(P6@ԠJZ5(JZJJKJA jPԠ5JԠ 5 A2 ԠHR5\An xjPԠ5AM`'E`qXzK*fk䠲hM5&'Q 1~X)$(L P-0q  `d! ,$dlBa%A\0`@\pAp06H6P0@B0|! PN HQ?B0c.| ; $˭pÙ@Œ2r'g :\_`ol`O-\8`c@aOeFber AB.$ *0 6h7L4NDCH @```P Е04P[ hjTnI1b`f5@!‡HAp D`(A&)3B@0BJt@\S -`P( 4T(  b$H @a (:P%2'R9P(Pn^Є``P t=< <932 @X / S$P PmJ $m C@);8 2TPzn:96xE@T"{K !ї &gC`dPAPQ?T\j[:Te%:ALP&Vr.Ddhmj<g3#dN3 s00|jaLnghch(XReD05֨0RԜ=!(! 3" 2'8 ܝ-:V]L.A"e(U 0>dOH%` kie`K9'Pq)# )f@8 PAA-()FoljDR_@@ M\m mM M!('STrm@ @ p` i @@H"$HB ݒW(i9'x:_AB¡Ё%h C0*8 $X 2 09$& Q,K<) hpB(1$AEis:A 0?%ɚM # |\JJqY 7fI @92C1@A0 9 :$ PE .RSDI bL0aq! .Z0>VL "! H?_ H16'~2È z{"@t@i ʘ|;,!1H@@  A` I@*H` D<˨PB D@!f R(N030Wb@Rەp'TTW`cBE#`TPaDRDp H13A/P*'Q^DAE1$% "@'fa6fb/0E8 '< ( "0p R200 `@a h@HLaPA X>@$p b (JP( /H }V zp-@%#hC0780ľĝML mMm< HlL<]MЦzC !R5W`BH!-@ Rq0 p6$IO*B] X`M$& ,'UĨ3BC̐!8 ¯r?9q c;(Ҥ$eB(" h@ v ̔Ӆx s(=/mPX )!rfXnc`\/1Z0O*B*BO!8@DQ`Cs ! JIPPwL, L"@ PC5@9)\P0kBBP qp8 <s.0` #cjnhc`Ghkjh@CyxJF(PL@NrDa@'$'d(;!OK {̀ɐ1E % 3Dh! 8#@€YFD/`aC@4G 2 |6 dB(0'V8 ̀ȰPSpB6AM900&A!- . a(0jB`IBvY(pX0 b XC@$xD(@$ e P9&B~0d Ќ!@`!wBE8}HR* '(8L0-H (؅ 0!5 `(7DH@ a }dR <8 $BH  |99@)zsQ|tC@h(/C()@"dfH@ei!?0ap2`ǑSWÕr 1M($*Bl̘)@ <@F@% 3DZ +07QpF/փA C7D~ KD WJd x %! ' B C@ P'+A U1-#   $ 32 N@[!f`\$ q$fB45+p5f ,J ơ)@ 0(Q<۸0)srp ri@,I):t`T 4NCTy@@BP@'D+U X<2pm=$! @{@rplA- (%CCo stB؁&E:%P8XH8?/ 0@1 @9T (!ʺ8$hD*!C@ ")ٮcLB( %1@P P< >v@f`3R  %htk!qЮd LB A)A*8 5ph gH `)'PA.+H$z faje2rvfa^eHrBDa`6DrfaJQQ`4rx`ra< m gra,6r`r BTB6aSJ QmNu DNuSABB3f DQNu)b0<@P6 @X ^C *q؈ MB o9-8|]!ǡ @ >B"Ȁ<fElȭ\&'`$'c'A2 LAY@pCB/A@A`(2|Qҋ? riBJ8;BJH$/f$ ÕrV (P{А00(V(h$a P"*a V B@@@EBXY dc.l 0 Port dc.l 0 FileName dc.l 0 DiskReq dc.l 0 Task dc.l 0 MemEntry dc.l 0 Unit dc.l 0 Stdout dc.l 0 Mem ds.b LN_SIZE dc.w 3 Mem1 dc.l MEMF_CHIP!MEMF_CLEAR dc.l 1024 Mem2 dc.l MEMF_PUBLIC!MEMF_CLEAR dc.l IOSTD_SIZE Mem3 dc.l MEMF_PUBLIC!MEMF_CLEAR dc.l MP_SIZE DosLib dc.b 'dos.library',0 TrackName dc.b 'trackdisk.device',0 MemMess dc.b 'ENot enough Memory to allocate required buffers',10 CLIMess dc.b 'Usage: FileBootBlock df?: filename',10 ReadMess dc.b 'Disk Error while reading Boot Block',10 WriteMess dc.b 'Error while writing to file',10 OpenMess dc.b 'Error while opening file',10 PMess dc.b 'Couldn''t create message port for disk IO',10 TMess dc.b 'Couldn''t get access to specified drive',10 end nd BASE: Dosbase dc.l 0 Execbase dc.l 0 Filehandle dc.l 0 Buffer ["A"PX+I+|a NLNu m*"mБJ`jS f dZBAf dBG8vBA30HxlFDSBf QQJCgAV30HB`  3QG&kPoG:tf dQBARB3 gHSCf QQ3 HC`   AgBG4vf dQRCBB30Hf RQKs0`2  BBvBDf dvx@f RQDE HSA"Q`NuZ=Tc5xX@m'H瀀Bm?ɹ(@Jg'&i0A\Eaݍ\lNqLa&/JlgzjFX gÒcd9tNhQ? x^$<"̂`[tuiֲ5C>jphics.brar75 Dx~@<2C% ȐAvN|u)}J޼^U rt;sM̌"@(]:u(jrdΆ0,&J@}?.B^7 |"f [nepNuh4e+berK uvrolltext (Laufo2rift+tC Uy4Jg:#ǏAxj1o  <(:Ë x-2r3ڼb 2E '/ >dyA 1;<.1~uPq`[qNȔ)2LHZ$haɅ0^u x20j()_3_uр,EH 829lI>VJؐU*yp;26 ·qpx;߫ע-݂)mwwd5f n6b@sqxH;ː[[ :[ lzQixZŠ{qtJiqŤ)T߮Ee=37?ǁ,ɜ}F_inJxHlۆwxpc"\tж`|?HQ {xU\']SaMTUIpxnp3770aTυ9y?w ``>s ̼⹃珀!<?y=8Qc>g{gdtːC1\ 0Qv f/+І|7Hv7a%Yx(xYx(r%0p]esW^ < x22P]HCug̮ xX~RB<_X<h[13@NjУ04V`z$2$T$j"@pط K:Wc@v  l="["J0BHNPbuRr)3(ޮX#ȩRE9#hCBܝh @K+hBPӈ;|ٖ"Tm.9.+tvL=gLphic4AiHq&^A2"2@QNutopaz.fontdos.librarҌ|@'nhmAr-4{Y](%"QUZQ%F ޞVʶ^rI< Md4A+O.KzoLAﻤ|6`dȸ <#@DZ<#Z`~CSAVEwـ'a[Pa2Xt th|DriveGk(BiplegenSeVsL#werk df0:?l<A3ό3Gτ3Dzτ3D2x3Ax3ڼqK,DM̌"@(]:)(]0,&?^x0J@VV^LOAD INTRO< ThCBx)pИRQF"ݏj 3^pnRId̛x#BHfD s&#cC2 0G22N-trackW.devicexԳ/Wc 9tNhQ d:a5) ;save for closing later move.l mementry(a5),a0 add.w #Mem2-Mem,a0 move.l (a0),a0 ;make an IORequest block move.b #NT_MESSAGE,LN_TYPE(a0) move.w #IOSTD_SIZE,MN_LENGTH(a0) move.l d3,MN_REPLYPORT(a0) move.l a0,diskreq(a5) ;save IO block address move.l unit(a5),d0 lea TrackName(pc),a0 move.l diskreq(a5),a1 moveq.l #0,d1 jsr _LVOOpenDevice(a6) ;open t ewrackdisk on unit tst.l d0 bgt TErr ;won't open, display error move.l diskreq(a5),a1 move.w #CMD_READ,IO_COMMAND(a1) move.l buffer(a5),IO_DATA(a1) move.l #1024,IO_LENGTH(a1) move.l #0,IO_OFFSET(a1) jsr _LVODoIO(a6) ;read boot block into buffer move.l diskreq(a5),a1 move.w #TD_MOTOR,IO_COMMAND(a1) move.l #0,IO_LENGTH(a1) jsr _LVODoIO(a6) ;turn mot f]aor off move.l diskreq(a5),a1 move.b IO_ERROR(a1),d3 ;see what error there was jsr _LVOCloseDevice(a6) ;close trackdisk down cmp.b #19,d3 bgt ReadErr ;if an error display error move.l buffer(a5),a0 move.w #$600A,(a0) ;change first to bytes to BRA.S *+$C ;so as not to upset relative addresses move.l dosbase(a5),a6 ;get dosbase move.l  gv filename(a5),d1 move.l #MODE_NEWFILE,d2 jsr _LVOOpen(a6) ;open file that bootblock goes in tst.l d0 beq OpenErr ;didn't open for some reason move.l d0,filehandle(a5) ;save for closing lea table(pc),a0 ;get first part of file move.l a0,d2 ;used to create a program file move.l d0,d1 ;filehandle into d1 moveq #32,d3 ;leng hth of numbers jsr _LVOWrite(a6) cmp.l #32,d0 bne WriteErr move.l buffer(a5),d2 move.l filehandle(a5),d1 move.l #1024,d3 jsr _LVOWrite(a6) ;write out rest of block to file cmp.l #1024,d0 ;see if it all got written out bne WriteErr move.l filehandle(a5),d1 lea hunkend(pc),a0 move.l a0,d2 moveq #4,d3 jsr _LVOWrite(a6) ;write laiQst bit of file cmp.l #4,d0 bne.s WriteErr Fin move.l filehandle(a5),d1 tst.l d1 beq.s 1$ jsr _LVOClose(a6) ;close file if it opened 1$ move.l execbase(a5),a6 move.l port(a5),d0 tst.l d0 beq.s 2$ move.l d0,a1 bsr DeletePort ;delete port if one got made 2$ move.l mementry(a5),d0 tst.l d0 beq.s 3$ move.l d0,a0 jsr _LVOFreeEntryj1(a6) ;freememory if any got allocated 3$ move.l dosbase(a5),a1 jsr _LVOCloseLibrary(a6) ;close dos.library rts MemErr: lea MemMess(pc),a0 move.l a0,d2 moveq #47,d3 bra.s Err Error: CLIErr: lea CLIMess(pc),a0 move.l a0,d2 moveq #36,d3 bra.s Err ReadErr: lea ReadMess(pc),a0 move.l a0,d2 moveq #36,d3 bra.s Err WriteErr: lea WriteMess(pc),kQna0 move.l a0,d2 moveq #28,d3 bra.s Err OpenErr: lea OpenMess(pc),a0 move.l a0,d2 moveq #25,d3 bra.s Err PError: lea PMess(pc),a0 move.l a0,d2 moveq #41,d3 bra.s Err TErr lea TMess(pc),a0 move.l a0,d2 moveq #39,d3 Err move.l stdout(a5),d1 tst.l d1 beq Fin ;if no output stream move.l dosbase(a5),a6 jsr _l"tLVOWrite(a6) bra Fin CreatePort: move.l a2,-(a7) move.l mementry(a5),a2 add.w #Mem3-Mem,a2 move.l (a2),a2 moveq #-1,d0 jsr _LVOAllocSignal(a6) moveq #-1,d1 cmp.l d0,d1 ;-1 indicates bad signal bne.s cp_sigok move.l (a7)+,a2 moveq #0,d0 ;otherwise indicate no port rts cp_sigok: move.b d0,MP_SIGBIT(a2) move.b #PA_SIGNAL,MP_FLAGS(a2) move.b mq:#NT_MSGPORT,LN_TYPE(a2) clr.b LN_PRI(a2) move.l task(a5),d0 move.l d0,MP_SIGTASK(a2) lea.l MP_MSGLIST(a2),a0 ;Point to list header NEWLIST a0 ;Init new list macro move.l a2,d0 move.l (a7)+,a2 ;cc's NOT affected rts DeletePort: moveq #-1,d0 move.b d0,LN_TYPE(a1) move.l d0,MP_MSGLIST+LH_HEAD(a1) moveq #0,d0 move.b MP_SIGBIT(a1),d0 jsr _LVOFreeSignal(a6) rtsX'! table: dc.l $3f3 ;Hunk_Header dc.l 0 ;no Hunk_Name dc.l 1 ;size of hunk table dc.l 0 ;first hunk dc.l 0 ;last hunk dc.l 256 ;number of longwords in hunk dc.l $3e9 ;Hunk_Code dc.l 256 ;number of longwords in hunk hunkend dc.l $3f2 ;hunk end BASE: Dosbase dc.l 0 Execbase dc.l 0 Filehandle dc.l 0 Buffer oJAqe last column is the amount to shift the A and B operands, to the right, before using them. Finally, in the lower left corner of the DMA channel box are string gadgets for AFWM and ALWM. This program has been tested fairly carefully. Therefore, if the blitter appears to do something it shouldn't, you probably have set up the registers wrong. Remember, the Amiga blitter is a word blitter, not a bit blitter. It can be made to look like a bit blitter with some work. It is possiblex{, however, that errant blits can muck up some system memory, or some internal variable memory, so if things really seem awry, reboot and go back into the program. Try the same values again, and see if they work this time. Tomas Rokicki Radical Eye Software Box 2081 Stanford, CA 94309 (415) 326-5312 rokicki@polya.stanford.edu ...lll-crg!decwrl!polya.stanford.edu!rokicki load the A data register with this value, turn on only the D channel, and blit with the function A. Finally, thq@(a0)+,d0 ;get unit number sub.b #'0',d0 ;make into a real number ext.w d0 ;sign extend to a word ext.l d0 ;sign extend to a long move.l d0,unit(a5) ;save unit number 2$ move.b (a0)+,d0 ;search for space cmp.b #' ',d0 bne.s 2$ move.l a0,filename(a5) ;save address of filename lea Mem(pc),a0 jsr _LVOAllocEntcMry(a6) ;allocate all memory in one go btst #31,d0 bne MemErr ;if bit 31 set then error getting mem move.l d0,mementry(a5) ;save for release move.l d0,a0 add.w #Mem1-Mem,a0 move.l (a0),buffer(a5) ;save address of read/write buffer bsr CreatePort ;create a reply port tst.l d0 beq PError ;no message port move.l d0,d3 move.l d0,port(s!Xv/`:Ax$v$`0A$v$`&A$v`A$v`A$v)`A$v'"-(Jg~,mN`r/ $m $RpNrf$_pNu@||B* -%@A XB!H $_Nup@#@p)NNu0"dos.librarytrackdisk.deviceNot enough Memory to allocate required buffers Usage: FileBootBlock df?: filename Disk Error while reading Boot Block Error while writing to file Error hlwhile opening file Couldn't create message port for disk IO Couldn't get access to specified drive  Df0HH+@$ f+HAfN"fJ+@ @+P aJgd&+@ m  P|1|0!C+H -$AJ"mrNDJn2"m3|#m (#|$#|,N8"m3| #|$N8"m)N> n m 0` ,m"-$<NJg+@A@$"v N f$- "-&<N fn"-A($vN fT"-JgN,m -Jg"@a - Jg @N"mNbNuAS$uciven and save it as ** a program file that can be run (heaven forbid) or disassembled ** by programs like DIS and DSM ** The only modifying it does is the the first 2 bytes of the block. ** As all program file must start with a valid instruction I have ** changed the first 2 bytes from 'DO' to $600A. This makes it into the ** instruction BRA.S *+$C which will get to the start of the proper code ** Have fun ** John Veldthuis ** 21 Ngatai Street ** Manaivsoa, Taranaki ** New Zealand ** 22 November 1988 ** Placed into the Public domain on this date include "exec/types.i" include "intuition/intuition.i" include "devices/trackdisk.i" include "exec/memory.i" include "libraries/dosextens.i" xref _LVOOpenLibrary xref _LVOCloseLibrary xref _LVODoIO xref _LVOOpenDevice xref _LVOCloseDevice xref _LVOAllocEntry xref _LVOFreeEntry xref _LVOOpen xref _LwÊfVOClose xref _LVOWrite xref _LVOAllocSignal xref _LVOFreeSignal Offsets macro \1 equ soffset soffset set soffset+\2 endm soffset set 0 Offsets dosbase,4 Offsets execbase,4 Offsets filehandle,4 Offsets buffer,4 Offsets port,4 Offsets filename,4 Offsets diskreq,4 Offsets task,4 Offsets mementry,4 OxJffsets unit,4 Offsets stdout,4 Start: lea BASE(pc),a5 move.l 4,a6 move.l a6,execbase(a5) movem.l d0/a0,-(sp) move.l $114(a6),a0 ;find our task move.l a0,task(a5) move.l pr_COS(a0),stdout(a5) ;save output stream for messages moveq.l #33,d0 ;version 33 or greater lea DosLib(pc),a1 jsr _LVOOpenLibrary(a6) ;open dos.library movem.l (sp)+,d1/a0 tstp'.l d0 bne.s Lib1 NoLib move.l #20,d0 ;no library, indicate error and stop rts Lib1 move.l d0,dosbase(a5) moveq #0,d0 move.b d0,-1(a0,d1.w) ;zero end of Command line 1$ move.b (a0)+,d0 beq CLIErr and.b #%11011111,d0 ;change to uppercase cmp.b #'D',d0 ;look for the D in DF?: bne.s 1$ move.b (a0)+,d0 ;dummy read to skip the F move.b zj) #define VBITSTART (11) #define HBITSIZE (96 * 6) #define VBITSIZE (32 * 3 + 1) #define HLMGSTART (HBITSIZE + HBITSTART + 2) #define HLMGSIZE (HWINSIZE - HLMGSTART - 5) #define VLMGSIZE (11) #define VLMG1 (VBITSTART + 1) /*#define VLMG2 (VLMG1 + 11)*/ #define VLMG3 (VLMG1 + 11) /*#define VLMG4 (VLMG3 + 9)*/ #define VLMG5 (VLMG3 + 34) #define VGOSTART (VLMG5 + 11) #define HGOSTART (HLMGSTART) #define HGOSIZE (HLMGSIZE) #define VGOSIZE (11) #define VLMG7 (VGOSTART + 11) #define VLMG8 {i,(VLMG7 + 11) #define VSTRSIZE (11) #define HSTRSIZE(a) (8 * (a) + 4) #define HMGSIZE (62) #define FUNCSIZE ((HWINSIZE-HMG4START-6)/2) #define HMGSSIZE (52) #define VMGSIZE (11) #define HMGINT (1) #define VMGINT (0) #define HMG1START (HBITSTART) #define HMG2START (HMG1START + HMGSIZE + HMGINT) #define HMG3START (HMG2START + HMGSIZE + HMGINT) #define HMG4START (HMG3START + HMGSIZE + HMGINT) #define HMGFLSTART (HMG4START + FUNCSIZE) #define HMG5START (HMG4START + HMGSIZE + HMGINT) #defi|Kne HMG6START (HMG5START + HMGSIZE + HMGINT - 2) #define HMG7START (HMG6START + HMGSSIZE + HMGINT) #define HMG8START (HMG7START + HMGSSIZE + HMGINT) #define HMG9START (HMG8START + HMGSSIZE + HMGINT) #define HMG10START (HMG9START + HMGSSIZE + HMGINT) #define HMG11START (HMG10START + HMGSSIZE + HMGINT) #define VMG1START (VBITSTART + VBITSIZE) #define VMG2START (VMG1START + VMGSIZE + VMGINT) #define VRVSTART (VMG2START + VMGSIZE) #define VRVL1 (VRVSTART + 4) #define VRVL2 (VRVL1 + 10) #d }STefine VRVL3 (VRVL2 + 10) #define VRVL4 (VRVL3 + 10) #define VRVL5 (VRVL4 + 10) #define VRVL6 (VRVL5 + 11) #define VRVLL1 (VRVSTART + 2) #define VRVLL2 (VRVLL1 + 9) #define VRVLL3 (VRVLL2 + 11) #define VRVLL4 (VRVLL3 + 11) #define VRVLL5 (VRVLL4 + 11) #define VRVLL6 (VRVLL5 + 11) #define VRG1 (VRVLL1 + 8) #define VRVSIZE (VWINSIZE - VRVSTART - 2) #define HRVSIZE (HWINSIZE - HBITSTART - 3) #define HRVSTART (HBITSTART) #define HRVC1 (HRVSTART + 6) #define HRVC2 (HRVC1 + 5 * 8) #define H ~RVC3 (HRVC2 + 5 * 8) #define HRVC4 (HRVC3 + 2 * 8) #define HRVC5 (HRVC4 + 5 * 8) #define HRVC6 (HRVC5 + 5 * 8) #define HRVC6B (HRVC6 + 5 * 8) #define HMVSTART (HRVC6B + 35) #define HRVC7 (HRVC6B + 5 * 8) #define HRVC8 (HRVC7 + 2 * 8) #define HRVC9 (HRVC8 + 3 * 8 + 4) #define HRVC10 (HRVC9 + 9 * 8) #define HRVC11 (HRVC10 + 7 * 8) #define HRVC12 (HRVC11 + 19 * 8) #define VTEXTOFF (2) #define HTEXTOFF (2) /* * Colors. */ #define BLUE (0) #define WHITE (1) #define BLACK (2) #define O y@RANGE (3) (VRVL2 + 10) #define VRVL4 (VRVL3 + 10) #define VRVL5 (VRVL4 + 10) #define VRVL6 (VRVL5 + 11) #define VRVLL1 (VRVSTART + 2) #define VRVLL2 (VRVLL1 + 9) #define VRVLL3 (VRVLL2 + 11) #define VRVLL4 (VRVLL3 + 11) #define VRVLL5 (VRVLL4 + 11) #define VRVLL6 (VRVLL5 + 11) #define VRG1 (VRVLL1 + 8) #define VRVSIZE (VWINSIZE - VRVSTART - 2) #define HRVSIZE (HWINSIZE - HBITSTART - 3) #define HRVSTART (HBITSTART) #define HRVC1 (HRVSTART + 6) #define HRVC2 (HRVC1 + 5 * 8) #define H } smaller.) Next to the H gadget are gadgets for the DESC, FCI, IFE, EFE, SIGN, and OVF bits of the blitter. These can get set or cleared by selecting them. Underneath these gadgets is the Function gadget. In this gadget you enter the function you want to perform. 0 is clear all, 255 is set all, and other combinations can be entered directly as minterms. For instance, the A~C+~CA presented earlier means exclusive or the A and C bits for the destination. To the right of the Func  tion gadget, you will find the Log File gadget. Type a name in this gadget to accumulate a log file; a null name will result in no file. The lower left hand corner contains the actual blitter registers and their values in hexadecimal. These are the values that are fed to the blitter when you select GO. As you enter new numbers into the string gadgets corresponding to blitter registers, these values will change to reflect the new values. (Actually, they will only change if you h qit carriage return after entering the numbers into the string gadget; if you simply select another gadget after entering data into a string gadget, the old value will stay displayed until you select CALC or GO.) This can be used to calculate minterms, for instance. Entering ABC+A~B~C+~AB~C+~A~BC into the Function gadget hitting return will put 96 in the least significant eight bits of CON0; this is the hexadecimal value reflecting the above minterms. At the lower right is a tablex of string gadgets. Each row is for a single DMA channel. The first column is the USE bit; is that channel on or off? Y means on, N means off; selecting the gadget toggles it. The next column contains the start address for DMA. These numbers (as in the remaining string gadgets) can be entered in decimal, hexadecimal (preceded by a $), binary (preceded by a %), or as an offset from the start of the bit array (preceeded by M+). M alone represents the beginning of the blit array. n`)Z The third column is the modulo value which is added to the DMA channel pointer at the end of each row; this value is in bytes and can be negative. The fourth column is the data register; if a channel is turned off, its data register can be preloaded with a value, and then it functions as a constant. For instance, to fill a block of memory with the value $E931, simply preload the A data register with this value, turn on only the D channel, and blit with the function A. Finally, th 8D0; i<3; i++) blitregs.dat[i] = (gvals[GDGADAT+i] & 65535) ; /* * Now we write out the values. */ writefour(HRVC2, VRVL1, blitregs.con0) ; writefour(HRVC2, VRVL2, blitregs.con1) ; writefour(HRVC2, VRVL3, blitregs.size) ; writefour(HRVC2, VRVL4, blitregs.afwm) ; writefour(HRVC2, VRVL5, blitregs.alwm) ; for (i=0; i<4; i++) { writefour(HRVC4, VRVL2 + 10 * i, blitregs.pth[i]) ; writefour(HRVC5, VRVL2 + 10 * i, blitregs.ptl[i]) ; writefour(HRVC mJT6, VRVL2 + 10 * i, blitregs.mod[i]) ; } for (i=0; i<3; i++) writefour(HRVC6B, VRVL2 + 10 * i, blitregs.dat[i]) ; } tregs.size = ((gvals[GDGV] & 1023) << 6) + (gvals[GDGH] & 63) ; blitregs.afwm = (gvals[GDGAFWM] & 65535) ; blitregs.alwm = (gvals[GDGALWM] & 65535) ; for (i=0; i<4; i++) { blitregs.pth[i] = ((gvals[GDGAPT+i] >> 16) & 65535) ; blitregs.ptl[i] = (gvals[GDGAPT+i] & 65535) ; blitregs.mod[i] = (gvals[GDGAMOD+i] & 65535) ; } for (i=bshort con0, con1, size, afwm, alwm ; short pth[4] ; short ptl[4] ; short mod[4] ; short dat[4] ; } ; /* * A few macros to use the correct names for the above variables. */ #define BLTCON0 blitregs.con0 #define BLTCON1 blitregs.con1 #define BLTSIZE blitregs.size #define BLTAFWM blitregs.afwm #define BLTALWM blitregs.alwm #define BLTAPTH blitregs.pth[0] #define BLTAPTL blitregs.ptl[0] #define BLTAMOD blitregs.mod[0] #define BLTADAT blitregs.dat[0] #define BLTBPTH blitre$gs.pth[1] #define BLTBPTL blitregs.ptl[1] #define BLTBMOD blitregs.mod[1] #define BLTBDAT blitregs.dat[1] #define BLTCPTH blitregs.pth[2] #define BLTCPTL blitregs.ptl[2] #define BLTCMOD blitregs.mod[2] #define BLTCDAT blitregs.dat[2] #define BLTDPTH blitregs.pth[3] #define BLTDPTL blitregs.ptl[3] #define BLTDMOD blitregs.mod[3] #define BLTDDAT blitregs.dat[3] /* * Here we number the gadgets. */ #define GDGPNTREG (0) #define GDGGO (1) #define GDGSX (2) #define GDGSY (3) #define GDGEX (4) #define GDGEY (5) #define GDGLINE (6) #define GDGH (7) #define GDGV (8) #define GDGDESC (9) #define GDGFCI (10) #define GDGIFE (11) #define GDGEFE (12) #define GDGSETUP (13) #define GDGFUNC (14) #define GDGUSEA (15) #define GDGUSEB (16) #define GDGUSEC (17) #define GDGUSED (18) #define GDGAPT (19) #define GDGBPT (20) #define GDGCPT (21) #define GDGDPT (22) #define GDGAMOD (23) #define GDGBMOD (24) #define GDGCMOD (25) #define GDGDMOD (26) #define GDGADAT (27) #define GDGBDAT yy(28) #define GDGCDAT (29) #define GDGASH (30) #define GDGBSH (31) #define GDGAFWM (32) #define GDGALWM (33) #define GDGCALC (34) #define GDGSIGN (35) #define GDGOVF (36) #define GDGUNDO (37) #define GDGSIM (38) #define GDGLF (39) #define MAXGADG (40) /* * These defines set the size of the screen and various subareas of * the screen, including most gadget locations. */ #define HWINSTART (0) #define VWINSTART (2) #define HWINSIZE (640) #define VWINSIZE (198) #define HBITSTART (4I x2 = t ; } if (y1 > y2) { t = y1 ; y1 = y2 ; y2 = t ; } if (x1 != x2 && y1 != y2) error("! can only draw h/v lines currently") ; RectFill(myrp, (long)x1, (long)y1, (long)x2, (long)y2) ; } /* * This routine draws a box. */ box(x1, y1, xsize, ysize) int x1, y1, xsize, ysize ; { xsize = x1 + xsize - 1 ; ysize = y1 + ysize - 1 ; line(x1, y1, xsize, y1) ; line(xsize, y1, xsize, ysize) ; line(xsize, ysize, x1, ysize) ; line(x1), ysize, x1, y1) ; } /* * This routine draws a filled box. */ fbox(x1, y1, xsize, ysize) int x1, y1, xsize, ysize ; { RectFill(myrp, (long)x1, (long)y1, (long)(x1 + xsize - 1), (long)(y1 + ysize - 1)) ; } /* * This routine draws a text string at a particular location. It is * somewhat crude; we build an IntuiText structure, and tell it to * draw it. */ static struct IntuiText dmy = { WHITE, BLUE, JAM2, 0, 0, NULL, NULL, NULL } ; drawtext(x, yl^K, s) int x, y ; char *s ; { dmy.IText = (UBYTE *)s ; PrintIText(myrp, &dmy, (long)(x), (long)(y)) ; } != y2) error("! can only draw h/v lines currently") ; RectFill(myrp, (long)x1, (long)y1, (long)x2, (long)y2) ; } /* * This routine draws a box. */ box(x1, y1, xsize, ysize) int x1, y1, xsize, ysize ; { xsize = x1 + xsize - 1 ; ysize = y1 + ysize - 1 ; line(x1, y1, xsize, y1) ; line(xsize, y1, xsize, ysize) ; line(xsize, ysize, x1, ysize) ; line(x1fm NULL) { fputs(bufarr[i], f) ; putc(10, f) ; } else { fprintf(f, "%ld\n", gvals[i]) ; } savebits() ; fclose(f) ; } /* * Read them from a file. */ readall(num) int num ; { int i ; long j ; char name[40] ; FILE *f ; sprintf(name, "blitlab.save%d", num) ; f = fopen(name, "r") ; if (f == NULL) return ; for (i=0; i> 1) & 1) != gvals[GDGIFE]) flipgadg(GDGIFE) ; if (((q >> 2) & 1) != gvals[GDGFCI]) flipgadg(GDGFCI) ; if (! gvals[GDGUSEA]) flipgadg(GDGUSEA) ; if (gvals[GDGUSEB]) flipgadg(GDGUSEB) ; if (! gvals[GDGUSEC]) flipgadg(GDGUSEC) ; if (! gvals[GDGUSED]) flipgadg(GDGUSED) ; if (gvals[GDGOVF]) flipgadg(GD GOVF) ; } "%d", X+1) ; stuff(GDGV, errorbuf) ; sprintf(errorbuf, "%d", 4 * Y - 2 * X) ; stuff(GDGAPT, errorbuf) ; if (2 * Y - X < 0) { if (!gvals[GDGSIGN]) flipgadg(GDGSIGN) ; } else { if (gvals[GDGSIGN]) flipgadg(GDGSIGN) ; } sprintf(errorbuf, "%d", 4 * (Y - X)) ; stuff(GDGAMOD, errorbuf) ; sprintf(errorbuf, "%d", 4 * Y) ; stuff(GDGBMOD, errorbuf) ; stuff(GDGAFWM, "%1111111111111111") ; stuff(GDGALWM, "%1111111111111 kPDgvals[GDGEFE] << 4) + (gvals[GDGIFE] << 3) + (gvals[GDGFCI] << 2) + (gvals[GDGDESC] << 1) + gvals[GDGLINE] ; blitregs.size = ((gvals[GDGV] & 1023) << 6) + (gvals[GDGH] & 63) ; blitregs.afwm = (gvals[GDGAFWM] & 65535) ; blitregs.alwm = (gvals[GDGALWM] & 65535) ; for (i=0; i<4; i++) { blitregs.pth[i] = ((gvals[GDGAPT+i] >> 16) & 65535) ; blitregs.ptl[i] = (gvals[GDGAPT+i] & 65535) ; blitregs.mod[i] = (gvals[GDGAMOD+i] & 65535) ; } for (i=rlowing formats: * * (M+)?-?[$%]?[0-9a-f]+ * (~?[ABC])(+(~?[ABC]))* */ long parse(s) register char *s ; { int negative = 1 ; int c ; int radix = 10 ; long toadd = 0 ; long val ; static varr[] = { 0xf0, 0xcc, 0xaa } ; parseerr = 0 ; while (*s == ' ') s++ ; if (*s=='~' || *s=='A' || *s=='B' || *s=='C' || *s=='a' || *s=='b' || *s=='c') { val = 0 ; while (1) { toadd = 255 ; while (1) { ` if (*s == '~') { negative = 255 ; s++ ; } else negative = 0 ; c = *s++ ; if (c == 0 || c == '+') { if (toadd == 255) parseerr = 1 ; break ; } if (c >= 'a' && c <= 'z') c -= 'a' - 'A' ; if (c < 'A' || c > 'C') { parseerr = 1 ; break ; } toadd &= negativeb ^ varr[c-'A'] ; } val |= toadd ; if (c != '+') { if (c != 0) parseerr = 1 ; break ; } } return(val) ; } else { if (*s == 'm' || *s == 'M') { if (s[1]=='+') { s += 2 ; toadd = (long)realbits ; } else if (s[1]==0) return((long)realbits) ; else { parseerr = 1 ; return(0) ; } } if (*s =we= '-') { negative = -1 ; s++ ; } if (*s == '$') { radix = 16 ; s++ ; } else if (*s == '%') { radix = 2 ; s++ ; } val = 0 ; if (*s == 0) { parseerr = 1 ; return(val) ; } while (1) { c = *s ++ ; if (c == 0) break ; if (c >= 'a' && c <= 'z') c -= 'a' - 'A' ; if (c >= 'A' && c <= 'F') c -= 'A' - 10 Lq; else c -= '0' ; if (c < 0 || c >= radix) { parseerr = 1 ; break ; } val = val * radix + c ; } return(toadd + negative * val) ; } } /* * This routine parses all of the string gadgets. If it is successful, * it returns 1, otherwise it returns 0. */ int parseall() { int i ; for (i=0; i>= 4 ; tmp[2] = hex[val & 15] ; val >>= 4 ; tmp[1] = hex[val J.& 15] ; val >>= 4 ; tmp[0] = hex[val & 15] ; drawtext(x, y, tmp) ; } /* * This routine calculates and writes out *all* of the blitter * register values. */ updateregs() { int i ; blitregs.con0 = ((gvals[GDGASH] & 15) << 12) + (gvals[GDGUSEA] << 11) + (gvals[GDGUSEB] << 10) + (gvals[GDGUSEC] << 9) + (gvals[GDGUSED] << 8) + (gvals[GDGFUNC] & 255) ; blitregs.con1 = ((gvals[GDGBSH] & 15) << 12) + (gvals[GDGSIGN] << 6) + (gvals[GDGOVF] << 5) + ( Aa* settable values. */ color(WHITE) ; box(HRVSTART, VRVSTART, HRVSIZE, VRVSIZE) ; line(HMVSTART, VRVSTART, HMVSTART, VRVSTART + VRVSIZE - 1) ; } /* * This routine cleans up for exit. */ cleanup() { if (font != NULL) CloseFont(font) ; if (mywindow != NULL) { ClearPointer(mywindow) ; CloseWindow(mywindow) ; } if (myscreen != NULL) CloseScreen(myscreen) ; if (GfxBase != NULL) CloseLibrary(GfxBase) ; if (IntuitionBase != NULL F) CloseLibrary(IntuitionBase) ; freemem() ; exit(0) ; } /* * Pointer routines. */ makepointer() { short *pointer ; int i ; pointer = allocmem((long)sizeof(pointerTable), MEMF_CHIP) ; movmem(pointerTable, pointer, sizeof(pointerTable)) ; SetPointer(mywindow, pointer, 15L, 15L, -7L, -7L) ; } /* * drawlabels() draws several miscellaneous labels all over the * screen. */ drawlabels() { drawtext(HLMGSTART+4, VLMG3+2, "Adrs:") ; drawtext(HLMGSTA yRT+4, VLMG3+10, " M+") ; drawtext(HLMGSTART+4, VLMG3+18, "Shift:") ; drawtext(HRVC1 + 12, VRVL6, "Blitter Register Values") ; drawtext(HRVC7 + 4, VRVLL6+1, "DMA Channels") ; drawtext(HRVC1, VRVL1, "CON0") ; drawtext(HRVC1, VRVL2, "CON1") ; drawtext(HRVC1, VRVL3, "SIZE") ; drawtext(HRVC1, VRVL4, "AFWM") ; drawtext(HRVC1, VRVL5, "ALWM") ; drawtext(HRVC3, VRVL2, "A") ; drawtext(HRVC3, VRVL3, "B") ; drawtext(HRVC3, VRVL4, "C") ; drawtext(HRVC3, VRVL5,  on"D") ; drawtext(HRVC4 + 4, VRVL1, "PTH PTL MOD DAT") ; drawtext(HRVC7, VRVLL2+1, "A") ; drawtext(HRVC7, VRVLL3+1, "B") ; drawtext(HRVC7, VRVLL4+1, "C") ; drawtext(HRVC7, VRVLL5+1, "D") ; drawtext(HRVC8, VRVLL1, "USE PT MOD DAT SH") ; } window, pointer, 15L, 15L, -7L, -7L) ; } /* * drawlabels() draws several miscellaneous labels all over the * screen. */ drawlabels() { drawtext(HLMGSTART+4, VLMG3+2, "Adrs:") ; drawtext(HLMGSTAz x4 = x3 - gvals[GDGH] * 2 + 2 ; if (x1 < lower || x2 < lower || x3 < lower || x4 < lower || x1 > upper || x2 > upper || x3 > upper || x4 > upper) return(0) ; else return(1) ; } else { x2 = x1 + gvals[GDGH] * 2 - 2 ; x3 = x1 + (gvals[GDGV] - 1) * ((gvals[GDGH] * 2) + (gvals[GDGDMOD] & ~1)) ; x4 = x3 + gvals[GDGH] * 2 - 2 ; if (x1 < lower || x2 < lower || x3 l< lower || x4 < lower || x1 > upper || x2 > upper || x3 > upper || x4 > upper) return(0) ; else return(1) ; } } } /* * This routine stuffs a value in a gadget. Could be dangerous, but * that's life. */ stuff(id, s) int id ; char *s ; { gvals[id] = parse(s) ; RemoveGadget(mywindow, gadgets[id]) ; strcpy(((struct StringInfo *)(gadgets[id]->SpecialInfo))->Buffer, s) ; AddGadget(mywindow, gadgets[id], -1) ; Refb;reshGadgets(gadgets[id], mywindow, NULL) ; } /* * This routine flips the state of a toggle gadget. */ flipgadg(id) int id ; { struct IntuiText *temp ; struct Gadget *gp = gadgets[id] ; RemoveGadget(mywindow, gp) ; temp = gp->GadgetText ; gp->GadgetText = (struct IntuiText *)gp->UserData ; gp->UserData = (APTR)temp ; gp->NextGadget = NULL ; AddGadget(mywindow, gp, -1) ; RefreshGadgets(gp, mywindow, NULL) ; gvals[id] = 1 - gvals[id] ; } /* * This r`outine sets up a line. */ setupline() { int x, y ; int i ; int X, Y ; int q = 0 ; parseall() ; stuff(GDGADAT, "$8000") ; stuff(GDGBDAT, "$ffff") ; x = gvals[GDGSX] ; y = gvals[GDGSY] ; sprintf(errorbuf, "%d", x & 15) ; stuff(GDGASH, errorbuf) ; i = ((x >> 3) & ~1) + y * 12 ; sprintf(errorbuf, "M+%d", i) ; stuff(GDGCPT, errorbuf) ; stuff(GDGDPT, errorbuf) ; stuff(GDGCMOD, "12") ; stuff(GDGDMOD, "12") ; stuff(GDGH, "2") ; x = ((a^dvi #?.o #?.b #?.uu l gadgets.cp.3gvals[GDGEX] - gvals[GDGSX]) ; y = (gvals[GDGEY] - gvals[GDGSY]) ; if (x < 0) X = - x ; else X = x ; if (y < 0) Y = - y ; else Y = y ; if (x > 0) { if (y > 0) { q = (X > Y ? 1 : 0) ; } else { q = (X > Y ? 3 : 4) ; } } else { if (y > 0) { q = (X > Y ? 5 : 2) ; } else { q = (X > Y ? 7 : 6) ; } } if (Y > X) { i = X ; X = Y ; Y = i ; } sprintfDd3, x4 ; long lower, upper ; if (gvals[GDGUSED]==0) return(1) ; lower = (long)realbits ; upper = 382 + (long)realbits ; if (gvals[GDGH] < 1 || gvals[GDGV] < 1 || gvals[GDGH] > 64 || gvals[GDGV] > 1024) return(0) ; if (gvals[GDGLINE]) { } else { x1 = gvals[GDGDPT] ; if (gvals[GDGDESC]) { x2 = x1 - gvals[GDGH] * 2 + 2 ; x3 = x1 - (gvals[GDGV] - 1) * ((gvals[GDGH] * 2) + (gvals[GDGDMOD] & ~1)) ;  *aRT, VMG2START, HMGSIZE, "0", 20, "EX") ; buildstring(GDGEY, HMG2START, VMG2START, HMGSIZE, "0", 20, "EY") ; buildstring(GDGH, HMG4START, VMG1START, HMGSIZE, "0", 20, "W") ; buildstring(GDGV, HMG5START, VMG1START, HMGSIZE, "0", 20, "H") ; buildstring(GDGFUNC, HMG4START, VMG2START, FUNCSIZE, "0", 100, "Func") ; buildstring(GDGLF, HMGFLSTART, VMG2START, FUNCSIZE, "", 100, "Log") ; for (i=0; i<4; i++) buildstring(GDGAPT+i, HRVC9, VRG1 + 11 * i, HSTRSIZE(8), "0", 2 0, NULL) ; for (i=0; i<4; i++) buildstring(GDGAMOD+i, HRVC10, VRG1 + 11 * i, HSTRSIZE(6), "0", 20, NULL) ; for (i=0; i<3; i++) buildstring(GDGADAT+i, HRVC11, VRG1 + 11 * i, HSTRSIZE(18), "0", 20, NULL) ; for (i=0; i<2; i++) buildstring(GDGASH+i, HRVC12, VRG1 + 11 * i, HSTRSIZE(4), "0", 20, NULL) ; buildstring(GDGAFWM, HRVC11, VRG1 + 33, 180, "%1111111111111111", 20, "FWM") ; buildstring(GDGALWM, HRVC11, VRG1 + 44, 180,f "%1111111111111111", 20, "LWM") ; RefreshGadgets(mywindow->FirstGadget, mywindow, NULL) ; } "EY") ; buildstring(GDGH, HMG4START, VMG1START, HMGSIZE, "0", 20, "W") ; buildstring(GDGV, HMG5START, VMG1START, HMGSIZE, "0", 20, "H") ; buildstring(GDGFUNC, HMG4START, VMG2START, FUNCSIZE, "0", 100, "Func") ; buildstring(GDGLF, HMGFLSTART, VMG2START, FUNCSIZE, "", 100, "Log") ; for (i=0; i<4; i++) buildstring(GDGAPT+i, HRVC9, VRG1 + 11 * i, HSTRSIZE(8), "0", 2g#gn.Width = GfxBase->NormalDisplayColumns ; mynewscreen.Height = GfxBase->NormalDisplayRows ; if ((myscreen=OpenScreen(&mynewscreen))==NULL) error("! Couldn't open screen") ; LoadRGB4(&(myscreen->ViewPort), colorTable, 4L) ; mynewwindow.Screen = myscreen ; mynewwindow.Type = CUSTOMSCREEN ; } if ((mywindow=OpenWindow(&mynewwindow))==NULL) error("! Couldn't open window") ; makepointer() ; myrp = mywindow -> RPort ; if (! custscrMeen) { font = OpenFont(&myfont) ; if (font != NULL) SetFont(myrp, font) ; } allocbitmem() ; buildgadgets() ; drawlabels() ; parseall() ; /* * Here we draw the bits array, hopefully for easy reference. */ color(BLACK) ; fbox(HBITSTART, VBITSTART, HBITSIZE, VBITSIZE) ; color(WHITE) ; box(HBITSTART, VBITSTART, HBITSIZE, VBITSIZE) ; color(ORANGE) ; for (i=1; i<24; i++) box(HBITSTART + i * 24 - 2, VBITSTART, 2, VBITSIZE) ;   for (i=HBITSTART+4; i>" ; static struct Screen *myscreen ; static struct TextFont *font ; static struct TextAttr myfont = { (STRPTR) "topaz.font", TOPAZ_EIGHTY, 0, 0 }; static struct NewScreen mynewscreen = { 0, /* left edge */ 0, /* top edge */ 640, /* width */ 200, /* height */ 2, \ 4 /* depth (change for color?)*/ 1, /* detail pen */ 2, /* block pen */ HIRES, /* screen mode */ CUSTOMSCREEN, /* type */ &myfont, /* use default font */ (UBYTE *)defaulttitle, /* title */ NULL, /* initia]Qaulize this gadget field */ NULL } ; /* no bitmap supplied */ static short colorTable[] = { 0x058f, 0x0fff, 0x0000, 0x0555 } ; static short pointerTable[] = { 0x0000, 0x0000, 0x0100, 0x0000, 0x0100, 0x0000, 0x0100, 0x0000, 0x0100, 0x0000, 0x0100, 0x0000, 0x0380, 0x0280, 0x0440, 0x0440, 0xFC7E, 0x0000, 0x0440, 0x0440, 0x0380, 0x0280, 0x0100, 0x0000, 0x0100, 0x0000, 0x02100, 0x0000, 0x0100, 0x0000, 0x0100, 0x0000, 0x0000, 0x0000 } ; /* * This is the humongous window we open on the standard * workbench screen. */ static struct NewWindow mynewwindow = { HWINSTART, VWINSTART, HWINSIZE, VWINSIZE, -1, -1, MOUSEBUTTONS | MOUSEMOVE | GADGETDOWN | GADGETUP | CLOSEWINDOW | VANILLAKEY, WINDOWDEPTH | WINDOWCLOSE | WINDOWDRAG | SMART_REFRESH | REPORTMOUSE | ACTIVATE | RMBTRAP, NULL, NULL, (UBYTE *)BANNER, NULLU, NULL, 0, 0, 0, 0, WBENCHSCREEN } ; /* * This is the main initialize routine, which gets everything started * up. */ initialize() { int i, j ; /* * First, we try and open libraries and windows. */ if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary( "intuition.library",0L))==NULL || (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L)) ==NULL) error("! Couldn't open libraries") ; if (custscreen) { mynewscreevTVder *bp ; register short *r ; bp = allocmem((long)sizeof(struct Border), MEMF_CLEAR) ; r = allocmem(20L, MEMF_CLEAR) ; r[2] = xsize ; r[4] = xsize ; r[5] = ysize ; r[7] = ysize ; bp->FrontPen = WHITE ; bp->DrawMode = JAM2 ; bp->Count = 5 ; bp->XY = r ; return(bp) ; } /* * This routine allocates an intuitext structure, with a string * centered in it. */ static struct IntuiText *centertext(size, s) int size ; char *s ; { register struct InpPtuiText *itp ; itp = allocmem((long)sizeof(struct IntuiText), MEMF_CLEAR) ; itp->FrontPen = WHITE ; itp->DrawMode = JAM2 ; itp->TopEdge = 2 ; itp->LeftEdge = (size - strlen(s) * 8) / 2 ; itp->IText = (UBYTE *)s ; return(itp) ; } /* * This routine builds a simple hit gadget, given an id, x and * y locations, xsize and ysize, and a string label. */ static buildhit(id, x, y, xsize, ysize, s) int id ; int x, y, xsize, ysize ; char *s ; { register struct Ganndget *gp ; gp = allocmem((long)sizeof(struct Gadget), MEMF_CLEAR) ; gp->LeftEdge = x ; gp->TopEdge = y ; gp->Width = xsize ; gp->Height = ysize ; gp->Flags = GADGHCOMP ; gp->Activation = RELVERIFY ; gp->GadgetType = BOOLGADGET ; gp->GadgetRender = (APTR)givebox(xsize, ysize) ; gp->GadgetText = centertext(xsize, s) ; gp->GadgetID = id ; gadgets[id] = gp ; AddGadget(mywindow, gp, 0) ; } /* * This routine builds a gadget with two possible strin5gs. It is up * to the user to flip the strings when it is selected; this means * taking it off the list and putting it back on. */ static buildtoggle(id, x, y, xsize, ysize, s1, s2) int id ; int x, y, xsize, ysize ; char *s1, *s2 ; { register struct Gadget *gp ; gp = allocmem((long)sizeof(struct Gadget), MEMF_CLEAR) ; gp->LeftEdge = x ; gp->TopEdge = y ; gp->Width = xsize ; gp->Height = ysize ; gp->Flags = GADGHNONE ; gp->Activation = GADGIMMEDIATE ; l4 gp->GadgetType = BOOLGADGET ; gp->GadgetRender = (APTR)givebox(xsize, ysize) ; gp->GadgetText = centertext(xsize, s1) ; gp->GadgetID = id ; gp->UserData = (APTR)centertext(xsize, s2) ; gadgets[id] = gp ; AddGadget(mywindow, gp, 0) ; } /* * This routine builds a simple string gadget. We allocate pieces * of the `strings' array as we do the gadgets. `p' holds a pointer * to the next available chunk; we have to be careful to initialize. * We also allow) a label parameter which lives to the left of the * string gadget. */ static char undobuf[100] ; static char *p ; static buildstring(id, x, y, width, init, rmax, lab) int id ; int x, y ; int width ; char *init ; int rmax ; char *lab ; { register struct Gadget *gp ; register struct StringInfo *sip ; register struct Border *bp ; int ysize ; int xsize ; int chars ; if (lab != NULL) { drawtext(x + 4, y + 2, lab) ; x += 8 + strlen(lab) * 8 ; wid=Bth -= 8 + strlen(lab) * 8 ; } chars = ( width - 4 ) / 8 ; ysize = VSTRSIZE ; xsize = HSTRSIZE(chars) ; bufarr[id] = p ; strcpy(p, init) ; gp = allocmem((long)sizeof(struct Gadget), MEMF_CLEAR) ; sip = allocmem((long)sizeof(struct StringInfo), MEMF_CLEAR) ; sip->Buffer = (UBYTE *)p ; p += rmax ; sip->UndoBuffer = (UBYTE *)undobuf ; sip->MaxChars = rmax ; gp->LeftEdge = x + 2 ; gp->TopEdge = y + 2 ; gp->Width = xsize ; gp->Height = ysize  W- 3 ; gp->Flags = GADGHCOMP ; gp->Activation = RELVERIFY ; gp->GadgetType = STRGADGET ; bp = givebox(xsize - 2, ysize - 2) ; bp->XY[0] = -2 ; bp->XY[1] = -2 ; bp->XY[3] = -2 ; bp->XY[6] = -2 ; bp->XY[8] = -2 ; bp->XY[9] = -2 ; gp->GadgetRender = (APTR)bp ; gp->GadgetText = NULL ; gp->SpecialInfo = (APTR)sip ; gp->GadgetID = id ; gadgets[id] = gp ; AddGadget(mywindow, gp, 0) ; } /* * This routine actually creates all of the gadgets.  BBWish * us luck placing all of these correctly! */ buildgadgets() { int i ; p = strings ; buildhit(GDGGO, HGOSTART, VGOSTART, HGOSIZE, VGOSIZE, "GO") ; buildhit(GDGSETUP, HMG3START, VMG2START, HMGSIZE, VMGSIZE, "Setup") ; buildhit(GDGCALC, HLMGSTART, VLMG5, HLMGSIZE, VLMGSIZE, "Calc") ; buildhit(GDGUNDO, HLMGSTART, VLMG7, HLMGSIZE, VLMGSIZE, "Undo") ; buildtoggle(GDGPNTREG, HLMGSTART, VLMG1, HLMGSIZE, VLMGSIZE, "Point", " Box ") ; buildtoggle(GDGLINE Ӆ, HMG3START, VMG1START, HMGSIZE, VMGSIZE, "(line)", " LINE ") ; buildtoggle(GDGDESC, HMG6START, VMG1START, HMGSSIZE, VMGSIZE, "(desc)", " DESC ") ; buildtoggle(GDGFCI, HMG7START, VMG1START, HMGSSIZE, VMGSIZE, "(fci)", " FCI ") ; buildtoggle(GDGIFE, HMG8START, VMG1START, HMGSSIZE, VMGSIZE, "(ife)", " IFE ") ; buildtoggle(GDGEFE, HMG9START, VMG1START, HMGSSIZE, VMGSIZE, "(efe)", " EFE ") ; buildtoggle(GDGSIGN, HMG10START, VMG1START, HMGSSI AZE, VMGSIZE, "(sign)", " SIGN ") ; buildtoggle(GDGOVF, HMG11START, VMG1START, HMGSSIZE, VMGSIZE, "(ovf)", " OVF ") ; buildtoggle(GDGSIM, HLMGSTART, VLMG8, HLMGSIZE, VLMGSIZE, "Real ", "Simul") ; for (i=0; i<4; i++) buildtoggle(GDGUSEA+i, HRVC8, VRG1 + 11 * i, 24, VSTRSIZE, "N", "Y") ; buildstring(GDGSX, HMG1START, VMG1START, HMGSIZE, "0", 20, "SX") ; buildstring(GDGSY, HMG2START, VMG1START, HMGSIZE, "0", 20, "SY") ; buildstring(GDGEX, HMG1STAmfill only works properly when in the descending mode. FILL_XOK * turns off bits which toggle fill_bit to zero. */ if (FILL_OK || FILL_XOK) for (i=1; i; i <<= 1) if (result & i) { if (FILL_XOK && fill_bit) result &= ~i ; fill_bit = ~fill_bit ; } else result |= (i & fill_bit) ; /* * Debug stuff. */ if (f) fprintf(f, "aval = %04x bval = %04x cval = %04x dval = %04x\n", a_hold, b_hold, c_hold, result) ; /* * We or in our result to our zero flag; this way, if we ever hit a zero * result, zeroflag will be non-zero. */ zeroflag |= result ; /* * The actual writing is pipelined one stage; if we buffered a write * last time around, we write it here. */ if (old_address != -1) { if (f) fprintf(f, "*** [%08lx] <-- %04x\n", old_address, old_resSult) ; screenupdate(old_address, old_result) ; } /* * If the destination is enabled, we buffer up a value to be written the * next time around. Again, the pointer might not really be incremented * if the destination is disabled. */ if (DEST_ENABLED) { old_result = result ; old_address = dptr ; } dptr += tiny_inc ; } /* * Next, we add the modulos to all the pointers at the end of each row. */  漆 aptr += amod ; bptr += bmod ; cptr += cmod ; dptr += dmod ; } /* * Finally, we are at the end of the blit; if we still have a write in * the pipeline, we write it here. */ if (old_address != -1) { if (f) fprintf(f, "*** [%08lx] <-- %04x\n", old_address, old_result) ; screenupdate(old_address, old_result) ; } if (f) fclose(f) ; /* * If we ever saw a non-zero value, then zeroflag is set, so we return * a zero;`ND otherwise, we return a 1. */ return(!zeroflag) ; } /* * And this is the simulator for when we are in the line mode. * (Oh, shucks, you mean it's not written yet?) */ int dolineblit() { error("we can't simulate line blits yet.") ; Delay(50L) ; return(0) ; } /* * The actual routine. All we do is call the appropriate real * routine, depending on whether the line mode is set or not. */ int dosimblit() { error("Simulating . . .") ; if (BLTCON1 & LINEMODEIS) return(dolineblit()) ; else return(donotlineblit()) ; } += dmod ; } /* * Finally, we are at the end of the blit; if we still have a write in * the pipeline, we write it here. */ if (old_address != -1) { if (f) fprintf(f, "*** [%08lx] <-- %04x\n", old_address, old_result) ; screenupdate(old_address, old_result) ; } if (f) fclose(f) ; /* * If we ever saw a non-zero value, then zeroflag is set, so we return * a zero;e blitter functions. * It only allows use of the `blit' operations; for area fills or line * drawing, it will need to be extended. * * Information gleaned from the Hardware Reference Manual. */ #define BLTADD (0xdff040L) /* * This structure contains everything we need to know. * Do not do a structure copy into this! Instead, assign * each field. The last field assigned must be bltsize; that * starts up the blitter. Also note that all of these are * write ]yLkonly, and you can't read them. */ struct bltstruct { short con0 ; short con1 ; short afwm ; short alwm ; short cpth, cptl, bpth, bptl, apth, aptl, dpth, dptl ; short bltsize ; short dmy1, dmy2, dmy3 ; short cmod, bmod, amod, dmod ; short dmy4, dmy5, dmy6, dmy7 ; short cdat, bdat, adat ; } *blitter = BLTADD ; /* * The actual routine. After we own the blitter, we need to wait for * it to finish. */ int doblit() { int toreturn ; if (gvals[GD\EGSIM]) return(dosimblit()) ; OwnBlitter() ; WaitBlit() ; blitter->con0 = blitregs.con0 ; blitter->con1 = blitregs.con1 ; blitter->afwm = blitregs.afwm ; blitter->alwm = blitregs.alwm ; blitter->apth = blitregs.pth[0] ; blitter->bpth = blitregs.pth[1] ; blitter->cpth = blitregs.pth[2] ; blitter->dpth = blitregs.pth[3] ; blitter->aptl = blitregs.ptl[0] ; blitter->bptl = blitregs.ptl[1] ; blitter->cptl = blitregs.ptl[2] ; blitter->dptl = b|$litregs.ptl[3] ; blitter->amod = blitregs.mod[0] ; blitter->bmod = blitregs.mod[1] ; blitter->cmod = blitregs.mod[2] ; blitter->dmod = blitregs.mod[3] ; blitter->adat = blitregs.dat[0] ; blitter->bdat = blitregs.dat[1] ; blitter->cdat = blitregs.dat[2] ; /* * Wham! It is the following assignment that starts the blitter. */ blitter->bltsize = blitregs.size ; WaitBlit() ; toreturn = custom.dmaconr ; DisownBlitter() ; return(toreturn & DMAF_BLTNZ5ERO ? 1 : 0) ; } rn(dosimblit()) ; OwnBlitter() ; WaitBlit() ; blitter->con0 = blitregs.con0 ; blitter->con1 = blitregs.con1 ; blitter->afwm = blitregs.afwm ; blitter->alwm = blitregs.alwm ; blitter->apth = blitregs.pth[0] ; blitter->bpth = blitregs.pth[1] ; blitter->cpth = blitregs.pth[2] ; blitter->dpth = blitregs.pth[3] ; blitter->aptl = blitregs.ptl[0] ; blitter->bptl = blitregs.ptl[1] ; blitter->cptl = blitregs.ptl[2] ; blitter->dptl = b9ificant * bit. The blitter ignores that least significant bit. * Note that the words concatenated in these four statements are * actually adjacent in the actual blitter layout, so they can be * referenced by a single longword read or write. */ aptr = CATWORDS(BLTAPTH,BLTAPTL) & ~1 ; bptr = CATWORDS(BLTBPTH,BLTBPTL) & ~1 ; cptr = CATWORDS(BLTCPTH,BLTCPTL) & ~1 ; dptr = CATWORDS(BLTDPTH,BLTDPTL) & ~1 ; /* * Our modulos also lose their least significant bit.P Note that * they are treated as signed 16 bit values. */ amod = BLTAMOD & ~1 ; bmod = BLTBMOD & ~1 ; cmod = BLTCMOD & ~1 ; dmod = BLTDMOD & ~1 ; /* * Next, we extract some information from our control words. * Note that if either the hsize or vsize are zero, their * maximum values are used instead. */ hsize = BLTSIZE & HSIZEMASK ; if (hsize == 0) hsize = 64 ; vsize = (BLTSIZE >> HSIZEBITS) & VSIZEMASK ; if (vsize == 0) vsize = 1024 ; /* * We don't want to ever print out more than 32K of debug; there's no * reason, so we turn tracing off if hsize*vsize > 218. */ if (hsize * (long)vsize > 218) f = NULL ; else f = openlogfile() ; ashift = (BLTCON0 >> ASHIFTSHIFT) & 0xf ; bshift = (BLTCON1 >> BSHIFTSHIFT) & 0xf ; minterm = BLTCON0 & 0xff ; /* * We initialize the zero flag, the old word registers for the * shifters, and get the initial data values for the A, B, and * C chan ʧ/Qlnels. */ zeroflag = 0 ; a_old = 0 ; b_old = 0 ; old_address = -1 ; a_new = BLTADAT ; b_new = BLTBDAT ; c_hold = BLTCDAT ; /* * If we are blitting forward, each time around each DMA channel's * pointer is increased by 2. Otherwise, it is decremented by 2. * In addition, when blitting backwards, our modulos are subtracted, * so we take care of that by negating them here. */ if (BLITTING_FORWARD) { tiny_inc = 2 ; } else { tiny_inc =  >6-2 ; amod = - amod ; bmod = - bmod ; cmod = - cmod ; dmod = - dmod ; } /* * Debug stuff */ if (f) { fprintf(f, "\namod = %04x bmod = %04x cmod = %04x dmod = %04x\n", amod, bmod, cmod, dmod) ; fprintf(f, "adat = %04x bdat = %04x cdat = %04x size = %04x\n", a_new, b_new, c_hold, BLTSIZE) ; fprintf(f, "con0 = %04x con1 = %04x afwm = %04x alwm = %04x\n", BLTCON0, BLTCON1, BLTAFWM, BLTALWM) ;  h| logflagdata(f) ; } /* * We iterate through the rows, and print debug stuff each time. */ for (v=0; v>>Row %d\n", v) ; /* * At the beginning of each row, the fill bit gets set to its initial * value from the control register. */ fill_bit = (BLTCON1 & FILL_CARRYIN ? 0xffff : 0) ; /* * Now we run through the columns, again printing debug information * each time around. */ for (h=0; h> ashift ; b_hold = CATWORDS(b_old,b_new) >> bshift ; } else { a_hold = CATWORDS(a_masked,a_old) >> (16 - ashift) ; b_hold = CATWORDS(b_new,b_old) >> (16 - bshift) ; } a_old = a_masked ; b_old = b_new ; /* * Our minterm calculation is next. */ result = (minterm & 1 ? ~a_hold & ~b_hold & ~c_hold : 0) | (minterm & 2 ? ~a_hold & ~b_hold & c_hGold : 0) | (minterm & 4 ? ~a_hold & b_hold & ~c_hold : 0) | (minterm & 8 ? ~a_hold & b_hold & c_hold : 0) | (minterm & 16 ? a_hold & ~b_hold & ~c_hold : 0) | (minterm & 32 ? a_hold & ~b_hold & c_hold : 0) | (minterm & 64 ? a_hold & b_hold & ~c_hold : 0) | (minterm & 128 ? a_hold & b_hold & c_hold : 0) ; /* * If we are in the fill mode, we do the appropriate thing. Note that * $j (struct IntuiMessage *)GetMsg(mywindow->UserPort))) { x = message->MouseX ; y = message->MouseY ; if (message->Class == MOUSEMOVE) { ReplyMsg(message) ; message = NULL ; mousemoved = 1 ; } else { if (message->Class == MOUSEBUTTONS) { selectdown = (message->Code == SELECTDOWN) ; menudown = (message->Code == MENUDOWN) ; bam = 1 ; } el hqDse if (message->Class == GADGETDOWN || message->Class == GADGETUP) { updatethem = 1 ; handlegadget((struct Gadget *)(message->IAddress)) ; } else if (message->Class == CLOSEWINDOW) { getouttahere = 1 ; } else if (message->Class == VANILLAKEY) { if (1 <= message->Code && message->Code <= 26) saveall(message->Code) ; else if ('a' <= message->Code  Ԥm&& message->Code <= 'z') readall(message->Code - 'a' + 1) ; else if ('A' <= message->Code && message->Code <= 'Z') readall(message->Code - 'Z' + 1) ; } else error("! undefined message class") ; ReplyMsg(message) ; message = NULL ; } } if (getouttahere) break ; if (updatethem) { parseall() ; updatethem = 0 ; } x = (x -  ~3HBITSTART + 2) / 6 ; y = (y - VBITSTART) / 3 ; if (y < 32 && x < 96 && x >= 0 && y >= 0) { if (gvals[GDGPNTREG]) { if (bam) { if (selectdown || menudown) { ox = x ; oy = y ; on = selectdown ; } else { preg(ox, oy, x, y, on) ; } } } else { if (selectdown || menudown) pdot(x, y, selectdown)  ֨; } if (message != NULL || (message = (struct IntuiMessage *)GetMsg(mywindow->UserPort))) ; else updatepos(x, y) ; } } cleanup() ; } /* * This routine gives us a log file, if appropriate. */ char filename[120] ; FILE *openlogfile() { char *p, *q ; FILE *f ; f = NULL ; p = bufarr[GDGLF] ; if (p) { while (*p == ' ') p++ ; for (q = filename; *p > ' '; q++, p++) *q =  *p ; *q = 0 ; if (filename[0]!=0) f = fopen(filename, "a") ; } return(f) ; } /* * This routine writes out additional information about the * blitter variables. */ static char *flags[] = { "LINE", "DESC", "FCI", "IFE", "EFE", "OVF", "SIGN" } ; logflagdata(f) FILE *f ; { unsigned short t ; unsigned short con0, con1 ; con0 = blitregs.con0 ; con1 = blitregs.con1 ; fprintf(f, "ASH = %d BSH = %d ", con0 >> 12, con1 >> 12) ; if (con0 & Sq ' '; q++, p++) *q =}\def\par{\leavevmode\endgraf} \catcode`\\=12\catcode`\{=12 \catcode`\}=12\catcode`\$=12\catcode`\&=12 \catcode`\#=12\catcode`\%=12\catcode`\~=12 \catcode`\_=12\catcode`\^=12\obeyspaces\obeylines\tt \parindent=0pt\catcode#1=0} \def\endverb{\par\endgroup} % \newread\verbinfile\newif\ifverbdone \def\verbfile#1{{\catcode`\\=12\catcode`\{=12 \catcode`\}=12\catcode`\$=12\catcode`\&=12 \catcode`\#=12\catcode`\%=12\catcode`\~=12 \catcode`\_=12\catcode`\^=12\obeyspaces\obeylines\tt \verbdonetGqqrue\openin\verbinfile=#1 \loop\read\verbinfile to \inline \ifeof\verbinfile\verbdonefalse\else \leftline{\inline}\fi \ifverbdone\repeat\closein\verbinfile}} % \font\bigsym=cmsy10 at 24.88truept \font\bigit=cmti10 at 24.88truept \def\radeyelogo{{\textfont1=\bigit\textfont2=\bigsym \hbox{$\sqrt{\kern-0.3em i}$\hskip 6truept \vbox{\bbf\baselineskip=15truept\hbox{Radical Eye}\hbox{Software} \vskip-2.5truept}}}} % \def\bv{\goodbreak\begverb{`\$}\leftskip=40pt} % % Normally ~ is a tie. VWe need it often enough to imply logical % negation that we redefine it, making it a plain old char. % \catcode`\~=12 \font\sm=cmr7 code`\~=12 \catcode`\_=12\catcode`\^=12\obeyspaces\obeylines\tt \parindent=0pt\catcode#1=0} \def\endverb{\par\endgroup} % \newread\verbinfile\newif\ifverbdone \def\verbfile#1{{\catcode`\\=12\catcode`\{=12 \catcode`\}=12\catcode`\$=12\catcode`\&=12 \catcode`\#=12\catcode`\%=12\catcode`\~=12 \catcode`\_=12\catcode`\^=12\obeyspaces\obeylines\tt \verbdonetxVhe actual function we evaluate */ short result ; /* the value to stuff in d */ short old_result ; /* the blitter is pipelined */ long old_address ; /* where to stuff it */ short i ; /* general purpose iterator */ FILE *f ; /* debug output */ /* * Now we initialize our pointer variables, by concatenating the * high and low order words, and clearing the least sign*ݣ?/ K N*_`B_NsJ6f0JBg(0,@H//,BN0,>R@H//,:NnO`NX/,6NXO -.l$Nu(N]NuNUH 8-0$@ JDm llJf9|pLpN]Nu*f/N XOBp`"/,l,N"/,l,N"/,l,N:"/,l,N,l,N,l,N|"/,l,N(L,l,NL,l,N,l,NL,l,NL,l,NN"/,l,NL,l,NHL ,l(NL NuN"o,l(NbNL,l(N:"o,l(N,l(N|N"o /,l(N.N o,l(NN,l("o /NN+Y Pa"o,l(NL,l(NN o,l(N"o,lzN,lzN2L / ,lzN@ o,lzN,lzN8"oL,lzN"o /,lzN"o /,lzN"o o,lzN,lzNL,lFN o,lFN o,lFNL / ,l~N o,l~N o,l~N o,l~N o,l~N: o,l~N4LL ,l~N(/ L,l~N"$_NuL,l~NLL ,l~N/ L,l~N$_Nu?l49>BFJN<< Radical Eye Software . . . or I won,ZT-'t get dressed >> dZ"U@@~@@ x p \@ABCDEFabcdef9876543210   rr+ww+a a+ xx+0123456789abcdef 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@ @@@@ -prv  Z. jŊZ"U@@~@@ x p \@ABCDEFabcdef9876543210   rr+ww+a a+ xx+0123456789abcdef 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@ @@@@ vbk; extern int doblit() ; /* * Some statics to this module. */ static int updatethem ; /* * Errors go through here. Currently, we write to the CLI window. * Later, we will write to the title bar of the window. */ error(s) char *s ; { if (mywindow == NULL || *s == '!') printf("blitlab: %s\n", s) ; else { SetWindowTitles(mywindow, s, -1L) ; } if (*s == '!') cleanup() ; } /* * This routine handles a gadget selection. */ handlegadget(gp) register struct Gadget *gp ; { static int gocount = 0 ; if (bufarr[gp->GadgetID] == NULL) switch(gp->GadgetID) { case GDGPNTREG: case GDGLINE: case GDGDESC: case GDGFCI: case GDGIFE: case GDGEFE: case GDGUSEA: case GDGUSEB: case GDGUSEC: case GDGUSED: case GDGOVF: case GDGSIGN: case GDGSIM: flipgadg(gp->GadgetID) ; break ; case GDGCALC: parseall() ; updatethem = 0 ; if (blitsafe()) { error("Blit safe.") ; } else { error("Blit unsafe.") ; } break ; case GDGSETUP: setupline() ; parseall() ; break ; case GDGGO: gocount += 2 ; parseall() ; updatethem = 0 ; if (!blitsafe() && gocount < 3) { error("Blit unsafe---hit again to override") ; } else { if (doblit()) error(ar"Zero flag SET") ; else error("Zero flag CLEAR") ; updatebits() ; } break ; case GDGUNDO: undobits() ; break ; default: error("! bad value in gadget switch") ; break ; } if (gocount > 0) gocount-- ; } /* * The main routine, no arguments. Sets things up, and then goes * through the standard Intuition message loop. * * It may look like I'm setting message to N?2ULL and checking it and * everything all over, but that is so I can introduce interruptibility * into some operations later, if I choose. */ struct IntuiMessage *message = NULL ; main(argc, argv) int argc ; char *argv[] ; { struct IntuiMessage *message = NULL ; int x, y ; int mousemoved = 0 ; int getouttahere = 0 ; int selectdown = 0 ; int menudown = 0 ; int bam ; int ox, oy ; char *p ; int on ; while (argc > 1) { argv++ ; p = *arg]9v ; if (*p == '-') p++ ; if (*p == 'c' || *p == 'C') custscreen = 1 ; else { printf("%s\n", BANNER) ; printf("Usage: blitlab [-c]\n") ; printf(" -c: Open on custom screen\n") ; cleanup() ; } argc-- ; } initialize() ; while (1) { mousemoved = 0 ; bam = 0 ; if (message == NULL) WaitPort(mywindow->UserPort) ; while (message || (message = Ĕ5`40R@A쁘0gaTJ@f"`Bg lfNDTOg?< lfNTO``JEf&Bg lfN|TOf pL N]Nu?< lfNTO0`NUBg lfNR@A쁘0TOg`?< lfN|TOfpN]Nup`NUH Jldn pL0N]NuBmp:H+@Bg lfN8|-TOf ;|RE`|+fRE` ?< lfNTO`pBg lfNTO8?/-N$@J\Of( mfJf |xg<|Xg6?< lfNTO`02-H -Nh+@  m 0HHӭREldmJmg m -D ` m 0` NUH $m/ N28|XOg"0H`S pLN]Nu`JgYg0`NU/ $m Re  "#/ aXO$_N]Nu RRH|`NUH0$m* <g pL N]Nu Jf/ NpXO* Hg0A&H+ H||f ?NvBgN PO$_N]Nu#~ϊ*NUH 0$m mJg m (( D (&@`&lHHЭ T9@@B0,@H/N)@BPOfL 0N]NuH:? KR//,BN~0H @BCDf?-/ /,BN: lBB0P9|>0HЬB&@R$KOH:| g| g| g | g| fR`  mz "f.R KRH:g JR|"f "fR`B*```8 KRH:g&| g | g| g| g| g JR` JRBJEfSRl>`ZBB0,>R@H/N p)@:POfBl>`z&lB`$0H l:! K JfS0R@HREl>m0H l:B` 0<`0/ oJfSH"oS@W$3wgB /NuL 2/ `WgRA`BQNuHp4&HCHCBCԃH@H@B@ЂLNuNUH0$mBHzN )@FPOfL pN]Nu m "h$/)N (XOgRHzm D/(6N l&@JPOg4Hx/ N ,POg$ * E%h%FHxHz8N %@PO/N 8XO/,FN BFXO`icon.libraryWINDOW*NU/)mnHm/- HzN8 lnB0O (N]NuNU lnRn- H|N]NuNUHm /-Hz`NO N]NuNUH $m mf m(`Jm o mp0(` m0H(BmJm lDm JlD;|2- H NA쁆S2- H N(fJm%MgS- LN]NuNU"H0$m&m Bm+m KRH8g|%fB-0;|;| ;|' KRH8|-fBm KRH8|0f;|0 KRH8|*f mT;P KRH8`2Bm`0- D|0;@ KRH80R@A쁘0fԸ|.fZ KRH8|*f mT;P KRH8`2Bm`0- D|0;@ KRH80R@A쁘0f;||lf KRH8;|`|hf KRH80H`z;|`;| `;|`;|?-Hm0?-/-N+@0-HѭO `\ mX"P+I JfS;I`J mT8A/+H&ƖW`(cgSg grYgUgpWgr`A0;H0-mo;mJmgh m -g m +f. m0f&Sm mRH?N|TOf pL N]Nu`?-N|TOfp`Rm0-SmmnBm` mRH?N|TOfp`Rm mJg 0-mm0-mJmf(`?< N|TOfp`xRm0-Smmn`?N|TOfp`RRm`0-`BHHBJjDRDJjD Da>JDgDLJNuHHBJjDRDJjDa `/a "JNu/a"JNuH0HAJAf HA64B@H@"H@20BAHAL NuHA&"BAHAH@B@tЀӁbR@Q'g'fL NuNUHl0?-N\ON]NuNU/8-/- ?N0| \Of$ m ( Hg?NU/ A$HJ* gAҵep$_N]Nu`BBB `NU/ $m?<N+@TOf5| J%H$_N]Nu5| %m* H?NJ@TOg* `NUH0$lr`&R *P// NPO$K fBrL N]NuNU/ A)HNB -P/N6$@JPOfp$_N]Nu$r%m)Jr P`NUp0-/aXON]NuNUH0$lr` mQg&J$R fpL N]Nu g&`)Rr *P// NpPO`NU/ 0-$@ Jmm0-llJf9|p$_N]Nu0-).85S l /0NJXOgp`p`NU/-NJXOfN9@pN]Nup`NUH 8-Np0$@ JDm llJf9|pL0N]Nu0*|f 9|p`p0-//- /N*O f N&9@p` `NUHxBN+@ POgJl4f -N]NuNp`NUHxHzN /N8?<NON]Nu^C NUJJg lJN?-NTON]NuNU/0-H+@J g(x` ?NTORDlm0,//, N*POJNg lNNJg /,NXOJRg lR VJZg /,ZNXOJ^g /,^NXOJbg /,bNXOJfg /,fNXO,x.)g{N"-T+A ,",Ё",SN"-+A ,"-T+A -mF -m< -m2 -m( -n -n -n -op`p` ,ЭU+@ ,",Ё",SNЭ+@ ,ЭU+@ -mF -m< -m2 -m( -n -n -n -op`jp`d``NU/- N:XOH2-HA싪!0-HAJ/0/,vN+PO/- 0-HAJ"p i"/NxPO?<0-HAJ/0/,vN*O B/,v0-HAJ/0N+0-Hrr2-Ё2-H;@0-Hrr2-Ё2-H;@`@0-Hrr2-ЁrmH;@0-Hrr2-ЁrmH;@;m;m-g0-F@2-FAA2-FAA`p?-g0-F@2-FAAm`p2@-g0-F@4-FBBm`p@-g0-F@4-FBBm`p@-g0-F@mm`p@-g0-F@mm`p@-g0-F@mm`p@-g0-mm`p@;A,}f,~P}gD;|0-mg,}gJmg 0-F@mFm` 0-ḿmJmfJg ?-?-?-?-Hz/-N O0-m g,Jg?-/-Hz/-N RO?-/-N8\O,zg ;m+m0-HѭRm0-ްmm0-Hѭ0-Hѭ0-Hѭ0-HѭRm0-ܰmmh g,Jg?-/-Hz}/-N O?-/-Nڜ\OJg /-N6XOJmfp`pN]Nu amod = %04x bmod = %04x cmod = %04x dmod = %04x adat = %04x bdat = %04x cdat = %04x size = %04x con0 = %04x con1 = %04x afwm = %04x alwm = %04x >>>Row %d aptr = %08lx bptr = %08lx cptr = %08lx dptr = %08lx adat = %04x bdat = %04x cdat = %04x aval = %04x bval = %04x cval = %04x dval = %04x *** [%08lx] <-- %04x *** [%08lx] <-- %04x NUHzN͸XOHx2NvXOpN]Nuwe can't simulate line blits yet.NUHzNxXO,}gaN]NuNr`Simulating . . .NUNJ@fN]Nu?-HzHmNO HzHmNPO+@Jf`Bm m'g\0-HA Jg*/-0-HA /0NlPO/-?< Nr\O` 0-HA싪/0Hz=k/-N O Rm m(mNT/-NXO`Jblitlab.save%dw%ld NU?-Hz0HmNO Hz/HmNPO+@JfN]NuBm m'g0-HA Jg~/-?<0-HA /0NBO J@f HzNXO0-HA "0/0-HA /0NXOS@H @ B00-HA /0?-N\O`DHmHz/-NZO |g Hz}N˂XO0-HA싪"0g ?-NJTORm m(mND/-NNXON`blitlab.save%drinvalid value in save file%ld invalid numeric value in save file o "ofNu o Jfk SNuNUH $mSm Jm o /-N@8|XOg JR| g`B|ff pLN]Nu -`NU/ $mJg$/- JRH?N|\Ofp$_N]Nu`p`NU)m`Bl^Hm/- HzNRO N]NuNUJmf$ l`( g9|^`/,`N9@^XO`/,`?,^N|9@^\O0,^N]NuNUrH0$m &mz)mf JRH8g|%fB-B-B-9|d *fR|HR@A쁘0g4BldH2,d A|09@dRHR@A쁘0f| lf|R JRH>H`x%`4|`|x | `|x|` |x|NTJ@ Af Hm?0HA9Ј/0HA"Ј/NfJ@OgJ-f0J-l KX"P2`J-o KX"P"` KX"P2RE`B- ^g ~fR|Ar+H` mR JRH8|]f mB`|| r| s| tB-uNJ@fPJ-f KX+PB-0,dSldJ@gnBg lfN8|TOg\J-g?HmrNJ\Ogp`p`?HmrNJ\Ofp`pg?< lfNTO`J-f mR|`J-gJ-f|cg mBRE`jJ-f9|dB-r|`>%g*g. g< g&WgQgSgYg_gYg[g QBarygraphics.library! Couldn't open libraries! Couldn't open screen! Couldn't open windowNUJg /,N@XOJvg/,vNA8XO/,vNAFXOJg /,NA*XOJzg /,zN?XOJ~g /,~N?XON BgN=RTON]NuNUHxHxDN PO+@?<D/-HlN.O HxHxHxHx/-/,vNAON]NuNUHzj?<?<JNPOHz^?<!?<JNzPOHzP?<)?<JNhPOHzE?<?<NVPOHzK?<?<NDPOHzF?<?< N2POHz9?<?< N POHz,?<?< NPOHz?<?< NPOHz?<?< NPOHz?<?<ZNPOHz ٽ#?<?<ZNPOHz?<?<ZNPOHz?<?<ZNPOHz?<?<nNPOHz?<?< N~POHz?<?< NlPOHz?<?< NZPOHz?<?< NHPOHz?<?<N6PON]NuAdrs: M+Shift:Blitter Register ValuesDMA ChannelsCON0CON1SIZEAFWMALWMABCDPTH PTL MOD DATABCDUSE PT MOD DAT SHNU0-H//,N> POB/,N>PON]NuNU0-m o;m;m ;m 0- mo;m ;m ;m0-m g0- mg Hz8NHXO0-H/0- H/0- H/0-H//,N=f +YGON]Nu! can only draw h/v lines currentlyNU0-m S@;@ 0- mS@;@?- ?- ?- ?-N PO?-?- ?- ?- N PO?-?-?-?- NPO?- ?-?-?-NPON]NuNU0- mS@H/0-m S@H/0- H/0-H//,NPO$@5m  #tb5m 5m5m Bj 5|5|?-?-NXO%@/-?-NR\O%@5m&0-HAJ!Bg/ /,vN;O $_N]NuNU/ HyHx,NPO$@5m 5m 5m5m 5| 5|5|?-?-NnXO%@/-?-N\O%@5m&/-?-N\O%@(0-HAJ!Bg/ /,vN:O $_N]NuNUH0Jg>/-0- T@?0- X@?NPO/-NXO@P@m /-NXO@P@m0-Y@H;@;| 0-@X@;@0-HA !N/-/,NNPOHyHx,NPO$@HyHx$NpPO&@&N0-HѬNA'H7m 0- BY T@5@0- T@5@5m0-W@5@ Bj 5|5|0-U@?0-U@?NXO( D"h2 D"h3| D"h3| D"h3| D"h3| D"h3|%DB%K"5m&0-HAJ!Bg/ /,vN9HO L N]NuNUA쇆)HNHz?< ?<5?<D?<F?<N OHzq?< ?<>?<w?<?< NOHzW?< ?<5?<9?<F?<"NOHz?<l?<?<NOHzHz?< ?<4?<l?<=?< NOHzHz?< ?<4?<l?<r?< NOHzHz?< ?<4?<l?<?< NOHzHz?< ?<4?<l?<?< NfOHzHz?< ?<4?<l?<?<#NBOHzHz}?< ?<4?<l?<F?<$NOHzoHze?< ?<5?<Z?<F?<&NOBmHzOHzI?< ?<0- |??<0-|?NORm mmHz?<Hz ?<>?<l?<?<N6OHz?<Hz?<>?<l?<C?<NOHz?<Hz?<>?<w?<?<NOHz?<Hz?<>?<w?<C?<NOHz?<Hz?<>?<l?<?<NOHzw?<Hzm?<>?<l?<?<NOHzW?<dHzM?<?<w?<?<N^OHz9?<dHz0?<?<w?<?<'N:OBmB?<Hz?<D0- |??<60-|?NORm mmBmB?<Hz?<40- |??<~0-|?NORm mmBmB?<Hz?<0- |??<0-|?NORm mmBmB?<HzO?<$0- |??<N0-|?N>ORm mmHz+?<Hz?<?<?<?< NOHz?<Hz?<?<?<?<!NOB/,v lv/(>N5 O N]NuGOSetupCalcUndoPoint Box (line) LINE (desc) DESC (fci) FCI (ife) IFE ;3(efe) EFE (sign) SIGN (ovf) OVF Real SimulNY0SX0SY0EX0EY0W0H0FuncLog0000%1111111111111111FWM%1111111111111111LWMNU/- -P/N2pPO+@Jf Hz.NXO m -P!@ m R)mR -PN]Nu! out of memoryNUJRg" lR+P lR/(/,RN2(PO)mR`N]NuNU/ $m;|;| BBlV  fR` ~g& Ag Bg Cg ag bg cfB+| ~f ;|R`Bm JRH;@Jmg m+f f9|V`R mam mznm mAm mCko9|V`$0-|AHA200-AHí`p - m+gJmg9|V``F -$_N]Nu mg Mf( *+f T+lv`J*f ,v`9|Vp` -f;|R $f ;|R` %f;|RBJf 9|V -` JRH;@Jmgh mam mznm mAm mFnm7`m0Jmm 0-mm9|V`0-H"-N#.2-HЁ+@`0-H"-N#Э`NUBm0-HA Jgd m'g\0-HA /0NXO2-HA싪!JlVg00-HA /0Hz4HlN#xO HlNXOpN]NuRm m(mw&?~Np`I can't parse %s0123456789abcdefNU0- | lp[0- @;@ 0- | lpZ0- @;@ 0- | lpY0- @;@ 0- | lpXHlX?- ?-NPON]NuNU ,"r ",t Ё",t Ё",t Ё",Ё",¼Ё9@z ,&r ",6Ё",:Ё",Ё",Ё",Ё",ЁЬ9@| ,",¼?Ё9@~ ,*9@ ,.9@Bm0-|HA싪"0p¼0-HA썄10-|HA싪"0¼0-HA썌10-|HA싪"0¼t#0-HA썔1Rm mmrBm0-|HA싪"0¼0-HA썜1Rm mm?,z?<?<2N\O?,|?<?<2N\O?,~?<?<2N\O?,?<?<2N\O?,?<?<2N\OBm0-HA썄?00- |??<jNj\O0-HA썌?00- |??<NB\O0-HA썔?00- |??<N\ORm mm|Bm0-HA썜?00- |??<N\ORm mmN]NuNUJfpN]Nu+lv ,vм~+@ m m @n op`Jg`R+lJg ,M E˵ register contents block on the lower left hand portion of the window changes as you set various blitter parameters; this is an easy way to calculate register settings. \vb{\leftskip=\parindent\parindent=-\parindent \reg custom.bltcon0/ This sixteen bit register contains the A shift value in its top four bits and the function code in its low eight bits. Bits 8 through 11 are used to indicate which DMA channels are on; 8, 9, 10, and 11 correspond to DMA channels D, C, B, and A, respeN ectively. \reg custom.bltcon1/ This sixteen bit register holds the B shift in its top four bits and five flags in its lower five bits. Bits 0, 1, 2, 3, and 4 are (line), (desc), (fci), (ife), and (efe), respectively. In the line mode, bits 5 and 6 are (ovf) and (sign), respectively. \reg custom.bltafwm/ This sixteen bit register holds the first word mask for the A DMA channel. \reg custom.bltalwm/ This sixteen bit register holds the last word mask for the A DMA channel. \reg cO ICustom.bltapt/ This thirty-two bit register holds the address of the A DMA channel; its value is in bytes, but the least significant bit is ignored, as are the most significant thirteen bits. \reg custom.bltbpt/ This thirty-two bit register serves as the address for the B DMA channel. \reg custom.bltcpt/ This thirty-two bit register provides the address for the C DMA channel. \reg custom.bltdpt/ This thirty-two bit register is the destination or D channel address. \reg custom.P Gbltsize/ This sixteen bit register gets the height in rows, in the most significant ten bits, and the width in words, in the least significant six bits. Note that assigning to this register starts the blitter, so it should be the last register initialized. \reg custom.bltamod/ This sixteen bit signed register holds the modulo value for the A DMA channel. The value written is in bytes, but the least significant bit is ignored. The most significant bit is used as a sign bit. \reQ A2g custom.bltbmod/ This sixteen bit register serves a similar function for the B DMA channel. \reg custom.bltcmod/ This sixteen bit register provides the modulus for the C DMA channel. \reg custom.bltdmod/ This sixteen bit register holds the modulus for the D channel. \reg custom.bltadat/ This sixteen bit preloadable data register holds data for the A DMA channel. \reg custom.bltbdat/ This sixteen bit preloadable data register holds data for the B DMA channel. \reg custom.blRUЋ,tcdat/ This sixteen bit preloadable data register holds data for the C DMA channel. \reg custom.dmaconr/ This is the system DMA register. Two bits are of concern when using the blitter. Bit 14 (BBUSY) indicates that the blitter is busy. Bit 13 (BZERO) is the blitter zero flag described above. \par} \section Missing Sections\\ The things we have neglected to talk about, which should be included, are listed here. We need to describe \b QBSBlit() and \b QBlit(). We also need toS discuss the dirty mode of the blitter. It would be nice to have some empirical timings comparing \b QBlit() with \b OwnBlitter() methods of obtaining the blitter. \section Plug for Amiga\TeX\\ These docs were typeset on the Amiga using Amiga\TeX, previewed on the screen, and printed on a QMS-Kiss at 300 dots per inch. For a demonstration disk and more information, contact Radical Eye Software, Box 2081, Stanford, CA\ \ 94309. \vfill\eject \centerline{\bbf Appendex A: A Blitter STzƂimulator} \smallskip \centerline{This code is in {\tt blitsim.c} of the BlitLab source.} \vb\vb \verbfile{blitsim.c} \bye the least significant six bits. Note that assigning to this register starts the blitter, so it should be the last register initialized. \reg custom.bltamod/ This sixteen bit signed register holds the modulo value for the A DMA channel. The value written is in bytes, but the least significant bit is ignored. The most significant bit is used as a sign bit. \reG| ?0-X@?N PON]NuNU;m`,;m `?-?-?-N\ORm0-moRm0-m oN]NuNU0-@2- A?HzPHmN9O Hm?<!?<bN PO0-|?Hz(HmN9O Hm?<1?<ZN PON]Nu%3d%2dNUH0A`$H&lv;|0-SmJ@o JT"KT2`aL N]NuNUH0;|;| $lvA&HA`(;|;|0-SmJ@o DT00Sf TTm``tJlf^;|JmgP0m2mAg,0mgp`p?NDTO?<?<?-?-N~PO0-@|;@\m``m` JT"KT2Smf;|ܬ;|Vm`NBlL N]NuNU9| mve lv"md -vrN<;@0-H| ;@0-HH@`X@;@;|0-m m2mAg.0- mgp`p?NFTO?<?<?-?-NPO0-@|;@\mJmf m0 `HzNXOHxNBXON]NuDangerous assignment!topaz.fontBlitLab 1.4, Copyright 1987-9 Radical Eye SoftwareNUBHz^NC PO)@~gBHz^NCPO)@zf Hz_N2XOJlgR lz9hڀh lz9h؀jHldNCXO)@f HzENXOHxHl lHh,NC O )l9|HlFWрNCXO)@vf HzNXON lv)h2Jlf"Hl\NBXO)@Jg/,/,NCPONN NN*?<NTO?<a?<@?< ?<NPO?<NTO?<a?<@?< ?<NJPO?<NlTO;|?<a?<?< 0-T@?NPORm mm;|;|?<?<?-?-NjPOVm mkm\m mBmBgNTO?<a?<@?< ?<NPO;|?<a?<?< 0-`T@?NPORm mm;|0- | ??<C0- | ??<NPORm m mN?<NjTO?<B?<y?<?<N(PO?<?<?<?<NdPON]Nuintuition.librB8 fill. Now you know why each line must be only one pixel wide. You can still perform any operation on the A, B, and C sources before the area fill; the lines in the result will be used. For instance, you can area fill based on only a particular color of line, by setting A, B, and C to the bit planes of the display, and setting the function to one which selects only the appropriate color. \section Line Drawing\\ This area is the sketchiest part of my knowledge. I have actually gC jotten the blitter to draw lines, but it took a lot of time and effort. The Hardware and ROM Kernel Manuals are incorrect in some of their assertions; I had to disassemble part of the ROM to determine exactly how to draw lines. For brevity, the following is an algorithm which will draw a line from \.{x1}, \.{y1} to \.{x2}, \.{y2} on a window at \.{m} which is \.{wx} by \.{wy} pixels. \.{X} and \.{Y} are used to hold the slope values for the line, and assist in finding the quadrant Da!the line is to be drawn in. Note how the flags (fci), (ife), and (efe) are used to select the particular quadrant. \bv doline(x1, y1, x2, y2) int x1, y1, x2, y2 ; { int x, y, X, Y ; int q = 0, t ; x = x2 - x1 ; y = y2 - y1 ; if (x < 0) X = - x ; else X = x ; if (y < 0) Y = -y ; else Y = y ; if (x > 0) { if (y > 0) q = (X > Y ? 1 : 0) ; else q = (X > Y ? 3 : 4) ; } else { if (y > 0) q = (X > Y ? 5 : 2) ; else q = (X > Y ? 7 : 6)EMj# ; } if (Y > X) { t = X ; X = Y ; Y = t ; } blit.height = X + 1 ; blit.apt = 4 * Y - 2 * X ; if (2 * Y - X < 0) blit.sign = 1 ; else blit.sign = 0 ; blit.amod = 4 * (Y - X) ; blit.bmod = 4 * Y ; blit.line = 1 ; blit.efe = (q & 1) ; blit.ife = (q & 2) >> 1 ; blit.fci = (q & 4) >> 2 ; blit.adat = 0x8000 ; blit.bdat = 0xffff ; blit.ash = x1 & 15 ; blit.cpt = blit.dpt = m + ((x1 >> 3) & ~1) + y * (wx >> 3) ; blit.cmod = blit.dmoFI{d = wx >> 3 ; blit.width = 2 ; blit.usea = 1 ; blit.useb = 0 ; blit.usec = 1 ; blit.used = 1 ; } $endverb All of these calculations and initializations are done automatically by BlitLab. All you need do is enter the starting x and y and ending x and y values into SX, SY, EX, and EY, respectively, and then hit `SETUP'. (The x values can range from 0 to 95; the y values from 0 to 31. If you exceed these ranges, you will walk on system memory, and BlitLab won't check liGbne mode!) We do not set the `function' variable in the above routine or in BlitLab, because there is more than one way to draw a line. As the line is being drawn, the bit set in the A register moves across and wraps around; this is the bit that might be set. The original destination is available from the C channel, and the B channel provides a mask. Thus, to just draw a solid line, you would use the equation \.{A+~AC} (if A is set, draw a bit, otherwise pass the destination througHh unchanged.) Try it. To draw an exclusive or line, use \.{A~C+~AC}. To draw a textured line, use \.{AB+~AC}, and put your texture in B. Note how the A and B address registers are used as accumulators instead of address registers. There is also an option to draw a line with only one bit set per horizontal row; this is essential for drawing polygons to be filled later. If you set the `(desc)' flag, the lines will be drawn this way. \section Speed\\ So, all of those fancy operaI?0+tions are fine and dandy, but just how fast is the blitter, anyway? This depends entirely on which DMA channels are turned on. You might be using a DMA channel as a constant, but unless it is turned on, it does not count against you. The minimum blitter cycle is four clocks; the maximum is eight. Use of the A register is always free. Use of the B register always adds two clocks to the blitter cycle. Use of either C or D is free, but use of both adds another two clocks. Thus, aJ22 copy cycle, using A and D, takes four clocks per cycle; a copy cycle using B and D takes six clocks per cycle, and a generalized bit copy using B, C, and D takes eight clocks. When in line mode, each pixel takes eight clocks. The clock is the 7.18 MHz system clock. To calculate the total time for the blit in microseconds, after setup, you use the equation $$t={nHW\over 7.18}$$ where $t$ is the time in microseconds, $n$ is the number of clocks per cycle, and $H$ and $W$ are the heiKVOght and width of the blit, respectively. Actually, this is a minimum time, which is strictly impossible. Display data fetches, 68000 cycles, and other operations can steal cycle bandwidth away from the blitter. One way to eliminate most of this overhead is to call the macro {\tt OFF\_DISPLAY} which turns off the display; this is not a friendly thing to do, however. Don't forget to call {\tt ON\_DISPLAY} after the blit is finished! \section Blitter Registers\\ So far we've discusL}.sed virtually every aspect of the blitter, except exactly how its registers are organized, and how one actually stuffs these registers. Well, the blitter is accessible from the custom hardware include file {\tt hardware/custom.h}, and makes available 20 write-only 16 bit registers, eight of which are organized as four 32 bit registers. Full documentation is in the Hardware Reference Manual, but I've summarized them here, as they are available from C. You might have noticed how the7?. We are almost ready. Let's think about the function we need now. For where the A bits are masked out, or zero, we need to leave the destination alone; this gives us the minterm \.{~AC}. Where A bits are set, we pass B through unchanged; this gives us \.{AB}. Summing these, we enter \.{AB+~AC} for our function, and hit `GO'. Carefully check out the picture; it should have worked. We can also complement on the copy using the function \.{A~B+~AC}. The function \.{AB+C} provides8 an `or' draw, and the function \.{AB~C+A~BC+~AC} provides an exclusive or copy. You might try these. Whew! That's a lot. You might take a breather here. Then, later, come back and reread the previous paragraphs, and play with BlitLab some more. It's really quite simple once you get the hang of it. It is interesting to note that it required the full functionality of the blitter---all four channels, shifts and masks---just to do an arbitrary bit rectangle copy. These are the di9!Ժfficulties you run into when trying to make a word blitter perform as a bit blitter. \section Copying Arbitrary Regions---Continued\\ Now we'll illustrate how to blit from a source of three words to a destination of only two words. Undo your last blit with the `Undo' gadget, or, if this doesn't work, redraw the ellipse and reverse video cross. This time we will move the portion of the ellipse from bit position 13 through 39, to bit position 2 through 28 of the destination. Again:"o, our width is \.{3}, and our modulos are \.{6}. Our shift this time is --11. The blitter cannot do negative shifts, so we need to set the destination back one word, and use a shift of (--11 + 16) or 5. So set the C and D pointers to \.{M+190} instead of \.{M+192}. Set the B shift to \.{5}, and since A will mask B, set the A shift to \.{5} as well. This time, our A channel will track B, so we need to determine which bits of B need to be masked out. The first 13 bits will be mas;#~Hked, so our FWM must only have the last three bits set, so give it a value of \.{\$0007}. We need the last eight bits of B, so the LWM gets a value of \.{\$FF00}. Hit `GO', and watch it work! This technique will work in general, but we haven't covered all the cases yet. One particularly difficult case occurs, for instance, when we want to move bits 8 through 19 to bits 7 through 18 of the source. Both source and destination span two words. The shift is --1, so we decrement the d<$kNestination pointer, and use a shift of 15. Now, however, we need to use a width of three! The first word of the destination will be masked out so it will be unchanged, and we need to write the next two words. But even this is not sufficient. The A data channel cannot mask the source, because now the source must be three words wide as well, and there is no way to mask the middle word. The A data channel cannot mask the destination either, for the same reason. The solution to thi=%˙s little problem is to use the descending mode of the blitter. The shifts work backwards in descending mode, so we simply use a shift of 1, and everything works fine. Our width is \.{2}, and our modulos are \.{8}. Our B pointer should be initialized to the last source word, which is \.{M+182}; our C and D pointers should be initialized to the last destination word, or \.{M+374}. The A data channel can mask either the source or the destination; we shall use the source. Set the sh>&-ift the same as B (\.{1}). Note that in this case, the FWM actually masks the last word in a row, and the LWM masks the first! Thus, the FWM should mask off the last 12 bits, and should thus be given a value of \.{\$F000}; the LWM should mask off the first eight, and get a value of \.{\$00FF}. Try it! \section Area Fill\\ Everything we have dealt with so far has been strictly data movement and strict logical equations. Now we examine one of the more esoteric abilities of the bl?'itter---area fills. This feature is actually quite easy to demonstrate, but it only works in the descending mode. Set up BlitLab as follows: Channels A, D on; A address of \.{M+190}, D address of \.{M+382}; W of \.{6}, H of \.{16}, modulos of \.{0}, function of \.{A}, DESC on. Clear the rectangular array, and draw two vertical lines in the top half of the rectangle, separated by at least one pixel. If the lines are not exactly straight up and down, that's okay, just insure that t@(|yhere is only one pixel set per row per line. (You might clear out a few pixels for this.) Turn on the `(ife)' flag (inclusive fill enable), and `GO'. The area between the two lines should be filled in the lower portion of the rectangle. Now turn on the `(fci)' flag (fill carry in), and `GO'. This time, the area outside the two lines are filled. The fill carry flag is toggled for each bit seen, and if it is set, the bits in the destination are set. Now, turn off the `(fci)' flagA[, and turn on the `(efe)' flag (exclusive fill enable.) The area between the two lines is again filled, but this time the line on the trailing edge of the fill was deleted. This is useful for narrower fills. Now draw a third vertical line between the previous two, and hit `GO'. Note how the fill is indeed performed correctly, and the FCI bit is restored to its set value at the beginning of each row. Accidentally set a random bit somewhere in A, and observe the effect is has on the,*qows. For the first word in a subsequent row, the low order bits of the last word in the previous row are used, rather than shifting in zeros as happens on the first row. Things start to get a bit hairier. But all is not lost. Using the A register's ability to mask the first and last word in a row, we can zero out any bits we want, even if we turn off the A DMA channel. For instance, using the current settings of BlitLab, set the least significant three bits of the ALWM to \.{0}.-+B (Note that {\it these} are the bits we need to mask out; the masks are applied before the shifting. In addition, the FWM is applied only to the first word in each row; the LWM is applied only to the last word; if they are the same word, both masks are applied.) Redo the blit, and now things appear to be working correctly. \section Zero Flag\\ You might have noticed that after each blit, BlitLab writes \.{Zero Flag SET} or \.{Zero Flag CLEAR} on the title bar. As the blitter ru.,ns, it looks at the result values that it would write to the D channel, if the D channel were on. If any of these values are non-zero, then the zero flag is cleared at the end of the blit. Otherwise, the zero flag is set. This can be useful for collision detection, for instance; simply `and' together your object and the background, and if the zero flag is clear, there was a collision. \section Decrement Mode\\ Sometimes the source and destination of your blits will overlap. If t/-)he destination starts at a lower memory address than the source, everything will work fine. However, if the destination starts at a higher memory address and overlaps a source, a portion of the source will be overwritten by the destination before it can be used as source, so the blit will not perform as expected. The blitter has a special flag which solves this problem. This flag puts the blitter in the decrement mode, where addresses are decremented instead of incremented as the 0.~eblit proceeds. Toggle the gadget `(desc)', it should become `DESC', indicating that it is set. If you use this mode, you must initialize the addresses to the end of the source or destination block, and use negative modulo values. The W and H must stay positive. Try it. Turn on the A and D channels, and turn off the B and C. Set the A channel to \.{M+190}, and the D channel to \.{M+382}. Set the function to \.{A}, the modulos to \.{0}, the width to \.{6}, and the height to \.{16}.1/]" Set the FWM and LWM back to \.{\$FFFF}. Draw some random pattern in the upper half of the rectangle, insure that the DESC flag is set, and `GO'. It should work as before. Now set D to \.{M+202}, and watch the pattern step down with each blit. Note that the blitter actually has a single-stage pipeline on its output. All of the sources for the {\it next\/} operation are fetched before the result of the current operation is written to memory. This makes it possible, for instance, 20(+Nto move a bit field eight bits left, without using descending mode. Be sure to toggle DESC back to (desc) before proceeding. \section Copying Arbitrary Regions\\ We will now attempt to move a rectangular array of bits from one random bit location to another. To set things up, clear out the entire rectangle. Now, draw an ellipse in the upper half region; try to get it close to the four borders. Set the entire lower region, and clear an X across the entire region. We shall attempt 31Ito move the portion of the ellipse from bit positions 2 through 28 to bit positions 13 through 39 in the destination, leaving all the other bits in the destination unchanged. The source spans only two words, but the destination spans three, so the blit width must be 3. For some other blits, the source might span more words than the destination; the width must always be the maximum of the two. So set the width to \.{3}, and all modulos to \.{6}. The A channel is going to function 42as a mask. Wherever the bit in the A channel is set, we will copy the source to the destination; where the bits are clear, the destination must not be changed. The B channel will be used to actually fetch the source bits, the C channel will read the destination, because we will need to merge the destination with the new source before writing, and the D channel will do the writing. So, set the B address to \.{M} and the C and D addresses to \.{M+192}. Turn off the A channel, but tur53Bmn all three others on. Set the A data to \.{\$FFFF} and the B shift to \.{11}. Note that we are using the A channel as a constant; even though it is a constant, the mask registers will still mask out bits of that constant. Now we need to figure out how we are going to get A to mask out only those bits we need to change. Since our destination is the one which spans three words, A must track it, so set the shift of A to \.{0}, and the FWM to zero for those bits of the first word of6^F the destination which are to be left alone. In our case, we wish to leave the first 13 bits alone, so we use a value of \.{\$0007}. The LWM gets set to zero for the bits of the last word, similarly, yielding a value of \.{\$FF00}. Note that if the source were three words and the destination two, the A channel would have to track B. In this case, you would set the shift for A the same as the shift for B, and set the masks to mask out the particular bits in B which will not be used!5t] T gadget (type the dollar sign, please.) Hit `GO'. You should get stripes in the lower portion of the rectangle. What is happening here is that the A DMA channel is turned off, so no memory is being loaded into the A channel. Instead, the value in the A data register is being used. This is a quick way to set a memory region to a particular value. The important point to remember here is that you can use a channel as a constant if you turn it off and preload its data register. \se"6/=Ԭction More Complex Operations\\ Let's try some more complex operations on memory, now. We are going to divide our rectangular region into four areas, one for A, one for B, one for C, and one for D. Set W to \.{3}, all four modulus values to \.{6}, and the PT gadgets for A, B, C, and D to \.{M}, \.{M+6}, \.{M+192}, and \.{M+198}, respectively. Now draw some random things in the regions corresponding to A, B, and C. I recommend, for instance, filling the left half of A, the top ha#7klf of B, and a smaller rectangle in the middle of C. You should use the `Box' drawing mode. Turn all four DMA channels on, and set the function to \.{ABC+A~B~C+~AB~C+~A~BC}. Execute `GO'; there should be eight distinct regions. (The function is equivalent to A\xor B\xor C). Now you can experiment with the various possible functions. Try the function \.{AB}; is the result only those bits that have both A and B set? (The quickest way to clear a string gadget is to hold down the r$8ծight Amiga key and `X'.) Now try \.{A+B}, this time either A or B set should result in a destination bit on. And so on and so forth. So how are these function codes computed? Actually, it is quite simple. As you enter a new function, note how the least significant four nybbles of CON0 (lower left box on the display) change; this is the hexadecimal representation of the equation you entered. You must write your function as a sum of products; the products have the values: $$\vbox{%9 4\catcode`\~=\active\let~=\not \halign{\hfil#\quad&{\tt #}\qquad&\hfil#\quad&{\tt #}\qquad& \hfil#\quad&{\tt #}\cr A&F0&B&CC&C&AA\cr ~A&0F&~B&33&~C&55\cr AB&C0&AC&A0&BC&88\cr A~B&30&A~C&50&B~C&44\cr ~AB&0C&~AC&0A&~BC&22\cr ~A~B&03&~A~C&05&~B~C&11\cr AB~C&40&A~BC&20&~ABC&08\cr A~B~C&10&~AB~C&04&~A~BC&02\cr ABC&80&~A~B~C&01\cr}}$$ To sum them, simply `or' them. (Do not add them.) Thus, A\xor B is A\not B+\not AB or {\tt 30}$\vee${\tt 0C} or {\tt 3C}. It is usually easier just to ent&:4er the equation into BlitLab and read the result, however. \section Shifts and Masks\\ After you have had your fill of experimenting with the logic equations, we can proceed to shifts and masks. Both the A and B DMA channel have independent shifts. In addition, the A channel has a first word and last word mask. These are essential in making our word blitter appear to be an actual bit blitter. First, using the same set-up you had for the previous experiment, set the A shift to \';F.{3}. (The left half of the A region, top half of the B region, and a middle section of the C region should be set at this point.) Shifts values are always to the right. Set the function to our good old \.{ABC+A~B~C+~AB~C+~A~BC}, and `GO'. You should notice the shift of the A operand, and also notice that zeros are shifted in from the left. Now reset the A shift to \.{0}, and set the B shift to \.{3}. You should get some strange results; there are a few pixels that should be set(Iqs in the shift count. The high bits come from this internal data register, and the low bits are shifted out into the internal data register. In other words, the algorithm looks something like this: \bv doblit(aaddress, height, width, amodulo, sh) char *aaddress ; int height, width, amodulo, sh ; { int h, v ; int prev_data, data ; prev_data = 0 ; for (v=0; v> +)`sh ; prev_data = *aaddress ; function(data) ; aaddress += 2 ; } aaddress += amodulo ; } } $endverb \noindent So, as you can see, things work nicely along the row. The first time around, the most significant bits of the data word get shifted right and used. The next operation uses the least significant bits of the previous data word and the most significant bits of the current word, as it is supposed to. The only difficulty appears across r@Zŋtry to clear memory. The large rectangle in the upper left hand corner of the BlitLab window is the bit region we can experiment with. Let's set some random bits for the blitter to clear. Move the mouse into the black rectangle, hold down the left mouse button, and move the mouse around. Set pixels until you tire of the novelty. Note that as you move the mouse, the Adrs and Shift fields change; these will be useful in a second. To clear pixels, hold down the right mouse button iA0nstead of the left. Once you have a reasonable number of pixels on the screen, you are ready to begin. To enter data into a string gadget, select the string gadget, backspace over the old data, type new data, and then hit return. First, in the gadget marked W, enter the number \.{6}. The field we are working on is 96 pixels wide by 32 pixels high; that is six words by 32 rows. Enter \.{32} into the H gadget. Now, turn on the D DMA channel by selecting the gadget marked `N' in thBe D row; it should toggle and show `Y'. Enter \.{M} into the PT column on the D row; this is the symbolic name for the address of the rectangle we are experimenting with. Enter \.{0} into the `Function' gadget near the center of the window. We are ready to go. At this point, select the `Calc' gadget. BlitLab will read the values you have entered and make sure that you are not going to clobber the system. If the blit is safe, it will say so; otherwise it will print an error messagCL^e on the window title bar. If you get the error message, it is likely that your machine will crash if you ask it to perform the blit. Otherwise, go ahead and select the `GO' gadget. The pixels you so laboriously set should disappear. Congratulations, you have performed your first blit! You may have noticed that the pixels actually disappeared rather slowly. If this is the case, you have a defective Amiga. No, actually this is an artifact of the program; BlitLab is performing tDW-he blits in some other memory somewhere, and then copying and expanding the bits to the rectangle displayed on the screen. It is this updating and expanding that is slow, not the blit. So don't be alarmed. Before we get steeped in explanations, let's experiment some more. Set the `Function' to \.{255}, and hit `GO' again. This should set all of the pixels in our rectangle. Set it back to \.{0}, and set the height to \.{16}. Now, only half of the rectangle is cleared. Set the mEwodulo (for the D channel) to \.{6} (bytes), and reduce the width to \.{3} (words, remember?) Set the `Function' back to \.{255}, and `GO'. Now the upper left corner of the rectangle is cleared. Oops, we are probably getting ahead of ourselves here. For now, just take my word for the fact that setting the function to \.{0} clears the destination, and setting the function to \.{255} sets all of the bits in the destination. I am sure the width and height (that's the W and H gadgetsF|) explain themselves well enough, as does the address pointer (that's PT.) But, how is the modulo interpreted? The algorithm the blitter uses to do a blit looks something like this: \bv doblit(daddress, height, width, dmodulo) char *daddress ; int height, width, dmodulo ; { int h, v ; for (v=0; vll not be overwritten. Only if it will not be are you allowed to do the blit. That is, except for line mode; it is so complicated to check for line mode validity, that I let you trash memory with it. But more on that later. With BlitLab, you can either use the actual blitter to perform the experiment, or use a blitter simulator included in the program. To switch between the two, hit the gadget marked `Real' (or `Simul'). When running with a simulated blitter, you can write a logQ file containing the actions of the blitter. The name of this file can be specified with the `Log' string gadget; a null name indicates no log file is to be written. Note that simulation of the line mode does not work in version 1.3 of BlitLab. \section DMA Channels\\ So now we have control of the blitter; we can write to all of its registers and do whatever we like. Before we get into exactly what we can do, let me describe the blitter DMA channels. As mentioned, the blitter hR%ias four DMA channels, A, B, C, and D. These are shown in the lower right hand corner of the BlitLab display. What, you say you are not in BlitLab yet? Go to your Amiga, plug in a disk with BlitLab on it, and {\tt run blitlab}. The rest of this manual assumes that you have done this. If you are running an interlaced screen or odd colors, you might find the BlitLab display visually jarring; rerun BlitLab with the command {\tt run blitlab -c} to open a custom screen. Back to the DMAS A channels. The first three are always sources, the last is always a destination. You can use any combination of the four channels, from none of them to all four. Each of the four channels has a 32 bit address pointer which points to the memory it will use or modify. The least significant bit of the low order word is ignored. Enough high bits are ignored so only CHIP memory can be accessed; the current chip ignores the top 13 bits. Each channel also has an independent sixteen bit sTiigned modulo (in bytes, with the least significant bit again ignored.) For the three source DMA channels, there is also a data register which you can preload with constant data if the DMA channel is turned off. The DMA channels share a width and a height register. The width is in 16 bit words, and can take a value from 1 to 64. The height is in pixels, and can take a value from 1 to 1024. Thus, the largest rectangular field on which the blitter can directly operate is 1024 by 102?^4. However, larger fields can be handled by splitting a blit into smaller blits, and using the modulo fields appropriately. A key thing to remember here is that the width is in words, the modulos and pointers are in bytes, and the height is in pixels. This is the most common error made when using BlitLab and the blitter, so remember! \section Block Clear\\ The destination can receive any logical combination of its three source operands. Let's start experimenting. First we will VW ; x += 6 ; } } else x += 6 * 16 ; *p2++ = *p1++ ; } if (--rc == 0) { rc = 6 ; x = HBITSTART ; y += 3 ; } } specbits = 0 ; } /* * Here we update a single screen word, if it lies on the screen. */ screenupdate(where, what) short *where ; short what ; { int i, bit, x, y ; specbits = 1 ; if (where >= realbits && where < realbits + 192) { i = where - realbits ; ,9 y = VBITSTART + 1 + (i / 6) * 3 ; x = HBITSTART + (i % 6) * 96 ; for (bit=0x8000; bit != 0; bit = (bit >> 1) & 0x7fff, x += 6) { if ((bit & what) != (bit & *where)) { color((what & bit) ? WHITE : BLACK) ; fbox(x, y, 4, 2) ; } } *where = what ; } else { error("Dangerous assignment!") ; Delay(25L) ; } } fbox(x, y, 4, 2) ; } bit = (bit >> 1) & 0x7fffX Each of the four channels has its own modulo. The blitter also has an area fill and a line draw mode. \section Getting Access\\ There are currently four ways you can use the blitter. Some work better than others. The first way is to use the standard ROM Kernel routines for graphics. This is the simplest and most reliable method; future blitters and operating systems will not disrupt your code. I am not going to discuss this approach here, because I don't want to, and all of  Yǐ]that information is in the ROM Kernel Manuals. The second method is to arbitrarily write to the blitter registers, ignoring Intuition and friends. This is a good way to make enemies; you can trash disks as well as system memory, but it makes for good laughs on those slow winter nights. Just pop some random values into those blitter registers, and watch the pyrotechnics fly! The third method is a variation of the second, but you politely request permission from the system first, b JyVmy calling \b OwnBlitter(). This routine notifies the Amiga that you want exclusive access to the blitter, and you don't want anyone else playing with it. After this call returns, you can almost use the blitter. Unfortunately, someone else may have already given the blitter something to do that hasn't completed; therefore, you should call \b WaitBlit() before actually mucking with the registers. This second routine blocks until the blitter is actually finished with its work. Once[^nrm Blitter---\folio\hss} \vskip 1in \centerline{\Bbf BlitLab and the Amiga Blitter} \medskip\medskip \centerline{Tomas Rokicki} \medskip \centerline{\vbox{\radeyelogo}} \medskip \centerline{13 April 1988} \vb\vb\vb This manual will not make much sense without a working copy of BlitLab 1.3, as most of the documentation is in the examples provided. For a free copy, including source, simply write to Tomas Rokicki, Box 2081, Stanford, CA\ \ 94309. A few bucks for floppies and postage\$ would be nice, but not necessary. \section Introduction\\ So you have pored over the Hardware Manual and the ROM Kernel Manual, and you cannot find the information you need on the blitter. Well, never fear; all the information you should ever need about the blitter is contained in this one handy document. All information below was derived from the Hardware Manual, ROM Kernel Manual, the ROM's, and a lot of empirical testing. Using the blitter directly, as described in this repo]qrt, however, bypasses the layers library. If you want to use these techniques for graphics, open your own custom screen; if you open any windows on this screen, be careful to not destroy the graphics rendered by Intuition. Or, do your graphics in an off-screen bitmap, and blast it into your windows periodically. \section The Hardware\\ The blitter comprises part of the Agnes chip in the Amiga, and can only access CHIP memory. (CHIP memory is the lower 512K of memory in the current^^N Amiga models, but this may change.) To the 68000, it appears as a set of approximately twenty sixteen bit write only registers. It can access memory at 7.2 megabytes per second, or twice the bandwidth of the 68000 (although, as we shall see, it doesn't always run this fast.) Any video memory accesses can slow the blitter down, whether for screen refresh or for the 68000. For instance, the standard two bit deep high resolution workbench screen can slow the blitter down by approxim_0H ately 30\%. A low resolution single bit plane screen can slow it down by about 8\%. A high resolution four bit plane screen can slow down the blitter by about 60\%. The blitter is so fast, however, that even with this handicap it performs its tasks many times faster than the 68000. The first thing a programmer of this chip must realize is that the Amiga blitter is not a `bit' blitter; rather, it operates on words. This fact must be kept in mind when programming the blitter. With WNthe appropriate programming, it can manipulate arbitrary rectangles of bits. The blitter uses four DMA channels to perform its work; these are labeled A, B, and C (sources) and D (destination). Any or all of them may be disabled independently. The destination can be calculated from any of 256 possible logical equations on A, B, and C. The A and B sources can be shifted up to 15 bits to the right, and the first and last word in a line from the A source can be masked by a constant.6a~XO/*NXOBBBB* 0`NUH $mAD)H* g pLN]Nu* g0 8?/** H?NPODg BBp` m f BBp`Jf/ NXO jf*m ?<Hm* H?N"PO|f0- `j$0*HЪ%@ RR- H|`>NU/ AX$HJ* gAep$_N]Nu`BBB `NU/ $m?<NTO+@f5| м%@$_N]Nu5| %m* H?NTOJ@g* `NUH0$l`&R *P// NpPO$K fBL N]NuNU/ A)HB -P/NPO7bF/$@Jfp$_N]Nu$%m)J P`NUp0-/aXON]NuNUH0$l` mQg&J$R fpL N]Nu g&`)R *P// NPOp`NU/ 0-$@Jmm0-llJf9|p$_N]Nu0- l/0NXOJgp`p`NU/-NNXOJfN9@pN]Nup`NUH 8-Np0$@JDm llJf9|pL0N]Nu0*|f 9|p`p0-//- /NO *f N9@p` `NUHxBNPO+@ gJlf -N]NuN,p`NUJg lN?-NTON]NuNU/0-H+@Jg(x` ?N8c"NTORDlm0,//,N8POJg lNJg /,NXOJg /,NXOJg /,NXO,x.)g/ K N*_`B_NsJf0Jg(0,H//,NPO0,R@H//,NPO`N/,NXO -.lNu(N]NuNUH 8-0$@JDm llJf9|pLpN]Nu0*|f/NXOBp`N"/,lNN"/,lN"/,lN:"/,lNNL,lNL,lN"L,lN,lN,lN|"/,lN(NL,lNNL,lN,lNNL,lNL,l9d֢ZNN"/,lNNL,lNHL ,lNL Nu"o,lNbL,lN:"o,lN,lN|"o /,lN. o,lN,l"o /N"o,lNL,lN o,lNWc dAeD^rfh m q 4`u"ts!t  ?w! h x$ z$< :e j (press RETURN)&&&@(#)Amiga Less 1.3beta (ported from version 73)^.^7^F^V^j^v^^^^^ 0123456789abcdef 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@ @@@@ ;f$.BVj~&( 26:FJZnrv>BF<8U &&&@(#)Amiga Less 1.3beta (ported from version 73)^.^7^F^V^j^v^^^^^ 0123456789abcdef 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@ @@@@ h2+Mi ; for (i=0; i<192; i++) fprintf(f, "%d\n", safearr[i]) ; } loadbits(f) FILE *f ; { int i ; for (i=0; i<192; i++) if (fscanf(f, "%d\n", realbits+i) != 1) error("invalid bit in save file") ; updatebits() ; } pdot(x, y, on) int x, y, on ; { int off = (x >> 4) + y * 6 ; int bit = 1 << (15 - (x & 15)) ; if (on) { if ((realbits[off] & bit) == 0) { realbits[off] |= bit ; safearr[off] |= bit ; color(WHITE) ; i8! fbox(x * 6 + HBITSTART, y * 3 + VBITSTART + 1, 4, 2) ; } } else { if (realbits[off] & bit) { realbits[off] &= ~bit ; safearr[off] &= ~bit ; color(BLACK) ; fbox(x * 6 + HBITSTART, y * 3 + VBITSTART + 1, 4, 2) ; } } } preg(x1, y1, x2, y2, on) int x1, y1, x2, y2, on ; { int i, j ; for (i=x1; i<=x2; i++) for (j=y1; j<=y2; j++) pdot(i, j, on) ; } /* * This routine writes out the new position to the sj(creen. */ updatepos(x1, y1) int x1, y1 ; { char outbuf[4] ; sprintf(outbuf, "%3d", ((x1 >> 3) & ~1) + y1 * 12) ; drawtext(HLMGSTART+28, VLMG3+10, outbuf) ; sprintf(outbuf, "%2d", x1 & 15) ; drawtext(HLMGSTART+20, VLMG3+26, outbuf) ; } undobits() { register short *p2 = osafearr, *p3 = realbits ; int i = 192 ; while (i-- > 0) *p3++ = *p2++ ; updatebits() ; } updatebits() { int x=HBITSTART, y=VBITSTART+1 ; register short *p1 = realbits, *p2 = saU~Lfearr, *p3 = osafearr ; int i = 192 ; int rc = 6 ; int bit ; while (i-- > 0) { *p3++ = *p2 ; if (*p1 == *p2) { p1++ ; p2++ ; x += 6 * 16 ; } else { if (!specbits) { bit = 0x8000 ; while (bit != 0) { if ((*p2 & bit) != (*p1 & bit)) { color((*p1 & bit) ? WHITE : BLACK) ; fbox(x, y, 4, 2) ; } bit = (bit >> 1) & 0x7fff+l}ga # of rows, | of columns, t tabstop Options or 'q' to quit? -%s Printing... Complete! RUN %s -p - Job queued Error on Execute: %ld Print request canceled by user! NUJlgN]Nu9|09|M*Bl(Bl&Hz`HmN POHxHmN|PO)@Jf:|2HxHmN^PO)@JfHzqN(XO?<NRTO`9|`RAW:0/0/640/400/Less 1.3 by Bob Leivian: for more b-ackup h-elp q-uit &printCan't open window! NUaJg /,N"XOBgNTON]NuNUJg a6/,N,m"[XOBN]NuNU l&ma0,&Rl&A< N]NuNUJl&o0,&H/HlJDgDLJNuHHBJjDRDJjDa `/a "JNu/a"JNuH0HAJAf HA64B@H@"H@20BAHAL NuHA&"BAHAH@B@tЀӁbR@QL Nu o Jf SNuNUHln?-N\ON]NuNU/8-/- ?N0\O| f$ m ( Hg?NXO`.!g gUgNUgg]gFB,`F ,:f |0m|9olgl gB,`d?NtTOJ@gB,`N8`F`0H"y=S`?<:NTO`,Jlg 0,R@lfL pN]Nu?<NÆTO`N:JEn:,>N?<?N>XO`RN:JEn:,>N?<?N\XO`0Np:JEnzNBg?NXO`NR:JEnzNfBg?N XO`N4:JEo<NHBg?NXO`N:JEo<N*Bg?NXO`JlfBgNܸTON,`N:JEnzN?NӖTO`N:JElz|dozdN?NFTO`bN:NJEnN`?NRTO`BN/NXO`2HlRNXO`$NNN`:JEnz?NTODN8`N>:JEnz,H?NdTOND?B,H?NֈPOB,`N#zVtjND`N?<EN,TOHzNXOPlN8`&N?<!NTONj8`JlgHzNXO`hHl,/,Ljb>0~Z.UxdA00N```t!donexamine: Cannot edit standard input%s %smark: goto mark: is an Invalid Command, Type H for help, or Q to quitNUJf"HxHz N&bPO)@Jf ?<N$`TO m Jg m "h -fB m +hR mHH`~`HxHz/,N&JO `HxHz/,%|1)N&2O `HxHz/,N&O `HxHzx/,N&O `HxHzf/,N%O `R/-HmNPORl`Rl`nR mHR@C1g mH|09@` 9|S`4RBl mHR@C1g"0, 9@ mRH|0l`S`RBl mHR@C1g"0, 9@ mRH|0l`S`Rl~`Rl``Jg gvWgHg␼ gxSgQgUgUgJYgSgn g[gFSgYgYgfUg|UgYgSg6_g`pR m&}.~)JfSmX `JlgfA+H mJgR m ^f(R m<@@HxHm/,N#O `Hx mH?/,N#O R`Bl m /(a?-/-HzHl\NPOHl\NXOH/Hl\/,N"O ;|`;|Jl~fJlfJlfJlg&xJl~g&?-HzHl\NO Hl\NXOH(;DHxHl\/-N"PO +@gA\$HJl,/-'~69{xHzyHl\NO HxHl\/,N"DO `JgJlg(  l"  g  g RA\^@Rm  g  f  fJlgJlg0-lm  f6HzHl\NPOHl\A\"D/ NPOHl\NXOH؀Sm` RA\ RmJlgB?-/-HzHl\NOHl\A\"D/ NnPOHl\NPXOH؀;|`BmRmRm;|`BmRmSHH`Jlg`0-H쁊H@J@f(Bm` RA\ RmRm0-ްlm`$0-H쁊H@J@g RA\ Rm`R`&0-HH@J@gRm` JR RC\`Wg`JlgD0-lm: RA\ RmJl~gHzvA\"D/ N(POZ;|`BmJmg(Jl~g"?-HzJA\"D/ N*O Z;|m/Hl\/,NO x`|`$Jg/Hl\/,NO `ZHxHl\/-NZO +@g@Jo/-Hl\/,NjO `"HzHl\NPOHxHl\/,NFO `HxHz/,N0O /-NFXOB`unable to open: '%s' File: %s Page %d %4d Error reading file: %s
File: %s Page %d %4d Error reading)t file NU+lHxHzN.PO)@JfHzuNւXO`bHxHzNPO)@Jf")m/,NZXOBHzNHXON]NuHzN(XO/-NXOHzNXOHzN XON6HzNXOHzNXOHz NXON0HzENXOBmN@@gT -fJmoSm-H?NTO`0 - m* m n"0-RmA-H?NTO`0-AB0-H?N TO|Qg JlgrJ-g*HmHzHm4NtO ;|.A4+H"+m&` ;|.+m"0-.HABHzNXOHm?-.N \OHzyNXO`HlLHzrHm4NO J-g*HzgHm4*kQNHPOHmHm4N:POHzMHm4N,PO/-Hm4NPO/,NXOBBBHm4NO +@0J0g Hz NZXO`/-0HzHm4NO Hm4N:XO`/,NDXOBHzN XOHxdNLXON)m`PRT:can't access the printer at this timeRAW:100/50/470/100/Less's print serverCan't open window!Print File: Enter the first letter of each option, if any For example 'nh#60|80t8^l', the options are... numberedlines headers ^ctrl proportional letterquality draft wide uncompressed N,O N]NuNUHzx?</,N,O N]NuNUHz\?</,N,O N]NuNUHz@?</,N,O N]NuNUHz$?</,N,vO N]NuNUHz?</,N,ZO N]NuNUHz?</,N,>O ?< NTOHz?</,N, O N]NuNUHz?</,N,O N]NufofoPFobpNUHlN/-HzgJfS` lR``J lR`>XOHzN 4XOHzN *XOHzN2XON]Nu& Also print the current file. (NEW) f, SPACE Forward one screen. b,B Backward one screen. e, j, CR * Forward N lines, default 1. y, k  N * Backward N lines, default 1. d * Forward N lines, default 10 or last N to d or u command. u * Backward N lines, default 10 or last N to d or u command. r Repaint screen. g * Go to line N, default 1. G * Like g, but default is last line in file. = Print current file name /pattern * Search forward for N-th occurence of pattern. ?pattern * Search backward for N-th occurence of pattern. n 'w * Repeat previous search (for N-th occurence). q,Q Exit. More help...NUHzNXOHzNXOHzN XOHzINXONHzsNXOHzNXONHlHzHmN)O HmNXOHzNXOHzNXOHz$NXOHz]NXOHzyNXOHl Mark the current position with . ' Return to a previous6&ly marked position. '' Return to previous position. (NEW) -z set the number of lines scrolled. (NEW) -X Toggle a flag (one of "%s"). E [file] Examine a new file. N Examine the next file (from the command line). P Examine the previous file (from the command line). V Print version number. !command Passes the command to a CLI to be executed. v Edit the current file (default editov%r:%s). NU/xNNHzxNXOHzNXOHzN|XONHzNnXONHzN`XOHzNVXONHzNHXO0H` Nt`N`JgSgRD|m(N]NuAmiga LESS 1.3 by Bob Leivian 2702 W. Curry St. comments and contributions welcome Chandler AZ 85224 Commands marked with * may be preceeded by a number, N. NUN\N]NuNU9|$NHxHm/,N0 O ;@ mfBl$-H|N]NuNUA)HN]NuNUA"lfpN]NuS lH?N4TOJ@gNSlNSlp`NUm  2JmfBgN TOfN]Nu1;1HL%d;1H K0;32;43mm4mm1m0mNUHz?,/,N-O N]NuNUHz?,/,N-O N]NuNUHzd?</,N-O N]NuNUHzH?,/,N-O N]NuNUHz,?</,N-~O N]NuNU lfa` ?<NTON]NuNU lJfN]NuHz?,/,N-8O `NUHz?,/,N-O N]NuNUHz?</,N-O N]NuNUHz?</,jF!N]Nu^C NUJg lN/-NXON]NuNU/+mJg,x` /NXOR0,Hm0,//,NFPOJg lNJg /,NXOJg l Jg /,NXOJg /,NXOJg /,NXOJg /,NXO,x.)g/ K N*_`B_NsJf*Jg"/,/,N ,R//,NO`Nz/,NXO -.lNu(N]NuNUH (-r ND$@샂Jm0,HlJf)|~pLpN]Nu0*|f/N.XOBp`Hp4&HCHCBCԃH@H@B@ЂLNu"/,lN"/,lN"/,lN,lN,lN0zO|"/,lN(L,lNL,lN,lNL,lNL,lNN"/,lNL,lNHL ,lNL NuN"o,lNbNL,lN:"o,lN,lN|N"o /,lN. o,lNN,l"o /N"o,lNL,lN o,lN"o,l^N:"oL,l^NL,lN o,lN o,lNzdrr+ww+a a+ xx+0123456789abcdef J 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@ @@@@  NuN"o,lNbNL,lN:"o,lN,lN|N"o /,lN. o,lNN,l"o /N"o,lNL,lN o,lN"o,l^N:"oL,l^NL,lN o,lN o,lNzdrr+ww+a a+ xx+0123456789abcdef J may also produce some wild results with fractal pictures and such... please experiment and enjoy. We are grateful for feedback and any interesting results! Iff2Geo is run from the CLI. Simply give it the name of an IFF picture file and the name of the object file you want to create: Iff2Geo ram:Letters.pic df1:letters.geo This command will send the object produced from the picture on the RAM disk to the file letters.geo on df1:. Be aware thatS#f the objects can be MUCH larger than their IFF counterparts... so have lots of room on your disk! In addition, the program itself needs a huge chunk of memory to do the conversion. It is recommended that pictures be saved as brushes which are as small as possible. A tedious but useful technique would be to cut each letter out of a picture of some text (using DPaint for example) and save it as a small brush named A.pic or some such, then convert each of these lVtğLetters into a .geo object. One further note: Since colors 3,5,11, and 13 are -unused- by Videoscape 3d, if you have an IFF file that uses those color registers then the resulting polygons will -not- be displayed by Videoscape 3D because the color assigned to the polygon is the color register of the corresponding pixel. letters.geo This command will send the object produced from the picture on the RAM disk to the file letters.geo on df1:. Be aware that Ղ0\iM  V `Ku U+Wdk mb +kck ;mkěrW ҳ 5OI  0PHO@XFu1-ԔFhal5t;d-Lʰ:moreRform5R -"j2`l*gbHmfXBgHmN\O;@JmlBm` j0A"jfN f` j0?/*HmNSJO A+H``2JmgN,Jf j0H"@+i/-NXO`Jf?-NTOJ@g?-NTO?HzUHmNRO `?-HzCHmNRO HlHmHz.HmNROHmNrXO`:%d buffers^%c%c"-%s": no such flag. Use one of "%s"NU/ $m` $f B R$_N]NuRJf `NUH JfLN]Nu mJf` mRH8H`` m +f R)m0)m,/-aXO+@` mHH` R)m8SrD`&R)mH`)m@`Mg䐼 g`/-N6XO+@`j mHH`HR?<bHmN\O9@`BR?<bHmN\O9@`*?<bHmN\O9@9@`fg g``S?<-HmN`\O9@>`搼 ggYg_gUgWgSgSgSgSgSgSgSgSgSgg֐gA$H`*gHDf jJjf0`BP`T*g HDf jfp`p j0`,*g$H| Df jfp`p j0`*gHDf?HmaV\O j0`JfX?Hz&HmNOO AM- HmNXO?<NYJTO`"-%c": invalid flagNUH m$P 0m 9o8Jm f pLN]Nu?- HzRHmNOvO HmN@XO?<NXTOx 0m 9n JRH2 A8|0` m 0`number is required after -%cNUJlfN|`NN]NuNU?q?ĎX^j'曄aq-宊Fof3-QfeH$ΰ/HPA, Ⱥ2:9' .=<*¸/?C4ƺ"JDgDLJNuHHBJjDRDJjDa `/a "JNu/a"JNuH0HAJAf HA64B@H@"H@20BAHAL NuHA&"BAHAH@B@tЀӁbR@QL NuNUHl/-NPON]NuNU/(-/- /N4 POf& m ( HHgHx/- NPO(N]Nu`NU/ $m Re -// NPO$_N]Nu RR- HH`NU/ A$H J/aXOA삪e$_N]NuNUH $mx f pLN]NuJ* gR* g Hx/ aT(PO* HH/N4* XOg /*Nh*j0"%B +JF no2>)Gh-& ?("(5>EBWB8M$+F̖ӻɤ&V\F*_9=Ǽ"*B@HUF_WN2 U̼А X+!cE]=tfo\>=ϓŐ ;6D']A#9& LRQhz<uwP=o%K]4.:?;"2 0CZ9)#8$ '/" -S* ' -&5<"   (  ڜ--?B 9   3 #8::4̼*1#! ,<(" !@2B,*E)& #91*4' + )1 ' "%  %  &                  (                       ' -&5<"   (  O=,   5"'    %   9 /7   )  : mE   !W6 ! %           5  3xe  9 /7   )  :   !9!&6'#G>#(//=D$ >6, #圠猿ŝ &:5=ZXbDZGB\`oj[b>EqpL=?52*ظԱֶӥƯ鵗ڲ%6= #K@KQWIR9I8G*7 &㬠å ʍզ¤Ưֽݿ׺Ǹ 7J]*IG,>SY :$ƱԶ )5*563M2CK9HE;D79F!/(6!   " 7"')(.6 ;" ! .T(F6A?1RYT1%D) % 4I(X?39G<20?.:3  ɽ $/`&)6,+%& @((@*- "' "       $);.!2, " "         $         %$'           *  lTR                             ."   "                  $ (  K<O+ ݲƐܫϥ'ۚ@`$<7EV#: }&W$ 0,ٟʡүٛFƼjw2 ZqNP4wf.stK;N2$   ƶJ ɽKE  03$&^83+0K&bZ7yO06I!zuuqcx{b{{t==-[3"䤩ر.+3=artHankUmswz;uHBE;L>5(䡪·˃  -!.5-0S82080 ') ηsXIý #  $# !#&-2/('+-$ ҹ #'.)#+7;- ")ź   !  % 3:8/%(0,Ⱦ   !'07:4" .3)!(! " )8@;,  +55&')#  -<@6#"050 $%  Ŝē"  !5A=-  *.00* $&!    );D;  #5?:"!('    3<3*#  !09;4" &   *68.  #4??,  $)"    !452(  0:942" !$(% !093  +;D9' ".*    -0+"&681/-%$*(  #!.2%%+672*#'("  ! --!  '//032( ")&  "%! "*1452*  ("  #  '3<;/% &$     #18503-  !      '2<8+%#! :85*+   (13//11+" &     ")00..25*     (%!(7=4&#"     271,39/   $!  $$%*05851'       (,,0;=5$    ȷƷ#%  $.8AB7! !!  !3AC:."  $+   +3:AC7     %8DE<0!   "-6=DD2      ,;@=:3$     &/ 42#"(0(@/-'/S9N0?X %C'2D?5F2%)e? =*_/--?2',0*# .P$70 ?&8 5$ !'&'! ,' 3 107 6 "T &) 8:A #2$  :  " 7 M  7 7}9*/ ( GJb!p5    G  2 X/@  ! """- +"4  T&  *  >B" 0   ! 2$ * **60ьoK#ɾ12  ) (9   7 &)" !,!  &  'G#4Y  0 285 !$? 9%6%0)$40*4 (7    )+  -  ! '"3! -  ?  U  C        00 %  %0 $  5C   (  "   /      !/ $%   .  /!     "         s              9%6%0)$40*4 (7    )+  -  ! '"3! -  ?  èϳ"1:=<4$  4DE,$" #2=A:),GI2 --  *=F8-'$%"  8C=+ -)  #2862/+%"# 5:,   '  )23-&")0&   ʹ (++$$,$ (6/''/63(!  ڼ08$  $'"$"(-...*##$"?*4?@8& "Լ $Ү)" !31"+;E>%  >D( ֿ 1)۹  #))$ :KC(#<0 ð 0:( ٻ)63! "=MG3$)+"   &$ &+ %й #.%9>+67!  $ @/ʼ % ѿ(2 ())4CI7 ",!  091>&  #.$Ķʾ "  3B;,'%" 7."# !֜)*DZ  !%)/)ƽԿ  %(0=&´  '6699-)?G1  )30%,2"˸   1?8 5I=#  (/'ȴ' ij:;!72,.3)  4:,"##Ҿ-?++9BE?,  #!:- (+##%#÷ *=G?, "$()%51 ͫ !" ta'%7EI=!    -5/#6=)ӳ!#/BNK+   ,,.4* !),"⾩ (>B8//* ><"+9/پ#%&/??.   1:/% !<<,! !4DE<+ 00&(#)20 +@=&  5GE-&&$-0&34(=UA),3(Й&141) )8=-2?C@6'&;;(&49,;C/%CC. &)'" .'+,'34&¼(:6($'&$$'+% -91!67%ҿ-,(&*,&"!&,//.'"(%+/)ų$ľ$(&%$! +92$  !#"%+-ȶ(˶$.3*#5?5'%*% .FJ)  ֻ %36$.7/)3:5%-?@2ο  ǹ $ #!(265, '7>5 %$ #'-9@<* 5JE-$" !!.<=4++* $6:9-#1&    ./*+6B1  0?8~>8x   < <0x8`p`zzrr ž@@rr <Ej.DI c'W70WK: yJԅ"u8<6,,L A 7ۘV\>,A%T&ցvN>P)̒Q`l<^Nߦ C:)"iưfP)"#B4D[B5δHP+!9픳W>e4㿵."6pA^5#-Y mB)@AںM2 %F$ϳ ''4)<,1 2 BN #/1! " : (& #( #, $7( 3/ %!1' ޾ <( - ܗ3)` +     -      !   +   7)&)     ! ! '  ! $  1- "!)%? $  !  -    " '(- +  %  %; !$"" * ,++ #/    (  03 %! - 2; ?,   !"    4* $ "    !    7 &8-& ! *  && M(%  -  &"4 v  ( "  &  &   6 $. !  #     '*& $3   %- %  ) &  '     & Jr   $! #     # #)" "                                 "J     3   %- %  ) &  '     & x7????QW??????ʉ?~???K????KOl5\LhDk $зվӐ×Ǜե WaK'V!lIbE1|hnG4cr*}(zIUO&У㙻⢖Ȋßଳ%'_&,>%n|e)Aqicl6mpH{[ 1" ‚ƸӰͣ,):u,$p{pgX4ARc5kxg>( ϋ졫˜ͧ:/$H Rl<^L}5z1a=Ki_3p;4)귎˿ϙϥ%$8 Zk]N]ve;I56poRxG+$֡ҷ؎(N:?':+P @w6=3p#GvHrOX?(/!C δʶϬܳF .X8 <*CBP0)=`=5\J6W:eE #-Ƶ²ϫ٦8+2.@!Q7,p<4U+=F=7[.27G ! ٻ箯ﶮͷ )#, BI01 ]ct0Z1N>5E1V!ܴ鰾ʶ '.5J 7+'@T&39LL<$PA'=4?+ ٿ 3&l,{5W" C#I +>D%3B=<2 . ڿ&E' O 7:%Q"./"!&)9 !)&A"'9D#%=3$#&+ !. @7$;44+ *$" 5% "(&!) &%&/$25+7  %: " 8! 3) ,/!* -   .5%&$ %"Q#   %, +!$' -      %(,%" '# !    ) +%        "             >m`  &E' O 7:%Q"./"!&)9 !)&A"'9D#%=3$#&+ !. @7$;44+ *$" 5% "(&!) &%&/$25+7  %: " 8! 3) ,/!* -   .5%&$ %f=D_(3:o,/A 1"i@+x17 HMO3(?e!)97ZA*. +8r ;" ;?P B'/*3Z8. ( a>U<< <<<0x8`p`@09>=x~=~??''88x<8<//rkK kefbassdrum6p~JF" ;"$ %+"(*!'  # &)&! +%  $         ! $,                     $   ?                )? +  =  0+C. ;5 ) , !+( '*%&  4D!1 N  $/  * ;) 3*!)! 2    1  (  !-               '`MT'ʿת ٦8Nh`M.MPVfB (S6:4縑 Ͻ<06iPp+P<$/u>V)ʿş༧ 49nc[/H$NHnPY:8P#Ѧھ ISpn}}]9C*cYQ@⿫׸ĭͨ¾ַ/EpE/7&-=iX< /U5\´ĮRJXh[~`4D&,>~^PD 줦ȥ ";]P85%(]cH  OIaJ/ڠ ӽ:bElTs~u6F,&s]VH$󵨞  aFB0LiQ9  Mg;/Y]P"8ě &޴ e>nOsy~J&5FkMN,ť& د $(5+OMTGsI>M4չ;>MWMa{qg$B .*a^QE ٸ ᰶѷ$#'CWY+;P\X[! 𠹗YE`?\yH2;'*hp`tR7׬ ǝѤ*/01DlhY pgMlXOǵSLV@Zx~|un%G('-~Tt[E"㱵 " #\bU3 8;Ftbi!ȻƱ6XQGQi} x_}9#448r^eV:   ׯ-"#AI*Z "QvWxR@#1'ʹר ʴýML8LLpq^fE"'<[de_D(௿" ֹD+ F+e&vSn_1B6ڪ⤩ҵDK*P:,qS~<86N>hrgZ)ü W0K.^>ZwMt: B;˲ϼԳ 8D&E+PLlp@.D:yoeEⷮ 4,$39QY +}HgY 4:9޸«Џ̽;K0;+5JZur1'!11Tz_S/ĺ =[N$&FAZ4 X`Gi 2'BJ㇧覓_46;#NIuec +-7hdO=IJ *L-aQ/~6lC2/:L% ѯ̟ӞRM4R5 DIdkbN 5v88 +" 4$Q=RqRV @(Gω· (KN?,1^kx~3/" 33[_C&Դ 4-AD' 8ubP.7H7 ޚޘ139% EVmt|D##9g^\0;į ̻ C 0 0A$%]nj3+e./ୁղ -|"64$AQPS^* K\`қĻ /. ) =)  ImiQ$_N48ɇ /<1EBEMLNE!oV\਽&1$  .)Coiv%/AU4Dۖ2%#I!?C[KZC Ar;7׷£:  !/'_k`N 3"P9Q#첁'!"&-$'O%6HYY]O$p0)ң6 ! -2$;^MS =FRDڔ !(0%&7)GL[MV* FA$媬 `-477 "R>MM )%KJB쫫ޛ !%+(?9MGh\^G"0A"߽ #'0%E-2994HL?< Ͼڽ7- "Ԣŵ ,!. %@sQeS=;= ɰM!7@,?BY? 3FA *M4=̮#,:.!% 56 ! -2$;^MS =FRDڔ !(0%&7)GL[MV* FA$媬 a! %#),%$#,,-376:<:6479>DGJLLKJKKPXXVRQRRTW\^^RVYY[[^W_XT\X^W]ZRY^TMJFDCUdWOKGECA?><;:961 ¾¼    !"""#$#!!!"#!"#""$%&%'$#$%"!!#  !$$    ԋ 3 Ų %'./65>BEORONOQTZ[\]``ab_b`cbbbibah\cf]he\\ja[WT^h]YVTRQPPOOOONOONK,.79$"&' ½  $$$'('(*(*$$$"$!####!     åE½ $).48=BFJLMPTX\_`cgkmmopnoonkjliecbb`^\XRJFB>72-'! !'+137;>@DGGJLMPSUWXY[\]_aab````^\[YWSRONKHFB=:840+'$   !%'),/035789;<<=>@@ACDFGGGHIJKKJKIIGGFEC@><:8531/,+(&#    #$%&''))++,-....h4H//001133334454334333333200/.-,+)'&#"    "-.5;HMUYX\hntpq|~~~}z{qkcUUXC77(ƺ %-49AEGIOYXZegfnstxxuw{vt}}xw{{rnmigg\SOHB;2-& & NAMECLOSEDHIHAT1ANNOAudio Master IIBODY. ! (?+x2-(% Pa>M9?Id  1?$/p B #"0)/) "D$>;3+A7()aM0=%'٫ 3Q *#= !H'. gc('. % W  4"[*iJ 7- H+#(L  " KI9F;36 )A;8ݯ$ [?^2LO9==!F 6(*5!?; /C:џ\6E.׺4=@P6C664'Bܰɷ!$#\[O23LPw;/ Ϻ!&&@0((; A9 䦶ƴX:BD 2%JTB.(>EVH&( #;Q &? Ծ$, g~~p]%&#.JS49DZ 1$TOQCF- +7L&P#"/ Î?3ms}x9DPL7}IV=6ƶ˽ۥ ҫB`RZ33J4*?Q" H;,6@1ܻ ι͠+ K[|Y.WH,n_-꧷ +ο < $J-7",=8  C+  GkK  +('F_ҵ"DLJ2 ѵ" / NMO/ʾ@ "+&{96B7H/D/L5/!$J <#:J  8.?B7/&THf4 ?!*,4Ԧ7 81b:c?;EF NG1?!5>^N3! E"#8ﴻ1 (6%;FaJ)X P  5H&ڹ?1RQ@33!  @$Kÿ Fѭ!&QNU,<2)>+Aý1>&46X9[;03ӯմ&B% ,(0[Hn<4 7 N'4( (C뼿 9DH63 ᵿ&35=# :^;\=0ľ"ͫ9>S[:$*IE)ɬ (GT! ̺ L"C%E=HL5P)3+.)ⵢѻ ÿ)0'*B/?&\C!؜ˮ2N/6 C2$! GDVK;ܽԲھ,6h@-D$A0%0Q #CkA05C <* GABU, $8$!_E,0P zp &'HjXg&:< i@_W/$%+˶- I'.a2 "4    ظ KQVC &+ ?" ;#vDdO$̱45";!=A-e=3  >bMd,!$:,-YCZDʼ 8&2$HB=M;  ɞս>a`Q)'& @U,L" &:A]\(!1A~f}i+V) /!..*ʧ$[ ! .+(3UTZC%4GQU ɣ.!i)#H ?oxOW40;ҶĸL +Ƴ"-,(q$'%*L`@F3H3`/8f~Oi6;Iҳµ M&"Ŭ ;!)N0 $ 2Fi>W8.1g#"KuqRx>GSٳЪEڴs'ѷ9:>5 65 &ErG`Hֹ7)0  ۥ #3\~wnmKTGԮ͕&*̽ ߮90QA20NIK?_DVAP Fί%2!"%Drd~TPP)豵ˌ,)6- ǯ32?>CKE)HXHDԻҽ&%)'"#ɯ5%1=v]iiHDL̸307.FB_N .3IGʻ(X2> ˰/75#'<'1絺 *,2dYTb<@5&­:&G8?G>UP/ME3 U.=Ͼ >> 5>? KL9 z1?SG & )   #+,#'*$  ¨  .H\aM, #$ ".0& Ѽ $2ETWD&   &--& # ̷  )@V^R4 #!!(,!Ų!1DPN8 !%'!&$ ʻ $4EQM7  xV%'"#ͻ (;JOB' ''Ƚ %3@F=' $%! ʿ" "1?GA, "#þ (*$&3>>0  "%)%'1:   #+,#'*$  ¨  .H\aM, #$ ".0& Ѽ $2ETWD&   &--& # ̷  )@V^R4 #!!(,!Ų!1DPN8 !%'!&$ ʻ $4EQM7 "0""      $  D                               X)䮏~n޲Ss`/ϲi{ԯEy~U-\^2,oyL1kxW:490 BhsTЛSk#ݰ?zl@൐--ԦBCωBVO(Ƨd]Ῥ07+ 1K`h^A0kl!DK2ɜ !У!K]Q-NB՚'ī43 .AC5#)GZVC864(ҼB[]= *MdojW<Dz 绘 *V|95<7687+ )ATYJ'񱁁˼ƿ+, V}|[2#((! 5WhdP6  ˭پ,.:AL^kb>  #EVJ+ '6DOSJ8ڵ ĸ 9mJ +?MK:&(1/ !&!0QllS5 ,:>/:KPMC4#ůű*B^yn> ,=52.EN3.*MC$ td&*  M! /! :K $ȱB, !5"&?   "     (,? !"                      aW                                    &%L        <()      makes the note come after you released the key on your midi-keyboard. To get out of it, fiddle a little with your synth's functions. MEMORY HINTS: ------------- * If the dos or my program tries to tell you anything (change disk etc...) a requester will occur. If the program halts and no requester occurs, this means that the system don't have any memory to lay the requester on. Push right mouse button to retry or left mouse button to cancel. * If you try to load a instrument,  and the intrument won't load, it means that there are no memory for this intrument. The Playroutine. ---------------- The replayroutine is written in K-seka assembler and is very easy to use. Follow these steps: * Save your song with 'Save Data' in GMC * Load the replayroutine in to your program. * Create a block in your program, big enough to contain the song-data * Load the songdata into this block * Put the adressvalue of this block into A0 * Call MU_start * Listen * Call M ZU_stop For those who are interested the replay routine take about 2-3 scanlines to replay the song. (Up to 6 with all effects and schmuck on) -------------------------------------------------------------------------- All coding except for the Midiport-handler (Robert Olsson) where made by Andreas Tadic (Megaman of Phenomena) ^^^^^^^^^^^^^^^^^^^^ If you wish to contact me (under the circumstances that you're 9 not a lamer), this is the adress: Coder: Andreas Tadic Rosjovagen 1D 29300 Olofstrom Sweden (tel: sweden-454-42070) Midiport-coder: Robert Olsson Kiviksas 27057 Kivik Sweden Ps: This music program was made for the guys who makes the music for my game. There may be some bugs, but it's veryc unrealistic that i will do anythis about them, beacuse all my programming time is going to the game (And a demo once in a while). ----------------------------------------------------------------------------- All coding except for the Midiport-handler (Robert Olsson) where made by Andreas Tadic (Megaman of Phenomena) ^^^^^^^^^^^^^^^^^^^^ If you wish to contact me (under the circumstances that you're !nCd <IlN <(jPNR")dҩ|tԁ(rҩ|`&)t")d <IlNr <(jNJg*"*X <(jNG" <(j$N``F <(jPNN ***BREAK getbiteRp$*tpn&$<X"*lp(jN%AtJfrNBp"*lҪptԁr0($!(rNNqwrline Jg>x#D t"N#A$) rNV#At") NJf ")`rҩҩ#A$)&)$GD" p$(j(N")S#Ar#AnDґtԁr0($GL" p,(j(NrҩtNJf r p,(jNrҩ`#ir#Anr #)p,(jNrҩ`")S#Ar#An8ґtԁr0(#A t nvl`r.p0(jNrҩ`p$(jNN%X4: %X2tidyup J\g"*\p (jNp (jNJ`g"*`p (jNp (jN"*xp (jNNNq$TN & H **BREAK typelinJdg$*hG|" p(j(Np(jN"tgrp(jNJgr p(jNrtgFN"p(jNr gt gv fRhrN%I5 typehexBr ҉#A$<hԉ#Bd#Bd%AlBtv%Cpr#A|tnZ" <INJf&&)$)|")#%EJUD<2$7+ +02̹#RQ(/@%@)17[@#@0G%-* RR-K5./>2V6C$->, 'Ҿ LP-= @ #2]2B/5;"չRI .?B&  ;V9 =295  з EJ(F;' "X'#J07+ ӹQ?, ;/B5  2HC )2)8,#=4}ӽ 8U)6$%!1 \'7! '1  D? ., ",( I2'(0 / 7=$/-  @'!$3 $#  65#(A+  8#,4)  / +#*9 (  &)%8 % ').3!  *"7 #    '3%B~(j$Nr%Ax <(jPN""0 <(jN%A\Jf0$G" $0( <(j(Nr%Ax <(jPN"*\ <(jN"JgZ"0 <(jN%A`Jf0$G" $0( <(j(Nr%Ax <(jPN"*` <(jNBd"Jg#pt#B`r`>r%Ad``r#A`V")ҩt0G" <(j(N`.")ҩt0" <(j,NtHgvNg`R")t0l~Jdg0Jg(G" <(j$Nr%Ax <(jPNJg <IN`r%Ah <(jN#Atgd q/M <(jN <IVeat move.l a1,(a0) move.l a1,d0 add.l d1,d0 move.l d0,8(a0) ;set repeat cmp.w #2,12(a0) bne mu_looping move.l #MU_empty,8(a0) mu_looping: clr.l d0 move.w 4(a0),d0 ;add sampletable lsl.l #1,d0 add.l d0,a1 add.l #16,a0 dbf d7,MU_calcins rts MU_stopmusic: move.l MU_oldirq+2,$6c clr.w $dff0a8 clr.w $dff0b8 clr.w $dff0c8 clr.w $dff0d8 move.w #$f,$dff096 rts MU_interrupt: movem.l d0-d7/a0-a6,-(a7) btst #5,$dff01f beq MU_novertblank bsr MU_}3dHcplaysong MU_novertblank: movem.l (a7)+,d0-d7/a0-a6 MU_oldirq: jmp $0 MU_playsong: bsr MU_everyvert add.w #1,MU_songspeed move.w MU_songstep,d0 cmp.w MU_songspeed,d0 ble MU_okplay rts MU_okplay: clr.w MU_songspeed add.w #1,MU_patterncount cmp.w #65,MU_patterncount bne MU_playit MU_setnewpat: ******* calc position **** add.l #1,MU_pospointer move.l MU_pospointer,d0 move.l MU_data,a5 cmp.l 240(a5),d0 bhi MU_setstart *********************** move.w #1,}4}DMU_patterncount add.l #2,MU_tablepos move.l MU_tablepos,a0 clr.l d0 move.w (a0),d0 move.l MU_data,a0 add.l #444,a0 add.l d0,a0 move.l a0,MU_songpointer bra MU_playit ************************ MU_setstart: clr.l MU_pospointer move.l MU_data,MU_tablepos add.l #242,MU_tablepos bra MU_setnewpat MU_playit: move.l MU_songpointer,a0 add.l #16,MU_songpointer move.l (a0),d0 clr.w d3 move.w #1,d2 bsr MU_setinstr bsr MU_seteffect move.l 4(a0),d0 move.w #}5$U2,d2 bsr MU_setinstr bsr MU_seteffect move.l 8(a0),d0 move.w #3,d2 bsr MU_setinstr bsr MU_seteffect move.l 12(a0),d0 move.w #4,d2 bsr MU_setinstr bsr MU_seteffect move.w d3,$dff096 rts MU_setinstr: move.w d0,d5 and.w #$f000,d0 cmp.w #0,d0 bne MU_setit rts MU_setit: swap d0 move.w d0,d1 clr.w d0 swap d0 lsr.w #8,d0 lsr.w #4,d0 sub.w #1,d0 lsl.w #4,d0 move.l MU_data,a6 add.l d0,a6 cmp.w #1,d2 bne MU_conti1 clr.w $dff0a8 }6move.l a6,MU_chan0 move.l (a6),$dff0a0 move.w 4(a6),$dff0a4 move.w d1,$dff0a6 move.w d1,MU_note0 move.w 6(a6),MU_vol0 clr.w MU_slide0 bset #0,d3 rts MU_conti1: cmp.w #2,d2 bne MU_conti2 clr.w $dff0b8 move.l a6,MU_chan1 move.l (a6),$dff0b0 move.w 4(a6),$dff0b4 move.w d1,$dff0b6 move.w d1,MU_note1 move.w 6(a6),MU_vol1 clr.w MU_slide1 bset #1,d3 rts MU_conti2: cmp.w #3,d2 bne MU_conti3 clr.w $dff0c8 move.l a6,MU_chan2 move.l (a6),$dff0c0 move.w 4} 7K֒(a6),$dff0c4 move.w d1,$dff0c6 move.w d1,MU_note2 move.w 6(a6),MU_vol2 clr.w MU_slide2 bset #2,d3 rts MU_conti3: clr.w $dff0d8 move.l a6,MU_chan3 move.l (a6),$dff0d0 move.w 4(a6),$dff0d4 move.w d1,$dff0d6 move.w d1,MU_note3 move.w 6(a6),MU_vol3 clr.w MU_slide3 bset #3,d3 rts MU_seteffect: move.w d5,d6 and.w #$00ff,d5 and.w #$0f00,d6 cmp.w #0,d6 beq MU_effjump2 cmp.w #$0100,d6 beq MU_slideup cmp.w #$0200,d6 beq MU_slidedown cmp.w #$0300,d6} 8T/ beq MU_setvolume cmp.w #$0500,d6 beq MU_posjump cmp.w #$0400,d6 bne MU_nobreak MU_itsabreak: move.w #64,MU_patterncount rts MU_nobreak: cmp.w #$0800,d6 bne MU_effjump0 move.w d5,MU_songstep rts MU_effjump0: cmp.w #$0600,d6 bne MU_effjump1 bclr #1,$bfe001 rts MU_effjump1: cmp.w #$0700,d6 bne MU_effjump2 bset #1,$bfe001 MU_effjump2: rts MU_posjump: clr.l d4 move.w d5,d4 sub.l #1,d4 move.l d4,MU_pospointer add.l #1,d4 lsl.w #1,d4 sub.} 9Bw #2,d4 move.l MU_data,a0 add.l #244,a0 add.l d4,a0 move.l a0,MU_tablepos bra MU_itsabreak MU_slideup: neg.w d5 MU_slidedown: cmp.w #1,d2 bne MU_j1 move.w d5,MU_slide0 rts MU_j1: cmp.w #2,d2 bne MU_j2 move.w d5,MU_slide1 rts MU_j2: cmp.w #3,d2 bne MU_j3 move.w d5,MU_slide2 rts MU_j3: move.w d5,MU_slide3 rts MU_setvolume: cmp.w #1,d2 bne MU_j00 move.w d5,MU_vol0 ;move.w d5,$dff0a8 rts MU_j00: cmp.w #2,d2 bne MU_j22 move.w d5,MU_vol1 ;} :(A0move.w d5,$dff0b8 rts MU_j22: cmp.w #3,d2 bne MU_j33 move.w d5,MU_vol2 ;move.w d5,$dff0c8 rts MU_j33: move.w d5,MU_vol3 ;move.w d5,$dff0d8 rts MU_everyvert: move.w MU_slide0,d0 add.w d0,MU_note0 move.w MU_note0,$dff0a6 move.w MU_slide1,d0 add.w d0,MU_note1 move.w MU_note1,$dff0b6 move.w MU_slide2,d0 add.w d0,MU_note2 move.w MU_note2,$dff0c6 move.w MU_slide3,d0 add.w d0,MU_note3 move.w MU_note3,$dff0d6 btst #0,MU_stop beq MU_ok1 bclr #0,MU_stop mov} ;Ey:e.l MU_chan0,a0 move.l 8(a0),$dff0a0 move.w 12(a0),$dff0a4 clr.l MU_chan0 MU_ok1: btst #1,MU_stop beq MU_ok2 bclr #1,MU_stop move.l MU_chan1,a0 move.l 8(a0),$dff0b0 move.w 12(a0),$dff0b4 clr.l MU_chan1 MU_ok2: btst #2,MU_stop beq MU_ok3 bclr #2,MU_stop move.l MU_chan2,a0 move.l 8(a0),$dff0c0 move.w 12(a0),$dff0c4 clr.l MU_chan2 MU_ok3: btst #3,MU_stop beq MU_ok4 bclr #3,MU_stop move.l MU_chan3,a0 move.l 8(a0),$dff0d0 move.w 12(a0),$dff0}&Q68,);OQ@    !)22(#=MJ0 ̼%0,$369?:0(%%+0  Ƚ #5<8(#/?EA99=A9(̸ȸ'/-,///8<<;4*/EU\P8 #"!)3=B@>?FMPOH@:6.(!ű +;II@629EQSH=8320$ ¹)5=AECAD>5//5;4$ y>ñ,+%'16984.(   %22) %" !*0,(! "&'$ #!$*'  )34,"#%&$  #'++(%%$$"  %%"%%$"!%'-/.*&"#$$  #)+*(%%'+*(%   )-+'()**(# ! y?mjhZ!%')*($  %'"  !#"               y@                  yA       yByCyDy-ME}FZpdd.l #242,MU_tablepos add.l #444,MU_songpointer move.w #64,MU_patterncount clr.w $dff0a8 clr.w $dff0b8 clr.w $dff0c8 clr.w $dff0d8 move.w #$f,$dff096 clr.l MU_vol0 clr.l MU_vol2 clr.l MU_pospointer clr.w MU_songspeed clr.w MU_note0 clr.w MU_note1 clr.w MU_note2 clr.w MU_note3 clr.w MU_slide0 clr.w MU_slide1 clr.w MU_slide2 clr.w MU_slide3 clr.w MU_stop clr.l MU_chan0 clr.l MU_chan1 clr.l MU_chan2 clr.l MU_chan3 move.w #6,MU_songstep mo}1'pelve.l a0,a2 add.l #244,a2 move.l 240(a0),d1 sub.l #1,d1 clr.l d0 MU_sizeloop: move.w (a2)+,d2 cmp.w d2,d0 bge MU_nosizeadd move.w d2,d0 MU_nosizeadd: dbf d1,MU_sizeloop add.l #1024,d0 move.l a0,a1 add.l #444,a1 add.l d0,a1 move.l #14,d7 bsr MU_calcins move.l $6c,MU_oldirq+2 move.l #MU_interrupt,$6c rts MU_calcins: cmp.l #0,(a0) bne MU_calcit add.l #16,a0 dbf d7,MU_calcins rts MU_calcit: move.l (a0),d0 move.l 8(a0),d1 sub.l d0,d1 ;repyH5+%!%&%$   $!     !%$%"! !#     !$#"" "      "%##"! ""      yIԶ !#!!! !       "!""#         !!""$$!          !#!   yJo     ##!       #"      !      !  yK                       yL                      yMy                     yN                    yOξ            yPz   yQ͢y<0_ % /ho@'H) 褀+?`OX( l 'M8m@?0+(0#?o`$0OX /Op /_pOt РW`Owxsp谨+O{|H_pdP/Kgl_`0'1 ˰ '56?UU_~}tf^ZSD츩 /OoxX@K]_w|pdPFOF6*̷İ»yS %&# "#!$( ´ "#!!! !%+'"&-, ##$  &̹   " "(+'"$/-(!*''+%  (% Ƴ  #  ()$()(" ()",(  %'" ӽ #%"%# (.+%++) yT  !')'   $$ Ʒ$!# "))!'**!  #"'(  $("ƻ $%$#  #%$ ))#  !#  #! ķ&'!&'! %'"+,&  " п $" yU"$!  "#%)"    !&' '% !%!)$    ʿ%'!"%" !%'  ʻ#(% !# # "  !!ƺyV|]g "*+"&& "  !  "  ! п &(% % "" "! #$!  "'(# !!$  ""ſ  &)) !!'%  yWȸſ   %)# !&  !!   !)(! $#   !$Ž  $(# #"  "&$ý $"    "  yX   &'!  !"" %$   "&&  "! !%    $'#ȿ"  $   #"   &&! ƽ  $$"%$   #! yYn\  "&$  !$#!#    $&# $&"$     $% ƿ #%% "    !$$ ſ ##! yZ    #$!  !#!""    " ##   ""   !#"  $!   !   #    y[!#     !$$"   "      "$%            $%$       $&'#   y\     !%'%        $&'#      "%(&#    þ     #%&#  yG~       "%'%$  !     "&'%#  "      #%%#!      yx^cI9#4/#*78.$*& $ 3' &/.15+ )+ "%%",363*('   #" !);>/$&$    '8604+ !   !-<7(#$ *,     13//3.# '   '00,07+ yy_}ʁ   (% +?9&"!    !  77*2:,    (  $$&.584.  "  #,,0=>-   (  "-9D@( !# 4EA1$ /!  ,5=F; # yz`#  (@H>0  " 3:DE/     7A=91 "+;F: %   :<.-(   %*2:.       03,"   #.)""  y{a{!!"&"     !&#    $"   !          y|b4      C)2!Ц!$y}c%5dil>/ %6 XPϩ 65@5.0/GG>/# 1`rB/F@1) # E~f- -/4ǻ  +9%E84D8)&! ,I`G" (1 6 #ǽ 8OR8 %% (DJ' ϴ$,#1BH)26%.4(0;DRI&1 4D4" Ỽ*SC)+1H=)  ʪ  466.6> ,J7?J7 /<50 y~dʏN4 $06;8 $#')?G5 ʡ  -B<2) 16+( $6  1ID($;>/ -/"!%֦4=/($2C<%)65$'# )DyeGDTHB.?M*  *;6*0A9"+'$4 弤"0,!#?H+ %:+ ?JE=('BG8+.4- !1>A.  2%"/7, ư,.@B#  *$ 7E? +6>6 ˺ ##!&6:0-)(#ɭ 3.%781&  ) %:J<&!(4CC,  ؿ%%'49$ "" κyf$$/52  %% ):8)!)@C)  ʻ$*/,8E7 ""0(Ҿ .;4$ %#$330)#4<. ϯ  '4;0  *& Ͽ $030&!"$"*690"$1;7+"   ߽ !,270# #)! մ #.)  !/7.",60%! ν -2/*)*#  )&#!ƪyg+  #*+&'*  "% .5-!090!¶((&%&%#  &# Դ¾  %+.( $ &1-"!' *98' ׽ #*)*)*)$ #*' Ŧ !),)  '%$ &# 12' ȿ#('&(&#  !'' ѷ +,,)'&!#%&'*)-2+%# !$&$ $#yRd~   &# ʽ  "(*% #&"%%%(*%#*$   ++$#%'& $-&ú &,,*  #!  '!!((!%"!  !& ̿ ",-")%$$!"'&($").( "#&"$!  "  ƴ  $%$!!&'$!"'-& ymiA7.ynjCC=yokKG;ypl}_WV     !ā' ?F &*ҷ'53("5L> >](-U ֹ--yqm8j(/  2" 0AFOL6 B= #ķ  35.B'@P0 4B?0" 徴 & ܯ%-'9)3EB$   L<%  7̸ %+' &LH( 'C" Ϯ0=ѭ/;' *ML3",*$("&,%ȱ )1"H/86! %B.Ǹ  ' Ƿ04 ,&.BJ2-  (@)C% /(Ͷȵ &  +C;)%yrnlJ%B%5;# ((,ƫ  $)0&!ƻݼ $  ()'B& "67:7,GF +6, '6"ɰ2C09N0 ,1в(:<80)5-  :; $&̴)?(.?FB+$ ='(+!"%#"ַ !1HC- "$)(49 ܰ $ ,@L?  ,6,"E0yso'䶤#$9NO)  ,,/7)-ĩ  8E9.0&   C8 ):, 㾶) %$+??&    1;* <=##  0DF8 7) &)!/6 *C:ֵ3IC($" (3)63ּ̻9V; 40-52)-@9 0?D=.*D0 0<-#H< #GA (*$ ytpcE .,0(Ż/7-Ż&<3 $($#'+$ .<*+?*.+%)-% #,/..!!($/-ֲ %ž!(&$$):0 #"#+-޳) Ӷ-3(3?3!** EL$  ἳ 37!(9/(8<)?A0ӿ  ʹ(##)58/ !6?2   '!#(/?B, 1JC" 'yuq9EE5"3A7+*) 6;8$ $5 !1-'4B- 2@=!+ " " )BG3  (. ' (32(!)1"   ׾(+*"yvrAɳ ",# &7-"-62%  į /8  $( $$-..-(#%Ľ# %"   "$,2.%)0$ܺ $"/)"/?3"+Ǻ # '!!9<2% (2)ȼ #  ")4;6! 04! #+ #0A=,,83)(   9B7"yw]ea37((! # -A>+,/1. '#   8E:'?@$(*    /=2( &7<6 '"   '69) )?B+ $*  460!  %::41!%)!   1<- "9D7  "1&.1'680.+&,$ %ybt':^2@1ē˭ͿMN%Nb8$Xg q69"'Y 3G̈́\ ā@允 nFD}振iFj(xӸUJQQxy->On֖!P}N ;֨{Ádr#Ձl+ˌZxyXI5 VQQ|[WI0z$k]O3@[Jd[Tf}fӁhZ5Bqh؍֮q\ycu}Gx)1 ?49D!hG҈Lzxs0QweԻ+:{F qX%"ڟLIK0^yVc!W{xcIς  p}Yo yŠ>n@ζ?S1]Fqf"G6 ۜY׬/NnO=\g'댗ۺ>pu?P׎' S*NxSC`ߛ<^o`h=E_N .+cjG6[+&IVOV;!@ߺ4b3迿hrg†A Ƴ뵖"aTY&9*0$Қ&KD+绰.0/64O/DUQ2@QOydvL\;&3-S(ܵ* $Ӷ+)?,"էEn{k 22K$U.:g﯋-W/9 "@N V/ӷ "'ٸ9K+!?376+1b8.#!ط@OS"Z#OJ+䨵CA  .-$#%'󴏦3NA Ƴ(:"  ' LV- ",೪ @E5 ")ݼ46    '  & !H/ yewU  ! !%    '/+4A$  !$ &                              yfx4p}+                                        ygyQ\D'                               yhz0K*        yi{A("       yj|1.       yk}./%ylhAK/yW -@@+"8G@0**"2?KIGG=AWkl[<2PcSGNG83Ecm`KA3'&--& Բż  )@>,.7+ 8@0%1#!!0IY][O>&4Wmi\\M6$+Pcel_9 &3CKWOLOCCC,%)#λǸл  ,9C3 '.' !6<6 +@EC3    !  ' #-5/ #/>G@3&4, ӷƿɹyX-1'@8#.88A_aL7'$0@OVQQZ^U@38!2'#,"      $'#/80%(9RODT[XQ@<@CA71.8S]O4'0@LKEGA'#''+# ѿǼӱŷĸռ  ,0# ,2;@4%5;?>3+*03'(-3>GF3! (6:0ÿˬ̾ (' !#   %%   .*/6'#/1)*&!#+,$)<;!)215750+  # óϹûѾ 27-'%#!#&'+2;>;7./98;?C@<;835<;:C@6:O`f]O@1+##.*%!  yZ    $#    !%(34##/46CSVG5.9@<<2!'0.(*),-#!&Ͽ˿  '-//(%$%'' './07;AIIGB709HQJ?;..8995-          #& )+"'6;89:86681.00., '00.*'/7@<&  y[N5dȾ  #-0)&'"&&%%$'/7:/#'087,)4;@II<+            !,($'++'#!&+69316;:5+'-.(#!,793' ƾ   !$"$''$#)13-!#''&+,.43)$'*-11330$y\'KiW# #,+   !## +./,! #)02,'"$$!!  $%$"))#%+++)&#)-)$')"     %'#     y]pY;3'%.0' .8*1DMJD?5, 1:3! 77&(9JPJB:1&,9:/! *4.#/CMOG?6) 1;5' ¾.2* &7FQOC6-% /72+'(#!/+# ,A?9/$ ȸ%2)(0/*),;ID1%"*' );CGE<,ʿ)/+#053.-0;B;) +4+%5@KPJ;%ƻ+0+(031/28;9-" ,<=(!-:GRTL8*2.%!&)+-068860! 1@F;%*5@LXVH.¾ο,343/&#$&.8971(/FRK7' $2IyN G=0 )4;6-5J]_UG@4,3CIKPPC1 ŵ4BIE;* '9A?@JT]`VH?54@HJLMF4(ɹ ';FE<2% +@IOUVXb`VI;5>ILKLH9+#Ͽ2?D?4)1HXa]Z`gbRC:9CKNNI' ƺ&*+-&8TZUW^itywn^OBCIRTF3 ̿ $*/- 1NXTQWakqsul]LDFLOL=,ȿ½ (1." ,FTPLQW_elsti\SJEJLE3 ſ "-1* ,DPNJNPS\bipqibXLIHA:)öĽ '1-!%=JPJEGOVY]honjibTyPItHB;-žĻ '-'#8IRLEBGQX[_ejjnoeWE8. ķ '& 0BRUH=@LX\bdbajsrgTA0 Ǽ!. G`{g|O',QcZ3)/s@# LA5K*{OS^#I6!UyI]vA>=+Zs@m-IofkG5kcSʗޖxG+,, FyR|Mͽś퓍@>@Λ/; fIkE=VflkwiO;7|vXBfGWI/v_9ma&誺ﷲєܿڬ 鬒տ[#ͷL{-fiwb}_KemWypsssgA2zzoQ͟&3缨Ǚ!Ħ꼯ʓ)CN+㯊綵ǒǜF9~|QCbn=_wypcq{oXtM#QT'F,'εɹ֌ӧ#AæŽ˛ǜ4G -dGIcvl^7`}|wuySDiygUVU) B9!,"˷޵ϑߚר - ѿ Ǯޭݓ'ƹ,c<9/WNNw|uE=n0ѽÕ+A, ə-A<->O*PpUnzQ$lgKcg`fO$:F%1S+MY,ǹ˦ӧø ޿ѼGG7ae>)5`glt[II+A[Oxgelp7DQcva\xY#*ëD食͙yTR̯Ne  *C@ "# ٫&.A#-$%FN$->g}tU/ UsCCgd8DOG?9@J.#ɱջ )&36V4/ ˼:01/7+38576I|gMduQGCOEAjxOdg- ;Lc3ұݿŸ˜ɫٰ1, 0-#/>8'>Q0:0'.F`L'&BG  /cS4Y6DfZS`H/33a]!!78G_cP'.6,ø㯐ѯϻ yUW <0 7N];%>L75.+Gbsu`/ (-&&% '4!)!  # .999/7'&#OKK?<.'66,+#½Ǡۼپ !+MO7'$%=SgupcT%7NX[OOLW`D)5A]`K2#=TO'86, 'ݿ ) @I9ǩ̻ܵ .C5#:\Q/,CD7DgmGHkxxZ<;MsxZQFA=A8&-&2'14# Ʈʫռ˿  !'33η˶ѺyV~ +8Gͽڿ %':?+,?ccPSqxiS/AvzeF3>TXL?YaXJDLN8#'-7<7&λξñ!& ,8 +67,/; &6+  'F15#/>YscI/%,C\aO1 .;:FQL4*+Ͻȼ÷پû /&! 0QG,)-MRI;,((ۻ .85&-?LPG3") Ǫ.??7.BML?,%#  ְ"BOG2 /BKK; *) 㹡4NRB$ 2DLF-15% ťCTM64GI:09,  ԰yC+- ,* ,2-'!ų  -@KB-#&/3.# ҹ 3HOC-   +3/&ŵ  @91490  " +.%  &$(064/6B?0   &&% %,% ʹ&60)*+,('0EJ@. !)&'& &# ֿ6=<9/#$=NP@( )*)&" "ɶ /BIJ@/ 0MUN;!&)('%  ! 9KTRC+ BSTH3 $'(%ʹ (AQ[X@ .MTN>,  ## ٽ0CZcU0 9LOyEF2    Ǫ 8O_`K-,@GC;-    ɮþ&:Sc\@/()0;@;/"    Ư  -ARZRD;/)0861*  ǯý $3AOUUOA.*--+*" "%!ͭ)4AMV[T@/)&$(&  $(-,ٳ#( $*6DQ[aU=-" $!  %,32# 龠"( "#(39@RfdN:+'' *431*ϪyF& ")-126G[eaO4%) .773*产' +26506K`f\E+",#  /><0&!˶"*7<92.D4#! û,>GC51CNUURC*%' '-)#"۸ *6FQUNNTRONF1   070# ж %0:GUZ\]VKJG5   7?7(!˳)6?L\hdVKIC3! 5C?3# dz-:K`mj\PJA3!.DE:*$!#4Jbro`SLD4)@H?1*% 'CawveYRI5yHɔ~ !:DA5.*" 8Wv|k\YQ< Ծ0?@82.'%Oo|nb_]H+  %9@:1/," ǿ;`pnfc`T= 2=:41*#! ¹#Jaecbc_L.   7=6/(" "ǿ;PU[bb_YC'  ,;91)!! ȿ4DHNX^b_R:)0:3*#"ȿ.AHDHS^b\K8)15-$ ;yI,3DGBFT`aXF5 !,-(տķ 5DFCIW_]R?,  (&" IJ 2DGIQY]WF5)  !&!д2AKPV[XK>1#  !!ܿ 2DLS[]M?6. %)  &"ɫ$6CLX^VD82% !12#&,!  ׸ *6?PZYL>4(->8!$.* ­#*4BOUQF;+ !=B0!-1%yJW\-3ϼ'*2=MRI>5& .C=+-8+ Ǻ$%)2?GID=.9<5(#,65& (-/8AB>7& $/51+.78-  '),1:><0#+.1:=9/(!$ #/9:3#%3>C=3,%%175* )=JG9+(#Ž +13- !8IKA2)& !(.1"yK{wy0CMI9-+%Ż !&(%#;HH@5,)"  ! ,=FF<3/)ȿ   3?EC<3-%    "4CGB83,!ʿ   *72'  1ELC;70$ ,+ANH?;3+ #' y6IlykW<Ļ(AUkz}xrommmoqsuxy{|||{yvsqnkhc[P@.y7tN\3GYjx}vnhd`]]]]_abeghhijihfdb_[WRH=- $3ALV`hnsx{~~|xtnha[UOKHEDDCCEFGHJKLLKKKIHEDA=5-# $.7?FLPUY[]^__^[XTPKFA>;954333446799y81::;;;999750*# &-38=ADGJKLMLKIFD@=952.,*)))(()*++,------,,*(%!   $(+-02355555521-+)&#!  y9QTRw !#&(*+,---,+*(&$!    !"!!  y:        y; y<y=Ł!!#9]qjeS;( ѽ į !*QrhhW>(ʼ ° $ @syge\E/ µ%'7_mg`I3Ʒ  '#,V}wh_N=&˿  *%,Ls{mdT@.Ű#*&$!,Fy>22Ahw|yofVF4̶(''%+DfuswzreXK>- %&''/B`qsqsodYI@7#̻ ȴ#!#*2C[pqoqkcWGA=,  ˹#"#1FYinonjdWD;;3ɲ  н##0@WimjkkfXC551%ֻ$!/>Oemihhh_K5+(&˰ DZ  .T^XVX^e^H4 ϻ %  ҳ*8828KYUQT[b_Q<& ӿ+$  ⻭(8=53BSUMMWa_UH0¸ ') Ǵ)9>92=LQIHPZ]WN<տ#Ժ %9A=5;JMGDIRXWSD*y@gE18  ´"6?A<?DFFF?.$̳!&-"Ǹ +5;HW[NA==?A@?;2*' ׹  *(ѽ#,5AYcWE=<>=995/+*'ħ   %(ĵ%+9Se^L?:;=82/+&(+"ϯ  '$ ҽ '.FdfRA;:=70-)"$*)ཡ    $#ȶ  '<]fXG<9:93+$y+>S    C;  ""P/0$$&%# $($/@F    ,   +&78,="6.')$+(' y,Gi 78 %     ̿     -  %$#((*/*%#$)0, &+8$ з*0!'(!32&&0*+*# /N@ /8%!3(#       +2,7 -* $y-@(,      "  $  ($0+ '*"(# 30  $',         '$.# 3 )"74&  74(34        ' !    (%y. $ #  #      &       #    #         y/Lj?),!%                      y0,                     y1WT                                    y2IV                                 y3*R (ڿҿ0޺y49A _I椦 q:歒 ox<y5!3MĠ-hW꾡 AokFϴy ϼ                     y!׌F,96`̎e`7- HD`۾P6Ey"0Ll!;/%#% J "'B5G2/=xi9&J־,8/9 %99 0W?+.R $=@, 0# 'Lݾ,O.8T;G2 4C)? 445?1 $"'$B_,/ h. .K9/9< ;YI10+8C%KH%  $"P1.'"R+C+ %%:0y#6UD )*49+ CEbB%1M H?/-) -S1 F24 "K@  ### -/ 5 8 /%/(--*,2? -.* D9(  ("2$ #-( +;B0 M(  $+0  /P( +8'; _@     пп )$'0   ->0$WT /@+ O$?@/8  y*Kгн /   ( )70 /_0(#4$+ ࢿ  ,/8L  )*'( ( "Խȿ  >?  "  yLa@@@ q @@0@ q @.@@ʀ@@0 @ @ @@  q @q @0 @ q  @. @@q @q @0@yiqUx@@@q @ʐq @0@ʐq @ʐ@h@xh@xʐh@xʐ0@x@ʐ@}@q }@q }@0@ʀxq @@C5q C5q y4m0C5pC5C5C5q C50C5pq C5pC5C50C5pC5C5C5q q C50C5pq pC5yķq C5q 0C5pC5C5C C3C1  C/q C -q C @C+0C C)p'q CC%pC#CC!CCC0CCp!C`C#C% C`C') C `q C+q C-@C`0C/ C`1 Cq C3CC5CyŠN.:v84CW]O3v{"l\pd~^pusnqkjdf]aX^YOLKLA?=8970.7-',)'&!!ﳟݙ!%(+1389=AHT?OZkRclkjvyzwlsfcsheKqP]d+KgT'7A>.+3)&) ڼͨױyd򁁁ְ" @>9R5I|fL^rhwqUsblTLDRJ+.>@ºϣŔ͎̬ȷ&@%8 >FF86fcd#V#NGpfy]lEeE,[O!7Z)3* 컰Ǩ̎yۃߢ̪о' ;1b\/,E!t2ym[{|lU{npl~ovMmsozlqr^kowvqVf`mgyQghlpuJ\\TyLKaOOITAPW8DOW+5R86)6,# ʵ˳ė´  #./'*1B-(E8=X?3``7[cAVsQNlywRXcs\^cildbqans`vo\x~[purjpynwensow|dqxjw}spxphsspyos|jx|jjphyyrhmqy|rikymrvchlgooowo]lobcnykclffngY^ciYRX`VJQQGQ@II<=;6D$%12!ź˺Ĺίʾ $.:)/-$(G<(;C3:B6GMAA:FFMS<@WVCIVQP\KLeYNTX`[[XZe]cZ^iaf`^op]jkemkpkdlpfo`ipm`Vne]ibVg^U`[WZdON]SQUYEIMIKM75OD96C899/4>7&)7-),#'. )! yɾ4ӽƻƺ   ! ! '$ &',"%)#,/&%'-2+34262946=>=17E@:AB7DC;IC4CKHF@HKMFILSSIKUMPQLOWOOPHRWOJQWOESXOOEQ`QAVSN\CDSPCSGBLE9=D=D1-7393%./*"-$%  о̾ͼǿºǻþʹƺľ;  &&+%*2%21*/76yw̒7A=.9LE g g33 333Nudos.library**** G.M.C Dos-replayer **** Press both mousebutton to stop. >sion&.:@JTjx~ HNT^hpDJwl ,28HRXbpz(BJPjVf(08>DNTZdjpz".4JXdr~ y#3 B9g& y#3 B6< g gy'q @0@@@@q @q @0@q @@@@@0 @ @ @@q @q @0 @q  @ @@ygq @q @0@@@@q @q @0@q @@h@Ph@h@0@@@}@Pq }@q }@0@0@@y&@hQʀq @q @0@@@@q @q @0@q @@@Pʀ@@0 @ @ @@q @q @0 @q yȁw @ @@Pq @q @0@x@@@q @q @0@q @@h@.Pxh@xh@x0@x@@}@ Pq }@q }@0@yʀq @@C5q C5q 0pC5C5C5C5q C50pC5q pC5C5C50pC5C5C5C5q q yّ,C50pC5q pC5q C5q 0pC5C5 C5 C5q q @C50p C5q pC5C5C50pC5`C5` C5` C5yEq q `@C50` C5 @q @@@Pʀq @q @0@@@@q @q @0@q @@@.Pʀ@@0 @ @ @y H@q @q @0 @q  @ @@ Pq @q @0@x@@@q @q @0@q @@h@Pxh@xh@x0@x@r$LMM$M@MZMxMMMMNN NN2N8NHN`NfNvNNNNNNNNNOOO OOO,O4O>OFOROZOdOjOpOxOOOOOOP,PDPVPfPPPPPQQQ0QDQXQlQQQQQQQR R R4RHR\RpRRRRRRRSS$S8SLS`StSTTTTTTTTTTTTTUUUUU U.U6UDULUZUbXZX`XXXXXrUXXYYYYZZZZZZZZZZZ[[[ [[[[$[*[0[6[<[B[J[[[[\B\H\N\Z\b\j\v\\\\\\\\\\\\\\]f]|]]]]]]]^^^"^(^:^T^\^b^^^___$_4_D_L_\_l_|________________```"`(`>`F`R`X`n`v``````````aarhxBa a*a4 04 .<JXft*8FTbp~*8FTbFJfj$:BJ",:;;H;h;l;r;v;|;;;;;<0p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p; YغXYS6bP5P H@(GB!X@@&IYaZ'Ccka siu2p#rcg (  x $  (D BLNUh͝ lNdAGQ߄&H{W;'Cckz1g{;s;C[S.8uB;u  Q AxAyxņd  P´.Nql֦Nvv\0UAVqC6`k6b ځہ"؁95Q%S⁞J€BkU? PA(Y *  @AD!D8!PNXTFTeA/" s 37EOq@Km`  @P0 @\ . @ @-  @`@. 0 ,. wUA@ " -C   $D@`(tI @-  (l<  4' * @-@ / V@@' 0Ap  0XEyA'@u@X D8|>p8|>p8|>w瀢ad (4<a.aT (4<aaD ( 4<aa43Nu:@ @fNuH@2B@H@HH@H,y. Bf`nX0ڄl(O> <,844h2CLI I`:Wr8| >p8|>p8|>p8|>p8|>p8|>p8|q>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>pqN8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>p8|>r{퐢,o?p?p?p?p?p?pDI@, p K(-hdDAp   "@P@@$ DbqR@@% dryQ@@$ PTjuS@@% tz  iip?p?p?p?p?p?p  8)0"pAX"(r|)/0(8P:T!L d"* L @;qPS$0:FPV\rp| <LXr~2>NXd&,>PV\fjp  &.4:BPXfn|"(:@r}jJPV\f~    ( 2 6 > H L T ^ b j t x     $ * 4 : D N Z j z   . < H X f r    $ 6 @ F L R \ ` p z      $ ( . 2 8 < B Fr~i L P V Z ` d j n t x ~ ",28NX^d(.4JTZ`t|*06<T^lrx~$28BJTZ`x$*BHNflrr *6<BX`jx(2>DJ`htz0NTZx 28>T\$,HPZ`f|0:Db *0PZr`~ 06@JT^hr|<BNXr~$*6@FL`x~$,8FT^bjtx$(0:>FPT\fjr|r,4DL\dt|   $ 4 < L T j p t | !!! !,!6!<!L!V!d!r!!!!!!!!!" """&"2"8"J"`"j"v"|"""#Z######$4$D$J$T$Z$`$t$~$$$$$$$$$$%% %,%2%8%N%VrϤ%^%f%n%t%z%%%%%%%%&& &&4&:&@&b&h&n&&&&&&&&&''"'('@'X'p'''''''((( (*(@(V(^(d(j(t(x(~(((((()))"),)2)>)H)N)T,Z,f,l,,,,,---4-:-Z-`-----..........////*/B/H/R/Z/`/p/v/z//////////rˈ///////000 0000$0*000:0@0F0N0V0`0j0r0x00000111"121:1B1N1Z1b1l1t1z1111111111111122 2222222223 3323:3@3V3f3t333333333484H4~4444444445555(505:5B5J5T5\5b5h5r5x5~55555555555r55666"6(6>6F6R6X6n6|6666666666777(727<7|7777888888 82888>8D8Z8f8n8~888888999*909H9N9j9r9~99999999999:::":(:2:J:T:\:f:~:::::::::;;H;h;l;r;v;|;;;;;<0 > >:AAAAAABB0BBBBBBBEbEEEEEEF FFHFZFFFFFFFFG GG2G8GlG~GGGGGHH$H8H@HLHXH`HhHvHHHHHHHHHHHHHI II"I2I:IFINITI^IfIrIzIIIIIIIIIIIIJ JJJ"J0J<JHJTKKL L(LDL`LzLLLrp^ &RC$Ala珀q@b~@X>8 ?p C*XPbpBA G Ѕ&' ?=0?@ .T&<??<ÁAqPd@d p@(c~d>c|`< &qh    H (H("(@&,:H (L"H3 (AǶ0 ;/@$h F,ȁ@h GYsF l`<&=a# #x6@P?#808c "3!^x(1(#^H@='4 #{/a &='B@x)!ɄB@P)d~ 0`!gs(rqo(ݟK0p(c|3M8'1c#x6@P?#808c "3 F#P1{nP h;qP`{!IɚH@c1g@ *apxcx8|[ 0,CA@(`b)@P( d @€((`F0a|n4 p="[2x@Cè. (!X0I@@)1 CPB i { P8,} @40mC80    fx(8@4ASɅ#ٳ  - 66#rr"R1@C oh E``xT ynh#ZbfbP_ (?rsAAKۚ(Plch1(`Ё6cf`P@y88?x 3 *1x B;,<Pa# xF9Acc$0c  l0|8 242?q 80Pq  P>X `@P9C(0L{l@п @~Ƕ 8&=`8 (@>84 #@(@R=(`q#q`L1r2a@#s 8!#&z &)0Pr1@i( FB@$ye8  P1@x  @ r! (AǶ0 ;'@eG@Dp G_`Sa E&(Lrt&j>b#& @P>o71 #@b1  R2#%'">c. #&$/ )<P90!h@t1@0~`  )#<>H` (=̺+@!p  Pd3P @ a@' C (5P >1(# RA` 8JP1@pp@j!D(H< (E# -(;6P?0 p`A0 p@dg` Lds`0?xCp Ear<^( Yh+KH Y([vo61 ( EރB9v С^8f7 A~6s1BЁcs A @P(ZP0c f4Z/<&8C N)dPf7f.nh d 1lE2(p'<<@Z<1C!\rvT#*e@ 3? "033( -2 d l {@ЁX/0?yh(WȨay_B  k; C - AAB gϝ٘07QG am(8? (0 s׷44)( `(`@Ёcsc@lL@̌|~(9 &sc0-(cf6f4, =lqpQHpw"!Ͼ1y8@8?p>}VBct7}`Hoߔ QL @(d0 vd4fwn!A޷!  01ゅl`$0hn,yx@( ̆0̠ a0 Cxx0?rwIp?p'<'@ `|"`" `` Q H*0Pk0s(0`(p@@(PQp/<b6( @1Lo|" A#[sP (.G?pZ  0D$I a@&)7 #zW0b^ 1բaH!nJFb 0 bW`1R FjPbT Rׅ  1 ( բ0 {@}@8n8ErxI *B`J|BD݂P; (tA`_q`1Tx@`CeK`1TcI#Fcr@svF GF@{@@8(7~߿7A@N^Ns8?P,0PX P :X ;X 8@#q(hGb((  &9r8Ȉ E#̘r1i FaĤb( 9vP1bAB&(L1)J0b@#F (-0sP>P?pt    {b( d$!(1PbÈxB$ > Q" #0 b@ XpryBJB  R "!!`<@R` 11Tg`  PyǓG=@lBXԊ *   P7G۟DŽpa8 R!@`BD \ y `aP9,A`jL169`b6gP` vdgFFndf` G=b(x)r80%#G?hJayAC@P)R1H<H)# @b8sC&P P0`ƒsB9(=G  P0B@430bhx ><)(P<0 |6  #lxD@p   (``rz1@4 $T$oٟǜ0a`b`  0OSǠ4 Piii?c0<٘r#(P10 #? 'aC#0@7x #w@>0d-'Zg΀G B0;0< ;_;{h(3=Y~#ApP>ffs6go`E0P>46??p?p?p?p?p?p?p?preL# )@oV8`??( N)9@80 p3 @a>@xeB( ( 0A@C p@`8 & qB?0B2@@A>xࣕ H`Ѐ <@` (` A@@0@8@#0<Œ@`=g<0Jx8 $0Bsm:0 & jPe& C z  A@ a(^|He` 9ԡ@Hz@('8 T3YDǁ  $ #|rf>~0~~C3y88?>  0AEs`q<0`( TH ((6 3&p xHQ <,,`M!P)~`V 0RPD2HHB$ Dnp;p[y)}}3  %,T>H2 lxthHQ 0` $p1] /'@ri-k@P.:@ @Aa, iX 80>XiB05  #0 y^N\X  "r*Jr* -0yPMT@PEPHF^XZT4 9i1p"P 02`EN d| * @d9 坋 <0h0tȘ1?>c: %l GLjga(X؁?`p 0f@tMd(b883`># Hxy rj" 2Ϙq073;3QB/p 3 ta8#:I0 i/TB"df60jMN:a00ExAPX5_`u!ys y] ‚^66GA;"f `Fq@ 00bGS1UMІ 7!:'Pl06C` 7$>x aLh. AÁzAs۶@Z(=|qpPb( U`p(s9P`dy``,  bhsX(ݷyAX? 8y18`Z`ah" -9C}~@p1rk P;@ `Cό(g ( -(<>Ȉ-޶{p-4癞D`-4> ~Â* 2@ZX3C7@(0``P' - Cd Z3< `Cό'ĜϠZ?PX7swvZ(?ͽl C 3ZX7 194 _8~H(>߿w6@ЁW=qL ai@#B0A DG -P0|@ C 190 @xx߈5m 8 88~)U1 0@q@`lT  u@`(ZT<P*Z(<P*Z(<P*Z0a㑋G5` a&& gPx  P P)R 8aBP㇁မ€  9>`q@g@AՆ`:X  T  $0?P& @ 3A~()xL P@(L0!d ҈b3@1bHc` 0Lbc@$Gd}kp Frm P~0m@F xr0PaAt@D`@("?PP1Oan ()۾~kP SI1 P#^Lb7 #_ x)0PaA# Eސ@#r10}&<H`L{|@c L~(`< nA߾װ(1M¦L9br1}~ F(wAH(~]wH{@w^PP~@PW" # #i  @h0! #@$4RA x \0@  (a# 6k@ nc)<w<(GꏫP w(P7_ 4 rn !h&LR0?2 ,;yH *ֽ07 >EX P bտJN@)}~vP7ۊ Nb[ȰPD]L p>jR*p p0 CtH` T pjn4 0 @I;@#y0oxh?{(&@ҁC081P (ai@! ! P, !700<`X0HPL DAHQ $@hā$P,y c/ O|-_??g (x0|P0dA03P@(@8>xh?6Hi3P4 @ pd $d0pro3L a| |- O-![ߟmxFB@Aah ¯!G6- ;f!~-, (P,FDD -!N!}P-,~?8%#O&-0po< Z0Phd  (gaq`lC)d @d@ f DFT @F x?lqe J`oǏ Z"> ah# ,A(Lr0(h?Oz< @ )ֿ>| 02J Ad(d$ `4d  4P("A`#ga= (>0Ljh@Aq@d@ `@(40J 20/rZ FO 3 RF( @ hI,A`!@uF$@D@~gA<p"9L)pcS3"zP8A+}Jp8d# B@(/ +B|8AP.H}W#` \hCA=.GdrX`U @`g,& @ ! E09 b  EbE:3e)0RP>@B7+@H80< qpAA@߁AP0)`}1D…@QP% z)pT(-ФK2` p(CrǑ @b<   +|800x R@t r[0IFaA ' Ex@<@p@qIQh,rP{  @0kH0LчPb f((1b (\⃂ PB`PP>n ?(ob?H6 b@s A/58( m B8HP3h'@0 @A$' @g >sP(> b`s ,H09l pHpc"6 xx7LАz:C6aA L|@ o uH X`'!ÀPBV +'B Jna60( ! r\W#LP|  (C 0#삗001 0@  ~(pl<|&```q@pd,8aP,laGZA?q8X>8TB(  pC% H`x€l က.xB!B ?P  )< p+r]f5<h4 @@  &o<8L@tチÃԆ9O!s`xq@op807|(Dy)~xy@f8pZN/{ЀV 8@8TnTqA<Q M~,aA@8E!  @3O`BXP 1p@`H<"~A@p ?A(?P 6 (y<80 8p;C(;p @ @00C،  29̸p㏠.p81ÏN@D`aHGxf#V p@aBr^1AƝ ?\?3. ?ʂ3R0P<< g, X)01 CǏY@>y`1<81 4όaaMφL l@!'E''p!QA( C|8 CπP()c q03 ~q~a  C~`~`ϓ< `#A`0>67 @x!C@~pb Rx? x8Ɂ|P>3 !<>X0|9Y& P`(!cG@T1@s?r_,4q>I#X8a] w`AzZ@b K?J,P8>wy+:p0lP"p""BPX#=-Df@gPT&R,7   $x5! B! FP| |/< p;b(N.9b PPpP PP>BC? < Shd5b( i8D( 8j<@c>T>`~ Hb߰ ((͡@| G@E 5 (< >E€c  @~(3X0p #?03 (X; ) ( تr`58r6>P,C =  h- |@P: /ǏJp@7t #?@P2?p # f;b?94 P@ha!FCX0p WC!P ~𠉄C|X0p|`  0b00d0 (Td & P p 0@ #P  |C r Pi2P* EALBP/0$<< X "`&0@$? t S( ]@HgȠ(_;’1Iң A>Pa䐀 @P>iK!F%<X0!Hra(y "z(> bR1  >`?0 x; A c9H r,00rŤ@ < b(p>%H<^?   P|1A@( 0>A@qCqBD800NJ00=   P7 ?89a~a`xp?yO A;\~O?l d 89w$H/0@?á 8<  HៀxHT)@< o\ L  q@8`D Tނ@͜rb_ *р 0@IH{>; 8@8aj X0< B PSaBLHM)G a6Ã@X#|(  h b0 @H=~; 2#@;8 ; b /'@~< A$<3!Q?1 Q?? 0@0 g;( P( `@0Aʀ @@( * ( e VFDaX>qC@ w(!? .A@#H  ,1Ht  9:7rAE, C (7#>21$C $1@0}@Ɠƒޅ x x0l@P/g ("Wp!P P:`l82 x 4hH3Fp bkB@8U0(1@@3(D: |0` r!1⌔8]a@GV:IT( $Q`a*@axP1 j"a+H>b @5t2tbX bJ@ah(; b!ƒcM =Z@a :0rd!#02P\9 ?A@H}!? 2` 1|D~@h*PAD1A 9 D?P8>`0 C@(8 @бB!C)C ( 0 x?Hp`@Gz jU |1)Y &0<D2`! }Q^= Raߐ~ß&\ - 80<!00<@aH!AJ< PCW0aA Q P0?  x,pE  0 |" xLh20P@ǬbSa`p$!rO–@D A(@K   "(<? dV"Mq_NMW! C? V2OĨ.pB0?`^R ~JoS N: X/ ?:0#ާ䃀рGdP_ ѥjP4-0 Jvp?0/)_Wɏ@ͰH9/0@F)ី ?#d8 +D(889  03(\w? K#,&w<?:$IbY ,  rPHn^K }B5M<@ h?0π8P2x;.@TEPb)~ &H  b(0> _0( 9h h04@lp8Ca`H<à tgDN`o@J`I<H @}!@0c<ym_0|?萎p 6AH utÀ c": P < bAL2uJ @6<PP1hc8 π Ð v@h!A^@P|p2 b7Q40QT8d PBA <"W'B`.x`@!  `=$psx!c8 rQ܀GP2=PŔRoP2(H3\bh>x6 P 󁿀PC@|"~00 p8gKQ$!8@r@_p<x('(  At(3 4@"Ҋv ( (  |A@P<(8p6 " `(\"XB0@H8 8 HP43> , ǀ Bpc04aC`(4x;b~> A ((g 8P,2 A(Pp;p 8#AÀ!N( ;ႀrR&z/ L(4 eQA|U  q@?c   `A5`@P`PAP/x`(a H† Q@UbցR@ p!2`x"y 3耠0 Y |80T| ( x#$ o88a0sx($&a$W PP Fa40B> 84AGRE kb w Oh<4s4|08>[V >y?FA< d@L_p(1࢐,$쌌 b?ǂrSj7 0]c4C8sED l@=1G BewTy3gcw}007#; 0ݜi }8a0|>4*> `h  H10? ?0N䃘 \a g,P(01:@c@2m| l?W\sFQp?_`&/ໂ??P5uP?a g0@Ax961@w`  _9!| ?P03f r ǀ}) !*=$a Ņ Gp?t 8!\8fA!W^ ~`p: `  H>P>D# b{7}rT)i=1 <M0P K0P800 a|(  @?(/8s @dPO@; 08~ oA>X.&E#0xo^ 8R<C'( <O0FÍ9#| d(   )b~{7  8- = @πW aWR@.}Ն~= Zu!"+,ErP7= a  XPp S8*R P>  C ` @|P@`tu@P85x)[ P,RB P!׀ @cjrV /d~ ($Fp _p7D.@A <A( `@e"4( |@? (0g-<Z z P< p4 ZAD)'BD bo @ 7a O@ @-P_(Q`o?~$Z P$mE hP2(eۉǽ( `!? H1@ 0H5@[ z ( LO@}|@Pb(>   PP1@`(@AÒ v |z`g@( @( !( <q _(BPRYrW!T(P10sG;l BP8P_H.2( ?!@ `B!P`m( < `] `b "5=Ւ^E (0 8/<, Y@E>'@P 1@ a~@w @`l"AG$(9 _d H`@>>Ar71Q@:2h: bȊ; 1@`e@B2`q?~rX"2 P$x(( ~_9C( ࡂ(3ghP3^A@ 0A?# ( , P <K 1D (Pq6 Hvn !c mj@ ` dVQ +H蜠s`&(8 +HA@Hق1A b$?9AP@(@ @w *8|3@ `A0.E\>EC> |E@"ow $)Ewz(9`Av$8?S[Z$ϏP8j `"A?AO!@ 1@qoP(8>ihx$vp<HG hrY J/)1 R@ 2|: ,v % rCIA@ e"h83T A d+AcP0 Pp8<`bL?pH P !D;#@!@0o@P>YwbF?P0 | )6?p8Pӫ?543/ A\0,`  Cs((;8=B83 H18À)p>?Ѿx 00 I600{@W)0( Nj_@jwA@P8PO@Rp>P$%@R QB(Sz# )@h( P$ i@pA0H#@)P0@ hP.*y@~| x@pB '3[E lX@< `h9 '_IDZ(ud~"pA E EOPg)\_ ~ }A}Or xO RE s835^<3Pz+@p*xâ| XuAЁ~_k!+ApE >B,,l8PGq@P4<+I a@`x.D~iPp:"@8@P!cWߎpp }d]BE> rH(ؤ|P3{aă`V`RȾ 0 b Gt( 6010@E~ @Q H0BR*_S#ChF | ^D P8xS!H?Ԡb8"BpX #` ` J "*D:-y 7BB P$! x cA < }~( 08 0@<`@G8 c)_`-  @$bg O PxAp =_a+81x b?bRpEG |n: P`)_P< wOx EAM rI)#и&_ (⁞Jt*' ʈ*AtB}(dh/8 ?хP. x&5_P׀Э x"?BI'B>Q(PƝG?ADdGڊZ@`(^\@ E|R*A(Q H)|PA(A E<H| ^@@P@ ~S 0*@pOx@oP R(1L S"&{ !7#\( @|#!^@l+"hM_0___dA( $ @  B0X]Cy|Ghr<-A/Pd `J @ "̜37rJ*:f 0?@upBq|x`RN @)$ zh`_~!$P@sB0]C?܅ E z.z(9+|0cXVW/8k @A*RABJiAxpR ,  3p-RJ lHbBbZoIKa HE8@,  zOPYa%x~( < pvb!B eA1Ui^Cáon8xBGK_T%p?}(<C BCY:38| Q@pPBp98 ,  B?_FK@a `0$' =H@( @`( LH | A` H2 JA A pX+< '7p Eh<s@rz[*Y+ @a<0 "ƌ P?IGP"8Is ӽǠv@m/h p6l}?s _P/ J?[<WgH@e`Gx _I& b>¤}Y$&E/{W_R)! &OrM-LDv@ xaeB(7pߴ<eEfP$`"@ zUg0$&A@P? 4S ` 9C 0`b ÿPb ,l¥EP1j/0b<@AGt0`t {=_(PK<>xAw.\`ZPc#ۂ 6c?|G(0$jSk 6h@?<($$Z~6ɝ3> GqąZ$ @0@\PL8p7 Y ??0#!q> 8!8- @R @|)%C @q@rY(RHl a0  $ ,0)q6 Bh!@qA\Mx "cоx~A*(PJ;½()AMLZ$bP|p@s|?@P $@t B`  U@ i x@a?PP@ !@s0$/ `-(B@APq^9)0J$ !`ip0Ap? P ; W}S 0f_ }ُb(1APiKr9/{Z#pln (?J0Q +0o9PLё?P߃dIZ$\0/a`61xg@yD b. dAa>bp+>pBR[ZP &y1€S~2@ jБ P!@T uO zP@ XmRaE 1$/ZBʄPN 1O Dp8GB @(Q3TCy7\c,[@(StT3@( xS ((@q?':`AA@-VEDHxx;,8sUsA,  ad# @Aƒ> x ~Gmrr:052ahP0.r\Ε=! " @@j =p3 5(0 R)Rx9eU#``7;$ p !dmA  p O(|/<phAp?p\ߙ aw<7 A}7nX< (Q1>g& 0pf_8x:PX8 8M@ ?B[Pm4{R , 1S2—8 $ 8,P.Jqh#Z40ۃW):ȓg`/ I77V6 wR,AwL0Hsq.seyr;1I@B 2h!wk0ހ}eCԃwBa@ >?HB>D,&bKAbXPвd9 $ :9H> žA&##@LAI<<NpP`x䃲 @Ib0L Ѐ{ $)f!a .{ >+%CXm ? @P 3Hb|Pg$?P  0{(Y0 /G0 PO,>(d~98`g2PC Ubփ g>k@#c~`<` t r<2vu^n8dשft$ ];#՞ ?4 )p ,1gq"߁Bxq@ ?X0q(">(PsЀg &/؅!: 5) > @b@78 @ |) z` z`/n )@ PC ۀFsH B><`| _qɃ?BŃqA| z >CB/w`/Ѡ 23)P9( KH{>i ^O70.`CD@x9@  PAm>B( P\KdA{A@}<r=3` A|/`*dD܋T$3 0 (W0X[x  tϏ ĕwP `Dd?>8 8~A?0b< 6sVV 88>1 eHYPX AAP 0&D/"x?Dr>4l% A`>9<@>wP C~B! `L8:# \LáxR<Ԑ=>0 <(oB!i0(@L-0K>9"8a~`@bA% qb+Nd0p_p@F)? DKG?=<8I8@@< j)g Pύx%_bK~ NM?wWdܘP]B)^@x>qW@#gY?w8ʟ>@`X_?ra#09 1|Dɵϴ9< 2 ,O2=6$y* 䅳3?v'pr?5,] 0$'3 _?TKF{=~Y4O@B(<{`AT `BmL8w~`r /`@pG|Xs?TyIH |A %k2@  pRbɘ I<˳Pb(44J@( Á~ Jr7T H( ?~ )lO |H( "xG0 \@VA'/< @ @@?iGĸ8>-9j ~~8 <99C?~@( 3,(GL(p@p(x3?Ғ(r@6] ]8NA | x ˄YbL/ h. P8) 8c0o?P< ߟE~K@ PvR @@9( _|C) `1BmH|bsƆ,Ja@ *n|1A}% _5B CR 83dو I ň A`0( |)~ ~Kq^txPP B30 D1:_2@P0 G) C2wxGR @ P1 O?7? XQ_`0~8@(ܨQǨ Ё@Pa= .VrA7!-/b1CA9SRc@z8/vD> 8c3e`DABF |A{fkG))d8cbN@)DxVi3A\>4<0 N+yd)DT90?8| _@Z|`ߚ0aנP/g@G~mtK^L# X.'1 SpbJ x 0(0]߀rB8 p@Sp5 H@'pob "ET 8(0RTK@̀ 0`(1  ( (U d&T8T A,GKÒu`UP|FXPc ;p :#= (C0#'o(3'EN1MP s8RՙGdP g,H8#(g @@ _ ?\0` ( b aq]B+jx  @tN78;wa0(*)8@ e @xL#, 8/ xP40( _o8}߾8p0+I((rC#RU v6)(4>+O,( ǂ(R8  &l?6FPA77bgaaf5Rc jF6FxYHaP8(X!AC`PYٍ=[$Q/8D++B0xML=->9q38x( AT k`*R8<qH@^ a@ A4G4:jR{Eo~ F@@ZA&eЌxP;Z-h$S`D  sPG!7PPRßTJa@KAt|cbh?>k1zq_?$tF(xqI``ߖl}rp_oN @(_HY?q0vx:tPK(#p D0 'ߦ8I nP?/r9r/;ʐX($. 7$-}>f) C@#ɭ|qcCbGiyѩ8 <# g*|CW߶*F Ag5g:A{^ |`ϛa.Bb @v$M@+WykBM`0(oҐ]Ѓ G/eGa'eoKSGQ @c0O?'f:1 R@0` % o."%aB=TI ) *@( @U5@?@0Kd#' t A+Œ6O;6l.(_$ >pό~2MO1r0cBWj1Ja+V8~6'9 9 {o}<#‘x„}SΥ邓x /@ ?d@ E߀N<@s*CFrU瀀?Bv@p`qI1H k@6w@RKhP@gP? p{5.o22X@r>` ' AAݯ*f< 1`<>B" dr1=>@Rþ@oZjP!h'Lo?󃅿F@?U(Us O|)e|}w}U`Q` iR#ȏٞGPx W TeA  X+~;C_<)PgC`A8 #I9Aq!Vr@)Aq*8@rV&0~Ǐ8g A!߂(¹`$F8b'ϕG02;8k 9%284` 7!H?NsI9ot2ߟ'O l pAǶ~LPA`B ` g: ?=G޸BK=PPOYxoؿqIl4rKZ@[k? X)dϿ?Gia rüCA X9b 2_L :&DXǗ% $!'ggv@+`A5{3)),8t3(?,\RC;"<3?:AI:b;-MGL MtthQZžL'@Obs2AK`G>"-=PE38Hl<49B@tp|o43{+?_P);@07JGv )ar3s1)$@`` 7L,  &da)y^x0P3)8QL x?@G 9C`<00+P!` AE OHO,LLR@*@ǹ@@u)?ody)RIdL6]` (S@/hFJHPJJLB\@D(? Ǐc`{ ch $#_%p@$ !"X4T gO 1 o~L??~0|?uX@(_ F|1 PoH >!<<鯪br4@ 0Pk!Pi͕{T !> ( <!"I’i /S_+( \PpH@f &PPI V@ǀ<038Q\ &IA1 DWBFMD1T_0XA P 2̏@) RsCuhN@9?h=@i!OT "  3D8A?H( @ͻ}3=|@`Os)93pLpP`r6B *dC$~рX8 ܕpy3cb  3qvu7g` 4 l!bO@ ?o #6AƇ$ `,s~wޜ?g}L ރX==$wÜ=~f~lXz΍vnph_уp .;'L pŠAL:2cb |5 6"?n3",0`34 8X ER~tP<ݣ={|C$l,L Ah10L?:;9@!2$0@R?(vzr Cb-=r7C'  F*2`( ؃; ||r~o~fgAWwxzǘd @p(=C8OA c?<3l, >`  32ЭsP˿1Y ?=8( aA`ͤ y)?p 0 !XcWٳ< @(8ip|8ņ18'̙n eM17|C xLF@xK>֦Չ"*a_< `'HA$A1ǹ1r8.B`@PLA } `qHP(Q- c (<#Ed >$@? < :,#pA@B YС p17Х 6i # Z| ><B1@*MX)%$P@q! w cP<)gr 0 'ixk\Z_?"=C? ǀ+<z A;<1Q͍) =y-W0iCGs@?A <o-x'8C8yпuxzo$]EMD7oc Cy8?a?fJ tRH`G|y&gMb DC!=h=?x8q~`\B }=>C8 {lR"@!w:{̘_Tsڿ!D~~ 5g >r9=;) H+̮90wqx|=vZ A@)Lu>IT>G=ᴀ(`&x|/`^cQ+Y yNr$FǨp *#o| ONaě {@~`_xdН87pc<N ?60#T\?v2#?9l Am5`ħ.7?~8tp g?4q'3x3NyAk>aILH@vr>C'?dPq@,~PFC٣rC5@ (>9eS6y` a68x>p @qolp@l8}1B,ZP_ z,ĸ0 4-&"qCP:=|r%GK&|?AhI=7x?.'7 ~z^.6|qA؇i|P_6`ƀ0dq'`.NKECG_z8A0=t07Ln!C~r~С®Οǀ C] 3`[~tG̏PxsxR 1@6hyHr]"cp)`E0bc@1?g}ry>ݥQPA{0(( L0=@/f208!Pą*0 ,@PpB G d N# R0C x& 0}(76+ `t@^@3qA}U< r(JS,8[RU'χ?(`4x~` Gz4ߕh X;k40/* Pa?J5:p-? cx_{нW?oМXvH Ü>|æ?&9/ʆܰ' p hqn˄<BCW3Bi~R Tq8 L9 Mi;,A(:`8?!+x 9TBoR "U~wf-G.Aٌ 4m7y rTK>Г`RkxPf# *PxO?'A(qKUL,J*_ު`! jXϙ!aeWr)KrEP`jnbx(#< W Br $<*P RwѠ($08\g> ;}ZF( _0< ?%THxo<~*,#n吪 j6h3'R| p9~^ &e` sW|W !xƇ:%TD'`h0 *r )Xw{<p߿̫r*L<;ı o~jpO `+PAp6`eb:O^qXR0|D^| 0@,8Nz@ `8"_=q` <ీ @/c)WG; O(8p])2=E8߾-/^JX 8w/uzl)P4 H b8¾EG!A|?8zi3U~@+{:`֕@ Ȱ \ 8FZ.0 #K 8{<`r9Hm+D"{ M _(?cML!7H'BnHRz֒/X0pTJw&Kȧ/q EP #q#G_pB\à Ssm $pØ( G_IQ%͏8{u <WEΕL9( _o4TϿ`)òY?h xP0J(xr-9*mR|| 0"i_z,B_ w)~}@ `q @kU$A!wtA}G?3|,!~ABb!qa#UWP~Ȅ@i@t}gSG_xoq0?4q {0zGdV C"  _ƒ?iG 'h:G l( _C?^ M#OrPR҄l@ t X \2@<$ 0 !@H $t@ | h @p8 $ ( @A R < @4p$ 8 )`H$S@ Z @2$ @@* H$@ Pp@ v T:@>$  !H$iL>L &( j!.^Ќ3a}ǀ} (2Ё"] Gp! '(<C@Xx hb< P$5/| )(P^09p $/D$<\` 8A iY8B\#/ewFl 0 @A- 7A0> \@ 脪 !*D>rQv |H hbp0pQ^$AO Xh@@ƀ`2QP5@ 0 eciHQD50EU^P4(| qP 2ĠjY` f@ƀ&T4APlP1 b(6h2 d ӅH p3g,= #F$ AA3# $`@F a@R-@W@b 8H}|"d( Ѐ`=0,`/0L ` @P,|hR (L+ 0@) U!4`( e ǀ tAA)x2wP X A<@H0 ( e  Ax2aP  P hA @A8(0"(6P@(0t`l@ b rTx҂P (pā@03( < % 1P$#( !D$4S̮@# C Y!P!U`BLpQ~M)O  ^hC/@ 0M`B$!`` @@`"@ 0" J ' L@@B $w#|C[PS`#=B5 ́ h@P4i44 h 4FFЌ +*]0cA0@X  8?(qfqB6 L T!L^$H:H$H "w4@NY* PT%$@`#!`( 0$ \*1`!@`BL A ЮTb @HrU~P8C@& E `Qg0bnYA&  %T"( 2d \ [@y;,F& F@EX$(D`Zxd Bp9Pf@^!Dt`Հh9& V x6ScBpD J  @"p Z005H @ǵ؀A  E`%H`a0(6(2`hBp= x&A(05  ~ `X>00C 03L2\Sia$" &t p `Q@0p h@0w] Pyp0~W? E43F 7+X !C@NՄ! JNM B@rVʮ(4i @H4i @H4i @H4i 0 4P@ 3  @   ` 䂂`E0 g `Dc 58|6 ``Lxl@RP 2P ĩĂUxm!(XA @/`%( dӡ6@ W h0 IE "!R@A$A$a:D`-0;a+kI&0?H:lz(lP4l@ @ĹPb~9A0L ܨ*9A`  +dpZ@ gn[  6=fd%/S 90 I bd $b@ P)@4rWZk:#QB7f? @@ I$  @ HA !)(D h<H$:$ ! q!q",K ၡ1 !02P!e1!0 tP1!20!-6!Z04`!BTApppp0CxhrB eBg20@! JJea"((K 1x#b ,)B_@!P@*D`   @ j@ՀV$ P@1p`h@A!P! d@DGI Yľ,L EDui0ph@D`l@`h0A(@0,8ʺ @r X<" h @ƀ,h k@hm@2 4:@34 d-z7" X@CA`01 `02P`  00h0LY ( @„'` Y Aq!@B Zl<BH1 , `Xd`pXa@X +@ 'P$, , 4( H@E@  : dP<(PanUUG@|NNKVXN$$(TS@%  A.OH/ P`PȜM @M 8 @ $ABD UC@F4C h aB X p 8.WH@@,   J@@-  r!Y/9 ?p A];@0; "{@: A@5XtD1<+U?p?Dv   Ay Kcg:K#'C'Oxp? `OP >XR H c& P  x1`3x ,{1LG4^_  x@=W8^ |C:y_J6aA®p _(??n>!Vj25~@,a[$ u؋DTiߡKiW_դ bc?D8l Ф >Zr"Dj<$, |G  /ʄR?g9|?Z@\䡷 |8т@0?P ?T&!' <C x MdBÂy!!yِ! 1y(^ a🬏?mO?/ j0w* 4|Fa!{_8PB!C?bE  qx;-7i @5߀; | @g@1OA]p~?} xpp8R>.`ps)1r [;+`>MArD#2Pe _ 8bANI11QoVc0k0@%4@03 m ch J H ` ,6@1`h  ch O D ` 06 @1P45+h:`n@(h  l `l6G1=mm (\ P$C B0~铂a+fx5c@ `t`@08- 2 p g: p2 2 A`E0X AB0  r jp $`L@@0+p3 h or\9!P; `\0 @R\@NldB1a0 :  *(@ 0P,%K$[Q`8(O_@`y r?i@X \KpaA( 4p)F @ rB,pb@âGY@D  @a88QTHB@4fR -9nU1`*QckcB"8 !@`BPI* ,TA'$ (0p fDHm1* +w'~DŽ p.D @Pp$UddyH $$Ar1PE(0@}MT;)&&,@1@8r]$7/J H D`h bh@vءpd@AF0A.010J.aQ\`wet ?Y-xIZ? \(@`e!L2p=5(HWTD( 0! 0A`  h0.C)%g;Bn1:"!F h p5` Bb d@(  X((+"P b Cl0 _$ (Bľ& ґO% @Q n} L\)`&3Dd e`L (\! 0X0?A8%M@X@<8, 5HV(2` $1.JTPt& %`1\  .@ (@L =$n8) rA )$&A,I8 #8`I1DIDKT ) vЌ2DC2 d ?"E{ j"n( 9AРcB+eBA8 g6U`l)2"2Q D!Fr_}F@Q^ @gBȝ@Pn@d02Cx $l ,dA 7@LdJ`66 t=:(r8947` BR J@=A"rY`\ B\!PU@ ň?ut$A51 Z :f_B̀C$LQ PH#@&E2` fC TH(M@  J@5*B1C pN#9w~ tAp q@qBKH 3*!B @@Qo*8 0200SCU"P f5,!C`)A`  h`L lKJ) (P2 l@P20lv HXQPh@(d@r`5xh s<%! @ lD6 P3p0 k#e`0`0c~s2 @@@f`d15@ӄ@d ?`@ `0S04t# @1vB8\!F 9 0?`pK@` h`( P1>Ł  @Ob`IO1 @D i F!& }ބŒ@A@ J$ ` @ KAA !a df)8`  `ąĈ;.%e? b΃4(002Pe0` 1 p2p7 c:T a:Z m:`jd@j(2b`+ Lra_e@@ƀT @T @@ɀT @̀EՈ@to(@ "0 \A9`GX1`ZPB@D@!`@ $DD~aAD H+ ` i@0W$ G(`}`!1q̈)AlXL"F0Ci"00b@R H@  ܀ ŀs cV$`i83`Xl2  l"=ocv0Y@ H @р   f@hL dh0-ft?kX0} (@ @€&@ T`a Z e@  a@`000#`1! 6dZ JZ/0rb(]hN@E3 02 0=d@e@d@`pd@c@d@`hda:}P7J ̎ B B# AT@G@ '> 6#o{IhN|@`d^`lH]D,X R O} 񁄀H@"B-aP2V0*X Q QԤ E< .$ (0+U]   jb>:f9`|7PaqA0A8"6x?"DEIZ  ,EH!xP<CD053 N"^H7@jh6JhJ  # Y3v AX46!05a0AB1r"Orc: 0AX`A@$ `C<1(EL`P4`47 &2 BYXRH@`=/07-̗ ` erd J 0rH \05@% E@aeHDa20P?(iP5*!R(~T`1` P `g0Rw C@P3W@x~CŒ@& CrO~```9l0@/oy64x  E M&ƃQk<cA. Zj-`5lh5,64X` E Mh&ƃQkTcA5 @ N `H&ƃ-D` H&ƃ@u6%`MClh0$h` ^@ x b0q(5Ertt H*@쀝4t 3 'M@:h:$h A/ j@N ^ Ztd pH #@思4l$`?rO)`'M@:h2$ A+A gN j td PH ,@׀4$ 9'M:h<6Ix A-rNN%8 @sP~01A;0%?@oc 0[ %e\$Ɋ . YG`0iR}a+,5GxFkA f {@@PH 2J\H8M KD 'A( ~7XрYB!9: O h @p<H$p /@H$ @ @ @0$ ΀-H $\DA"@p4$ x H $@ x z@3P$ H @# H $rf%6g8 g0 g gN g4A `ba`a$: z$0(P"B z(:lGv&a`japATJgXCx"a^AB  zb 0PCd"":NS pPCL"a.A к<"@ Q8"A*Sf``$AR` zC"XC"NuA  z 0T"<ggJf <,yN:JfA `N": z!Nu :":f,yNv zz PP/a,y"zz :zN. _NAFJg SA paA@ǀ}YLr `fR 8 ~ Z((a` \ x" 8v"$I NA\RAl@#!t@4driN:vmh&4 Ȣ ; i$ ruVcu1QA@X @ @ \ @ @ < @  &HJ @U% I1@ H/( (b>@ UW P~y@3@d3THT%M@`60&A0%$ `%}dVP ZH* ZH* ZH* ZH*DZBX@  @   `  P h !0088?'5d@`H Ix!"P(34X$( r P;ih `,$aW@0@aP # 7<[PS02prk1_ J(D+@004;@014'@00p7P8ax +2 9 ` h|0b hB0a hb  faZ``V(& 2! n(O3taLU AY%@bIv3`"54P8i!p+8`@(!.H9f q A>)'PE\ q@ I@0Nc 0~XA/@k0 \ ՘@  @ P @  ƀ H  @ƀ   X @ǀ  @  D \ @@ @  T @@ @ @ L $ @  π \ 5rl]ـ $0S $ ;*M]XTpb) @ dSCY(  `(0i$nBBBD-AB,c>@b`  C5P)4PBTH"   @fSP `@c4C0h3H AfAH4JP2V!I nAڧ or ,P a" f`h@!<(_Oa((MU 10! !Pp10hA" BHaB  A AI(AB6+@  `@@#BUD o@`(`z Pfr n?"z |ez`= AQT a;X Axa+&034O$( `@H @0d$A} 0C,  ![H H)@* `X  Bh P:@`C$ "@C Эhh7@hE@@ŀ hh@4  @  @ 4*Dc@@)*@hh1h$@@̀ h,@  r B(X`"I%`  ,@;} 8x x 0@5a>@h@ #"AL e  q2(32E@   ` &P0(,p\ |r oUth AB@Q..z3 p'op4S. \00PBCX!A޴ @@ t @Ч #`!0U@p(tpA<@5$º@084`C00qE0h 0 !'4$3BL\7B@ &3xZa`*a0,σ/xApfF`xa6(l` hq40/Y bFpJ,`@`E0 dUep!vh"'>AѓDBz, 5=#/5(ʀtGkS}-q`Z <L :⠠n*r Z`|H h@0  E@}<,$@k}`l*.Tݙz")H8`f:$cA&fc `$c57``+ " ` J bP(@ @ƀ'P,N1(@^ d T bP (@ @&P.DhGQ @b"EL!` 2сU!@B?p@ pa.Dr)<Lh44CaLh94wLH3k@@̀5 &(b($:+ @ـ9 ] `B A wGvaL- |p@ pP Á „p"' k@` m@ͅ AJC'0 <t   h d HtM y{mcu86egoxqkizrqw~ G.M.C  qv͢Xv $< 2prHt'&%$#876543210/.CBA@?>=<;:9NMLKJIHGFEDYXWVUTSRQPOdcba`_^]\[Zonmlkjihgfet< 1pusHEIHG\[ZYXWVUTSRgfedcba`_^]rqponmlkjih}|{zyxwvuts~y|re>,yN|C NhJg>Av AdC C$!IC8!IAYJg P`X gAF `JgA2 `PC".( R C"A R"<,yN:JfA `A :R"<,yN:JfA `dA "@ z&:S"QC"ABaAR :bB :|" zz"p$zd$2R"0XT"#AANR ":Bb ::S z< pBA*BA|YJg "H  @`YG&& G"& I"z X aA u@6     "! -,+*)(rq MDaNH,xKA P"PXXHaL/ Q"H N.&WP ."<N:+@ P S"m "XT"Q/ ,S&m (KJ"< XgN:(XQ&_BB kg kg kg kg kNqJBRn"_Q N.C m X"RSg"P (" (X#@P`BC m PP""m N.LNua(J  K"m ""qPN`HaP`@JgRzNuJ m "pP g$" m (pPS L$I""$Q`` |wx̫7x < i3pw!@%%#J"H,yC6Nh#B,@#BN"$<N&9N"9Ja#F,y"<N:#2JgP$&9F"9Ja y2a9f9 fa,y 9F"y2N.,y"yBNbNu,yB$<NJg*"$<&<N"$<&<N,"N Nu(,yB$<NJg*"$N"NNu#.##3@ByByByBy3B BB"ByByByByBy yHzhR{z2= GMC.data|psy8Ķpt@@)X @CX T3V&W@|+hK x8 y R(  $  @q @{:<@(>Fcp|ADCBA@?>=<QPONMLKJy}~d'&;:987654321FE~(=5mcrep.sp}E bset #1,$bfe001 ;**** LED **** lea MUSICDATA,a0 ;pointer to datablock to play bsr Mu_startmusic ;start music loop: btst #6,$bfe001 bne loop ;wait for mouseclick bsr MU_stopmusic ;stop music rts ;EXIT program ******************************************************* ******** GameMusicCreator Replay-routine v1.0 ********* ******************************************************* MU_startmusic: move.l a0,MU_data move.l a0,MU_tablepos move.l a0,MU_songpointer aY +*)(0/.-,=4nstrp,>; GAME MUSIC CREATOR ------------------ by: ANDREAS TADIC News relative to soundtrackers: ------------------------------- * Supports MIDI !!!!!!! * Can handle all type of samples (IFF(with loops!!!!),Raw....) * Both contignous and pattern recording * Note halfstep up/down function * 64 patterns in memory * Can load both Soundtracker & SoundFX songs (converted with GMC conv.) * ReplayroutinA! %$E?Type{h4Gvdevsp$`1OO(jdp N$"<I(l/ / g ,倲l"4(T`,2(jtp NJg2**p$A. J (F |JY%GRVk <̵Cw8'3naˤm/"Z3Tq4&-!0 `$8AKF(T$jUL 4}NQ QD0wU%~X~픱`Ցv\ǤS2qHCGPY0InӁ)(tژwz']~"~߁'|`ҤyyT> ֝vzǁ{~ҁX,/,V@澗^b&.C JW CLOSEDHIHAT1 52FORM8SVXVHDR NAMECLOSEDHIHAT1ANNOAudio Master IIBODY. ! (?+x2-(% Pa>M9?Id  1?$/p B #"0)/) "D$>;3+A7()aM0=%'٫ 3Q *#= !H'. gc('. % W  4"[*iJ 7- H+#(L  "%.>J CLOSEDHIHAT2+FORM68SVXVHDR NAMECLOSEDHIHAT2ANNOAudio Master IIBODY   / 34G @*/1 " 9Q* &L2*$C8$k<B, .Am$41.J@'g;,I & ?Nlv9)8J9M/RI5OON!q5!f9!=Y 6#"D:@d I"ܭ"-R@+ "Van3&0 <2 K)&"-       Gform5J^1_!J  ELECGUITAR6ҴFORM!8SVXVHDRv NAMEELECGUITARANNOAudio Master IIBODY!r       && &'( ) " +GI # $ˣa?CTA(7A <  ȼ,4:  ʾ+'H&X' 1.=?h>'J ELECKICK1dFORMz8SVXVHDR NAMEELECKICK1ANNOAudio Master IIBODY߁ѹ '*]nmXteKVn_KD`nk]TQ`XPMX\C9?ABBCBD7#/3 Ų %'./65>BEORONOQTZ[\]``ab_b`cbbbibah\cf]he\\ja[WT^h]YVTRQPPOOOONOONK,.79$"&' ½  $$$'('(*(*$$$"$!####!     h=&J  ELECKICK2FORM8SVXVHDR NAMEELECKICK2ANNOAudio Master IIBODY&ZCla(UT$%+!8;IH1R_SM>CgD6T@+.2& Ͻ"(1;@I```pxpr}wicYK:0+¹ "-.5;HMUYX\hntpq|~~~}z{qkcUUXC77(ƺ %-49AEGIOYXZegfnstxxuw{vt}}xw{{rnmigg\SOHB;2-& `! J ELECSNARE1ْFORM 8SVXVHDR ^ NAMEELECSNARE1ANNOAudio Master IIBODY ^>U{tHA7uHdM OjKKz5حכƗ B l4KL~hjWrO`+xp]il1lϵOޯ<E. JWWeaQY0zDBsSy8 E & 9K4RcNhMfu9RnIzkg"^ АĹض3:+mp4>MyxwpwKVngY?W[㾸䠝&܋n4kyB@ crziy=)rgb&aI0(퐫ς Ѭ}O/UQ z3`z3\|x={ J o heavybassdrumB"FORM 8SVXVHDR 0 NAMEheavybassdrumANNOAudio Master IIBODY 0>\0|!"XWY~"hz|Zh|i~bxuonie_YZNKD?8806)+'# ݱ !'.38?ICTh_l}s{}|~zndl\pYPK[,@4-*"мں "?F8tYa|t4xy]d^KP9!<#رȥϮϺ34$@=8fo(u4{ev}hyEn=Z2A/ķ͏Ơ̲ӿ!&]qc.wSktuYvty~rwe}{rzqqalwsogdg{Xhnh[WlLVNSIPBS-N7!4( ɹʩ %)&\).=)>DAMWWQ\V]Zp]dkdokkvaz]sopqpnqxdun}rvixsxqwwrorqxjoytjwqmkpjougnsbooffkb^gWXZLQMBI<:C$1   κƽƮ˵ -6.(0=2@9FKHCWEVQUO\PX]ZZ``^dd^oakjllinnepadcg\eV^WbO\RWELIJ6J9@892<&3,,%)$   ѽʻƹ    %"*#)),%+033595=>4D;A:DC@AJEGLFKSISNQNTOJTOOTFVOE[KVPSDQHGHB<@?.58&.(,"$\v  ޿̿Ǿ̻ľþȽɿþ#!+ ,%2+76@/ECBGIDKO@RCRILBLL>EC>G9@? &<'?#    )? +  =  0+C. ;5 ) , !+( '*%&  4cJhKHIHAT2VCFORM8SVXVHDRl NAMEHIHAT2ANNOAudio Master IIBODYl :0 #"E.%')N 0'/ *DD;  >'6P($ 4U";Bp&L5P ;:&=D_(3:o,/A 1"i@+x17 HMO3(?e!)97ZA*. +8r ;" ;?P B'/*3Z8. ( hK kefbassdrum6*q!$).49>DIOTY_dinty~  !&+049>CGLQVZ_chmqvz "&*-148;>BEILORVY\_behlortwz}}zwtrolheb_\YVROLIEB>;841-*&" zvqmhc_ZVQLGC>940+&!  ~ytnid_YTOID>94.)$zuojd_YTNIC>83-(" {vѝqlfa\WRLGB=83.)$ |wsnjea]XTPKGC?:62.*&" |ywtqoligdb_]ZXVSQOLJHFDB@><:86420.-+)(&%#!   T2/ !#%&()+-.02468:<>@BDFHJLOQSVXZ]_bdgOLIEB>;841-*&" zvqmhc_ZVQLGC>940+&!  ~ytnid_YTOID>94.)$zuojd_YTNIC>83-(" {vZK kefhihat1xK kefsynth9 F@8<<x8~>?8~>8x   < <0x8`p`zzrr ž@@rr <r׾ K METALCLAPS1o3&FORM 8SVXVHDR * NAMEMETALCLAPS1ANNOAudio Master IIBODY * $ ?*!շaG U#ұ8#'}3C  -۔M\$# &%K?Fd`66A5 {[G*c?4!!1  $'-, 5ā<)qvޞv a  j̗BSBƨO|!< * %#)?!/cR5ތ')k> 5(nA 0>!$S? $9*={5艜*Tzߠst;ҁ )jK nightmad3~|???~>?f rK1 OPENHIHAT1\LFORM j8SVXVHDR NAMEOPENHIHAT1ANNOAudio Master IIBODY 0 )PF ,q8$FgD2MN( $F6-/  +*'Q#:)WKl4a823O/V6f;?02-HC Ґ̓ɫ =2$; ?V20B2$BI\SШܢР)";PCV #Wa#.&%$2  !Ik/f$ W- G9$M." .CD8 +++)-(?  !,"2)G$ /   !$ %    )  * &    ",}#'               ֐Кے̲ʷ߱)#RaUsVFk9ywB@ZcM;<!؈Ȧ">Kl4a823O/V6f;?02-HC Ґ̓ɫ =2$; ?V20B2$BI\SШܢР)";PCV #Wa#.&%$ K  STRANGESNARE1uFORM 8SVXVHDR f NAMESTRANGESNARE1ANNOAudio Master IIBODY fDXZ\ Fܱ)u=ɨL"8rrO,m4Bwvp|H Ѳ݊B6n\Sm\9u^jU:REC?=59ɋūŁӂǑя- /'Z@Gi\kus}x}x|szqLxk?A<4L?% ýĻ7>.+@MF/3C Ȥ%!<05BQCVERFNaXHT?KI832 쿜̱¾ /#8"0_F DK SYNTHSNARE2:FORM <8SVXVHDR NAMESYNTHSNARE2ANNOAudio Master IIBODYꀀ/ k\wi ʦ7;-ZsjOK+]uBzh`͇[1Fsm_SFk5-ߐȁ)bOAqfIh vnJO9ZH O9"A -EN{BL}WR> ֻӁHWm/ dLCP@}0B^gkhWxȱ?͛M`H:Ѥ߁4Ό(Cρ@7R*8ZXWW6T*lBzJ6^DPTz&B|*y SS۱˕ح ޒ7崶bK wtomdrum1[ nK WOODBLOCK1_LgFORM8SVXVHDRV NAMEWOODBLOCK1ANNOAudio Master IIBODYV0!ye񟆈{fUj}yte$or܁*Rd9Y‚]}s 5FORM8SVXVHDR NAMEWOODBLOCK2ANNOAudio Master IIBODYC;%#ɴź4>q?ĎX^j'曄aq-宊Fof3-QfeH$ΰ/HPA, Ⱥ2:9' .=<*¸/?C4ƺ"ȢEg wZ.>: 5ca& "6^,LN on ^?B"y7.3B74ԖEipOaFBc5 vO $,17\0'Vvʜ\dFbpp8/$n INWlNUH0$m+| gJf,0,lmHzN"XOL N]Nu0,H l8$pHz/ N]=<;:987654IHGFEDCBA@?TSRQPONMLKJYXW_^]\[Zl=blit.texpZZN>NUJvg m !f/-Hz0NCPO`Hx/-/,vNQO m !fN.N]Nublitlab: %s NU/ $mp0*&A Jfp0*&`?*&N%bTO`N"BlN#J@g HzN\XO` HzNPXO`N%N`TlNBlN"J@f ll HzNXO`"N)J@g HzNXO` HzNXON b`rN "`lHzNXO``D8'd0;NJloSl$_N]NuBlit safe.Blit unsafe.Blit unsafe---hit Z$א% % Blitter manual % \input blitmac % {\let\textindent=\relax \footnote{}{\vbox{\sm\baselineskip=9pt\noindent Copyright \copyright\ 1988 by Radical Eye Software, Box 2081, Stanford, CA\ \ 94309. All Rights Reserved. Every effort has been made to supply complete and accurate information. However, Radical Eye Software and Tomas Rokicki assume no responsibility for its use, nor for any infringements of patents or other rights of third parties which would result.}}} \footline={\hss\te Z     SƮL(Ql blitsim.cp5again to overrideZero flag SETZero flag CLEAR! bad value in gadget switchNUBBmBmBmBm mobX m +P m -fR m cg m Cf9|`&HzHzNAtPOHzNAjXOHz NA`XON Sm`N BmBmJf lv/(VNMVXOJf lv/(VNMXO+@gx m;h m;h" m f/-NLXOB;|`: m f2 m hhW|;@ m hiW|;@;|` m g m @f9| m/(NXO` m f ;|` m f mpqEhb m hb m?(N.TO`Z mpahb" m hzb m0(|`?N/TO`, mpAhb m hZb m0(|Y?N/pTO` HzNXO/-NKXOB`pJmfJlgNdBl0-U@H;@0-| H;@ m l m`lJmmJmmJgDJmg ' '; q++, p++) *q =Q>lL blitmac.texpؑ \magnification=\magstephalf \hsize=13.02truecm\hoffset=-1truein\advance\hoffset by 5truecm \vsize=21.73truecm\voffset=-1truein\advance\voffset by 4truecm \raggedbottom \font\Bbf=cmbx10 at 17.28truept \font\bbf=cmbx10 at 14.4truept \def\section#1\\{\goodbreak\vskip\baselineskip\leftline{\bbf #1}\vb} \def\vb{\vskip\baselineskip} \def\b #1(){{\bf #1()}} \def\not{$\neg$} \def\xor{$\oplus$} \def\.#1{{\tt #1}} \def\reg#1/{{\tt #1\space}} % {\obeyspaces\gdef {\ }} \def\begverb#1{\begingroup on    !s410ADMEpI&/* * Some code to simulate the blitter! Original code by Dale Luck * Rewritten by Tomas Rokicki, 12 April 1988. */ #include "structures.h" /* * External values we use. This is where we get all the parameters * from. Upper case macros are used to reference this structure * by the names used by the hardware; BLTCON0, for instance, expands * to blitregs.con0. */ extern struct blitregs blitregs ; /* * This routine opens a log file if appropriate. */ extern FILElnn *openlogfile() ; /* * We use a few macros to make the code easier to understand. */ #define BLITTING_FORWARD (!(BLTCON1 & BLITREVERSE)) #define FILL_OK (BLTCON1 & FILL_OR) #define FILL_XOK (BLTCON1 & FILL_XOR) #define SRCA_ENABLED (BLTCON0 & SRCA) #define SRCB_ENABLED (BLTCON0 & SRCB) #define SRCC_ENABLED (BLTCON0 & SRCC) #define DEST_ENABLED (BLTCON0 & DEST) /* * This macro takes two 16-bit words and returns a 32-bit word * formed by concatenating the two words. */ #defiL~^yne CATWORDS(a,b) ((((long)(a))<<16)+(unsigned short)(b)) /* * This is the blitter simulator for running the blitter when not * in the line mode. */ int donotlineblit() { long aptr, bptr, cptr, dptr ; /* our pointer variables */ short a_old, b_old ; /* shifting old values */ short a_new, b_new ; /* the input values */ short a_masked ; /* a after masking */ short a_hold, b_hold, c_hold ; /* values we build up ی2*/ short h, v ; /* indices for iteration */ short hsize, vsize ; /* how much to blit */ short zeroflag ; /* see any non-zeros? */ short amod, bmod, cmod, dmod ; /* the actual values used */ short fill_bit ; /* for the fill mode */ short tiny_inc ; /* next address (2 or -2) */ short ashift, bshift ; /* shift values */ short minterm ; /* t(1  ldoblit.cp!>s/* * This is the routine which actually does the hard blits. We just get * the blitter, stuff the values, wait for it to finish, disown the * blitter, and get out of there. In this special version, we also * turn off the display and time the blit, and write the time on the * screen when done. */ #include "structures.h" /* * External values we use. */ extern struct blitregs blitregs ; extern long gvals[] ; /* * This include file includes the defines for all th`$l gadgets.cpos/* * Gadgets for BlitLab. We have something like 40 gadgets here. */ #include "structures.h" /* * To make things nice, we build the gadgets up, one by one. First, * the externals we use. */ extern struct Window *mywindow ; extern char *bufarr[] ; extern char strings[] ; extern void *allocmem() ; extern struct Gadget *gadgets[] ; /* * This routine allocates a border description. */ static struct Border *givebox(xsize, ysize) int xsize, ysize ; { register struct Bor jl r initialize.cLpa/* * Initialization module of the blitlab program. */ #include "structures.h" /* * These are the externals we reference. */ extern struct Window *mywindow ; extern struct GfxBase *GfxBase ; extern struct IntuitionBase *IntuitionBase ; extern struct RastPort *myrp ; extern int custscreen ; /* * We use this memory allocator. */ extern short *allocmem() ; /* * This is the screen we use, if we use a screen. :-) */ static char defaulttitle[] = "<< Radical Eye Software-+l makefilepfˢOBJECTS = blitlab.o bits.o initialize.o render.o gadgets.o mem.o parse.o \ math.o doblit.o blitsim.o save.o .c.o: cc -e300 +istructures.b $*.c all: blit blit: $(OBJECTS) ln -o blitlab $(OBJECTS) -lc $(OBJECTS): structures.b structures.b: structures.h cc -a +hstructures.b structures.h delete structures.asm count: wc makefile structures.h bits.c blitlab.c initialize.c \ render.c gadgets.c mem.c parse.c math.c doblit.c blitsim.c \ save.c clean: delete #?.log #?. c2mmath.c'pT("m/* * This is the math routines of BlitLab. It checks a possible blit to * insure that it is safe. It also handles the line calculations. */ #include "structures.h" /* * The externals we use. */ extern long gvals[] ; extern struct Gadget *gadgets[] ; extern short *realbits ; extern struct Window *mywindow ; extern char errorbuf[] ; /* * This routine insures that a blit is safe. It returns 1 if it is * okay, and 0 if it is not. */ int blitsafe() { long x1, x2, x/aCm~mem.cp}E/* * Memory allocation and deallocation for BlitLab. */ #include "structures.h" struct memnode { struct memnode * next ; long size ; } ; static struct memnode *head ; /* * Replacement for AllocMem. If not enough memory, we exit. */ void *allocmem(size, type) long size ; long type ; { struct memnode *p ; extern void *AllocMem() ; p = (struct memnode *)AllocMem(size + sizeof(struct memnode), type) ; if (p==NULL) error("! out of memory") ; p->size = size + sizeof(struct memnode) ; p->next = head ; head = p ; return(p + 1) ; } /* * Frees all allocated memory. */ freemem() { struct memnode *p ; while (head != NULL) { p = head->next ; FreeMem(head, head->size) ; head = p ; } } l makefilep *#mgparse.cp {B/* * Parse.c of BlitLab software package. This routine handles * parsing the strings into integers, in any of the possible * formats. */ #include "structures.h" /* * Externals we use. */ extern short *realbits ; extern char *bufarr[] ; extern long gvals[] ; extern struct blitregs blitregs ; extern char errorbuf[] ; /* * This is the main parse routine. First, a static to indicate if * we saw a parse error or not. */ static int parseerr ; /* * We allow the fol0'$mrender.cp0/* * This file handles the graphics primitives for BlitLab. */ #include "structures.h" /* * External variables we use. */ extern struct RastPort *myrp ; /* * color sets the current foreground color to the appropriate value. */ color(c) int c ; { SetAPen(myrp, (long)c) ; SetDrMd(myrp, (long)JAM1) ; } /* * This routine draws a horizontal or vertical line. */ line(x1, y1, x2, y2) int x1, y1, x2, y2 ; { int t ; if (x1 > x2) { t = x1 ; x1 = x2 ; ];msave.c}p}m/* * This file handles the save/restore function of blitlab to * files, useful for demoing purposes. */ #include "structures.h" extern long gvals[] ; extern char *bufarr[] ; /* * Save them to a file. */ saveall(num) int num ; { int i ; char name[40] ; FILE *f ; if (parseall()==0) return ; sprintf(name, "blitlab.save%d", num) ; f = fopen(name, "w") ; if (f == NULL) return ; for (i=0; i}1. These are not checked. Be aware that these are not blitter registers; they are simply values that the program will use in calculating the actual blitter register contents necessary for the line draw. The (line)/LINE gadget turns on line mode. The Setup gadget takes the SX/SY/EX/EY values, and sets up most of the blitter registers to draw the line automatically. It does not set up the function register, because there are different ways to draw lines. For a solid line, use ~A mƊC+A; for a textured line, use ~AC+AB; for an XOR line, use ~AC+A~C, for instance. It does not perform the blit, however. Note that if you want to draw a new line, you need to change the appropriate SX/SY/EX/EY values, then click Setup, then click GO. The next two gadgets, W and H, hold the size of the current blit. The W value is in words, and the H value is in bytes. Legal values range from 1-64 for W, and 1-1024 for H. (Of course, the useful range within this program is much޶Lsr8v11leBootBlockp .Kc*$7  *j8_wxxsaxx݆Gxx`xx[Gxxw_R"y%mb:c/lesss form5s  sONMba`_^]\[ZB 13prᫌK,x+NH瀀 n+H+h(p!CNLJfpNu+@pg Df0HH+@$ f+HAfN"fJ+@ @+P aJgd&+@ m  P|1|0!C+H -$AJ"mrNDJn2"m3|#m (#|$#|,N8"m3| #|$N8"m)N> n m 0` ,m"-$<NJg+@A@$"v N f$- "-&<N fn"-A($vN fT"-JgN,m -Jg"@a - Jg @N"mNbNuAS$M@]YXmlkjihgfedcqpxwvut'vT11.asmotBlock.asmptWq** Heres a little utility that I have just made. ** I thought what I wanted was on a fish disk but that program ** only saved dumps of boot blocks into files that disassemblers can ** read. So I decided to write one myself. Here it is ** The command to use on this is ** FileBootBlock df?: filename ** there must be only one space between the drive specifier of your ** filename will end up starting with spaces ** It will read the blocks 0 and 1 of the drive gyv 11.asm.infock.asm.infopyaF B)$@7 ]!E= )y````c`c````c`c``c``:c/lessFILETYPE=textcrafts49EADMEp+2y543210/.-,+$C17pZ_='HK8A"P$QX+IX+JHaL"mQ ,xN.&mP ."<N:+@ P S"m "XT"Q/ ,S&m (KJ"< XgN:(XQ&_|z kg kg kg kg kNqJzRn/C m X"RSg"P (" (X#@P`.BC* m PP""m N."mQ N.LNa(J  K"m ""qPN`>aP`6JgRzNuJ m "pP g$" m (pPS L$I""$Q``HK i>&%$#"! B 15p!HK8A"P$QX+IX+JHaL"mQ ,xN.&mP ."<N:+@ P S"m "XT"Q/ ,S&m (KJ"< XgN:(XQ&_|z kg kg kg kg kNqJzRn/C m X"RSg"P (" (X#@P`.BC* m PP""m N."mQ N.LNa(J  K"m ""qPN`>aP`6JgRzNuJ m "pP g$" m (pPS L$I""$Q``HK"-@A"PX+I+|a NLNu m*"mБJ`jS f dZBAf dBG8vBA30HxlFDSBf QQJCgAV30HB`  3QG&kPoG:tf dQBARB3 gHSCf QQ3 HC`   AgBG4vf dQRCBB30Hf RQKs0`2  BBvBDf dvx@f RQDE HSA"Q`NuZ6}@sNJ fS-5mBVbnF|*rh`h `#!⦴l9زxmR@Ie-L&aXcbdnRpI53bhn1RI5b" \:ˈr *5,"؁.ԹZћ\`]ڳdr8 :#r,E [5Df<vm#!{ ` 0g?360LjcSa6̶< Xc^lPWcaq߶Qxo! -tBc [Z 0 ? 2~%ۆo x^5ǜ eN̠lfܞ7aogjJ ߇Za{\Xk`+hchp3.ϙ'x$xcGAؼY[(,)x! χxvϘy+ex33G1/ b8(^9SfD3>`<1 o]&.,XC`cA`acg`?/΍¸X&_g Ou 3X$c iyҰg9 ̮yaYx'L~~^?~Ϋ '.l1` L gܹ(ts-_s s-X s~4C7DWB* Giyq^{* {K38LLχπR8ZQ<ooo <> &??>ǐ=A ́̀L@Ro!E 1ģ30g?gPg '`sOl S"͌,` ̰6u a 606 c 333pg&:Z)r g`LJ% g堌|#a?cx?cq*~e{@s^:Ј *',, 1&Vtkq'_KW }$mpP=a\5 rP,2hJPV5 br,,Ԡ*`2!<5BAH NjPd䠤5AZCkAU5A(r8PT!UDh|9A *ԠEh9$A* 0j6P>DԠLR5XA^ fjlPrxԠ~5A jdIPԠ5֨A jPB Ԡ54A: Fj\PtzԠ5A jP*@p3.ϙ'x$xcGAؼY[(,)x! χxvϘy+ex33G1/ b8(^9SfD3>`<1 o]&.,XC`cA`acg`?/΍¸X&_g Ou 3X$c iyҰg9 ̮yaYx'L~~^?~Ϋ '.l1` L gܹ(ts-_s s-X s~4C7DWB* Giyq^{* {K38LLχπR8ZQ<ooo <> 'H)ڿ +*)('&%$#"!6543210/.-,A@?>=<;:987LKJIHGFEDCBVUTSRQPW)4C16p*(9l9E add21k{'W¸)b,aNH3 3,xK z"PXXHa3"_Q N.&WP ."<N:+@ P S"zP"XT"Q/ ,S&z:(KX"< XgN:(XQ&_BB kg kg~ kg kgXBRn"_Q N.C z X"RSg"P (" (X#@P`BC z PP""z N.LNua(X  K"zn""qPN`PaP`HJgRzNuX zD "pP g$" z.(pPS L$I""$Q```* ',%4Ka~AKCP$` fa4ejrvfa(e %)DZ@!2: !\#2D`ipBQR:U\ 2~7rFVX0 BPEt T4hBa@`|  谀0- @X.!E$vx`58 A\@i ]$IYDTX(w(FA8Q/"!l@ʊFP!f\]LrqB!B䅃< P3]m<f4,ab `Ð`p@hS8Q/9,H0;aJ!ba (_ ,/,,1pR`[Cq8 I4paB  79; +r_P. @ P0O6}Xy )AP5ƬA_a(N a`.p@ALBX PX3  ^G9 A! QFYH@$`&m`AH3N עv$hPd  Y V@@b@xXor (/S/3VM p(%TH (J]~sR"ptZ9ȐB@cv@cWD p ES b@) `<+pL0@`_ b@ j ARI0ƘZ6 !8߃4<#HD#\ 8 !A$@ 0ئ,$XX$`$Q%A/!ԉqRRBU`6f:SDb]X[;YК9 Kcg:K#'C'OP9AyB *ʋ $ VQRTP!#Rc` b`%4$d DP@68L#,$p,$  ȤE(&B | :,@ !@0: "CGAþDA@(C $ ;B@EGecadZAb bh1]B(?(((j&J6rR."<<# VVEUS :8QDᤡmmZ"ʼnşIIPTPSWMYOIIOK ]KO PJDa6v^.^A6A&^`abR)ǬŦB CB#gφB-h,0$OF<8;;%t Z ڋtv挦0J4""&RA$id4IWQ4QtsvԎ8DVAA^FRJ8Da>+scNc6S6 D ;- gI3B A)Ȥq2$@DA #  S H@  @1Xg 2@`a *>0x;aw3~;>l>B~x`05%.> a8c<b4s`#  .?bc32fdžcg-!BD ++ mQO@<Ixg 7yuvIeTˊV,B@BJর9brQY-`JE⃣6E A3e_QT,jA`]Åf)\(P*Ä AMc4((RDDX&KUK)IX@ 1"AR[N]jyNP 6(>D&,F@9@$HTȊ )cT2#K(AĈi9QB *"_TB?$\XDh}E 4F @ 8 l8*I!3+RzF>%IЂ)O@bơy9Sr hJ.BE,( gbnjP్LQ4 H@OFH;YXPО2AARNv%a{@em`a0ruRPh`e6^X'odD p#tq DibbD0!5vqt !P3p!w"!QUyye "J :BI! |Q„T \`%@bQBaP@X@\ -`X (4}I4" Ofy@ 5.%e  X4"bBHfJB"D%@`pC8A*(R@0!!(WBaA#`y0 &XFS  HlȀy@k@0b H y¡1A5@P@\ RJ !FC& AU p:.  $X(0x\& !@. n xPp@7H̰8Ǒ$WGAx4I`AA Ÿvh~!* 6@ m bHBZ(O~,?BȄEyW)q(և\,*?J\ P䰡5.'zT*NG( 5&@P 06FV@" dƇD/ f%v  MH!:r`& L(HL0PA2 gfʈ 5E!rUPK`I (?\) d( 1,, [2(b2(€ G@ ] L&7a @G1BVD0@l&!QG*@ \`՚ # ',DR vYL QS`+,$0 3D?2?8FeSplay{>L# #  Ha @a # T >a SPLAY V1.0 1988 HAEGAR THRUST0 p,y N  fa SOUNDTRACKER-CLI-PLAYROUT by HAEGAR 1988 THRUST based on KARSTEN OBARSKI PLAYROUT Try " splay ? " HAEGAR is a MEMBER of T H R U S T ` 9? ffa 6 Syntax = splay name(song) The program searches for the instruments on its own. If any instrument cannot be found, you can exit the program by holding down the left mouse-button an@ A2KJIHGFEDCBAF'SplayS{@Bde;# #  Ha Ta# h RaSPLAY V1.0 1988 by HAEGAR of THRUST0 p,y N  fxa SOUNDTRACKER-CLI-PLAYROUT by HAEGAR of THRUST 1988 based on KARSTEN OBARSKI PLAYROUT Try " splay ? " `h 9? fad Syntax = splay songname The song has to be in the "song" directory. Insert the instruments disk in any drive then press any key. If any instrument could not be found you can exit the program by holding left @C)mousebutton and pressing the return key. `Z,y | <"| "<ND f`*B9 | h2< $g9 Q"| ,yN> y "| T 9 SQ< <"<,yN:J@f&a Not enough Memory !!!! `# ah# @9 HFavJ @f: | T(QaN Songfile not found. aa`aa,y 9 @"<N:Jf2a Not enough memory for songfile !!!! `# # 0l39f3@# >l33Nu 9 @ | #FИ#JИ#NИ#RИ#VИ#ZИ#^И#bИ#fИ#jИ#nИ#rИ#vИ#zИ#~ |FB"pBX@ yRNuH@IHaLNNuR: :f B:`MJ.g*|a@MJ.g*|a,MJ.g*|aMJ.g*|a`JngB@.Jga` B@.a.Jg g g g g2 g, g& g g: g4 g. g( gBNuB@.n nqj=|q;nNuB@.n nXk=|X;nNuB@.Jgn n@k=|@;nNuB@.njBn;nNu :g2 :g0 :g0 :g :g NuB.`B.`4.`HB2.A@ JGR40PgT`;BNu yR&H $HX 96B2ҹ2#>By*|Ma*|Ma*|Ma*|Ma <Q <y3,| nf# 3,| nf# 3,| nf# 3,| nf# 3A 92#2 f$B2R6B09"96fB6Nu,XB. JgbBCB(B-q(=sH=sH63HJCg"$.ԃ-B-B =sH=sH;n`$.ԃ-B =sH;nJV@ K?g$=V3*;n;V0.y0.Hn3JVg=V. f=nNuJ.fBn g> g8 g2 g2 g, g& g( g" g fnNu0.`0.H` 0.Hn@3Nu 99f09f&,yC Nh,@BA&"<2N`Nuintuition.librarySoundTracker V2c@ LN( The Jungle CommandX(\:}hS@. xqheck D $Xf$*LVflx> &28>^j ,<X\ *04:@FNTZ 4:LXbnLW~}a`_^]\[ZYXW/=14p8Nm( HAp0(## (й# 9"</,yN: _#grr&9"yS"؂"QHAII 9/,yN: _#g( 9йܐ#"y 9"9ёPSf#  #a y 9"P""(X#APSf yp8g\ @g^p"y*1P 9(qP`rHJf (ITH,۴hSDf`R`L*y*UPNH"y 9,yN. 9"yN.L8O)NuL <gNu*( y"y$y fae6rvfaveNrBDax6Drfa^QQ`8rx`raR m graB62< ` 2< BTB6a.SJ Q3mJfNuN DNuSABBf DQNuN@ QF`* LK2Vz a@,rj0 hH.\qP< Pd`xvlPS$`K 5 5CfQh3`4hh6 d_"@ vXA.AD )@P`` ,D ([@8PF>ɀ"*b0W?9&`` T?x[nM C0d j!H F h<@88Z Q 0 '`T 0 PPХhT  `B1OAP'41A aʸyaw 7 " ecg 0vF:#jOB'$\ 3O f0?06` eDx'BhZ2.P$ðq2.9.P6 k(%e(L`m!( @~:(9B'S[b"9!7K'!5)0=85*xodk(aojdh`OghJ 132321 'h `}@ h 4@nC=#==3 d8,A'K`m8# @ !BL`` p'q-((Ie#^< Oz;J08RWT "&R$s88R$t͝ I qp!4v% MƁ@!=L]\] ],]L鳙XlQݨBɁˁB ~ TACF QBAd @"D4CH_ьA9W?pA `y@A 0 r^\TIG\ 898K`x &0N@( @ BHP<4pm, x@ ::JNv&f\@ a,D ,Z@냁14=g@ F %P(R{Pws@SKP, T NiFgU[A@q$*7HE F1F)<Mq*30>p8S$si@ " E$|pS§a}aHD @@p=] H \1mPKTTFvH8 I]`;(O@# `xQ  RrS%ND%U9R  2 d@D T 8#@ i@@ @(' Ƅs g XH`jР8 P758)`qʁ (<H@ dH8$H@L$!q/FX +f7\ "E*=rJPj)6` P4 " T EH(;X#p) !10>A*K"p n ¤4dPD$0a q"@X`@ / a 4V%8TɦF@dD(Bd  (H! Dy*+ VZ?@PP%@%P*bu nh&FB# 4 hX%K( ŀtd A %q4ЎP@֐AN (8P08n02{Vo@Au@(r70 `: <$B&@$N`0 ! h U)P0C@@0_a'ؑ@$Z, R 0 X@@`m`m$ g۠D W8Bp[ u0 9GA $$ !B$HmaIR9]@rAvF6] M ]L ̝\L] YUwk!fGh@ A X8XR (:R8U F dGezd$S 0S brD @B@p\C. p'('@`VD %Lm0BCT@ H tf$` Xqd 0a;83(XJ*@,dG&(FX\ΘX0P!Z P7(CH$@A 052.02 B!h0B6$I"ĒF@I E H K!F (V@2D##G%)x A~8,D HhbD `AE.(G D G !0[!J҈bs I`CR9>@H2 <@ . +'Q< ):8`t,H("JP<Ȓ !``q8 ,2ڕI&P)a E"%`8X( Q,ƨM~ >t @Bp/И $!"`K(V2|p$ "(.4P\b0< 򀀿۠D W8Bp[ u0 9GA $$ !B$HmaIR9]@rAvF6] M ]L ̝\L] YUwk!fGh@ A X8XR (:RV޺b cspLX HK8A"P$QX+IX+JHaL"mQ ,xN.&mP ."<N:+@ P S"m "XT"Q/ ,S&m (KJ"< XgN:(XQ&_|z kg kg kg kg kNqJzRn/C m X"RSg"P (" (X#@P`.BC* m PP""m N."mQ N.LNa(J  K"m ""qPN`>aP`6JgRzNuJ m "pP g$" m (pPS L$I""$Q``HKLY0]A"PX+I+|a NLNu m*"mБJ`jS f dZBAf dBG8vBA30HxlFDSBf QQJCgAV30HB`  3QG&kPoG:tf dQBARB3 gHSCf QQ3 HC`   AgBG4vf dQRCBB30Hf RQKs0`2  BBvBDf dvx@f RQDE HSA"Q`NuZ SP,^}eE+)KD`FA^ @ze@YB@Jq}9R@LZzC771h b$"(W[tQq\8橞{i 6g$ #f\5SsێZe%!̂fL ) R` Յ.+J\qZP" ݶ\a4k4s8G&KJ'\旋Ŷ 4 + W$x:3<?xѲ6hf\w9H]:9gNb0T3#xh03$jYFxJl .>rb^x a3Hwv&Ĥ./,X~εOOpFF Xh"85 2jlcr2q>V-sJŚ 2xޚxIfސ2"^dZYBfzZWmܹk^u5 xF/"M=H98iؠxf1ClL[ĩW"[)fPnNze35 qgCr[(/sX(/ $xp[Bl.2L\a\`.Hmٽ Fdej(k9OTK* 1(I tՆqJ9^S9L*e$EV#X7(!=}nf FS;2Hc7R2!'?,cw r*Heq5+n`ibZ'\z N X,6tLH*YZ[,T.7y,V#scڲ~. r+bΖyk.- 4A e4W|f:ku;Ls8|wTP:Y/湅Lj%Q "xBC da08B&RCvLflJ(\eA9B;.Xo aaO.Eqj9BgX6w&2xy"-JKCebg6DB` !`#RhTEr8#3Bgq`=:̖x`-bC/$2Nqpiƪ,>< Q/.$1u./a 3VM ZW_L^]40smg2m .A d`"Y~0U]6,/,x.7&lP ,_9>8=86"$Bi_w$Hb E6&LofڹBE\\kJJEMj(K<濺1[aמj3I_ճMn#EiK" y| HA|ndX;p9c /f@ ݝffJ .w{۲P`vnEeNb,1r& 3 BÆJ!- EPٌB A6 T4ݪFJ[ u-5B ˰646̜l:'K1fK]lf5[W-@c՜ cPM1X $[*|<7kn$ Bf Sf>bq:2+5|L_+ZT4aV@292@vQ41[@bB{\S4h͹͛0[=Y7̾vB0rm=8\Gp.JA7#V pBCJ`f$٭GJ@jK40CrqbAAf0C2+6/DhL6BAmQ4J p7 gQ6l~ +3#B"M$HBb8F"6HABdBFA8/ cU;},(T͟zˎuE$G,#4fL a+oӣ'?rn4E(8ڈunzB~="؊%,M,} Ul-8litlabpev:lkwv/ ocontactpcb)4 @cx ?g P-sg P-of By`V"#zBDRD  g ( fB(t(jp /N(Jg(j$<Fp NH,y 9R3"<N:#L"9z$<(jp NB69$9Jg/p (jN(jt"p NN~0<fNuH`"H$H2AB(QB0J3@L`(jp N$<f&<(jp HHNL$9z&SCNL$<l&< NNuFile <> not found. ,yCBNh#CBNh#:,@N#> @#BazJygh&e~hBJjembopg+@TTH,yCNh#:,yC'Nh#> y>#4B,y> yBN#F yF,y: <"<$<&<N yF,y: <"<$<&<N yF,y: <"<$<&<N yF,y: <"<$<&<N,y"y:Nb"y>NbLBNugraphics.libraryintuition.library<ptL ",2:@FPV\~ty this ij%zyxwvutsrj`BjimbopiN%@NNUBHzNVPO)@f ?<NTONZ)@f ?<NTO mf4Hzr m /(N POJ@fNtHz[ m /(NPOJ@fNHzeHzAN POHzaN XOHzyN XOBgNTON]Nuintuition.libraryonoff1;33mBorder0;3;31m Version %s1.1 05/870m by 4mTorsten Juergeleit0m 7;42mUsage : border [on] [off]0;40m NUJ/",]+Nd"N,yNbad &]Nu"N,yNbLwaJ&zNuHC,ypN"@AbE0$6#H6NbLNuHAopYa]\npC  KmenuponD FRANZ of ITALIAN BAD BOYS is proudly to present YOU THE BEST UTILITY DISK n.1 ( release date 20/7/1989 ) Write " 1 " For GMC v1.0 ( if troubles load from CLI ) Write " 2 " For GMC CONVERTER v2.0 Write " 3 " For GMC DOS-REPLAYER ( usage : 3 [filename] ) Write " Type 4 " For GMC INSTRUCTIONS Write " Type 5 " For GMC REPLAY ROUTINE v1.0 SourcqrmrhB+ puntatorepqmS zO>O(jdp N$"<I(l/ / g ,倲l"4(T`,2(jtp NJg2**p$A. J (F >09PROMPT start r҉"v$G" pP(j8NJfG" pP(j$NN"JfG$ !"$0vst,jqpotBPtypepso`,xOO(jdp N$"<I(l/ / g ,倲l"4(T`,2(jtp NJg2**p$A. J (F * it means that this guyz are in the special greetz! OK, OK, so.. go let'z go ...... accession -- evil a.c.e achim action force * australian crackers united [ACU] -- pirasoft * alcatraz |b}$\.infopu$>k2q?Y);D@)`HԻjT BAXmiOHqf3X+]IjX*,hdkY [o>v,ZT8c,pRc[}5@%9_qrk\_ĝDƗsgƋ&eHLf y+ZVP}h^+iD^`_j4wpfrSekkv͑[sd'AiGGm ntWi%(XIW(X fnwH#5Zt$Xcc1eLl[iv5Y,ttA)k;FZ%s]Al`,}: K38'>HDqv֩6mhZn/\ãXdt ؓlkbL8F0q&4A+WEagtжY=Xʎ{߈%UhbY)مt cLh ˤe;53m@8d^3X9里g~c ~T  Ye uH@|]-$WcUH )ꚈfXXy TTV1q5ieu@k- xU#Q+ c[ g2٫ih){~̸^Psv FEtX;X i($)Ul "X,;Y]iYx6Z[e Aۧ:\f02[el$D98u#ڤ/2'J6&& &PD*a-h酨9aH&4vbF&Jq؈t>k2q?Y);D@)`HԻjT BAXs#7p,(jNrҩ`")S#Ar#An8ґtԁr0(#A t nvl`r.p0(jNrҩ`p$(jNN%X4: %X2tidyup J\g"*\p (jNp (jNJ`g"*`p (jNp (jN"*xp (jNNNq$TN & H **BREAK typelinJdg$*hG|" p(j(Np(jN"tgrp(jNJgr p(jNrtgFN"p(jNr gt gv fRhrN%I5 typehexBr ҉#A$<hԉ#Bd#Bd%AlBtv%Cpr#A|tnZ" <INJf&&)$)|")el<, I NORWAY NORWAY I on:Amiga I on:Amiga ------------------------------------------------------------------------------- BAMBINO: I OXIGENE : MARCOSCANETTIERI I MARCOSAVINI RUACINCODEJULHO I Glauserweg 8 324 apt. 602 I 2543 Lengnau 22051 Rio De Janeiro I Suisse BRAZIL I on AewMmiga-64 I on 64 ------------------------------------------------------------------------------- I on:64-Amiga-VHS-Heavy Metal & disco I on:64-128-Amiga mix tapes-modem (2400) I ------------------------------------------------------------------------------- MR.NOBODY: I HACKER: LASSE HaeVAKER I POPPELVEIEN 13 POPPELVEIEN 10 I 8200 FAUSKE 8200 FAUSKE qc+0(#CDr#AHDn($&0(ցx08&*0ց8rҩH`NNqPROMPTParameters no good for PROMPT > $lBXjombopo\Le Write " 6 " For IFF2GEO ( converter IFF --> TRI-DI !!! ) Write " Type 7 " For IFF2GEO Docs Write " 8 " For BLITLAB v1.4 Write " Type 9.c " For BLITLAB v1.4 C-Source Write " Type 10 " For BLITLAB v1.4 Docs Write " 11 " For FILE BOOT BLOCK ( Nice utility !!! ) Write " Type 11.asm " For FILE BOOT BLOCK Asm-Source Write " Type 12 " For FILE BOOT BLOCK Docs Write " 13 " FspB}R(j$Nr%Ax <(jPN""0 <(jN%A\Jf0$G" $0( <(j(Nr%Ax <(jPN"*\ <(jN"JgZ"0 <(jN%A`Jf0$G" $0( <(j(Nr%Ax <(jPN"*` <(jNBd"Jg#pt#B`r`>r%Ad``r#A`V")ҩt0G" <(j(N`.")ҩt0" <(j,NtHgvNg`R")t0l~Jdg0Jg(G" <(j$Nr%Ax <(jPNJg <IN`r%Ah <(jN#Atgdsqq* <(jN <Ixd <IlN <(jPNR")dҩ|tԁ(rҩ|`&)t")d <IlNr <(jNJg*"*X <(jNG" <(j$N``F <(jPNN ***BREAK getbiteRp$*tpn&$<X"*lp(jN%AtJfrNBp"*lҪptԁr0($!(rNNqwrline Jg>x#D t"N#A$) rNV#At") NJf ")`rҩҩ#A$)&)$GD" p$(j(N")S#Ar#AnDґtԁr0($GL" p,(j(NrҩtNJf r p,(jNrҩ`#ir#Anr isr"o f SHJWpNucpNupNu o "ofNuNUH0$mBHzN PO)@XfL pN]Nu m "h$/)N XO(gRHzm D/(6N PO&@Jg4Hx/ N PO,g$ * E%h%FHxHz8N PO%@/N XO/,XN XOBX`icon.libraryWINDOW*NU/)mHm/- HzNO 8 lB0(N]NuNU lR- H|N]NuNUHm /-HzpNO N]NuNUH $m mf m(`Jm o mp0(` m0H(BmJm lDm JlD;|2- H NA\S2- H N(fJmgS- LN]NuNU"H0$m&mit8G Bm+m KRH8g|%fB-0;|;| ;|' KRH8|-fBm KRH8|0f;|0 KRH8|*f mT;P KRH8`2Bm`0- D|0;@ KRH80R@An0fԸ|.fZ KRH8|*f mT;P KRH8`2Bm`0- D|0;@ KRH80R@An0f;||lf KRH8;|`|hf KRH80H`x;|`;| `;|`;|?-Hm0?-/-NO +@0-Hѭ`Z mX+P/-N XO;@`J mT8A/+H`(cgSg gtYgUgriu2+EWgt`A0;H0-mo;mJmgh m -g "m +f. m0f&Sm mRH?NTO|f pL N]Nu`?-NTO|fp`Rm0-SmmnBm` mRH?NTO|fp`Rm mJg 0-mm0-mJmf(`?< NTO|fp`xRm0-Smmn`?NTO|fp`RRm` 0-`BHHBJjDRDJjD Da>JDgDLJNuHHBJjDRDJjDa `/a "JNu/a"JNuH0HAJAf HA64B@H@"H@20BAHAL NuHA&"BAHAH@B@tЀӁbR@QL Nu o Jf SNuNUHl?-i v%N\ON]NuNU/8-/- ?N0\O| f$ m ( Hg?NU/ A$HJ* gA삨ep$_N]Nu`BBB `NU/ $m?<NTO+@f5| м%@$_N]Nu5| %m* H?NTOJ@g* `NUH0$l`&R *P// NDPO$K fBL N]NuNU/ A)HB -P/NPO$@Jfp$_N]Nu$%m)J P`NUp0-/aXON]NuNUH0$l` mQg&J$R fpL N]Nu g&`)R *P// NPOp`NU/ 0-$@Jmm0-llJf9|p$_N]Nu0- l/0NXOJi x Ugp`p`NU/-NrXOJfN|9@pN]Nup`NUH 8-Np0$@JDm llJf9|pL0N]Nu0*|f 9|p`p0-//- /N8O *f N9@p` `NUHxBNPO+@ gJlf -N]NuNp`NUHxHzN/NO ?<N TON]Nu^C NUJg lN?-NTON]NuNU/0-H+@Jg(x` ?NTORDlm0,//,NPOJg lNJg /,N~XOJg /,NnXOJg /,N^XO,x.)g/ K N*_`B_NsJf0Jg(0,H//,NfPO0,R@Hi y //,NPPO`NN"o,lNb /,lNNL,lN:N"o,lN,lN|N"o /,lN. /,lN o,lN oL"/,lNDN,l"o /NL,lN"o,lNL,lNN o,lNLi zj,lXN o,lXN o,lXN oL,lNX o,lN8 oL,lN0123456789abcdef 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@ @@@@ i)/ 4,l"o /NL,lN"o,lNL,lNN o,lNLm|=pJPg0A0< XiQLNuHAJPf0`Ha,yN @C""!|C@pN,@C{" $<Ng"N`Fag@a" $<Nf5"J*< 0KP, KRUa~SU"zb#zb"N,yNbCpN"@#z6Nba aaLNC" $<Ng&I8$ &<(BQ"(Ng*"NNu" $<Ng"(&$N`AC$IJg2  fRH`Jg$  gSH ;g "g  g  g`BNuJg  f`RH "g`NuHK UdLNummg ڈ0-@fGn/ "KAa` "*$I faeK**4*pX*F**X[d*M*5*(*Z*k.**5***Kc*+++\++Kb++7+Z+Z)+k++5+++DSa+M+ +\+!+k+++Z+k+-++V++Ia+,E,4,f,v,Xa,,E,4,,Xe,M,,,f,$,rP,j`,9p,Xa,m,),V---A- -M[-h4-M-Xa-M-6-֢-X`--5--"-Z-IjPձ..р.X.h .5..T^T ..xb.A..L×X.>.rP-.4.`1/4//р/(X* /4 /5/j/~rP/5/F/Z/k5////!%00LRT#0m0tJ0h 0-0%000|00O[0h$011141121X+1i&1 1`1 1z1hG1111A11XjP22T2&rP2:D 2\A%2>2Xc2A2\2X2h2,2k*2M2% 23k3M3"$5*A0 33X3h,3`9fA3vJ33Ԡz3h+33I3ԠU3 44D4A 448FdԠjz5A 4T49A 4T*4M44 5A j,PJ5M54565ZlrԠ|5A *5Ԡ55rPT5Y5R6#5A" .jP6@HP5ALT 5 jPԠ5 6r2P<BԠNb5hAn jPԠ5A7`0<`)m)))@)Y#`))y)&)Z)CC)i )m))4))Y{)ho)))6)*CCd**** *Z*>K**4*pX*F**X[d*M*5*(*Z*k.**5***Kc*+++\++Kb++7+Z+Z)+k++5+++DSa+M+ +\+!+k+++Z+k+-++V++Ia+,E,4,f,v,Xa,,E,4,,Xe,M,,,f,$,rP,j`,9p,Xa,m,),V---A- -M[-h4-M-Xa-M-6-֢-X`--5--"-Z-IjPձ..р.X.h .5..T^T ..xb.A..i rN]NuNU/,?-N \ON]NuapCEf2<kt"Q)O,x)NH瀀.)gKN`B_NsC Nh)@f .<N`NPONudos.libraryINuNU/ Hy0,/NPO)@fBHyNjPO.lNu lBh l1|"l3| l ,ĐP)@ l MANXBNzXO$@Jg./- /-/ NO 9| lh lh `DHj\NXOHj\NdXO)@ lJ$g l"h$/NXXO/,/ NPO)l܂Nd l N l!@HxHz,NbPO l!@ /,?,N\OBgN TO$_N]Nu*NUH 0$m m (( Dir9} (&@HHЭ T9@B0,H/NbPO)@fL 0N]NuH? KR//,NDO Hz:HHЬ/NPO?-/ /,NDO Bl&l$KH:| g| g| g | g| fR`  mz "f.R KRH:g JR|"f "fR`B*```8 KRH:g&| g | g| g| g| g JR` JRBJEfSRl`ZBB0,R@H/N LPO)@fBl`z&l`0H l!/ NXOR@HRElm0H lB` L 2/ `WgRA`BQNu0<`0/ oJfSH"oS@WgB /Nu0<`0/ S@k ocga8ata"yNbBNu(jp N$<&<D(jp NBNuJf6B09"<,yN:# @09HCF0QNu,y"< < N:#,y"ypBAN"yN"y2"yBN("y>N.,ycV R:N,y _"hB0(N.ByNu#l <"<N:# @C&0<QK;| ;| #l;| Nu@9gzHAJPgh z2 P gR SGf0:TBA"zT Xf0T@z>ez6RA AeA&0z$zez0LFNSYLVP2graphics.libraryintuition.library *** Sylvia V2.00 *** Sylvia is the name of the most beautiful girl living on this planet. To have an illusion of her beauty this cOGprogram was written... Usage: Sylvia [-s] [[-off] or ] -s followed by a digit sets the speed for scrolling. -off switches Sylvia off.  is the name of a file including extended colors. Attention: Sylvia is now able to work together with Intuition-Screens. (no Guru now!!!)  (c) 1988 by Thomas Gerber         cI   9".fz(HX(08\bhv &her beauty this it+ 5Jd ?<NjTOBN:XO)@ l ( f l+hgHyHxDNPO+@gHyHx$NPO+@gz m -м!@ m -м!@A"m#H m!| m -!@(/-/-NPOHlN XO m+hHx$/-NPOHxD/-N|PO)|@ -N]Nuconsole.deviceNU l)hx ,\)@Hz/,NbPOJ@fdHzuHlNrPO lBx l"l,i>"V"X l"l#P l l/,NXOHx/,NPOBgNTON]NuBorder c NU lJxf.NXHyHxNhPO)@f ?<NTOHzi /,NPO ,\)@ l"h>,Q"l" lX"l" l!lx lB l"h>,QB l l/,NXOHzHlNLPO0< l"hH@B@H@H?HzHlNO HlHzrHlNO l"h.0),l"nH@B@H@H?HzFHlNO HlHz5HlNO BgNTON]NuBorder0y0x %d%su %d%st NU l0(HD+@ l0(HD+@/-/-/,NO l"h.0) H,l2.H+@ l"h.0)H,l2. H+@/-/-/,NO Hx NXON]NuNU)mHm/- HzNO L h]Zqq eyVvB| G40@L&H:b( D:0R(Q,RSNB@C.Z6 K&BA RASCf>ğS54\AccL{(JNZl| 03^R2* Pn@QZB"*Y.<4VxNukjDOS"RQ` Hvx.jQ;@h8Tn!?T 6@H|~" [ Svr ?Fy h7v&Ɖό2 @KzgSi8"ߖaHA3C셡q9:8cR |6<ֲZ9̖0<'BJ#g! $n2#X-֪Ex7[OT ѺHd):ہgN\ZDs07wq3j89ܳ) sMڬLj2 >!X!l&$l!y(27Â.8 (.,x%{ b@HR~ےo9:$){6f4`D`gܝDdxWʚ`] Re9LFNMp"0FlQ,PuTZQT.RnS0T(JU5PI V,HjWQ ڸX\YT !"`ަ 4xh|x m*mwf=x,0G:Qt y`Bgv p͉5JnIcW8vfoS<gY4y 4e8V[s2 w@ wz]`p 6;T;@K`J . `$GnL0!\S!hNn;lNj[jܷ:7]hVf grqdze=otLwY~2]J`u x7թ]Ks;4 LoVmISND1t7~ʇGJ3%@v*%K< \c2Jڇ9({p/lے$xӲb_[abXVQ#f Um6vEkӈ"'fJFEz*+IG 9NOg@<h K #KK`&Vfyɉmԉ^VT{нV?F8fo%s4!,ܓi.Z1"@ؿ-_ɊSny^ LTnEJ*&o2if͍rJ`vZu_rbBh;)bGwxj\!fg8@".gVx (agdX:Xg9s 87% nN< r|^t /ڌg`Zdɱ4۪sBآ!  gDgX]Ԣlep~CCg{DfփB̛2|͋:Z`swիN˸f074e\tW)My9goZDQtsE/. z` c kA H@`|![2 ̌8"9$}8ڒЁ,"`&o0*7. 2 6x"> BcFs,#9S8JLǠK< " b xVP"\p&)#a2pa"a#t~$Iwa`n h"{,npI-d&ڵXb'f f@Sw5qTt# X:qfu*=ǻ% Ch4{w 5(% j46f'pΩ4p1L;Fn-e7z\Z=&scdQ;^e%?۬ &^/:%BBCh7?(g0HaRB BfX&><`%EHF;eGA߶ 7^>J(6,iܹ"3KL1"$ e u$ #6 0`2pWg$jH(Fn2<Q9 z-WfɀlIa8)] x349#=x9abNug7phics.libraryB:&$?4m:--ױަhUfE T`sjLK Ztr`}n07̚ s`.Pgx.e @O0٩,Lq f*1N-qhbEMIifFL[G}FFX}79F4 HOWAN#T (CRSR|/3F5clAUR@M@6WIFea7 F`TVMF8޴@9xaFEP F2oFF Q_Xp#@Lfªx1S0/1/2/3)~Hqq01s2DF3n AxtDKI,jF/UM@.0btfM G -V1.3a|(CGMP]LF 2IfT`ɜLRWHf;!!T{uX"8MpUS:=-CYL.3f00LUANH =#YNC-IP ...+nL@NXjSOURCNSN'TS(L}NATD+K dPFCD.a`/OPLPLE!!W^T1BUFFHGAI??? (Y/NRORΑDRI(S) ywTHIS VERSION BGMRADxJWmZSHARE AND ENJOY OF SCOOPEX c8 .u ձ2 S2J 22pax9s y0DwNr_u"D"@Y?HZ$Hu D OX@trackdisk.device`zq5Tk--k&5F|ZJSbY)VZO`-F`m5k6 k;uTXh0͟5BYci--G;`|XSh@LeBԬ5XX{bLi_Xe pX[h 5^k ИXc 4UC{h 5b.XiMVCi ݰ`Fh5%5ZFKb5@֜XhZZk 5k58Yh 14>Hi*}4FZkquvk<m8kUYXXi հh Xc - 5 b  kq i 4 Ҕ XCe M } 4< ֮ X h4   K3 h 4@  Xb M 5 Q ke E М Yc v Z i3 m 5 V ! k7 p  k' a 8 Ys`  Lۈ]  Z Mc 5 G i  CSlM5,NK`fNiXf5ҐYhI04\`MXcl k*6&kk5мX3aj@qVk!k;-4vӲY3b5@PCf-ŲfYd& ZEi %4*ZS`Dh u2ҒYiXh!m5-=ft0km1&X#k9*Xd%4$M`M5Zd-5G`m5BY[i,5$Xh%L},J^Y` 5&JkKkhM7PXb5EYcM2kk8="k vEO3a1v5M )!ִ!Ye""5""f"Z="k"m"f"(""E"h"""V"Z#kg##4###Xc#i#-#Y#X##C{#A###Es#h##f##Y[#h#ɰ#F#葃# $^$Y3`$M$$&$&$$@$h$Ѱ$$$K$h%m%J b%%%%|%%k'%%5%f&Z&D&hN&&>&X&VrP9&&&&X[&i&M&=&&Q&k &=&& &k!&Ͱ&F& 'k4'''6''I'h?'͠'5''֠'YKg'-'Ѱ'''k=''''''kv'>+,y "< $<NJg<"Nab Wrong path or filename exists error !!! ` ,y "< $<N#<,y "9<$<6&<Jf # >Nu,y "< B$<N# TNu,y "9 TNNu W$Jf& ."9 >,y NCON:40/25/560/60/SPLAY V1.0 1988 THRUST INP>;(7UT-WINDOWRAW:253/0/334/21/C B,yN# ,y N# Nust-df0:df0:dos.librarytrackdisk.devicedf0:songs/df0:> Va3@#l8#*l39 f9f3@#8l33Nuv 9: |#@И#DИ#HИ#LИ#PИ#TИ#XИ#\И#`И#dИ#hИ#lИ#pИ#tИ#x |@B"pBX@ ݁0B,B8 yL}NuHaLNNuR4 4f B4`MJ.g*|a@MJ.g*|a,MJ.g*|aMJ.g*|a`JngB@.Jga` B@.a.Jg g g g g2 g, g& g g: g4 g. g( gBNuB@.n nqj=|q;nNuB@.n nXk=|X;nNuB@.Jgn n@k=|@;nNuB@.njBn;nNu 4g2 4g0 4g0 4g 4g > d4NuB.`B.`4.`HB2.A40PgT`;BNu yL&H $HX 90B2ҹ,#8By*|Ma*|Ma*|Ma*|Ma <Q <y3,| nf# 3,| nf# 3,| nf# 3,| nf# 3A 9,#, f$B,R0B09|"90fB0Nu,XB. JgbBC<(B-q(=sH=sH63HJCg"$.ԃ-B-B =s> 2MH=sH;n`$.ԃ-B =sH;nJVg$=V3*;n;V0.y0.Hn3JVg=V. f=nNuJ.fBn g> g8 g2 g2 g, g& g( g" g fnNu0.`0.H` 0.Hn@3Nu 99f09f&,yC Nh,@BA&"<2N`> "PNuintuition.librarySoundTracker V2c The Jungle CommandX(\:}hS@. xq  $TbxTbhx"(BRZ`:@jpvv|:@HR\f|>  & , 2 B H R p v  " ( 4 : F d j v   " @ P V    " ( 2 8 h n x ~ Z l r |:@FLT\dlt|$@JR\p>ե,HX^dp >DR`fnt~ q  $TbxTbhx"(BRZ`:@jpvv|:@HR\f|@ l (.:LPz  n @ F L R Z b j r z      " * F P X b v 2N^djv&DJXfltz&,yC Nh,@BA&"<2N`Nuintuition.librarySoundTracker V2cL ZH KCYtFrr(hjЪ0У,}[JC.h@RFA8 2I4"*IͲVZ #"E/I͡x*x7n-xOX*ҀU``UAm x.pL!AP!MTh~1BJi 3‚XbkflS@p`?D"z1Cb"2P2UUL82< f~7ΡH?(BGBB6(D,Y%JG2$HJ@gU|[wh@z^VYFu:dE(E̬d! (Hn@g2 b RUS77F|d,L0Fs"gŬ0H?/A<WAB"pBX@MJJ.g*|a*MdJ.g*|aM~J.g*|`NuJngB@.Jga` B@.a.Jg԰<g̰<gİ<g<g2<g,<g&<g <g:< g4< g.< g(< gBNuB@.n nqj=|q;nNuB@.n nXk=|X;nNuB@.Jgn n@k=|@;nNuB@.njBn;nNu g2 g0 g0 g g NuB.<R`B.`4.`HB2.A40PgT`;BNu y &H $HX 9B2ҹ#By*|M0a*|MJa*|Mda*|M~a <Q <y3,|~ nf# 3,|d nf# 3,|J nf# 3,|0 nf# 3 9#f6BRB09"9fBJ9 g  Nu,XB. JgdBC(-q =s@=s@63@JCg"$.ԃ-B-B < =s@=s@;n`$.ԃ-B =s@;nJVg$=V3*;n;V0.y0.Hn3JVg=V.<f=nNuJ.fBn<g\<gV< gP<gP<gJ< gD<gF<g@< g:<g< fnNu.gB Nu0.`0.H` 0.Hn@3NuX(\:< '}hS@. xqu$.8Ffz$4<BLX^j$08JP\p$4DNXp6 " Z ` f l t |    ( V n &Db< 4n*;n;V0.y0.Hn3JVg=V.<f=nNuJ.fBn<g\<gV< gP<gP<gJ< gD<gF<g@< g:<g< fnNu.gB Nu0.`0.H` 0.Hn@3NuX(\:>9m h2< $g9Q"|,yN> y "|@ 9 SQ< <"<,yN:J@f2a Not enough memory for infoblock !!! `6#a#.9HFa(J.f: |@(Qa Songfile not found. aa`aa,y 9."<N:Jf2af Not enough memory for songfile !!! `|#*a`9,y "<@$<N f |@(Q#2"$9*&9.N f4a I/O Error !!! Please check D>!isk. a`az"|6 y*#BB0<B"("ԁQ#v,y 9v"<N:J@f2a: Not enough memory for Instruments ! `2#zB8<9 f9f`a $y&|az&|JgRa9"<$<,y NJ@f |0l# aaa I/O Error ! Instrument ,y "9 >$<&<Na not available. Insert other Instrumentdisk and press RETURN. ,y "9>Cd >$<&&<N,y "9 >N9f``## ,y |6&"9$9zԹN f>aJ Readerror ! Please check instrumentdisk. a2a`6a |6 ѹ<<< |BQQ#z:0< |6"|"Q#*Laa* Write datablock to disk (y/n) ? ,y "9 >$< N4Jg,y "9 >$<&&<N 9y&f`| 9n&f,y "9 >$<&&<N,y "9 >N,y "<2N:a4>,< fJg`Nu,y "92NNu,y "9NNu"y,y <N.Nu,y"yz 9vN.Nu |@0Nu# Nu,y "9 >$< &<dNa$ Filename ? 0<c | BQ,y "9 >$< &<dN coBa Path too long error !!! ,y "9 >$< &<dN`| g | B0>\Fud pressing the RETURN-key. You can also exit the running program by pressing both mouse-buttons together. Datafileformat : The first 16 longwords contain the lenght of the instrumentfiles. If an instrument is not used by the soundtracker the longword, which belongs to the instrument, contains a 0_value. The 16th and last longword contains the lenght of the songdatafile. Then follows the first instrument...and so on. `,y | <"|"<ND f`B9 |6%Y<,"Q ( 1a$*/ ,"A* BFq*&aNA"aC@h  A h ]!A'j%@A@b&ՃPln h:Lp W?00\A4h$8.` lbD  s t@!x8dE9@(:BL@ —T@فA HHO`@A"@s@ևp5>.`$C A@vJz:8FaL+ Tt? `$}H0Cem`%`B,C$ &BZ!"hāXc0B-$D@DN"$e@\ BP<PD>pT06&ѫm0,b uKoe7@LA*CnGC]A;@BÅà #|"&"%m#!'0$^)uHegegegegecaeb  rV! e [_g7/@10~C xAB``*}Ip>*p}vN.HZBCp/@ ' "ELmL]ME*t&!H#!IJCOaI+IHAԥ`@@졵@P -R~ RzRk R {X<036pP0.`i\BPBAH`a `l`<4+F@h@@򃩩@ (ॠ6'\V`@((@p@2@ ; @ P b `݁ҋlQ@``PG/dhc`N P1&r%J@02 (/@bJ00@-1 d,/-bfj@ 9!@&xPn*@ `2D4 PP  0 @5` @- XSC@@&  Hx< B0HY@-` 0 :N@@( !*H R0P"  :" :W@!IHV@"`  (d~5 A ;O@@& P)@@@" aPM@ J((0d@&C 0 6( IR@+  (t" `0hT$*@$|FH,  SC@@'@CD@ @  * \: bNCJ@+ P 2( p !@-T@@%  xlQ `@!CcI@@/ !P`@$ p@TA@@O@#  #U@@#  H@@) ` 0(  8xBP` @~dB` A@ @P W@@ €8*6)\"@N@# A C@7$ EB@$ A0@O@Ap@[A@BX N P1&r%J@02 (/@bJ00@-1 d,/-bfj@ 9!@&xPn*@ `2D4 PP  0 @5` @- XSC@@&  Hx< B0HY@-` 0 :N@@( !*H R0P"  :" :W@!IHV@"`  (d~5 A ;O@@& P)@@@" aPM@ J((0d@&C 0 <1:  2< BTB6aJSJ Q> <9On3mjJfNu0<3fNu DNuSABBf DQNu  g ?g "|  gNL"|  gNhBBBBB99999 :e0 :e0 :e0 :e0 :e0҅҄҃҂#Nu,yCNh#"<$<,yN#"9,y$<P&< N"9,yN,y"yNbNudos.li:{brary&,:DR`rHX^t|,:DJV`flROVED BY THE BIG A OF PHENOMENA ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ USAGE: DeCrunch [Filename] [Locate At] [1=Jump Locate OR 0=No Jump] "*$I faea&aBNu9gHaLN,y"y  9 N.,yByA09Jg&"p y *2900N.y yfNuAqaaNuA>aaNuAaAaAaadaJaNuAava8aNuCJ9 g$J9 g#ST-031:<z7 "fJg  g  g -g "g`BNuBNu/,yN"$ BBJfNAaaNuAaaNu,y"yNbCouldn't allocate memory for song data - aborting Song not found - aborting I couldn't find this instrument: - aborted Couldn't allocate memory for instrument - aborting Unknown option - ignored Bad args Soundtracker Songplayer V1.00 1988 by MnemoTroN of SL Usage: Songplayer songname [-I] [-O] [-L] Options: -I forc<틱`es Songplayer to search the instruments on volume ST-01 -O Songplayer will play the specified song only once -L switches power LED off Please refer to the Songplayer.DOC file for further instructions. This program is Public Domain. If you have paid money for it - bad luck! dos.library6Ae7 a{R@&` 0tZuH@@/  pJ@.@   0 B'K6* 7@^@!@   `~[D@@/  p  \+ P4F@)@   $F@. K6 X9LLa^N3]@@$  |NY@*@  $@@S@& !zD=  E@' `]'p 8l3HM- M xVsDPj(54 x\pM6z<@@/ (PBzT% `PJ A<@F!+F V 90  | P@X@/  `, 3P@! P (RnR@ aHdq%LAD0@[@#B[I Z@@*  pT@d a8 t5IH  >  \@#` 0 F@@.  \@+@   `P  8C@* ` d62 d8`? <L2 86JlJX@"B`Yt^@"  @&  "F@@) !>hxd " <.GJ@vUL@@(  *E@(  @  Av"d`@/  0 `  TrIG@.  pXT! X=,<  02G@. @ ` /^@#` 0 X`@(  X@"B&TA0@_@# p 8c[@@" !Q@'@ xh @ C@q "v   O@!6Ӄ@RQ@) D  84R~@xtLF:  6 ( @p@TA @IN+  zmU@@$ !`d02phT"EA@,@W@/`  4*y\@@,   l PP*@4~hu @0 A'&e ~3"! 90$z?D$ yD0q! `[$WȔD! {/$4v(!4H0 a² x B >qᡟ@Ċ Ȑ)xd* )LHJdу;C6N0@^D05 | A:  EB[P$ k@\A| @*4%O䓈02X` ` %E /")!APXZH)`*AlJ ܪF(O<JTCvBN DC p-`x Y "Hy tF ERGf@['ANAG@À@ː =blzJ`\6\:ʸ0<SCY*gR#R4  ;E"[H2lt`$z8 B>!p2D& D5 3_^DSA,m{=hg0 *d0 &2D<0C)@@PWAp P&":"ATEkuX6$ү+3 8  9 ]?A%E   Ȑ7@">Bp?L"!IR :ex6 xApbA@ 6`wj Y4@8:r] #I9e?s!*1BЁୄP8( Dʸh:jI(D\ DHAG =JdF& "L̰G5  : %1uR" XB J@P |a 0aH)'9W1y%Y@rŽe5 5 %p@J #I԰6!vQ#2<<fnFv46tL̦,N.l^쮖 ?8E7d@- PhD  @! ,H D' X@At GB8(p  8@F/ ! (D p+`p9Y#x X$ p*4/E@$ P8pP@. Hp \D@@,.p#HRLFTp"@  0@N@/`@R@/@ X,/0pKp#8  h @#8Pp `@!@  X@<*A \@@& `A6"}0;@n A`K g !eO; B,\q| mL &>@@,A7b &p@`D=ZP@0@2P6BI@P)` M f,N!b!W DX! PVHZld PNCDBDh<@AIH $"J00!`D:  p@@`\(ÁChl`5dHbd*P `!(Fe@D@\0anS0W'D *gȘ(0/N Hh  Eɔ pn`P l `++DLOX(x1@nW <@¥U°C"&d>T4&6#[laET0@`6jE]^a\*,QpCa7(%$90*d0L< `|hfbWi <`"K^ Rla"jaD!ܠ @`$D z2K RNT( l $ `@X('l b,PDhm800V(`+x(Dd0&`r /&& jTA @7S#@@ǃr@K\%}فވ#tkP `0:M`P,(pa `IBJ.N_`rО]PT(.!X0EFPxa`HG0`&kA`@!A?TI" "s~P6$(Hg#CIi HHJ4( 466A"x2`HDD"6"rrYV@Q`0B' ؈T ( a@X A $*2~pTR, .…L rƒ p?aH/Ҳ&,6JRU}1A0D IPSA@*"@ r(*<0<(gJtওMQ pgе%;:@iG !} Ke9@OTru2r $ P !B ʊ@Z@WLeH!EE a3c@!~HjAD `Mw3F K %NhPI@f)x pPI 4.LPXpBM` Q(n+O_ }_9/ה9WvlB$F:x`AP,CQ@5aA`@<^J<$exI,p(!؊h"9:.@tl·B" PaD$U tIK`"A!(L(6a5zv0AQ1T $ ApHAaaDXFG*CSʕ vZgtLP%\"4;0aLCM$d#8 >A$%$'JJ `u9/玆NP@@Yx`u)(R2r @pSԨBLK0#|L<>Lu.A'8@~CTHl O ?u& DIK32}0Y d2DXp8F)@B RA CZa G xQ *:Jט4mB8t( 1W 7S"PBB@!LP ؀h "`и^=8Uq!O.\Z /AO? X!` HlbDH⥀[H00V($ r (K$anhFAPDD>ApNkR&NCb@@ָ6a֐r1ߞI0 N0d (@N U`D=@D(9;p 'CXR0 @E)j<?&& Lp8|.6P3?&f \ P}` "qgh?0X1ì16| A"&8AĀ:D0 Mi%@u`cSDp uVa j  È @I!@ h?`Jp2 yP֙K k)T4)h3x)86)3/hb6t֛l)08%`l)43 )h;X)80`)`0*`1B<)  1]@  P 01  r6Gq b4(}G !!_`<\! P HXC @% p*@N@%  @!SKzHAz&@G@) p _@@$ !tnN@*@  .  8l6 P$6X@ ChHhA? LM 8,jK@'Bht: !C@@ aQ4X@'B\S@. @ @_@"C(+S@@& P e@,  PXdA/N@- P0$D@@$(=N PHxK@. p0G@@! aG@@) P ()D@@(  p8H ' 6|AWiDBks!U+"Q)q ^ Я b A[( ?`@a:FQ( kDC3!@,)@+@y.)<I2$3E$JŠKE  30@@| N%VpjS`3R80B A`!bJDCFq!&c}@h +D@4RLyA¾>$"&p\ܫp:qU3d6`PEلh(!(`1 ` M:A X Y V`@E@MLA$hʁgD@ TAua9O(V' ـx`v @DDހ( vGKP P 'j&?@@rB@"؁7%O.6W XUAp(tS`ԐQhPJL+bpGJ#" "20 f$YD>@@pArB$iDK'b@aӔpd*Ő4 0 bI RcD4 < '$"J2-*L$ D x B;; A Eh|BA"4&(YR&З$:@9W"0Bl".a5aqPdar,  \ D  HV,$&'넦!M @„F=g:?&.ty\A Rf-|<B؊?D hxX,,3!j9W)[!ɡII^X2DKYDP6A脡@OqTru2r|RBD'DI%:yi2tIS# (8s    %CTIpM M@ $ =g쀀 P=`PL`@,Q ,<(s $ > 0@@1? Р@n*`J @XK  TP@dPI@0+4%At ]!@!U 89IB$ЀeS''{'R] A3P7! W ! N0\c@zm2DV !@q!K$ D|ANrBHmỈ BZŔ$6 `rh<(| xf?ITI v`0@(@! 7vs6δ(uL@TtQ"_`-C b;^VL 8PCyA*@(P4xX`U (2 :h636(1603fA@8@A@@ 1v8 s9:}rG"A&P\h\)pI*  4B L  *|ʀN`P(y@"Q&pG'_0J@^Ǩ( ("AP|0#T1y (2(&:(2:yBepC$ p h`@78"FD },0 lw `CPO!BTqruIL@at!GhRT>9. h0x#0fAPS@ԈA86xbμ M A (u.LānLC r"AeBp@Ą( ?n $hBT !@ȥ4-Cp,bG ɳj3@8 H Bܙ8B@AHYdl, .~1`LR0@Ô@9@tD"n)OEzDDb hlmð DPO'!PPC3S6#?Fpq(`˓ ;VM *.N?G S@hM@8hN@@>jD "(+4  $ 4%$5IXD0QPFj )|0 P`"8P@6 Fj'$%VN} "&"a"aJ`DAp Q@(@ 0P! @0r&D@1 0$ c* `@Ѐ@@`cx!!@` a`h@pk0 !lXV@!|+@ zJ\pdO@>82 .App6@=!=at+]A @QL 4DQ_Dt;IB& iTqru~e@Ĉ S86  HxP R %6V@T5ʄJA&2$>p@@0 ((DD JaiJ0A@Z 80 #$W3ÕpvHpjo䡓/J pxD{n&GdkJSFD 0;Fp0lD4yu@USWg`|*{"@ U2+ CX70`<P0C@A@!X`cXPhX0oPL  i!(K1 `ĄiJ<8YqP(ܫ\CЁ(TC0OS`ԐP`J0 a"  N6 ҕ)G-|* XO 0HTC0_x0m`x.  5qiTE?ru;2U! D$DDID`cAC8@*PTX8%$4@a <rQK:!H#TN P&Xa4@ D7BA#Jbõ:Ey@9W sPp@* !@ U,"8aB"Ac$ @0F@Uqsw$Pa"!*X&/dp$v 2RX),! zT'UY=l30W( SDz'|y~]`;oGÏ"A$P@gp(:L|A KLѬ8RKԝ cÀ`FN*3EiI҃1 {&s6F+%r0: Q&Pcm`$$q?!.0S8,'l353! f Al&p<.Z(x`#e%6e# q`) J` >"BKh!)AW C'VCtYCHECK EԔU*TPFHDI_$( ()+#T>HFy8 `$0G*a-̃3hY11 CPrA !BD_``s&:11 z4 ( 2K,,dKmH|FF&r C(Ѵ@1'328CfW&gW'&"q "JX ix(=3K1@lH`wJ !p| p< h5!GaĢR  VK`)0;$$X\ @p BT~ - F |$IHP $ (%B@ \B^Ӯ̢A!@A **G(BT$XPd8/\(%Ӆ'W*Mh E'8x#i&}Z4,?"@` JUl*B80 :@8$ Dfa@E!,4d`. #U* AH8 A͊Q hPXQNPP| P (( <`R$!x)!@ S?!‘*GόfPC!PGp )3Bf<@T f,`0NhT?0=P(x)~ub| `|HxyCÂ0p! Dw{~fĤ 6>f3!x[DPV1 !h@xla6 j 0 `p``Ch1a )?83'X3-?(8xog pv@X!Af0 0p،  9xbO(3pq (b`9&gfaf ͌*L 0^Al F#xLf B0l1Ip<O xgH.yxcÀ`FN*3EiI҃1 {&s6F+%r0: Q&Pcm`$$q?!.0S8,'l353! f Al&p<.Z(x`#e%6e# q`) J` >"BKh!)AW C ݽ>`PP0p  H( h X 8x~P0p  (( h 8 xx`! 0a `T $  HH1"BQd" &*P` a,58`7B Ơ @|qH~@  d@2@A"jd `{ Y(@ ơA@"d0x@‡( (01@@„P@0CQw 1  B V '/!`ATC@N (c 0  ( A@.`(Q ) |@P6x 2H@+0ph%PAA  SAa3Ӈb @0!@$OP@`0P@P"hT%(%DX @ʐ(|@f=Z@tLL~ktπC,  8>0> @@>b!dK@,z(]Ԁu@* @@d@  @1D@<@İP xmp"@_% >vA͸ @l( U9ڐ%w!p_`P=`zLB p|A\JCwR$L%/BB& `\!pz(,.B9Pڰ#P b T@`o` 0q-p %|-p@3h$ 25H(f(.@Gdh x ;3i h.`HyaIC҆?8.䊡#Ԅ R:*9d,$ћE :P$Kp8 8!H0D4s s8p`O3>fx|&db|b%Zl<=y %5"%m B f~I|x PTtN0?͈s݌0 ``0 e``jd+GӋF,\ p=rW! Y/@  @N2BDF l evir |r ?l (!8+Q߅@  @BApp``?Ђ@@Yڸ}8:fKC0p}щm'!f@xB@8IX@, 18`?pc> @ʐ(|@f=Z@tLL~ktπC,  8>0> @@>b!dK@,z(]Ԁu@* @@d@  @1D@<@İP xmp"@_% >6tM+H$m fane2rvfabeLrBDad6DrfaNQQ`8rx`ra@ m gra062<` 2< BTB6aSJ QmNu DNuSABB3f DQNu}0<@P> T"X0Pphـ ǀ@يa!hŠ@@@ `c8:@(E@'@`[C0@@ @4*!` XB4b &qTYdPҀh& ` j@< n@. ,4 &"t)+hf`"2 $Q xKї (E8 /!8pjED`bs>=bRb<k h  L6-Vh0 N@C 0A`/bpJ DalA^ e)Cp~H`*ɤ aU!E'?A=d b@HLCD\24v@PH jPB-b b2p@l9d0J dq`A`X"NS`TVHM@XPf X* '@/IA)@AaxI,p(!' &jNUC   =!2rauB$*D[KggѰ@Ҁp_H7)0Fh,4 @`: PT.`/J K!BaQ$A`*'H? CJ!a2<@}!A G@WHIEMǀS"@