-not a Macintosh disk- BLUV0.90 Twiggy Image LODq TF'O |||a2||a$&<tra |4(TB&raNJ(fNuJAgPBg/J8fBg`?<?/a:J_g(Glz|N |||pNSARB`NuNVH0. a |B( @ B AnB(| |݁g |B@("n2h_|a@A"n0<H"H "H"H" QLN^ _ NH2<S@o Ah:<` 2<A|:<6" @n2BDBB(`EB@nAJEk2<`BA4LNu Xc"A)-*S#e CNDISK READ ERROR MONUTILI2 -UTILITIES-#2  BYTEDIFF.OBJ  CHANGESEG.OBJ CHANGETRAP.OBJ CODESIZE.OBJ,DIFF.OBJ*,1 DUMPHEX.OBJ19 DUMPO.OBJ9\ DUMPOBJ.OBJ\l FILEDIV.OBJl{ FILEJOIN.OBJ{ FINDID.OBJ FINDWORD.OBJ GXREF.OBJ' LISATALK.OBJ'0 OBJDIFF.OBJ07 PATCH.OBJ7; SEGMAP.OBJ;@ SETSIZES.OBJ#@i STRIPPER.OBJii -SAMPLE_PGMS-2i ADESKACC.TEXTg BOXES.TEXTf BOXESR.TEXT2 EDIT.TEXT EDITR.TEXT) FILE.TEXT2)5 FILEASM.TEXT5? FILER.TEXT?S GROW.TEXTfSW GROWR.TEXTW} SOUNDLAB.TEXTf}SOUNDLABR.TEXT-MAC_FRAGMENTS-2DISKFORMAT.TEXT1 ZOOMRECT.TEXT--MAC--4"2 ADEDIT.RSRCo2BOOTCONFIG.RSRCFILEEXAMIN.RSRCFONTEDITOR.RSRC5FONTMOVER.RSRC5S ICONEDIT.RSRCSf MACTALK.RSRCf MACTERM.RSRC< PRINTER.RSRC RMOVER.RSRCZ -RAM_DISK-4"2  CHANGEQ.TEXTq  FIXSP.TEXTq RAMDEF.TEXTq# RAMDISK.TEXT#' RAMSTART.TEXTq'+ REMDEF.TEXTq+/STUFFBOOT.TEXTq//-SERIAL_DRIVER-2/ ASYNC.TEXT EXECUTE.TEXT! TASKASM.TEXT, TASKDEFS.TEXT, TASKIMPL.TEXT, PIPEDEFS.TEXT" PIPEIMPL.TEXT\ SERDEFS.TEXT\ SERIMPL.TEXT -EXEC_FILES-"2 BOXESX.TEXT EDITX.TEXT FILEX.TEXTf GROWX.TEXT SOUNDLABX.TEXTf MAKEMASTER.TEXTf DOIT.TEXT2adane e>erfiggg$g:initlen Ho ppe~r 2Dreroyt@Lj  &,028:AFPT`abnxz 0NRp@h HlB 1  < C @ F m-.04ST04I @<   $ - < ? _ c o t"_'t(C(M(n) *B+N+O+_, ,_,m- -P-n.. .m//-0000.0;1-1219234567881829A;@<?n*H=9EHJNPRSV&gC`X&gC`L&gC`>&gC'gC'gC'gC'gCA9:Uz?o(0R9}&^?~g8&~`:˃k|YnRIt`}wRGS@SESeWWY/[```$`8alamanapblche e:eSegenesewfffifogg gggBgegmgnhailitl ldlelilkllmmen nancngntoo oBomonorppepppur,s s!t t't-tetitotywS~ eIUMAN ZOBJIO [FILEIO \UTILITY ]GRAPHS ^TREES _REFS `PARTS aLISTS bMEMMAN cPASDEFS dMPASLIB eHH Fn"N":"X/Nњ*ObjIOLibdMPASLIB eMainProg "f  *O6*N6*3*M6*3*3<';*U6TSFZ&K*P6),^ *3\0 \5 i_Ԍ*E6CGZ&=l/8L#i_:*J6_Y&ӌ*H6*3B@>__I$⍵(oag(oh.[)*)4*76*)4*m1&2_Y&،*A6?G_I$_I$⍵(oag(oh.[)j'*3Z'ΌRDZ&Z- *6*6*3Z&I& _Ҍm&2*.6*3pp"crd~%QVb|}ւfݷn%]x}ƕezwsqnW%`{nktuvXyppp% +! 9%fratoȠutHOAP\~2@DHQRv\lr *JPXbnz@Fd'.R`f2.9 -*-COTNF@U .< - . B _ f n o t"&U'*'t(M(c(n)) +N+O+_, ,C,_,m-8-J-l....m////-/.192282: :'?C58C5=C5Bҥw 8 s:Vez0 K42~y5mO!mRȾcwƾ0 0*5\C5TC5B5QC5B5BH2G 2G!2GZXdW"!p1UdMIqqqq l?DY/jd- Na3!P  Na;$Na3%a;%Ѐa3%!$P$$p;]!$P![!p1A֕5.C5C5B!AF0ӕ5'C5BՕ5@C5"C5B5<C5BssLgt's s!ukztpxr}z~̵˪hvxzb̵˪^fput Ѽr^ŷiwith{r:rnsݫ_uny ssssssss&07,Jt+E)0fi2g;|g g=@=m?BFJNV ri  ryNs NV^ (s:t N^NuOteR@ - CRCumRFutRGRmS@ ISATE MZ\ RU@ SUn WVVW _ f g n oXT!\""`""`$al"0#-'t an arba** ce%&+m-e e)ed- KPR--egenbderh/ntz/-/0es000-2f eIUMAN ZOBJIO [FILEIO \UTILITY ]GRAPHS ^TREES _REFS `PARTS aLISTS bMEMMAN cPASDEFS dMPASLIB eHx(F"N""X/Nњ*ObjIOLibdMPASLIB eMainProg "[.gP8,`P,=|޿ԏTO ׉ "+"  "-" [P,P,P,Pl,,-g{H P,P,,-{  P,P,,-~{ PX,P,RINTOPT+M,M Љap s;@ssP~@8 O~nly+S,S%P~@ysm ExrnKȮef߈Qly+%,%$P~@ NQ-Sysm ExrnȮefsv+E,E% ? P~@thwoptiQlist-Ovions/ Vue DcriptiQ[K(n;~`:=4`9a4^`:_$߄4`˒|a|A̝ #o|p.PSHIFT [ԊKv&n(HC.pb<0prTACXFBחRYprTACXFBחRYpr?TACXFBחRYprTACXFBחRYpr?TACXFBחRYerTACXFBחRY`pPOECTOHEXJ1234056789ABCDEF[@K*2UkBF`H?>z`6M H2p.51JF2.RPf RE EҎo`N nok m ko ]m k>-k H̑ H/22bb HR H̑ H.!zpď.DDENA[򊴡K*2Ui+|`8&.5ҹJF.R`fL Fo‘&ECbb&".4Ұ̑&4` #Dpm+`J{:|`8&.5)JF.R`f F]o`> #oym:-mh}&h}&/*2bbh}&".Ұh}&pPODDSEGNA [K2Uf<2Uf`@9n0i &ƒDRA4SBE|0`5ҹF #o>ǹi &2.5ҹޟF Go nΆ>`@9n0i &ƒDRA4SBE|0`5F #o>ǹi &2.5ޟF Go nΆ.i &4̟i`je|O:7\g`Ne|O:7\`2e|O:7\`P$,`P,{ñML|.Wf0L|MM w_ /|f<.ҿgML| R=_JnoVP<,` M,׷JnpևEADNAME l'*ݳ?>нpe="puo) * *ݳ?>ll߽vio=* *ݛ?>llȽvio=*[K*Gg%1Zk^$LP ,LGL߂P ,Lk+o HLc{LP w,L H2N L H LP @,LLc,L#DpZjm\LP ,Lj+2ۄ& Lc{0LP ,L&N L& LP J,LLc,& 20?g"`.LP ,`LP,`LP,&Lc{`L& LPb,LLc,L#DZmmZiDLP,Li+&4Lc{L&ҺN LP,L&N L&4 LPF,LLc,L#DHLP,LZn%L1LM 2LMPMN N_ 2fLP,LGd1g :_tLP,LtLc{.LP|w,Lt LPZ,LLc,LZnmwLc{LP,Lw LP,LLc,LyLc{LP,Ly LP,LLc,LZlmnl &Lc{&LP0,Ll & LP,LLc,LSu uLc{LP,Lu LP,LLc,LSs sLc{nLPDw,Ls LP",LLc,LSuSs$gZuЭosLc{ LP,LuЭs LP,LLc,LGd xLc{LPZ,Lx LP8,LLc,LLpďUMMARY NoT^ Jp Table:ooTp^ G03: oT^ȫai=EIȍooT^ Data EIȍooLgestwapp"g:ooTt^Ȱwapp"g:ooT^Ȯid{t:oo T^ݕode:+Sizdiff!߈betwee=seGgmts and038ooswapp"Ridt o;@8oo;@appi>Ϙ8o Sh@~nsic G03:  8Intr"sic EIȍo EIoo U?Nao;o(8o Ext?nal oTablOvFlow)ExrnȰט8[K*BFB=k+`t H.̲zfZ[HH@VVfaLLa zLߑ H2N ,La  #oLpRIN,_NU؆+O +NB+_,,P,P,P,]̀]]gq-i{2PRPH,a{~G|VZq]$gWqq &|_ ECf< mq-|JAWgPPP,a{ 'G|Vfn`"LL| RW_7\-nP2P(,,{G|Vf}|Cbb0LL| XWn''S'mjkzsut-"- LGg,LPr,LLP8,LL q;@-rLr &/_ /,`oWr]dLFGWHĠ_@gW@دö Gg%1gR~e5:$r5 B$-g6$r5= BW- gL{Rz"N/bbGg6~LL LP,LL RLc{ѭtLN{"Zjm,nj &2-j.$- ԰F !Gg\L LP`,LLc,GgLP0,Gg%1g{N`Le5:$r7\WsuxjsuxTuxD'djj &!j & j &//bbj & 1Lc{~ѭuGLa LL L LP,g, `pLLc,LP,L`JLLc,LPt,LLLc,LP,,L --,`4P,r &N,ri rmDM{GL,L `2Pf,L|,P<,.m ,mCN]KODESIZE for outp. C нpe=*ݕнpe="pu): ! ShӨ@~nsic U?glIs) Intr&"sic (03) (03)o "ےrfacoo뉔뉔#Routine;@ Decimȏ HexCONSOLE :.(OPu) [.TEXT] =ONSOLE:)o.(Rid) [.TEXT]orQo.OBJ$Inpil[.OBJ]"orQo }(c) 1982ApplComp, Inc. 1 5-Sev-82CodeSizUtil(y Mo?tor)]]/_Gm``alʰGanatch//-/.00,d 0-0.e 2. eg : ener;_esfnf g <.g&==iA,.=@=n2=|iifilinio??blh?,n?-zleli?<"nn A@ncneBRng@A@AntBgCoonorApp@H pereH rrs HH GH@s.HhHmHnt tetiHz|~ITJJ@JG .0J_Jo0LLE_|+< N J   N -NNV EN^ F _NuONPO f iR@RA l m n o pRERFRG"""RSRTRlRnS@SASH'SOT (nTI* **WXT++- --...///eMPASLIB eH > #"N"#B"X/NњMPASLIB eMainProg "#|x!b?`<4>mb<0k|nAP2IDA0 <f|A|a;/o|PIF]1"%n!K@%' @!'IN "%n!o@%' @!'XW@XW>}XW>X߸ININ# (c) 1981, 1982 AppS Compur In"c. 14-Apr-83DD3TextE#disff+*cev}'gP!!WA!9!!bf!C0f!WX WD Gg4'\gP'!gP'0gP'N |o4TECO=NDINL'kispa C'tqZC:#L;isaE#( R> = C)) x|x!BGA罢c A6W,/cl^0gW`B gfSAck|?nAl0HD@0 <f62%2,A0BU|0@>,ablD7``=G'ENT!k'hnYBԞbnm"[cl6g0l _g"UAglg(YA44$l 4^V  Q '}gP'N'^gP' oWL'N'gP' oWL'N'QgP' oWL'N'gP'N gggê,gOW!n,'2gP' oWL'N gWgZ,'gP' oWL'N`xgWgZ,'gP' oWL'N`6'FgP'"[cWJ'N` ฺPS BadˆptGZaracr:NM cririMa:DisplayF-)CjxtF-)?PrFopjsM rMatch crit+iaAD sDisplay U^v᫧C sCofexU^v-OptGns)鳳MeFg ۳Cuu*Value.5hnYB'gP'JgP!'WA!9'bfw 'ʽ'pck|=?nA0HD@0 <f'! '.f(''WhnY1'W` .`2'߆ZgP''gP'=gP'N4V1NFID'can' beq^d. TheE#.TE.OTE(narme [.TEXT]}VoB!N$!~R8NIALIOldEeNewEe?1xʻ'hnYBeӞb?ҕ`"[mb< F6g I;/o@1ALN/ !'}gP'NBT1WA191 4 Tl ('d1 'dxg}21 o%zf:'>WJozf'oWL'N1WA19`r'gP'/<W!L'gP'NgP/<W!LrgPN 'oW!L'AgP'N1W(_V'AFIL kU^vrad U^{* ukk#th U^{* ukk#th ReadiaEe.x8.(!>7'%"'Dod-p %d20 n%e40n%$B60 n] 8`%d$p %e4.p%$B6.p ]8SF`Gm`%ðd:0 %d"l%e3 Ȯ%d1 %d:0 %d"l}%e3 %d1 SFGlDo ?I!/'l8 ޣ𸺽Oٳ޳}W?.!\OnOCS|x%&n1:.!n(Gn\0g@de43z tl dBs ` de43 tf d7 ``n(n dBs `dJt l dBt `d24 ݮd9} Gm.d24 DAd9 de44 t.``ήd9 ฺV'1d8(n'mW<` n'n:ElƸn'm=G!5`?5}V'ANIMPROxvBF!_gg_~  @1z d80 JD4'd20 DA>B.!dho:_!dx_H?"n!e/1"!Φ`fg!I?=_JnM^!$eh0g4!"dx_H?o"n!$e/1"!RD'd>0 .b42ͽCni=FV(IND>SEQ }x'@1`~!\Bp ;/oJTg!\1 (l`裭V%XTR>ACx!8.'\9 Gm`\Jt .`G^.FA$FSBB64 RCt08`ڼn(l ?BE`E\Bt ;noF`EEMOVESM'hnY1W` g2'RgP'gP'$gP'NV'Nͽ'can'beq^d. TheE#x&n1>.(7'!l(\l'\K0g 5 Ծl=(m5'F}6 l'm5(6 !\Ųp f4B.560Gl(!2GAO4FRBp08``Z!\Jp g5!\20 F6W`.560G.l(!2GŞAJp08`|V'E}BLOCx>.(7'!1Hkr @!nCjH0;N^x `2Jf5hgPwML=WJsMLN wgPN ꀿgPwML=WJsMLgP1~RgPlgPN rJgPwML=WJsMLgP1gPQgPN gPwML=WJsML`gP1gP,gPN TgPwML=WJsMLgPN`.߆`gPN`(gPNV%ITLE =:::= nd\3fiSv::::%=:::= B&Fnia3fiSv::::' SpurGus M JACK  * ~ Replacem*U^s:Z+o+ jly ++ InsertedȁF-)F++ jly-t DeSU^s:|Z-**(gPNV%REIx1hnY'h՗nYzժ݆W[hnYՆƁW[hnYb\.cF\0NgP[mb @~6.`[՟ b @6.`[mb[բ c@gB`b^.>cF^gB'E5ฺV'ERIFY**1>.'lgD@?!0?(`>y%KB(`0ydKB(`"yKB(`y'KB( B(\ODIGжx!BEnBFgM(!b~9_gM'!P9_xl(ld'4gHI!ޥߞHg4\ܳ4 dtg!HI!Bn?@㉕ TWA9̀WA9gƁ!dgVtVm_0gg! "ml*"2T[G["KnY7ER7F^`XRmHI!HI!Ѩ!HI!ҁƨ!~BnC/itggHI!N t3gHI!~HI!n`BtgWJ"mf.oMLxgPN`@oAzf,oMLN$gPC/i gHI! ~tfHI!`.@ȕ`2T[G/ g!;/og"E?I! .fHI!`HI!~@߅ 쀝WA9;m$Gm=gƨ! fgP>WJ"mf._oMLgPN`@oAzf,oMLNJgPC/i. XJg.!HI!dHI!TgHI!Fp p <|䀿NNgP1gPQgP1~RgPNN1򺀭1~RBmN`gPNJmigP oW!LgPNgP moW!LXgP oW!L>WJNNNV'Eٳ commmoZU^vFsteaof#Thus,mibghbeossibl#toF# spurGus- (du#to hashia).* NOTE Ther w+#End3difff+*ce{ DDfer]- bet:we*E-)'0'!m+n'DDTOAVAxBFɐ/>-o&fɐd(p Tg&l/ (K4`SG`֣AhVECS'gP'NOO@θAKbhnpz~ (.BHRX\^d,hr: .FF 8C B C  - . D F G m n- 0ESI@O<   ( - 1 A B C D H I N _ n o t"(#M't(M) ,_- -8-A...T////-/[0-0.00011,19222.234567880828998::];@;F;G;|<< eIUMAN ZOBJIO [FILEIO \UTILITY ]GRAPHS ^TREES _REFS `PARTS aLISTS bMEMMAN cPASDEFS dMPASLIB eH(F "N""X/Nњ*ObjIOLibdMPASLIB eMainProg " %Jme}m*e}*-LEA?RSCRd%Hp!s^//gz`z nEC BF 05jt=Btm* 27i38t49y:=`.{27<{38B{49|:Bhm  ;=L{;Bfmi=LKK ES@iv/-z *-OkNFIGURd%IB`D kH?s]|Dg,.e}`,e}Reo Z*TO$2^CHARS d%J,  M,6?o)de}, =jo,se} `8,6?o)de},se}=ja,*-EADER%H>.ll{kkHk=AHE=@I,I h, eIM,m.cAd h,se}=>IkIaQG,te}eI`m.c?0d#=>IkIo,te},nd[X g][EOFCܼtart[X g][0CܫUr[qt.Rp`ddnpwo Qu\ܯUroutpwϬRp`TEXT1@!wqt [C1@!EXT]C)ʹpple͟omqter,ncߧugC6exadecimalumAnon\orABCDEF  bR&b"0dNqNHzBgNN?<NNMainProg d҅*NVAC Jn ]D@0. jD@=@ =|`@0.??<?<N2. HHA?Bg?<N0. H=@ Sn nl.g.H|?Bg?<N@pn=@`D/- 0.??<?<Np6H|??<?<NX6@?<N Rn noN^ _XN0123456789ABCDEFNV n l n0.`H n l n0^ npr@n `& n l n0 np ` n0.N^ _\NNV mn&0-?Bg?<NA0A=ARm`RRmHmHm?<?-N| _g/- Hz2BgN T/- N NpA0A=A;|N^NuNextByte, Blockread FailedNVBgNT;_0<HBgN>2LA;@0<HBgN 2LA=@N^NuN&NU.BN"+_0/- HzBgN/-Hm?< N 0/-N -@J@f`HmHm?/- N mf` myW mYWg;|;m.`0-HH@ @fF/- 0-H/?<NF/- p,?<N/- 0-H/?<N"/- HzjBgNBgN;_?-?<N?-Hm~NHmHm~Hm4?<N8A4?< NCp"S@n20-HH@J@f/- p ?<N8/- HmBgNF/- NB-?<N g/-NB@;@ mf`^0-mm @oJ0-mmHmHmHm?<?-N _g/- HzFBgN/- N~`0-mmHH@;@``/- p ?<NfRm0-m.oT0-HH@J@g?@@/HFALSETRUE"_ _p / NNuHBHz /?<NN0LNuH瀀 o N@ o/H LTNu$_ _HHz /?<NNLN$_46"_ _J(fBNJ(f8 g gSBnN8Bgܒ4N0`ҶBgRBSIxN ` SBlNpN$p NpNSDjNu$_4"_ _/ $IBJ(fN&J(f g gRSBnNuBDgBDN`JgSRBSxN`H o@BBFBN g +g -fSRFN g> gJRF0m nHH& HC ԃԀ`JgD/B@LNuJFg(N*BFBGB`JFgxNSFg&HBH„ HCHB6HC 4`~H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuH oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuH o0/2/SA"o BBA@m`S@j/o L NuB`$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoN$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuNu"0writeln(output,'Skip, Blockread Failed0JoH00 0$&Ƞ DL0< E(*e02,ed2L <>@BDLo2;.MO0?PegelMPerUes^?NNhN?ntNzffNT< ?gNV N^? ? ?,gildinio .it?.iz @ NuOCkP MP ?<@AA _POlR hADlememo i knBA nBLSBgU"Cnntoc"iodRTompp"nS p $_&kS@r&n(k(ls SeDBset Si(nT DU6umze~NE Un-H\VA.EGVEW.L`EXU.W`HH`HH Hh/Hka amHl// anHm/ arat//c HnHz/( I/+ck (/,IN .ddJ /-/. @0 eIUMAN ZOBJIO [FILEIO \UTILITY ]GRAPHS ^TREES _REFS `PARTS aLISTS bMEMMAN cPASDEFS dMPASLIB e`4t ^"2G:$N"N"<:M8L6KHtBBBB@#9j  T $ V8Yetr&e5bBTSTbBC8HGbBCLRbBSETghcgaaV|?#DvZ\bz%aYR@'Jja"ɆHbDv$\bDv*_1H\e r&0e5bORI 646f> F5f8YfbANDI`bSUBI66X?DY'\bkDI^`bbv^b~uEORIbbntCMPI`\bZ%.Bɭ861v\b8%?Db61b\b %` w%bCCi\bNEG `Yf b%lbuSR\bNO`Ye nr&e5bNBCD$JE=bSWAPD\bPEA JE{UNLKDd\b*%DPɽbUSa\b%bUSaD\e r&e5bRE?SE\bNO>a\bSTOPbbvt\b\\b\btTRAPV \bdi\YffYEy@#9,8!(\48lbbF bHIbLSbؙCCb̙CSbNEbEQbVCbVSbPLbMIbxGEblLTb`GTbTLEɮ4bbv\YE}@#94LXdp|bSTbsSFbSHI bSLbSCC bSC8bSNbSEQ bSVC bSV8bSPbxSMI blSGb`SLJ@fP@'ȷDYEz@#9,8!(\48lbBRA bBSibBHbtJofa.`U`b.S4v ` J_Esb fyb( >Bq0s@b( >v ` J_og88v ;v ;Lv ; 7sBsoEsV}DBmBm~Hf3PENFI8'for Pput. Cω't open .OBJInput fNe [.!OBJ] -C*Fo+hs FHfg3EXTt]*F mZV 7 mZV?-~ ;;m~H\NDE?J*FTm~H\ARG*FUm~H\A{RGOUF=m~Bm~2p;n~H\M|ARGIN FX/syxq$Y>? m(o2 mZVۆv ;m.Hfg3LSTRINGfFfsz Vs Vg6xlb d@b( >2>`,fb df@b( >2Hf3FIELDJ:cCXCGRFR/syxqsyxxTb &` 2SA*Cr6pdT&RoۆT2.Hf3NAMESTR\Fsyxqdbb۰ nۆ۰2Hf3LON>GI?\Fsyxqdvb nۆ۰2:Hf3I?ERXFXsyxq(mZ+E/2PVv ;VH/>b 4VA,b bVH/7b 4VA]b bm `,ۆXb dX@b( >2_Hfg3IFARTY/:X[*Fpps20s2s2r s2:H\MODULENC S)m{Nam MuleN˖*F}o_:s20 s/s2pH\ENDt]CEndBl|^*Fps2ܾjs2~Ns2x6s22:H\E?RYg L|rNLPkN[ E{ryPoPtK*F}oG7s2Ts28ȯs2A?"KPBB|:H\EXTERNA"rNLlPkNxt-na]l Ref*Fp(s2zs2 s2:H\uTAkG StartAddr/s *F}o_:s2 s/s2@H\CODEBLOA CeBlo-*Fs2H\REL]AT R+|Qz*F}o_s2l ss2&H\COM;%NR CnnN˵CnnR+|Qz*FpZs2}s2 s2,:H\COM%ND D CnnNCnnDefPSQz*F}oG7s2fTs2$8s2A"KPBB|:H\uHO rNLPkNShortExternal Ref*Fp\s2 s2 s2:H\QUICKLODCaSUStart" Qui"ad*Fpvs2D0s2!s2tܿ s2`:H\OLD>ECDaSUJTSUJTLaddr OldExecutabl*Fps2s2_s2s2fs2Fs2 s2:H\PHYSICAJ StkgD+taP JTS)DeltMai$nSUDaSUJTSUJTLaddr PhysicalExe*FpHs20دs2_s2s2s2s2_s2|s2n0s2Z s2F s22:H\EXECUTAlMaxHeapMPHeapMaxStac^D@ynStac^ StkgDH+ta JTS)DeltɑMainSUDaSXUJTSUJTL3addr Executabl*Fps20_s2tܿs2`;s2L0s28 s2$ܿ s2:H\VER>SIONR/-v3R4/-v2R/-v1m3axSymPSysTys\m V-sionCtrl*F}o_s2@ s?s2H\uME? ngments S)m{Tabl*FpXs2?s2p Ls2\:H\wNITTABmaxunSnS UnitTabl*F}o_s2X s?s2H\uLOCA ngmSents S)"cation*F}o_s2 s?s2}H\wNITL]nS UnitL|Qz*F}o_s2 s?s2"H\FIL;EStnFil FfN/Bl|^*FpTs2&s2j s2V:H\PACKEDCCA Pac6kedC*F}o_s2 s/s2H\PwACKTAB PackV-sion PackTabl*Fps2Bԯs2s2r~s2^`s2J s26 Ls2x:H\LIB%!NrMTex3tSUTextACeAMڪ MuleN LeibModul*Fpvs2H\s2 Ls2 s2d:H\LIBENTR AressMulELPkNLib5Entry*Fps2s2hs2s2d_s2!s2 Ls2:H\wNITBLOHniCtTyp GlobalSUTextSUTex1tACeAֹnitN UnitBlo*F}o_s2H\I?ERFL IK{-fL|*Fps2hjs2&Ps22s2ܿs2ps2\s2Hs24J?gd s2;s20,s2} s2 4s2D:H\DEBUGSY|MapNamMapTopMapBaHoleTopHoleBassSUProcNProcStmtProcSymP@rocBasS)NamrN ebug;Symbol*Fp;s2`s2v!s2 s2:H\DEBUGENE{ry"E{ryErN DebugEntry*Fp0s2!s2 s2D:H\DEBUGCO" CnnBasnitN DebugCo mmon*Fs2H\EOFMARKEOF!_M^*Fs2nH\wNKNOWN UGnknown_Blo*FsjB($^hz`H0;9JxT04r|&.6>FN2`2z ׭2з2t222طZ22fk222222|Z2p`~2r`v32j`n2`f32`^2`V32`N2`F32R`>2`632$`.2\`&32`2`32 2J2BHf\O3.,:F8_ + f lMJ ^E 7v ;b 4v ;M{veKqepKq  ,=sjj,HN&$Mgs2'k|MsJP^.MEvs?T B> =@R0.=@XTs2ܾs2s2(ۆb &-|>X' =nT8|nRz j@Ts2BE``vd? r8 \ ~_gp=|.۰ۆb d@b( >yxqREo`s2dRFin8oR۰;:b d:@b( >yxq۰0.V@' &d@b( >s2sPH߫Hf3H,'JJJJJJJJJJJJJJJ JJG: ]Variϛsuppress .ccWW variϛbyctes [N]?CD*FsƟb2H\NOVARIA*FAȋ Os2jgӷ2xR::H\REF?RIG*FAȋ O!?+s2Tg̭0+2R<:H\uHOREG*FAȋ O?+s2R:H\MODRIGF&lnJ ^E 7v ;b 4^v ;۠۟veJKqeKq f s,HN$gs2&)l|鹠$g|s2s2R}~ ,l@ۣ @>. G 'fs2$`>JGg mZVb bR`s2Vs2H\CuOMME?; Commen ts via{ suppr/d.ccWW commenbytes [N]?CDFEB-d +L+@ X\db ^BdRe ͫN 8\]2۞b2$gۥs2^`>~s2:}lZ8Ub d8@b( >yxq۬b &_d@b( >s2d_@b( >yxq۬ .>JGg4-g.A۬۬b } .' &ܽ۬b d@b( >yxqd@b( >s20b2`s2'kH\OBJ;ECTC6 Variϛsuppress.GGG;JJJCGJJJJG*FsƟb22H\PwROCHEAF nm$@gl[@ghgs2ޤܿs2<ܾs2,ܾs2ܾhs2 ܾNs2s2Dܾ(s2ܾs2ܾs2޼ܾs2ެܾs2ޜܾs2ތܾs2|ܾrs2lܾXs2\=n>s2ݜ.?s2 $@wE[@EgSAۍ Op ѫs2߄ܾs2ܾTs2߶s2ݸTs2ߒts2ݔbs2Aۍ Oѫ2s2Ws2_s2._s2޲}s2 }s2ގs2s2js2vWs2F\_s2ܞJ_s2"4s2RGino!Hfg3uTAtGG JCGXCGGGXCGXCGGG[JGXCG JJJJCGGRerv_ActiveListŃRefCou{RetA瘏`em"Cowde FNeL| Ar1 E`em"ŮpaڢPa ogmentA E2F2=|G_ۍ jTTs24T.2$@E[@EgjTۍ js2ZTs2Ts26_s2 +\hA Os2s2(s2ڀ\dvbۨ nۨs2ںBs2D0s2ȷ`s2xs2\2 Ls2L2s2xXs2(rs2 +r"OЁhA Os24s2s2pp ѫs2s2Fdvbۨ nۨs2لd_vbۨ nۨs2\s2vTs2s2ؒs2زs2Z:Hf\O3JUMPTAB S) S@waInfo and Loader.image:CG `JC[JG:&J_"c R+Offset NOOaJU, *+ PCR+CDmy D/criptoTraHaHndlr:CG[J:zJ"c JUMP.  AbsAddrCPro!cedure D/criptorsS)m{*F.&lWvWgL2 ,l6S , o*9|` ,9@̟b2``.pqf̟b2`̟b2Hf\Ok3wNKNOWN*Fs2JDs2(s2s2s2ֲ +hs2}sjjAȋ ORIs2vs2T~Ls2.fs20Ts2״ܿs2 ܿs2אD:H\uRIGXCGXCG[JGVersQn2VersQn1 gNbeԘgN*Fs2s2vs2fs2V ,his2ԖsjjA̋ ORG쌯~s24s2V?+s2s2?+s2֮h:H\wNITVARG JCG[JGŮSTypeڮS\mb-ŮSNa{m*Fs2Ӵܿs2Lܾs2< ,?lhs2~sjjA̋ ORG(s2:s2s2d`?:H\I?FL_]G[JG In?terf"ŮSNa|m*Fs2ܿXs2lܾhDs2hs2sjjA ȋ ORIԵs2p_s2N_Ls2(s2*}'s2~s2l׽'s2(s2s2^ s2϶:H\wNITL]\XCGXCG JJCG JJCG[JGDataŮSTypeFil\mbi-ڮS\mb-߮SNam*Fs2vAsƋ Osߌ ?s2 s2t:H\FILESNeA FNeNbeFZB -_J o$2$2$g&g2g>gJgV]@*gbW@gngxW@EH2Juj2:uP2*u42w2 u2w2w`|2`n:o߄oWoWMv2͘`*o|fJ2zu` *2lB:RhR o=|` R=@Z$^_zH0;9 .6FNV0fD7v~2`r2f`j2B`b2f`Z2`R2f`J2"`B2Df`:2`22f`*2b`"2f`2`o(2]2&ORg Hf3.,RIUnknown_Via{:P FN/ Tabl: J&Table:C Pro#cHeap: ObjectCe: FN/Varit:L Cm{s: MVaNrit: ShortRef: RefVarit: NoVia{:*F+g:ׯ22˜p@b( >2ˆ2|׵2B+k|nelIDA0 BsM2~`2pׯ22Hfg3.,%*FsM2 `2Hfg3KIP%*Fs220s(>2H\.,AL}all objeccodeF 7v ;sbv 8v ;ۣۤveKqe}Kq ߣs2Um~Hfg3IST%Fԥ , 8}ۈsj2öۈsj2(_Hfg3EEK%yFsyxxB fB.`>dp"L6Vȡc`(dp"L Vȡc`2|gHf3IND%FB2F,׳220 7|v ;۞b , pr6 A?f ゞ2pr6' A?gpr6k8b e"pKqb H_@n0HD@W7 <ߵD Ev2 E`0Aw v2SACr6p? 62# Rov۞20? g6`vv ;۞bv 84v ; 7E24H\.,PARnofound.M ule Mule to d- (?0 for list)Cpՠticular object cFWB -_ 7jv ;ۗ  nfG n f=|SvT 6=_0.k|_ne$BIDA0 ERROR ---> FATAL ERROR JoNVH(n0. jD@H*Jn lx`x|~//NJgRF/p /N.`SF/p /N.HH FS@=@=D`0k|nA2IDA0 <g/- HzzBgN"0k|nAf2IDA0 <f0k|nA82IDA0 <WD@.N^NuESNO 6@@Y/N:@@JoNV/N>JGgB/- HzfBgNx/- H/?<N/- Hz.BgNZ/- N/-NN .N^NuIOCHK & RETURN to exit program: IOerror # JoNV/Nt>JGWD@ JGgX/- HzBgN/- H/?<NB/- HzZBgN/- /.BgN/- NT/- Hz"BgN/-N$.N^.NuOCHECK *RETURN to continue: opening IOerror # JobNVb nCJp"S@n2-gAC 0` AC 0/- HnBgN/-HmP?<PN@/-NHmPHzRNrgNZ-P@BAAP0 A.fHmP-P@??<NRB-HnHzN*gDHmPHmHn ?<NA ?<PN Cp"S@n2/. Hm?`?-HmNHmPHzHmHmHnb?<NAb?<PN Cp"S@n2/- N/- HzPBgN/- HmBgN/- N/. Hm?N J_g6N ;_/- Hz6BgN/- 0-H/?<Nl/- N NlN^NuRITELOO\ IORESULT of ,Ran out of room writing one of the new filesWriting to Destination at JoNV/-?<N /- HzBgN dBgNgBm/- N /- HzBgN >BgNg/- N /- HzBgN /- HmBgN /- N /-Hm?NN^NuHECKANO@bye! Starting !Have you inserted the next disk? Another disk?NNV,_NUzN+O+NBN @+_|Hm?<@NHm?<@N;||Hm?<PNHm?<PNHm?<BgN`/- N p/- HzBgN /- N Z/- HzPBgN /- N D/- Hz.BgN /- N ./- N &/- HzBgN rBgN_/- N /- N /- HzBgN J/- N /- Hz"BgN 4/- N /- HzBgN /- N /- N ;|/-HzN/-HzNBmBm/- HzhBgN /- 0-H/?<N 6/- N d/-/-?<?-Np;_N BmJmoN/- HzBgN /- 0-H/?<N /- N /-/-?-?-N0mfN/- HzBgN 8/- 0-H/?<N /- N /-/-?-?-N0mg Hz2<NNX/- HzBgN 0<S@;@zBm`d m0-A?BA0 m0-A?BB0Ag6HzBgNN/- N :/- HzBgN BgN"gBm`:``Rmi 0-mzo/- HzFBgN R/- N` Hz<N0-m0-m0-mp| mnN~pmn;| `;|/- HzBgN/- 0-H/?<N D/- Nr/-/-?-?-N~;_N`/-BgNN/-?<NN.m,m -|/NNN]N0NuN^NuILEDIV Reading from Source at ,Can't reread what I just wrote in a new file OK!Retry the transfer?#One of the new files doesn't verify VerifyingRereading sourceRereading from Source at Rereading from Destination at Reading from Source at Outfile name: Infile name:"I will add no suffix in that case.Gon the file names. I will add the endings unless the file ends in '.';IWhen entering file names, put no '.text', '.obj', '.1.text', etc. endingsIs this a .TEXT file? Y/N? .OBJ file.Aevery subfile. If it is not a .TEXT file, I will assume it is an>If this is a .TEXT file, I will put nulls at the first page inNV,_H0/2/4/@l // ?<\NN@o // ?<\NNL/W\NuN^Nu%_RCHCK NV,_H/H4/@l // ?<`NNL/WXNuN^Nu%_SRCHK NV,_NuN^Nu%_BEGIN NV,_NuN^Nu%_END NV,_H瀀 |0< BXQLNuN^Nu%_INIT NV,_"_0 _/ HdR@H>Hz /??<$NNL|NuN^Nu%_NEW NV,_"_ _/ H>Hz /?<(NNL|NuN^Nu%_MARK NV,_"_ _/ H>Hz /?<,NNL|NuN^Nu%_RELSE NV,_BHHz?<0NN /o@?@@/H`ҶBgRBSIxN.` SBl(NN^Nu%R_PAOC pNdp N^pNXSDjNuNV,_$_4"_ _/ /$IBJ(fNJ(f g gRSBn(NuBDgBDN`JgSRBSxN`N^Nu%R_STR NV,_H o@BBFBN~ g +g -fSRFNd g> gJRF0m nHH& HC ԃԀ`JgD/B@LNuJFg(NBFBGB`JFgxNSFg&HBH„ HCHB6HC 4`~N^Nu%R_I NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_NuN^Nu%_TERM  at Rereading from Destination at Reading from Source at Outfile name: Infile name:"I will add no suffix in that case.Gon the file names. I will add the endings unless the file ends in '.';IWhen entering file names, put no '.text', '.obj', '.1.text', etc. endingsIs this a .TEXT file? Y/N? .OBJ file.Aevery subfile. If it is not a .TEXT file, I will assume it is an>If this is a .TEXT file, I will put nulls at the nR &n0ZNqNHzBgNN?<NNMainProg ZJoNV n CJp"S@n2.g&/- HzBgN/- HnBgN /- N`$/- HzfBgN/- HnBgN/- N/- Hz.BgN/-NR.gN N^ _\ONRROR 2RETURN to continue: ---> ERROR ---> FATAL ERROR JoNVH(n0. jD@H*Jn lx`x|~//NJgRF/p /N.`SF/p /N.HH FS@=@=D`0k|nA2IDA0 <g/- HzzBgN0k|nAf2IDA0 <f0k|nA82IDA0 <WD@.N^NuESNO 6@@Y/N:@@JoNV/N>JGgB/- HzfBgNp/- H/?<N/- Hz.BgNR/- N/-NND.N^NuIOCHK & RETURN to exit program: IOerror # JoNV/Nl>JGWD@ JGgX/- HzBgN/- H/?<N:/- HzZBgN/- /.BgN/- NL/- Hz"BgN/-N.N^.NuOCHECK *RETURN to continue: opening IOerror # JoNV nCJp"S@n2-gAC 0` AC 0/- HnBgN /-HnZ?<PN8/-N~HnZHzNjgN.Z@BAAZ0 A.fHnZ.Z@??<NJB.HnHz4N"gAZ?<PN CNp"S@n2A?<PN Cp"S@n2?-HmNHnZHzHmHnHn`?<NA`?<PN Cp"S@n2/- N/- HzBgN/- HmBgN/- N/. Hm?JmW- gN`B-/- HzxBgN /- 0-H/?<N h/- N /-/-?-?-N0mg Hz <NN4/- HzBgN /- 0-H/?<N /- N @/-/-?-?-NL0mf N/- HzjBgN j/- 0-H/?<N /- N /-/-?-?-N0mg Hz<NN/- HzBgN 0<S@;@zBm`j m0-A?BA0 m0-A?BB0AgHz /??<$NNL|NuN^Nu%_NEW NV,_"_ _/ H>Hz /?<(NNL|NuN^Nu%_MARK NV,_"_ _/ H>Hz /?<,NNL|NuN^Nu%_RELSE NV,_BHHz?<0NN /o@?@@/H`ҶBgRBSIxN.` SBl(NN^Nu%R_PAOC pNdp N^pNXSDjNuNV,_$_4"_ _/ /$IBJ(fNJ(f g gRSBn(NuBDgBDN`JgSRBSxN`N^Nu%R_STR NV,_H o@BBFBN~ g +g -fSRFNd g> gJRF0m nHH& HC ԃԀ`JgD/B@LNuJFg(NBFBGB`JFgxNSFg&HBH„ HCHB6HC 4`~N^Nu%R_I NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_NuN^Nu%_TERM ned fileWriting to Destination at Reading from Source at Outfile name: Infile name:"I will add no suffix in that case.Gon the file names. I will add the endings unless the filggiilinnngoporGpptetoxtIJKL0h$HZ\  &'*,.2<>ANPTV`abdfhnpz"$(,.0BRj$@RzC.t 2 < A D G L n I R-.00tI|<    ( - ? P [ c f n"#F(f) +F,_- ../////-222-2.882 ?NI eUkg` >a!p@ s>z ~W~^D ?no_( lo5E\g<E ɧC[EH@XE!^E\E ɧC[EH@XE ^E\E3^DGHE\f EʨC[EH@Xs@EM@XYf E\G$oE\@0;ޥRKyppaontinu?ǃrom ԟ(Eu^D(>NDI(tUf@Eq^DG+E\\+R+g?g\(s>(~( k|_ndӭm|Bf( |W|Q(?n(o7{@i,SNI,nUier *9E`^Ep^E\E\Ej^D,SNDI,gU9p,?}Of,߶@@4,'o=f.,2*A/*Sa% %'o=fET^EJ@XEL^E%^E\AЕ]y vw? listzn-ndsutrgsnir)-?F:#b6Iϕ?{ ʰmIAL  &2HPhnzJRx 1 ' CTF  ' ? H V _ f i o r&F't(M) ,_- .//-0-1-82: ;@;P? ?mjN0hs~73+IYwJ?uk|jDRy8n9fA{v|B3]C\ Z %^`_`[ca: ~?.?<~+AȠA~-ABB.B@@`BA BgBmCDHE@NʀHʈH\HlHmhHnHzIINITuJJ@J_JoLRLEM .NN + NVN^Nu .OOB A@ON@PO RGS@,-.6SOStTE0|WW|W@XTY@@\O|Q<@` ` `` 'acalanape e:efFHegZ Rener _esff f hffi l mfo ng oggg6""nilinio&nislem menn (kna(n "ng&+**02+F8+_nuoo on- --opor..bdh/n// tz/ot/,/-p/.ppp0pe0+pt0.re22t tiut: eIUMAN ZOBJIO [FILEIO \UTILITY ]GRAPHS ^TREES _REFS `PARTS aLISTS bMEMMAN cPASDEFS dMPASLIB eH( @Fj"N" r"X/Nњ*ObjIOLibdMPASLIB eMainProg "b0S;(<($((7 7_7*( F ?   Ɯ?FtG qq0?tD WG~l?01~P(_5<=EADALL 0S;"Dz¿ +f([`+R@SAC@1]<=EbEROo r0P;"<.¿7|??+;f>?tDCWA-H-f(`(|Ģ?FtGHpMF D B20H/MF D B20kC7A1 w T 'ed bywwr0;"ʿD WGĢFGHpJf(v(Bn+g 7v(7\1](J{K`&ZAfs`1<=KuIPBLAN0P;"¿CqqB,eQe:gn k(Kg_e`R kZA˝_e`8 G?o (H`(t"krBB1 M/+`1s~ ZAϦDUA7>Aũp(n(6(Rqs (m(Rss (zm(PRrs (2&(lR,s (m(h(Hm((Rts (m(h(.`(dpf0Agdag|gNaN.aamN g0agHKgg`NamNaPafN`pZA\hqpޥZA\hsp¥N'T.o, '7,>ZAfl`&v(pNZA\h,p2ZA\hrp__l72$_77"$[7Qlg$[$A  PNpZA\htpN'T.oB '7},ZAS\rBB0 Bs^g``$dv(`v('z7>1Hc$j$j'dX/(,'d( eTeTke('d'c((>c%v'dn/(\'d( eTex(_'/<=+MODS=bV ' @_"bmD$ &'R(*t, .0RN"fN"N"~N"N" N"N" hN"N"N" N" N"N"N"&N" :N"8N"DN"N"N"PN"N"N"N"SZN"SN"^ N"N$N"WlN"]N"ON"ON"NN"RN"Q(N"ON"PzN"[N"Y^N"T$N"SN"_ N"TN"U@N$\N$N$xN$ZN$ N$#jN&N(N(!N( N(N(0N("N*N,TN,N,N,N.~N.tN0N0N0 ~N0N0N00N02N0N0N0N0dN0N0VN0N0 JN0 N0(N0N0z"X/NрMainProg ^'_NV/BGNE.Nu o/><hNE. _XON o/><jNE. _XON _/><lNE.N/><NE.L2"_2N _ /><NE.N _/><NE.N _0/><NE.NL20/>< NE.N _/>< NE.N0/2/4/ o"oH 0$|&|@SB46Q |"|@L /><NE. _N/><NE.Nu/6/4/ 2/ 0//><NE.& _PON/><NE.Nu/><nNE.Nu/><pNE.Nu0/2/4/ o"oH 0$|&|@SB46Q |"|@L /><NE. _N _ /><NE.N/><NE./@Nu/><NE./HNu o/><NE. _XON/><NE.?@Nu _0/><NE.N _0/>< NE.N/><NE.?@Nu _0/><NE.N/><"NE./@Nu _ /><$NE.N/><&NE.Nu _ /><(NE.N/><*NE.?@Nu _0/><,NE.N _ /><.NE.N/><0NE.Nu _" /><2NE.N/><8NE.?@Nu _/><4NE.NL//><6NE.""""&NL2H/><<:NE.222"LxN/><>NE.L""_"N _" /><@NE.N _/><BNE.N/><rNE.@Nu _/><tNE.N/><DNE./@Nu o/><FNE. _XO"_2N _0/><HNE.N _"0/><JNE.N _"0/><LNE.N _0/><NNE.N/><PNE.LH22222LNLH02468/><RNE.LN"oH02468/><TNE.LL"XON/><XNE./@Nu _ /><ZNE.NL H/><\NE.22222LNN^NuHWINTL /WTOA?HNu _>FWN _02@>N _.N _02A>N _02BWAgN _02i>N _02i>N _0"_""N _02i42_0BA2N _20F@2_Qh>N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.NNVH` n B6($."HAAYƒ "h g$qg RACgX`=ALN^ _PONNVH|BA6. "n 8.4CBAg0@qm2`6`0@qm =C` =A`L>N^ _PON B2 _"_/JAg(?04 BJd4m SAQNuSA QNu4 Amܱm0HdSA0HS@"QAfNu0Hd SA0HS@# QAg`NV/ $n $R J0*R@j@40"n"Q2*`Q2*j0 @f0Q2<j`Q$_N^ _PONGETWIDTHNV,_ _$ "_"$A0<!Hg dB"`!`Qn$BNN^NuUNCOMPRENVH ".$n "n$ 8<WgRKQKQn攊DLN^ _ .NFMCOMPRENVH n"H6(hg$B0(gЀ2$I0"aSnLN^ _XNVXORFONTNVH n"H6(hgB0(gSC$I0ZSnLN^ _XNUNVXORFONVH n"H6(hSC0(S@2BBJ4RYQQLN^ _XNHXORFONTJoNVB-kB-]B/./. /.?<Bg/.BBBN+_$+m$ N^ _ NNITHEAPJoNV+n$+m$ N^.NuETHEAP JoNV n $N^.NuETHEAP JoNV/-$A/?.<N2-n N^ _TONEWPTR JoNV/-$A/<NN^.NuISPOSEPJoNVB/-$?.N-_ N^ _TONEWHANDLJoNVB/.N/.<NN^.NuISPOSEHJoNVB/. N/. ?.N N^ _\ONETSIZE JoNVBgB/.N/.N&=_ N^.NuETSIZE JoNVN^.NuOCKHANDJoNVN^.NuNLOCKHAJoNV nHh n/N>/.N~N^.NuETMOUSEJoNVBg<N_N^NuOUSEBUTJoNV/. /.NXN^ _PONONE JoNVBm(+|0+|4B8N^NuINIT JoNVHJ8g m4 m4H: HH@J@HgHS@gVS@gS@g``p m,H<0->R@>m@mBGm;G> m88`F m8( m88`4 m8 m88`" m80 m88` m8( m88LN^NuHANDLERJoNVH:. nf.<H`.</N6BH/N6:N6N6 U n0/N6" n0T@H/N6N6j,/H/N6N66N6H/N5N6J/<<# N6t_LN^ _PONETBAUDRJoNVH>.B.J8f GW GWgtBg??.HnN g^ Gf+m08`+m48 -8X+@, m8J m8 Gf m8` m8J+n B;n@Bm>Bmmmm@mBG;G<.N^.NuREAD JoNV/J8g> m8H>Bg??<NtBg??-*Nh -80WDWg m, .N^ _TONWRITE _!!!xC!xN!xNuH*x xNL?Ns _20AAW@NJoNV/- Hz&BgNB/- NB&NA N^ _\ONEAPFULL"!The heap is full. User Croak !! JoNVBgNjg HnN`N^NuLUSHINPJoNV nH?NN^.NuUTBYTE JoNV/ nCJp@"S@n.@=@~`A0p@?NrRGino.N^.NuUTSTR JoNVA/NpA R/NbN^ _TONUTWORD JoNVHBNb м,.BgNzBNL]@gB. BgN^g,HnNA R(@H2AC n| LN^.NuETBYTE JoNVB. Bg/.NjgBg .R/NX_ N^.NuETWORD JoNVHB. A(HA R&@BgA/N g/- HzBgN@l/- N@ `J.fBgA/N g/- Hz>BgN@8/- N?`.g.f| LN^ _TONETSYNC GetSync failed GetSync failed JoNVHBGRG Go&/- HzBgN?/- H/?<N@/- N?L?.N?. N(n BF=n z`/ NdH@RREino?NBgHnNvnW GW"AgpDLN^ _PONUTCHUNKPutChunk tries = JoNVHBnBGRG Go&/- HzBgN>/- H/?<N?N/- N>|Bg?.N  g`BgHnN g`tBEB(n =nx`Bg/ N( f6H@RRDinoBgHnN f?.NºnWD GW"Ag@g=nLN^ _PONETCHUNKGetChunk tries = JoNVHNB.:<4,.(n Jo.. o.<Bg/ ??N g`RE`|LN^ _PONUTDATA JoNVHB8<4(n Jo4.. o.<Bg/ ??NT0H,چf RD`-ELN^ _PONETDATA JoNVH(n&n H<=F~`RH2AC TRRGino T RLN^ _PONUSHSTRIJoNVH&n BG .R(@ S  g SH2ACRRRG`R0@A nLN^ _PONOPSTRINJoNV/-n~`$ nH2AC n RR Rio.N^ _ NOVEMEM JoNVH/- N;/- HzBgN;/- N;BgNfg`BgNgBA//<N,JgRA-HHnA0/N/- HzVBgN;/- Hn0BgN;/- N;2Hn0Hz(NBfBAR/p@/N @g/- HzBgN;T/- N:`/- HzBgN;:/- HnRBgN;,/- N:HnHnR?/- <.?<N5`/- /.r?<N6&/- Hz.BgN5/- N5FHnBgN1`j.N^NuENDFILE2 bytes of resource sent. SendFile failed to send resource%SendFile cant read resource from disk bytes of data sent.SendFile failed to send data"SendFile can't read data from diskSendFile failed to send headerSendFile can't read headerSendFile failed to send commandSendFileSend what file: N.NV,_NUlN/ A/A/A/NA/NrNlNxHmPNAR/NfHmbNNBg?<?LC?<PN Xp S@n0N^ _ N+- NV"n iBBg n/(N _f=|-\`B.\Bg n/(Nv0k @n H0;N @Hn\Hz6Hn?<N-A?<PNC\p"S@n2`Bg n/(N _fA\C 0`A\C 0 n h\ n h ]g Hn\p nh?p nh?N."`RHn\HzvHn?<N,A?<PNC\p"S@n2`B.C n/(HnVNJnX]D@OHnVHnPNBgHnVHnPNJ_W.O n P]g|CHnPHnNHnHnH/N nHl0Hz?<?.HHnN- HnHn.@|?N-`BHnHzHnD?<N,AD?<PN?<N&&LC>?<PN@p S@n0`8 n H/. HzZHn?<N%LC?<PNp S@n0Jno8 n H/. HzHn?<N%LC?<PNp S@n0` n @J@fV=n=|`< n H/. HzHnH?<N%VLCH?<PNpp S@n0Rn0.no`T=n=|`< n H/. HzhHn?<N%LC?<PNp S@n0Rn0.no`L n0.n @]D n gx n H/. HzHn?<N$LC?<PNp S@n0 nm8 n H/. HzHnN?<N$TLCN?<PNnp S@n0`Jnf/.HnN Jno?.HnN zHnHnHnN "HnHnN J?< HnN RBgHnHnN _gj/.?< HnHn/N0.n=@=|`4HnHzHn?<N#A?<PNCp"S@n2Rn0.no` HnHnN .@nl2HzHnHn?<N#:A?<PNXCp"S@n2`HzfHn.@n|?N$` n H/. HnHn?<N"LC?<PNp S@n00.n n AA=@ n p0A A-gSn nJn]D`0.n=@ n o=| /.?.HnHn/ND.@2.n@o6HnHzHn?<N",A?<PNJCp"S@n2Sn`HzPHnpn?N#X n H/. HnHn?<N!LC?<PNp S@n00.n0.jD@=@B.JnoBHz0.H H@|??<Hn N":Hn Hn?<N"0.H =@`.@nl2HzHnHn?<N! n H/. Hz@HnHn?<N LC?<PNp S@n0`< n H/. HzHnHnp?<N LCp?<PNp S@n0 n.@n^D n g=n=|`< n HHz/. Hn?<N PLC?<PNjp S@n0Rn0.no n @nl: n H/. Hz6Hn?<NLC?<PNp S@n0`N^ _N  E+E-0 0123456789.0.00''NaN-+0.0.NV/.?.?.?.?./. /.NN^ _NNV0.|=@Jnl0.nBn` no=|/. ?.?<?.?<HnHnN.g/.Hz"BgN`/.HnBgNN^ _ N %w_e error NV0. n|=@Jnl 0.n Bn/. ?. ?.?.BgHnHnN&.g/.Hz"BgNB`/.HnBgN2N^ _ N %w_f error Jg.JkSAjJg&JkSDjAg mvNuvNufBCNu2<`8<`DJBg^JEgj,.HFHG(6HGBFHF4HBBBڇՆԄ`.HBJEg",HF` HE,HB.HEBEBGHGԇ`HEBgRA`BՃdRA`JfNuBD,BFaLJfHDJDg`SA$Nu/HFa0.$HB6BBԄ@JCg e`SABFއ@@kRNuBeHF8BB>g&BCĔ@g >HGBG@` JC`Sԅ@kNuJAk0@D@k.BԃSFă` Am c $<BA`B2<NuB@BB> G o>< GS@SG"ԁ0ԄQBCBEBJ@m8U">WWԁGBG0ԄGS@kJEg6RC 0gPQ2<JEg0FHFMRAJEfBՇdRANuJfNuJg JkSAjNu2<NuJf 0Nu$IDAA 'e8&HCBBBCHBHC "BA B@H@Ҁ HAA0BAHAHB4ԁ` oD'HBB6 HCC0BCHC HCC0BCHC HCC0BCHCC0BBHB B e HBB0BBHB`JBgB0• nNu6Cf@pnBA$:"NuH$;dH2;RNu !$'+.1@P$ k(C@ԥ* _25j >tɿŭ)xJzﳫ;0HK$;0@pgrH*;H8;N _"_ Nb2"N _"_2$fB`pB8#N.N _$_8*"_2$N>N _&_$_8*"_2$N6&N _&_$_8*"_2$NP6&N _$_"_2$N4$N _"_0N2"N _&_$_"_N64$N _"_$_2$/N _ N>N _ JkBWN>NH /6HGBFHF4HBBBڇՆԄ0<gRA``HBJEg",HF` HE,HB>BEHEԅJGg`HE``B8#N@N @gP Cf@g m 2$`m`\@g @n`L8##8 _GG_ tHB0<`" Cg$m CnB@`0<8##BC` m6n 8$f*`gr8##8 _GG_ `P"f&`> m6n 8$f*`g&8##8 _GG_ `NurNuaZWNuaRVNu"f&` m n 8$g&r8##8 _GG_ JANuBANuB8#"f ` m n8$g"f&` m n8$g"€kBA`BAmnNuRANuSANua[Nua_Nua AWNua AgJA\NuQNuB8#$gnD2<JkSAj0<a,NuB8#a @gVmP @g(8##8 _GG_ $<`X$<8##`68##`6BNuBAk6g A m(B` SAQJfJkJk`Dj 8#8!NuDA A mg`(B` SAQBJCk0g CnmJkՁ`Jj`ՁJf`Ձ` _"_B@8!!2N _"_B@8%%2N _"_B@8$$2NNV,_H0/2/4/@l // ?<\NN@o // ?<\NNL/W\NuN^Nu%_RCHCK NV,_H/H4/@l // ?<`NNL/WXNuN^Nu%_SRCHK NV,_NuN^Nu%_BEGIN NV,_NuN^Nu%_END NV,_H瀀 |0< BXQLNuN^Nu%_INIT NV,_"_0 _/ HdR@H>Hz /??<$NNL|NuN^Nu%_NEW NV,_"_ _/ H>Hz /?<(NNL|NuN^Nu%_MARK NV,_"_ _/ H>Hz /?<,NNL|NuN^Nu%_RELSE NV,_BHHz?<0NN /o@?@@/H`ҶBgRBSIxN.` SBl(NN^Nu%R_PAOC pNdp N^pNXSDjNuNV,_$_4"_ _/ /$IBJ(fNJ(f g gRSBn(NuBDgBDN`JgSRBSxN`N^Nu%R_STR NV,_H o@BBFBN~ g +g -fSRFNd g> gJRF0m nHH& HC ԃԀ`JgD/B@LNuJFg(NBFBGB`JFgxNSFg&HBH„ HCHB6HC 4`~N^Nu%R_I NV,_BHA0"H2@l02H`4 aS@j3 o#/IL._NuN^Nu%_INTER NV,_HA$0BP2I4RB6K"O$O8<4SDf JBZSBf0BB@0LNuN^Nu%_SING NV,_BHA 0"H26@l6K`4 aSCjAgm @H3 S@n`3 o#/IL._NuN^Nu%_UNION NV,_BHA 0"H26@l6K`4 FBaSCjAn3 o#/IL._NuN^Nu%_DIFF NV,_BHA 0"H26@l6K`Fa4 QSCjAo @H3 S@n3 o#/IL._NuN^Nu%_RDIFF NV,_H2/$0/&B$A(J@jB@@mH4J6Kg"O$O8<4SDfBZSBfTC?C$46JJDBCBDĉp R@@lLNu o /H"LJ_NuN^Nu%_RANGE NV,_H0/2/A"o@lB`TAk`! /HL._NuN^Nu%_ADJ NV,_BHv`N^Nu%_SETNE NV,_BHBCA$0"H2$I4@l4’J`Hf*SBj@gkIJafSAn`AJ`fRAk CB" o %/JL._NuN^Nu%_SETEQ NV,_BHC$2 I0$H`(N^Nu%_SETGE NV,_BHA$0"H2$I4@l4J`6 FCafSBj@gk IJaf SAj`v`BCB" o %/JL._NuN^Nu%_SETLE NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_NuN^Nu%_TERM _MainProgGraf mDNV,_ m4HhNNN^NuINITCURSNV,_ o?(B?(@?<HPHh N.NuN^NuSETCURSONV,_NN^NuHIDECURSNV,_NN^NuSHOWCURSNVH n 0(n ?0n?0(n ?0(n?NLN^ _PONSHIELDCUNV,_NN^NuOBSCURECNV,_ _ .NN^NuBITAND NV,_ _ ".NN^NuBITXOR NV,_ _F.NN^NuBITNOT NV,_ _ .NN^NuBITOR NV,_ _2jDA ` .NN^NuBITSHIFTNV,_ _"0F@"_1VDNN^NuBITTST NV,_ _"0F@"_NN^NuBITSET NV,_ _"0F@"_NN^NuBITCLR NV,_ m40"oC BBp""B"2""BYB2BYB"!"BBBBB.NuNV,_ o/(N= o/(N=t.NuN^NuCLOSEPOR"oAL"A"A"A'"A)J"A+"A7"A;"AJ "AU@"A"AU"AU".NuNV,_H m4 P"o0(Y0( YL.NuN^NuLOCALTOGNV,_H m4 P"o0(Y0( YL.NuN^NuGLOBALTONV,_pNN^NuGRAFDEVINV,_ m4 .NuN^NuSETPORT NV,_ m4"o".NuN^NuGETPORT NV,_ m4 PA"o 0 .NuN^NuSETPORTBNV,_ m4 P0(o1@0(o1@.NuN^NuPORTSIZENV,_ m4 P0(h o2(hoh hhh .NuN^NuMOVEPORTNV,_ m4 P /g<0/h2/hh hhh hhhh/(??N=".NuN^NuSETORIGINV,_ _"m4"Q/)/N;N^NuSETCLIP NV,_ _ "m4"Q/)//N;N^NuGETCLIP NV,_ m4 P"o/(/ N<.NuN^NuCLIPRECTNV,_ m4 PA "o .NuN^NuBACKPAT NV,_H瀀 o 0/X0/XL..NuN^NuADDPT NV,_H瀀 o 0/X0/XL..NuN^NuSUBPT NV,_ _ "_"NN^NuSETPT NV,_ _ WDNN^NuEQUALPT NVH<.ozN^o`(k\(T>+Dlg<N\p?N\(k\(T9G+F,g<N\NN\H(k\(TG>+Hlg<N\,?N\J(k\(T9G>+Jlg< N\ ?N\((k\(T9G.+Lg<N[/N\*(k\(T)G.. *.f"g"<N[/N[/N[(k\(T)G)E"*+0& g<(N[/+0N[`8 f <)N[l`Jf <*N[^`<+N[TN[NHEN[FN[@/.?N[ (k\(T)k0&?/./. /.NLN^ _NSTDTEXT NV,_ _/<// m4 P (hADg @ PNN^NuCALLTEXTNV,_pDN@N^NuTEXTFONTNV,_ m4 PoF _TONN^NuTEXTFACENV,_pHNN^NuTEXTMODENV,_pJNN^NuTEXTSIZENV,_ m4 P!oL.NuN^NuSPACEEXTNV,_?<HoN. _TONN^NuDRAWCHARNV,_ oB@?/N.NuN^NuDRAWSTRINV,_ o0/?/N _PONN^NuDRAWTEXTNV,_Bg/?<?<N>?_ _TONN^NuCHARWIDTNV,_"_ _B@/Bg?/ NN^NuSTRINGWINVBnBg?.oN n /-|-|HnHnHn m4 P (hfN*` @ h(N2=AN^ _PONTEXTWIDTNVH8Bn(m4&T)kLTC2D2JFJkBZ2 n" n "BHnN)WP(_ nBBJgl ll,H1@ n  n *+Lg4BBB?.?.NB?,?,NN/N* m4!ET4.ox$l$R, HJf0@ g j`TB n"J6*8*B@`* fۮDo0R@Cm@01 @g@@Qn=ALN^ _NSTDTXMEANVH8 m4I6-L n"20-A)X)XBHn/ N&_J\(g6(XK8880B'HnG/ HnNJLN^.NuQDSWAPFONV-|-|BBHnHn/. m4 P (hAg @ h(NJ_ m4 hP"n( HiB@( gRQi .g002020202N^.NuGETFONTIJoTNVTHx-O(m4&TBg?.oZ/.Hn HnHnXND2(lPJg8=A-k0 k2JkBm$l$R0.j=@j=@0.=@@ n-n-n +TFP2+XV . VgHB. .-@xn=@~H@n =@| .-@n =@H@n=@HnHnHnxNYHnHk k PHh k PHh?<HnN@gNA-H2*A=A=jJ.gJlfJl f kHfx k P P fl k P P gB'/+HnN7JgN0.noѮ0.no=@0.kЫ-@=k=k Hn/+N`TB.0.k @@ k =@2.@ITA6.=CI=A0HD@JwSCB-OBQ-OBC0*0*@A-HT0< jo0*R@jm@ nT:0 EgE, HEBE m4ڨT-Ed0.j=@`=|bSn n-H f ".dӮ``D@jo0*R@jm@ nT:0 Eg2141Ao6Kn`CJ.g*nonlno4.nl 0.C@@n֔nH|:AE(nEAAUA*n20AN6<0N84n6n>.FAg`SFg E, n`Snn>.`jJ.gN`^Bn`BB,` n2.ڐ@ ␁QQBB,g:"n6.ؒKSC<.BDB0Hz@H IYH2 UH3QQJ, g n2.0*4*"H$H Bmfg0D@Jw/ GISA4@ &␁Q I@ #㐀FQ&_0.Hn֐GS@H`B`Q0k N`=| -k-k A-HA 000 EA 0 BC, g0.HD@Jw0.S@B-OBQ0.S@ n/ Q-OBC4 n2.ڐ@ ␁QQ$n"n I nQ-JXn-np-ntXnt-nph-ntlSnhSnjSnlSnnJ.gHnhHnHnxNTpHnHnHnpHnhpkH?/+/+HnN>-nYnHnHnHnHn0+HJ, gD@@?/+/+HnN>.nLN^ _NDRTEXT NVHNRoxB'NP~ (k\(T +0*fRG<. @0HFf:.k00HEfTGNOf/+0NOf /.NO` NOzNOt(k\(T)n*/.NLN^.NuSTDLINE NV,_ m4 P (hANg @ hNN^NuLINETO NV,_ m4 P0(2o0(0oNN^NuLINE NV,_ _"m4"Q#_0NN^NuMOVETO NV,_ _02"m4"Qi0i2NN^NuMOVE NV,_H(m4&T./,+0Jdg4"l^ Q0 @ f!X@!X@0l\ml\/ ?,\N`J`g///,lHljHlhNv//N6'G0L.NuN^NuDOLINE NV,_ m4 PShBNuN^NuHIDEPEN NV,_ m4 PRhBNuN^NuSHOWPEN p`B@ m4 PA0"oJ@fI""2"".NuNV,_ m4 P"o"0.NuN^NuGETPEN NV,_ m4 P!o4.NuN^NuPENSIZE NV,_p8NN^NuPENMODE NV,_ m4 PA:"o .NuN^NuPENPAT NV,_ m4 P!|41|8p!@:!@>NuN^NuPENNORMAJo@NV@H|-O-MJ m4&PJkBml-KFpk8 @fZ?+8Hk:N-_@=_D*K$m$R&m&S2. 4.6.8. CoCDoDm6m4=A=B=C=DHnHmHjHk?<Hn|N JgHn|/-*nJN*nF2. 4.6.8. BgAnpmj 4f" n@ g ff R f S gHmHmHn|Hn|?-8Hm:/-/-=| zAz-HvHnv*nJN`DCD0m4jo2jl*=Bp=|r-npl0-6onl<-4oB?W?WN".-GhBBg?/N, ѮpѮlJkp l߮p`Snl`l m߮l`Rnp2.|4.~6.8.ng0n*HEHEBE,چۮpۮl=|=|=|=|4.~m Bm =BZ0.BH=@XHD@Jw0.XBQ-O\Bnt R gTnt JC0.~2.4.ZN. S gXnt KC0.~2.4.ZN.Jntf n\6.~nZ8.nZN>2.|mҭm JH҂-ATB4.DgFN-HN4- n@C*nJN *nF~n|O,6p2.Znpnln~n=n|RNl2.p4.l nN"nT$n\G|N XGG?,6p0-HѮT .hѮpѮlRnR0.Rnm*nJN.nL>N^ _PONDRAWLINE0.t0;N 2Nu0.RCN--i\Nu0.RCN--i\Nu0.RCN-CN- n"n$n\2.X $QNu:.DJ@f E E n`AfaN\<4.m 0Nr6J E mVg,FFFCAg\BSBgJd8SB`((UBngCT` Ag\|SBgJd\SB`FFUBngCT`Ag\|SBgJd8SB`((UBngCT`Ba>N2.n|SA E mgF@TQ`TQ`TQ`x2.|4.~(m0m>-0m 2INuNVH84.8.Bg0DjD@2.njDAAo0R@H&n(n T nPo@0/ ?N4.&S2.6.Af 6666`tnCD<B?W?WN.=B=| ѮJk l߮` lRn:ng 66:.66RF߮FfDg6666 n8LN^ _NPUTLINE NVH. NHoNGp0G/.NG(/.Jf J`g/./,lHljHlhNNp`NN LN^ _\ONSTDRECT NV,_ _ o& m g?<Hk(`?<Hk `?< Hl`?+8Hk:NN^NuPUSHVERBNV,_ _"_/ / m4 P (hA.g @ hNN^NuCALLRECTNV,_pNN^NuFRAMERECNV,_pNN^NuPAINTRECNV,_pNN^NuERASERECNV,_pNzN^NuINVERTRENV,_ _"_/ m4 PA( pNNN^NuFILLRECTNV m4"PJiBm$Hi//./?. /./)/)/(~NpN^ _ NDRAWRECTNV m4 PJhBm"n-Y-YC4(60)=@B=@2)=AB=AAl4(40=@B=@2)=AB=AAl=n=n=n=na>=n=n=na*=n=n=na=n=n=na`. m4"PHi/Hn/?)8Hi:/)/)/(~NpNuaN^.NuFRRECT NV,_ _" "_""NN^NuSETRECT NV,_ "_ _f f`B/NuN^NuEQUALRECNV,_"_ _02XlXlB`NN^NuEMPTYRECNV,_ _20"_YYYYNN^NuOFFSETRENV,_ _20"_YYYYNN^NuINSETRECNV/./. ?</.aVD.N^ _ NSECTRECTNV,_NVHx@C 0o: YLS@`" YXl2(Xl4(Xo6(Xo8(Ao BoQ`BABBBCBD n00000. H\@ALN^ _NN^NuRSECT NV,_ o "o0Yo0)H@0Yo0)2Yl2)HA2Yl2) o _ NN^NuUNIONRECNV,_ o0/2/ @lA1@1A0/ 2/@lA01A _ NN^NuPT2RECT NV n0.2. B.XmXm XlXlR.N^ _PONPTINRECTNV n "npPQoQH /.?NL n "n"QP n"2222"N^ _NPUTRECT JoNVH|-M$n&n(n*n0+So=@v0l=@0m=@=l=mBG0. gFGg$4- nC*nN*n~SO,6p`p f:0.nn0m0*l2+mAlDC`0.S@nnDnDn<+m2*lAF0.(TFAA-L2+m0.*U0AA-M2N8A0+koA2N:A=AJCjA-L-ME0. fJFfJnoCJCj$C`@ 2@@JnfACN24.N(n-L` XGG?,6p*n-MSnfL>N^ _NBITBLT |&^pz\0AFAUA:rSBgDÚJd;$SB`+$+$UBng`&0AFAUA:rSBgJd:SB`**UBngE ,쨿@AFAUA:rSBng`$E ,쨿@AUrSBng`E ,쨿@AUrSBng`E ,쨿@AF@UrSBng`E:FE6.4.A0EF:XGG?<6pSBf`0AFAUA:rSBgJd:SB`**UBngEAFAUA:`tE0A]rSBng``0A]rSBgJd]SB`UBngEA]`6E0AF@]rSBng` CopyRight 1983 Apple Computer Inc.Jo2NV2H|-Ot-M4?./.N،-_=_"n"Q$n $R&n&S(n*n"/ HmHiHjHk?<HnlN8g Hnl/-*n4NԬ*n"0<QRSfB$nA80.lTR00.nlj1@/.&/ /Hnl?./.*n4N`2.nmAm=A`0.rAH=@^HD@Jw0.^BQ-Of=|=|=|=|=|=|Bnj Q gTnj IC0.n2.r4.`N R gXnj JC0.n2.r4.`N ~ S gPnj KCx0.n2.r4.`N ^ njf-nf` njf-nf` njf-nf=nlT=npR=|P=|N0-H-@F-nfbB4.kgFBpB@A -H@g(4- nC*n4Nո*n"~nlO,6p`$n&n&0+H-@J fL0m2mAmN^ _"NRGNBLT 0.j0;N:,t0.DCNNu0.DCN|Nu0.DCxNnNu0.DCN`=A2CNTn2g n"n$nf2.^ $QNu0.DCN&=A2CxNn2g n"n$nf2.^ $QNu0.DCN=A2CxNn2g n"n$nf2.^ $QNu0.DCN=A2CNn2CxNn2g n"n$n&nf2.^ &QNu@h +H@"N0"NF•*NQ`2 +H@"N0NNQ` +H@"N0NNQ` +H@"N0NFNQ` "F•*Q` Q` Q` FQ`NVH.N: o8N8 k\ P .Lg!@L/< N7N7p@G/. N8,/. Jf$J`g/. /./,lHljHlhNH<`B'/.NBg?<hNLN^ _ NSTDRRECTNV,_ _""_/ // m4 P (hA@g @ h NN^NuCALLRRECNV,_pNN^NuFRAMEROUNV,_pNN^NuPAINTROUNV,_pNN^NuERASEROUNV,_pNvN^NuINVERTRONV,_ _"_/ m4 PA( pNJN^NuFILLROUNNVH. N8oN7pPG/.N6 n0(h=@0(P=@/Jf"J`g//./,lHljHlhN<`B'/.NBg?<hNbLN^ _\ONSTDOVAL NV,_ _"_/ / m4 P (hARg @ hNN^NuCALLOVALNV,_pNN^NuFRAMEOVANV,_pNN^NuPAINTOVANV,_pNN^NuERASEOVANV,_pNzN^NuINVERTOVNV,_ _"_/ m4 PA( pNNN^NuFILLOVALNVH|&n&S$K n "J n/.Hn?.?.N=n=n0.@n=@ nhPn=@<.:.N:.NnmnmBHn?N V:.ܺngNb:.NZ=n:.ngNF:.N>=nRFnm:.N(:.N n 0L>N^ _NPUTOVAL m*ʓH n0/.? NL$n$Rʷgkf kfYKNu66NuNVH .N6o&N4p`G/. N4Z?. N3?.N3 n 0(h=@0(P=@/Jf<`B'/.N8?. ?.NLN^ _ NSTDARC NV,_ _""_/ // m4 P (hAVg @ hNN^NuCALLARC NV,_pNN^NuFRAMEARCNV,_pNN^NuPAINTARCNV,_pNN^NuERASEARCNV,_pNvN^NuINVERTARNV,_ _"_/ m4 PA( pNJN^NuFILLARC JoNVH|-O-M m4&PJkBm-K0.gj n D@=@ @h]pn @f?./. NJ-_ =_*n$m$R&m&S/.HmHjHk?<HnNglB.J.gD0. HhH@J@j@h=@ n @hm@h=@ n0h@=@0(h@=@0(h=@0(P=@B?.?.NF.B?. N B//N-_B?.N B//N-_<.HFBF>.O0.-@0.n -@0.-@0.nޜ-F0. @l@Z`@D@=@0. @l@Z`@D@=@0. @nm nZ W` 0.܀nZ/.Hn(?.?.N0.@n(=@ nhPn=@=|RJ.gb n4m46(m4ClL0(m62(m6Al8=@~=A=B|=CHn|HnR0.m6m6?0.m4m4?NHn/-*nNdž*nL=|=|=|=|4.m Bm =B0.BH=@HD@Jw0.BQ-OBn R gTn JC0.2.4.N S gXn KC0.2.4.NJn f n6.n8.nN#2.mҭm JH҂-A B4.gFN-H4- n C*nN8*n~nO,6p2.nnn.n2nXn\nn=n( 0. nmnmHn(?NfHnR?N\nfdJ.g^DnDnB.0. @nm n f`0.܀nj0.=n=@ .-n-@ .-n-@0. nmrJ.fVNJ.f0. nRm6nTl.`2..Jnj nl2.=A4.2Jnj no4.=B0. nRmnTl0.XJnj no0.=@0.\Jnj nl0.=@ҲBl4.aX2.4.`0.nj nonf4.X`0.ذnf 2.\4.a2..4.a 2.4.2`Z n"n $nGNɊBmB0.nj: no02..a2.4.2`2..4.Xa2.\4.2a` 2..4.2aXGG?,6p0-HѮ .Ѯ .ѮRn 0. nm*nN.nL>N^ _NDRAWARC 0. 0;N 2Nu0. CN-iNu0. CN-iNu0. CNCN n"n$n2. $QNuNVH n"n 23h4. lBB2.lBA0(h@o40(P@o23h Bi 3hBi0H@B@ѩ  pA3@0HЀS#@BBB??N8/HiNȖ )Ѐ#@& )р#@"L?N^ _ NINITOVALNVH$n 0.Rmjl~&<$* "*(*` ԃA"C@ӈӈA*C"@ӈӈn` ҃A*C"@A"C@m%B %A0*R@H們TjL?N^ _\ONBUMPOVALNV,_ _0HH@J@j@H @ho @D@.N.DNN^NuSLOPEFROx kfo#(-$16j;?DIhNDS.X&]-bEgnlqw`|p@ANފ7 Q&1<"GS`[m{5hwn $>[y[zEV|hTb%PQ$ nL9J0NV,_ /[jDA2<_0<AJk0.?@NuN^NuANGFROMSNVH(n0,T@2. @0,l@>.@f JAoP0<`LB??N$,B0,T?0,l?N B//N Bg/NN0JGj @ @hfB@ n0LN^ _ NPTTOANGLNVH8. N*:oN)ppGN'/.N($nJf/ N`2 RHh k PHh k PHh?<HnNg / NZNLN^ _\ONSTDPOLY NV,_ _"_/ / m4 P (hAbg @ hNN^NuCALLPOLYNV,_pNN^NuFRAMEPOLNV,_pNN^NuPAINTPOLNV,_pNN^NuERASEPOLNV,_pNzN^NuINVERTPONV,_ _"_/ m4 PA( pNNN^NuFILLPOLYNV,_NذB?<N"_/I m4!I^1|\ P!|d"Q2 BBNuN^NuOPENPOLYNV,_H(m4 TBd(l^ T>BB<F Ng:2468SF`0Al2Bo40Cl6Do8Q TA0000/ ?NNLNuN^NuCLOSEPOLNV,_NxN^NuKILLPOLYNV,_ _02"_"Q4UBJSBYYQNN^NuOFFSETPONVH8$n &n f *g0(n(THl/ / N)>G O ` / / / N) XLQLN^ _ NMAPPOLY NVH(n T>G Og/( NP|SG` T/0`XFNֆQLN^.NuFRPOLY NV/ m4 PJhBk:N/.N n P/( NDBN((WN/ ?. /.NP/ NDLN^ _ NDRAWPOLYNVH8. N&oN%0<GN$/.N%r/.N,Jf J`g/./,lHljHlhNPN"`NLN^ _\ONSTDRGN NV,_ _"_/ / m4 P (hArg @ hNN^NuCALLRGN NV,_pNN^NuFRAMERGNNV,_pNN^NuPAINTRGNNV,_pNN^NuERASERGNNV,_pNzN^NuINVERTRGNV,_ _"_/ m4 PA( pNNN^NuFILLRGN NV m4 PJhBk$Hh/Hh/?. /./(/(/.NN^ _ NDRAWRGN NVH(m4&TJkBkT n P P f HhN` G f$/ /N0+kl 0kmbBB`ZGB?N&_aHFa`>Bg/ / / ??<?PN|: S2` H@ Q/?N / ?/ N Nu/ NLN^ _PONINSETRGNNV,_ _"_"QHi/NN^NuEMPTYRGNNV,_ o"og" P"Q02ISAVf@gf S@f| `B/ _PONN^NuEQUALRGNNV,_pNVN^NuSECTRGN NV,_pN>N^NuUNIONRGNNV,_pN&N^NuDIFFRGN NV,_pNN^NuXORRGN NVH8:$n&n (nB'/ / N0JgEf / / N`/ NZ` R"S EnJm 0)ilHhHi?<HnNۀfJEg` R"SJEf4 P f. Q f(/ HnN`V0)il0(hm$K`~8QDB?N&_Bg/./. / ??BgPN</ ?/ N./ NLN^ _ NDORGNOP NV/2.4. BC n Phm4hl.hm(hl" P fFC`A Xm0 @gAnFC`DC&N^ _PONPTINRGN JoNVH|-OB."n"Q/. Hi?<HnNVgP Q gD IC0.2.4N:)M0.N<. i0JVf0)@o N`R..nL>N^ _PONRECTINRGJoNVHxB.A-HC-I2 n""Bg/. HnHn?<BB'N$ n _nm `BBR.LN^ _PONTRIMRECTNVH8 n "nfg(n T P fHh/. /.N Z`nB?<N&_Bn=|/ / HnHnN>.O<$S`/ /. /.NXQ/?N/=GHnN/ ?./ N/ NLN^ _ NMAPRGN NV,_3@3A3B"3|3hA #H _BI3A IDAJw2) BQ#ONN^NuINITRGN NV,_il6imBANu i2) BQ Q3h3|A #HimH04$i3Z6 Cgb8ioilil6)io8)ii0Nz:0N<K&iLCnES`[`FUDnmF[S`#J3RilL 2<NuN^NuSEEKRGN JoNVH8EAa|&HAar(HA0. gAU@gAU@g AU@gA-H n P-Hn-HA(0A8*0A,0Ap.=[ =\ n f=|0. ngna` @gaa D"E$G4. Hz/.Nu G"FE NFA "n$n .`0"0"eNJ.g" n n nЕH/? NL n n n-J A Pf-I`D=n  K"D$GN&H=[ GNu=n L"E$GNp(H=\ENu"P"Q Q f* A$$4444444"HA Nu-I . nH=@LN^ _NRGNOP ` @g02Agm42`40`4NuBBBC`BB`tv02Amn" @g(Cf40FB2FC`JCg40FB`JBg42FC`4NuJBm Pg402BBAl44`2|`02BBInUJ`442A Pf4NuNVH8Jo&n 6 CB0.or(KYL(HL"K$L Ќ@C @2(4`XIQnmin`YJRmnjmn "$XIYJcγdHH(JefLN^ _\ONSORTPOINNVH| n0o6"n &IHYK* $I` XI` g$mn$ H n0L>N^ _PONCULLPOINNVHx(n&n<. "S: T>< BB Fnm~-P-h `p=P2(46SCm Al2`Bo4`=A=B=hzFM/ ?N T"S SF0` Xg 20(22Q22 S> S0 Gg/ ?NLN^ _ NPACKRGN NVH8(n&n$n S>GR"nQoG2/ ?N S$n "T P fTH""`A .">"> Gf Pf4LN^ _NPUTRGN NVH8No: nC&P8(#h#h n0ioi0(i l3@ 0(io HHi0(i^@HHii l3@ :) iEMoE3E<Jg EmPNHn?< N/.?<N/.?<N?. NJg/.NE>* j EmH`6-KA-HHnHn?N.,.ANvHn?NBQ`/ ?N2Q&TJkBm*/.Hk/./.?. /+/+/.f.~NLN^ _NSTDBITS NVH8(m4&T$n.,,f /./*NV"n +f +g&/ / /./.?. /,~//.f.~N>`$/ /./.?. /. +hAg @ h NfNLN^ _NCOPYBITSNVH(m4&TJkBmJ gBN.BNx,//.NJ//+/N//+/N//NN//. N@ n-X-X . nnH@nn///.N/./+N?CN4_g n"n$n2. $QNu0.tCN?CNWCN_g n"n$n&n2. &QNu,Hd +H@"0"F”(Q`R +H@"0Q`6 +H@"0Q` +H@"0FQ`NV,_0N@:0N^<CDCnEPNuX`FUDnmFXPNuN^NuXORSLAB NVHx6. g8.g n"n0. R@H&I0Df ""سe`n4CCg`^.<tЇAQe`Dg`,2 @ e`\ 03. n<N P?N n`0<N @?N ^?N X/.N n/?N /.N|LN^ _PONSTDCOMMENV,_ _2"_/ m40(bhb hd P`QNuN^NuSTDGETPINVH"m4"QJ\gR"i\"Q&Q S<.0k@Fj0/ ?< N`,io@k3@/ ?N S0P"n `QLN^ _\ONSTDPUTPI m4 P (hAg @ h$NNVHB (m4&TJ\fNB?<\N(_'L\BNBB?<N"_-I (T("Q2 n""8(BBB8B\B <((BB(8p((((BBB((!(?<NLN^.NuOPENPICTNV,_H(m4&T.+\g4<Nd G P,("P Q0k/ ?N/N/NB\N4LNuN^NuCLOSEPICNV,_NN^NuKILLPICTJo`NV`H8(m4&T n0(ho=@0(Po=@C"" n PA0(ho=@0(Po=@C"" KC`p52QBX)n d9| bABBBBB-kBN-_BN'_A BBp B"< 0 THB0BXB ! B'HnNBf/.N/+NzA`p56QBXBdBlbLN^ _PONDRAWPICTJoNVH8(m4&Ta> fB. `P| G e@@VGH0;N$$ H|$$$$$$GG0;pN@&.Naf$n/./*,NF$n/.HjHjNj$n/./*0/+N`n|`|`|`GP`GT`G `GD`GF|`lGH`GJ`GL`N'@4Hk4$nHjHjN`&nNr'@$Nj'@(Hk$HkHkNh`a`G8`pG:`\G(`TN.$n%@HjHjHjN(`N$njjlXH@jjlZ/*,BN-W`J.f$n *fa'@0-@$nHk0HjHjN,f a-@`arnajn$n%nHnHjHjN/.Av +hg @ h`Gg&g a$njga$nj ` a$$n%@ a<Hn?N$n'j 0Hk0HjHjNv?Hn$n/*$/*(A: +hgR @ P`JaA +hg8 @ h`.a$n/*Aˮ +hg @ h ` aA +hg @ h`azaV?aP?A^ +hg @ h`a/.$nHjHjNb/.A +hg @ h`aZ/.$nHjHjNn/.A4 +hgl @ h`bHn?<N|$nHnHjHjNHnHnHna?JGfB`a/.-n<.n:B?N-WN nJ.g.-P`"a2Hn-W?NHnHn?.NQ`/?N n-PA +hg @ h N/.N|JGg`a?JfBgBA +hgp @ h$`fa?BDa*/.A\ +hgN @ h$`D m4"h0(Ar"Q`~Dt0t`@wtCXEWwUOFTOEtOwtUTwtTDTGwEEmUJEUnEELwEz/ ?N`B'/?<NB@NuB'/?<NHNuBg/?<N0NuB/?<N NuJ.f$nHR?<N$n-R-jHnHjHjN _HnNxa:B?N-WN n P0DHp@?N6/.N|NuN`N`/.N/.NLN^.NuPICITEM NV,_ m4 P (hfN> @ h,NN^NuGETPICDANV,_ m4 P (hfNL @ h0NN^NuPUTPICDANV,_Ho?<N _JNN^NuPUTPICBYNV,_Ho?<N _J_NN^NuPUTPICWONV,_Ho?<N~.NuN^NuPUTPICLONV,_ _?</N\N^NuPUTPICPANV,_ _"_/ ") m4 P h\ PDfHf PBNFNu!@D!AH/ ?<N0NNuN^NuPUTPICRENV,_//N o P/?N//N|.NuN^NuPUTPICRGNVH(m4&T(k\(T. mpg gm2*+(,+,4f8g)E4)F8< NHk:NVLN^ _TONPUTPICVERBNV,_H(m4&TJ\g kBm(k\(T.+PTg<N/N(k\(T)GT.+TXg<Nz/N(k\(T)GX +Pg.>+lRlRHG>+lPlP< N>/N(k\(TB'/+/,NrJf/+/,<N/+NNB(m4pLNuN^NuCHECKPICNVH n"n $na$THTITJaLN^ _ NSCALEPT NV,_6)Q4*RBg2IH0nBPNuЁfp0NuN^NuSCALE1 NVH n"n $na$THTITJaLN^ _ NMAPPT NV,_46)B8:*D0BCg2IH4jD@ЁJBjD@D0NuN^NuMAP1 NV,_// // // NpX NhN^NuMAPRECT m<MainProgFMInit JoNV nBPN^.NuMOPEN JoNVH&n (n-Qg/- HzBgN/- NHlHz?-Qg&/- HzBBgN/- H/?<NH/- NHl?<N0LN^ _PONETFILE Bcblks:  on file LISA:FM.MN.HEURError #LISA:FM.MN.HEURGetFileJotNVlH-Qg/- Hz BgN/- N n/(/N"n iJPg`BGOAt0pH2AC@RG-Qg,/- HzBgN/- .HH/?<NH/- Nns|`OAt0pH2AC@RG-Qg,/- HzBgN/- 0,H/?<NH/- Npk|nA 2IDA0 <f/- HzBgNpk|nA 2IDA0 <f/- HzBgNpk|nA 2IDA0 <f/- HzxBgNpk|nA 2IDA0 <f/- HzBBgN/- N/- HzBgN/- Hl BgN/- <"?<NN/- N F P,(,`RG G2o,/- HzBgN/- NB`d/- Hz|BgN/- HH/?<NH/- HzVBgN/- HK Ah@HpBgN/- <"?<NN/- NR oLN^NuMDUMPHE]: "mpeskclstr30 [,<<<<<<<<<<<<<<<< Spoke Table >>>>>>>>>>>>>>> Root Name: "Laser | Typewriter | Dot Matrix | Screen | Extra: Shadow: Outlined: Underlined: Italic: Bold: Shadow | Outlined | Underlined | Italic | Bold | ,<<<<<<<<<<<<<<<< Face Record >>>>>>>>>>>>>>>fuser:  | fam: 1<<<<<<<<<<<<<<<< Heuristic Record >>>>>>>>>>>>>>>JoNV/- HzXBgN/- N/- HzBgN/- N/- HzBgN/- N/- HzBgN/- N/-N`BgBgN$/- Hz^BgN/- N/-RN/- N/- Hz&BgN/- N/-N`N^NuMHEAPFU"RETURN" to crash*"RETURN" for a heap dump9*********************************************************8<<<<<<<<<<<<< Font Manager's heap is full >>>>>>>>>>>>>>9*********************************************************JoNV/-Qg/- HzNBgN/- N nBP -N n.-N` -N ./-R?N.N^ _PONMCACHES FMCacheSizeJoNV-Qg/- HzfBgN/- NB/./.Nj-_ nJPn(. gB/-R/-,BgN-_` /-R/-,NN^ _ NMLOCKFO FMLockFontJoNV-Qg/- Hz&BgN/- N=| N^.NuMCBOFN FMCbOfNJoNVH,.(.(n-QgB/- HzBgN/- /?<NH/- HzBgN/- /. ?<NH/- N . UrAH. D P T&@ D P TrAHҀ*/ /?N UrAH,/// Nv0,~@ @W2,~A AWRg D P/NpLN^ _NECODEFO , cbCur: DecodeFont. cbMax: JovNVvH n CJp"S@n-Qg/- HzBgN/- NBHnHn?>>>>>>>>>>>>JoNVH..-Qg/- Hz$BgN/- N GBP(n ,f0,H@ @f m( P0A2GJg0,@A@2sgx0,@A@80< D@ G0-QgV/- HzBgN/- 0,@H/?<NH/- N/- Hz@BgN/- 0H/?<NH/- N` G0 LN^ _PONMMAPFON2 New fam :  ewhcl : FMMapFontJoNVH&n.. -Qg/- HzBgN/- N(n0.H@k S|nA 2IDA0 <fP G S.FfB,B, B, B, pk|nA2IDA0 <f S(H2AC@pk|nA2IDA0 <f S(H2AC@ pk|nA2IDA0 <f S(H2AC@ pk|nA2IDA0 <f S(H2AC@ pk|nA2IDA0 <f S(H2AC@ ` -Qg/- Hz^BgN/- N GB` -Qg/- Hz(BgN/- N GB-Qg(n/- HzBgN/- ,HH/?<NH/- N/- HzBgN/- , HH/?<NH/- N/- HzzBgN/- , HH/?<NH/- N/- Hz>BgN/- , HH/?<NH/- NLN^ _NHECKCHS Shadow : Underline : Italic : Bold : Device Mis-Match Requested set not in given setCheckChsJoVNVV/ (n(l(l-Qg/- HzBgN/- N0.H@gS@gFS@gS@g` n //. HzHn?<N< _C?<Np S@n`.g4 n //. HzNHn?<N< _C?<Np S@n`2 n //. HzHn?<N< _C?<Np S@n` n //. HzHnx?<N< _Cx?<Np S@n`r n //. HzHnV?<N< _CV?<Np S@n`>-Qg0/- HzHBgN/- 0.H@H/?<NH/- N l0 (_N^ _ NSSIGNDEJ&An unknown device was specified. Dev #L.FT.FS.FH.FS.F AssignDeviceJoNVH.. -Qg/- Hz>BgN/- NB. m( P0.A2&p SA ?<NCp"S@n GB V. g cbFreeFound (cbBk ( MakeBkfBeforeJoNVH(nB/ /0-F| H/N,0-F| Hnv/ /NJ0-FHД(/ /0-FH"/ND0,|S@=@>,` @)4 @A4)HRGino0,|9@0-FH",)A-l -]g/ NLN^.NuMAKEMORJoNVH&nBg/ /. N&<0.F>/ H/<NJGo n (PB/ / n Y( D"D0@?"H@A?PPH +'@LN^ _ NROWHINPJoNVH,. .bgb F(P F&hoTH@J@f .` 0@?@H.\IA AWg LT-H/A/<N`LN^ _PONELEASEBJoNVH..B//(_ G(h&mX(l GgXW^g&L`Xf-mb `-K LN^.NuLSTFREEMainProgSegPxHz JoNVH&n/- HzPBgN/- / ?<NH/- Hz(BgN/- 0+H/?<NH/- HzBgN/- 0H/?<NH/- N>JGg(K/- HzBgN/- H/?<NH/- HzBgN/- / ?<NH/- HzjBgN/- 0H/?<NH/- Hz>BgN/- 0,H/?<NH/- N>`nLN^.NuXLLD L , ollePrv: , olleNxt: , lle:  olle: , olleFreeFst: , olleLim: lld: JoNV/ A(H/- HzBgN/- HH/?<NH/- < ?<NN/- ,HH/?<NH/- < ?<NN/- 0,H/?<NH/- <]?<NN/- N(_N^.NuXN [ifil bhi iblo]: [JoNVH(nH@J@g0@?@H.` .-G/- HzBgN/- / ?<NH/- HzBgN/- /?<NH/- HzBgNH@gS@gpS@gS@gL`/- HzBgN/- /,?<NH/- HzfBgN/- /,?<NH/- N`/- Hz6BgN/- N`Jll n &h 0,jD@`&n  LX,gX/- N/- HzBgN/- /?<NH/- HzBgN/- /?<NH/- <)?<NN/- N/- HzdBgN/- 0,H/?<NH/- N`Bg/. /,N:/- HzBgN/- H/?<NH/- HzBgN/,NZ LT(/- HzBgN/- ,HH/?<NH/- HzBgN/- ,V@H/?<NH/- N n h @g4/- HzDBgN/- /?<NH/- <)?<NN/- NLN^ _PONBPXBK Nob error - rgpnob[ipn] <> nob ( ; fDirty:; ubt: ; N; ipn: Std; oh: ) <> bk^.data (Back pointer error - h^ (Nrel ; bkfPrv: Free; bkfNxt: ; tybk; cb:bk: JoNVH(n/- HzBgN/- / ?<NH/- HzBgN/- /?<NH/- HzBgN/- /,?<NH/- HzBgN/- /,?<NH/- N/- HzPBgN/- /, ?<NH/- Hz$BgN/- 0,H/?<NH/- HzBgN/- /,?<NH/- HzBgN/- /,?<NH/- N/- HzBgN/- /,?<NH/- HzlBgN/- 0,H/?<NH/- Hz>BgN/- ,"HH/?<NH/- HzBgN/- 0, H/?<NH/- N&T\_gB/ / N`/- HzBgN/- NB&lB/ / Nޟ&kf r gR/- HzrBgN/- /?<NH/- HzDBgN/- /,?<NH/- <)?<NN/- NLN^.NuXHZ ) <> hz^.cbFree( cbFreeT ( Free List: , ipnCur: , ubtCur: , mskIpnLst: rgpnob: , cbFree: , hFstFree: , ipPoolMac: pBase: , bkfFst:  bkLst: , bkFst: hz: Jo\NV\/ n CJp"S@n2(n/- Hz2BgN/- /, ?<NH/- <)?<NN/- N/- HnBgN/- N/- HzBgN,HgS@g S@g0S@g>S@gL`ZA\Cp S@n`HA\Cfp S@n0`4A\C.p S@n`"A\Cp S@n`A\Cp S@n/- Hn\BgN/- N/- HzBgN/- 0.H/?<NH/- HzJBgN/- /.?<NH/- <)?<NN/- NB,(_N^ _NEAPERR >; Suspected bad value: ( Error ID: <&Contiguous check of named objects pool'Contiguous check of master pointer pool"Free master pointer list traversalFree block list traversalContiguous block checkError found during *Heap error found during check heap. hz: (JoNVH&n(n l \ l _DgnH@J@f  n `0@?@H n H@.H@g?<H@H/Hz/.NH@gS@gvS@gS@g` l +\ l "+_ l "+\ l "+_D(+-k DW" nW`Jkl l 0+jD@HШ ,` 0+HЬ , KX-H F gB?</Hz/.N"`@Bg/, /+N=_ KT* l h0.@gB?</HzL/.N`?</ Hz&/.NGLN^ _NCHKBK vBk out of boundsName mismatch in tybkN block#Back pointer error in tybkStd block!tybk does not match expected typeJoNVH(nB, l &P lBP l \ l _,g8Bg/ H@Hn/.Nl_H@ @f lRP`LN^.NuHECKCONJoNVH(n| l &hBBg/ BgHn/.N,@,gޮ&k l W,  l ^@g r l V,g?< /Hz/.NLN^.NuHECKFRE Too many (few) free bytes foundJoNVH(n| l &hBfV l 2(H\ l A4_ l "l 2)AA4^g&SR`fg4 l 0(Hl?</Hz/.N^`?</ Hz|/.NJ|B l 0(S@=@BF` l @*04 l "l 0)@A4nT l l,R Y-@Bg/.<Hn/.Nh,@`?< l @/04Hz/.N`2fV l A4^g?< l @/04Hz|/.NRFinoN Є l 2(Hg?< Є/Hz/.NRLN^.NuHECKPTR(free + used master pointers <> ipPoolMacmaster pointer out of boundsmaster pointer out of boundsMaster pointer out of bounds%Too many master pointers in free listJoNVH(n| l =hBG`< l h @&p g$ U,Bg/<Hn/.N,@RGinoLN^.NuHECKRGPJoNV|/N/NN/N/NbnN^ _PONCHECKHZMainProgSegHz JoNV nam0.| =@`=n=n N^ _TONPPERCH JoNVH(n~@Gm /BgBA4p?N2 RG`LN^.NuAKESPUPJoNVH(n .g. T0,A&H0,l??< / N> l=@`0 T0,S@A&H0,l??< / N>0,S@G=@-kg/- HzBgN/- .HH/?<NH/- HzBgN/- 0,H/?<NH/- HzbBgN/- 0,H/?<NH/- Hz6BgN/- H/?<NH/- NLN^ _\ONCHCR 2, dchT: , ichLim: , ichFst: IchCr - fFwd: JoNVH,.:.(. -kg/- Hz*BgN/- /?<NH/- Hz BgN/- H/?<NH/- HzBgN/- D0H/?<NH/- HzBgN/- n0H/?<NH/- <)?<NN/- N(F nJPg* nPf n0JTg &F7lJlg&F6 D8 DJPg, D0HІ. G9h GJhg &F G6 G1E`Bl D0LN^ _NOVEOLLE, , , MoveOlle(JoNVH(n >. Bn0.Gln/ ?/ HnNvn`LN^ _PONNITOLLEJoNV0. nl=n `=n N^.NuMIN JoNV0.n l=n `=n N^.NuMAX JoNV/./. ?.NN^ _ NOVERGCHJoNVH.. n P"n0)A(H G P"G0)A&H/ / G"G0(i?N LN^ _PONOVEACHAJoNV0.H n 00.HH@J@ n0N^ _ NIVMOD JoNVH/- HzNBgN/- <?<NN/- 0.H/?<NH/- NLN^ _TONREAK Break: JoNV n (r Ё-@ N^.NuBOFHZ JoNVH&n-]g/- HzBgN8<<<>+ =GBE k @(p g@,f8Bg+"H,HA??<Nj0<_=@no<8.RE EgBg R@??+Nj>ng`=F 7G -]g/- H/?<NH/- NLN^.NuPNCHOOS IpnChoose: JoNV/ n h/Bg/./. N0 _@(p g LXPP@-mf(_N^ _ NLOCKN JoNV/ n h/Bg/. /.N0 _@(p gl(_N^ _PONNLOCKN JoNV/ n h/Bg/./. N0 _@(p g.H LX@HPP(_N^ _ NETFDIRTJoNV/ n0-JH"(AJll-m^ `0,H".-A (_N^.NuZFROMH JoNV/ (n l!l l!l n f n !l(_N^ _PONELETEBKJoNVH(n ../.p/NT( G)h G h&h)K'L G h!L G!LLN^ _ NAKEBKF JoNVH,. F(h . Ї&@ FlH@J@f*// N Д(` F]\g-L``(l Ff-mX``LN^ _PONKFINDCBJoNVH n (h&L-]g^/- HzBgN/- /.?<NH/- HzBgN/- / ?<NH/- HzBgN/- / ?<NH/- N(l n g\^g&L`|-]g$/- Hz8BgN/- / ?<NH/- N-KLN^ _PONKFLOW &BkfLow: , bkfLow1: , bkf: bkMin: JoNVH..-]g/- HzVBgN/- N/N G(PB// N(_&LB-]g*/- HzBgN/- / ?<NH/- N/Nҷl0@?@H*H@g S@gS@gD`f *܅// N`h`TJkl G0+jD@HШ (` 0+HЇ( LX"D"`& G h/Bg//+N0 _@"LT!``/ / ?N"ż l`ZJg // /N`Jg // /Nʼ m-L`-mXLN^ _ NKCOMPACbkDst: BkCompactCbJoNVH(n >.-]g,/- HzBgN/- H/?<NH/- N/ N Gg l @&p g+g K\*///,0N l @ p(f/ l @A/<N l @BBg R@??,Nj> l @&p g< l @BBg/ /N< l @Jg?<N| l @!`-]g/ NLN^ _\ONREEIPN FreeIpn - ipn: JoNVH(n(. -]g$/- HzBgN/- /?<NH/- NoZBg/ N> Gf@.g8 <Bg/ ?/,$N:/ H/NB/ /. ,. -]g/- Hz BgN/- /?<NH/- HzBgN/- H/?<NH/- HzBgN/- .HH/?<NH/- HzBgN/- / ?<NH/- <)?<NN/- N/ NBgBg.HAP@20GRA?? | Ho/ | H/<N0B/ H/N&_Xf"B/ H//,NJ&_Xf F b` .f@\]g 8`, \", Ҽ^g , 8` F b`/ / N * | HnH Ї-@/ /.H /N`>H ,)@ H@?SS.H@H?.HS@gS@gS@g` KT"F"` KX"F"7D` KT"F"LN^ _ NLLOCBK , , , AllocBk(JoNVH&n (kff B/ N(_fg('T/ / ?.<Nt bf ('L(mf-L-]g/ NLN^ _\ONALLOCATJoNV/. A/?.<N-n-]g/. NN^ _\ONALLOCATJoNV n Y-@ n0@?@Y@=@N^ _PONBDATAOFJoNVH(n&n .HAH@20H , F0@?@>H Ь)@/ /H/NA4\]g&)KLN^ _ NREEBK JoNV/. /.<NjN^ _PONREEH JoNV/. A/<N>N^ _PONREEP JoNV/. Bg/. /.NNN^ _PONREEN JoNVH&n>.,. -]gB/- HzBgN/- /?<NH/- HzZBgN/- H/?<NH/- NBg/ /NZ=_BgBg R@?? X@=@ | nnJ F Y(@0.H@?TT/ 0.HЌ/0.GH/N^0.GHЫ'@`0.Ho/ /?N`B/ ?N*fgn E Y( D=h F Y(@Bg D0@??0@??N0@U@=@ DT/ LT/?.N9n F"E" DX"F"/ /<NzLN^ _ NHANGESI , cbNew: ChangeSizeH - h: JoNVH(n*. 8.-]gH/- Hz,BgN/- /?<NH/- HzBgN/- H/?<NH/- N/N @H",/r/NT"Ҁ,o / /BgN/ A/?<N^ n nl" nh nhBg/ /N> l @Jg?<N l @!,"HR@@" n\-H-]g l @ p/N/ NLN^ _ NCREATEN , cbData: PCreateNob - nSrc: JoNVH(n ..|#-]g/- HzBgN/N l/Bg/ /N0 _@&p fB/ /Bg//,(NN4, l/Bg/ /N0 _@&p* KXPP@Bg///,,N gBk/ Bg/ /NN`& l/Bg/ /N0 _@&p K\,k` l" K\,-FB,#LN^ _PONMAPN PMapPn - pnSrc:UNITSTD 'UNITHZ 'UART 'STORAGE 'QUICKDRA'QDSUPPOR(FONTMGR ( N0 _@(p g LXPP@-mf(_N^ _ NLOCKN JoNV/ n h/Bg/. /.N0 _@(p gl(_N^ _PONNLOCKN JoNV/ n h/Bg/./. N0 _@(p g.H LX@HPP(_N^ _ NETFDIRTJoNV/ n0-JH"(AJll-m^ `0,H".-A (_N^.NuZFROMH JoNV/ (n l!l l!l n f n !l(_N^ _PONELETEBKJoNVH(n ../.p/NT( G)h G h&h)K'L G h!LiaȠinkklelo| lity.)))))w0l 16, 1983﮶YG8 @nHP△V[ 8L^"n'cY&MrcY&&M`cYw&MJcY &M4cYr& cYRw&&&cY.&MۓcY &ېcY &ۊcYp&cYށz&McYR&MvcY*&M`zcY߁&&&&`hcY&&&`XcY&`FcY&M`2cYx&` cY\&&M`cY>&&&MI,TlIY|7,ѰREIp Unkwn EDC_C }DC5 DC_Soymbols Uni8t_}Lib5 LibD}Execu;}Qui?_Load_}Sqho4xtnal_Ö.nc}C{ Deni>onW C  ca>on Ruelio} C}S;4_Add.ss Extnal_.nc}E5_Poi End< MDNawme %G8g$Ŀg0g:gHgR_@*g\U@gfgpW@gzۈtp3222sp3222`v{p32Q`dp3222`Vzp322Q`Hpv3222`:pv_3222`,p322Qp32222p3222Q7,ETVuIAr N v!Unkwn Proc_Heap Ot_deX Jump_TaeCme6 MSho4_R R No_Va0tX_8K/<(>K/<(=@}`Is|IHEbI|Ic`FbbI|IK|I,RHE ', byt F disk ﮶YG/~Y$2Q8#KIߒ|IY|IlITlI|ImIKITlI|InIK~lI/B7,A~DBLOCK0 B 1;46 B 1;46s do 9match ^э<.8 l&H l.SF G3۰0ۤ̄@a,a JFπ@gЫR,ѰK )`G8/( @;nHP*8FTbnz//"nPp V_fNIВ&TlI|I/b|IlbHITlI|IlITlI/b|ImIKIPTlI/b|InIKNlITlI|I/ (gIK/ (goIK|aDbH/ag0ITlIb|II`$@g`J`lۋbHFۈbH8ۃbH*~bHۿbH^bH`~bH`rbH`fbH`ZIFF f n tm|&lȠʰm&n(_(k(nn, -F..OAE|@/// /@/(/-/.0+0,0-0.1922-7@7m9@9m: ;F;G;|<>???, "$&(*,.02468:<>@BDFHJLM?-?.^?0?<AAAAB-BABGBgBm CCD 'HHHHHH AH@HlHmHnabhnHzz~J.J@J_JoLMNNNVN^NuP@Q@QuRR@RFRGRlS@SASlT@TCTFVEW\O]^@ _@` ` . @ D F G`` n`,`8atchcke.-erex0eyfggg g g"i|igilinitt U _ b eIUMAN ZOBJIO [FILEIO \UTILITY ]GRAPHS ^TREES _REFS `PARTS aLISTS bMEMMAN cPASDEFS dMPASLIB eH(F "N" "X/Nњ*ObjIOLibdMPASLIB eMainProg ""Ep! ^@KKz`z p E8xBF@|L4Q6M4Ŕm*|N4S6O4T6P4U62Z4V`.6N3S6O3T6P3U6KZ3V̂|[4W6[3Ẁm6\4X6I\6IX|]4Y4^;@_6`6,a6/b6>cyONFIGUR~%~ hiEÐ@OPHALF ~#GB`DzsLj? r<͗ͤ^g!.m !m o2CHARS ~"B(lz&cx`>Gh:mJG k>fZfV v!(Gm !m 'E{q}.E'Eq}.E/_G&5UP_ABeginng-ר$H 'G _lRkG'Eq}.Eyz&K'Eq}.E/^G&hכ:mJG l>Gh:mJG kff[fW v!rz ߣd`NfZfV v!(Gm !m 'E{q}.E/^G&V߯DOWNAEnd-ר%~(F `n(F an0(F`FUlF(Eq}0E`f(F bo0(FbFмF(Eq}0EWlF(Eq}0EfMfR v!z LEFT H%~(F clo(F bm2(FbFйF(Eq}0E`h(F al2(F`ˁFTlF(Eq}0EVlF(Eq}0EfMfR v!z RIGH? Charact٨#G z K(Eq}=(Eiq}=qq-`@)^? v!(Eq}:t~zm -b@)^? v(Eq}A:j~ ,(F aV2,FmcVg ꆬ`2(F af1`F`1bF(Eq}0E Ω௯PDATE~$H<.φ(F bm6(Eq}:t~(Fb?? Z`p͞<~`T0GqB@re0p7@f:(Eq}:t~(F`? ȋoNSERT~qC<`F<^GBnEfLfQ v!z !z mI\gnf\fX vx!,wre~m !m ΅!m x!,wre~m !m ΅ZgFgG vD df[fW v!m udDgd*Dg$U@;g@`>.`@xf`0g`(h:mJG k>` ?gDщDRf\fX v!)c? f]fY v<_C<^G`"!)c? ! RnGi _*GnCoԩHBLOJ)<esc>Reread8P2Cursor Ks, Hڐ_fLfQ v!~z !m fPfU v!Jz fZfV v!m fZfV vG9z ʀ99WJnG\Wgdf[fW v!m udʀ9fzh:mgG kfDf[fW v!lz !*Gm !`z d`jh:mgG l=_H9fPfU v!m HFILL isond EOF.B B Nr:7(P2Decimal mb8 Fe ~,_NU aNrNCudfLfQ v!z ߣ!nz !:z ! !m ! fNfS v!{z fOfT v!m fOfT vAep df[fW v!m ud -efHhAmI R f[fW v!@z dϬhz J-e N] pCan?'t open fip~~Fe:$ (C) +81+82h App Comter,$ Inc8-Aug-8,Ptility (Monitor)0123456789ABCDEF NuS@W`Ƞ`$ane egEfi@gillemenn nippeto$VZb  "$&'248<FPV\bntz~:FRXhn,@`bzC.@.R2t  . A U S.6LFFTU|CG| <    ( . ? A C F I N V [ _ m n o""'S't(c(m) ,_-8-A......2.O///-/.000-0.10192282: ?? ?r@?XCZKBX$CZKBXYRmSAݽ\ ?$%!lET[EC[EYg ¿%@XE Mnabl  ͡yOB5@g^ UPNEX[E [EY SVgۿ J`W@/C D?|ead:V(C@@0C&m=f ۿ',C2(A-(U^  &m=f `BEW[EO@XEQ[E [EYE Hopenx{TEXTZ)hw6Ev[Eu[EYEr[EYEYc%AbEf[&edqEYaRg@&@&9E][)&poq@&4)&n=㖈gt@ojI[JGoRHzh/.. W@_V G_g4 n//.Hz:Hn?< _C?<Pp S@n0.N^.NuETFNAME.OBJ.OBJ [.OBJ] ? JoNVH nf./- Hz(Bgz/- /. ?<h/- HzBgz`J/- HzBgz/- /. ?<h/- HzBgz/- /.?<h/- HzBgz/-Hn?<P2/-&HnJ.@8JDf n `2p6A Af n `B~B.6p@ @ WG^gRG`6p@ @$f|RGG]D  g6p@k|?nA2IDA0 <f>.g ,` /p /,6p@|0H܀RG.@G]D`^6p@k|OnAx2IDA0 <W.g2 , r Ё6pA|AHҀ,RG.@G]D`z`4 n LN^ _NETLINT H~]) ? ], [ ( [] ?  for Default [NV,_NULBgBg/- HzBgz/- HzBgz/- n/- HzBgz/- n/- nHm?</- HzFBgz/- n/- n/- HzBgz/- n/- HzBgz?<HmP/< /< N/- HzBgz?<HmT/</<N/- HzrBgz?<HmX/<@/<@N/- Hz6Bgz?<Hm\/</<Np/- n/- HzBgzHmdN-d@J@oHmAd?<P/Bg`J_fB-/-HmL:/-HmF -f/- Hz`Bgz/- n/- Hz>Bgz?<Hm/-P/-N/- HzBgz?<Hm/-T/-N -ܰl+m/- HzBgz?<Hm/-X/-Nn/- HzBgz?<Hm/-\/-NL -䰭l+m/-/-L8/-/-L,/-Hm|/- nJ-W- -W@g- g/- HzBgz/- n`8/-<bJ_g$/- HzBgz/- HmdBgz/- n`$/- HzzBgz/- HmdBgz/- n-d@J@f/- n/- Hz*Bgz/- nN]NuN^NuETSIZESThat's all folks! ...Unable to open file: Error while closing file: No Executable Block found. Max Heap: Min Heap: Max Stack: Min Stack: 'Value: Default: File:File to change: Max Heap: Min (Initial) Heap: Max Stack: Min (Dynamic) Stack:  Set Defaults: $Enter numbers in decimal or hex ($). (c) 1983 Apple Computer, Inc.7-Mar-83)SetSizes - Set Sizes for Heap and Stack P&Rf J"`$!H&%n.(6:*G,N" 6N"jN"N"VN"N"4N"N"@N&4N(N(N* $N*N*zN*N*N*8N,N,N,N,vN,N,N,N,N,N,N,"X/NрMainProg .fNV/BGNE.Nu o/><hNE. _XON o/><jNE. _XON _/><lNE.N/><NE.L2"_2N _ /><NE.N _/><NE.N _0/><NE.NL20/>< NE.N _/>< NE.N0/2/4/ o"oH 0$|&|@SB46Q |"|@L /><NE. _N/><NE.Nu/6/4/ 2/ 0//><NE.& _PON/><NE.Nu/><nNE.Nu/><pNE.Nu0/2/4/ o"oH 0$|&|@SB46Q |"|@L /><NE. _N _ /><NE.N/><NE./@Nu/><NE./HNu o/><NE. _XON/><NE.?@Nu _0/><NE.N _0/>< NE.N/><NE.?@Nu _0/><NE.N/><"NE./@Nu _ /><$NE.N/><&NE.Nu _ /><(NE.N/><*NE.?@Nu _0/><,NE.N _ /><.NE.N/><0NE.Nu _" /><2NE.N/><8NE.?@Nu _/><4NE.NL//><6NE.""""&NL2H/><<:NE.222"LxN/><>NE.L""_"N _" /><@NE.N _/><BNE.N/><rNE.@Nu _/><tNE.N/><DNE./@Nu o/><FNE. _XO"_2N _0/><HNE.N _"0/><JNE.N _"0/><LNE.N _0/><NNE.N/><PNE.LH22222LNLH02468/><RNE.LN"oH02468/><TNE.LL"XON/><XNE./@Nu _ /><ZNE.NL H/><\NE.22222LNN^NuHWINTL JoNVH nCJp@"S@nHnHn?HnBgNHnHn?<Hn?<NFg6/- HzDBgNX/- H/?<N/- H/?<N/- NLN^.NuONFILE Bad countJoNVH nCJp@"S@npBAA0 AJGonHn?< S@?Hn:NFA:?< N lCFWN _02@>N _0_>N _ .N _0_>N _02i>N _02i>N _0".NNV0. 2. SA n .g gQRH` fQRHSHN^"_ >N "_ _/ BgRHB Q$_ @N _Hz/N  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~JoNVpp A/NpBA6=A N^ _TONPPERCHAJoNV-n N^.NuFTOPFIBJoNV/ B/.N(_A-H n"n0(Q=@ (_N^.NuFILESIZJoNVB/. N-_ n"n26N^ _PONGETDATEJoNV/ B/. NZ(_9n6|(_N^ _\ONCHANGEDJoNVH>.<. n0.BA0 A^fRGB`z nB@0p @=fh n@GfE` n @F=@BD`*Bg/. R@?/. F?N~gE`RDino  @` nB@0p n BA0`@V nBA0p A#V nAG] n AF]g  @`.RGRF n@Gl n @F]DWD@LN^ _ NMATCHPAJoNVN^NuINIT JoNVHB-wB.+np n"n@BA0 A:g* n//.HzHnf?<N _Cfp S@n0Hn/.?HnDN ACDp S@n0A/N. n/Hn"mp"QHiHzZHn?<N _Cp S@n0|w|HnBgN mp P"n2LN^ _NSETVOLU:/:JoNVH&n-wg mp P0-thn mp P0-tIA"L\p S@n0BgHmx?<Hn?<NjgX L\"K""""0,TS@H//<N 0,HП'@0,T7@0,@@7lRmt| `Rmt`RB. B-wLN^.NuNEXTNAMNV,_H0/2/4/@l // ?<\NN@o // ?<\NNL/W\NuN^Nu%_RCHCK NV,_H/H4/@l // ?<`NNL/WXNuN^Nu%_SRCHK NV,_NuN^Nu%_BEGIN NV,_NuN^Nu%_END NV,_H瀀 |0< BXQLNuN^Nu%_INIT NV,_"_0 _/ HdR@H>Hz /??<$NNL|NuN^Nu%_NEW NV,_"_ _/ H>Hz /?<(NNL|NuN^Nu%_MARK NV,_"_ _/ H>Hz /?<,NNL|NuN^Nu%_RELSE NV,_BHHz?<0NN /o@?@@/H`ҶBgRBSIxN.` SBl(NN^Nu%R_PAOC pNdp N^pNXSDjNuNV,_$_4"_ _/ /$IBJ(fNJ(f g gRSBn(NuBDgBDN`JgSRBSxN`N^Nu%R_STR NV,_H o@BBFBN~ g +g -fSRFNd g> gJRF0m nHH& HC ԃԀ`JgD/B@LNuJFg(NBFBGB`JFgxNSFg&HBH„ HCHB6HC 4`~N^Nu%R_I NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_NuN^Nu%_TERM MainProgSegInit JoNVH;| T;|Z;|V;|X;|L;|R;|N;|Pp+@jB\p+@fp+@b.'@gR$.#@gS (n$0.@A4&H f A)H$`)n$)n()n ,)n0Bl )n ( . r &@p HH&'K'K)K)K/ / /N )@9n)mj0.S@=@BG` @)4 @A4)HRGinop;@J|=nx` @<RDino/ A/ @?<N S@9@=lBE` l @BREinoB,"-L(B-I-ag/ NLN^ _ NZINIT MainProgSegHzColJoNVH*.-ag/- HzBgNX/- NR/N E-h(n B-Tع]]gB0@?@H.H@gS@g S@gS@g``` .܇``(.-T(` oJ&L.H@J@f..` 0.@?H. .((-DH@J@f // N`ǹg~0@?@H.H@S@gS@g6`VJll E0,jD@HШ -@` 0,HЅ-@ KX"n"`" E h/Bg//,N0 _@"KT!/ / ?NĹ f, .gX/- HzBgNX/- /?<Nj/- Hz^BgNX/- /?<Nj/- <)?<Np/- NR?<N//. /N-FLN^ _ NBMAKEBK*) <> cbFreeFound (cbBk ( MakeBkfBeforeJoNVH(nB/ /0-J| H/N,0-J| Hnv/ /N0-JHД(/ /0-JH"/N0,|S@=@>,` @)4 @A4)HRGino0,|9@0-JH",)A-l -ag/ NLN^.NuMAKEMORJoNVH,. .fgb F(P F&hoTH@J@f .` 0@?@H.\IA AWg LT-H/A/<N`LN^ _PONELEASEBJoNVH..B// nob ( ; fDirty:; ubt: ; N; ipn: Std; oh: ) <> bk^.data (Back pointer error - h^ (Nrel ; bkfPrv: Free; bkfNxt: ; tybk; cb:bk: JoNVH(n|I/- HzBgNX/- / ?<Nj/- HzBgNX/- /?<Nj/- HzBgNX/- /,?<Nj/- HzBgNX/- /,?<Nj/- NR/- HzTBgNX/- /, ?<Nj/- Hz(BgNX/- 0,H/?<Nj/- HzBgNX/- /,?<Nj/- HzBgNX/- /,?<Nj/- NR/- HzBgNX/- /,?<Nj/- HzpBgNX/- 0,H/?<Nj/- HzBBgNX/- ,"HH/?<Nj/- HzBgNX/- 0, H/?<Nj/- NR&T\_gB/ / N`/- HzBgNX/- NRB&lB/ / Nޟ&kf r gR/- HzvBgNX/- /?<Nj/- HzHBgNX/- /,?<Nj/- <)?<Np/- NRB-ILN^.NuXHZ ) <> hz^.cbFree( cbFreeT ( Free List: , ipnCur: , ubtCur: , mskIpnLst: rgpnob: , cbFree: , hFstFree: , ipPoolMac: pBase: , bkfFst:  bkLst: , bkFst: hz: Jo\NV\/ n CJp"S@n2(n/- Hz6BgNX/- /,?<Nj/- <)?<Np/- NR/- HnBgNX/- NR/- HzBgNX,HgS@g S@g0S@g>S@gL`ZA\Cp S@n`HA\Cjp S@n0`4A\C2p S@n`"A\Cp S@n`A\Cp S@n/- Hn\BgNX/- NR/- HzBgNX/- 0.H/?<Nj/- HzNBgNX/- /.?<Nj/- <)?<Np/- NR/,N(_N^ _NEAPERR >; Suspected bad value: ( Error ID: <&Contiguous check of named objects pool'Contiguous check of master pointer pool"Free master pointer list traversalFree block list traversalContiguous block checkError found during *Heap error found during check heap. hz: (JoNVH&n(n l\ l_DgnH@J@f  n `0@?@H n H@.H@g?<H@H/Hz/.NH@gS@gvS@gS@g` l +\ l"+_ l"+\ l"+_D(+-k DW" nW`Jkl l0+jD@HШ ,` 0+HЬ, KX-H F gB?</Hz/.N`@Bg/,/+N=_ KT* l h0.@gB?</HzL/.N`?</ Hz&/.NGLN^ _NCHKBK vBk out of boundsName mismatch in tybkN block#Back pointer error in tybkStd block!tybk does not match expected typeJoNVH(nB,BG l&P l\ l_ G]g0Bg/ H@Hn/.Nl_,gBG`RG`LN^.NuHECKCONJoNVH(n| l&hBBg/ BgHn/.N_,gޮ&k lW,  l^@g r lV,g?< /Hz/.N&LN^.NuHECKFRE Too many (few) free bytes foundJoNVH(n| l&hBjV l2(H\ lA4_ l"l2)AA4^g&SR`jg4 l0(Hl?</Hz/.Nh`?</ Hzv/.NT|B l0(S@=@BF` l @*04 l"l0)@A4nN ll&R Y-@Bg/.<Hn/.Nv_`?< l @/04Hz/.N`2jV lA4^g?< l @/04Hz|/.NRFinoT Є l2(Hg?< Є/Hz/.NbLN^.NuHECKPTR(free + used master pointers <> ipPoolMacmaster pointer out of boundsmaster pointer out of boundsMaster pointer out of bounds%Too many master pointers in free listJoNVH(n| l=hBG`6 l h @&p g U,Bg/<Hn/.N_RGinoLN^.NuHECKRGPJoNV/N/Nf/N&/NnN^.NuHECKHZ &MainProgSegHz :JoNVH&n-ag/- HzBgNX8<<<>+ =GBE k @(p g@,f8Bg+"H,HA??<N0<_=@no<8.RE EgBg R@??+N>ng`=F 7G -ag/- H/?<Nj/- NRLN^.NuPNCHOOS IpnChoose: JoNV/ n0-NH"(AJll-mb `0,H".-A (_N^.NuZFROMH JoNV/ (n l!l l!l n f n !l(_N^ _PONELETEBKJoNVH(n ../.p/Nv( G)h G h&h)K'L G h!L G!LLN^ _ NAKEBKF JoNVH,. F(h . Ї&@ FlH@J@f*// N Д(` F]\g-L``(l Ff-m\``LN^ _PONKFINDCBJoNVH n (h&L-ag^/- HzBgNX/- /.?<Nj/- HzBgNX/- / ?<Nj/- HzBgNX/- / ?<Nj/- NR(l n g\^g&L`|-ag$/- Hz8BgNX/- / ?<Nj/- NR-KLN^ _PONKFLOW &BkfLow: , bkfLow1: , bkf: bkMin: JoNV/- Hz.BgNX/- NR?<NBnN^ _\ONBNOMOREZone too smallJoNVH(n ..Bg??.-ag,/- HzBgNX/- H/?<Nj/- NR/ N Gg l @&p g+g K\*///,0N/ l @A/<Nh l @BBg R@??,N> l @&p g< l @BBg/ /N< l @Jg?<N l @!`-ag/ NLN^ _\ONREEIPN FreeIpn - ipn: JoNVH(n -ag*/- Hz`BgNX/- 0.H/?<Nj/- NRBg/ Nh> Gg/ ?N|0.Ho`LN^ _\ONETCBFRESetCbFree - cbFree: JoNVH(n>. ,. -ag/- HzBgNX/- /?<Nj/- HzBgNX/- H/?<Nj/- HzBgNX/- .HH/?<Nj/- HzBgNX/- / ?<Nj/- <)?<Np/- NR/ NBgBg.HAT@20GRA?? | Ho/ | ?NpB/ H/N&_\fB/ ?N4&_\f F f` .f@\]g 8`, \", Ҽ^g , 8` F f`/ / N * | HnH Ї-@/ /.H /N`>H ,)@ H@?SS.H@H?.HS@gS@gS@g` KT"F"` KX"F"7D` KT"F"LN^ _ NLLOCBK , , , AllocBk(JoNVH&n (kjf B/ N|(_jg('T/ / ?.<N ff ('L(mj-L-ag/ NLN^ _\ONALLOCATJoNV/. A/?.<N(-n-ag/. NN^ _\ONALLOCATJoNV n Y-@ n0@?@Y@=@N^ _PONBDATAOFJoNVH(n&n .HAL@20H , F0@?@>H Ь)@/ /H/NA4\]g&)KLN^ _ NREEBK JoNV/. /.<NjN^ _PONREEH JoNV/. A/<N>N^ _PONREEP JoNV/. Bg/. /.NNN^ _PONREEN JoNVH,. -agF/- HzBgNX/- /?<Nj/- HzBgNX/- 0.H/?<Nj/- NRB/.?.N&_ Y(@:, F Y.Bg0@?? G0@??N0@U@8 LT/ GT/?N G1E F& LX"F"/./ <N,LN^ _ NHANGESI , cbNew: ChangeSizeH - h: JoNVH(n*. 8.-agH/- Hz BgNX/- /?<Nj/- HzBgNX/- H/?<Nj/- NR/N @H",/r/Nv"Ҁ,o/ ?N/ A/?<N n nl" nhBg/ /N> l @Jg?<N l @!,"HR@@" n\-H-ag l @ p/N/ NLN^ _ NCREATEN , cbData: PCreateNob - nSrc: JoNVH(n ..-ag/- HzBgNX/N l/Bg/ /N0 _@&p fB/ /Bg//,(NNF, l/Bg/ /N0 _@&p* KXPP@Bg///,,N gB/ Bg/ /NN`& l/Bg/ /N0 _@&p K\,k` l" K\,-FLN^ _PONMAPN PMapPn - pnSrc:JoNVH,. -ag,/- HzpBgNX/- .HH/?<Nj/- NRBG Fhn* F h @(p g&L.f /?N"`RG`LN^ _\ONLEANIFICleanIfil - ifil:2MainProgSegStd JoNV nam0.| =@`=n=n N^ _TONPPERCH JoNVH(n~@Gm /BgBA4p?N2 RG`LN^.NuAKESPUPJoNVH(n .g. T0,A&H0,l??< / N^> l=@`0 T0,S@A&H0,l??< / N^>0,S@G=@-og/- HzBgNX/- .HH/?<Nj/- HzBgNX/- 0,H/?<Nj/- HzbBgNX/- 0,H/?<Nj/- Hz6BgNX/- H/?<Nj/- NRLN^ _\ONCHCR 2, dchT: , ichLim: , ichFst: IchCr - fFwd: JoNVH&n/- HzPBgNX/- / ?<Nj/- Hz(BgNX/- 0+H/?<Nj/- HzBgNX/- 0H/?<Nj/- NR>JGg(K/- HzBgNX/- H/?<Nj/- HzBgNX/- / ?<Nj/- HzjBgNX/- 0H/?<Nj/- Hz>BgNX/- 0,H/?<Nj/- NR>`nLN^.NuXLLD L , ollePrv: , olleNxt: , lle:  olle: , olleFreeFst: , olleLim: lld: JoNVH,.:.(. -og/- Hz*BgNX/- /?<Nj/- Hz BgNX/- H/?<Nj/- HzBgNX/- D0H/?<Nj/- HzBgNX/- n0H/?<Nj/- <)?<Np/- NR(F nJPg* nPf n0JTg &F7lJlg&F6 D8 DJPg, D0HІ. G9h GJhg &F G6 G1E`Bl D0LN^ _NOVEOLLE, , , MoveOlle(JoNVH(n >. Bn0.Gln/ ?/ HnNvn`LN^ _PONNITOLLEJoNV/- HzzBgNX/- <?<Np/- 0.H/?<Nj/- Hz$BgNX/- NR`N^ _TONREAK ,# - go into the debugger to continueBreak: JoNV0. nl=n `=n N^.NuMIN JoNV0.n l=n `=n N^.NuMAX JoNV/./. ?.NxN^ _ NOVERGCHJoNVH.. n P"n0)A(H G P"G0)A&H/ / G"G0(i?NdLN^ _PONOVEACHAJoNV0.H n 00.HH@J@ n0N^ _ NIVMOD /WTOA?HNu _>FWN _02@>N _.N _02A>N _02BWAgN _02i>N _02i>N _0"_""N _02i42_0BA2N _20F@2_Qh>N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.N _"W.NNVH` n B6($."HAAYƒ "h g$qg RACgX`=ALN^ _PONNVH|BA6. "n 8.4CBAg0@qm2`6`0@qm =C` =A`L>N^ _PON B2 _"_/JAg(?04 BJd4m SAQNuSA QNu4 Amܱm0HdSA0HS@"QAfNu0Hd SA0HS@# QAg`VOLMGR fUNITSTD UNITHZ DEFSTD  ,)@ H@?SS.H@H?.HS@gS@gS@g` KT"F"` KX"F"7D` KT"F"LN^ _ NLLOCBK , , , AllocBk(JoNVH&n (kjf B/ N|(_jg('T/ / ?.<N ff ('L(mj-L-ag/ NLN^ _\ONALLOCATJoNV/. A/?.<N(-n-ag/. NN^ _\ONALLOCATJoNV n Y-@ n0@?@Y@=@N^ _PONBDATAOFJoNVH(n&n .HAL@W^4P-H r H r^;---------------------------------------------------------------- ; ; Desk Ornament for displaying the heap. ; Written by Jerome Coonen 29 July 83. ; Based on the great-great-grandson of the canonical ; Papa Hertzfeld ornament. ; ; Modification History: ; ;----------------------------------------------------------------- 0.INCLUDE tlasm:SYSEQU.TEXT 0.INCLUDE tlasm:GRAFEQU.TEXT 0.INCLUDE tlasm:SYSMACS.TEXT 0.INCLUDE tlasm:GrafTypes.Text 0.INCLUDE tlasm:ToolEqu.Text 0.INCLUDE tlasm:QuickMacs.TEXT 0.INCLUDE tlasm:ToolMacs.Text 0.INCLUDE tlasm:ResEqu.Text 0.INCLUDE tlasm:HeapDefs.Text 0.PROC Uriah cMenuID .EQU -666 ; a random resource ID cSizeRecord .EQU 100 ; random size of ornament storage cMenuHandle .EQU 0 ; offset in orn storage for menu handle cUseHeap .EQU 4 ; set to heap to display cAutoUpdate .EQU 8 ; boolean -- update every 10 seconds? OrnEntry 0.WORD $2400 ; ctl-enable = needsTime 0.WORD 300 ; take a hit every 5 seconds 0.WORD $0002 ; mouse down 0.WORD cMenuID ; ; Entry point offset table 0.WORD OrnOpen - OrnEntry ; open routine 0.WORD OrnDone - OrnEntry ; prime 0.WORD OrnCtl - OrnEntry ; control 0.WORD OrnDone - OrnEntry ; status 0.WORD OrnClose - OrnEntry ; close OrnTitle .BYTE 11 ; length of string 0.ASCII 'Uriah Heap ' ; title ; Open Routine -- allocate a window, initialize the count, allocate menu OrnOpen 0MOVEM.L A3-A4,-(SP) ;preserve regs 0MOVE.L A1,A4 ;keep DCE ptr in A4 0TST.L DCtlWindow(A1) ;already have a window? 0BNE GotAWindow ;if so, don't make a new one ; ; now allocate the new window ; 0CLR.L -(SP) ; make room for the result 0CLR.L -(SP) ; allocate on heap 0PEA cBounds ; push the boundsRect 0PEA OrnTitle ; push the title 0CLR.L -(SP) ; invisible/use defProc 0 0MOVEQ #-1,D0 ; get -1 0MOVE.L D0,-(SP) ; behind = -1 0MOVE #$0100,-(SP) ; yes, we have a goAway 0CLR.L -(SP) ; refCon is zero 0_NewWindow ; allocate a new window 0MOVE.L (SP)+,A0 ; get the windowPtr 0MOVE.L A0,DCtlWindow(A4) ; save in the DCE 0MOVE DCtlRefNum(A4),windowKind(A0) ; mark as system window ; ; Font stuff, as though we were going to write in the window. ; 0MOVE #4,TxFont(A0) ; use Gacha 0MOVE #10,TxSize(A0) ; size 10 0MOVE #srcCopy,TxMode(A0) ; ; Get a relocatable block for static values. ; 0MOVE.L #cSizeRecord,D0 ; Get the local storage 0_NewHandle 0MOVE.L A0,DCtlStorage(A4) ; save the storage handle away ; ; Allocate the menu. Initialize the check-off menu items. ; 0SUBQ #4,SP ; make room for menu handle 0MOVE.W #cMenuID,-(SP) ; push menu ID 0PEA cMenuTitle ; Allocate the menu 0_NewMenu 0MOVE.L (SP)+,A2 ; save menu handle in temp. 0MOVE.L DCtlStorage(A4),A3 ; Get the storage handle 0MOVE.L (A3),A3 ; dereference it 0MOVE.L A2,cMenuHandle(A3) ; salt menu handle away in storage 0MOVE.L ApplZone,cUseHeap(A3) ; set so application heap shown 0MOVE.B #$01,cAutoUpdate(A3) ; do automatic updating 0MOVE.L A2,-(SP) 0PEA cMenuItems ; Set the items 0_AppendMenu 0MOVE.L A2,-(SP) ; get the menu handle 0MOVE #2,-(SP) ; application heap 0MOVE.B #1,-(SP) ; push the boolean 0_CheckItem 0MOVE.L A2,-(SP) ; get the menu handle 0MOVE #4,-(SP) ; auto update 0MOVE.B #1,-(SP) ; push the boolean 0_CheckItem GotAWindow 0MOVEM.L (SP)+,A3-A4 ;restore regs OrnDone 0MOVEQ #0,D0 ;no error 0RTS ;all done with open ; ; Close Routine -- to close the ornament, we dispose the window and menu ; OrnClose 0MOVE.L A4,-(SP) ; save A4 0MOVE.L A1,A4 ; save A1=DCE from Pascal routine 0MOVE.L DCtlWindow(A4),-(SP) ; push the window 0CLR.L DCtlWindow(A4) ; we no longer have a window 0_DisposWindow ; dispose it 0BSR CloseStorage ; allocate the menu, etc. 0MOVE.L DCtlStorage(A4),A0 ; Delete the storage area 0_DisposHandle 0MOVE.L (SP)+,A4 ; restore sole saved register 0BRA.S OrnDone ; all done with close ; OrnCtl handles the control messages, which are the heart of the driver. We case out on ; the "opCode" field, which is 64 for "SendEvent", 65 for "Run", 66 for "Cursor", ; and 67 for "Menu". Ignore messages less than 64 or greater than 67. OrnCtl 0MOVEM.L A2-A4,-(SP) ; preserve A3 and A4 0MOVE.L A1,A4 ; keep DCE ptr in A4 0MOVE CSCode(A0),D0 ; get the control opCode 0SUB #64,D0 ; compare message with 64 0BMI.S CtlDone ; < 64 -- just ignore 0BEQ DoCtlEvent ; = 64 -- it's an event 0SUBQ.W #2,D0 ; compare message with 66 0BMI.S DoRun ; = 65 -- run request 0BEQ DoCtlCursor ; = 66 -- cursor 0SUBQ.W #1,D0 ; compare message with 67 0BEQ.S DoMenu ; = 67 -- menu request 0BRA.S CtlDone ; > 67 -- ignore ;------------------------------------------------ ; DoRun 0MOVE.L DCtlStorage(A4),A3 ; get the heap 0MOVE.L (A3),A3 ; dereference it 0TST.B cAutoUpdate(A3) 0BEQ.S @1 0BSR DrawWindow ; then fall through... @1 ;------------------------------------------------ ; CtlDone 0MOVE.L A4,A1 ; return DCE ptr to A1 0MOVEM.L (SP)+,A2-A4 ; A3 and A4 0MOVEQ #0,D0 ; no error 0RTS ; bye-bye ;------------------------------------------------ ; DoMenu 0MOVE.L DCtlStorage(A4),A3 ; get orn storage handle 0MOVE.L (A3),A3 ; dereference it 0MOVE CSParam+2(A0),D0 ; Get the menuItem 0SUBQ #1,D0 ; See if item 1 0BEQ.S SetSysHeap 0SUBQ #1,D0 ; See if item 2 0BEQ.S SetAppHeap 0SUBQ.W #2,D0 ; Can't be 3 0BEQ.S SetAutoUpdate 0SUBQ.W #1,D0 0BEQ.S HandUpdate 0BRA.S CtlDone SetSysHeap 0MOVE.L SysZone,cUseHeap(A3) ; set so sys heap shown 0MOVE.B #00,D0 ; not the application 0BRA.S ToggleHeap SetAppHeap 0MOVE.L ApplZone,cUseHeap(A3) ; set so application heap shown 0MOVE.B #01,D0 ; the application ToggleHeap 0MOVE.B D0,-(SP) 0MOVE.B #2,D1 0BSR.S MarkIt 0MOVE.B (SP)+,D0 0EOR.B #01,D0 ; flip it 0MOVE.B #1,D1 ; 0BSR.S MarkIt ; ; Erase the display window before drawing other window. ; 0MOVEA.L DCtlWindow(A4),A0 ; get port 0PEA portRect(A0) ; push rect for EraseRect 0PEA (A0) ; push the window for SetPort 0_SetPort ; make it the port 0_EraseRect 0BSR DrawWindow 0BRA.S CtlDone ;------------------------------------------------ ; D0 contains boolean true or false ; D1 contains item number ; A3 contains local storage ; markIt 0MOVE.L cMenuHandle(A3),-(SP) ; get the menu handle 0MOVE D1,-(SP) ; push the item 0MOVE.B D0,-(SP) ; push the boolean 0_CheckItem 0RTS ;------------------------------------------------- ; Flip auto-update boolean ; SetAutoUpdate 0MOVE.B cAutoUpdate(A3),D0 ; get auto flag 0EORI.B #1,D0 ; toggle it 0MOVE.B D0,cAutoUpdate(A3) ; replace ;------------------------------------------------- ; Common menu update code ; MarkMenu ,MOVE.W CSParam+2(A0),D1 ; item number ,BSR.S MarkIt ,BRA.S CtlDone ;------------------------------------------------- ; Just redraw the window ; HandUpdate 0BSR DrawWindow 0BRA.S CtlDone ; ; DoCtlCursor might be used to change the cursor shape when over our window ; and back to the arrow when it's not. ; DoCtlCursor 0BRA.S CtlDone ;all done ; ; DoCtlEvent handles the events received by the memWindow ornament. It handles ; mouse down, keyDown and update events ; DoCtlEvent 0MOVE.L A3,-(SP) ;save registers 0MOVE.L CSParam(A0),A3 ;get the event pointer 0MOVE.W EvtNum(A3),D0 ;get the event number ; case out on the event number. We handle events 1 (mouse down), and ; 6 (update event), 0CMP #8,D0 ;is it an activate? 0BEQ DoTheActivate ;if so, go handle it 0SUBQ #1,D0 ;is it mouse down? 0BEQ.S ItsMouseDown ;branch if it is 0SUBQ #2,D0 ;is it key down? 0BEQ.S ItsKeyDown ;branch to handle keyDown 0SUBQ #3,D0 ;is it an update? 0BEQ.S ItsUpdate ;if so, handle it ; its not an event we handle so ignore it CtlEvtDone MOVE.L (SP)+,A3 ;restore registers 0BRA CtlDone ; ignore keyDowns for now ItsKeyDown 0BRA.S CtlEvtDone ;all done ; handle the update event by redrawing the contents of the window ItsUpdate 0MOVE.L EvtMessage(A3),-(SP) ;push the window ptr 0MOVE.L (SP),-(SP) ;push it again 0_BeginUpdate ;set vis to update 0BSR DrawWindow ;draw it 0_EndUpdate 0BRA.S CtlEvtDone ; handle the mouseDown by calling FindControl and tracking the control if its in one ItsMouseDown 0BRA CtlEvtDone ;all done! ; DoTheActivate either puts shows or hides the scroll bar, depending on ; the state of the activate bit. DoTheActivate 0BTST #0,EvtMeta+1(A3) ; activate or de-activate? 0BEQ.S TakeItDown ; if deactivate, take it down ; show the menu 0MOVE.L DCtlStorage(A4),A3 ; Insert the menu item 0MOVE.L (A3),A3 ; dereference it 0MOVE.L cMenuHandle(A3),-(SP) ; 0CLR.W -(SP) ; on the end 0_InsertMenu 0_DrawMenuBar ; Display it 0BRA CtlEvtDone ; all done ; ; hide the menu ; TakeItDown 0MOVE.W #cMenuID,-(SP) ; Delete the menu from bar 0_DeleteMenu 0_DrawMenuBar ; Redisplay it 0BRA CtlEvtDone ; ; CloseStorage deallocates the menu and sets up local memory ; CloseStorage 0MOVE.W #cMenuID,-(SP) ; Delete the menu from bar 0_DeleteMenu 0_DrawMenuBar ; Redisplay it 0MOVE.L DCtlStorage(A4),A0 ; Delete the menu data 0MOVE.L (A0),A0 0MOVE.L cMenuHandle(A0),A0 ; get handle in A0 0_DisposHandle 0RTS ; ; DrawWindow scans the heap and redraws the window. ; DrawWindow ,MOVEM.L D3-D6/A2-A3,-(SP) ; save work regs ,MOVE.L DCtlWindow(A4),-(SP) ; push the window ptr twice for ,MOVE.L (SP),-(SP) ; SizeWindow and setport ; ; Initialize the topLeft pointer (D6) to 0,0. ; Then work down and to the right. ; ,MOVEQ #0,D6 ,MOVE.L DCtlStorage(A4),A3 ; get the heap ,MOVE.L (A3),A3 ; dereference it ,MOVE.L cUseHeap(A3),A3 ; get zone ptr ; ; Size the window by computing the heap extent and dividing by 260 to get ; the number of columns of pixels. Force width up to a multiple of 8 and ; require a minimum. ; ,LEA HeapData(A3),A1 ; ptr to first block ,MOVE.L A1,D1 ,MOVE.L BkLim(A3),D0 ; ptr beyond last usable block ,AND.L maskBC,D1 ,AND.L maskBC,D0 ,SUB.L D1,D0 ; size of heap in bytes ,DIVU #260,D0 ; number of pixel columns ,LSR.L #3,D0 ; divide by eight... ,ADDQ.L #1,D0 ; round up... ,LSL.L #3,D0 ; and multiply by eight ,CMPI.W #152,D0 ; a reasonable minimum ,BHS.S @2 ,MOVE.W #152,D0 @2 ,MOVE.W D0,-(SP) ; width ,MOVE.W #260,-(SP) ; fixed height ,MOVE.B #0,-(SP) ; FALSE, no update ,_SizeWindow ,_SetPort ; make it the port ,LEA HeapData(A3),A0 ; ptr to first block, for loop Continue ; ; Compute the next pointer right away. For the purposes of displaying even ; blocks of 8 bytes, round the first pointer down to nearest 8-byte block. ; ,MOVE.L tagBC(A0),D0 ; size/tag ,MOVE.L handle(A0),D1 ; handle ,MOVE.L D0,D2 ,ANDI.L #BCMask,D0 ; block size in bytes ,MOVEA.L D0,A2 ,ADDA.L A0,A2 ; ptr to next block ,MOVE.L A0,D0 ,ANDI.L #$FFFFFFF8,D0 ; kill low 3 bits ,SUB.L A2,D0 ,NEG.L D0 ,LSR.L #3,D0 ; number of indicator lines ; ; Now set up the pen pattern in A0 for call to display routine. ; ,MOVEA.L 0(A5),A1 ; get global ptr for graphics ,LEA white(A1),A0 ; pen pattern for nonrelocatable ,AND.L #TagMask,D2 ,BEQ.S FreeBlock ,BGT.S GotBlock ; ; Classify the relocatable blocks as ; (1) unlocked and not purged ; (2) locked ; (3) purged ; ,LEA dkGray(A1),A0 ; assume (1) unlk and not prgbl ,MOVE.B 0(A3,D1),D1 ; master ptr, if relocatable ,BMI.S LockedBlock ,ADD.B D1,D1 ; get purgeable bit in sign ,BPL.S GotBlock ,LEA PurgeablePat,A0 ; purgeable relocatable ,BRA.S GotBlock LockedBlock ,LEA ltGray(A1),A0 ; locked relocatable block ,BRA.S GotBlock FreeBlock ,LEA black(A1),A0 ; free block GotBlock ,BSR.S ShowLines ,MOVEA.L A2,A0 ; get next block pointer ,CMP.L bkLim(A3),A0 ; see if at end ,BNE Continue ,MOVEM.L (SP)+,D3-D6/A2-A3 ,RTS ;------------------------------------------------ ; Display D0.W lines of pattern (A0) ; D6 is the current topLeft pointer, which is updated ; after each block is displayed. ; ShowLines ,MOVE.W D0,D3 ; safe place for index ,PEA (A0) ,_PenPat ; pen pattern for PaintRect ShQuickEntry ,MOVE.L D6,D0 ; top/left ,MOVE.L D6,D1 ; will be bottom/right ,ADDQ.W #8,D1 ; right := left + 8 ,SWAP D1 ; align bottom in low word ,ADD.W D3,D1 ; tentative bottom ,CMPI.W #260,D1 ; farther down than 260? ,BHS.S ShTwoBlocks ,SWAP D1 ; align bottom/right ,MOVE.L D1,D6 ; new top/left ,SUBQ.W #8,D6 ; convert top/right to top/left ,BRA.S PaintTheRect ; Easy case -- paint and go ; ; If there is a spillover, just paint the rest of this column ; and fake another call to routine. ; ShTwoBlocks ,SUBI.W #260,D1 ; what's left after this column ,MOVE.W D1,D3 ; the next count ,MOVE.W #260,D1 ; set bottom to the real bottom ,SWAP D1 ; align bottom/right ,MOVEQ #0,D6 ; next top will be zero ,MOVE.W D1,D6 ; this right will be next left ,BSR.S PaintTheRect ,BRA.S ShQuickEntry ;------------------------------------------------ ; D0 = top/left ; D1 = bottom/right ; PaintTheRect ,MOVEM.L D0-D1,-(SP) ; push rect value ,PEA (SP) ,_PaintRect ,ADDQ.L #8,SP ; kill rect value ,RTS FreePat .WORD $FFFF, $FFFF, $FFFF, $FFFF RelPat .WORD $AAAA, $AAAA, $AAAA, $AAAA NonRelPat .WORD $0000, $0000, $0000, $0000 PurgeablePat .WORD $E7E7, $E7E7, $E7E7, $E7E7 LockedPat .WORD $BDBD, $BDBD, $BDBD, $BDBD cMenuTitle .BYTE 6 0.ASCII 'Uriah ' cMenuItems .BYTE 52 0.ASCII 'System;Application;-------' ; 26 each 0.ASCII ';Auto-Refresh;Hand-Refresh' cBounds .WORD 42,0,302,200 0.END W^5P:H r^,PROGRAM Boxes; USES {$U obj:QuickDraw } QuickDraw, %{$U obj:OSIntf } OSIntf, %{$U obj:ToolIntf } ToolIntf, %{$U obj:Sane } Sane, %{$U obj:Elems } Elems, %{$U obj:Graf3D } Graf3D; CONST boxCount = 15; TYPE Box3D=RECORD -pt1: Point3D; -pt2: Point3D; -dist: extended; +END; VAR myPort: GrafPtr; $myPort3D: Port3DPtr; $boxArray: ARRAY[0..boxCount] OF Box3D; $nBoxes: INTEGER; $i: INTEGER; $etop, ebottom, eleft, eright, temp : extended; Procedure Distance(pt1,pt2: POINT3D; Var result: extended); VAR dx,dy,dz: extended; BEGIN "dx:=pt2.X; { dx:=pt2.X - pt1.X; } "SubX (pt1.X, dx); "dy:=pt2.Y; { dy:=pt2.Y - pt1.Y; } "SubX (pt1.Y, dy); "dz:=pt2.Z; { dz:=pt2.Z - pt1.Z; } "SubX (pt1.Z, dz); "MulX (dx, dx); { result:=SQRT(dx*dx + dy*dy + dz*dz); } "MulX (dy, dy); "MulX (dz, dz); "AddX (dx, dy); "AddX (dy, dz); "SqrtX (dz); "result := dz END; PROCEDURE DrawBrick(pt1,pt2: Point3D); { draws a 3D brick with shaded faces. } { only shades correctly in one direction } VAR tempRgn: RgnHandle; BEGIN "tempRgn:=NewRgn; "OpenRgn; $MoveTo3D(pt1.x,pt1.y,pt1.z); { front face, y=y1 } $LineTo3D(pt1.x,pt1.y,pt2.z); $LineTo3D(pt2.x,pt1.y,pt2.z); $LineTo3D(pt2.x,pt1.y,pt1.z); $LineTo3D(pt1.x,pt1.y,pt1.z); "CloseRgn(tempRgn); "FillRgn(tempRgn,white); "OpenRgn; $MoveTo3D(pt1.x,pt1.y,pt2.z); { top face, z=z2 } $LineTo3D(pt1.x,pt2.y,pt2.z); $LineTo3D(pt2.x,pt2.y,pt2.z); $LineTo3D(pt2.x,pt1.y,pt2.z); $LineTo3D(pt1.x,pt1.y,pt2.z); "CloseRgn(tempRgn); "FillRgn(tempRgn,gray); "OpenRgn; $MoveTo3D(pt2.x,pt1.y,pt1.z); { right face, x=x2 } $LineTo3D(pt2.x,pt1.y,pt2.z); $LineTo3D(pt2.x,pt2.y,pt2.z); $LineTo3D(pt2.x,pt2.y,pt1.z); $LineTo3D(pt2.x,pt1.y,pt1.z); "CloseRgn(tempRgn); "FillRgn(tempRgn,black); "PenPat(white); "MoveTo3D(pt2.x,pt2.y,pt2.z); { outline right } "LineTo3D(pt2.x,pt2.y,pt1.z); "LineTo3D(pt2.x,pt1.y,pt1.z); "PenNormal; "DisposeRgn(tempRgn); END; PROCEDURE MakeBox; VAR myBox: Box3D; $i,j,h,v: INTEGER; $p1,p2: Point3D; $myRect: Rect; $testRect: Rect; $temp: Extended; BEGIN "I2X (Random, p1.x); {p1.x:=Random mod 70 -15;} "I2X (140, temp); "RemX (temp, p1.x, i); "I2X (15, temp); "SubX (temp, p1.x); "I2X (Random, p1.y); {p1.y:=Random mod 70 -10;} "I2X (140, temp); "RemX (temp, p1.y, i); "I2X (10, temp); "SubX (temp, p1.y); "I2X (0, p1.z); {p1.z:=0.0;} "I2X (Random, p2.x); {p2.x:=p1.x + 10 + ABS(Random) MOD 30; } "I2X (60, temp); "RemX (temp, p2.x, i); "AbsX (p2.x); "I2X (10, temp); "AddX (temp, p2.x); "AddX (p1.x, p2.x); "I2X (Random, p2.y); {p2.y:=p1.y + 10 + ABS(Random) MOD 45; } "I2X (90, temp); "RemX (temp, p2.y, i); "AbsX (p2.y); "I2X (10, temp); "AddX (temp, p2.y); "AddX (p1.y, p2.y); "I2X (Random, p2.z); {p2.z:=p1.z + 10 + ABS(Random) MOD 35; } "I2X (70, temp); "RemX (temp, p2.z, i); "AbsX (p2.z); "I2X (10, temp); "AddX (temp, p2.z); "AddX (p1.z, p2.z); "{ reject box if it intersects one already in list } "With myRect Do "BEGIN { SetRect(myRect,ROUND(p1.x),ROUND(p1.y),ROUND(p2.x),ROUND(p2.y)); } $X2I (p1.x, left); $X2I (p1.y, top); $X2I (p2.x, right); $X2I (p2.y, bottom) "END; "FOR i:=0 TO nBoxes-1 DO $BEGIN &WITH boxArray[i], testrect DO &BEGIN { SetRect(myRect,ROUND(pt1.x),ROUND(pt1.y) } (X2I (pt1.x, left); { ,ROUND(pt2.x),ROUND(pt2.y)); } (X2I (pt1.y, top); (X2I (pt2.x, right); (X2I (pt2.y, bottom) &END; &IF SectRect(myRect,testRect,testRect) THEN EXIT(MakeBox) $END; "myBox.pt1:=p1; "myBox.pt2:=p2; "{ calc midpoint of box and its distance from the eye } "AddX (p2.x, p1.x); { p1.x:=(p1.x + p2.x)/2.0; } "I2X (2, temp); "DivX (temp, p1.x); "AddX (p2.y, p1.y); { p1.y:=(p1.y + p2.y)/2.0; } "I2X (2, temp); "DivX (temp, p1.y); "AddX (p2.z, p1.z); { p1.z:=(p1.z + p2.z)/2.0; } "I2X (2, temp); "DivX (temp, p1.z); "Transform(p1,p2); "Distance(p2,myPort3D^.eye, myBox.dist); { distance to eye } "i:=0; "boxArray[nBoxes].dist:=myBox.dist; { sentinel } "WHILE CmpX (myBox.dist, GT, boxArray[i].dist) { myBox.dist > boxArray[i].dist } $DO i:=i+1; { insert in order of dist } "FOR j:=nBoxes DOWNTO i+1 DO boxArray[j]:=boxArray[j-1]; "boxArray[i]:=myBox; "nBoxes:=nBoxes+1; END; BEGIN { main program } "InitGraf(@thePort); "HideCursor; "NEW(myPort); OpenPort(myPort); "NEW(myPort3D); Open3DPort(myPort3D); "ViewPort(myPort^.portRect); { put the image in this rect } "I2X (-100, eleft); "I2X (75, etop); "I2X (100, eright); "I2X (-75, ebottom); "LookAt(eleft,etop,eright,ebottom);{ aim the camera into 3D space } "I2X (30, temp); "ViewAngle(temp); { choose lens focal length } "Identity; "I2X (20, temp); "Roll(temp); "I2X (70, temp); "Pitch(temp); { roll and pitch the plane } "REPEAT $nBoxes:=0; $REPEAT MakeBox UNTIL nBoxes=boxCount; $PenPat(white); $BackPat(black); $EraseRect(myPort^.portRect); $FOR i:= -10 TO 10 DO &BEGIN (I2X (i*10, eleft); (I2X (-100, etop); (I2X (0, temp); (MoveTo3D(eleft,etop,temp); (I2X (100, ebottom); (LineTo3D(eleft,ebottom,temp); &END; $FOR i:=-10 TO 10 DO &BEGIN (I2X (i*10, eleft); (MoveTo3D(etop,eleft,temp); (LineTo3D(ebottom,eleft,temp); &END; $FOR i:=nBoxes-1 DOWNTO 0 DO DrawBrick(boxArray[i].pt1,boxArray[i].pt2); "UNTIL button END. 3. "6F^5D!$ǐ^_Ξmac:boxes.rsrc Type code misc:boxesl,0 3. "6F^5D!$ǐ^CVV^HPROGRAM Edit; { Edit -- A small sample application written in Pascal } { by Macintosh User Education } USES {$U Obj:QuickDraw } QuickDraw, &{$U Obj:OSIntf } OSIntf, &{$U Obj:ToolIntf } ToolIntf; CONST lastMenu = 3; { number of menus } &appleMenu = 1; { menu ID for desk accessory menu } &fileMenu = 256; { menu ID for File menu } &editMenu = 257; { menu ID for Edit menu } VAR myMenus: ARRAY [1..lastMenu] OF MenuHandle; $screenRect, dragRect, pRect: Rect; $doneFlag, temp: BOOLEAN; $myEvent: EventRecord; $code, refNum: INTEGER; $wRecord: WindowRecord; $myWindow, whichWindow: WindowPtr; $theMenu, theItem: INTEGER; $hTE: TEHandle; PROCEDURE SetUpMenus; { Once-only initialization for menus } VAR i: INTEGER; $appleTitle: STRING[1]; BEGIN "InitMenus; { initialize Menu Manager } "appleTitle := ' '; appleTitle[1] := CHR(appleSymbol); "myMenus[1] := NewMenu(appleMenu,appleTitle); "AddResMenu(myMenus[1],'DRVR'); { desk accessories } "myMenus[2] := GetMenu(fileMenu); "myMenus[3] := GetMenu(editMenu); "FOR i:=1 TO lastMenu DO InsertMenu(myMenus[i],0); "DrawMenuBar; END; { of SetUpMenus } PROCEDURE DoCommand (mResult: LongInt); VAR name: STR255; BEGIN "theMenu := HiWord(mResult); theItem := LoWord(mResult); "CASE theMenu OF "appleMenu: $BEGIN &GetItem(myMenus[1],theItem,name); &refNum := OpenDeskAcc(name); $END; "fileMenu: $doneFlag := TRUE; { Quit } "editMenu: $BEGIN &IF NOT SystemEdit(theItem-1) (THEN *BEGIN ,SetPort(myWindow); ,CASE theItem OF ,1: TECut(hTE); ,2: TECopy(hTE); ,3: TEPaste(hTE); ,END; { of item case } *END; $END; { of editMenu } "END; { of menu case } "HiliteMenu(0); END; { of DoCommand } BEGIN { main program } "InitGraf(@thePort); "InitFonts; "FlushEvents(everyEvent,0); "InitWindows; "SetUpMenus; "TEInit; "InitDialogs(NIL); "InitCursor; "screenRect := screenBits.bounds; "SetRect(dragRect,4,24,screenRect.right-4,screenRect.bottom-4); "doneFlag := FALSE; "myWindow := GetNewWindow(256,@wRecord,POINTER(-1)); "SetPort(myWindow); "pRect := thePort^.portRect; "InsetRect(pRect,4,0); "hTE := TENew(pRect,pRect); "REPEAT $SystemTask; $TEIdle(hTE); $temp := GetNextEvent(everyEvent,myEvent); $CASE myEvent.what OF $mouseDown: &BEGIN (code := FindWindow(myEvent.where,whichWindow); (CASE code OF (inMenuBar: *DoCommand(MenuSelect(myEvent.where)); (inSysWindow: *SystemClick(myEvent,whichWindow); (inDrag: *DragWindow(whichWindow,myEvent.where,dragRect); (inGrow, inContent: *BEGIN ,IF whichWindow <> FrontWindow .THEN SelectWindow(whichWindow) .ELSE 0BEGIN 2GlobalToLocal(myEvent.where); 2TEClick(myEvent.where,FALSE,hTE); 0END; *END; (END; { of code case } &END; { of mouseDown } $keyDown, autoKey: (IF myWindow = FrontWindow *THEN TEKey(CHR(myEvent.message MOD 256),hTE); $activateEvt: (IF ODD(myEvent.modifiers) { window is becoming active } *THEN TEActivate(hTE) *ELSE TEDeactivate(hTE); $updateEvt: &BEGIN (SetPort(myWindow); (BeginUpdate(myWindow); (TEUpdate(thePort^.portRect,hTE); (EndUpdate(myWindow); &END; { of updateEvt } $END; { of event case } "UNTIL doneFlag; END. 3. "6F^5D!$ǐ^* EditResDef -- Resource input for small sample application * Written by Macintosh User Education Mac:Edit.Rsrc Type MENU ",256 "File $Quit ",257 "Edit $Cut $Copy $Paste Type WIND ",256 "A Sample "50 40 300 450 "Visible NoGoAway "0 "0 Type EDIT = STR ,0 Edit Version 1.0 - 12 December 83 Type CODE Misc:editL,0 3. "6F^5D!$ǐ^  _ { File -- Example code for printing, reading and writing files, and Text Edit } { -- by Cary Clark, Macintosh Technical Support } PROGRAM MyFile; { Please read 'more about File,' included on the Mac Master disk. } {$DECL BUG} {$SETC BUG := 0} {One good way of debugging code is to write status information to one of the serial ports. Even while debugging code which uses one of the ports, the other can be used for transmitting information to an external terminal. In this program, the compile time variable BUG is set to either -1, 0 or 1 according to the extent of the debugging information required. Since compile time variables or constants are used, setting a single flag should cause the resulting program to have no more code than is required by the debugging level requested. If BUG is set equal to -1, then no debugging information appears; this is as you would want the end user to see your product. BUG set to 0 provides an additional menu bar called 'debug' that can display the amount of memory available, compact memory, and discard segments and resources resident in memory. You can do something similar to display some debugging information on the Mac itself if you do not have a terminal, but the penalty here is that you may spend much of your time debugging the code which is intended to debug some other part of the program. Obviously, creating and maintaining a window on a screen full of other windows in untested code is a difficult thing to do. BUG set to 1 adds an additional item to the 'debug' menu that writes various runtime information to an external terminal. This is the preferred method of debugging, since it does not interfere with the Macintosh display. Even if you do not have a separate terminal, you can use the LISA terminal program to act as one. Since writing a lot of debugging information to a serial port can slow the program down, I would recommend a way of turning the information on and off. In this program, the variable DEBUG is set to true or false in the beginning of one of the first procedures executed, SETUP, to provide debugging information. The DEBUG variable may also be set by the bottom item on the rightmost menu.} {$U-} {Turn off the Lisa Libraries. This is required by Workshop.} {$X-} {Turn off stack expansion. This is a Lisa concept, not needed on Mac.} {$IFC BUG > -1} "{$D+} {Put the procedures name just after it in the code, to help in debugging} "{$R+} {Turn on range checking. Violating the range at runtime will produce a )check exception.} {$ELSEC} "{$D-} {Do not include the procedure name in the 'production' code} "{$R-} {Turn off range checking.} {$ENDC} USES {$U Obj:QuickDraw } QuickDraw, &{$U Obj:OSIntf } OSIntf, &{$U Obj:ToolIntf } ToolIntf, &{$U Obj:PackIntf } PackIntf, &{$U Obj:StdFile } StdFile, {later, this will be part of PackIntf} &{$U Obj:MacPrint } MacPrint; CONST &appleMenu = 1; &FileMenu = 2; &EditMenu = 3; &DebugMenu = 4; {See the file Misc:Fileasm about the constants below. In this example program, I only use the first two.} &TEScrpLength = 0; {the length of the private TextEdit scrap} &TEScrpHandle = 1; {the handle to the private TextEdit } &dlgFont = 2; {the font used inside alerts and dialogs} &ScrVRes = 3; {screen vertical resolution (dots/inch)} &ScrHRes = 4; {screen horizontal resolution (dots/inch)} &doubleTime = 5; {double click time in 4/60's of a second} &caretTime = 6; {caret blink time in 4/60's of a second} &ANumber = 7; {the active alert} &ACount = 8; {the alert stage level} {$IFC BUG = -1} &lastMenu = 3; { number of menus w/o debug} {$ELSEC} &lastMenu = 4; { number of menus w/ debug} {$ENDC} {$IFC BUG < 1} &debug = FALSE; { compiler will discard code after 'If debug ...'} {$ENDC} TYPE ProcOrFunc = (proc, func, neither); %edset = set of 1..9; %appParms = RECORD { params set up by Finder at launch } 2message: INTEGER; 2count: INTEGER; { how many icons did the user select } 2vRefNum: INTEGER; { for each, the volume reference #, } 2fTYPE: resType; { the file type, } 2vByte: INTEGER; { the version number (should be 0) } 2fName: Str255; { and the name. See SetUp for use. } 0END; %pAppParms = ^appParms; %MyData = RECORD {each document window keeps a handle to this in WRefCon} 0TERecord: TEHandle; {the text associated with this document} 0changed: Boolean; {the document is 'dirty'} 0titled: Boolean; {the document has never been saved to disk} .END; %MyDataPointer = ^MyData; %MyDataHandle = ^MyDataPointer; {<<< this little beauty does a form feed when you print this out. 'Copy and Paste it to move it to your source code} {Here are a ton of global variables. This is not a good programming example. You professionals, of course, will keep the number of globals in your own programs to a much smaller number than shown here.} {these first six values are changed as windows are activated} VAR MyWindow: WindowPtr; $MyPeek: WindowPeek; {MyPeek is the same as MyWindow} $WindowData: MyDataHandle; {this record is pointed to by the WRefCon.} $hTE: TEHandle; {The active text edit handle} $vScroll: ControlHandle; {The active vertical scroll bar.} $topline: integer; {the value of VScroll, also the visible top line.} $printhdl: THPrint; {initialized in SetUp, used by MyPrint} $myMenus: ARRAY &[1..lastMenu] OF MenuHandle; {Handles to all of the menus} $growRect, {contains how big and small the window can grow} $dragRect: Rect; {contains where the window can be dragged} $tempwindow: WindowPtr; {window referenced by GetNextEvent (bad pgmming.)} $theChar: CHAR; {keyboard input goes here} $myPoint: Point; {the point where an event took place} $laststate: integer; {last scrap state, to see if it has changed} $doneFlag: BOOLEAN; {set when the user quits the program} $myEvent: EventRecord; {returned by GetNextEvent} $scrapwind: WindowPtr; {the ClipBoard window, which contains the scrap} $iBeamHdl: CursHandle; {the text editing cursor} $watchHdl: CursHandle; {the wait cursor} $windownum: LongInt; {the # of untitled windows opened} $windowpos: LongInt; {the # of windows opened} $txtfile: FInfo; {'TEXT', the type of My Editor's documents} $MyFileTypes: SFTypeList; {same as txtfile, in a format for Standard File} $typelistptr: SFTListPtr; {pointer to 'TEXT', as seen by Standard File} $firstchar: Integer; {position of first character on top visible line} $printflag: boolean; {the user selected 'Print' from the File menu} $finderprint: boolean; {the user selected 'Print' from the finder} {$IFC BUG > -1} $FreeWind: WindowPtr; {the free memory window} $oldmem: LongInt; {the last amount of free memory} {$ENDC} {$IFC BUG = 1} $debug: boolean; {$ENDC} $debugger: text; {the external terminal file} $extdebughdl: StringHandle; {the menu entry} $lf: char; {chr(10), linefeed} {------------------------------------------------------------------------------------} FUNCTION GlobalAddr (routineAddr: INTEGER) : Ptr; EXTERNAL; FUNCTION GlobalValue (valueAddr: INTEGER) : LongInt; EXTERNAL; {these routines, for now, allows us to retrieve where the TextEdit private scrap is, and allow us to set its size. They are defined in Misc:FileAsm.} {$S Utilities} {------------------------------------------------------------------------------------} PROCEDURE DebugInProc (prockind: ProcOrFunc; where: str255; location: ptr); {This procedure writes the executing routine's name and location in memory on the external terminal. The location is especially important in a program like this that has segments.} BEGIN {$IFC BUG = 1} "Write (debugger, 'in '); "IF prockind = proc THEN Write (debugger, 'Procedure '); "IF prockind = func THEN Write (debugger, 'Function '); "Writeln (debugger, where, ' @ ', ord4(location), lf) {$ENDC} END; {------------------------------------------------------------------------------------} PROCEDURE CursorAdjust; VAR mousePt: Point; $tempport: GrafPtr; BEGIN { Take care of application tasks which should be executed when the machine has } { nothing else to do, like changing the cursor from an arrow to an I-Beam when it "is over text that can be edited. } {$IFC BUG >-1} { If the amount of free memory is being displayed in its own window, and if it has "changed, then create an update event so that the correct value will be displayed.} "If (FreeWind <> NIL) "and (FreeMem <> OldMem) then "BEGIN $OldMem := FreeMem; $GetPort (tempport); $SetPort (FreeWind); $InvalRect (FreeWind^.portrect); $SetPort (tempport) "END; {$ENDC} "GetMouse(mousePt); {where the cursor is, currently (local to the topmost window)} "If hTE <> NIL {if text edit is currently active, (document window is topmost)} "THEN "BEGIN $TEIdle (hTE); $IF (PtInRect(mousePt, hTE^^.viewrect)) {In the text edit viewrect area,} $THEN SetCursor(iBeamHdl^^) { make the cursor an I-beam.} $ELSE SetCursor(arrow) "END END; {------------------------------------------------------------------------------------} PROCEDURE InSystemWindow; VAR DScrap: PScrapstuff; $tempport:grafptr; BEGIN {for desk accessories, service them with a SystemClick. Also, check to see if they have changed the scrap. If so, create an update event to redraw the clipboard.} "if debug then debuginproc (proc, 'InSystemWindow', @InSystemWindow); "SystemClick(myEvent,tempWindow); "DScrap := InfoScrap; "If (DScrap^.scrapState <> LastState) and (ScrapWind<>NIL) then "BEGIN $Getport (tempport); $Setport (scrapwind); $InvalRect (scrapwind^.portrect); $Setport (tempport) "END END; {------------------------------------------------------------------------------------} PROCEDURE SetScrollMax; Type txt= packed array [0..32000] of 0..255; Var cr : integer; $txtptr : ^txt; $max: integer; BEGIN {This adjusts the scroll value so that the scroll bar range is not allowed to exceed the end of the text. Also, the scroll bar is disabled if the max is set equal to the min, which is zero. The formula for determining the range is somewhat complex. Sorry.} "if debug then debuginproc (proc, 'SetScrollMax', @SetScrollMax); "With hTE^^, hTE^^.viewrect DO "BEGIN $txtptr := pointer (htext^); $cr := 0; $if teLength > 0 then if txtptr^[teLength-1] = 13 then cr := 1; $max := nLines + cr - (bottom - top+1) DIV lineHeight; $if max < 0 then max := 0; $SetCtlMax (VScroll, max); $if debug then Writeln (debugger, 'vscrollmax =', max,lf); $topline := -destrect.top DIV lineheight; $SetCtlValue (vscroll, topline); $if debug then Writeln (debugger, 'topline =',topline,lf) "END; END; {------------------------------------------------------------------------------------} PROCEDURE ScrollText (showcaret: boolean); {called to either show the caret after an action like 'Copy'; also called to adjust the text within the window after the window is resized. The same formula used in SetScrollMax is used here as well. Don't worry about how this works, too much. This possibly could be made much simpler.} Type txt= packed array [0..32000] of 0..255; Var bottomline, viewlines, SelLine, scrlAmount, numlines, blanklines, newtop %: integer; $txtptr: ^txt; BEGIN "if debug then DebugInProc (proc, 'ScrollText', @ScrollText); "With HTE^^ DO "BEGIN $scrlAmount := 0; $txtptr := Pointer(hText^); $numlines := nlines; {if the last character is a carriage return, add 1 to numlines} $if teLength>0 then if txtptr^[teLength-1] = 13 then numlines := numlines + 1; $With HTE^^.viewrect DO %viewlines := (bottom - top+1) DIV lineHeight; {don't count partial lines} $topline := -destrect.top DIV lineheight; $bottomline := topline + viewlines - 1; $if debug then $BEGIN &Write (debugger, 'nlines=',nlines:4,'; topline=',topline:4); &Writeln (debugger, '; numlines=',numlines:4,'; bottom=',bottomline:4,lf); &Writeln (debugger, 'viewlines=',viewlines:4,'; showcaret=',showcaret,lf) $END; $IF showcaret $THEN $BEGIN &selLine := 0; &While (selLine+1 < nlines) AND (selstart >=linestarts[selLine+1]) DO 'selLine := selLine + 1; %{if selstart = selend is @ a cr, then add 1 to selstline} &If (selstart = selend) AND (selstart > 0) then 'if (txtptr^[selstart-1] = 13) then selLine := selLine + 1; &if debug then &BEGIN (Write (debugger, 'selstart=',selstart:5,'; selLine=',selLine:5); (if selstart > 0 then )Writeln (debugger, '; txtptr^[selstart-1] = 13 is ',txtptr^[selstart-1] = 13,lf) &END; &If SelLine > bottomline THEN &BEGIN (scrlAmount := bottomline - SelLine; (If numlines - SelLine > viewlines DIV 2 (THEN scrlAmount := scrlAmount - viewlines DIV 2 (ELSE ScrlAMount := ScrlAmount - numlines + SelLine + 1 &END; &If SelLine < topline THEN &BEGIN (scrlAmount := topline - SelLine; (If selLine > viewlines DIV 2 (THEN scrlAmount := scrlAmount + viewlines DIV 2 (ELSE ScrlAMount := ScrlAmount + selLine &END $END; $if scrlAmount = 0 then $BEGIN &blanklines := viewlines - numlines + topline; &if blanklines < 0 then blanklines := 0; &If (blanklines > 0) AND (topline > 0) THEN &BEGIN (scrlAmount := blanklines; (If scrlAmount > topline THEN scrlAmount := topline &END; &if NOT showcaret then &BEGIN (newtop := 0; (While (newtop+1 < nlines) AND (firstchar >= linestarts[newtop+1]) DO )newtop := newtop + 1; (if (newtop <> topline) AND (ABS(newtop - topline) > ABS(scrlAmount)) then )scrlAmount := topline - newtop &END $END; $if debug then $BEGIN &Write (debugger, 'newtop=',newtop:4,'; blanklines=',blanklines:4); &Writeln (debugger, '; newtop - topline=',newtop - topline,lf) $END; $If scrlamount <> 0 THEN $BEGIN &If selstart = selend then TEDeactivate (hTE); &TEScroll (0, scrlAmount * lineheight, hTE); &If selstart = selend then TEActivate (hTE) $END; $if debug then Writeln (debugger, 'scrlAmount=',scrlAmount:4,lf); $SetScrollMax "END END; {------------------------------------------------------------------------------------} PROCEDURE ToggleScrap; Var temppeek: windowpeek; $getwhich: integer; $showhidehdl: StringHandle; BEGIN {The clipboard comes and goes, here. The last item in the editmenu is alternately made to read, 'Show Clipboard' and 'Hide Clipboard'.} "if debug then DebugInProc (proc, 'ToggleScrap', @ToggleScrap); "If ScrapWind = NIL then {make it appear} "BEGIN $scrapwind := GetNewWindow (257, NIL, Pointer (-1)); $Temppeek := pointer (scrapwind); $Temppeek^.windowkind := 9; $SetPort (scrapwind); $InvalRect (scrapwind^.Portrect); $GetWhich := 263 {hide clipboard} "END "else {make it disappear} "BEGIN $DisposeWindow (scrapwind); $Scrapwind := NIL; $GetWhich := 262 {show clipboard} "END; "showhidehdl := GetString (getwhich); "Hlock (Pointer(showhidehdl)); "SetItem (myMenus[EditMenu], 9, showhidehdl^^); "Hunlock (Pointer(showhidehdl)); "ReleaseResource (Pointer(showhidehdl)) END; {$IFC BUG > -1} {------------------------------------------------------------------------------------} PROCEDURE ToggleFree; Var temppeek: windowpeek; $getwhich: integer; $showhidehdl: StringHandle; BEGIN {just about the same as ToggleClipboard, above. This is just for debugging fun.} "if debug then DebugInProc (proc, 'ToggleFree', @ToggleFree); "If FreeWind = NIL then {make it appear} "BEGIN $Freewind := GetNewWindow (258, NIL, Pointer (-1)); $Temppeek := pointer (Freewind); $Temppeek^.windowkind := 10; $SetPort (Freewind); $InvalRect (Freewind^.Portrect); $GetWhich := 265; "END "else {make it disappear} "BEGIN $DisposeWindow (Freewind); $Freewind := NIL; $GetWhich := 264 "END; "showhidehdl := GetString (getwhich); "Hlock (Pointer(showhidehdl)); "SetItem (myMenus[DebugMenu], 1, showhidehdl^^); "HUnlock (Pointer(showhidehdl)); "ReleaseResource (Pointer(showhidehdl)) END; {$ENDC} {------------------------------------------------------------------------------------} PROCEDURE SetViewRect; BEGIN {text edit's view rect is inset in the content of the window, to prevent it from running into the lefthand side or the scroll bar.} "if debug then DebugInProc (proc, 'SetViewRect', @SetViewRect); "With hTE^^.viewrect DO "BEGIN $hTE^^.viewrect := MyWindow^.portRect; $left := left +4; $right := right -15 "END END; {------------------------------------------------------------------------------------} PROCEDURE MoveScrollBar; BEGIN {When the window is resized, the scroll bar needs to be stretched to fit.} "if debug then DebugInProc (proc, 'MoveScrollBar', @MoveScrollBar); "WITH MyWindow^.portRect DO "BEGIN $HideControl(vScroll); $MoveControl(vScroll,right-15,top-1); $SizeControl(vScroll,16,bottom-top-13); $ShowControl(vScroll) "END END; {------------------------------------------------------------------------------------} PROCEDURE GrowWnd; { Handles growing and sizing the window and manipulating the update region. } VAR longResult: LongInt; $height, width, newvert, oldstart: INTEGER; $tRect, oldportrect: Rect; BEGIN "if debug then DebugInProc (proc, 'GrowWnd', @GrowWnd); "longResult := GrowWindow(MyWindow,myEvent.where,growRect); "IF longResult = 0 THEN EXIT(GrowWnd); "Setcursor (watchhdl^^); {because the word wrap could take a second or two} "height := HiWord(longResult); width := LoWord(longResult); "SizeWindow(MyWindow,width,height,TRUE); { Now draw the newly sized window. } "InvalRect (MyWindow^.portrect); "If MyPeek^.windowkind = 8 then {a document (not the clipboard) is being resized} "BEGIN $MoveScrollBar; $With MyWindow^.portRect DO $BEGIN &width := right-left-19; &height := bottom-top $END; $With HTE^^ DO $BEGIN &destrect.right := destrect.left + width; &viewrect.right := viewrect.left + width; &viewrect.bottom := viewrect.top + height; &firstchar := hTE^^.linestarts [topline]; &TECalText (hTE); {re-wrap the text to fit the new screen.} &{if the rectangle is grown such that there is now blank space on the bottom &of the screen, backpedal the screen to fill it back up, if there is enough &scrolled off the screen to do so. Otherwise, the first character in the top line on &the screen should continue to be somewhere on the top line after resizing} &ScrollText (FALSE); $END "END; "Setcursor (arrow) END; { of GrowWnd } {------------------------------------------------------------------------------------} PROCEDURE MyActivate; VAR tRect : rect; BEGIN {activate events occur when one window appears in front of another. This takes care of hiliting the scroll bar and deactivating the insertion caret or the text selection.} "if debug then DebugInProc (proc, 'MyActivate', @MyActivate); "MyWindow := Pointer (MyEvent.message); "MyPeek := Pointer (MyWindow); "If MyPeek^.windowkind in [8,9] then "BEGIN {redraw the scrollbar area, if a document or the clipboard} &SetPort (MyWindow); &tRect := MyWindow^.portRect; tRect.left := tRect.right-16; &InvalRect(tRect) "END; "If MyPeek^.windowkind = 8 then "BEGIN {make global variables point to the information associated with this window} $WindowData := Pointer (GetWRefCon (MyWindow)); $VScroll := Pointer (MyPeek^.ControlList); $hTE := WindowData^^.TERecord; $IF ODD (myEvent.modifiers) $THEN $BEGIN {this window is now top most} &TEActivate(hTE); &ShowControl (VScroll); &topline := GetCtlValue (VScroll) $END $ELSE $BEGIN {this window is no longer top most} &HideControl (VScroll); &TEDeactivate(hTE); &hTE := NIL {a document is no longer on top} $END "END END; { of activateEvt } {------------------------------------------------------------------------------------} PROCEDURE DialogueDeactivate; var temprect: rect; BEGIN {This routine takes care of cases where, for instance, a modal dialog is about to pop up in front of all the other windows. Since the Dialog Manager handles all activate events for you, you do not get a chance to 'turn off' the controls associated with the window. This routine is called just before the dialog box makes its appearance, and takes care of the hiliting as if an activate event had occured.} "if debug then DebugInProc (proc, 'DialogueDeactivate', @DialogueDeactivate); "If hTE <> NIL then {for documents, only} "BEGIN $TEDeactivate(hTE); $HideControl (VScroll); $SetCursor (arrow) "END; "If (frontwindow <> NIL) AND (Mypeek^.windowkind in [8, 9]) then "BEGIN {this is a little kludgy, but it works.} $Mypeek^.hilited := false; {DrawGrowIcon will now unhilite.} $temprect := MyWindow^.PortRect; $temprect.left := temprect.right - 15; $Cliprect (temprect); {clipaway the horizontal scrollbar part} $DrawGrowIcon (MyWindow); $Cliprect (MyWindow^.PortRect); $Mypeek^.hilited := true {fix things back} "END END; { } {$S READFILE} {------------------------------------------------------------------------------------} Function ReadFile (VrefNo: integer; FName : str255) : boolean; Var refNo, io : integer; $logEOF: LongInt; $errin: str255; {------------------------------------------------------------------------------------} "Procedure DiskRErr (io : integer); "Var str: str255; &readfromhdl, loadedhdl: StringHandle; &dummy: integer; "BEGIN {A generic error is reported to the user if something goes wrong. Amazingly little can go wrong, since the user does not get the chance to do things like type file names, remove the disk himself, and so on. About the only errors that could happen are: the disk is full (for the companion writing error handler.) an error occured while reading/writing the disk (damaged media or hardware) Can you think of anything else? An almost identical routine further down handles writing to disk. Note that in both reading and writing, the entire file is handled by a single read/write call, and no 'disk buffer' needs to be specified by the programmer.} $if debug then $BEGIN &DebugInProc (func, 'DiskRErr', @DiskRErr); &Writeln (debugger, errin, ' err = ', io, lf) $END; $readfromHdl := GetString (267); {this says 'reading from'} $loadedhdl := GetString (269); {this says 'loaded'} $Hlock (Pointer(readfromHdl)); $Hlock (Pointer(loadedhdl)); $MakeNumString (io, str); $Paramtext (readfromhdl^^, FName, loadedhdl^^, str); $SetCursor (arrow); $dummy := StopAlert (256, NIL); {discribe error to user in generic way.} $HUnlock (Pointer(readfromHdl)); $HUnlock (Pointer(loadedhdl)); $Exit (readfile) "END; BEGIN "if debug then DebugInProc (func, 'ReadFile', @ReadFile); "SetCursor (watchHdl^^); "ReadFile := false; "io := FSOpen (Fname, VRefNo, RefNo); {$IFC BUG = 1} {these debugging statements are for the external terminal, only} "errin := 'FSOpen'; {$ENDC} "If io <> 0 then DiskRErr (io); "io := GetEOF (RefNo, logEOF); {$IFC BUG = 1} "errin := 'GetEOF'; {$ENDC} "If io <> 0 then DiskRErr (io); "{add code here: if file is too large, then notify user and truncate} "SetHandleSize (hTE^^.hText, logEOF); "if debug then if memerror<>0 then Writeln (debugger, 'memerr = ',memerror:4); "io := FSRead (refNo, logEOF, hTE^^.hText^); {$IFC BUG = 1} "errin := 'FSRead'; {$ENDC} "If io <> 0 then DiskRErr (io); "io := FSClose (refNo); {$IFC BUG = 1} $errin := 'FSClose'; {$ENDC} "If io <> 0 then DiskRErr (io); "hTE^^.teLength := logEOF; "if not finderprint then {if printing from the finder, no window or editing #information is needed} "BEGIN $TESetSelect (0,0,hTE); $TECalText (hTE); $Invalrect (hTE^^.viewrect); $SetScrollMax; $WindowData^^.titled := true; $WindowData^^.changed := false "END; "ReadFile := True {everything worked out OK} END; {------------------------------------------------------------------------------------} PROCEDURE MakeAWindow (str : str255; disk : boolean); Var bounds: rect; BEGIN {A window is created here, and all associated data structures are linked to it} "if debug then DebugInProc (proc, 'MakeAWindow', @MakeAWindow); "windowpos := windowpos + 1; {this position it is created to on the screen} "bounds.left := windowpos MOD 16 * 20 + 5; "bounds.top := windowpos MOD 11 * 20 + 45; "bounds.right := bounds.left + 200; "bounds.bottom := bounds.top + 100; "MyWindow := NewWindow(Nil, bounds, str, TRUE, 0, POINTER(-1), TRUE, 0); "SetPort (MyWindow); "Mypeek := Pointer (MyWindow); "TextFont (2); {the good ole application font} "Mypeek^.windowkind := 8; {an arbitrary number identify the type of window} "hTE := TENew(MyWindow^.portRect, MyWindow^.portRect); "WindowData := Pointer (NewHandle (8)); {1 handle plus 2 booleans} "SetWRefCon (MyWindow, Ord4 (WindowData)); "WindowData^^.TERecord := hTE; "SetViewRect; "hTE^^.destrect := hTE^^.viewrect; "WindowData^^.changed := false; "vScroll := GetNewControl(256,MyWindow); "MoveScrollBar; "topline := 0 END; {------------------------------------------------------------------------------------} PROCEDURE MyGetFile; Var reply: SFReply; $wher: point; $NameHdl: StringHandle; $temprect: rect; $tempport:grafptr; BEGIN {This calls Standard File to allow the user to choose the document on disk that she wishes to edit.} "if debug then DebugInProc (proc, 'MyGetFile', @MyGetFile); "wher.h := 90; "wher.v := 100; "DialogueDeactivate; "SFGetFile (wher, '', NIL, 1, typelistptr, NIL, @reply); "ReleaseResource (Pointer(namehdl)); "With Reply DO "If good then "BEGIN $MakeAWindow (fname, TRUE); $If Not ReadFile (vrefnum, fname) then $BEGIN &{ if nothing was read, then dispose of the window, TEdata, etc, but then again, (you can't have everything in an example program that you would like.} $END "END END; {------------------------------------------------------------------------------------} PROCEDURE OpenAWindow; VAR s: str255; $untitled: StringHandle; BEGIN {this creates a new window that is untitled and empty.} "if debug then DebugInProc (proc, 'OpenAWindow', @OpenAWindow); "{see if enough mem exists to open a window} "MakeNumString(windownum, s); "windownum := windownum + 1; "untitled := GetString (256); "HLock (Pointer(untitled)); "MakeAWindow (Concat (untitled^^, s), FALSE); "HUnlock (Pointer(untitled)) END; {$S WRITFILE} {------------------------------------------------------------------------------------} FUNCTION WriteFile (vRefNo: integer; fName : str255) : Boolean; var refNo, io : integer; $txtlength : longint; $specialhdl: Charshandle; $errin: str255; {------------------------------------------------------------------------------------} "PROCEDURE DiskWErr (io : integer); "Var str:str255; &writetoHdl, savedHdl: StringHandle; &dummy: integer; "BEGIN "{this is just about the same as DiskRErr (read). A good thing to add here would #be a separate error message for disk full occurances.} $if debug then $BEGIN &DebugInProc (proc, 'DiskWErr', @DiskWErr); &Writeln (debugger, errin, ' err = ', io, lf) $END; ${read resource for writeto} $writetoHdl := GetString (268); ${read resource for saved} $savedHdl := GetString (270); $Hlock (Pointer(writetoHdl)); $Hlock (Pointer(savedhdl)); $MakeNumString (io, str); $Paramtext (writetoHdl^^,FName,savedhdl^^,str); $SetCursor (arrow); $dummy := StopAlert (256, NIL); $HUnlock (Pointer(writetoHdl)); $HUnlock (Pointer(savedhdl)); $Exit (writefile) "END; BEGIN {this isn't very different from read file. The only complication is finding out if the file exists. If it doesn't, create it. Also, assign the information that the finder needs to properly associate it with this application. One particularly bad thing here: the volume reference number is not associated with the document. This means I do not know enough to write a file on the same disk from which it was read. Oh well, you'll know better.} "if debug then DebugInProc (proc, 'WriteFile', @WriteFile); "SetCursor (watchHdl^^); "WriteFile := False; "io := FSOpen(FName, VRefNo, refNo); {$IFC BUG = 1} "errin := 'FSOpen'; {once again, these only benefit the external debugger.} {$ENDC} "If debug then Writeln (debugger, 'file RefNum =', refNo, lf); "If io = {file not found Err} -43 then "BEGIN $io := Create (FName,VRefNo); {$IFC BUG = 1} $errin := 'Create'; {$ENDC} $If io <> 0 then DiskWErr (io); $io := SetFInfo (FName, VRefNo, txtfile); {$IFC BUG = 1} $errin := 'SetFInfo'; {$ENDC} $If io <> 0 then DiskWErr (io); $io := FSOpen(FName, VRefNo, refNo); {$IFC BUG = 1} $errin := 'FSOpen'; {$ENDC} $if debug then Writeln (debugger, 'file RefNum = ', refNo, lf); $If io <> 0 then DiskWErr (io) "END {Create} "ELSE If io <> 0 then DiskWErr (io); "With hTE^^ DO "BEGIN $txtLength := Ord4(teLength); $Hlock (hText); $io := FSWrite (refNo, txtLength, hText^); $HUnlock (hText) "END; "if debug then Write (debugger, '.'); {$IFC BUG = 1} "errin := 'FSWrite'; {$ENDC} "If io <> 0 then DiskWErr (io); "io := SetEOF (refNo, txtlength); "if debug then Write (debugger, '.'); {$IFC BUG = 1} "errin := 'SetEOF'; {$ENDC} If io <> 0 then DiskWErr (io); "io := FSClose (refNo); "if debug then Write (debugger, '.'); {$IFC BUG = 1} "errin := 'FSClose'; {$ENDC} "If io <> 0 then DiskWErr (io); "io := FlushVol (NIL, VrefNo); {this is important; without it, if the program died "(not possible as a result of a programming mistake, of course), the directory #information on the disk would not be accurate.} "if debug then Write (debugger, '.'); {$IFC BUG = 1} "errin := 'FlushVol'; {$ENDC} "If io <> 0 then DiskWErr (io); "if not windowdata^^.titled then SetWTitle(MyWindow, FName); "WindowData^^.titled := true; "WindowData^^.changed := false; "WriteFile := True {everything is OK.} END; {------------------------------------------------------------------------------------} FUNCTION MyPutFile (Filename: str255): Boolean; Var reply: SFReply; $wher: point; $NameHdl: StringHandle; $temprect: rect; $tempport:grafptr; BEGIN {The user can select the name of the file that they wish to save the document with.} "if debug then DebugInProc (func, 'MyPutFile', @MyPutFile); "MyPutFile := False; "NameHdl := GetString (257); "wher.h := 100; "wher.v := 100; "Hlock (Pointer(namehdl)); "DialogueDeactivate; "SFPutFile (wher, NameHdl^^, Filename, NIL, @reply); "HUnlock (Pointer(namehdl)); "With Reply DO "BEGIN $if debug then Writeln (debugger, 'reply.good = ', good, lf); $If good then MyPutFile := WriteFile (vrefnum, fname) "END; "ReleaseResource (Pointer(namehdl)); "if debug then Writeln (debugger, 'release reserror = ', reserror, lf) END; {------------------------------------------------------------------------------------} PROCEDURE CloseAWindow; VAR itemhit: integer; $DBoxPtr: DialogPtr; $str,str1: str255; $Goodwrite: Boolean; $temprect: rect; $NameHdl: Handle; $NamePtr: ^Str255; $typ: integer; $itemhdl: handle; $box:rect; BEGIN {All sorts of windows can be closed through this single routine, which is accessed by the user through the go-away box on the window, or the Close item in the File menu.} "if debug then DebugInProc (proc, 'CloseAWindow', @CloseAWindow); "MyPeek := Pointer (FrontWindow); "Case Mypeek^.windowkind of "8 : "BEGIN $GetWTitle (MyWindow, str); $itemhit := 0; $If WindowData^^.changed then {give the user the chance to save his data before %you throw it away.} $BEGIN &DialogueDeactivate; &if doneflag then &BEGIN (NameHdl := Getresource ('STR ',266); (Hlock (NameHdl); (NamePtr := Pointer(NameHdl^); (str1 := NamePtr^; (HUnlock (NameHdl); (if debug then Writeln (debugger, 'err = ', Reserror, lf); &END &ELSE str1 := ''; &Paramtext (str,str1,'',''); &DBoxPtr := GetNewDialog (256, Nil, Pointer (-1)); &Repeat (ModalDialog (Nil, itemHit) {this could have been an alert.} &Until itemhit IN [OK {Yes}, Cancel, 3 {No}]; &DisposDialog (DBoxPtr) $END; $if debug then Writeln (debugger, 'itemhit = ', itemhit, lf); $Goodwrite := false; $if not windowdata^^.titled then str := ''; $If itemhit = OK {save} then Goodwrite := MyPutFile (str); $If GoodWrite or (itemhit IN [0, 3] {discard}) then $BEGIN &TEDispose (hTE); &hTE := NIL; &DisposHandle (Pointer (WindowData)); &If debug then Writeln (debugger, 'dispose WindowData; memerr = ', MemError, lf); &KillControls (MyWindow); {do I need this? Why am I asking you?} &DisposeWindow (MyWindow) $END; $If itemhit = Cancel then doneflag := false "END; "9 : ToggleScrap; {$IFC BUG > -1} "10: ToggleFree; {$ENDC} $OTHERWISE CloseDeskAcc (MyPeek^.windowkind) {can't be anything else} "END {Case} END; {$S AboutMyPgm} {------------------------------------------------------------------------------------} PROCEDURE AboutMyEditor; var str1hdl, str2hdl : stringHandle; $MyWindow: WindowPtr; $width, height, counter: integer; $newcount: longint; $quit: boolean; $txtinfo: fontinfo; $temprect, trect1: rect; $tempbits: bitmap; $sz: size; BEGIN {this bit of fluff shows a totally wrong method of telling the user something about my program, but it was fun to do.} "if debug then DebugInProc (proc, 'AboutMyEditor', @AboutMyEditor); "DialogueDeactivate; "str1hdl := GetString (259); "if debug then Writeln (debugger, 'err = ', Reserror, lf); "str2hdl := GetString (260); "if debug then Writeln (debugger, 'err = ', Reserror, lf); "Hlock (Pointer(str1hdl)); "Hlock (Pointer(str2hdl)); "MyWindow := GetNewWindow (256, NIL, Pointer (-1)); "SetPort (MyWindow); "counter := 1; "width := MyWindow^.portrect.right - MyWindow^.portrect.left; "height := MyWindow^.portrect.bottom - MyWindow^.portrect.top; "TextFont (2); "TextMode (srcCopy); "quit := false; "Repeat $SystemTask; $newcount := tickcount + 6; $TextSize (counter); $GetFontInfo (txtinfo); $With txtinfo Do $Begin &MoveTo ((width - StringWidth (str1hdl^^)) DIV 2, height DIV 2 - descent - leading); &DrawString (str1hdl^^); &MoveTo ((width - StringWidth (str2hdl^^)) DIV 2, height DIV 2 + ascent); &DrawString (str2hdl^^) $End; $If EventAvail (10, MyEvent) then quit := true; $counter := counter + 1; $While newcount > tickcount Do; "Until quit or (counter = 12); "newcount := tickcount + 300; {5 seconds} "while not quit and (tickcount < newcount) Do "Begin $SystemTask; $If EventAvail (10, MyEvent) then quit := true; "End; "temprect := MyWindow^.portrect; "With txtinfo Do "Begin $temprect.top := height DIV 2 - ascent - descent - leading; $temprect.bottom := height DIV 2 + ascent + descent "End; "trect1 := temprect; "OffsetRect (trect1, 0, -trect1.top); "tempbits.rowbytes := (width + 7) DIV 8; "tempbits.bounds := trect1; "With Txtinfo Do sz := Ord4 (tempbits.rowbytes * (ascent*2+descent*2+leading)); "tempbits.baseaddr := pointer (NewPtr (sz)); "if debug then Writeln (debugger, 'err = ', Memerror, lf); "CopyBits (MyWindow^.portbits, tempbits, temprect, trect1, srcCopy, NIL); "insetrect (trect1, 8, 0); "temprect.top := temprect.top - 2; "temprect.bottom := temprect.bottom + 2; "while not quit and (trect1.right > width DIV 2) Do "Begin $SystemTask; {the clock still ticks!} $CopyBits (tempbits, MyWindow^.portbits, trect1, temprect, srcCopy, NIL); $If temprect.top > Mywindow^.portrect.top then $Begin &insetrect (trect1, 8, 0); &insetrect (temprect, 0, -2) $End else insetrect (trect1, 8, 2); $If EventAvail (10, MyEvent) then quit := true "End; "HUnlock (Pointer(str1hdl)); "HUnlock (Pointer(str2hdl)); "ReleaseResource (Pointer(str1hdl)); "ReleaseResource (Pointer(str2hdl)); "DisposPtr(Pointer(tempbits.baseaddr)); "if debug then Writeln (debugger, 'err = ', Memerror, lf); "DisposeWindow (mywindow) END; {$S MyPrint } {------------------------------------------------------------------------------------} PROCEDURE MyPrint(finderfirst:boolean; filename: str255); Const bottommargin = 20; {amount of space on the margins of the page in pixels} &leftmargin = 30; &rightmargin = 10; Var tempport: GrafPtr; $MyPPort: TPPrPort; $txt: Ptr; $pglen, MyLngth, start, finish, counter, loop: integer; $temprect, tmprect2, pagerect: rect; $status: TPrStatus; $userOK: boolean; $s: string[1]; $str: str255; $dlogptr: dialogptr; Begin {For heavyweight programmers only. All modes of printing are handled by Macprint. The only things you have to do are: #image each page, using QuickDraw (or something that uses QuickDraw); #Do it once for the number of copies the user specified in draft mode only. #You do not have to worry with: %copies in normal or high res. %which pages the user chose to print. %tall, wide, etc. "Remember, these Page Setup dialog is printer specific. It will not always be the "same, so don't write any code around it. "The reason this program is heavily segmented is that printing normal or high-res "on line takes gobs of memory (in this example, up to 25K.) You may minimize the "by omitting 1 line below and creating a spooled file instead. "One more thing. The dialog shown here (press command-period to stop) is not the "thing to do. You may choose to either: $run your program in the background. This is not necessarily a hard thing to do. $put up a dialog with a button so the user may press the button to stop. Then $the printing idle proc only needs to monitor that button. "Printing is not re-entrant. If your main program loop is to be the "print idle proc, disable the Page Setup and Print items in the File menu.} "if debug then DebugInProc (proc, 'MyPrint', @MyPrint); "printflag := false; "if debug then #writeln (debugger, 'finderprint =', finderprint, '; finderfirst =', finderfirst, lf); "if not finderprint then DialogueDeactivate; "userOK := true; "If finderfirst then "BEGIN $setcursor (arrow); $userOK := PrJobDialog (PrintHdl) "END; "If userOK then "BEGIN $Setcursor (watchhdl^^); $s := 'x'; $s[1] := chr (cmdsymbol); {this is terrible, terrible, terrible. Don't do it.} $Paramtext (filename,s,'',''); $dlogptr := GetNewDialog (257, NIL, Pointer(-1)); $DrawDialog (dlogptr); ${for now, approximate a full page} $GetPort (tempport); $MyPPort := PrOpenDoc (PrintHdl, NIL, NIL); $SetPort (pointer(MyPPort)); $TextFont (2); $With printhdl^^.prinfo Do $BEGIN &HLock (Pointer(Printhdl)); &pagerect := rpage; &pagerect.left := pagerect.left + leftmargin; &pagerect.right := pagerect.right - rightmargin; &pagerect.bottom := pagerect.bottom - bottommargin &- (pagerect.bottom - bottommargin) MOD HTE^^.lineheight {get rid of partial line}; &hTE^^.destrect := pagerect; &TECalText (hTE); &With hTE^^ DO &BEGIN (HLock (Pointer(hTE)); (Hlock (hTEXT); (txt := hText^; (temprect := destrect; (tmprect2 := viewrect; (pglen := (rpage.bottom - rpage.top - bottommargin) DIV lineheight; (finish := nlines; "if debug then Writeln (debugger,'BJDocLoop = ', PrintHdl^^.prjob.BJDocLoop,lf); (If PrintHdl^^.prjob.BJDocLoop = BSpoolLoop (then loop := 1 (else loop := PrintHdl^^.prjob.iCopies; (For counter := 1 to loop DO (BEGIN *start := 0; *While start < finish Do *Begin ,IF finish - start > pglen ,THEN MyLngth := linestarts[start + pglen] - linestarts[start] ,ELSE MyLngth := teLength - linestarts[start]; if debug then BEGIN "Writeln (debugger,'MyLngth = ', MyLngth:5, '; start = ', start:5, '; pglen = ', pglen:5, lf); "Writeln (debugger, 'finish = ', finish:5, '; teLength = ', teLength:5, '; ord4(txt) = ', ord4(txt),lf) END; ,PrOpenPage (MyPPort, NIL); ,TextBox (txt, MyLngth, pagerect, 0); ,PrClosePage (MyPPort); ,txt := Pointer (Ord4 (txt) + MyLngth); ,start := start + pglen *END {While start < finish} (END {For counter := 1 to loop} &END {with hTE} $END; {with PrintHdl^^.prjob} $PrCloseDoc (MyPPort); $HUnLock (Pointer(hTE)); $HUnlock (hTE^^.hTEXT); $HUnLock (Pointer(Printhdl)); $If PrintHdl^^.prjob.BJDocLoop = BSpoolLoop then %PRPicFile (Printhdl, NIL, NIL, NIL, status); {omit this for spooled files.} $SetPort (tempport); $hTE^^.destrect := temprect; $hTE^^.viewrect := tmprect2; $TECalText (hTE); $DisposDialog (dlogptr); $if not finderprint then setcursor(arrow) "END End; {$S EditMenu} {------------------------------------------------------------------------------------} Procedure EditMain (theItem: integer; commandkey : boolean); const undo = 1; &cut = 3; &kopy = 4; {copy is a Pascal string function} &paste = 5; &clear = 6; &selectAll = 7; &clipboard = 9; VAR DeskAccUp , dummy: boolean; $Dscrap: PScrapStuff; $off: LongInt; $ticks: LongInt; $tempport: grafptr; $box: rect; $itemhdl, hdl: handle; $typ, io, tempstart, tempend: integer; $tempptr: ptr; $TextScrap: handle; $TextLength: integer; $Ptr2ScrapLength: ^integer; BEGIN {Since the Edit menu does so much, it has been broken up into a separate procedure. It does not yet support undo, but does support Cutting, Copying and Pasting between the Desk Scrap and the TextEdit Scrap.} "DeskAccUp := false; "IF theItem < selectAll then DeskAccUp := SystemEdit(theItem-1); "If ((theItem in [undo,cut,kopy]) OR DeskAccUp) AND (scrapwind <> NIL) then "Begin {invalidate clipboard} $GetPort (tempport); $SetPort (scrapwind); $Invalrect (scrapwind^.portrect); $SetPort (tempport) "End; "if theItem in [cut, kopy] then "BEGIN $tempend := hTE^^.selend; $tempstart := hte^^.selstart "END; "if (theItem > Clear) OR NOT DeskAccUp then "BEGIN $if debug then Writeln (debugger, 'not system edit', lf); ${ Delay so menu title will stay lit a little only if Command key } ${ equivalent was typed. } $If commandkey then $BEGIN &ticks := TickCount + 10; &REPEAT UNTIL ticks <= TickCount $END; ${** see if enough memory exists for move} $CASE theItem OF $undo: ; { no Undo/Z in this example } $cut: TECut(hTE); { Cut/X } $kopy: TECopy(hTE); { Copy/C } $paste: BEGIN { Paste/V } *DScrap := InfoScrap; *If DScrap^.scrapState <> LastState then *BEGIN ,LastState := DScrap^.scrapState; ,hdl := NewHandle (0); ,io :=GetScrap (hdl, 'TEXT', off); ,if debug then Writeln (debugger, 'io = ', io); ,If io > 0 then ,BEGIN .TextScrap := Pointer (GlobalValue (TEScrpHandle)); .SetHandleSize (TextScrap, io); .Ptr2ScrapLength := Pointer (GlobalAddr (TEScrpLength)); .Ptr2ScrapLength^ := io; .Hlock (hdl); .Hlock (TextScrap); .BlockMove (hdl^, TextScrap^, io); .HUnlock (hdl); .HUnlock (TextScrap) ,END; ,DisposHandle (hdl) *END; *TEPaste(hTE); (END; $clear: TEDelete(hTE); { Clear } $selectall: TeSetSelect(0,65535,hTE); { Select All/A } $clipboard: ToggleScrap { Show, Hide Clipboard } $END; { of item case } $If theItem in [cut,kopy] then $BEGIN &io := ZeroScrap; &If debug then Writeln (debugger, 'zero scrap err =', io, lf); &TextScrap := Pointer (GlobalValue (TEScrpHandle)); &TextLength := GlobalValue (TEScrpLength); &Hlock (TextScrap); &io := PutScrap (TextLength, 'TEXT', TextScrap^); &If debug then Writeln (debugger, 'put scrap err =', io, lf); &HUnlock (TextScrap) $END; $If theItem in [cut,clear,paste] then Windowdata^^.changed := True; $If (theItem in [cut..clear]) then ScrollText (TRUE) "END {not systemedit} END; { of editMain } {$S Command } {------------------------------------------------------------------------------------} PROCEDURE MyDisable; var counter: integer; $DScrap: PScrapStuff; $temppeek: windowpeek; $stycount: styleitem; {------------------------------------------------------------------------------------} "PROCEDURE KillFE (fileitems, edititems : edset); "var counter: integer; "BEGIN {This guy disables the items in the File and Edit menus. This approach has a real disadvantage: If an entire menu should be disabled at some given time, there is no convenient way to do a DrawMenuBar here to disable the item in the bar itself.} $If debug then $Begin &DebugInProc (proc, 'KillFE', @KillFE); &Write (debugger, 'file:'); &For counter := 1 to 9 Do 'IF counter in fileitems THEN Write (debugger, counter:2, ','); &Write (debugger, '; edit:'); &For counter := 1 to 9 Do 'IF counter in edititems THEN Write (debugger, counter:2, ','); &Writeln (debugger, lf) $End; $For counter := 1 to 9 Do $BEGIN &If counter in fileitems then DisableItem (myMenus[FileMenu], counter); &If counter in edititems then DisableItem (myMenus[EditMenu], counter); $END "END; BEGIN {This part goes through all of the applicable elements of the frontmost window, if any and from that decides what operations are allowable at this time.} "if debug then DebugInProc (proc, 'MyDisable', @MyDisable); "For counter := 1 to 9 DO "BEGIN $EnableItem (myMenus[FileMenu], counter); $If counter in [1,3..7,9] then EnableItem (myMenus[EditMenu], counter) "END; "IF Frontwindow = Nil "THEN KillFE ([3..8],[1..7]) "ELSE "BEGIN $Mypeek := Pointer (FrontWindow); $Case Mypeek^.windowkind of $8: BEGIN *KillFE ([], [1]); *If NOT WindowData^^.titled THEN KillFE ([4,6], []); *If NOT WindowData^^.changed THEN KillFE ([4,6], []); *If hTE^^.teLength = 0 THEN KillFE ([4,5,7,8], [6,7]); *If hTE^^.selstart = hTE^^.selend THEN KillFE ([], [3,4,6]); *DScrap := InfoScrap; *If DScrap^.scrapSize = 0 then KillFE ([], [5]); (END; $9,10: KillFE ([4..8], [1, 3..7]); &OTHERWISE KillFE ([4..8], [7]) {system window} $END {Case} "END END; {------------------------------------------------------------------------------------} PROCEDURE DoCommand (commandkey: boolean); VAR name, s, str: str255; $bstr: string[5]; $dummy: size; $err : boolean; $num, refnum, theMenu, theItem: integer; $tempPeek: WindowPeek; $mresult, ticks: longint; $dipeek: DialogPeek; $box: rect; $itemhdl: handle; $typ: integer; BEGIN {This handles the actions that are initiated through the Menu Manager} "if debug then DebugInProc (proc, 'DoCommand', @DoCommand); "MyDisable; "If Commandkey "then mResult := MenuKey(theChar) "else mResult := MenuSelect (myEvent.where); "theMenu := HiWord(mResult); theItem := LoWord(mResult); "CASE theMenu OF $1: {enough memory to allow desk accessory to open?} $BEGIN &{unload all segments} &If theItem = 1 THEN &BEGIN (AboutMyEditor; (UnloadSeg (@AboutMyEditor) &END &ELSE GetItem(myMenus[appleMenu],theItem,name); &refNum := OpenDeskAcc(name) $END; $2: $BEGIN &If FrontWindow <> Nil then 'If MyPeek^.WindowKind = 8 then )if windowdata^^.titled )then GetWTitle (FrontWindow, str) )else str := ''; &Case TheItem of (1: OpenAWindow; { New } (2: MyGetFile; { Open } (3: CloseAWindow; { Close } (4: err := WriteFile (0, str); { Save } (5: err := MyPutFile (str); { Save As } (6: If CautionAlert(257, NIL)=OK then .err := ReadFile (0, str); { Revert to Saved } (7: If PrStlDialog (PrintHdl) { Page Setup } .then ; .{eventually, store info in document resource fork} (8: Printflag := true; { Print } (9: doneFlag := TRUE; { Quit } &END; &UnloadSeg (@Readfile); &UnloadSeg (@writefile); &unloadSeg (@myprint) $END; "3: EditMain (theItem, commandkey); {$IFC BUG > -1} "100: $Case theItem OF $1: ToggleFree; $2: dummy := MaxMem (dummy); {$IFC BUG = 1} $3: BEGIN *debug := not debug; *CheckItem (MyMenus[DebugMenu], 3, debug) (END {$ENDC} $END { of debug } {$ENDC} "END; { of menu case } "HiliteMenu(0) END; { of DoCommand } {------------------------------------------------------------------------------------} PROCEDURE DrawWindow; VAR tempPort : GrafPtr; $tempscrap: handle; $scraplength, off: longint; $temprect, rectToErase: rect; $str: str255; $tempPeek: WindowPeek; $whichwindow: windowptr; $temphTE: TEHandle; $tempdata: mydatahandle; BEGIN { Draws the content region of the given window, after erasing whatever "was there before. } "if debug then DebugInProc (proc, 'DrawWindow', @DrawWindow); "WhichWindow := Pointer (MyEvent.message); "IF WhichWindow <> Nil Then {** why is this here **} "BEGIN $BeginUpdate(WhichWindow); $GetPort (tempPort); $SetPort (WhichWindow); $tempPeek := Pointer (WhichWindow); $Case tempPeek^.windowkind of $8 : &Begin (temprect := WhichWindow^.portrect; (tempData := Pointer (GetWRefCon (WhichWindow)); (temphTE := tempData^^.TERecord; (If tempPeek^.hilited then temprect.top := temprect.bottom - 15; (temprect.left := temprect.right - 15; (ClipRect (temprect); (DrawGrowIcon(WhichWindow); (Cliprect (WhichWindow^.portrect); (DrawControls (WhichWindow); ({this only erases the window past the end of text, if any} (with temphTE^^ DO (If nlines - topline < (viewrect.bottom - viewrect.top + lineheight) )DIV lineheight then (BEGIN *rectToErase := viewrect; *rectToErase.top := (nlines - topline) * lineheight; *EraseRect (rectToErase) (END; (TEUpdate(WhichWindow^.visRgn^^.rgnBBox, temphTE) &End; $9 : $BEGIN &tempscrap := NewHandle (0); &ScrapLength := GetScrap (tempscrap, 'TEXT', off); &EraseRect (WhichWindow^.portrect); &temprect := Whichwindow^.portrect; &temprect.left := temprect.left + 4; &temprect.right := temprect.right-15; &If ScrapLength > 0 THEN &BEGIN (HLock (tempScrap); (textbox (tempscrap^, scrapLength, temprect, 0); (HUnlock (tempScrap) &End; &DisposHandle (tempscrap); &temprect := WhichWindow^.portrect; &temprect.left := temprect.right - 15; &ClipRect (temprect); &DrawGrowIcon (WhichWindow); &Cliprect (whichwindow^.portrect) $END; {$IFC BUG > -1} $10: BEGIN *EraseRect(WhichWindow^.portRect); *MoveTo (5, 12); *MakeNumString (FreeMem, str); *DrawString (str) (End; {$ENDC} $END; {Case} $SetPort (tempPort); $EndUpdate(WhichWindow) "END END; { of DrawWindow } {$S CONTROL} {------------------------------------------------------------------------------------} PROCEDURE ScrollBits; VAR oldvert: INTEGER; BEGIN {if the visible information has changed as a because of the scrollbar, scroll the window here.} "if debug then DebugInProc (proc, 'ScrollBits', @ScrollBits); "oldvert := topline; "topline := GetCtlValue(vScroll); "TEScroll (0, (oldvert - topline)*hTE^^.lineheight, hTE) END; {------------------------------------------------------------------------------------} PROCEDURE ScrollUp(theControl: ControlHandle; partCode: INTEGER); BEGIN {This function is called by TrackControl in the Up button} "if debug then DebugInProc (proc, 'ScrollUp', @ScrollUp); "IF partCode = inUpButton THEN "BEGIN $SetCtlValue(theControl, GetCtlValue(theControl)-1); {VScroll} $ScrollBits "END END; {------------------------------------------------------------------------------------} PROCEDURE ScrollDown(theControl: ControlHandle; partCode: INTEGER); BEGIN {This function is called by TrackControl in the Down button} "if debug then DebugInProc (proc, 'ScrollDown', @ScrollDown); "IF partCode = inDownButton THEN "BEGIN $SetCtlValue(theControl, GetCtlValue(theControl) + 1); {VScroll} $ScrollBits "END END; {------------------------------------------------------------------------------------} PROCEDURE PageScroll(which: INTEGER); VAR myPt: Point; $amount: Integer; BEGIN {This function is called by TrackControl in the Grey part of the scrollbar} "if debug then DebugInProc (proc, 'PageScroll', @PageScroll); "if which = InPageUp "then amount := -1 "else amount := 1; "REPEAT $GetMouse(myPt); $IF TestControl(VScroll,myPt) = which THEN 'BEGIN )With HTE^^.viewrect DO +SetCtlValue(VScroll, GetCtlValue(VScroll) + amount * ,(bottom - top) DIV hTE^^.lineheight); )ScrollBits 'END "UNTIL NOT StillDown; END; {------------------------------------------------------------------------------------} PROCEDURE MyControls; Var t, code, whichpart: integer; $AControl: ControlHandle; BEGIN {controls} {This routine handles the scrollbar} "if debug then DebugInProc (proc, 'MyControls', @MyControls); "whichPart := FindControl (MyPoint, MyWindow, AControl); If debug THEN Writeln (debugger, 'whichpart = ', whichpart, lf); If debug THEN Writeln (debugger, 'ord( AControl = ', Ord4 ( AControl), lf); "{adjust scrollbar range} "If AControl <> NIL THEN "BEGIN $VScroll := AControl; $Case whichpart of $inUpButton: t := TrackControl (VScroll, MyPoint, @scrollUp); $inDownButton: t := TrackControl (VScroll, MyPoint, @scrollDown); $inPageUP: PageScroll (whichpart); $inPageDown: PageScroll (whichpart); $inThumb: &BEGIN (t := TrackControl (VScroll, MyPoint, NIL); (ScrollBits &END $END {Case MyControl} "END {AControl <> NIL} END; {controls} {$S Initial } {------------------------------------------------------------------------------------} PROCEDURE SetUp; VAR counter, vRefNum, numfiles: INTEGER; $DScrap: PScrapStuff; $hdl, hAppparms: handle; $off: longint; $apName: Str255; $NameHdl: Handle; $strhdl: StringHandle; $dummyrect: rect; $tempptr : pAppParms; $dummy : boolean; BEGIN {Initialization for a variety of things is done here. This code is 'discarded' after it is executed by an UnLoadSeg.} {$IFC BUG = 1} "debug := TRUE; {if you want debugging on as soon as the program starts, set it here} "lf := chr(10); "Rewrite (debugger, '.BOUT'); {the serial port not used for downloading from Lisa} {$ENDC} "if debug then "BEGIN $Writeln (debugger, lf, lf); $DebugInProc (proc, 'SetUp', @Setup) "END; "InitGraf(@thePort); "InitWindows; "InitFonts; "FlushEvents(everyEvent,0); "TEInit; "InitDialogs(NIL); "NameHdl := NewHandle (1000000); {force MemMgr to allocate all 'grow' to app.} "DisposHandle (NameHdl); "PrintHdl := Pointer (NewHandle (120)); "PrOpen; "PrintDefault (PrintHdl); "getAppParms(apName,vRefNum,hAppParms); "{** sometime, get file info for apName, to use folder info as appropriate} "tempptr := Pointer(hAppParms^); "iBeamHdl := POINTER(GetCursor(1)); "watchHdl := Pointer(GetCursor(4)); "numfiles := tempptr^.count; "if debug then Writeln (debugger, 'numfiles=',numfiles,lf); "finderprint := (tempptr^.message = 1); "IF finderprint THEN "BEGIN ${put something meaningful on menu bar; use TextBox to say the ap name perhaps?} $HLock (hAppParms); $For counter := 1 to numfiles Do %With tempptr^ DO $BEGIN &If ftype = 'TEXT' then &BEGIN (SetRect (dummyrect, 0,0,100,100); (hTE := TENew(dummyrect, dummyrect); (dummy := ReadFile (vRefNum, fName); {assume that page setup is read in as well} (Unloadseg (@ReadFile); (if counter = 1 then MyPrint(TRUE, fName) ELSE MyPrint (FALSE, fName); (TEDispose (hTE); {dispose of text edit stuff} (tempptr := Pointer (Ord4 (tempptr) + length (fName) + 10 - )length (fName) MOD 2) &END &{ELSE clear the proper bytes in the appParms handle?} $END; $HUnlock (hAppParms); $hTE := NIL; $doneflag := true; "END "ELSE "BEGIN $InitMenus; { initialize Menu Manager } $myMenus[appleMenu] := GetMenu(appleMenu); $myMenus[appleMenu]^^.menudata[1] := CHR(Applesymbol); $AddResMenu(myMenus[1],'DRVR'); { desk accessories } $For counter := FileMenu to EditMenu DO myMenus[counter] := GetMenu(counter); "{$IFC BUG > -1} $myMenus[DebugMenu] := GetMenu(100); { temporary debug menu } "{$ENDC} "{$IFC BUG = 1} $extdebughdl := GetString (261); $Hlock (Pointer(extdebughdl)); $AppendMenu (myMenus[DebugMenu], extdebughdl^^); $HUnlock (Pointer(extdebughdl)); $ReleaseResource (Pointer(extdebughdl)); $CheckItem (MyMenus[DebugMenu], 3, debug); "{$ENDC} $FOR counter:=1 TO lastMenu DO InsertMenu(myMenus[counter],0); $DrawMenuBar; $dragRect := screenbits.bounds; $dragrect.top := dragrect.top + 20; {leave room for menu bar} $growRect := dragRect; $InsetRect (dragrect, 4, 4); {leave some of dragged rectangle on screen} $growrect.left := {replace this with the max font width + constant} 80; $growrect.top := 80 {18 + 16*3 + slop?}; $doneFlag := FALSE; $printflag := false; $windownum := 1; $windowpos := 0; $TypelistPtr := @MyFileTypes; $typelistptr^[0] := 'TEXT'; $TxtFile.fdType := 'TEXT'; $TxtFile.fdCreator := 'CARY'; $SetPt (txtfile.fdLocation,0,0); $txtfile.fdFlags:= 0; $txtfile.fdFldr:= 0; $Laststate := 0; {eventually, init laststate to scrapstate - 1?} $HLock (hAppParms); $For counter := 1 to numfiles Do %With tempptr^ DO $BEGIN &If ftype = 'TEXT' then &BEGIN (MakeAWindow (fName, TRUE); {**could async open while this is going on} (if counter < numfiles then DialogueDeactivate; (If Not ReadFile (vRefNum, fName) then (BEGIN *{if nothing was read, then +dispose of the window, TEdata, etc, depending on how far we got} (END; (tempptr := Pointer(Ord4 (tempptr) + length(fName) + 10 - length(fName) MOD 2) &END $END; $HUnlock (hAppParms); $If Frontwindow = NIL then $BEGIN &OpenaWindow; $END; ${if something 'TEXT' is in deskscrap then allow paste} $DScrap := InfoScrap; $LastState := DScrap^.scrapState; $If DScrap^.scrapsize > 0 then LastState := LastState - 1; ${what about when scrapsize is too big?} $Scrapwind := NIL; "{$IFC BUG > -1} $Freewind := NIL "{$ENDC} "END END; { of SetUp} {$S } {------------------------------------------------------------------------------------} PROCEDURE MainEventLoop; Var code: integer; {the type of mousedown event} $dummy: boolean; $str : str255; BEGIN {This event loop handles most of the communications between this program and events taking place in the outside world. This procedure could also be called as the printer idle procedure so that the program appears to be doing background printing.} "if debug then debuginproc (proc, 'MainEventLoop', @MainEventLoop); "REPEAT $CursorAdjust; $SystemTask; $if printflag then $BEGIN {unload the world} &UnloadSeg (@CursorAdjust); &UnloadSeg (@ReadFile); &UnloadSeg (@WriteFile); &UnloadSeg (@AboutMyEditor); &UnloadSeg (@MyDisable); &UnloadSeg (@Scrollbits); {*** segmenting badly out of date} &GetWTitle (MyWindow, str); &Myprint(TRUE, str) $END; $dummy := GetNextEvent(everyEvent,myEvent); $CASE myEvent.what OF $mouseDown: &BEGIN (code := FindWindow(myEvent.where,tempWindow); (CASE code OF (inMenuBar: DoCommand(FALSE); (inSysWindow: InSystemWindow; (inDrag: DragWindow(tempWindow,myEvent.where,dragRect); (inGoAway: IF TrackGoAway(tempWindow,myEvent.where) THEN CloseAWindow; (inGrow: *If Mypeek^.windowkind in [8,9] then *BEGIN ,GrowWnd; ,UnloadSeg (@GrowWnd) *End; (inContent: *BEGIN ,IF tempWindow <> FrontWindow ,THEN SelectWindow (tempWindow) ,ELSE -IF hTE <> NIL THEN ,BEGIN .MyPoint := MyEvent.where; .GlobalToLocal (MyPoint); .IF PtInRect (MyPoint, hTE^^.viewrect) .THEN .BEGIN 0If debug THEN Writeln (debugger, 'point in HTE viewrect', lf); 3IF (BitAnd (myEvent.modifiers, 512) <> 0 ) { Shift key pressed } 3THEN TEClick (MyPoint, TRUE, hTE) 3ELSE TEClick (MyPoint, FALSE, hTE) .END .ELSE MyControls ,END {hTE <> NIL} *END {in Content} (END { of code case } &END; { of mouseDown } $keyDown, autoKey: &BEGIN (theChar := CHR(myEvent.message MOD 256); (IF BitAnd(myEvent.modifiers,256) <> 0 { Command key pressed } (THEN DoCommand(TRUE) (ELSE IF hTE <> NIL THEN (BEGIN *TEKey(theChar,hTE); *windowdata^^.changed := true; *ScrollText (TRUE) (END &END; { of keyDown } $activateEvt: &Begin (MyActivate; (UnloadSeg (@MyActivate) &End; $updateEvt: DrawWindow; $nullEvent: If doneflag AND (FrontWindow <> NIL) Then CloseAWindow $END; { of event case } "UNTIL doneFlag AND (FrontWindow = NIL); END; BEGIN { main program } {Please don't look at this program as the the last word in example programming, and be very cautious about porting some portion of this program over to your own code.} "SetUp; "UnloadSeg (@Setup); "if not finderprint then MainEventLoop; "SetCursor (watchHdl^^); "PrClose END. 3. "6F^5D!$ǐ^EIHH;;file= Misc:FileAsm ;------------------------------------------------------------------------------- ; These routines provides the Pascal programmer with assembly-like constructs ; that Pascal can not perform easily. ; ; FUNCTION GlobalAddr ; ; Given a low memory location name (a constant in the example program File), ; the correct address for the routine is returned. This function should be ; declared in the first part of your program as : ; ; FUNCTION GetGlobalAddr (GlobalConst : Integer): Ptr; External; ; ; Suppose a pointer in your program is declared as: ; ; VAR somePtr : Ptr; ; ; To store a value in a global location, do the following: ; ; somePtr := GetGlobalAddr (AGlobal); ; somePtr^ := NewGlobalValue; ; ; Note that since Ptr is defined as ^signedbyte, this only writes a single byte. ; ; To write to some other data type, you must declare a pointer to that ; data type, and then use the Pointer function to equate the result of this ; function to that data type. For example, to write a long word, declare a new ; variable: ; ; VAR bignumptr = ^LongInt; ; ; Then, equate the variable to the function, and assign a value to it to perform ; the write: ; ; bignumptr := Pointer (GetGlobalAddr (AGlobal)); ; bignumptr^ := some long integer expression ; ; ; FUNCTION GlobalValue ; ; Given a low memory location name (a constant in the example program File), ; the value stored at that low memory address is returned. This function should ; be declared in the first part of your program as : ; ; FUNCTION GlobalValue (GlobalConst : Integer): LongInt; External; ; ; Just assign the function result to a long integer to return that value. ; ; To read some other data type, you must declare a pointer to that data type, ; and then use the Pointer function to equate this result to that data type. ; ; For example, to read a global value into your own special handle, assign: ; ; MyHandle := Pointer(GlobalValue (AGlobal)); ; ; Note that this does not create a new or duplicate handle called MyHandle. This ; only provides you with a method of manipulating the existing handle contained in ; AGlobal. ; ; MODIFICATION HISTORY ; ; 06-Feb-84 CRC New Today ;------------------------------------------------------------------------------- ; *.NOLIST *.INCLUDE Tlasm:SysEqu.Text *.INCLUDE Tlasm:ToolEqu.Text *.LIST ; FUNCTION GlobalAddr (GlobalConst : Integer): Ptr; ; FUNCTION GlobalValue (GlobalConst : Integer): LongInt; *.FUNC GlobalAd,0 *.DEF GlobalVa *MOVEQ #0,D1 ;address entry *BRA.S GlobStart GlobalVa MOVEQ #1,D1 ;data entry GlobStart MOVE.L (SP)+,A1 ;preserve return address *MOVE.W (SP)+,D0 ;the routine # requested *ASL #2,D0 ;make it into a long offset *LEA TableBase,A0 ;get beginning of table *MOVE.L 0(A0,D0),A0 ;get the value out of the table *TST D1 ;which entry? *BEQ.S @1 ;branch if address *MOVE.L (A0),A0 ;dereference if data @1 MOVE.L A0,(SP) ;and put value in function return *JMP (A1) ;bye for now ; These addresses were chosen because they are frequently needed by applications, ; and are not readily available in existing globals or ToolBox calls. ; any address can be read as data or written to as an address. ; Additional globals will be added as they are requested. TableBase .LONG TEScrpLength ;the length of the private TextEdit scrap *.LONG TEScrpHandle ;the handle to the private TextEdit scrap *.LONG dlgFont ;the font used inside alerts and dialogs *.LONG ScrVRes ;screen vertical resolution (dots/inch) *.LONG ScrHRes ;screen horizontal resolution (dots/inch) *.LONG doubleTime ;double click time in 4/60's of a second *.LONG caretTime ;caret blink time in 4/60's of a second *.LONG ANumber ;the active alert *.LONG ACount ;the alert stage level (.END 3. "6F^5D!$ǐ^?FF[&* FileResDef -- Resource input for sample application named File * Written by Macintosh User Education MAC:File.Rsrc Type CARY = STR #,0 File Version 1.0 February 6, 1983 Type FREF = HEXA #,128(32) 4150504C 0000 00 Type FREF = HEXA #,129(32) 54455854 0001 00 Type BNDL = HEXA #,128 434152590000 0001 49434E230001 0000 0080 0001 0081 465245460001 0000 0080 0001 0081 Type ICN# = HEXA ,128(32) 00000000 00000000 00000000 00020000 00050000 00088038 00104044 00202082 00401102 00800A82 01000544 02000AA8 04001550 08002AA0 10005540 2000AAA0 40001510 80010A08 40000410 20030820 1003A040 08038080 04000100 02000200 01000400 00800800 00401000 00202000 00104000 00088000 00050000 00020000 00000000 00000000 00000000 00020000 00070000 000F8038 001FC07C 003FE0FE 007FF1FE 00FFFBFE 01FFFFFC 03FFFFF8 07FFFFF0 0FFFFFE0 1FFFFFC0 3FFFFFE0 7FFFFFF0 FFFFFFF8 7FFFFFF0 3FFFFFE0 1FFFFFC0 0FFFFF80 07FFFF00 03FFFE00 01FFFC00 00FFF800 007FF000 003FE000 001FC000 000F8000 00070000 00020000 ,129 (32) 0FFFF800 08000400 08000600 08000500 08000480 08000438 08000444 08000682 08000102 08000282 08000544 08000AA8 08001550 08002AA0 08005550 0800AA90 08001510 08010A10 08000410 08030810 0803A010 08038010 08000010 08000010 08000010 08000010 08000010 08000010 08000010 08000010 08000010 0FFFFFF0 0FFFF800 0FFFFC00 0FFFFE00 0FFFFF00 0FFFFF80 0FFFFFF8 0FFFFFFC 0FFFFFFE 0FFFFFFE 0FFFFFFE 0FFFFFFC 0FFFFFF8 0FFFFFF0 0FFFFFE0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 0FFFFFF0 Type MENU ",1 "@ $About File $(- ",2 "File $New $Open $Close $Save $Save As $Revert to Saved $Page Setup $Print $Quit ",3 "Edit $Undo/Z $(- $Cut/X $Copy/C $Paste/V $Clear $Select All/A $(- $Show Clipboard ",100 "Debug $Show FreeMem $Compact Memory * document window Type WIND ",256 x "50 40 158 472 "Visible NoGoAway "2 "0 ",257 Clipboard "262 4 337 446 "Visible GoAway "0 "0 ",258 FreeMem "320 442 341 511 "Visible NoGoAway "0 "0 * vertical scroll bar Type CNTL ",256 x "-1 395 236 411 "invisible "16 "0 "0 0 0 Type DITL ",256 "4 $BtnItem Enabled $90 13 110 83 Yes $BtnItem Enabled $90 177 110 247 Cancel $BtnItem Enabled $90 95 110 165 No $StatText Disabled $10 10 70 260 Do you want to save changes made to '^0'^1? ",257 "3 $BtnItem Enabled $90 267 110 337 OK $StatText Disabled $10 60 70 350 An error occured while ^0 the disk. The file '^1' was not ^2. $StatText Disabled $90 10 110 150 ID = ^3 ",258 "2 $StatText Disabled $5 10 40 370 The document file '^0' is being spooled to disk and printed. $StatText Disabled $45 10 80 370 Hold the ^1 key down and press 'period' to stop the printing process. ",259 "3 $BtnItem Enabled $90 13 110 83 OK $BtnItem Enabled $90 267 110 337 Cancel $StatText Disabled $10 60 70 350 Are you sure you want to revert back to the old version of this file? * this is the 'dirty save' dialog Type DLOG ",256 "60 126 180 386 "Visible 1 NoGoAway 0 "256 * this is the 'press command-period to stop printing' dialog ",257 "120 66 205 446 "Visible 1 NoGoAway 0 "258 Type ALRT * a stop alert - an error occured while reading or writing the disk ",256 "60 81 180 431 "257 "5555 * a caution alert - a file is changed and 'Revert to Saved' is chosen ",257 "60 81 180 431 "259 "CCCC Type STR ",256 Untitled- ",257 Save this document as: ",259 File, by Cary Clark Version 1.0 February 7, 1984 ",260 This example was written to demonstrate the Macintosh User Interface. ",261 External Debugger ",262 Show Clipboard ",263 Hide Clipboard ",264 Show FreeMem ",265 Hide FreeMem ",266 before quitting ",267 reading from ",268 writing to ",269 loaded ",270 saved Type CODE "misc:fileL,0 3. "6F^5D!$ǐ^PROGRAM Grow; { Grow -- Scroll bars and a resizable window added to Edit } { by Cary Clark, Macintosh Technical Support } USES {$U Obj:QuickDraw } QuickDraw, &{$U Obj:OSIntf } OSIntf, &{$U Obj:ToolIntf } ToolIntf; CONST lastMenu = 3; { number of menus } &appleMenu = 1; { menu ID for desk accessory menu } &fileMenu = 256; { menu ID for File menu } &editMenu = 257; { menu ID for Edit menu } VAR myMenus: ARRAY [1..lastMenu] OF MenuHandle; $growRect, dragRect, pRect, tRect: Rect; $doneFlag, temp: BOOLEAN; $myEvent: EventRecord; $code, refNum, MyControl, t: INTEGER; $wRecord: WindowRecord; $theWindow, whichWindow: WindowPtr; $theMenu, theItem: INTEGER; $theChar: CHAR; $ticks: LongInt; $hTE: TEHandle; $hCurs: CursHandle; $iBeam: Cursor; $hScroll, vScroll, whichControl : ControlHandle; $TheOrigin : point; PROCEDURE SetUpMenus; { Once-only initialization for menus } VAR i: INTEGER; $appleTitle: STRING[1]; BEGIN "InitMenus; { initialize Menu Manager } "appleTitle := ' '; appleTitle[1] := CHR(20); "myMenus[1] := NewMenu(appleMenu,appleTitle); "AddResMenu(myMenus[1],'DRVR'); { desk accessories } "myMenus[2] := GetMenu(fileMenu); "myMenus[3] := GetMenu(editMenu); "FOR i:=1 TO lastMenu DO InsertMenu(myMenus[i],0); "DrawMenuBar; END; { of SetUpMenus } PROCEDURE CursorAdjust; { Makes cursor be I-beam inside the (active) application window's } { content region (except for size box and scroll bar areas). } VAR mousePt: Point; BEGIN "GetMouse(mousePt); "IF theWindow = FrontWindow $THEN &BEGIN (IF (PtInRect(mousePt,pRect)) *THEN SetCursor(iBeam) *ELSE SetCursor(arrow); &END; END; PROCEDURE DoCommand (mResult: LongInt); VAR name: STR255; BEGIN "theMenu := HiWord(mResult); theItem := LoWord(mResult); "CASE theMenu OF "appleMenu: $BEGIN &GetItem(myMenus[1],theItem,name); &refNum := OpenDeskAcc(name); $END; "fileMenu: $doneFlag := TRUE; { Quit } "editMenu: $BEGIN &IF NOT SystemEdit(theItem-1) (THEN *BEGIN ,SetPort(theWindow); ,ClipRect(pRect); ,{ Delay so menu title will stay lit a little while if Command key } ,{ equivalent was typed. } ,ticks := TickCount + 30; ,REPEAT UNTIL ticks <= TickCount; ,CASE theItem OF ,1: TECut(hTE); ,2: TECopy(hTE); ,3: TEPaste(hTE); ,END; { of item case } *END; $END; { of editMenu } "END; { of menu case } "HiliteMenu(0); END; { of DoCommand } PROCEDURE MoveScrollBars; BEGIN "WITH theWindow^.portRect DO %BEGIN 'HideControl(vScroll); 'MoveControl(vScroll,right-15,top-1); 'SizeControl(vScroll,16,bottom-top-13); 'ShowControl(vScroll); 'HideControl(hScroll); 'MoveControl(hScroll,left-1,bottom-15); 'SizeControl(hScroll,right-left-13,16); 'ShowControl(hScroll) %END END; PROCEDURE ResizePRect; BEGIN "pRect := thePort^.portRect; "pRect.left := pRect.left+4; pRect.right := pRect.right-15; "pRect.bottom := pRect.bottom-15 END; PROCEDURE GrowWnd (whichWindow: WindowPtr); { Handles growing and sizing the window and manipulating } { the update region. } VAR longResult: LongInt; $height, width: INTEGER; $trect : rect; BEGIN "longResult := GrowWindow(whichWindow,myEvent.where,growRect); "IF longResult = 0 THEN EXIT(GrowWnd); "height := HiWord(longResult); width := LoWord(longResult); "{ Add the old "scroll bar area" to the update region so it will } "{ be redrawn (for when the window is enlarged). } "tRect := whichWindow^.portRect; tRect.left := tRect.right-16; "InvalRect(tRect); "tRect := whichWindow^.portRect; tRect.top := tRect.bottom-16; "InvalRect(tRect); "{ Now draw the newly sized window. } "SizeWindow(whichWindow,width,height,TRUE); "MoveScrollBars; "ResizePRect; "{ Adjust the view rectangle for TextEdit. } "hTE^^.viewRect := pRect; "{ Add the new "scroll bar area" to the update region so it will } "{ be redrawn (for when the window is made smaller). } "tRect := whichWindow^.portRect; tRect.left := tRect.right-16; "InvalRect(tRect); "tRect := whichWindow^.portRect; tRect.top := tRect.bottom-16; "InvalRect(tRect); END; { of GrowWnd } PROCEDURE DrawWindow (whichWindow: WindowPtr); { Draws the content region of the given window, after erasing whatever } { was there before. } VAR i: INTEGER; BEGIN "ClipRect(whichWindow^.portRect); "EraseRect(whichWindow^.portRect); "DrawGrowIcon(whichWindow); "DrawControls (whichWindow); "TEUpdate(pRect,hTE) END; { of DrawWindow } PROCEDURE ScrollBits; VAR oldOrigin: Point; $dh, dv : INTEGER; BEGIN "WITH TheWindow^ DO $BEGIN &oldOrigin := theOrigin; &theOrigin.h := 4*GetCtlValue(hScroll); &theOrigin.v := 4*GetCtlValue(vScroll); &dh := oldOrigin.h - theOrigin.h; &dv := oldOrigin.v - theOrigin.v; &TEScroll (dh, dv, hTE) $END END; PROCEDURE ScrollUp(whichControl:ControlHandle; theCode: INTEGER); BEGIN "IF theCode = inUpButton THEN %BEGIN 'SetCtlValue(whichControl,GetCtlValue(whichControl)-1); 'ScrollBits %END END; PROCEDURE ScrollDown(whichControl:ControlHandle; theCode: INTEGER); BEGIN "IF theCode = inDownButton THEN %BEGIN 'SetCtlValue(whichControl,GetCtlValue(whichControl)+1); 'ScrollBits %END END; PROCEDURE PageScroll(code, amount: INTEGER); VAR myPt: Point; BEGIN "REPEAT $GetMouse(myPt); $IF TestControl(whichControl,myPt) = code THEN 'BEGIN )SetCtlValue(whichControl,getCtlValue(whichControl)+amount); )ScrollBits 'END "UNTIL NOT StillDown; END; BEGIN { main program } "InitGraf(@thePort); "InitFonts; "FlushEvents(everyEvent,0); "InitWindows; "SetUpMenus; "TEInit; "InitDialogs(NIL); "SetCursor(arrow); "SetRect(dragRect,4,24,508,338); "SetRect(growRect,100,60,512,302); "doneFlag := FALSE; "theWindow := GetNewWindow(256,@wRecord,POINTER(-1)); "SetPort(theWindow); "theWindow^.txFont := 2; "ResizePrect; "hTE := TENew(pRect,pRect); "hCurs := POINTER(ORD(GetCursor(256))); iBeam := hCurs^^; "vScroll := GetNewControl(256,TheWindow); "hScroll := GetNewControl(257,TheWindow); "theOrigin.h := 0; theOrigin.v := 0; "REPEAT $CursorAdjust; $SystemTask; $TEIdle(hTE); $temp := GetNextEvent(everyEvent,myEvent); $CASE myEvent.what OF $mouseDown: &BEGIN (code := FindWindow(myEvent.where,whichWindow); (CASE code OF (inMenuBar: *DoCommand(MenuSelect(myEvent.where)); (inSysWindow: *SystemClick(myEvent,whichWindow); (inDrag: *DragWindow(whichWindow,myEvent.where,dragRect); (inGoAway: *IF TrackGoAway(whichWindow,myEvent.where) ,THEN doneFlag := TRUE; (inGrow: *IF whichWindow = FrontWindow ,THEN GrowWnd(whichWindow) ,ELSE SelectWindow(whichWindow); (inContent: (BEGIN *IF whichWindow <> FrontWindow *THEN SelectWindow(whichWindow) *ELSE *BEGIN {front} ,GlobalToLocal(myEvent.where); ,IF PtInRect (myEvent.where, PRect) ,THEN IF BitAnd(myEvent.modifiers,512) <> 0 { Shift key pressed } .THEN TEClick(myEvent.where,TRUE,hTE) .ELSE TEClick(myEvent.where,FALSE,hTE) ,ELSE ,BEGIN {controls} .MyControl := FindControl(myEvent.where,whichWindow,whichControl); .Case MyControl of 0inUpButton: t := END .END {Case MyControl} ,END {controls} *END {front} (END {in Content} &END { of code case } $END; { of mouseDown } $keyDown, autoKey: &BEGIN (IF theWindow = FrontWindow *THEN ,BEGIN .theChar := CHR(myEvent.message MOD 256); .IF BitAnd(myEvent.modifiers,256) <> 0 { Command key pressed } 0THEN DoCommand(MenuKey(theChar)) 0ELSE TEKey(theChar,hTE) ,END &END; { of keyDown } $activateEvt: &BEGIN (DrawGrowIcon(theWindow); (IF ODD (myEvent.modifiers) THEN { window is becoming active } (BEGIN *TEActivate(hTE); *ShowControl (vScroll); *ShowControl (hScroll) (END ELSE (BEGIN *TEDeactivate(hTE); *HideControl (vScroll); *HideControl (hScroll) (END &END; { of activateEvt } $updateEvt: &BEGIN (BeginUpdate(theWindow); (DrawWindow(theWindow); (EndUpdate(theWindow) &END { of updateEvt } $END { of event case } "UNTIL doneFlag END. 3. "6F^5D!$ǐ^!2&2&* GrowResDef -- Resource input for sample application named Grow * Written by Macintosh User Education MAC:Grow.Rsrc Type MENU ",256 "File $Quit ",257 "Edit $Cut/X $Copy/C $Paste/Z Type WIND ",256 "A Sample "50 40 300 450 "Visible GoAway "0 "0 Type CNTL ",256 "vertical scroll bar "-1 395 236 411 "Visible "16 "0 "0 0 50 ",257 "horizontal scroll bar "235 -1 251 396 "Visible "16 "0 "0 0 50 Type CURS ",256 "38383C780280010001000100010001000100010001000100010002803C783838 "38383C780280010001000100010001000100010001000100010002803C783838 "0008 0008 Type GROW= STR ,0 Grow Version 1.0 - January 8, 1984 Type CODE "misc:growL,0 W^g5P:H r^_5kk PROGRAM SoundDemo; { Program to play with the new proto sound } { written by Andy Hertzfeld Oct 3, 1982 } { modified for 4 voice ROM sound -- Nov 2, 1982 } { for ROM 4T -- Jun 18, 1983 } { made to run under ToolBox, OSInterfc -- Jan 8, 1983 } USES {$U Obj:QuickDraw } QuickDraw, %{$U Obj:OSIntf } OSIntf, %{$U Obj:ToolIntf } ToolIntf; VAR tempRect: Rect; $mousePt,myPt: Point; $myEvent: EventRecord; $theFolder: WindowPtr; $doneFlag: Boolean; $theMenu,theItem: INTEGER; $code: INTEGER; $whichWindow: WindowPtr; $whichControl: ControlHandle; $folRect: Rect; $mBox: Rect; $dial1,dial2,dial3,dial4: ControlHandle; $dialV: ControlHandle; $fullRect: Rect; $soundTable: SoundStruct; $wave1,wave2,wave3,wave4: Wave; $t,I: INTEGER; $waveWindow,topWindow: WindowPtr; $whichWave: INTEGER; $myMenu,menu2,menu3,deskMenu: MenuHandle; $mResult: LongInt; $title1,title2,title3,title4: Str255; $offSwitch: BOOLEAN; $myString: Str255; $refNum: INTEGER; PROCEDURE SetUpMenus; {once only initialization for menus} VAR I : Integer; %menuFile : Text; %drvrType: ResType; BEGIN $InitMenus; {initialize Unit Menus} $drvrType := 'DRVR'; $myMenu := GetMenu(1); $menu2 := GetMenu(2); $menu3 := GetMenu(3); $deskMenu:= NewMenu(4,'@'); $AddResMenu(deskMenu,drvrType); $InsertMenu(deskMenu,0); $InsertMenu(myMenu,0); $InsertMenu(menu2,0); $InsertMenu(menu3,0); $DrawMenuBar; END; PROCEDURE MakeTheFolder; { set up and draw one folder } VAR tempRect: Rect; $folName: Str255; $tempPt: Point; BEGIN "theFolder := GetNewWindow(1,NIL,NIL); "waveWindow := GetNewWindow(2,NIL,theFolder); "topWindow := theFolder; END; PROCEDURE MakeTheDials; VAR tempRect: Rect; BEGIN "SetRect(mBox,120,30,280,46); "dial1 := NewControl(theFolder,mBox,' ',TRUE,0,0,8191,ScrollBarProc,1); "SetRect(mBox,120,60,280,76); "dial2 := NewControl(theFolder,mBox,' ',TRUE,0,0,8191,ScrollBarProc,2); "SetRect(mBox,120,90,280,106); "dial3 := NewControl(theFolder,mBox,' ',TRUE,0,0,8191,ScrollBarProc,3); "SetRect(mBox,120,120,280,136); "dial4 := NewControl(theFolder,mBox,' ',TRUE,0,0,8191,ScrollBarProc,4); "SetRect(mBox,76,160,256,192); "dialV := NewControl(theFolder,mBox,' ',TRUE,7,0,7,ScrollBarProc,5); END; PROCEDURE LabelControls; BEGIN "MoveTo(30,42); "DrawString('Channel A'); "MoveTo(30,72); "DrawString('Channel B'); "MoveTo(30,102); "DrawString('Channel C'); "MoveTo(30,132); "DrawString('Channel D'); "MoveTo(140,208); "DrawString('Volume'); END; PROCEDURE Triangle(VAR theWave: Wave); { make a simple triangle wave } VAR i: INTEGER; BEGIN "FOR i := 0 TO 127 DO $BEGIN &theWave[i] := chr(2*i); &theWave[255-i] := chr(2*i); $END; END; PROCEDURE mysine(VAR sine: Wave); BEGIN "Sine[0] := chr(128); "Sine[1] := chr(131); "Sine[2] := chr(134); "Sine[3] := chr(137); "Sine[4] := chr(140); "Sine[5] := chr(143); "Sine[6] := chr(146); "Sine[7] := chr(149); "Sine[8] := chr(152); "Sine[9] := chr(156); "Sine[10] := chr(159); "Sine[11] := chr(162); "Sine[12] := chr(165); "Sine[13] := chr(168); "Sine[14] := chr(171); "Sine[15] := chr(174); "Sine[16] := chr(176); "Sine[17] := chr(179); "Sine[18] := chr(182); "Sine[19] := chr(185); "Sine[20] := chr(188); "Sine[21] := chr(191); "Sine[22] := chr(193); "Sine[23] := chr(196); "Sine[24] := chr(199); "Sine[25] := chr(201); "Sine[26] := chr(204); "Sine[27] := chr(206); "Sine[28] := chr(209); "Sine[29] := chr(211); "Sine[30] := chr(213); "Sine[31] := chr(216); "Sine[32] := chr(218); "Sine[33] := chr(220); "Sine[34] := chr(222); "Sine[35] := chr(224); "Sine[36] := chr(226); "Sine[37] := chr(228); "Sine[38] := chr(230); "Sine[39] := chr(232); "Sine[40] := chr(234); "Sine[41] := chr(236); "Sine[42] := chr(237); "Sine[43] := chr(239); "Sine[44] := chr(240); "Sine[45] := chr(242); "Sine[46] := chr(243); "Sine[47] := chr(245); "Sine[48] := chr(246); "Sine[49] := chr(247); "Sine[50] := chr(248); "Sine[51] := chr(249); "Sine[52] := chr(250); "Sine[53] := chr(251); "Sine[54] := chr(252); "Sine[55] := chr(252); "Sine[56] := chr(253); "Sine[57] := chr(254); "Sine[58] := chr(254); "Sine[59] := chr(255); "Sine[60] := chr(255); "Sine[61] := chr(255); "Sine[62] := chr(255); "Sine[63] := chr(255); "Sine[64] := chr(255); "Sine[65] := chr(255); "Sine[66] := chr(255); "Sine[67] := chr(255); "Sine[68] := chr(255); "Sine[69] := chr(255); "Sine[70] := chr(254); "Sine[71] := chr(254); "Sine[72] := chr(253); "Sine[73] := chr(252); "Sine[74] := chr(252); "Sine[75] := chr(251); "Sine[76] := chr(250); "Sine[77] := chr(249); "Sine[78] := chr(248); "Sine[79] := chr(247); "Sine[80] := chr(246); "Sine[81] := chr(245); "Sine[82] := chr(243); "Sine[83] := chr(242); "Sine[84] := chr(240); "Sine[85] := chr(239); "Sine[86] := chr(237); "Sine[87] := chr(236); "Sine[88] := chr(234); "Sine[89] := chr(232); "Sine[90] := chr(230); "Sine[91] := chr(228); "Sine[92] := chr(226); "Sine[93] := chr(224); "Sine[94] := chr(222); "Sine[95] := chr(220); "Sine[96] := chr(218); "Sine[97] := chr(216); "Sine[98] := chr(213); "Sine[99] := chr(211); "Sine[100] := chr(209); "Sine[101] := chr(206); "Sine[102] := chr(204); "Sine[103] := chr(201); "Sine[104] := chr(199); "Sine[105] := chr(196); "Sine[106] := chr(193); "Sine[107] := chr(191); "Sine[108] := chr(188); "Sine[109] := chr(185); "Sine[110] := chr(182); "Sine[111] := chr(179); "Sine[112] := chr(176); "Sine[113] := chr(174); "Sine[114] := chr(171); "Sine[115] := chr(168); "Sine[116] := chr(165); "Sine[117] := chr(162); "Sine[118] := chr(159); "Sine[119] := chr(156); "Sine[120] := chr(152); "Sine[121] := chr(149); "Sine[122] := chr(146); "Sine[123] := chr(143); "Sine[124] := chr(140); "Sine[125] := chr(137); "Sine[126] := chr(134); "Sine[127] := chr(131); "Sine[128] := chr(128); "Sine[129] := chr(124); "Sine[130] := chr(121); "Sine[131] := chr(118); "Sine[132] := chr(115); "Sine[133] := chr(112); "Sine[134] := chr(109); "Sine[135] := chr(106); "Sine[136] := chr(103); "Sine[137] := chr(99); "Sine[138] := chr(96); "Sine[139] := chr(93); "Sine[140] := chr(90); "Sine[141] := chr(87); "Sine[142] := chr(84); "Sine[143] := chr(81); "Sine[144] := chr(79); "Sine[145] := chr(76); "Sine[146] := chr(73); "Sine[147] := chr(70); "Sine[148] := chr(67); "Sine[149] := chr(64); "Sine[150] := chr(62); "Sine[151] := chr(59); "Sine[152] := chr(56); "Sine[153] := chr(54); "Sine[154] := chr(51); "Sine[155] := chr(49); "Sine[156] := chr(46); "Sine[157] := chr(44); "Sine[158] := chr(42); "Sine[159] := chr(39); "Sine[160] := chr(37); "Sine[161] := chr(35); "Sine[162] := chr(33); "Sine[163] := chr(31); "Sine[164] := chr(29); "Sine[165] := chr(27); "Sine[166] := chr(25); "Sine[167] := chr(23); "Sine[168] := chr(21); "Sine[169] := chr(19); "Sine[170] := chr(18); "Sine[171] := chr(16); "Sine[172] := chr(15); "Sine[173] := chr(13); "Sine[174] := chr(12); "Sine[175] := chr(10); "Sine[176] := chr(9); "Sine[177] := chr(8); "Sine[178] := chr(7); "Sine[179] := chr(6); "Sine[180] := chr(5); "Sine[181] := chr(4); "Sine[182] := chr(3); "Sine[183] := chr(3); "Sine[184] := chr(2); "Sine[185] := chr(1); "Sine[186] := chr(1); "Sine[187] := chr(0); "Sine[188] := chr(0); "Sine[189] := chr(0); "Sine[190] := chr(0); "Sine[191] := chr(0); "Sine[192] := chr(0); "Sine[193] := chr(0); "Sine[194] := chr(0); "Sine[195] := chr(0); "Sine[196] := chr(0); "Sine[197] := chr(0); "Sine[198] := chr(1); "Sine[199] := chr(1); "Sine[200] := chr(2); "Sine[201] := chr(3); "Sine[202] := chr(3); "Sine[203] := chr(4); "Sine[204] := chr(5); "Sine[205] := chr(6); "Sine[206] := chr(7); "Sine[207] := chr(8); "Sine[208] := chr(9); "Sine[209] := chr(10); "Sine[210] := chr(12); "Sine[211] := chr(13); "Sine[212] := chr(15); "Sine[213] := chr(16); "Sine[214] := chr(18); "Sine[215] := chr(19); "Sine[216] := chr(21); "Sine[217] := chr(23); "Sine[218] := chr(25); "Sine[219] := chr(27); "Sine[220] := chr(29); "Sine[221] := chr(31); "Sine[222] := chr(33); "Sine[223] := chr(35); "Sine[224] := chr(37); "Sine[225] := chr(39); "Sine[226] := chr(42); "Sine[227] := chr(44); "Sine[228] := chr(46); "Sine[229] := chr(49); "Sine[230] := chr(51); "Sine[231] := chr(54); "Sine[232] := chr(56); "Sine[233] := chr(59); "Sine[234] := chr(62); "Sine[235] := chr(64); "Sine[236] := chr(67); "Sine[237] := chr(70); "Sine[238] := chr(73); "Sine[239] := chr(76); "Sine[240] := chr(79); "Sine[241] := chr(81); "Sine[242] := chr(84); "Sine[243] := chr(87); "Sine[244] := chr(90); "Sine[245] := chr(93); "Sine[246] := chr(96); "Sine[247] := chr(99); "Sine[248] := chr(103); "Sine[249] := chr(106); "Sine[250] := chr(109); "Sine[251] := chr(112); "Sine[252] := chr(115); "Sine[253] := chr(118); "Sine[254] := chr(121); "Sine[255] := chr(124); END; PROCEDURE Square(VAR theWave: Wave); { make a simple sqaure wave } VAR i: INTEGER; BEGIN "FOR i := 0 TO 127 DO $BEGIN &theWave[i] := chr(255); &theWave[255-i] := chr(0); $END; END; PROCEDURE CopyWave(VAR src,dst: Wave); VAR I: INTEGER; BEGIN "FOR I := 0 TO 255 DO DST[I] := SRC[I]; END; PROCEDURE InitSTab; VAR l: LongInt; BEGIN "SoundTable.duration := 8192; "l := 256; "soundTable.snd1Rate := L*GetCtlValue(dial1); "soundTable.snd1Phase := 0; "soundTable.snd2Rate := L*GetCtlValue(dial2); "soundTable.Snd2Phase := 0; "soundTable.snd3Rate := L*GetCtlValue(dial3); "soundTable.snd3Phase := 0; "soundTable.snd4Rate := L*GetCtlValue(dial4); "soundTable.snd4Phase := 0; "soundTable.snd1Wave := @wave1; "soundTable.snd2Wave := @wave2; "soundTable.snd3Wave := @wave3; "soundTable.snd4Wave := @wave4; END; PROCEDURE SetPitch(voiceIndex: INTEGER; pitch: INTEGER); VAR L: LongInt; BEGIN "L := 256; "Case VoiceIndex of $1: soundTable.snd1Rate := L*pitch; $2: soundTable.snd2Rate := L*pitch; $3: soundTable.snd3Rate := L*pitch; $4: soundTable.snd4Rate := L*pitch "END END; PROCEDURE BumpDial(whichControl: controlHandle; amount: INTEGER); VAR v: INTEGER; BEGIN #v := GetCtlValue(whichControl); #SetCtlValue(whichControl,v+Amount); #v := v + amount; #IF whichControl = dial1 THEN SetPitch(1,v) #ELSE IF whichControl = dial2 THEN SetPitch(2,v) #ELSE IF whichControl = dial3 THEN SetPitch(3,v) #ELSE IF whichControl = dial4 THEN SetPitch(4,v) #ELSE SetSndVol(v) END; PROCEDURE ScrollUp(whichControl: ControlHandle; theCode: INTEGER); BEGIN "IF theCode = inUpButton THEN BumpDial(whichControl,-1); END; PROCEDURE ScrollDown(whichControl: ControlHandle; theCode: INTEGER); BEGIN "IF theCode = inDownButton THEN BumpDial(whichControl,1); END; PROCEDURE PageUp(whichControl: ControlHandle; theCode: INTEGER); BEGIN "IF theCode = inPageUp THEN $IF whichControl <> DialV THEN BumpDial(whichControl,-200) $ELSE BumpDial(whichControl,-1) END; PROCEDURE PageDown(whichControl: ControlHandle; theCode: INTEGER); BEGIN "IF theCode = inPageDown THEN %IF whichControl <> DialV THEN BumpDial(whichControl,200) %ELSE BumpDial(whichControl,1); END; PROCEDURE DrawTheWave(theWave: Wave); VAR I,J : INTEGER; BEGIN "EraseRect(thePort^.portRect); "FOR I := 0 TO 255 DO $BEGIN &J := 255 - ORD(theWave[I]); &SetRect(tempRect,I,J,I+1,J+1); &PaintRect(tempRect); $END; END; PROCEDURE DrawWaveFolder; BEGIN "SetPort(waveWindow); "IF whichWave = 1 THEN DrawTheWave(wave1) "ELSE IF whichWave = 2 THEN DrawTheWave(wave2) "ELSE IF whichWave = 3 THEN DrawTheWave(wave3) "ELSE IF whichWave = 4 THEN DrawTheWave(wave4); END; PROCEDURE SetNewPt(VAR theWave: wave; myPt: Point); VAR h,v,j: INTEGER; BEGIN "h := myPt.h; v := myPt.v; "IF (h < 0) OR (h > 255) THEN EXIT(SetNewPt); "IF (v < 0) OR (v > 255) THEN EXIT(SetNewPt); "IF v = ORD(theWave[h]) THEN EXIT(SetNewPt); "j := 255 - ORD(theWave[h]); "SetRect(tempRect,h,J,h+1,J+1); "EraseRect(tempRect); "tempRect.top := v; tempRect.bottom := tempRect.top + 1; "PaintRect(tempRect); "theWave[h] := CHR(255 - v); END; PROCEDURE EditTheWave(VAR theWave: Wave); VAR lastX,lastY: INTEGER; $i: INTEGER; $thePt: Point; BEGIN "GetMouse(myPt); "lastX := myPt.h; lastY := myPt.v; "WHILE StillDown DO $BEGIN &GetMouse(myPt); &IF myPt.h = lastX THEN SetNewPt(theWave,myPt) &ELSE IF myPt.h < lastX THEN (BEGIN *i := lastX - 1; *REPEAT -thePt.h := i; -thePt.v := lastY; -SetNewPt(theWave,thePt); -i := i - 1; *UNTIL i < myPt.h; (END &ELSE (BEGIN *i := lastX + 1; *REPEAT -thePt.h := i; -thePt.v := lastY; -SetNewPt(theWave,thePt); -i := i + 1; *UNTIL i > myPt.h; (END; &lastX := myPt.h; lastY := myPt.v; #END; END; PROCEDURE EditWaveForm; BEGIN "SetPort(waveWindow); "IF whichWave = 1 THEN EditTheWave(wave1) "ELSE IF whichWave = 2 THEN EditTheWave(wave2) "ELSE IF whichWave = 3 THEN EditTheWave(wave3) "ELSE IF whichWave = 4 THEN EditTheWave(wave4); END; PROCEDURE ChangeTheWave(which: INTEGER; VAR theWave: Wave); BEGIN "IF which = 1 THEN Triangle(theWave) "ELSE IF which = 2 THEN Square(theWave) "ELSE IF which = 3 THEN mySine(theWave) "ELSE IF which = 4 THEN CopyWave(wave1,theWave) "ELSE IF which = 5 THEN CopyWave(wave2,theWave) "ELSE IF which = 6 THEN CopyWave(wave3,theWave) "ELSE IF which = 7 THEN CopyWave(wave4,theWave); "DrawWaveFolder; END; PROCEDURE ChangeWave(which: INTEGER); BEGIN "IF whichWave = 1 THEN ChangeTheWave(which,wave1) "ELSE IF whichWave = 2 THEN ChangeTheWave(which,wave2) "ELSE IF whichWave = 3 THEN ChangeTheWave(which,wave3) "ELSE IF whichWave = 4 THEN ChangeTheWave(which,wave4); END; PROCEDURE InitWave; BEGIN "Triangle(wave1); "Square(wave2); "mySine(wave3); "Triangle(wave4); END; BEGIN "InitGraf(@thePort); "InitFonts; "FlushEvents(everyEvent,0); "InitWindows; "SetUpMenus; "SetRect(fullRect,0,20,512,342); "title1 := 'Channel A WaveForm'; "Title2 := 'Channel B WaveForm'; "Title3 := 'Channel C WaveForm'; "Title4 := 'Channel D WaveForm'; "MakeTheFolder; "SetPort(theFolder); "MakeTheDials; "LabelControls; "doneFlag := FALSE; "InitWave; "DrawWaveFolder; "SetSndVol(7); "InitSTab; "StartSound(@SoundTable); "OffSwitch := FALSE; "whichWave := 1; "CheckItem(myMenu,1,TRUE); "InitCursor; "REPEAT $SystemTask; $SoundTable.duration := 8192; $IF GetNextEvent(everyEvent,myEvent) THEN 'CASE myEvent.what OF 'mouseDown: *BEGIN ,code := FindWindow(myEvent.where,whichWindow); ,myPt := myEvent.where; ,WITH whichWindow^.portBits.bounds DO -BEGIN /myPt.h := myPt.h + left; /myPt.v := myPt.v + top; -END; ,IF code = inMenuBar THEN /BEGIN 1theMenu:=0; theItem:=0; 1mResult := MenuSelect(myEvent.Where); 1theMenu := HiWord(mResult); theItem := LoWord(mResult); 1IF (theMenu = 1) AND (theItem > 0) THEN 4BEGIN 6CheckItem(myMenu,whichWave,FALSE); 6CheckItem(myMenu,theItem,TRUE); 6IF whichWave <> theItem THEN 9BEGIN ;IF theItem = 1 THEN SetWTitle(waveWindow,title1) ;ELSE IF theItem = 2 THEN SetWTitle(waveWindow,title2) ;ELSE IF theItem = 3 THEN SetWTitle(waveWindow,title3) ;ELSE IF theItem = 4 THEN SetWTitle(waveWindow,title4); ;whichWave := theItem; ;DrawWaveFolder; 9END; 5END 1ELSE IF (theMenu = 2) AND (theItem > 0) THEN ChangeWave(theItem) 1ELSE IF (theMenu = 3) THEN 6IF offSwitch THEN 9BEGIN ;StartSound(@SoundTable); ;offSwitch := FALSE; ;SetItem(menu3,1,'Sound Off'); 9END 6ELSE 9BEGIN ;SoundTable.duration := 1; ;FOR I := 1 TO 10000 DO; ;StopSound; ;offSwitch := TRUE; ;SetItem(menu3,1,'Sound On'); 8END 1ELSE IF (theMenu = 4) THEN 5BEGIN 7GetItem(deskMenu,theItem,myString); 7refNum := OpenDeskAcc(myString) 5END; 1HiLiteMenu(0); .END { onMenuBar } +ELSE IF code = inDesk THEN /BEGIN /END +ELSE IF code = inDrag THEN DragWindow(whichWindow,myEvent.where,fullRect) +ELSE IF code = inGoAway THEN .BEGIN 0IF TrackGoAway(whichWindow,myEvent.where) THEN 2doneFlag := TRUE; .END +ELSE IF code = inSysWindow THEN SystemClick(myEvent,whichWindow) +ELSE IF code = inContent THEN ,BEGIN .IF topWindow <> whichWindow THEN 1BEGIN 3SelectWindow(whichWindow); 3topWindow := whichWindow; 1END .ELSE IF whichWindow = waveWindow THEN EditWaveForm 0ELSE 2BEGIN 4code := FindControl(myPt,whichWindow,whichControl); 3IF code = inUpButton THEN t := TrackControl(whichControl,myPt,@scrollUp) 3ELSE IF code = inDownButton THEN t := TrackControl(whichControl,myPt,@scrollDown) 3ELSE IF code = inPageUp THEN t := TrackControl(whichControl,myPt,@pageUp) 3ELSE IF code = inPageDown THEN t := TrackControl(whichControl,myPt,@pageDown) 3ELSE IF code = inThumb THEN 6BEGIN 8code := TrackControl(whichControl,myPt,NIL); 8BumpDial(whichControl,0); 6END 2END ,END (END; { of button down } (updateEvt: *BEGIN ,whichWindow := Pointer(myEvent.message); ,SetPort(whichWindow); ,BeginUpdate(whichWindow); ,IF whichWindow = waveWindow THEN DrawWaveFolder ,ELSE .BEGIN 0DrawControls(whichWindow); 0LabelControls; .END; ,EndUpdate(whichWindow); *END; {of update event} (OTHERWISE BEGIN END; 'END; { of event case } #UNTIL doneFlag; #SoundTable.duration := 1; #FOR I := 1 TO 10000 DO; #StopSound; END. 3. "6F^5D!$ǐ^..* * Resource Definition File for Sound Demo * * Mac:SoundLab.Rsrc Type MENU ",1 "Channel $Channel A $Channel B $Channel C $Channel D ",2 "WaveForm $Triangle $Square $Sine $Channel A $Channel B $Channel C $Channel D #,3 #On/Off %Sound Off Type WIND ",1 "Mac Sound Lab "40 40 280 340 "Visible GoAway "0 "1 ",2 "Channel A WaveForm "100 100 356 356 "Visible GoAway "0 "3 Type CODE "misc:soundlabL,0 3. "6F^5D!$ǐ^ ; ; Six Package calls are supported: 0, 2, 4, 6, 8, 10 ; ; (0) FUNCTION FmtBadMnt(where: Point; evtmessage: longint): integer; ; ; (2) PROCEDURE FmtLoad; ; ; (4) PROCEDURE FmtUnLoad; ; ; (6) FUNCTION FmtFormat (drivenum: integer): integer; ; ; (8) FUNCTION FmtVerify (drivenum: integer): integer; ; ; (A) FUNCTION FmtZero (drivenum: integer; volname: str255): integer; ; ; Initialization consists of writing zeroed sectors on the disk, verifying the ; format, and then writing a blank file system directory on the diskette ; with the volume name provided by user input. ; ; Sample assembly accesses to disk formatter pack. Format CLR.W -(SP) ; space for result ,MOVE.W D3,-(SP) ; disk drive ,MOVE.W #6,-(SP) ; ask for format subroutine ,_Pack2 ; of format package ,MOVE.W (SP)+,D0 ; check for success ,RTS FmtVerify CLR.W -(SP) ; space for result ,MOVE.W D3,-(SP) ; disk drive ,MOVE.W #8,-(SP) ; ask for verify subroutine ,_Pack2 ; of format package ,MOVE.W (SP)+,D0 ; check for success ,RTS ZeroDir CLR.W -(SP) ; space for result ,MOVE.W D3,-(SP) ; disk drive ,MOVE.L A3,-(SP) ; pointer to volume name ,MOVE.W #10,-(SP) ; ask for zeroing subroutine ,_Pack2 ; of format package ,MOVE.W (SP)+,D0 ; check for success ,RTS 3. "6F^5D!$ǐ^DDSA PROCEDURE ZoomRect(VAR smallRect,bigRect: Rect; zoomUp: BOOLEAN); { Given two rectangles in global coords, interpolate one into the other, } { making a zooming rectangle image on the screen. The rectangles and the } { screen image are not altered } CONST zoomSteps = 16; VAR rect1,rect2,rect3,rect4: Rect; $i,j: INTEGER; $savePort: GrafPtr; $fract,factor,one: Fixed; { reals are too slow } #FUNCTION Blend(smallCoord,bigCoord: INTEGER): INTEGER; #VAR smallFix,bigFix,tempFix: Fixed; #BEGIN %smallFix:=one * smallCoord; { scale up to fixed point } %bigFix :=one * bigCoord; %tempFix :=FixMul(fract,bigFix) + FixMul(one-fract,smallFix); %Blend :=FixRound(tempFix); #END; BEGIN "GetPort(savePort); "SetPort(deskPort); "PenPat(gray); "PenMode(notPatXor); "one:=65536; { fixed point 'const' } "IF zoomUp "THEN $BEGIN &rect1:=smallRect; &factor:=FixRatio(6,5); { make bigger each time } &fract:=FixRatio(541,10000); { 5/6 ^16 = 0.540877 } $END "ELSE $BEGIN &rect1:=bigRect; &factor:=FixRatio(5,6); { make smaller each time } &fract:=one; { start full size } $END; "rect2:=rect1; "rect3:=rect1; "FrameRect(rect1); { draw initial image } "FOR i:=1 TO zoomSteps DO $BEGIN &rect4.left :=Blend(smallRect.left,bigRect.left); &rect4.right :=Blend(smallRect.right,bigRect.right); &rect4.top :=Blend(smallRect.top,bigRect.top); &rect4.bottom :=Blend(smallRect.bottom,bigRect.bottom); &FrameRect(rect4); { draw newest } &FrameRect(rect1); { erase oldest } &rect1:=rect2; &rect2:=rect3; &rect3:=rect4; &fract:=FixMul(fract,factor); { bump interpolation fraction } $END; "FrameRect(rect1); { erase final image } "FrameRect(rect2); "FrameRect(rect3); "PenNormal; "SetPort(savePort); END; LK P@`2Q P@! P@: DE+@@Modeless Dialog Window#@@|Load Resources%@@|User Field Test %@@|MiniFinder Test F@ Item Info !F@ Dialog Info %@@| Invisible Dialog!@@ Save Dialog 6FrZOK <Items cannot overlap. POKXCanceldDialog-In-The-Box2(dҐWelcome to Dialog In The Box!x(May I take your order?(TBig Mac<PJCheeseZnJPicklesxJOnions *4 b#6ZOK#6XCancel#}6Make NewZ, U File Name:FZPCokeF0ZlMac nFvALife as a programmer in the Macintosh Divison... Cokes and Macs.(4HN#6ZUser#6XField Z Find What:Z,N#6dNext#6XDone Z^0:Z,Def File<(OK@<ZCancel  x Item Number x 0(FZ Item Type(ZFIconFZReturn On ClickFZ6 Keep Click<(OK@<ZCancel  x ID Number: x 0(AxItemList Number:(x>0F\xTitle:Fx_Ȑ0l#6ZYES#6XNO :The window is invisible. Would you like to see it anyway?@( <JYES(Z<NO  Save Changes?rFXZOK Before issuing paste command,( <%Point to where item should be pasted."d;$ dummy titleFirst String in the ResourceSecond String in the Resource This will be amazing if it works...(! 8?<AJoNV n CJ"""" nW/./<N@ Wg n0|`B.N^ _ NYFILTERJoNVN>?N^NuURSORNOJoNV-gHnN>/-N>HnN?JBg/. mHhN>gf- gZ|B m0-h H/p/N>^ =@B m0-hH/p/N>> =@?`-gB-N&/.N>N^NuURSORJUJoNVB-B-B-B-B-N^NuNITCHGBJoNVB-VB-WBN> +_\BN>d+_`N^NuNITCORNJoNV-݀--ހ-߀-@N^NuADECHANJoNV/B?<HzN=+_h-|DRVR/-h/.N=B?<HzhN=+_l/-lHzN=/-lHzN=B?<HzN=+_p/-pHzN=B?<HzN=z+_t/-tHz@N=l~`0S@A @Ad/0BgN=PRG GoN=F.N^NuETUPMEN;Show Item Info..;Show Dialog Info..;(---------;Debug WindowOptionsCut;Copy;PasteEdit5Delete Dialog/D;Test Dialog/T;(---------;Grid On;Quit?Load Next Alert/A;Load Next Dialog/L;New Dialog/N;Save Dialog/SFolder@JoNV/-l?<N<'Gl H >`JF\JG^gf H:p"|0CA HH@J@< H > n//.HnHn?<N; _C?<N;p@ S@n`LN^ _\ONNTTOSTRJoNVH nCJp@"S@nBF~OA0p@ @ fRG`pA0AG\OA0pAk|?nAX4JDB0 <Wg"  OA0pA@|0<RG`=F LN^.NuTRTOINTJoNVH nCJp@"S@nJ:gHnN8/-:N8 m,CA""HmN8BN8&_HmBg?/.0.R@??0.S@? |?N3 n C /. ?<?<N3`Z0.n| Hn>/.0.|? S@??. |?N2/. 0.|??.?.?.N2.N^ _NETEDITVJoNVH nCJ""0.nHS@>BN2h(_N2fHn??N2P/ N2V/ N2/ N2FLN^.NuETBUTTOJoNV n CJ""0.mlWJn^gHn/-N2`P0.2ZAC CA r Ё/0.2ZAC r@A0@H/Hn?.N2LN^ _PONISPTEXTJoNVH<.0Z@A  AI, Hk^ @nVH0;N@NLA"L Hn?/ ??N0BN0&_/ N0/ HnHn, NHnN0?Hn?<N/ N0x/ N0`/ HnHn, NHn0,T@?0.R@?0,|?0.| ?N0^BN0f&_/ N0$/ N0 HnN0:?HnBgN/ N0`8p4AAp4BA8B?N0*Jg/ /N0``/ N/LN^ _TONRAWITEMJoNVHHzNHnN//-N/BN/.BN/&_BN/(_BN/,/0-fT@?0-dX@?0-jU@?0-hU@?N// HmdN/// / N/~/HmN/p/ // N/h/ N//N/R/ N/L/ N/F/N/@/.N.HzNLN^NuNFRAMEI"end unframeitembegin unframeitemJoNVHHnN./-N.BN.(_BN.&_BN..?.HnN|/ HnN.Hn?<?<N./ HnN./ / /N./N./ N./ N.|/N.v/.N.,LN^ _TONNFRAMEPJoNVH-gz0-l2ZAC AIp/B m P/(>N/" C m P h>&Pp4A=A~`O "SAC3BRGinoLN^NuETNEWTEJoNVHzNJmll ?-lN`0Jmlo*N-g N0B-/-N.,/-N.Hz8NHNBmlHzN8N^NuESELECT2exit deselect sel=0 disposed hteenter deselectJoNVHnN,Jmll@Hz N/-N,HnN,?<?<N,?< N,HmN,HmdN,`HzN/-N,rHnN,?<?<N,?< N,|HmN,vHmdN,p?-f0-dT@?N,P0-jU@?0-dT@?N,:Hm?-f?-d?-j0-dX@?N,8Hm0-jQ@?0-hQ@??-j?-hN,HmN, HnN+/.N+N^NuRAMEITE frame item frame protoJoNV/ 0-lnf`(JmlgN;nlJmll?-lHmdNp` ?-lHmdNHz6NxN~HzNlJmlo0-l2ZAC AI, Hk|nA2IDA0 <WD@-g/ HnHn, NjBHnHnN++_HzN , f ?</-N+0-l2ZAC CA r Ё/p4AH//-N+l/-N+f/-N+hNzHzN(_N^ _TONELECTITBexiting selectnew hteselect after frameselect before frameJoNVHB.HnN)HnN*/.N) nC""Hn N)HnN)HnN)/-N) mHhN)HmN)BN)(_/ HnN)-gB-0. n;@0. n;@B/ /. HmHmBgA/N).NZHnBg/N)B0n ?Bg/N)00n ?N)0-l2ZAC AI/ Hmd, NA"L J, fHn?0+S<NJLN^.NuROWITEMJoNV nCJ""0.2ZAC n ECpC"S@n0.2ZAC CAC ?.N?.NN|N^ _ NEPLACEIJoNV n CJ""HnNl/-NbRmn?-n/.HnND0-l2ZAC CA-H.-gB/</-N/.NN^ _ NAKENEWIJoNVHHzNB .f~:-n`~zG\" g> .f ?HnNl` ?HnNBg/. HnNg=G|`RG`mlg n` nBHzNLN^ _ NINDRECT$Exiting findRectEntering findRectJoNV/HzN8/-NHnNNBg/-/.HnN>mn^JG_gNh/.N*`b.g?N"Bg/.HmNg /.N`:Bg/.HmNg ?/.N`. -g/.Bg/-Nb.N^.NuOLDERCL folderClickJoNVH(nHzbN\/ Nr~BgNg(HnNBg/./ Nfg/ NH  `G g/ N0LN^.NuRACKARR TrackArrowJoNVHHztNNHnN/-NHnNBg/./-VNg"Bg/-VN6g? GoN`?NfACd BgHm/-/.?Ngz0Z@A  AI , fHm?<?<N`(J, fHm?<?<N`Hm?<?<N0Z@A  AHpHm<N/.NfLN^.NuROTOCLI protoClickJoNV/ nCJ""(n -Vg(X`0-l2ZAC A(0.nl9@0.nT9@/. ./.N,(_N^ _NETNEWREJoNV/-V Jml_g ?<Np`b-qg\Hmr-|HnHnN>-Vg 0-nR@>`>-l-VgNBHmrHnBgN`HmdNN?HmrHnN0.N^NuASTEITEJoNVHJmlf`HnHmd0-l2ZAC A0N/.N<<-lHmdNRNb0Z@A  ArECpC S@n0-nS@=@>`:0Z@A  "RA4ZBE CAECpC S@nRGinoSmn|q|LN^NuUTITEM JoNVJmlf`4N0-l2ZAC ArECpC S@n|q|N^NuOPYITEMJoNVJgJJmlgNf/-N0BmnB.g/-N/-N`/-Nr/-NjNٖNzN^ _TONAPTHEBOJoNV|HmNv/-Nl mCA""HnNPHnNH-gAC ` AC /-N$N^NuETNEWDLJoNVJmlgN--g?-n/-HmN--g(-g/-HmNZ` m PCp S@n0-gJRmRm0-mo;|/-/: m P?(HzNP/-/:?-HzN<`-g/-?-HzN-݀-g-g /-N`/-N-g4-g/- m P?(HzDN`/- m P?(Hz*N--g/-NNN^NuAVEDIALDLOGDITLJoNVB?<NB-_AF/HnNR/.N@ nfNtN^NuSKFORSAJoNVBgN׾gN-NjB?.HmHmNn+_/-N/-N6BgND?< N>/-HmHmHmbN/-HmHmnN m PCp"S@n2HzNNٚN^ _TONOADALER in load alertJoNVBgNgN-NB?.HmHmN"+_/-N/-NBgN?< N/-HmHmHmbN(/-HmHmnN m PCpE"S@nHz6NT m PA?<N/N:NN^ _TONOADDIALin load dialogJoNVAC 0AC 0AC ACp ACZ 0A*CB 0A6C, ABC 0N^NuNITSTRIJUserItemPicItemIconItem RadioItemChkItemBtnItemStatTextEditTextJoNVB?<N۬-_BnAӬ/HnN/.N nf|`B.N^NuANDLEINJoNVH*.Hz$N/?<HnHnHnNZ&n/?<HnHnHnN@,.A(/HnN40.S@gS@gV[@gRS@g``n0-l2ZAC AIBg/ N _f lm 0,|9@` ll 0,|9@/?<HnHnHnN/.HnNBgA?<N/N8>A?<N/NmlVJG^mn_g0Z@A  AECpC S@n0Z@A  2-l4ZBE CAECpC S@n0-l2ZAC CACpC S@n;Gl||`(`&/ ?<N/BgN`/ BgN/?<N nW nWgT/NHzNLN^.NuANDLEIT4Exiting handleItemDialogEntering handleItemDialogJoNVHHzNה m PA?<NV/NzB?<N(_>-?-HnN/ ?<HnHnHnN/.A?<N /N?-HnNլ/ ?<HnHnHnN/.A?<N/N/ ?<HnHnHnNp/.A?<N/NZAD/HnNP nf/.HnN8BgA?<Nj/N;_mg|/.HnNBgA?<N8/N՜;_/.HmN/-A?<N/Nv|/ NHzN LN^NuHOWDIIN"exiting showDiInfo in showDiInfoJoNVHJmlf`DB?<N@+_N/-N?<HnHnHnN@?-lHnN,/.A?<Nh/N/-N?<HnHnHnN/.0-l2ZAC A0HC CA?<N/NHnN/-NN m,HhN0-l2ZAC A pm~`BG/-N?<HnHnHnNp(n/ pG?NJ/-N?<HnHnHnNH(n/ ?N&/.N /-NNHzNԔLN^NuHOWITEMexiting showItemInfoJoNVHBgNόgNt-N8Bp/N8+_B/<N(+_| m&P6Bmn;|c m(P/ ?<@?<@?<?<N | BlB, B9|cAC m PCpE"S@nIBB/ A?<N|/Bg?,p/, /,N +_N/-N /-N /-N NBgN \?< N VNLN^NuAKENEWB New DialogJoNVHJmloN/-N `B- g BgNg~ -gbBp/N (_?-n/ HmN BBHmA?<N /-?-p/-/-/ N <&_A./HnN :/ N */-N LN^NuESTDIALJoNV- g/-N /-N SmSm<N@NXN^NuELETEDIJoNVBg/.N ;_Bg/.N ;_ mf./-h?-HnN tBgA?<N /N =_`d mf0-S@k @nH0;N>thnzJm2g Rm00-0m2o;|0B-?-0N`Jmg"Rm0-mo;||?-Nz`nN"`hN`bN`\N`V- @-g/-l?<HzN `/-l?<HzN NV`|BgN.gN?-N `f mf$0-S@g S@g S@g`N` Nb`N`: mf20-S@g S@g"U@g` N`J:fNζ`/-:N `NBgN N^.NuENUCOMMGrid OnGrid OffJoNV/0.R@>mno~=G .N^ _TONEXTITEMJoNVHBJmnovJmloBg?-lN<`|>0Z@A  A0Hk|nAP0HD@0 <fz` Bg?Nd>GW"Agg=G`BnLN^NuEXTTXTIJoNVH/-H/<N A;@0-THHH@J@ @fB?-N,Jg/N` m f.Jg&BgN>JGoN?NJB/</-N`x-gr|0-l2ZAC A 0fBN(_/ N m PHhNB?-/-N0-l2ZAC A 0f / Np/ NLN^NuROCESSKNNV,_NU0NA,/N.NBNN~NNNɚNB-BgN;_BgHmNgFBgA?<N/Hz$Bg<NgBm`BgA?<N/Nt;_`|BgN|J_f- gHmNHmBg?<?<?<TNHm?< ?< ?<?<VNB-Bg/:N;_^Bg/:NT;_Bg/:pNF;_2BmBm`Bm0BNLBmnBmlB-q;|NB:NNN$NrB-A/Hz N- gNHzNBg? mbf"/-/-PHmN -fN` mbfHmF/-N` mbfz -fnHzN/-NVB/-/-PHmNT+_xJxgBHzN/-Bg/-xNBg/-xNBgN mHhN mHhN N`x mbf>BN -g/-N -f /-PN6` -f/-PNx`2 mbfBg/-/-PNg/-N`JmlgN֤N`+mL`N`HzN+mHHmN/-N/-ND m,HhN -fN` -fNJml^"-WJml]$-WgN֮/-N/-Nt`Hzg2ATAA>Ng>NgBWNg>Ng>|NNVH8(n $n&R n4RB0`P()kp+ 9@Bg?Nr9_ p+ ?RA C. & gRC&CQLN^ _ NNVH8B/FGKM`cprsu{|}~̭ͭέϭЭѭҭӭԭح٭ڭܭ"_ L.`p/ C2Nup`"_ ".N"_ _#N"_ _%.jBNNNV n"n pH@J.gJ. g<`<` J. g<`< @N^ _ NBNuNu _N]N// /"/ N/@" /WXNuH>*jD,jD$&BBx㉰mRSDlJjDjDL|Nu.Nu _NUNH0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuACODE2STR JCNTLDITL DLOGALRTv U4q%6En :   F0_ I $#f-,LBoot Blocks Version 5.0 J ĈSystem File Name: System" 2ĈFinder File Name"2Finder: JĈDebugger File Name:JMacsBugR bĈDisassembler File NameRb Disassemblerj zĈBoot Screen File Namejz BootScreen ĈInitial File to runFinder ĈSystem Heap Size16384 ĈScrap File NameScrap ĈMax # of Open Files12 ĈMax # of Events30TdUpdateUndoQuit( ?<JoNV/- N /- Hz&BgNR/- NNN^ _\ONROWHEAP"!The heap is full. User Croak !! JoNVBgA/N` N^NuEADTHEBJoNVBgA/N~ N^NuRITETHEJoNV/ACfp S@n>-p"H|0Ap"HHAJA|0A/-A?<N/N .N^NuETVERSIBoot Blocks Version X.XJoNV/-?<HmHmHmN HmA /NL/-A?<Nn/N /-?<HmHmHmN HmA/N/-A?<N0/N /-?<HmHmHmN HmA*/N/-A?<N/N |/-?<HmHmHmN `HmA:/N/-A?<N/N >/-?< HmHmHmN "HmAJ/NT/-A?<Nv/N /-?< HmHmHmNHmAZ/N/-A?<N8/N/-?<HmHmHmNHm0-|@A@A?0Np/-A?<N/Nt/-?<HmHmHmNXHmAj/N/-A?<N/N6/-?<HmHmHmNHm?-zN/-A?<Np/N/-?<HmHmHmNHm?-|N/-A?<N4/NN^NuETTEXTSJoNV/-?<HmHmHmN/-HmNA?<N/A /N/-?<HmHmHmNN/-HmNHA?<N/A/Nv/-?<HmHmHmN/-HmN A?<Nj/A*/N8/-?<HmHmHmN/-HmNA?<N,/A:/N/-?< HmHmHmN/-HmNA?<N/AJ/N/-?< HmHmHmNV/-HmNPA?<N/AZ/N~/-?<HmHmHmN/-HmN0-|@A@/BgA?<N`/N2 A1/-?<HmHmHmN/-HmNA?<N/Aj/N/-?<HmHmHmN/-HmN~BgA?<N/NX;_z/-?<HmHmHmNF/-HmN@BgA?<N/N;_|N^NuETBOOTBJoNV0.@g S@gS@g`NHN`NN`|N^ _TONANDLETHNNV,_NUNA/NNNNNNNLNBgN;_?<?<NHzzNNBNHNPB?<Bp/N6+_NN/-NdB-BHmNN>N" _"_p. AN""_ _p. ANBo"o@ O!I B 1|1|!|$1|,B.@f?|.NuBo"o@ O!I B 1|1|!|$1|,B.@f?|.Nu"_p0 _aN"_ _av>NH@rtvxz|CJnk0`(-DЀQaaaaa0 HSLNuYaYJFjJg |0NuHpprvg* +g -fvRSgrЀҀЁSfJgDLNuPQRSUVXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~¬ìŬƬǬȬɬʬˬ̬ͬάϬЬѬҬӬԬլ֬ج٬ڬ۬ܬݬެ߬  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭"_  _BW$N"_ _N"_ _N"_ ".N"_ _#N"_ .NўBBo ONu"_ 0_/ /Nu"_ / 2Nu"_1DN <2Nu/xjNu0/ o= _\ON oBo /HBoBoB Of0/ ?@.Nup`0/?@ O _TON _ /:Nu _NUNNV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_BHA0"H2@l02H`4 aS@j3 o#/IL._NuN^Nu%_INTER NV,_HA$0BP2I4RB6K"O$O8<4SDf JBZSBf0BB@0LNuN^Nu%_SING NV,_BHA 0"H26@l6K`4 aSCjAgm @H3 S@n`3 o#/IL._NuN^Nu%_UNION NV,_BHA 0"H26@l6K`4 FBaSCjAn3 o#/IL._NuN^Nu%_DIFF NV,_BHA 0"H26@l6K`Fa4 QSCjAo @H3 S@n3 o#/IL._NuN^Nu%_RDIFF NV,_H2/$0/&B$A(J@jB@@mH4J6Kg"O$O8<4SDfBZSBfTC?C$46JJDBCBDĉp R@@lLNu o /H"LJ_NuN^Nu%_RANGE NV,_H0/2/A"o@lB`TAk`! /HL._NuN^Nu%_ADJ NV,_BHv`N^Nu%_SETNE NV,_BHBCA$0"H2$I4@l4’J`Hf*SBj@gkIJafSAn`AJ`fRAk CB" o %/JL._NuN^Nu%_SETEQ NV,_BHC$2 I0$H`(N^Nu%_SETGE NV,_BHA$0"H2$I4@l4J`6 FCafSBj@gk IJaf SAjNqv`BCB" o %/JL._NuN^Nu%_SETLE H"fNV O1|>a N^`aLNu1h>!|$B.1|,G!K AB0NuNV,_$_ _H< aLNN^Nu%W_LN NV,_$_4 _`p NvSBnNlNN^Nu%W_C NV,_$_2"_ _BBBop NBSAf`N6SBjNN^Nu%W_STR NV,_$_24"_ _Bo p N SAfNSBnNN^Nu%W_PAOC NV,_$_2  _HBB,lD&(BDHD *: HD&6HEE0?RBJfJlRB?<-6Bo p NSCn0NSBnLxNN^Nu%W_I NV,_$_4gHz"`Hz?/ NN^Nu%W_B FALSETRUENV,_"_ _p / N,NuN^Nu%W_PAGE H@ f"NV Op(10g(N^ g0a`(1h>!|$B.Bh,C@!I AZ0LNuNV,_H o N@ o/H LTNuN^Nu%R_C NV,_$_ _H g a^ f`!|$B.0< H<1@,E@!J BBh Bf!|.1|,DA0NuN^Nu%_RESET NV,_$_2 _/ 1h>AX0NuN^Nu%_CLOSE NV,_H o1h>B.Bh(1|,B Bh!|$E@!J 2((A0JAgB/`|/oLTNuN^Nu%_EOF NV,_H o1h>B.Bh(1|,B Bh!|$E@!J $h A0  gB/`|/oLTNuN^Nu%_EOLN NV,_0<`N^Nu%_BLKRD NV,_B@$_BB24"_ _JAlBA1h>!A.1|,!B$!I J@g`2((A0Bg>NN^Nu%_BLKWR NV,_0<`N^Nu%_UREAD NV,_BBB$_246"_.$@0<0B. @g!|@.1|ը.1|,!C$!I g`4((Ah0$_Bg>NNN^Nu%_UWRIT NV,_$_?:>/ NuN^Nu%_IORES NV,_$_0/ NuN^Nu%_UCLR NV,_NuN^Nu%_UBUSY NV,_`N^Nu%_GET NV,_$_"NN^Nu%_PUT NV,_/ o/P _NuN^Nu%_UPARR NV,_$_0"NN^Nu%_SEEK BNuNu _N]NNV,_$_024/ NuN^Nu%_RCHCK NV,_$_ NN^Nu%_SRCHK fCODEDITL2DLOG> 4$1$u _N]NNV,_$_024/ NuN^Nu%_RCHCK NV,_$_ NN^Nu%_SRCHK &%f <xbK_^OKK_Cancel K2.Copy-protecting is a one-way street: go ahead?(#> ?<"NVH-ݵH`AXI-ݵH`Aݶ0g.,D`.,:Jf|` S//<N0 <-ݵH@Ap/0?NJW/Bg-ݵHAAp/0N2  AWgBE`,&nAC 0.n8 |$H r!@:-ݵH@At/0?NjLN^.NuETHVMAXNV-n nCA""HnNtN^.NuETFULLCNVH-ݵH@&uBg-ݵH@Ap/0N _f. GCA""0.|=@0.|=@0.|=@HnNHnN:/ HmݤBN-ݵH`AXI?<NHzBg,H?N?<BgN?<NHzBg,H?N?<BgN?<NHz/,0BgBgN?<NHz?,4BgBgNv?<NHzf/,6BgBgN?<NtHz>/,:BgBgN?< N\Hz?,>BgBgN.?< NDHz/,@BgBgNr?< N,Hz/,DBgBgNZ?< NHz/,HBgBgNB?<NHzv/,LBgBgN*?<NHzL/, BgBgN?<NHz"/,$BgBgN?<NHz?,(BgBgN?<NHz?,*BgBgNn?<NHz?,,BgBgNV?<NlHzz?,.BgBgN>/ N`R-ݵH`AXI,^-ݵH@Ap/0-ݵH@At/0/ HlPHlPHl\Hl_/ NNLN^NuOTEFINF Fndr Word 4 :  Fndr Word 3 :  Fndr Word 2 :  Fndr Word 1 :  Fndr Creator:  Fndr Fl Type:  Mod Date:  Create Date:  Res Ph Len:  Res Lg Len:  Res St Blk:  Reg Ph Len:  Reg Lg Len:  Reg St Blk:  File Number:  Vers Num:  Attributes: NV/B. Jg&~`H @"5IJf Gݵ| R  o.N^.NuETFINDENVHBg/-N<=F~`/-?BgNRGino/-?<-ݶN/-?<-ݶ N|LN^NuENUSETFNV/ppB?<HnN+_B?<Hz(N +_B?<HzN+_B?<HzN+_/-HzN/-/:?<N/-HzpN/-HzRN/-Hz8N~` @/5BgNRG GoNN.N^NuENUSETU Copy ProtectResource;RegularOpen ;Exit DRVRA(File Scan Utility;(by Larry Kenyon;(08 Jan 84;(-----------------Misc OptionsFileNV/ (nBg/ Ng/ N \/ N/ N b/ N"N(_N^.NuNDUPDATNVBg/.NgH/.N -ݵH@Ap/0N -ݵH@At/0N -ݵH`AݶpݶNN^.NuNDACTIVNVBg/.N6g0/.N -ݵH@Ap/0N R-ݵH@At/0N >N^.NuNDDEACTNV/ nCJp@"S@nHn?.?.0.n?0. n?N BBHnHn<Bgp/<p/N J(_/ <N P/ N ?. N (?.N &-L(_N^ _NNDINIT NV/ -ݵH`AXI,^-ݵH@Ap/0-ݵH@At/0/ HlPHlPHl\Hl_/.N/. ?.N/.NN(_N^ _ NSCROLL NV/ -ݵH`AXI,^-ݵH@Ap/0-ݵH@At/0/ HlPHlPHl\Hl_/.N/. ?.NXN4(_N^ _ NSCROLL NVH~BB. H @Jf| | n  g H R@`|gLN^.NuETFREC NV/-ݬHzvB?.JGg0. S@gS@g2S@gHS@g`0. @/5?HnNBgHnN<`0S@gS@g` Nz`|ݷ`h0S@gS@g ` |ݶ`B-ݶNBN(_Bg/ Ng*/ N$/ N-ݵH`Aݶݶ/ NN` 0S@g`NjBgNfLN^.NuENUCOMMNVHN*Bg??@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭t?< _?/t`NV0.n o=n `=n N^.NuMAX NVH(n*.BGJ]D@ACp S@n0.g D*Jo mݜI0,Z@? T?NLN^ _TONOVTOLINNVH nCJp@"S@n n CJp@"S@n.gJfBgN  g`/-NJgHnN/-N.gXAC HnN0.n2.@>BN(_HnBg D@?/ N/ Np0.Z@?0.G?NHnNHnN/.NLN^ _ NOTESTR NV/=n~`Hz.Hz(<NRGino.N^ _TONOTENEWLNV nCJp@"S@n0. H/?. ?< ?< HnNHnHn.NN^ _ NOTEDEC NV nCJp@"S@n=n Bn/.?. ?<?<0HnNHnHn.N,N^ _ NOTEHEX NV nCJp@"S@n-n JnfHn?.?. .Np`*Hn?.0. Y@?.NVHz$?.?<BgNDN^ _ NOTELONGNV n CJp@"S@n. gHnHz4.Nt`HnHz.NbN^ _PONOTEBOOL FalseTrue NV nCJp@"S@nHn?.?. ?. .NN^ _ NOTEPT NV nCJp@"S@n n CJ""HnHzX.NHzJ/.?. BgNzHz6/.?. BgNhHz"HzBgNN^ _ NOTERECT ] [NV nCJp@"S@nHnHzX.NXHzJ?.?. BgN~Hz6?. ?. BgNlHz"HzBgN&N^ _ NOTE2INT ),(NV nCJp@"S@nHnHzl.NHz^?.?. BgNHzJ?.?. BgNHz6?. ?. BgNHz"HzBgNN^ _NOTE3INT ),,(NV n CJ""+n+nAC N^ _ NETNOTE <2Nu"_  @gN"_ ".N"_  @g#N"_ _%.N"_  _$N"_ _N"_ _N"_ _N"_ _N"_02.N"_2 .N _0/1pA8Nu?xNu _>BN _>N"_ _ gN"_ _/ gH0($xjNgP*jTp$(0J5g,5gaeLNu|52F@4 @NuBNu"_ _Hpprvg* +g -fvRSgrЀҀЁSfJgDL>N o.gNNu _NUNBNu _N]N.NuBNu _" H.N"_A6 !!!!!!!1/ Nu":N": _0$/H>UO//BJk@ @n @A.h0L|NuFZzHz` @fSA`x"o UO/ `"o UO/ bt!_2 _0/"o/NuHz` @fLRA`f/aJ SCRG` Gf/a SCRGUG(z /a  QL"z3|HHi{NuNV&OBS zt @ln/HaT aN<:aV< aN< aF|a.< a6Q< a*< a"| b<.a QHnN^Nupa`NV&OBS<Ta<Aa<Ga< a<:a< a< a| (za< aQp af`NV&OBS<Ra<Ea~<G:`g<Sal< ad<:a\< aT< aL0Ha40a.pa`.?< a*< a"< aSWnTONu?Ha0@;rRNu0123456789ABCDEF fCODEDITL2ALRT> v423456789ABCDEF zy P@ww P@ww P@ww P@ww@dX @dX @dX @dX @d,X h xFOKhdxCancel Enter the name of the font:H X` Current SizeHXNewSize$ 4ܐPingPongHhXx12HXڐ12^V fFOKVdfCancel Enter the name of the font:( 8ܐDFZPOK nZvFont file not found@R`V fFOKVdfCancel Enter number of new character:( 8(dV fFOKVdfCancel !Enter number of character to copy( 8(HFZPOK nZvCharacter already exists@R| FOKdCancel !Enter the new sample text phrase:2 Here is some sample textFFZPOK nZvBad Character Number!@R"0Font Editor 2.0N Small ViewPdxAlert%<<Sample Text Windowp??~>?ppp8 8 0 PaxN@3 >^?File Read Font... Save FontSave Font In...Load From Resource...Install Font...Undo All ChangesQuitXHeight More Ascent Less Ascent More Descent Less DescentEdit Insert CharI Delete CharZ Char LeftL Char RightRChar UpU Char DownD Insert ColumnC Delete ColumnX?AidsShow Sample WindowSet Sample TextxTReDraw(| .?<JJoNV?<N36N6NN^ _TONEAPERROJoNV/-N3\ mHhN4N^NuNVALBIGJoNVN/-N3. mHhN4zN^NuNVALBOTJoNVA+H+m;|HmBgBg?<?<8N3FN^NuAKEDATAJoNV=| pAB?<N5$+_B?<N5+_B?<N5+_B?<N4+_B?<A?<NI/N3+_/-/:N3N^NuEADMYMEDRVRJoNVB?<A/BN4+_/-N2"?<BgN2"B?<Ax/BN4t+_/-N1?<BgN1B?<A/BN4L+_B?<A/BN46+_B-B?</-N4"+_N^NuAKEWINDJoNV0-.n /-N1Hn0. H//-8N6 ?0.H//-8N6 ?0. R@H//-8N6 S?0.R@H//-8N6 S?N1HnN1xN^.NuLOTBIGPJoNV0-.n /-N0?. ?.N1*BgBgN1 N^.NuLOTSMALJoNVH(n &nJnl0.H"-8S=@0.H//-8N6b0-.HП80.H//-8N6H 6JTlBT` Tm8JSlBS` S8m67LN^ _ NAPCOORDJoNV n l0.|0?N0@`$0.H ?N0.H H@J@?NN^ _TONRAWNUM JoNVHHnN//-N/HnN0 N0(mHlN0/,HnHnN/,HnHnN0-`m^S@H-@B`H0.H2.H-A,`,/</N4 П*Bg/-/N/$g??NRoRoHmN/z0-0A@A20m.H/-8/N4 S=@0-0R@A@A20m.H/-8/N4` =@=|0-`m^H/-8/N4@ =@HnN/?,0-^H/-8/N4 S?N.?<BgN.Bg0.|?N.?-0N2HlN/HnN./.N.VLN^NuHOWBIGWJoNV/ HnN.4/-N.*(mHlN.x0-.l=@0-.l=@Bn0-`m^=@JnlBn no=|AC Hn0-.D@?BgN.$HmHlHnHnBgBN.HlN./.N-(_N^NuHOWSMALJoNV/>.JGlBG` Go><;G00-0A@2-0RACAA40ApH…;B.N.N^ _TONELECTCHJoNV m"m0(i|2-`m^HH+@8NN^NuALCSCALJoNV/BG n@J@oT npBA0k|?nA\0HD@0 <f,  nrBB0@|0>/.?<?<N5`=G .N^.NuUMFROMSJoNV/ B?<Bp/N.&(_/ ?<HnHnHnN../.A4?<NCHmN8rHmHzBgN8Hm0-VH/?<N9HmN8HHmHzjBgN8Hm0-XH/?<N8HmN8HmHz6BgN8dHm0-ZH/?<N8HmN7HmHzBgN8:Hm0-\H/?<N8HmN7HmHzBgN8Hm0-^H/?<N8lHmN7HmHzBgN7Hm0-`H/?<N8BHmN7vHmHzfBgN7Hm0-bH/?<N8HmN7LHmHz2BgN7Hm0-dH/?<N7HmN7"N^NuRINTHEA raster: xoffset: descent: ascent: length: FBBDY: FBBDX: FBBOY: FBBOX: maxWidth: maxChar: minChar: fixed width NOT format: JoNVH n CJp@"S@nng. gBA?<N?/N&(_`dA?<N>/HnN(JnW/BgHzzA?<N>/N'4  g`B/:L0.@2-p@?N)(_ fBg?<BN)`=_`-gHmHzBgN5HmN5/ AL/N%F|-gN0-`m^d=@=n~`TFRGino0-PT@=@>-N`TFRGinoBG`OApRG Go=mP>-N`FBg/ ?N$=_Bg/ R@?N$=_O nW nWDApTFRGinoB-/-A?<N=/N'/-@N&L0-p|d]@?N&d?-rN&bBgBgN&j?<AN&D/ N$ m@HhN&lB?-r?-pN%+_-N`pHmH/?<N4ROA0pgHmHzBgN3HmN3j`6HmHzBgN3HmO @A20H/?<N3HmN32RGino;|A00-0A@2-0RACAA40ApH…;B.Nr.g/ N&`/ N(;mrpLN^ _\ONEADFONT. location: missing. ReadFont:FONTSystemJoNVH>. <.Hn0-0A@A?0Bg0-0R@A@A?00-`m^?N$BBN$(_/-@N#Hn??/ N$/-N#Hn0-.D@?BgN$ Hn??/ N$~/-N#0.H/-8/N) S=@0.H/-8/N( =@=|0-`m^H/-8/N( =@HnN#N#HmN#?.0-^H//-8N( S?N#P0.S@?0-^H//-8N(~ S?N#*AC Hn?<?<N#:HnH//-8N(H ?H//-8N(8 ?/ N#HmN"?.0-^H//-8N( S?N"0.S@?0-^H//-8N' S?N"HnN"/ N#LN^.NuCROLLCHJoNV/ /-@N".BN"(_Hn?.?.?.?. N"pHn?. ?./ N"/ N"N(_N^ _ NCROLLSTJoNVH0-`m^<?.Bg0-R@???<BgNnBG`(O @A20noO @ARpRG GoLN^ _TONNSERTCOJoNVH0-`m^<?.Bg0-R@??? GoBg?<BN!<=_`OA0p gBg?<BN!=_`B.B?<Bp/N (_BHnN!/ ?<HnHnHnN /.HnN / N ng`BgHnN< FoBg?<BN =_`dMA0`g4A?<N5/HzXHzRHzLN rBg?<BN Z=_`" R@A@M"AA40Ap:=mO @A80Hn?Bg?.0-`m^?N`Hn E?Bg n?0-`m^?N>HmHmHnHnBgBN R@=@`0.A@ApRn no E=@AC HnM @O"AA40Ap?BgNHmHmHnHnBgBN&OAB0p?NLN^NuNSERTCHJoNVH m0f`0-0AA0g<`*O @ApOA0p g;G0SGinlLN^NuELETECH" is already missing. Oops, char JoNV/-N/-N/-N?<?<NHz(NA4?<N2/NN^NuHOWWAIT Saving font JoNV/-NN^NuIDEWAITJoNVBnN^NuRUNCTOPJoNVH..(n,gBg?././/. N;_l`&߬/-h/,N&/. mh . А//NLN^ _NRITE_DAJoNV/ (nBg?,A /p//,/.Nf9_Jlg8/- HzJBgN)D/- 0,H/?<N)/- N( n,HN0`T(_N^ _\ONRITEWOR*(WriteWord called Write_Data and got err=JoNV/ (nBg?,A R/p//,/.N9_Jlg8/- HzJBgN(/- 0,H/?<N(/- N(" n,HN~`R(_N^ _\ONRITEBYT*(WriteByte called Write_Data and got err=JoNVHBN,-_.g BgA4?<N0t/HnN|=_`BBp /N&+_hBnJng0/- HzBgN'/- 0.H/?<N(/- N'P``BNBn`N0.R@A@2.CAA40Ap0.A@A10.A@ABpRn noBnBn-g8HmHzBgN'Hm0-H/?<N'zHmHzBgN&HmN&Bn`0.AA0 fRn no=|;nN=|`0.AA0 fSn nlBn;nP=mP=mN`0.AA0 0.A@AJp^g0.A@A=pBg?.N\0.R@A@2.Ap]Jn\g0.A@ARp?.N`0.R@A@A20SA=ABg?.N0.R@A@2.Ap]Jn\g$?.N0.R@A@A20SA=A`Rni 0.no-g8HmHzBgN%ZHm0-H/?<N%HmHzBgN%8HmN$;nR|Bn`b0.AA0 gH0.A@A20mRg0B.0.A@A20mRo0.A@A;pRRn no.gB0-LH//<N ;@L`B0-LH//<N ;@LBgNb=_BmT0-^D@2.@;AV;mRX0-`m^n;@Z0-|H;@d0-`m^ndZ@2-PRA@mNTA;A\-g/- HzrBgN#/- N#-gNBg?.AL/p//./N=_pѮ0.@dHЭ-@0-`m^n=@=|`tBg?./.0-d@H//./N=_Jng0/- HzBgN#b/- 0.H/?<N#/- N"`T` 0-d@HѮ0-HѮRni 0.no=mP=mN`0.A@A?0/NpRni 0.no?-/NV?-/NL=mP=mN`^0.AA0g?</N?</N`00.A@A?0/N0.A@A?0/NRni 0.no?./Nz?./Np?./Nf?./N\Bg?.N=_Jng*/- HzLBgN"/- 0.H/?<N"l/- N!NO ./N&LN^ _TONRITEFONFailed to close fontFile, err=Writing strike and got err= WriteFont: dots.Packed strike width =  dots.Unpacked strike width = Error opening output file =JoNV/ .ghB?<Bp/N@(_BHnN\/ ?<HnHnHnN>/.HnN8/ N ng`DA?<N)4C4p@"S@n<NNA4?<N)/BgNNN(_N^ _TONAVEFONTJoNVHBBgN<A4?<N(Cp@"S@n=mp.gBgHnHnHnN _g`:A?<N(/HnNRJnW/BgHz8A4?<N(^/N  g=n~0.@2.@=ABgN?-NB/:?.N(_ gBg/ N0mf/ N/-h/:?.HzN no /-h?<"Ng2BBN&_/ /:~0.H@?A?<N'/N?-NN./-hNg/ N?NpA4?<N'l/<NNHNLN^ _TONNSTALLFFONTFONTFONTSystemJoNV/BG`O @A20nn RG Go>< S@?N>.N^ _TONINDCHARJoNVH/-NHnNv/.HnHnN޲Jn]2-`m^n_g`0-0A@2.Apl<0-0A@A20n Al0-0S@?N`p` ?.N`b`V0-0R@A@2.Apm<0-0R@A@2.Ap Al0-0R@?NJ`` ?.N` 0.H/</N00.HП.Bg/-/Nl g"/-NHmN/-NrHmN` /-N`HmN/-NPHmNBgN&gp/-N6HnN/.HnHnNL0.H/</N0.HП.g /-/N ` /-/N ?.?.N>?.?.N`/-N N/-N NLN^NuOEDIT JoNVH>. R@A@O"AA40Ap<O @A:0Hn?Bg F?0-`m^?N Hn?-?- m?0-^m2-`@?N ~Hm mHhHnHnBgBN m;@LN^ _TONLOTTHECJoNVH/-N mHhN /-N;|;|-@:=E~`FB@A0p< F g?N`( mo0-^m2-`@;A;|`?NRGinoLN^NuRAWSAMPJoNV-g/-N Z/-?<HzTN B-`&/-N P/-N 2/-?<HzN |N^NuOGGLESA(Hide Sample WindowShow Sample WindowJoNV/ B.B?<Bp/N (_/ ?<HnHnHnN /.A?<N"/N zBHnN t/ ?<HnHnHnN V/.HnN P/ N 2 nfA?<N"NCp@"S@nN0(_N^NuEWSAMPLJoNV/.N .fN .fNܐ .fNN^.NuRAWTHECJoNVB.N^NuKIPEVENJoNV/-/<N @gS@g`0-0S@?N` 0-0R@?NN^NuEXTKEY JoNV//-BgN ~`0S@A @/5BgN RG GoN .N^NuNSTALLMJoNVBgHm4HmpHmrNݜ _f A4?<N!/<NNNۂN^NuOADFROMJoNVH>.0. S@g^S@g4S@gtS@g4S@g`/-?HnN BgA?<N /N ;_`0S@gS@g` N`N`0S@k @nH0;NH^hnxBgHm4HmpHmrNܸ _fA4?<N "/BgNNNڠ`v-ggBgN`BgN^``<NT`VN`P<N`FBg?<BN < Ff A4?<N/-gNjNؚN:`BgN N4|`0S@gS@gS@gS@g"`.BgNb`&BgN`0-`m^?NJ`0-`m^?N`0S@k @nH0;N*6BNfN:`dN`^?0-S@gS@gS@gbW@g`` Gf0B/-N+_4Bg/-4N2Bg/-4N*NBgN` GfHm/.Nt` Gf/./-HmxNR` Gf G fBg/-/-BNJ_gN4`D0-HHH@J@ @fN|`NT`-m/.N(/.N/.N.N^NuROCESSTShow Sample WindowNNV,_NUNB/<B@N+_A/NA/NdNnN fNPNNBNBNNxNNJAD+H@/-@N,AFC 0ATC /-\HmNHmN^NѺACp S@n0Bm^Bm`Bm0Bm.B-A4C ;| p;| rBgHm4HmHmN  gBgHm4HmpHmrNH;_lA4?<N/BgNb/-N/-N/-NHmx?<?<?<?<TNA/HzN$A/HzNA/HzNA/HzjNBmBmHmNNB-- gNJBg?`?-NNNBN]NNuN^NuONTEDIT 70005000080008000400040002000200 0000000040006000700078007C007800 F800F800CC008C000600060003000300 8000C000E000F000F800FC00FE00FF00SystemHere is some sample text _! N _0"_"Qr1>N""_ _ Pp. ANNVA1n=@ N^ _TONNVA!n BhBhB"n2=@N^ _PONNVA1n!n !n $!n.1|,=@N^ _N "_B/H0 <"$Hp<!IBh1|Bfz!|$!R 1|,B.fJ"R2)iiA Av6H/ $ _H!R $<B!@$ը !B.f/JH`H#B JL NuH#H`NVBn 8 g& @ P"n20g"n ""npgR.R.N^ _ N$"_ _BWpH@?@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭,NNuNV/.?./. /; ONN^Nu"_.NN"_ _NtN"_.pNfN"_.pNXN"_ L" _ . ANBN"_ M.N4NѠ/@N(Nu"_" _ . ANN"_ x.pNN"_ _KNN"_ _-NNѠ@NNu"_ .NN"_ _NN"_ _!.NN"_  _ NN"_ _H.NN"_ ".NN"_ _#NN"_ _%.NxN"_  _$NjN"_ _&.N\N"_ _(.NNN"_ _+NBN"_  _'N4N"_ _)N(N"_ _*NN"_ _INN"_ _JNN/ CH"C>""_Nu"_.2N"_..N" "_ _. ANОBBo ONu"_ 0_/ /Nu"_ / 2Nu"_1DN <2Nu/xjNu0/ o= _\ON oBo /HBoBoB Of0/ ?@.Nup`0/?@ O _TON _ /:Nu _NUNNV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_BHA0"H2@l02H`4 aS@j3 o#/IL._NuN^Nu%_INTER NV,_HA$0BP2I4RB6K"O$O8<4SDf JBZSBf0BB@0LNuN^Nu%_SING NV,_BHA 0"H26@l6K`4 aSCjAgm @H3 S@n`3 o#/IL._NuN^Nu%_UNION NV,_BHA 0"H26@l6K`4 FBaSCjAn3 o#/IL._NuN^Nu%_DIFF NV,_BHA 0"H26@l6K`Fa4 QSCjAo @H3 S@n3 o#/IL._NuN^Nu%_RDIFF NV,_H2/$0/&B$A(J@jB@@mH4J6Kg"O$O8<4SDfBZSBfTC?C$46JJDBCBDĉp R@@lLNu o /H"LJ_NuN^Nu%_RANGE NV,_H0/2/A"o@lB`TAk`! /HL._NuN^Nu%_ADJ NV,_BHv`N^Nu%_SETNE NV,_BHBCA$0"H2$I4@l4’J`Hf*SBj@gkIJafSAn`AJ`fRAk CB" o %/JL._NuN^Nu%_SETEQ NV,_BHC$2 I0$H`(N^Nu%_SETGE NV,_BHA$0"H2$I4@l4J`6 FCafSBj@gk IJaf SAjNqv`BCB" o %/JL._NuN^Nu%_SETLE H"fNV O1|>a N^`aLNu1h>!|$B.1|,G!K AB0NuNV,_$_ _H< aLNN^Nu%W_LN NV,_$_4 _`p NvSBnNlNN^Nu%W_C NV,_$_2"_ _BBBop NBSAf`N6SBjNN^Nu%W_STR NV,_$_24"_ _Bo p N SAfNSBnNN^Nu%W_PAOC NV,_$_2  _HBB,lD&(BDHD *: HD&6HEE0?RBJfJlRB?<-6Bo p NSCn0NSBnLxNN^Nu%W_I NV,_$_4gHz"`Hz?/ NN^Nu%W_B FALSETRUENV,_"_ _p / N,NuN^Nu%W_PAGE H@ f"NV Op(10g(N^ g0a`(1h>!|$B.Bh,C@!I AZ0LNuNV,_H o N@ o/H LTNuN^Nu%R_C NV,_$_ _H g a^ f`!|$B.0< H<1@,E@!J BBh Bf!|.1|,DA0NuN^Nu%_RESET NV,_$_2 _/ 1h>AX0NuN^Nu%_CLOSE NV,_H o1h>B.Bh(1|,B Bh!|$E@!J 2((A0JAgB/`|/oLTNuN^Nu%_EOF NV,_H o1h>B.Bh(1|,B Bh!|$E@!J $h A0  gB/`|/oLTNuN^Nu%_EOLN NV,_0<`N^Nu%_BLKRD NV,_B@$_BB24"_ _JAlBA1h>!A.1|,!B$!I J@g`2((A0Bg>NN^Nu%_BLKWR NV,_0<`N^Nu%_UREAD NV,_BBB$_246"_.$@0<0B. @g!|@.1|ը.1|,!C$!I g`4((Ah0$_Bg>NNN^Nu%_UWRIT NV,_$_?:>/ NuN^Nu%_IORES NV,_$_0/ NuN^Nu%_UCLR NV,_NuN^Nu%_UBUSY NV,_`N^Nu%_GET NV,_$_"NN^Nu%_PUT NV,_/ o/P _NuN^Nu%_UPARR NV,_$_0"NN^Nu%_SEEK BNuNu _N]NNV,_$_024/ NuN^Nu%_RCHCK NV,_$_ NN^Nu%_SRCHK Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< Đ A 7  <<< FONT/JCODECNTLMENUICONWINDDITLDLOGzALRT2R2R3S3T[4 U#4U5 V5W{6XC6Y 7Y7Z8[c8\+9\9]:^:_K;`;`<a<bk=c3=c>d>e? fS?g@"g@hA$isAj;B&kBkC(lCm[D*n#DnE,oEp{F.qCFr G0rGsH2tcHu+I4uIv 4#$ 3Tp$$$$+$$$C$$@$[$v$$&&& &0lCm[D*n#DnE,oEp{F.qCFr G0rGsH2tcHu+I4uIv 4#$ 3Tp$$$$+$$$C$$@$[$v$$&&& &00/( JGg?HnNH/HnN G l&HnHzHn?<NACp@ S@n`$HnHzbHn?<NACp@ S@nHnHnHn?<N~ACp@ S@nBg/. Hn?.N:LN^ _PON-- NVH nC""Hn?<?<N.BHnN&_(SBT9|Bl-K LN^.NuNVH n P"n"Q0i>JGnBG<<`BF/. ?N/. ?N=GLN^ _PONNVH/-?. HnHnHnNB/-HnHz8<BgBgBg?</.N(_Bg/ /.Nb>-LLN^ _\ONNV mf2 n0 n n n0 n n `0 n0 n n n0 n n N^ _NNVB/:$?.N-_B/.N -_ N^ _TONFONTNVH nCp@"S@n nCp@"S@n nC""8. 0.mVmVgHnNR>.?N0.H<0.HH@J@:H/HnN?HnN"?-NN??<NHnN??<NHnN??<NHnN?<HnN?N?N?N?<?<NHnNBgNBgN;D;nLN^ _NNV0.mg?-N/-?< HnHnHnN/-?< HnHnHnNl/-?< HnHnHnNT n f2?< HnN\/.HnN8?< HnND/.HnN `/.Hz:N/.Hz,N?.HnN/.HnN;nN^ _TONNVH/-?<HnHnHnNBgHn m/(N|g0 mgHnHnHnHnHnHnN?.NBnBBFBgNxBgHnHnHn/.NhgRFB?.N6ޟ`<NF/HnN?-N.?<HnN0HnHnHn?<NACp@ S@n Ff>BnBgHnHnHn/.N?< N?.HnHn?.HnN`*HnN r?<N?.?<N ZHnN L;|`HnN F;|LN^NuNVH>.?-N d/-?HnHnHnN @ GfN`` Gf2?< HnNLN^ _\ONNV nCp@"S@nHnN?. N n/BgHnN 60 _0BgN JJ_g=|`Bn?.NxN^ _ NNVHBmBmBm?<HmNBgHmHmHmNX>JGfBgHm?-?-N>Bg?-BgN_JGfBgHm?-HmN,>`V GfDHmN BgN J_fHmN`-g ;|BG`~` Gf~`~JGf(BgBg<N-@B?<Bp/N +_/-?<HnHnHnN /-?<?.An/HnN BHnNB+_/-?< HnHnHnN /-?< ?.A./HnN BHnN+_|`0/-?HnHnHnN d/-??.A/HnN NRF FoB/:d?<N P+_BgN @Bg/:HN 8=_|`>B/:2?N &(_Bg/ N ":mf /-/ N`mf /-/ NrRFino<N B?</-N+_B?< /-N+_;|?< N;|B-HmN F/-N  Gf-g ?-N4B?<Bp/N ,/N?-N?-N-gj/N/-?<HnHnHnNHnN/-?< HnHnHnNHnN/-N/-N/-NB-?.NBg/ ?Hn?.N >=GJGg> g/ N GfHlHnN~` GfHlHnNj` HlHnN\LN^ _NFONTNVH mgB.B.B.B.B?<N(+_ m/NHnHnHnHnHnHnNLBnx~BgHnHnHn/.N g|0.H:?.N?HnNbBgHn?./.N J_gHnHnN `Bg/.?N g.Bg @?Hn?.?.Hn/N2J_WD|`B.gbBg?.Hz?.?.Hn/NJ_WDg"Bg/.Hn?.N=_g>.B`.g?.N @?N`?<HnNb?<HnNV?<HnNJ?< HnN>Bg/./.N@=_ Gg@no>./.?NF n P1G mf/-?< N` /-?<NN/-N:LN^NuNV?-N?-/--/-Hm?./. /.NN N^ _ NNVH?-NB?<Bp/N(_BHnNB?<Bp/N&_BHnN/ Nh/ N|/ Nv;|LN^NuNV n Pf6 n +h HmNBg n A/p/Ng;|`BmB.N^ _ NNNV,_NUNNBgNgB-A/HmN0-S@kj @ ndH0;N$*\\0TBT|`>N`8N`2N`,?</-/-N|`?< /-/-Nj`/-N-gzNN N]NNuN^NuPQ]^_nqstyz{ج٬"#(T[]ce{|̭έ"_ L.`p/ C2Nup`"_ _#N"_ _JNNVA!n 1nn  =@N^"_PN"_ / 2Nu o /Bg _PONBNuNu _N]N _NUNH0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuNVH?8(n L%*"L np(@ &TRS6+|7Pk:8APE@aDn RF483@j`43@k7 `67P7Pk7@`7P67C=F0<`Hrg  *fRHSA "O.  OTtg  *fRJSB C J$I.  JT"OpR@An @m g`ALNuNVH?82.(n &T6+s0g630`030k2307k7`230k77ASSp`NVH?8p0.(n &T2+k43B@g 23`B.`|p`NVH8 n6. (n&T8+ks@gE@ag 83@`Bn`=|`=|LN^ _ NNVH?8$n "R&i$"Sz8.gV Do:)fDE?/ a`:aUO/ `6Jn mkg `JCgn UO/ /?c`&T/+$ap` NVH?8HnrUO/./.Hnl6g

k^ElGv8+|Em|Go|3@g@a~aRC83@k*`H :v8+kJ3@g aX@aRC83@`2JLNuNV/ ?HnHnHnN^NuNVH?8(n 8<Jnma`ahp`rYOa?]NuNVrYOa"W"Qi$g:3G$DAC""YO? _ PC0<@"S@nHn_Hn*`XON^NuaJg~aNuH?8J.f"(n8<gn`xa` apxavLNu/ 8+k a83@`8 fv`v"J$_Nua$k$&R&.a8. "n02.@gJ@k&n &S`JDfB@a2. Ag~`~&RJDfB:a8aPJCkN<&R<UOsJg@apCg Cg n6SCa `paBa`JCkasPaa4a nJCl0`00<`p`a:+n g47n EYO//zYO,HkBg?//y/ avyBp`2/:+kJCg :3PkSC`&NuNVH?8 n &@&n UO/ _n&SUO?<ɨ_UO/ _nSfRp0<`aDJSgf8+D >+6+azJEk>?+AP( *gPW`RW?APCpR@./ / HkaX:3PRCDSGfpaB`aL B(n:f:+k J3Pf :3P`B.`0PAPpR@.:3P|80<`LN^ _N _"_ gB`N _"_ f1 NNVH8$n &R J%/"n Q""(H"P K .LN^ _PONNV-nBnB.BnA !|FFIL !|FMOV$ `DNV-n =nn BnA f >Copy>> <` m PO @/0NRGino.N^ _TONUTHEXLIJoNV/HnN(/-N mHhNlJg$BG`?< @|?N4?NfRG Go/.N.N^NuRAWHEXWJoNV0-S@g S@gS@g&`4HmtN?<N`"Hm|N?<N`HmtN?< NN^NuETUPPENJoNVHNp T@>pT@<Hn?? Z@? Z@?NHnNLN^.NuLOTPIXEJoNVH(n &n0.U@H80.U@H6JTlBT` To8JSlBS` So6LN^ _ NAPCOORDJoNV/?< NHmtN?<?<NBG`J?< R@?N?< R@?N R@??<N R@??<NxRG Go?<?<Nh?<?<NX?<?<NP?<?<N@.N^NuRAWGRIDJoNVJmVJVg6HnN0-2SAC /5NHm/-BgN/.NN^NuRAWICONJoNVHHnN/-N~:-;| mHhN-gNJf`>BG`(BF`Bg/-??N\g??NRF FoRG Go/.N;ELN^NuRAWEDITJoNVJf`HnN/-NHnN mCA""Bg/.HnN,g/.HnHnNBg/-?.?.Ng;|`;|0-S@g S@gS@g,`T/-?.?.<NN`>/-?.?.BgN:`*/-?.?.Bg/-?.?.NF N?.?.NN/-NHnN/.HnHnNBgN g\NN^NuOEDIT JoNV/Jg&BG` m PO @BRG GoNNN\.N^NuLEARICOJoNV=mJmg/-*?-BgN;n 0.mf`2/-*?-<N0. 2SAC +uN0NNN^.NuEWSELECJoNVH(nBNFgD/ N2VVg(~`0S@A  f?BgN` |0>BF`>pF2,A@:/,??. HH@J@ @WDN H>RF FoRl lfBlRlLN^ _ NTUFF4DIJoNVH(nHlHn?<NXHlN,pBAA0 A*g.@=@~`"B@A0p? S@@??,/NRGinoLN^ _\ONETHEXLIJoNVB.BgHzHnN P g`.@J@f`rBN-_HnHnHzlHn?<N|Hn?p S@n0pADpARpAVpARN NdHm?<?<?<?<TN N;||NN NjNHm?<?<?<8?<(N B+mBmN\NB-N tN0-S@gU@gW@gU@g$` Bg/-HmN 4;_ mf BmBmB/-N 8+_/-N`d mfHm/-N `N mf/-/-HmN `4 mf /-N^`" mfBg/-/-N g/-N x`~0-HHH@J@ @f$B/-/<N n ?N +_/-N*`>+m/-N @ -fNN` -fN`/-N/-N -g.m,m -/NN N xN]NNuN^NuCONEDIT0123456789ABCDEFNV n h| P"H n Pp2 A22 A3A&QN^ _PON"_  _/ "@B"j  NuA B0B Nu <"/Hp PBQNu o#.NuaC  /g0 @"0/ o !P "/ U PHhHi/?B _ NaPff?| L LL _PONBo o/HB/Bo Og @fafƠf`"_H&o&/Bop4(H)CBlBlB Lf)S )|$Bl,B. LN"_4  _/ a//JBg^Nu_Nu"HAB0@HAANu"_  _/ Bga//]?_NuUUUU""""wwwwNVHPHnt/8 ިsHz{"n n &I0<Tav*. /A jBnaJg8/ apB@H@2apB@H@2N/ `A1E]hHE0HE\@1@@01n\hC"#hTQUiNuHn訡HnҨA1nTh///<aNuHn֨A0.1@R@1@/A PNu0.gaNu .jn aA jNuBA A(l^?N0 g m RA?NuJg8B@3Bg?Hn֨A0.1@_1@C2//.֨SNu4<6<aNu20< S@fQQNuNVHPHnt/8 ިsHz`{ na6aJAg/.sL N^@ _XO>pB@H@2NNuOK Cancel 0<@aA C0(@3@@<3@0(@ 3@@2C0(@3@@<3@0(@ 3@@2EIaEIaNu9gBANuaIaxg a,fBANuIabgagBg`?<a0rNua89f(aa2fa 9f ahag`B@NupNu/ /<NuBg// 0Nu L\J$$QBB0(h2(PVA@@5@"$%H U PHh/ Hj/BgBNu j$/ U PHhHj/ BgBNu&LIa j#(KNu/ ?<?/ /<Hzz/ ??@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭"_  _BW$N"_ _N"_ _N"_ ".N"_ _#N"_ .NўBBo ONu"_ 0_/ /Nu"_ / 2Nu"_1DN <2Nu/xjNu0/ o= _\ON oBo /HBoBoB Of0/ ?@.Nup`0/?@ O _TON _ /:Nu _NUNNV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_BHA0"H2@l02H`4 aS@j3 o#/IL._NuN^Nu%_INTER NV,_HA$0BP2I4RB6K"O$O8<4SDf JBZSBf0BB@0LNuN^Nu%_SING NV,_BHA 0"H26@l6K`4 aSCjAgm @H3 S@n`3 o#/IL._NuN^Nu%_UNION NV,_BHA 0"H26@l6K`4 FBaSCjAn3 o#/IL._NuN^Nu%_DIFF NV,_BHA 0"H26@l6K`Fa4 QSCjAo @H3 S@n3 o#/IL._NuN^Nu%_RDIFF NV,_H2/$0/&B$A(J@jB@@mH4J6Kg"O$O8<4SDfBZSBfTC?C$46JJDBCBDĉp R@@lLNu o /H"LJ_NuN^Nu%_RANGE NV,_H0/2/A"o@lB`TAk`! /HL._NuN^Nu%_ADJ NV,_BHv`N^Nu%_SETNE NV,_BHBCA$0"H2$I4@l4’J`Hf*SBj@gkIJafSAn`AJ`fRAk CB" o %/JL._NuN^Nu%_SETEQ NV,_BHC$2 I0$H`(N^Nu%_SETGE NV,_BHA$0"H2$I4@l4J`6 FCafSBj@gk IJaf SAjNqv`BCB" o %/JL._NuN^Nu%_SETLE H"fNV O1|>a N^`aLNu1h>!|$B.1|,G!K AB0NuNV,_$_ _H< aLNN^Nu%W_LN NV,_$_4 _`p NvSBnNlNN^Nu%W_C NV,_$_2"_ _BBBop NBSAf`N6SBjNN^Nu%W_STR NV,_$_24"_ _Bo p N SAfNSBnNN^Nu%W_PAOC NV,_$_2  _HBB,lD&(BDHD *: HD&6HEE0?RBJfJlRB?<-6Bo p NSCn0NSBnLxNN^Nu%W_I NV,_$_4gHz"`Hz?/ NN^Nu%W_B FALSETRUENV,_"_ _p / N,NuN^Nu%W_PAGE H@ f"NV Op(10g(N^ g0a`(1h>!|$B.Bh,C@!I AZ0LNuNV,_H o N@ o/H LTNuN^Nu%R_C NV,_$_ _H g a^ f`!|$B.0< H<1@,E@!J BBh Bf!|.1|,DA0NuN^Nu%_RESET NV,_$_2 _/ 1h>AX0NuN^Nu%_CLOSE NV,_H o1h>B.Bh(1|,B Bh!|$E@!J 2((A0JAgB/`|/oLTNuN^Nu%_EOF NV,_H o1h>B.Bh(1|,B Bh!|$E@!J $h A0  gB/`|/oLTNuN^Nu%_EOLN NV,_0<`N^Nu%_BLKRD NV,_B@$_BB24"_ _JAlBA1h>!A.1|,!B$!I J@g`2((A0Bg>NN^Nu%_BLKWR NV,_0<`N^Nu%_UREAD NV,_BBB$_246"_.$@0<0B. @g!|@.1|ը.1|,!C$!I g`4((Ah0$_Bg>NNN^Nu%_UWRIT NV,_$_?:>/ NuN^Nu%_IORES NV,_$_0/ NuN^Nu%_UCLR NV,_NuN^Nu%_UBUSY NV,_`N^Nu%_GET NV,_$_"NN^Nu%_PUT NV,_/ o/P _NuN^Nu%_UPARR NV,_$_0"NN^Nu%_SEEK BNuNu _N]NNV,_$_024/ NuN^Nu%_RCHCK NV,_$_ NN^Nu%_SRCHK ^CODEMENU* e4_$_0/ NuN^Nu%_UCLR NV,_NuN^Nu%_UBUSY NV,_`N^Nu%_GET NV,_$_"NN^Nu%_PUT NV,_/ o/P _NuN^Nu%_UPARR NV,_$_0"NN^Nu%_SEEK BNuNu _N]NNV,_$_024/ NuN^Nu%_RCHCK NV,_$_ NN^Nu%_SRCHK 3. "6F^5D!$ǐ^%XSENDONE MAC:SYSTEM@System MAC:SYSTEM.RSRC@System.RSRC MAC:FINDER.RSRC@Finder.RSRC MAC:DISKUTIL.RSRC@Disk Utility.RSRC MAC:SETFILE.RSRC@Set File.RSRC MAC:PRINTER.RSRC@Printer.RSRC MAC:FILE.RSRC@File.RSRC MAC:DISASSEMBLER@Disassembler MAC:MACSBUG@MacsBug MAC:IMAGEWRITE.RSRC@Imagewriter.RSRC %% 5*^H_w%FP&2/#5: TBYTEDIFF.OBJ,MISC:$ YTCHANGESEG.OBJ,MISC:$ YTCHANGETRAP.OBJ,MISC:$ YTCODESIZE.OBJ,MISC:$ YTDIFF.OBJ,MISC:$ YTDUMPHEX.OBJ,MISC:$ YTDUMPO.OBJ,MISC:$ YTDUMPOBJ.OBJ,MISC:$ YTFILEDIV.OBJ,MISC:$ YTFILEJOIN.OBJ,MISC:$ YTFINDID.OBJ,MISC:$ YTFINDWORD.OBJ,MISC:$ YTGXREF.OBJ,MISC:$ YTLISATALK.OBJ,MISC:$ YTOBJDIFF.OBJ,MISC:$ YTPATCH.OBJ,MISC:$ YTSEGMAP.OBJ,MISC:$ YTSETSIZES.OBJ,MISC:$ YTSTRIPPER.OBJ,MISC:$ YTADESKACC.TEXT,MISC:$ YTBOXES.TEXT,MISC:$ YTBOXESR.TEXT,MISC:$ YTBOXESX.TEXT,MISC:$ YTDISKFORMAT.TEXT,MISC:$ YTEDIT.TEXT,MISC:$ YTEDITR.TEXT,MISC:$ YTEDITX.TEXT,MISC:$ YTFILE.TEXT,MISC:$ YTFILEASM.TEXT,MISC:$ YTFILER.TEXT,MISC:$ YTFILEX.TEXT,MISC:$ YTGROW.TEXT,MISC:$ YTGROWR.TEXT,MISC:$ YTGROWX.TEXT,MISC:$ YTMAKEMASTER.TEXT,MISC:$ YTSOUNDLAB.TEXT,MISC:$ YTSOUNDLABR.TEXT,MISC:$ YTSOUNDLABX.TEXT,MISC:$ YTZOOMRECT.TEXT,MISC:$ YTADEDIT.RSRC,MAC:$ YTBOOTCONFIG.RSRC,MAC:$ YTFILEEXAMIN.RSRC,MAC:$ YTFONTEDITOR.RSRC,MAC:$ YTFONTMOVER.RSRC,MAC:$ YTICONEDIT.RSRC,MAC:$ YTMACTALK.RSRC,MAC:$ YTMACTERM.RSRC,MAC:$ YTPRINTER.RSRC,MAC:$ YTRMOVER.RSRC,MAC:$ YPWORK: Q YTPRINTER.RSRC,MAC:$ YTRMOVER.RSRC,MAC:$ YPWORK: Q 3. "6F^5D!$ǐ^  Wx%cmisc:boxes gmisc:boxes lmisc:boxes obj:macpaslib obj:sane obj:saneasm obj:elems obj:elemsasm obj:quickdraw obj:graf3d obj:tooltraps obj:ostraps misc:boxesl xrmaker misc:boxesr xsendone mac:boxes.rsrc frmisc:boxes.i yrmisc:boxes.obj yrmisc:boxl.obj yq%% 3. "6F^5t,D!$ǐ^  }%CEdit GEdit LEdit obj:quickDraw obj:tooltraps obj:ostraps Obj:MacPasLib EditL XRMaker EditR XSendOne Mac:Edit.Rsrc FREdit.I YREdit.Obj YREditL.Obj YQ %% 3. "6F^5D!$ǐ^%Amisc:fileAsm Cmisc:file G$M+ misc:file Lmisc:file obj:quickDraw obj:tooltraps obj:ostraps obj:stdfile68k obj:prlink obj:packtraps obj:macpaslib misc:fileasm misc:fileL XLisa:RMaker misc:fileR Xlisa:Sendone Mac:file.RSRC@File.rsrc FRmisc:file.OBJ YRmisc:file.i YRmisc:fileL.obj YQ 3. "6F^5t,D!$ǐ^  }%Cmisc:grow Gmisc:grow Lmisc:grow obj:quickDraw obj:tooltraps obj:ostraps obj:macpaslib misc:growL XLisa:RMaker misc:growR Xlisa:Sendone Mac:grow.RSRC FRmisc:grow.OBJ YRmisc:grow.i YRmisc:growL.obj YQ 3. "6F^5D!$ǐ^  %Cmisc:soundlab Gmisc:soundlab Lmisc:soundlab obj:quickDraw obj:ToolTraps obj:OSTraps obj:macpaslib misc:soundlabL XLisa:RMaker misc:soundlabR Xlisa:Sendone Mac:soundlab.RSRC@Sound Lab.rsrc FRmisc:soundlab.OBJ YRmisc:soundlab.i YRmisc:soundlabL.obj YQ sy(@bufRecB); &If SelectBR(whichBR, @bufRecA, @bufRecB) Then (Begin *sWaiting := PipeAvail(s^.pipSnd); *If sWaiting > 0 Then ,Begin .sOWrite := Min(sWaiting, serOBufSize); .sORead := sOWrite; .PipeRead(s^.pipSnd, @whichBR^.buf, sORead); .If sORead < sOWrite Then 0Begin { must be time for a break, or something } 2sOWrite := sORead; 2SetupParm(whichBR^.parmPtr, sOWrite); 2err := PBWrite(whichBR^.parmPtr, True); 2whichBR^.fIdle := False; 2ichNext := PipeGet(s^.pipSnd); { check that it's a mark! } 2If ichNext >= 0 Then 4SerialError(s, 'SerSend.break', 0); 2ichNext := PipeGetMark(s^.pipSnd); 2While (Not whichBR^.fIdle) Do 4Begin 6TestBusy(@bufRecA); 6TestBusy(@bufRecB); 6Yield; 4End; 2Wait(6); { until all possible characters have shifted out } 2SetBreak(pparmCtl); 2Wait(ichNext); { 14 is short break; 210 is long break } 2ClearBreak(pparmCtl); 0End .Else 0Begin; 2SetupParm(whichBR^.parmPtr, sOWrite); 2err := PBWrite(whichBR^.parmPtr, True); 2whichBR^.fIdle := False; 0End; ,End; (End; &Yield; $End; "While (Not bufRecA.fIdle) Or (Not bufRecB.fIdle) Do $Begin &TestBusy(@bufRecA); &TestBusy(@bufRecB); &Yield; $End; "s^.sdone := True; End; Procedure SerRcv(s: Ser); Const "SerIBufSize = 32; Var "rdr: ParamBlockRec; "bufIn: Packed Array [0..serIBufSize] Of Char; "refIn: Integer; "sWaiting: LongInt; "sLeft: LongInt; "sIRead: LongInt; "sIWrite: Cardinal; Begin "refIn := NumFromPortDir(s^.port, SDirRcv); "While s^.rcving Do $Begin &sWaiting := SerWaiting(refIn); &If sWaiting > 0 Then (Begin *sLeft := PipeGuarantee(s^.pipRcv); *If sLeft > 0 Then ,Begin .sIRead := Min(sLeft, sWaiting); .sIRead := Min(serIBufSize, sIRead); .SerRead(s, @rdr, refIn, @bufIn, sIRead); .sIWrite := sIRead; .PipeWrite(s^.pipRcv, @bufIn, sIWrite); .If sIRead <> sIWrite Then 0SerialError(s, 'SerPoll.In.Count', 0); ,End; (End; &Yield; $End; "s^.rdone := True; End; {$SSInit} { InitSer; } Procedure InitSer; Const "ASyncDriver = 256; Begin "ASHandle := Nil; "ASLoaded := False; "ASInstalled[SPortA] := False; "ASInstalled[SPortB] := False; "ASHandle := GetResource('SERD', ASyncDriver); "DetachResource(ASHandle); "HNoPurge(ASHandle); "HLock(ASHandle); "ASLoaded := True; End; Procedure DisposNPtr(p: Ptr); Begin "If p <> Nil Then $DisposPtr(p); End; { NewSer: Ser; } Function NewSer; Var "p: Ptr; "buf: Ptr; "sTask: Ptr; "rTask: Ptr; "s: Ser; Begin "p := NewPtr(SizeOf(SerRec)); "buf := NewPtr(serBufSize); "sTask := NewPtr(sTaskSize); "rTask := NewPtr(rTaskSize); "If (p = Nil) Or (buf = Nil) Or (sTask = Nil) Or (rTask = Nil) Then $Begin &DisposNPtr(p); &DisposNPtr(buf); &DisposNPtr(sTask); &DisposNPtr(rTask); &s := Nil; $End "Else $Begin &s := Pointer(Ord(p)); &s^.sTask := Pointer(sTask); &s^.rTask := Pointer(rTask); &s^.buf := buf; &With s^ Do (Begin *port := SPortA; *pipRcv := Nil; *pipSnd := Nil; *spd := SSp1200; *par := SParNone; *wid := SWid8; *stp := SStp1; *xon := Chr(CtlDC1); { Default XOn character } *xoff := Chr(CtlDC3); { Default XOff character } *fXOn := False; *fCTS := False; { MB doesn't like CTS to default on *** } *fInFlx := False; *fEvBrk := False; *fEvCTS := False; *cumErr := 0; *error := Nil; *sdone := True; *snding := False; *rdone := True; *rcving := False; (End; $End; "NewSer := s; End; { OpenSer(s: Ser; port: SPortSel; pipRcv, pipSnd: Pipe); } Procedure OpenSer; Var "rn: Integer; "name: Str255; "t: Task; Begin "s^.port := port; "s^.pipRcv := pipRcv; "s^.pipSnd := pipSnd; "CloseDriver(NumFromPortDir(port, SDirRcv)); "CloseDriver(NumFromPortDir(port, SDirSnd)); "SerInstall(port); "NameFromPortDir(port, SDirRcv, name); "rn := OpenDriver(name); "NameFromPortDir(port, SDirSnd, name); "rn := OpenDriver(name); "SetSerConfig(s); "SetHandshake(s); "SetBuffer(s, NumFromPortDir(port, SDirRcv), s^.buf, serBufSize); "s^.sdone := False; "s^.snding := True; "t := Fork(Pointer(Ord(@SerSend)), Ord(s), s^.sTask, sTaskSize); "s^.rdone := False; "s^.rcving := True; "t := Fork(Pointer(Ord(@SerRcv)), Ord(s), s^.rTask, rTaskSize); End; { CloseSer(s: Ser); } Procedure CloseSer; Begin "s^.snding := False; "s^.rcving := False; "{ make sure send pipe and receive buffers empty before closing down. } "Repeat $RunTasks "Until (s^.rdone) And (s^.rdone); "CloseDriver(NumFromPortDir(s^.port, SDirRcv)); "CloseDriver(NumFromPortDir(s^.port, SDirSnd)); "SerUnInstall(s^.port); End; { EndSer; } Procedure EndSer; Begin "If ASHandle <> Nil Then $Begin &{ &If ASInstalled[SPortA] Or ASInstalled[SPortB] Then (Begin *While True Do; (End; &} &HPurge(ASHandle); &HUnLock(ASHandle); &DisposHandle(ASHandle); &ASHandle := Nil; &ASLoaded := False; $End; End; {$SSImpl} { SetSerSpeed(s: Ser; spd: SSpeed); } Procedure SetSerSpeed; Begin "s^.spd := spd; "SetSerConfig(s); End; { GetSerSpeed(s: Ser): SSpeed; } Function GetSerSpeed; Begin "GetSerSpeed := s^.spd; End; { SetSerParity(s: Ser; par: SParity); } Procedure SetSerParity; Begin "s^.par := par; "SetSerConfig(s); End; { GetSerParity(s: Ser): SParity; } Function GetSerParity; Begin "GetSerParity := s^.par; End; { SetSerWidth(s: Ser; wid: SWidth); } Procedure SetSerWidth; Begin "s^.wid := wid; "SetSerConfig(s); End; { GetSerWidth(s: Ser): SWidth; } Function GetSerWidth; Begin "GetSerWidth := s^.wid; End; { SetSerStop(s: Ser; stp: SStop); } Procedure SetSerStop; Begin "s^.stp := stp; "SetSerConfig(s); End; { GetSerStop(s: Ser): SStop; } Function GetSerStop; Begin "GetSerStop := s^.stp; End; { SetSerBEvent(s: Ser; fEvBrk: Boolean); } Procedure SetSerBEvent; Begin "s^.fEvBrk := fEvBrk; "SetHandshake(s); End; { GetSerBEvent(s: Ser): Boolean; } Function GetSerBEvent; Begin "GetSerBEvent := s^.fEvBrk; End; { SetSerCEvent(s: Ser; fEvCTS: Boolean); } Procedure SetSerCEvent; Begin "s^.fEvCTS := fEvCTS; "SetHandshake(s); End; { GetSerCEvent(s: Ser): Boolean; } Function GetSerCEvent; Begin "GetSerCEvent := s^.fEvCTS; End; { SetSerCTS(s: Ser; on: Boolean); } Procedure SetSerCTS; Begin "s^.fCTS := on; "SetHandshake(s); End; { GetSerCTS(s: Ser): Boolean; } Function GetSerCTS; Begin "GetSerCTS := s^.fCTS; End; { ExaSerCTS(s: Ser): Boolean; } Function ExaSerCTS; Var "status: ASStaRec; "result: Boolean; Begin "GetStatus(s, status); "If status.CTSHold <> 0 Then $result := True "Else $result := False; "ExaSerCTS := Result; End; { SetSerCN(s: Ser; xon: Char); } Procedure SetSerCN; Begin "s^.xon := xon; "SetHandshake(s); End; { GetSerCN(s: Ser): Char; } Function GetSerCN; Begin "GetSerCN := s^.xon; End; { SetSerCF(s: Ser; xoff: Char); } Procedure SetSerCF; Begin "s^.xoff := xoff; "SetHandshake(s); End; { GetSerCF(s: Ser): Char; } Function GetSerCF; Begin "GetSerCF := s^.xoff; End; { SetSerXON(s: Ser; on: Boolean); } Procedure SetSerXON; Begin "s^.fXOn := on; "SetHandshake(s); End; { GetSerXON(s: Ser): Boolean; } Function GetSerXON; Begin "GetSerXON := s^.fXOn; End; { ExaSerXOFF(s: Ser): Boolean; } Function ExaSerXOFF; Var "status: ASStaRec; "result: Boolean; Begin "GetStatus(s, status); "If status.XOffHold <> 0 Then $result := True "Else $result := False; "ExaSerXOFF := result; End; { SetSerInXON(s: Ser; on: Boolean); } Procedure SetSerInXON; Begin "s^.fInFlx := on; "SetHandshake(s); End; { GetSerInXON(s: Ser): Boolean; } Function GetSerInXON; Begin "GetSerInXON := s^.fInFlx End; { ExaSerInXOFF(s: Ser): Boolean; } Function ExaSerInXOFF; Var "status: ASStaRec; "result: Boolean; Begin "GetStatus(s, status); "If status.XOFFSent <> 0 Then $result := True "Else $result := False; "ExaSerInXOFF := result; End; { SndSerXN(s: Ser); } Procedure SndSerXN; Begin "PipePut(s^.pipSnd, s^.xon); End; { SndSerXF(s: Ser); } Procedure SndSerXF; Begin "PipePut(s^.pipSnd, s^.xoff); End; { ExaSerErrs(s: Ser): Integer; } Function ExaSerErrs; Begin "ExaSerErrs := s^.cumErr; "s^.cumErr := 0 End; { SetSerErr(s: Ser; errProc: ProcPtr); } Procedure SetSerErr; Begin "s^.error := errProc; End; { GetSerErr(s: Ser): ProcPtr; } Function GetSerErr; Begin "GetSerErr := s^.error; End; End. Procedure PushString(str: Str255); External; Procedure CallProc(proc: ProcPtr); External; {$SSImpl} Function Min(a, b: LongInt): LongInt; Begin "If a < b Then $Min := a "Else $Min := b; End; Procedure SetPointers; Var "p: ^Ptr; Begin "p := Pointer(Ord(pUTableBase)); "UTableBase := Pointer(Ord(p^)); "Lvl2DT := Pointer(Ord(pLvl2DT)); "UnitNtryCnt := Pointer(Ord(pUnitNtryCnt)); "ExtStsDt := Pointer(Ord(pExtStsDt)); End; Procedure SerialError(s: Ser; proc: Str255; code: Integer); Begin "If s^.error <> Nil Then $Begin &PushString(proc); &PushInteger(code); &CallProc(s^.error); $End; End; Function NumFromSpd(spd: SSpeed): Integer; Var "num: Integer; Begin "Case spd Of { Assume master clock at 3.670702 MHz, divided by 32 } $SSp50: &num := 2292; $SSp75: &num := 1527; $SSp110: &num := 1041; $SSp134andHalf: &num := 851; $SSp150: &num := 763; $SSp200: &num := 572; $SSp300: &num := 380; $SSp600: &num := 189; $SSp1200: &num := 94; $SSp1800: &num := 62; $SSp2000: &num := 55; $SSp2400: &num := 46; $SSp3600: &num := 30; $SSp4800: &num := 22; $SSp9600: &num := 10; $SSp19200: &num := 4; "End; "NumFromSpd := num; End; Function NumFromPortDir(sp: SPortSel; sd: SDirSel): Integer; Var "ref: Integer; Begin "Case sp Of $SPortA: &ref := -6; $SPortB: &ref := -8 "End; "If sd = SDirSnd Then $ref := ref - 1; "NumFromPortDir := ref; End; {one-time initialization of parameter block} Procedure InitParm(p: ParmBlkPtr; refnum: Integer; buf: Ptr); Begin "With p^ Do $Begin &ioCompletion := Nil; &ioNamePtr := Nil; &ioVRefNum := 0; &ioRefNum := refnum; &ioBuffer := buf; &ioPosMode := 0; &ioPosOffset := 0; $End; End; {repeated setup of parameter block} Procedure SetupParm(p: ParmBlkPtr; count: Integer); Begin "With p^ Do $Begin &ioLink := Nil; &ioType := 0; &ioTrap := 0; &ioCmdAddr := Nil; &ioResult := 0; &ioReqCount := count; &ioActCount := 0; $End; End; {$SSInit} Procedure SetSerConfig(s: Ser); Var "scr: ParamBlockRec; "err: OSErr; "config: Integer; Begin "config := 0; "config := BitAnd(Ord(s^.stp), 3); "config := BitShift(config, 2); "config := BitOr(config, BitAnd(Ord(s^.par), 3)); "config := BitShift(config, 2); "config := BitOr(config, BitAnd(Ord(s^.wid), 3)); "config := BitShift(config, 10); "config := BitOr(config, BitAnd(NumFromSpd(s^.spd), 1023)); "InitParm(@scr, NumFromPortDir(s^.port, SDirSnd), Nil); "SetupParm(@scr, 0); "With scr Do $Begin &CSCode := 8; &CSParam.asncConfig := config; $End; "err := PBControl(@scr, False); "If err <> 0 Then $SerialError(s, 'SetSerConfig', err); End; Function ByteFromBoolean(f: Boolean): Byte; Begin "ByteFromBoolean := 0; "If f Then $ByteFromBoolean := 255; End; Procedure SetHandshake(s: Ser); Var "hsr: ParamBlockRec; "err: OSErr; "con: Integer; "eventFlags: Integer; Begin "eventFlags := 0; "If s^.fEvCTS Then $eventFlags := 32; { 2**5 } "If s^.fEvBrk Then $eventFlags := 128 + eventFlags; { 2**7 + eventFlags } "InitParm(@hsr, NumFromPortDir(s^.port, SDirSnd), Nil); "SetupParm(@hsr, 0); "With hsr Do $Begin &CSCode := 10; &CSParam.flgs.fXOn := ByteFromBoolean(s^.fXOn); &CSParam.flgs.fCTS := ByteFromBoolean(s^.fCTS); &CSParam.flgs.fInX := ByteFromBoolean(s^.fInFlx); &CSParam.flgs.xon := s^.xon; &CSParam.flgs.xoff := s^.xoff; &CSParam.flgs.errs := 0; &CSParam.flgs.evts := eventFlags; $End; "err := PBControl(@hsr, False); "If err <> 0 Then $SerialError(s, 'SetHandshake', err); End; Procedure GetStatus(s: Ser; Var status: ASStaRec); Var "gsr: ParamBlockRec; "err: OSErr; "con: Integer; Begin "InitParm(@gsr, NumFromPortDir(s^.port, SDirSnd), Nil); "SetupParm(@gsr, 0); "gsr.CSCode := 8; "err := PBStatus(@gsr, False); "If err <> 0 Then $SerialError(s, 'GetStatus', err); "status := gsr.CSParam.asncSta; "s^.cumErr := BitOr(s^.cumErr, 6BitShift(BitAnd(gsr.CSParam.asncSta.cumerrs, 255), 8)); End; Procedure NameFromPortDir(sp: SPortSel; sd: SDirSel; Var name: Str255); Var "prefix: String[2]; "suffix: String[3]; Begin "Case sp Of $SPortA: &prefix := '.A'; $SPortB: &prefix := '.B' "End; "Case sd Of $SDirRcv: &suffix := 'In'; $SDirSnd: &suffix := 'Out' "End; "name := Concat(prefix, suffix); End; Procedure SetBuffer(s: Ser; refnum: Integer; buf: Ptr; len: Integer); Var "sbr: ParamBlockRec; "err: OSErr; Begin "InitParm(@sbr, refnum, Nil); "SetupParm(@sbr, 0); "With sbr Do $Begin &CSCode := 9; &CSParam.asncBPtr := buf; &CSParam.asncBLen := len; $End; "err := PBControl(@sbr, False); "If err <> 0 Then $SerialError(s, 'SetBuffer', err); End; {$SSImpl} Function SerWaiting(refnum: Integer): LongInt; Var "gwr: ParamBlockRec; "err: OSErr; Begin "InitParm(@gwr, refnum, Nil); "SetupParm(@gwr, 0); "gwr.CSCode := 2; "err := PBStatus(@gwr, False); "If err <> 0 Then $While True Do; "SerWaiting := gwr.CSParam.asyncNBytes; End; Procedure SerRead( 8s: Ser; 8p: ParmBlkPtr; 8refnum: Integer; 8buf: Ptr; 8count: Integer 8); Var "err: OSErr; Begin "InitParm(p, refnum, buf); "SetupParm(p, count); "err := PBRead(p, False); "If err <> 0 Then $SerialError(s, 'SerRead', 0); "If p^.ioReqCount <> p^.ioActCount Then $SerialError(s, 'SerRead.Count', 0); End; Function DrvrFromPortDir(sp: SPortSel; sd: SDirSel): Ptr; Var "driver: LongInt; "index: Integer; Begin "index := (2 * Ord(sp)) + Ord(sd); "driver := Ord(ASHandle^); "driver := driver + (index * OffsetDelta); "driver := BitAnd(driver, 16777215); "DrvrFromPortDir := Pointer(driver); End; {$SSInit} Procedure SerInst(sp: SPortSel; sd: SDirSel); Var "refnum: Integer; "PDCtlSer: PDCtl; Begin "refnum := NumFromPortDir(sp, sd); "refnum := Abs(refnum); "OldDriver[sp, sd] := UTableBase^[refnum]^^.DCtlDriver; "UTableBase^[refnum]^^.DCtlDriver := DrvrFromPortDir(sp, sd); End; Procedure SerInstall(sp: SPortSel); Var "base: Integer; Begin "SetPointers; "If ASLoaded And (Not ASInstalled[sp]) Then $Begin &base := (1 - Ord(sp)) * 4; &OldDT[base] := Lvl2DT^[base]; &OldDT[base+1] := ExtStsDT^[base div 2]; &OldDT[base+2] := Lvl2DT^[base+2]; &OldDT[base+3] := Lvl2DT^[base+3]; &SerInst(sp, SDirRcv); &SerInst(sp, SDirSnd); &ASInstalled[sp] := True; $End; End; Procedure SerUnIn(sp: SPortSel; sd: SDirSel); Var "refnum: Integer; Begin "refnum := NumFromPortDir(sp, sd); "refnum := Abs(refnum); "UTableBase^[refnum]^^.DCtlDriver := OldDriver[sp, sd]; End; Procedure SerUnInstall(sp: SPortSel); Var "base: Integer; Begin "SetPointers; "If ASInstalled[sp] Then $Begin &SerUnIn(sp, SDirRcv); &SerUnIn(sp, SDirSnd); &base := (1 - Ord(sp)) * 4; &Lvl2DT^[base] := OldDT[base]; &ExtStsDT^[base div 2] := OldDT[base+1]; &Lvl2DT^[base+2] := OldDT[base+2]; &Lvl2DT^[base+3] := OldDT[base+3]; &ASInstalled[sp] := False; $End; End; {$SSImpl} Procedure Wait(delta: LongInt); Var "start: LongInt; Begin "start := TickCount; "While (TickCount - start) < delta Do $Yield; End; Procedure SerSend(s: Ser); Const "serOBufSize = 2; { normally 64 } Type "BufOut = Packed Array [0..serOBufSize] Of Char; "BufRec = Record .fIdle: Boolean; .parmPtr: ParmBlkPtr; .buf: BufOut; ,End; "BufRecPtr = ^BufRec; Var "bufRecA: BufRec; "bufRecB: BufRec; "whichBR: BufRecPtr; "parmA: ParamBlockRec; "parmB: ParamBlockRec; "parmCtl: ParamBlockRec; "pparmCtl: ParmBlkPtr; "refOut: Integer; "sWaiting: LongInt; "sORead: Cardinal; "sOWrite: LongInt; "err: OSErr; "ichNext: Integer; "Procedure SetBreak(p: ParmBlkPtr); "Begin $SetUpParm(p, 0); $p^.CSCode := 12; $err := PBControl(p, True); $While p^.ioResult > 0 Do &Yield; "End; "Procedure ClearBreak(p: ParmBlkPtr); "Begin $SetUpParm(p, 0); $p^.CSCode := 11; $err := PBControl(p, True); $While p^.ioResult > 0 Do &Yield; "End; "Procedure TestBusy(brp: BufRecPtr); "Var $err: OSErr; "Begin $If Not brp^.fIdle Then &Begin (err := brp^.parmPtr^.ioResult; (If err <= 0 Then { IO complete } *Begin ,If err = 0 Then .Begin 0If brp^.parmPtr^.ioReqCount <> brp^.parmPtr^.ioActCount Then 2SerialError(s, 'SerSend.SendCount', 0); .End ,Else .SerialError(s, 'SerSend', err); ,brp^.fIdle := True; *End; &End; "End; "Procedure InitBufRec(brp: BufRecPtr; p: ParmBlkPtr; refnum: Integer); "Begin $InitParm(p, refnum, @brp^.buf); $brp^.fIdle := True; $brp^.parmPtr := p; "End; "Function SelectBR(Var brp: BufRecPtr; brpA, brpB: BufRecPtr): Boolean; "Var $fSelect: Boolean; "Begin $brp := brpA; $fSelect := brp^.fIdle; $If Not fSelect Then &Begin (brp := brpB; (fSelect := brp^.fIdle; &End; $SelectBR := fSelect; "End; Begin "refOut := NumFromPortDir(s^.port, SDirSnd); "InitBufRec(@bufRecA, @parmA, refOut); "InitBufRec(@bufRecB, @parmB, refOut); "pparmCtl := @parmCtl; "InitParm(pparmCtl, refOut, Nil); "While s^.snding Do $Begin &TestBusy(@bufRecA); &TestBu(Begin *If sLeft <= 0 Then { pipe is full } ,While True Do; *PipePutCh(pip, ch); (End; &sAvail := sAvail + 1; $End; End; { PipePutMark(pip: Pipe; ch: Char); } { Put a mark in pipe } Procedure PipePutMark; Var "iPut: Index; "sLeft: Cardinal; Begin "With pip^ Do $Begin &sLeft := s - sActAv; &If sLeft <= 1 Then { pipe is full } (While True Do; &PipePutCh(pip, Chr(pipEscape)); &PipePutCh(pip, ch); &sAvail := sAvail + 1; $End; End; { PipeRead(pip: Pipe; buf: Ptr; Var cnt: Cardinal); } Procedure PipeRead; Var "pbuf: PCV; "ichT: Integer; "i: Cardinal; Begin "pbuf := Pointer(Ord(buf)); "i := 0; "Repeat $ichT := PipeGet(pip); $If ichT >= 0 Then &Begin (pbuf^[i] := Chr(ichT); (i := i + 1; &End; "Until (i = cnt) Or (ichT < 0); "cnt := i; End; { PipeWrite(pip: Pipe; buf: Ptr; Var cnt: Cardinal); } Procedure PipeWrite; Var "pbuf: PCV; "i: Cardinal; "sGuar: Cardinal; Begin "pbuf := Pointer(Ord(buf)); { cnt := Min(cnt, (pip^.s - pip^.sAvail)); } "sGuar := PipeGuarantee(pip); "If sGuar < cnt Then $cnt := sGuar; "i := 0; "While i < cnt Do $Begin &PipePut(pip, pbuf^[i]); &i := i + 1; $End; End; End. W^g5P:H r^dss!b1{ Copyright 1983 by Apple Computer 8Mike Boich 8Martin P. Haeberli } Unit SerDefs; Interface Uses {$U obj:QuickDraw } QuickDraw, %{$U obj:OSIntf } OSIntf, %{$U obj:ToolIntf } ToolIntf, %{$U PipeDefs } PipeDefs, %{$U TaskDefs } TaskDefs; Const "serBufSize = 2048; { so we can swallow a screenfull no sweat} Type (SPortSel = (SPortA, SPortB); (SSpeed = (SSp50, SSp75, SSp110, SSp134andHalf, ;SSp150, SSp200, SSp300, SSp600, ;SSp1200, SSp1800, SSp2000, SSp2400, ;SSp3600, SSp4800, SSp9600, SSp19200); (SParity = (SParNone, SParOdd, SPar, SParEven); (SWidth = (SWid5, SWid7, SWid6, SWid8); (SStop = (SStp, SStp1, SStp1andHalf, SStp2); (Ser = ^SerRec; (SerRec = Record @port: SPortSel; @pipRcv: Pipe; @pipSnd: Pipe; @spd: SSpeed; @par: SParity; @wid: SWidth; @stp: SSTop; @xon: Char; @xoff: Char; @fXOn: Boolean; @fCTS: Boolean; @fInFlx: Boolean; { Input flow control? } @fEvBrk: Boolean; @fEvCTS: Boolean; @cumErr: Integer; @buf: Ptr; @error: ProcPtr; @sTask: Task; @snding: Boolean; @sdone: Boolean; @rTask: Task; @rcving: Boolean; @rdone: Boolean; :End; Procedure InitSer; Function NewSer: Ser; Procedure OpenSer(s: Ser; port: SPortSel; pipRcv, pipSnd: Pipe); Procedure CloseSer(s: Ser); Procedure EndSer; Procedure SetSerSpeed(s: Ser; spd: SSpeed); Function GetSerSpeed(s: Ser): SSpeed; Procedure SetSerParity(s: Ser; par: SParity); Function GetSerParity(s: Ser): SParity; Procedure SetSerWidth(s: Ser; wid: SWidth); Function GetSerWidth(s: Ser): SWidth; Procedure SetSerStop(s: Ser; stp: SStop); Function GetSerStop(s: Ser): SStop; Procedure SetSerBEvent(s: Ser; fEvBrk: Boolean); Function GetSerBEvent(s: Ser): Boolean; Procedure SetSerCEvent(s: Ser; fEvCTS: Boolean); Function GetSerCEvent(s: Ser): Boolean; Procedure SetSerCTS(s: Ser; on: Boolean); Function GetSerCTS(s: Ser): Boolean; Function ExaSerCTS(s: Ser): Boolean; Procedure SetSerCN(s: Ser; xon: Char); Function GetSerCN(s: Ser): Char; Procedure SetSerCF(s: Ser; xoff: Char); Function GetSerCF(s: Ser): Char; Procedure SetSerXON(s: Ser; on: Boolean); Function GetSerXON(s: Ser): Boolean; Function ExaSerXOFF(s: Ser): Boolean; Procedure SetSerInXON(s: Ser; on: Boolean); Function GetSerInXON(s: Ser): Boolean; Function ExaSerInXOFF(s: Ser): Boolean; Procedure SndSerXN(s: Ser); Procedure SndSerXF(s: Ser); Function ExaSerErrs(s: Ser): Integer; Procedure SetSerErr(s: Ser; errProc: ProcPtr); Function GetSerErr(s: Ser): ProcPtr; Implementation { no code here, it's all in SerImpl } End. 3. "6F^5PH r ^u?5{ Copyright 1983 by Apple Computer 8Mike Boich 8Martin P. Haeberli } Unit SerImpl; { Authorized Modification history: $Changed CTS handshake to default off MB 9/23/83 $added setHandshake call to openSer MB 9/25/83 $changed WHILE TRUE DOs to FlashMenuBar(0)s MB 9/25/83 $Integrated MB changes: MH 10/14/83 $Added support for loadable ASync Driver MH 11/28/83 $Replaced FlashMenuBar calls with calls to SerialError PMH 11/28/83 } Interface Uses {$U obj:QuickDraw } QuickDraw, %{$U obj:OSIntf } OSIntf, %{$U obj:ToolIntf } ToolIntf, %{$U AscDefs } AscDefs, %{$U PipeDefs } PipeDefs, %{$U TaskDefs } TaskDefs, %{$U SerDefs } SerDefs; { Const %x = 0; } { Type "TermRec = Record 1height: Integer; /End; "TermPtr = ^TermRec; } Implementation Const "OffsetDelta = 24; "pUTableBase = 284; "pLvl2DT = 434; "pUnitNtryCnt = 466; "pExtStsDT = 702; "sTaskSize = 1536; "rTaskSize = 1024; Type "SDirSel = (SDirRcv, SDirSnd); "{ "GetWaiRec = Record 2cs: CSParm; 2unu: Integer; 2count: Integer; 0End; "} "DCtl = Record 2DCtlDriver: Ptr; 2DCtlFlags: Integer; 2DCtlQueue: Integer; 2DCtlQHead: Ptr; 2DCtlQTail: Ptr; 2DCtlPosition: LongInt; 2DCtlStorage: Handle; 2DCtlRefNum: Integer; 2DCtlCurTicks: LongInt; 2DCtlWindow: Ptr; 2DCtlDelay: Integer; 2DCtlEMask: Integer; 2DCtlMenu: Integer; 0End; "PDCtl = ^DCtl; "HDCtl = ^PDCtl; "UTable = Array [1..32] Of HDCtl; "DT = Array [0..7] Of Ptr; Var "ASHandle: Handle; "ASLoaded: Boolean; "ASInstalled: Array [SPortSel] Of Boolean; "OldDriver: Array [SPortSel, SDirSel] Of Ptr; "OldDT: Array [0..7] Of Ptr; "UTableBase: ^UTable; "Lvl2DT: ^DT; "UnitNtryCnt: ^Integer; "ExtStsDt: ^DT; Procedure PushInteger(int: Integer); External; *taskNext := taskKill^.next; *Kill(taskKill); *taskKill := taskNext; (End; &TaskFirst := Nil; &InitTA; $End; End; { Kill(t: Task); } Procedure Kill; Var "taskPrev: Task; "taskCur: Task; "taskNext: Task; "found: Boolean; Begin "taskPrev := Pointer(Ord(@TaskFirst)); "taskCur := taskPrev^.next; "found := False; "While (taskCur <> Nil) And (Not found) Do $Begin &If taskCur = t Then (Begin *found := True; *taskPrev^.next := taskCur^.next; (End; &taskPrev := taskCur; &taskCur := taskPrev^.next; $End; "If t^.fDeAll Then $DisposPtr(Pointer(Ord(t))); End; { ThisTask: Task; } Function ThisTask; Begin "ThisTask := TaskCurrent; End; Procedure IniTskRec(proc: ProcPtr; arg: LongInt; t: Task; s: Size); Var "pArg: ^LongInt; "pProc: ^ProcPtr; "pStack: ^LongInt; "i: Integer; Begin "pArg := Pointer(Ord(t) + s - 4); "pProc := Pointer(Ord(pArg)- 4); "pStack := Pointer(Ord(pProc) - 4); "pArg^ := arg; "pProc^ := Pointer(Ord(@HaraKiri)); "pStack^ := Ord(proc); "pStack := Pointer(Ord(pStack) - 4); "pStack^ := 0; "pStack := Pointer(Ord(pStack) - 4); "pStack^ := RegA5; "For i := 1 to 13 Do $Begin &pStack := Pointer(Ord(pStack) - 4); &pStack^ := 0; $End; "t^.sp := Pointer(Ord(pStack)); End; { Fork(proc: ProcPtr; arg: LongInt; t: Task; s: Size): Task; } Function Fork; Begin "If t = Nil Then $Begin &t := Pointer(Ord(NewPtr(s))); &If t <> Nil Then (t^.fDeAll := True $End "Else $t^.fDeAll := False; "If t <> Nil Then $Begin &IniTskRec(proc, arg, t, s); &t^.next := TaskFirst; &TaskFirst := t; $End; "Fork := t; End; End. W^g5P:H r8^%.G.G_{ Copyright 1983 by Apple Computer 8Mike Boich 8Martin P. Haeberli } Unit PipeDefs; Interface Uses {$U obj:QuickDraw } QuickDraw, %{$U obj:OSIntf } OSIntf, %{$U obj:ToolIntf } ToolIntf; { Const "pipEscape = 255; } Type (Cardinal = 0..32767; (Index = Cardinal; (Pipe = ^PipRec; (PipRec = Record @s: Cardinal; { maximum amount of stuff } @sAvail: Cardinal; { virtual amount of stuff } @sActAv: Cardinal; { actual amount of stuff } @mark: Integer; @iNext: Index; @buf: Packed Array [Index] Of Char; :End; Function PipeOpen(s: Cardinal): Pipe; Procedure PipeClose(pip: Pipe); Function PipeSize(pip: Pipe): Cardinal; { Amount of space in pipe } Function PipeAvail(pip: Pipe): Cardinal; { Amount waiting in pipe } Function PipeGuarantee(pip: Pipe): Cardinal; { Amount of guaranteed free in pipe } Function PipeLeft(pip: Pipe): Cardinal; { Amount of space left in pipe } Function PipeGet(pip: Pipe): Integer; { Get a character from pipe } Function PipeGetMark(pip: Pipe): Integer; { Get a mark from pipe } Procedure PipePut(pip: Pipe; ch: Char); { Put a character in pipe } Procedure PipePutMark(pip: Pipe; ch: Char); { Put a mark in pipe } Procedure PipeRead(pip: Pipe; buf: Ptr; Var cnt: Cardinal); Procedure PipeWrite(pip: Pipe; buf: Ptr; Var cnt: Cardinal); Implementation End. 3. "6F^5PH rt^((%b{ Copyright 1983 by Apple Computer 8Mike Boich 8Martin P. Haeberli } Unit PipeImpl; Interface Uses {$U obj:QuickDraw } QuickDraw, %{$U obj:OSIntf } OSIntf, %{$U obj:ToolIntf } ToolIntf, %{$U PipeDefs } PipeDefs; { Const %x = 0; } { Type "TermRec = Record 1height: Integer; /End; "TermPtr = ^TermRec; } Implementation Const "lPipeRec = 10; "pipEscape = 64; { Normally 255 } Type "CharVec = Packed Array [Index] Of Char; "PCV = ^CharVec; { Var "frob: Integer; } {$SPipe} { PipeOpen(s: Cardinal): Pipe; } Function PipeOpen; Var "pip: Pipe; Begin "pip := Pointer(Ord(NewPtr(lPipeRec + s))); "If pip = Nil Then $While True Do; "pip^.s := s; "pip^.sAvail := 0; "pip^.sActAv := 0; "pip^.iNext := 0; "pip^.mark := -1; "PipeOpen := pip; End; { PipeClose(pip: Pipe); } Procedure PipeClose; Begin "If pip^.sAvail <> 0 Then $While True Do; "DisposPtr(Pointer(Ord(pip))); End; { PipeSize(pip: Pipe): Cardinal; } Function PipeSize; Begin "PipeSize := pip^.s; End; { PipeAvail(pip: Pipe): Cardinal; } Function PipeAvail; Begin "PipeAvail := pip^.sAvail; End; { PipeGuarantee(pip: Pipe): Cardinal; } { Amount of guaranteed free in pipe } Function PipeGuarantee; Begin "PipeGuarantee := (pip^.s - pip^.sActAv) div 2; End; { PipeLeft(pip: Pipe): Cardinal; } { Amount of space left in pipe } Function PipeLeft; Begin "PipeLeft := pip^.s - pip^.sActAv; End; Function PipeGetCh(pip: Pipe): Integer; Begin "PipeGetCh := -1; "With pip^ Do $Begin &If sActAv > 0 Then (Begin *PipeGetCh := Ord(buf[iNext]); *iNext := (iNext + 1) Mod s; *sActAv := sActAv - 1; (End; $End; End; { PipeGet(pip: Pipe): Integer; } Function PipeGet; Var "ichGet: Integer; Begin "PipeGet := -1; "With pip^ Do $Begin &If (mark = -1) And (sAvail > 0) Then (Begin *ichGet := PipeGetCh(pip); *If ichGet = pipEscape Then ,Begin .ichGet := PipeGetCh(pip); .If ichGet = pipEscape Then 0Begin 2PipeGet := ichGet; 2sAvail := sAvail - 1 0End .Else 0mark := ichGet; ,End *Else ,Begin .PipeGet := ichGet; .sAvail := sAvail - 1; ,End; (End; $End; End; { PipeGetMark(pip: Pipe): Integer; } { Get a mark from pipe } Function PipeGetMark; Begin "PipeGetMark := -1; "With pip^ Do $Begin &If sAvail > 0 Then (Begin *PipeGetMark := mark; *sAvail := sAvail - 1; *mark := -1; (End; $End; End; Procedure PipePutCh(pip: Pipe; ch: Char); Var "iPut: Index; Begin "With pip^ Do $Begin &If sActAv = s Then (While True Do; &iPut := (iNext + sActAv) Mod s; &buf[iPut] := ch; &sActAv := sActAv + 1; $End; End; { PipePut(pip: Pipe; ch: Char); } Procedure PipePut; Var "iPut: Index; "sLeft: Cardinal; Begin "With pip^ Do $Begin &sLeft := s - sActAv; &If ch = Chr(pipEscape) Then (Begin *If sLeft <= 1 Then { pipe is full } ,While True Do; *PipePutCh(pip, Chr(pipEscape)); *PipePutCh(pip, ch); (End &Else ; Copyright 1983 by Apple Computer ; Mike Boich ; Martin P. Haeberli ;TaskAsm.text -- Assembly Language Support for Multi-Tasking. ;---------------------------------------------------------------------- ; TaskAsm - Macintosh OS IO Interface routines. ; ; Supports Yield, Resume, ... ; ; Calling sequences: ; ; Error codes: ; ; Written By: Martin P. Haeberli December 11, 1983 ; ; Modification History: ; 11 Dec 83 M Haeberli Cleaned up comments and code. ;---------------------------------------------------------------------- ; 0.Include TLAsm:SysEqu.Text 0.Include TLAsm:SysMacs.Text 0.Proc TaskAsm 0.Def InitTA 0.Def Yield 0.Def Resume 0.Def RegA5 0.Def HaraKiri ;---------------------------------------------------------------------- ; ; Offsets and Static Variables used by and in TaskAsm. ; savedSP .Equ 4 ;Offset for saved Stack Pointer. TaskCur .Long 0 resumeSP .Long 0 ;---------------------------------------------------------------------- ; ; Procedure InitTA; ; ; Initializes TaskAsm. ; ; Arguments: ; None. ; ; Results: ; None. ; ; Registers: ; D0: ec: error code ; A0: param: Paramater list address. ; A1: ra: Return Address. ; InitTA 0MoveQ #0,D0 0LEA TaskCur,A0 0Move.L D0,(A0) 0LEA resumeSP,A0 0Move.L D0,(A0) 0Clr.L StkLowPt ; disable VBL stack checking. 0RTS ;Return to caller. ;---------------------------------------------------------------------- ; ; Procedure Yield; ; ; Yields control of the processor to the next task. ; ; Arguments: ; None. ; ; Results: ; None. ; ; Registers: ; D0: ec: error code ; A0: param: Paramater list address. ; A1: ra: Return Address. ; Yield 0MoveM.L D0-D7/A0-A6,-(SP) ;Save all them registers. 0Move.L TaskCur,A0 ;TaskCur points to current TaskRec. 0Move.L SP,savedSP(A0) ;Save stack pointer 0BrA.S UnResume ;Switch back to main process. UnYield 0Move.L TaskCur,A0 ;TaskCur points to current TaskRec. 0Move.L savedSP(A0),SP 0MoveM.L (SP)+,D0-D7/A0-A6 ;Restore all them registers. 0RTS ;Return to caller. ;---------------------------------------------------------------------- ; ; Procedure Resume(t: Task); ; ; Resumes task specified by t. ; ; Argument: ; t: Points to TaskRec for the new task. ; ; Results: ; None. ; ; Registers: ; D0: ec: error code ; A0: param: Parameter list address. ; A1: ra: Return Address. ; Resume 0Move.L 4(SP),D0 ;Recover argument 0Move.L (SP)+,(SP) ;Move return address up stack. 0Move.L resumeSP,D1 ;Make sure we're OK. 0BNE.S ResumeExit ;Nope, do nothing. 0LEA TaskCur,A0 0Move.L D0,(A0) ;Save task pointer. 0MoveM.L D0-D7/A0-A6,-(SP) ;Save all them registers. 0LEA resumeSP,A0 0Move.L SP,(A0) ;Save stack pointer 0BrA.S UnYield ;Resume process in question UnResume 0LEA resumeSP,A0 0Move.L (A0),SP ;Restore stack pointer 0Clr.L (A0) ;Clear busy flag. 0MoveM.L (SP)+,D0-D7/A0-A6 ;Restore all them registers. ResumeExit 0RTS ;return to caller ;---------------------------------------------------------------------- ; ; Function RegA5: LongInt; ; ; Returns current value of A5. ; ; Argument: ; None. ; ; Results: ; None. ; ; Registers: ; D0: ec: error code ; A0: param: Parameter list address. ; A1: ra: Return Address. ; RegA5 0Move.L A5,4(SP) 0RTS ;return to caller ;---------------------------------------------------------------------- ; ; Procedure HaraKiri; ; ; Kills current process, if any. ; ; Argument: ; None. ; ; Results: ; None. ; ; Registers: ; D0: ec: error code ; A0: param: Parameter list address. ; A1: ra: Return Address. ; ;Procedure HaraKiri; ;Begin ; If TaskCurrent <> Nil Then ; Begin ; Kill(TaskCurrent); ; End; ;End; ;} 0.Ref Kill HaraKiri 0LEA TaskCur,A0 0Move.L (A0),D0 ;Get task pointer. 0BEq.S @1 0LEA resumeSP,A0 ;Switch to 'Resume' stack. 0Move.L (A0),SP 0Move.L D0,-(SP) ;Pass task pointer to Kill. 0JSR Kill ;Call task kill. @1 0BrA.S UnResume 0.End W^g5P:H r^ { Copyright 1983 by Apple Computer 8Mike Boich 8Martin P. Haeberli } Unit TaskDefs; Interface Uses {$U obj:OSIntf } OSIntf; Type (Task = ^TaskRec; (TaskRec = Record @next: Task; { Pointer to next Task or Nil } @sp: Ptr; { Saved stack pointer } @fDeAll: Boolean; { Deallocate task object on \death } :End; Procedure InitTasks; Procedure RunTasks; Procedure EndTasks; Procedure Yield; Procedure HaraKiri; Procedure Kill(t: Task); Function ThisTask: Task; Function Fork(proc: ProcPtr; arg: LongInt; t: Task; s: Size): Task; Implementation { no code here, it's all in TaskImpl, TaskAsm } End. 3. "6F^5PH r ^$${ Copyright 1983 by Apple Computer 8Mike Boich 8Martin P. Haeberli } Unit TaskImpl; Interface Uses {$U obj:QuickDraw } QuickDraw, %{$U obj:OSIntf } OSIntf, %{$U TaskDefs } TaskDefs; Implementation { Const "OffsetDelta = 24; } Var "TaskFirst: Task; "TaskCurrent: Task; Procedure InitTA; External; Procedure Resume(t: Task); External; Function RegA5: LongInt; External; Procedure HaraKiri; External; { InitTasks; } Procedure InitTasks; Begin "TaskFirst := Nil; "TaskCurrent := Nil; "InitTA; End; { RunTasks; } Procedure RunTasks; Begin "TaskCurrent := TaskFirst; "While TaskCurrent <> Nil Do $Begin &Resume(TaskCurrent); &TaskCurrent := TaskCurrent^.next; $End; End; { EndTasks; } Procedure EndTasks; Var "taskKill: Task; "taskNext: Task; Begin "If TaskCurrent = Nil Then $Begin &taskKill := TaskFirst; &While taskKill <> Nil Do (Begin ,SUB.W D0,D3 ; bytes to top ,CMP.W BufHigh(A2),D3 ; past the max limit? ,BCC.S InputRTS ; exit if not ,BSET #7,FlowOff(A2) ; already sent one? ,BNE.S InputRTS ; exit if so ,MOVE.B XOffChar(A2),D0 ,BSR FlowCharOut InputRTS RTS ;________________________________________________________________________ ; ; Routine: SCIntHnd ; ; Arguments: A0 (input) -- port A/B control read address ; A1 (input) -- port A/B control write address ; ; Function: This routine handles SCC special condition interrupts: ; these occur when an input character is received that has ; a parity error, framing error, or causes an overrun. ; If the option is set to abort on the error, the character ; is discarded and the input request (if any) aborted; otherwise, ; the error is noted and the character buffered as usual. ; ;________________________________________________________________________ SCBIntHnd LEA PortBVars,A3 ; get appropriate variables (port B) 0BRA.S SCIntHnd ; go to shared code SCAIntHnd LEA PortAVars,A3 ; get appropriate variables (port A) SCIntHnd MOVE.B #1,(A1) ; point to error reg 0MOVE.L (A3)+,A2 ; get local variables pointer 0MOVE.L (A3),A3 ; and DCE pointer (delay, too) 0MOVE.B (A0),D1 ; read the error condition 0MOVEQ #$70,D3 ; form $70 mask 0AND.B D3,D1 ; isolate error bits 0OR.B D1,AsyncErr(A2) ; accumulate errors (delay, too) 0MOVE.B SCCData(A0),D0 ; get the data byte 0MOVE.B Options(A2),D2 ; get abort options 0EOR.B D1,D2 ; should we abort? 0MOVE.B #$30,(A1) ; reset the error flag 0AND.B D3,D2 0BEQ.S StashIt ; go stash it if not . . . 0TST.B ReadCmd(A2) ; if we have no pending read command 0BEQ.S InputRTS ; then just discard the character 0MOVEQ #RcvrErr,D0 ; otherwise, note the error RdReqDone MOVE.L A3,A1 ; DCE pointer 0CLR.B ReadCmd(A2) ; no longer a read request pending 0BRA toIODone ; and go to IODone (A1 must point L; to the DCE and D0 = IOResult) ;________________________________________________________________________ ; ; Routine: ExtIntHnd ; ; Arguments: A0 (input) -- port A/B control read address ; A1 (input) -- port A/B control write address ; D0 (input) -- SCC read reg 0 value ; D1 (input) -- SCC read reg 0 changed bits ; ; Function: This routine handles SCC external/status interrupts for ; both ports; mouse (DCD) interrupts are passed along to the ; mouse interrupt handler in CrsrCore. Only Break/Abort and CTS ; external interrupts are enabled (besides DCD). ; ; Note that CTS low in read reg 0 currently means that the ; hardware handshake line is asserted which means 'ok to transmit'. ;________________________________________________________________________ ExtBIntHnd LEA PortBVars,A3 ; get appropriate variables - port B 0BRA.S ExtIntHnd ; go to shared code ExtAIntHnd LEA PortAVars,A3 ; get appropriate variables - port A ExtIntHnd MOVE.L (A3)+,A2 ; get pointer to local variables 0MOVE.L (A3),A3 ; and DCE ptr in case of break abort 0MOVE.B D1,D2 ; changed bits 0AND.B postOptions(A2),D2 ; post this change? 0BEQ.S @0 ; br if not 0MOVEM.L D0/A0,-(SP) ; preserve these registers 0MOVE.W #IODrvrEvt,A0 0ASL.W #8,D0 ; make room for 'changed' values 0MOVE.B D1,D0 0SWAP D0 ; make room for driver refnum 0MOVE.W DCtlRefnum(A3),D0 0_PostEvent ; and post the event 0MOVEM.L (SP)+,D0/A0 @0 TST.B D1 ; see if it's a change in break status 0BMI.S @1 ; branch if it was a break interrupt 0LSL.B #2,D0 ; must be CTS change 0SMI CTSFlag(A2) ; set flags according to CTS 0BPL ContOut1 ; if freshly asserted, continue output 0RTS ; if not, exit for now @1 TST.B D0 ; check break level 0BMI.S @2 ; if it's asserted, terminate any input 0MOVE.B SCCData(A0),D0 ; otherwise (end of break), discard null 0RTS ; and return @2 MOVEQ #BreakRecd,D0 ; note the break 0TST.B ReadCmd(A2) ; read request pending? 0BNE.S RdReqDone ; if there is one, jump to IODone ExtIntRTS RTS ; otherwise, just return 0.END 3. "6F^5unD!$ǐ^"--w; Copyright 1983 by Apple Computer ; Mike Boich ; Martin P. Haeberli 0.INCLUDE tlasm:SYSEQU.TEXT 0.INCLUDE tlasm:SYSMACS.TEXT ;--------------------------------------------------------------------------- ; ; Procedure PushInteger(int: Integer); ; Pushes an integer on the parameter stack. Used to pass parameters to ; procedures called via CallProc *.PROC PushInteger,1 *RTS ; Return leaves argument on stack ;--------------------------------------------------------------------------- ; ; Procedure PushString(str: String); ; Pushes a string on the parameter stack. Used to pass parameters to ; procedures called via CallProc *.PROC PushString,1 *RTS ; Return leaves argument on stack ;--------------------------------------------------------------------------- ; ; PROCEDURE CallProc(a: ProcPtr); ; {calls a parameterless procedure} ; used to implement table driven dispatch from Pascal *.PROC CallProc,1 *MOVE.L (SP)+,A0 ; rtn addr *MOVE.L (SP)+,A1 ; actionProc *MOVE.L A0,-(SP) ; save rtn addr *JMP (A1) ; jmp to actionProc, which RTS's to Pascal ;--------------------------------------------------------------------------- ; PROCEDURE myBlockMove(srcPtr,dstPtr : POINTER; len: longInt); EXTERNAL; *.PROC myBlockMove,0 *MOVE.L (SP)+, D1 ; rtn addr *MOVE.L (SP)+,D0 ; length *MOVE.L (SP)+,A1 ; dest *MOVE.L (SP)+,A0 ; source *_BlockMove *MOVE.L D1,-(SP) *RTS ;--------------------------------------------------------------------------- ; PROCEDURE setUpZone; EXTERNAL; (.PROC setUpZone,0 (MOVE.L SP,A0 (SUB.W #$1000,A0 ; try 4K below current stack (_SetApplLimit (RTS *.END 5P:H r^'' ,BEQ.S @3 ; if not, we're ok ,TST.B CTSFlag(A2) ; read current hardware handshake ,BEQ.S @3 ; if asserted, we're ok @2 MOVEQ #1,D0 ; not ok flag ,RTS @3 MOVEQ #0,D0 ; ok flag ,RTS TBIntHnd MOVE.L PortBVars,A2 ; get appropriate variables (port B) ,BRA.S TXIntHnd ; go to shared code TAIntHnd MOVE.L PortAVars,A2 ; get appropriate variables (port A) TXIntHnd TST.B SendXOnff(A2) ; need to send a handshake byte? ,BNE.S SendNextChar ; br if so . . . ,TST.B WriteCmd(A2) ; output request finished? ,BEQ.S ResetTXInt ; then just reset this one ,BSR.S CheckHandshake ; handshake ok? ,BNE.S ResetTXInt ; if not, exit and wait until it is SendNextChar ,MOVE.L OutDCE(A2),A1 ; get DCE pointer for Fetch ,MOVE.W SR,-(SP) ; fake out prime routine ,BRA.S FetchNext ResetTXInt MOVE.B #$28,(A1) ; reset interrupt for last byte out ,RTS ; and return from interrupt ContOut CLR.B XOFFlag(A2) ; come here if we got an XON ContOut1 TST.B WriteCmd(A2) ; come here for XON or CTS high ,BNE.S SendNextChar ; if no output request, just exit OutputRTS RTS ; otherwise, wait for the interrupt ;________________________________________________________________________ ; ; Routine: Input Prime routines ; ; Arguments: A1 (input) -- DCE pointer for this driver ; ; Function: Get characters from local buffer, if any (satisfy request ; possibly). Note the input request. ; ; Modifications: ; 09 Mar 83 LAK Save previous interrupt state: don't force it low since ; we may be called here by IODone during disk poll data ; unload. ; 17 Aug 83 LAK Send XOn if input flow control is enabled and conditions ; are right. ;________________________________________________________________________ AInPrime MOVE.L PortAVars,A2 ; local variables address ,BRA.S InPrime BInPrime MOVE.L PortBVars,A2 InPrime BSR.S GetBufRegs ; load D1, D2, D3, and A3 FeedBufLoop ,MOVE SR,-(SP) ,ORI #$0300,SR ; disable SCC interrupts ,CMP BufIndex(A2),D2 ; indices equal means we're through ,BEQ.S @3 ,MOVE.B 0(A3,D2.W),D0 ; get the next byte ,ADDQ #1,D2 ; bump outdex ,CMP D3,D2 ; wrap it if we're at buffer limit ,BNE.S @1 ,MOVEQ #0,D2 @1 MOVE D2,BufOutdex(A2) ; update out index ,BSR.S toStash ; stash into user's buffer ,MOVE (SP)+,SR ; let interrupts in at this point ,TST.W D0 ; done with request? ,BPL.S FeedBufLoop ; go again if we're not done ,BSR.S CkFlowOn ,BRA.S GoodFinish ; and pay a visit to IODone @3 ST ReadCmd(A2) ; note the input command ,BRA.S CkFlow1 ; (should probably check break status H; here before noting command . . .) CkFlowOn MOVE SR,-(SP) ,ORI #$0300,SR ; disable SCC interrupts CkFlow1 TST.B InSWHS(A2) ; handshaking enabled? ,BEQ.S @1 ; exit if not ,BSR.S GetBufRegs ,BSR.S GetBufCnt ; get current count in D0 ,CMP.W BufLow(A2),D0 ; below minimum for flow control ,BHI.S @1 ; exit if not ,BCLR #7,FlowOff(A2) ; have we sent an XOFF? ,BEQ.S @1 ; br if not ,MOVE.B XOnChar(A2),D0 ,BSR.S FlowCharOut @1 MOVEQ #0,D0 ; 0 for clean async immediate result ,RTE toStash MOVE.L JStash,-(SP) ; push the vector ,RTS ; short routine called with interrupts disabled to send an input flow ; control char if transmit buffer is empty FlowCharOut ,LEA SendXOnff(A2),A0 ; handy pointer ,TST.B (A0) ; out char already pending? ,BEQ.S @2 ; br if not @0 CLR.B (A0) ; otherwise, two opposites cancel @1 RTS @2 MOVE.B D0,(A0) ; set char to send ,BSR WrSetUp ; set up A3, see if xmit buffer is empty ,BEQ.S @1 ; exit if transmit buffer is full ,MOVE.B D0,SCCData(A3) ; start it out ,BRA.S @0 GetBufRegs MOVE.L InBufPtr(A2),A3 ,MOVE.W BufSize(A2),D3 ,MOVEM.W BufIndex(A2),D1-D2 ; get BufIndex and BufOutdex ,RTS GetBufCnt MOVE.W D1,D0 ; BufIndex ,SUB.W D2,D0 ; minus BufOutdex ,BHS.S @1 ; br if positive value ,ADD.W D3,D0 ; add BufSize to make it positive @1 RTS ;_______________________________________________________________________ ; ; Routine: PollDtaIn ; Arguments: A5.L (input) -- AVBufA pointer ; A6.L (input) -- SCC Port A Data pointer ; PollStack -- start of stack data ; This routine should be jsr'ed to, with polled input data ; on the stack (high-order bytes between current SP+4 and ; PollStack address). ; Function: Processes input data from disk driver polling. ; ; Modification History: ; 10-Apr-83 LAK New Today. ;_______________________________________________________________________ PollDtaIn MOVE.L PollStack,A4 ; start of data ,MOVE.L (SP)+,DskRtnAdr ; save return address StorData TST.B (A5) ; SCC data available? ,BMI.S @1 ,MOVE.B (A6),-(SP) ; push it on the stack ,BRA.S StorData ; get it emptied out . . . @1 CMP.L SP,A4 ; processed all data? ,BEQ.S @2 ; exit if so ,SUBQ #2,A4 ; skip over garbage byte ,MOVE.B (A4),D0 ; get next byte ,LEA PortAVars,A3 ; get appropriate variables (port A) ,LEA SCCRBase+ACtl,A0 ; and SCC pointers for RxBF routine ,LEA SCCWBase+ACtl,A1 ,BSR.S PollStash ; store it, using our RxBF routines ,BRA.S StorData @2 MOVE.L PollStack,SP ; clean up stack ,MOVE.L DskRtnAdr,-(SP) ; replace return address ,RTS ; (lower processor priority?) ;________________________________________________________________________ ; ; Routine: RXIntHnd ; ; Arguments: A0 (input) -- port A/B control read address ; A1 (input) -- port A/B control write address ; ; Function: This routine handles SCC receiver interrupts for ; both ports; the data is read and stashed, IODone called ; if necessary. ;________________________________________________________________________ RBIntHnd LEA PortBVars,A3 ; get appropriate variables (port B) ,BRA.S RXIntHnd ; go to shared code RAIntHnd LEA PortAVars,A3 ; get appropriate variables (port A) RXIntHnd MOVE.B SCCData(A0),D0 ; get the data byte PollStash MOVE.L (A3)+,A2 ; get pointer to local variables ,MOVE.L (A3),A3 ; and DCE pointer ,TST.B SWHS(A2) ; software handshake enabled? ,BEQ.S StashIt ; branch if not ,MOVEQ #127,D1 ; mask out high bit ,AND.B D0,D1 ,CMP.B XONChar(A2),D1 ; was this an XON? ,BEQ.S ContOut ; then start output up again ,CMP.B XOFFChar(A2),D1 ; how about an XOFF? ,BNE.S StashIt ; if not, then stash the character ,ST XOFFlag(A2) ; if so, then note it ,BRA.S InputRTS ; and exit ; stash byte in the user's buffer if a request is pending, otherwise use our own StashIt TST.B ReadCmd(A2) ; read request pending? ,BEQ.S PutInOurBuf ; if there isn't one, stash it in ours PutInUserBuf ,MOVE.L A3,A1 ; get DCE pointer ,BSR.S toStash ; use utility routine to save code ,BPL.S InputRTS ; if request isn't finished, just RTS ,CLR.B ReadCmd(A2) ; no longer a read request pending ,BRA.S GoodFinish ; otherwise, we have a good finish PutInOurBuf ,BSR.S GetBufRegs ,MOVE.B D0,0(A3,D1.W) ; stash the byte ,ADDQ.W #1,D1 ; update BufIndex ,CMP.W D3,D1 ,BNE.S @1 ; br if not at the end ,MOVEQ #0,D1 ; otherwise, reset to 0 @1 CMP.W D2,D1 ; hit the output index? ,BNE.S @2 ; br if not ,BSET #SoftOR,AsyncErr(A2); note the soft overrun ,RTS ; and exit without updating index @2 MOVE.W D1,BufIndex(A2) ; update index ,TST.B InSWHS(A2) ; XON/XOFF input flow control? ,BEQ.S InputRTS ; br if not ,BSR.S GetBufCnt ; get current buffer count in D0 ;________________________________________________________________________ ; ; Routine: Control routines ; ; Arguments: A0 (input) -- pointer to Control parameter block: ; (0) Header ; (12) Completion routine ; (16) IOResult code ; (24) RefNum ; (26) Opcode ; (28) Parameters ; A1 (input) -- DCE pointer for this driver ; ; Function: These are the Control routines for the SCC async-mode drivers. ; ; Operation code 1 is the standard KillIO call: pending read ; and write requests are reset and any buffered bytes discarded. ; ; For operation code 8, the appropriate SCC channel is reset and ; reinitialized according to the new defaults. If a parameter ; is zero, the current corresponding value will not be changed: ; ; (26) [$0008] ; (28) [V][V][W][W][X][X][Y][Y] [Z][Z][Z][Z][Z][Z][Z][Z] ; ; VV = 1,2,3, for 1,1.5,2 stop bits ; WW = 0,1,2,3 for no,odd,no,even parity ; XX = 0,1,2,3, for 5,7,6,8 data bits ; YY = high byte of baud rate constant, low 2 bits ; ZZZZZZZZ = low byte of baud rate constant ; ; Opcode 9 is used to install a new buffer for input buffering (this control ; command may be given to either the input or output driver): ; a pointer to the buffer and the buffer length are passed. The ; async driver uses this buffer to store input characters when ; no input user request is pending: ; ; (26) [$0009] ; (28) [pointer to buffer] ; (32) [buffer length] - 2 bytes ; ; Opcode 10 is used to specify handshake options and other ; miscellaneous controls: ; ; (26) [$000A] ; (28) enable XON/XOFF output flow control if non-zero ; (29) enable CTS output handshake if non-zero ; (30) XON char for software handshake ; (31) XOFF char for software handshake ; (32) errors which cause abort of input requests (1 for abort): ; bit 4 = abort on parity error ; bit 5 = abort on overrun error ; bit 6 = abort on framing error ; (33) status changes which cause events to be posted ; bit 7 = post event on break status change ; bit 5 = post event on CTS change ; (34) enable XON/XOFF input flow control if non-zero ; ; Opcode 11 is used to reinitialize the SCC to clear break ; mode: ; ; (26) [$000B] ; ; Opcode 12 is used to set break mode in the SCC channel: ; ; (26) [$000C] ; ; Modification History: ; 10 Apr 83 LAK Fixed bug in setting abort options. No longer have to preserve ; A4 (done by IOCore). ; 21 Apr 83 LAK Control calls 1-3 -> 8-10; added KillIO control call 1; ; control call 9 now uses same format as for the clock chip. ; 17 Aug 83 LAK Opcode A now also controls optional event posting and ; input XOn/XOff flow control. ;________________________________________________________________________ AControl MOVE.L PortAVars,A2 ; local variables address ,BRA.S Control BControl MOVE.L PortBVars,A2 ; local variables address Control LEA CSCode(A0),A0 ; get parameters ,MOVE.W (A0)+,D1 ; get opcode ,SUBQ.W #1,D1 ; opcode 1? ,BNE.S CtlConfig ; branch if not ,CLR.W ReadCmd(A2) ; clear ReadCmd and WriteCmd flags ,CLR.L BufIndex(A2) ; get rid of any buffered bytes ,RTS ; special direct return CtlConfig SUBQ.W #7,D1 ; opcode 8? ,BNE.S CtlBuffer ; branch if not ,MOVE.W (A0)+,D4 ; get word of configuration data ,CMP.W lastSetup(A2),D4 ; same setup? ,BEQ.S CtlGood ; then just exit ,BSR ToInitSCC ; go initialize CtlGood MOVEQ #0,D0 ; IOResult=0 for success CtlExit BRA.S toIODone ; and go to IODone (A1 must point H; to the DCE and D0 = IOResult) CtlBuffer SUBQ #1,D1 ; opcode 9? ,BNE.S NewOptions ; br if not ,PEA CtlGood ; end up here ,CLR.L BufIndex(A2) ; clear in and out indices ,MOVE.L (A0)+,A4 ,MOVE.W (A0),D1 ; if zero, revert to our own buffer ,BNE.S InstllABuf ; otherwise, ring in a new one . . . InstllLBuf LEA LocalBuf(A2),A4 ; use our meager local buffer for now ,MOVEQ #LclBufSize,D1 ; InstllABuf LEA InBufPtr(A2),A3 ,MOVE.L A4,(A3)+ ; ,MOVE.W D1,(A3)+ ,LSR.W #2,D1 ; set new bufmin and bufmax values ,MOVE.W D1,(A3)+ ; BufLow ,MOVE.W D1,(A3)+ ; BufHigh ,RTS NewOptions SUBQ #1,D1 ; opcode 10? ,BNE.S CtlBreak ; br if not ,ADD #SWHS,A2 ; point to options ,MOVE.L (A0)+,(A2)+ ; set new SWHS, HWHS, XON/XOFF chars ,MOVE.W (A0)+,(A2)+ ; errors which cause aborts (Options), and H; status changes on which to post events ,MOVE.B (A0)+,(A2) ; set new InSWHS ,BRA.S CtlGood ; exit ok CtlBreak MOVE.B Xmitbits(A2),D0 ; current WR5 configuration (break cleared) ,SUBQ #1,D1 ; opcode 11? ,BEQ.S @1 ; br if so ,BSET #4,D0 ; assume set break ,SUBQ #1,D1 ; opcode 12? ,BNE.S CtrlErr ; br if not @1 BSR.S WrSetUp ,MOVE.B #5,(A3) ; address register 5 ,MOVE.L (SP),(SP) ; delay ,MOVE.B D0,(A3) ; set it ,BRA.S CtlGood ; exit ok CtrlErr MOVEQ #ControlErr,D0 toIODne BRA.S CtlExit ; go IODone ;________________________________________________________________________ ; ; Routine: Output Prime routines ; ; Arguments: A1 (input) -- DCE pointer for this driver ; ; Function: The first character is loaded into the SCC. ; ; Other: ;________________________________________________________________________ AOutPrime MOVE.L PortAVars,A2 ; local variables address ,BRA.S OutPrime BOutPrime MOVE.L PortBVars,A2 OutPrime MOVE SR,-(SP) ; save interrupt state ,ORI #$0300,SR ; disable interrupts ,ST WriteCmd(A2) ; note the output command ,BSR.S CheckHandshake ; do we have handshake go-ahead? ,BNE.S goodRTE ; if not, exit until we do FetchNext BSR.S WrSetUp ,BEQ.S goodRTE ; exit if transmit buffer is still full ,MOVE.B SendXOnff(A2),D0 ; send XON or XOFF? ,CLR.B SendXOnff(A2) ; clear any flags ,AND.W #$00FF,D0 ; send one? (clear high bits if so) ,BNE.S @1 ; br if so ,MOVE.L JFetch,A0 ,JSR (A0) ; otherwise, get it from user buffer @1 MOVE.B D0,SCCData(A3) ; start it out ,TST.W D0 ; only one? ,BMI.S resetWrCmd ; if so, we've had a good finish goodRTE MOVEQ #0,D0 ; 0 for clean async immediate result ,RTE ; (redundant for xmit interrupt) resetWrCmd CLR.B WriteCmd(A2) ; no more pending output ,MOVE (SP)+,SR ; restore interrupt state GoodFinish MOVEQ #0,D0 ; IOResult=0 for success ,BRA.S toIODne ; and go to IODone (A1 must point H; to the DCE and D0 = IOResult) WrSetUp MOVE.L SCCRd,A3 ; get SCC read address ,ADD SCCOffset(A2),A3 ,BTST #TXBE,(A3) ; check for TBE ,ADD.L #SCCWrite,A3 ; form SCC base write address @1 RTS ;________________________________________________________________________ ; ; Routine: TXIntHnd ; ; Arguments: A0 (input) -- port A/B control read address ; A1 (input) -- port A/B control write address ; ; Function: This routine handles SCC transmitter interrupts for ; both ports; data is sent when available, IODone called ; if necessary, ; ; Other: Includes handshake check routine which is also used by ; Output Prime routine. ;________________________________________________________________________ CheckHandshake ,TST.B SWHS(A2) ; XON/XOFF handshake? ,BEQ.S @1 ; if not, check for hardware handshake ,TST.B XOFFlag(A2) ; do we have a pending XOFF? ,BNE.S @2 ; if so, we're not ok to xmit @1 TST.B HWHS(A2) ; hardware handshake? ransmitter and receiver interrupts ; are enabled. Parity errors are configured to generate special ; condition vectors. ; ; Other: Registers A0-A3 are used. ; ; Modification History: ; 10-Apr-83 LAK WR9 and WR1 are initialized from variable data (WR9 init is ; no longer treated specially; WR1 variable init allows ; w/req pin to behave differently for channels A and B). ;________________________________________________________________________ ;___________________________________________________________________; ; ; ; initialization data for SCC: RS-232 async communication: ; ; FORMAT: data,register# - for immediate data ; ; register#,$FF - for variable data ; ;___________________________________________________________________; InitData .BYTE 9,$FF ; reset SCC channel ,.BYTE 4,$FF ; x16 clk, stop bits, parity options ,.BYTE 1,$FF ; WR1 reg, first write ,.BYTE $00,2 ; zero interrupt vector ,.BYTE 3,$FF ; bits/char option rcvr ,.BYTE 5,$FF ; bits/char option xmitter ,.BYTE $02,9 ; status in low bits ,.BYTE $50,11 ; br gen clk to rcvr, xmitter ,.BYTE 12,$FF ; set baud rate low byte ,.BYTE 13,$FF ; set baud rate high byte ,.BYTE 3,$FF ; enable rcvr ,.BYTE 5,$FF ; enable xmitter ,.BYTE $01,14 ; enb baud rate generator from RTxC pin ,.BYTE $A8,15 ; Break, DCD, CTS external interrupts ,.BYTE $10,0 ; reset ext/status twice ,.BYTE $10,0 ,.BYTE 1,$FF ; w/req pin configuration ,.BYTE $0A,9 ; enable interrupts, status in low bits InitLth .EQU *-InitData ; InitSCC LEA InitData,A3 ; get pointer to init data ,MOVEQ #InitLth,D1 ; and init length InitSCC1 MOVE SR,-(SP) ; save interrupt state ,MOVEM.L A0-A2,-(SP) ,MOVE.W SCCOffset(A2),D2 ; get SCC offset ,MOVEM.L SCCRd,A0-A1 ; and get SCC addresses ,ADD.W D2,A0 ; add in offset ,ADD.W D2,A1 ,ORI #$0300,SR ; disable all but debug interrupts ,MOVE.B (A0),D2 ; read to make sure SCC is sync'ed up ,LEA SCCReset(A2),A2 ; point to data we will need NextReg MOVE.W (A3)+,D0 ; get next init data, reg ,TST.B D0 ,BPL.S @1 ; bit 7=1 means get variable init data ,MOVE.B (A2)+,D0 ; get variable data ,ROR.W #8,D0 ; adjust to [data][ptr] format @1 MOVE.B D0,(A1) ; write register pointer ,ROR.W #8,D0 ,MOVE.L (SP),(SP) ; delay ,MOVE.B D0,(A1) ; write register ,SUBQ.W #2,D1 ,BGT.S NextReg ,MOVE.B (A0),D2 ; read SCC register 1 ,LSL.B #2,D2 ; use this data to set CTS flag ,MOVEM.L (SP)+,A0-A2 ,SMI CTSFlag(A2) ; ,RTE ; restore interrupt state and return ;________________________________________________________________________ ; ; Routine: Close routines ; ; Arguments: A1 (input) -- DCE pointer for this driver ; ; Function: These are the Close routines for the SCC async-mode drivers; ; the SCC channel is reset and configured for only external/status ; DCD interrupts and interrupt vectors are replaced with ; the default RTE vector. Input drivers simply RTS. ; ; The master interrupt enable register should not have to be ; written with $0A again since only the channel is reset (not ; the entire SCC). ; ; Modification History: ; 10-Apr-83 LAK AOutClose zeroes PollProc vector (change for disk polling). ;________________________________________________________________________ ResetData .BYTE 9,$FF ; reset SCC channel ,.BYTE $08,15 ; only DCD (mouse) ext/sts interrupts ,.BYTE $10,0 ; reset ext/status twice ,.BYTE $10,0 ,.BYTE $01,1 ; only external/status interrupts ,.BYTE $0A,9 ; enable interrupts, status in low bits ResetLth .EQU *-ResetData AOutClose CLR.L PollProc ; no more poll-data process routine ,LEA Lvl2DT+16,A4 ; get dispatch table address ,LEA ExtStsDT+8,A5 ; and secondary dispatch table ,MOVE.L PortAVars,A2 ; local variables address ,BRA.S ABClose BOutClose LEA Lvl2DT,A4 ; get dispatch table address ,LEA ExtStsDT,A5 ; and secondary dispatch table ,MOVE.L PortBVars,A2 ; local variables address ABClose ; should have a wait here for last character to clear the buffer ,; except that close is not really used in the normal course of ,; operation . . . ,LEA ResetData,A3 ,MOVEQ #ResetLth,D1 ,BSR.S InitSCC1 ,LEA BInClose,A3 ,MOVE.L A3,(A4) ; and reinstall default interrupt ,MOVE.L A3,(A5) ; receivers (just RTS) ,ADDQ.L #8,A4 ,MOVE.L A3,(A4)+ ,MOVE.L A3,(A4) ,MOVE.L DCtlStorage(A1),A0 ; get storage handle ,_DisposHandle ; get rid of it ,CLR.L DCtlStorage(A1) ; without a trace ,CLR.L (A2) AInClose BInClose RTS ;________________________________________________________________________ ; ; Routine: Status routines ; ; Arguments: A0 (input) -- pointer to Status parameter block: ; (0) Header ; (12) Completion routine ; (16) IOResult code ; (24) RefNum ; (26) Opcode ; (28) Parameters ; A1 (input) -- DCE pointer for this driver ; ; Function: For operation code 8, 3 words of status information are ; returned: ; (28) cumulative errors: ; bit 0 = soft overrun (local buffer overflow) ; bit 4 = parity error ; bit 5 = hard overrun error ; bit 6 = framing error ; (29) 80 = input flow shut off ; (30) read command pending flag ; (31) write command pending flag ; (32) XOFF flag ; (33) CTS flag ; ; For operation code 2, 1 longword of status information is ; returned: ; (28) buffered bytes available ; ; Other opcodes are not implemented. ; ; Modification History: ; 10 Apr 83 LAK Switched CTS and XOFF flag locations. ; 21 Apr 83 LAK Changed opcode number 1 to number 8; reports error for ; other opcodes. ; 26 Apr 83 LAK Opcode 2 is now used to return available buffer bytes. ;________________________________________________________________________ AStatus MOVE.L PortAVars,A2 ; local variables address ,BRA.S Status BStatus MOVE.L PortBVars,A2 ; local variables address Status LEA CSCode(A0),A0 ; get pointer to return parameters ,MOVEQ #StatusErr,D0 ; assume unimplemented code error ,MOVEQ #2,D1 ,SUB.W (A0)+,D1 ; opcode 2? ,BNE.S @1 ; br if not ; opcode 2 is a standard system code used to return a longword count of ; available bytes in the driver buffer (if any) ,BSR GetBufRegs ,BSR GetBufCnt ,CLR.W (A0)+ ; high word is zero . . . ,MOVE.W D0,(A0) ; load bytes-in-buffer parameter ,BRA.S @2 ; exit with 0 result code @1 ADDQ.W #6,D1 ; opcode 8? ,BNE.S StsExit ; exit with error if not ,MOVE.W AsyncErr(A2),(A0)+ ; get errors, flow off flag ,CLR.B AsyncErr(A2) ; and reset indicators ,MOVE.L ReadCmd(A2),(A0)+ ; read, write, CTS, XOFF flags @2 MOVEQ #0,D0 ; set zero error code StsExit toIODone MOVE.L JIODone,-(SP) ; go to IODone (A1 must point ,RTS ; to the DCE and D0 = IOResult) ,.WORD 0 ; no menu ,.WORD AOutOpen-AsyncAOut ; Initialization routine ,.WORD AOutPrime-AsyncAOut ; output Prime routine ,.WORD AControl-AsyncAOut ; shared Control routine ,.WORD AStatus-AsyncAOut ; shared Status routine ,.WORD AOutClose-AsyncAOut ; Close routine ,.BYTE 5 ; channel A output driver ,.ASCII '.AOut' AsyncBIn ,.WORD $4D00 ; read, control, status, lock ,.WORD 0,0 ; not an ornament ,.WORD 0 ; no menu ,.WORD BInOpen-AsyncBIn ; Initialization routine ,.WORD BInPrime-AsyncBIn ; input Prime routine ,.WORD BControl-AsyncBIn ; shared Control routine ,.WORD BStatus-AsyncBIn ; shared Status routine ,.WORD BInClose-AsyncBIn ; Close routine ,.BYTE 4 ; channel B input driver ,.ASCII '.BIn ' AsyncBOut ,.WORD $4E00 ; wr, ctl, sts, lock ,.WORD 0,0 ; not an ornament ,.WORD 0 ; no menu ,.WORD BOutOpen-AsyncBOut ; Initialization routine ,.WORD BOutPrime-AsyncBOut ; output Prime routine ,.WORD BControl-AsyncBOut ; shared Control routine ,.WORD BStatus-AsyncBOut ; shared Status routine ,.WORD BOutClose-AsyncBOut ; Close routine ,.BYTE 5 ; channel B output driver ,.ASCII '.BOut' ;________________________________________________________________________ ; ; Routine: Open routines ; ; Arguments: A1 (input) -- DCE pointer for this driver ; ; Function: These are the Open routines for the SCC async-mode drivers; ; local variables are initialized, buffer storage allocated, ; interrupt vectors installed, and the SCC initialized. For ; input drivers only the Device Control Entry pointer is noted: ; SCC initialization is done for output drivers only. ; ; An 'Open' of the RefNum associated with an output port will install ; interrupt receivers and enable interrupts for both input and ; output; two 'Open's need to be done for a port to configure input ; and output DCEs; the Open for the input driver can be done ; before or after the Open for the output driver. ; ; Channel A is treated special: the wait/req pin (chan A and B pins ; are tied together) is programmed so that it is an output which ; goes low whenever channel A has input data available. This ; output can be read via the 6522 and is used by the disk driver ; to poll for data during disk routines. If any data is accumulated, ; it is passed to the special "poll-process" routine of this ; driver. ;________________________________________________________________________ AInOpen MOVE.L A1,AInDCE ; note the DCE pointer ,RTS ; and exit BInOpen MOVE.L A1,BInDCE ; note the DCE pointer ,RTS ; and exit AOutOpen MOVEQ #8,D0 ; get secondary dispatch table offset ,LEA PortAVars,A2 ; local variables address ,LEA TAIntHnd,A3 ; get addresses of our interrupt ,LEA ExtAIntHnd,A4 ; routines ,LEA RAIntHnd,A5 ,LEA SCAIntHnd,A6 ,MOVEQ #2,D1 ; SCC read/write offsets ,MOVEQ #-9,D2 ; WR1 value ($F7) - w/req = char in ,MOVEQ #-128,D3 ; reset channel A ($80) ,MOVE.W SPPortA,D4 ,BSR.S OpenInstall ,PEA PollDtaIn ,MOVE.L (SP)+,PollProc ; this proc handles disk poll data ,RTS BOutOpen MOVEQ #0,D0 ; get secondary dispatch table offset ,LEA PortBVars,A2 ; local variables address ,LEA TBIntHnd,A3 ; get addresses of our interrupt ,LEA ExtBIntHnd,A4 ; routines ,LEA RBIntHnd,A5 ,LEA SCBIntHnd,A6 ,MOVEQ #0,D1 ; SCC read/write offset ,MOVEQ #$17,D2 ; WR1 value - w/req pin = float ,MOVEQ #64,D3 ; reset channel B ($40) ,MOVE.W SPPortB,D4 ; D0 = ExtIntDT offset A0 = open parameter block ptr (not used) ; D1 = SCC read/write offset A1 = DCE address ; D2 = WR1 value A2 = local variables pointer location ; D3 = channel reset data A3 = transmitter interrupt handler ; D4 = clk param init values A4 = External/Status interrupt handler ; A5 = receiver interrupt handler ; A6 = special-receiver condition rupt handler OpenInstall LEA ExtStsDT,A0 ; install secondary and primary ,MOVE.L A4,0(A0,D0) ; interrupt handlers ,LEA Lvl2DT,A0 ; get dispatch table address ,ADD D0,D0 ; offset is 2x smaller table offset ,MOVE.L A3,0(A0,D0) ,MOVEM.L A5-A6,8(A0,D0) ,MOVEQ #LclVarSize,D0 ,_NewHandle ,SYS,CLEAR ; get local storage on system heap H; clear errors, error options H; read, write, XOFF and CTS flags H; index, outdex, inSWHS H; HWHS, SWHS, XONChar, XOFFChar ,BSET #Lock,(A0) ; lock it down ,MOVE.L A0,DCtlStorage(A1) ; save handle in our storage pointer ,MOVE.L (A0),(A2) ; save pointer in lo-mem ,MOVE.L (A0),A2 ; and get the pointer ,MOVE.L A2,A3 ; locals pointer ,MOVE.L A1,(A3)+ ; output DCE pointer ,MOVE.W D1,(A3)+ ; SCC channel address offset ,BSR InstllLBuf ; install our local buffer ,ST HWHS(A2) ; HWHS defaults on ,ST Options(A2) ; abort input on errors also defaults on ,MOVE.B D3,SCCReset(A2) ; channel reset data ,MOVE.B D2,WReqPin(A2) ; WR1 value for SCC initialization ToInitSCC ,MOVE.W D4,lastSetup(A2) ; remember this config ,LEA StopBits(A2),A3 ,LEA InitDefs,A4 ; process clock data ,MOVEQ #7,D0 ; expand into 8 bytes variable data @1 MOVE.B (A4)+,D1 ; rotate left count ,MOVE.W D4,D3 ; clock pram data ,ROL.W D1,D3 ; get appropriate bits into low byte ,AND.B (A4)+,D3 ; only keep relevant bits ,OR.B (A4)+,D3 ; add in constant bits ,MOVE.B D3,(A3)+ ; store processed data ,DBRA D0,@1 ; do all 8 bytes ,MOVEQ #$64,D1 ; get WR1A mask ,AND.B (A3),D1 ; form value ,MOVE.B D1,WR1AVal(A2) ; and store ,BSR.S InitSCC ; initialize SCC channel ,MOVEQ #0,D0 ; no errors ,RTS ;___________________________________________________________; ; ; ; D4 = [V][V][W][W][X][X][Y][Y] [Z][Z][Z][Z][Z][Z][Z][Z] ; ; ; ; VV = 1,2,3, for 1,1.5,2 stop bits (00 for AppleBus) ; ; WW = 0,1,2,3 for no,odd,no,even parity ; ; XX = 0,1,2,3, for 5,7,6,8 data bits ; ; YY = high byte of baud rate constant, low 2 bits ; ; ZZZZZZZZ = low byte of baud rate constant ; ;___________________________________________________________; InitDefs .BYTE 4,$0F,$40 ; (WR4) rotate left 4, leave 4 low bits, add $40 ,.BYTE 0,$00,$00 ; (WR4) (dummy entry - WR1AVal will go here) ,.BYTE 12,$C0,$00 ; (WR3) WR3 - first write ,.BYTE 11,$60,$02 ; (WR5) WR5 - first write ,.BYTE 0,$FF,$00 ; (WR12) baud constant, low byte ,.BYTE 8,$03,$00 ; (WR13) baud constant, hi byte ,.BYTE 12,$C0,$01 ; (WR3) WR3 - final value ,.BYTE 11,$60,$0A ; (WR5) WR5 - final value ;________________________________________________________________________ ; ; Routine: SCC Initialize Routine ; ; Arguments: A2 (input) -- pointer to local variables for this port ; ; Function: This routine initializes one port of the SCC for asynchronous ; communication; the baud rate, data bits, stop bits, and parity ; options are set according to local variable values. The channel ; is reset before options are configured. The baud-rate generator ; output is used for both transmitter and receiver clocks, and ; interrupts are enabled: only DCD and Break external ; interrupts are enabled; all tare closely associated: ; control and status routines are the same for input and output ; drivers; the open, close and prime routines differ. The reason for using two ; device control blocks for one port is simply to support the general full-duplex ; communication capability of the SCC. ; ; Both ports must be opened for full duplex operation. ; ; Note that any accesses to the SCC have to be done in an interrupt-disabled ; environment. ; ; Currently, hardware (CTS) and XON/XOFF output flow control are supported; ; XON/XOFF input flow control is also supported. The driver defaults at ; initialization to hardware handshake only; XON/XOFF handshaking must be ; enabled by a control call. ; ; Break always terminates current input requests, but not output requests. ; Parity errors, overruns, and framing errors optionally terminate input requests. ; An IODrvrEvent is optionally posted at break and/or hardware handshake status ; changes (use of this option is discouraged due to the long time interrupts ; are disabled when posting such an event). ; ; MODIFICATION HISTORY: ; ; 20 Sep 82 LAK fixed output a-port bug (no SCC address adjust) and input ; glitch. ; 25 Sep 82 LAK fixed software, hardware handshakes; hardware handshake now ; defaults on. ; 29 Sep 82 LAK output prime routine now checks for TBE before sending first ; character to the SCC. ; 07 Nov 82 LAK BPL->BNE in SCC init routine; removed SCCAWr5,SCCBWr5 setup ; (not needed for 512 machine); open now preserves interrupt ; state. ; 31 Oct 82 AJH changed headers for new driver model ; 01 Nov 82 AJH made OPEN/CLOSE lock/unlock the driver's storage ; 15 Dec 82 AJH changed the header format again ; 20 Jan 83 LAK changed for new i/O parameter formats. ; 09 Mar 83 LAK fixed problem with lowering interrupt level. ; 07 Apr 83 LAK integrated with disk polling of port A. Uses clock ram ; data to set default options. ; 21 Apr 83 LAK changed control, status call numbers from 1-n to 8-n; config ; control call now takes compressed data like stored in clk ; parameter ram; changed driver names to .AIn,.AOut,.BIn,.BOut ; 26 Apr 83 LAK status call 2 now is used to return bytes available. ; 28 Apr 83 LAK added some delays when accessing SCC (to maintain 2usec ; between each access) ; 07 Jun 83 LAK added set and clear break control codes. ; 10 Jun 83 LAK fixed SCIntHnd to read RR1 before reading data; no longer ; resets error condition (not needed in the mode we use). ; 09 Aug 83 LAK driver now allocates its own memory at open time and ; disposes it at close time. ; 14 Aug 83 LAK now calls IODone, Fetch, and Stash via vectors; SCC ; initialization is done according to Zilog spec. ; CTS and break change status optionally posted as ; events. ; 17 Aug 83 LAK added XON/XOFF input flow control. ; 23 Aug 83 LAK fixed a switcheroo in status call. ; 26 Aug 83 LAK added lastSetup var: if control call tries resetting baud ; rate, etc., to same value, it's just ignored (avoids ; resetting the SCC and glitching the line). Also zero ; D0 for immediate returns from prime routines (be clean). ; 28 Aug 83 LAK status call 2 now zeroes high word of byte count. ; 04 Sep 83 LAK special condition receiver now issues error reset command ; in case it has too (documentation may be wrong and it can't ; hurt . . .). ; 10 Sep 83 LAK fixed bug in outgoing XOn/XOff code (Move.B to A0 changed ; to D0). ;------------------------------post ship fixes . . . ; ; 19 Oct 83 LAK fixed two bugs in XOn/XOff input flow control. ; 08 Dec 83 LAK reset ext/sts ints, not CRC checker in init, close routines. ; 25 Jan 84 LAK,MPH Improve reset code in close routines to keep mouse happy. ;_______________________________________________________________________ ,.NoList ,.INCLUDE tlasm:SysEqu.Text ; general system equates ,.INCLUDE tlasm:SysErr.Text ,.INCLUDE tlasm:SysMacs.Text ,.List ,.PROC Async,0 ,.DEF AsyncAIn,AsyncAOut,AsyncBIn,AsyncBOut PortAVars .EQU SerialVars ; serial port A variables and buffer AInDCE .EQU PortAVars+4 ; Device Control Entry ptr for input PortBVars .EQU AInDCE+4 ; serial port B variables and buffer BInDCE .EQU PortBVars+4 ; Device Control Entry ptr for input ; next come variable offsets within the user's local variable buffer OutDCE .EQU 0 ;(4) long DCE pointer for output driver SCCOffset .EQU 4 ;(2) word of SCC offset . . . InBufPtr .EQU 6 ;(4) pointer to local input buffer BufSize .EQU 10 ;(2) size of local input buffer BufLow .EQU 12 ;(2) low buf byte count to send XOn BufHigh .EQU 14 ;(2) bytes from end of buffer to send XOff SWHS .EQU 16 ;(1) software handshake enable HWHS .EQU 17 ;(1) hardware handshake enable XONChar .EQU 18 ;(1) input char which stops output (SWHS) XOFFChar .EQU 19 ;(1) input char which continues output Options .EQU 20 ;(1) bit 4 = abort on parity error H; bit 5 = abort on overrun H; bit 6 = abort on framing error PostOptions .EQU 21 ;(1) bit 7=1 enables posting break changes H; bit 5=1 enables posting handshake changes InSWHS .EQU 22 ;(1) input XOn/XOff flow control enable SendXOnff .EQU 23 ;(1) flag to xmit logic to send XOn/XOff AsyncErr .EQU 24 ;(1) error indications (cumulative) SoftOR .EQU 0 ; bit 0 = soft overrun H; bit 4 = parity error H; bit 5 = overrun error H; bit 6 = framing error FlowOff .EQU 25 ;(1) 80 = input flow shut off ReadCmd .EQU 26 ;(1) FF = read command pending WriteCmd .EQU 27 ;(1) FF = write command pending CTSFlag .EQU 28 ;(1) FF = CTS asserted XOFFlag .EQU 29 ;(1) FF = XOFF pending Free1 .EQU 30 ;(1) Free2 .EQU 31 ;(1) SCCReset .EQU 32 ;(1) WR9 value for reset StopBits .EQU 33 ;(1) stop bits/parity option (WR4 value) WR1AVal .EQU 34 ;(1) first WR1 value to write WR3AVal .EQU 35 ;(1) first WR3 value to write WR5AVal .EQU 36 ;(1) first WR5 value to write BaudLoCnst .EQU 37 ;(2) 2 byte baud rate constant (WR12-13) BaudHiCnst .EQU 38 RcvrBits .EQU 39 ;(1) 1 byte receiver bits/char (WR3 value) XmitBits .EQU 40 ;(1) 1 byte xmitter bits/char (WR5 value) WReqPin .EQU 41 ;(1) w/req pin state (WR1 value) lastSetup .EQU 42 ;(2) last SCC init values . . . BufIndex .EQU 44 ;(2) index into local buffer (insert) BufOutdex .EQU 46 ;(2) index into local buffer (remove) LocalBuf .EQU 48 ;(64) local buffer for input chars LclBufSize .EQU 64 ; default input buffer size = 64 bytes LclVarSize .EQU LocalBuf+LclBufSize ; output driver storage size AsyncAIn ,.WORD $4D00 ; read, control, status, lock ,.WORD 0,0 ; not an ornament ,.WORD 0 ; no menu ,.WORD AInOpen-AsyncAIn ; Initialization routine ,.WORD AInPrime-AsyncAIn ; input Prime routine ,.WORD AControl-AsyncAIn ; shared Control routine ,.WORD AStatus-AsyncAIn ; shared Status routine ,.WORD AInClose-AsyncAIn ; Close routine ,.BYTE 4 ; channel A input driver ,.ASCII '.AIn ' AsyncAOut ,.WORD $4E00 ; wr, ctl, sts, lock ,.WORD 0,0 ; not an ornament ; ( Tag buffers not supported in RAM disk } ; really here for looks, since none of the control calls make any sense for ; a RAM disk ;_______________________________________________________________________ diskControl MOVE.W CSCode(A0),D0 ; get the control code ,SUBQ.W #KillCode,D0 ; is it KillIO? ,BNE.S @0 ; branch if not ,; KillIO makes no sense for synchronous devices, but ,; shame on you if you do a synchronous disk driver! ,MOVE SR,-(SP) ; a big NOP for the ram disk ,RTE ; note special return for KillIO @0 SUBQ.W #,D0 ; is it Eject? ,BNE.S @1 ; if not, go to the err return ,MOVEQ #ControlErr,D0 ; don't know how to eject ram! ,BRA.S allDone @1 MOVE #ControlErr,D0 ,BRA.S allDone ,.END 5P:H r^   lPROGRAM ramStart; Uses {$U obj:HeapZone } HeapZone, %{$U obj:QuickDraw } QuickDraw, %{$U obj:GrafUtil } GrafUtil, %{$U obj:MacFMgr } Fonts, %{$U obj:MacEMgr } Events, %{$U obj:MacRMgr } Resources, %{$U obj:MacWMgr } Windows, %{$U obj:MacCMgr } Controls, %{$U obj:MacMMgr } Menus, %{$U obj:MacDskMgr } DeskMgr, %{$U obj:TextEdit } TextEdit, %{$U obj:MacDMgr } Dialogs, %{$U obj:MacSMgr } ScrapMgr, %{$U MacIO } MacIO; VAR $code: INTEGER; $myHandle: handle; PROCEDURE chgDriveQueue(refNum : INTEGER); EXTERNAL; BEGIN { Main } "code := OpenDriver('.ramdisk'); { open the driver } "myHandle := getResource('DRVR',10); { get handle to it } "detachResource(myHandle); { detach it } "chgDriveQueue(code); { install it in the drive queue } END. 3. "6F^5D!$ǐ^* ramstart resource definition file * * NOTE that fixSp and ramdisk are just along for the ride here! They should * be moved to SYSTEM with RMover. ramstart.Rsrc * definition for the application code: Type CODE %ramstart,0 * definitition for the ramdisk driver: Type DRVR #ramdisk/.ramdisk,10(64) * definition for the fixsp code: Type INIT = PACK %fixsp,3 3. "6F^5D!$ǐ^QQ,.INCLUDE tlasm:SysEqu.Text ,.INCLUDE tlasm:SysMacs.Text ,.PROC stuffBoot ; set boot drive to ram disk (Drive 3) G; also sets default drive to be drive3 ,MOVE.W #$3,BootDrive ; this low memory location is boot drive ,LEA parmBlock,A0 ; point to the param block ,MOVE.W #3,IODrvNum(A0) ; drive 3 to be default ,CLR.L IOVnPtr(A0) ,_SetVol ,RTS parmBlock .BLOCK IOQElSize,0 ; For setVol call ,.END 5P:H r^E=TQTQ>ͱ; File: Async.Text ;_______________________________________________________________________ ; ; MacIntosh Operating System: SCC Async Driver ; ; written by Larry Kenyon 05-Aug-82 ; ; Copyright (c) 1982, 1983 by Apple Computer ; ; This is a ROM-based driver for the SCC serial ports; it supports full duplex ; asynchronous mode RS-232/RS-422 communication on both SCC ports. ; ; This driver uses four device control blocks: two per port, one input and ; one output. The input and output "drivers" 5D!$ǐ^   * ramstart resource definition file * * ramstart.Rsrc Type CODE %ramstart,0 Type DRVR #ramdisk/.ramdisk,10(64) Type INIT = PACK %fixsp,3 Od5P:H r^; ___________________________________________________ ; ; MacIntosh RAM Disk Driver ; (c) Apple Computer 1983 ; ; This is the unofficial Mac ramdisk driver. Most useful on 512K Macs ; Written in Dec '83 my MDB ; ; Routines: ; ; Open -- Zero the ram and create a directory ; ; Prime -- read and write calls. Get correct info from read or write parameter ; block, and get or put the bytes. All calls are synchronous, since ; ram doesn't have a lot of latency. ; ; Close -- Not closable at present associated files: ; Ramstart -- loads drvr and initalizes ; chgq - assembly support for ramstart ; fixsp -- assembly support for setting stack pointer in 512K mchines ; ; changeres - closes system resource and reopens on ramdisk ; ;_______________________________________________________________________ ,.NOLIST ,.INCLUDE tlasm:SysEqu.Text ,.INCLUDE tlasm:SysErr.Text ,.INCLUDE tlasm:SysMacs.Text ,.LIST ,.PROC rDiskDrvr,0 ; driver header: RamDrvr ,.WORD $4F00 ; Ram-based,read,write,Ctrl,Status ,.WORD 0,0 ; no delay or EMask ,.WORD 0 ; no menu ; Entry point offset table ,.WORD DiskOpen-RamDrvr ; open ,.WORD DiskPrime-RamDrvr ; prime ,.WORD allDone-RamDrvr ; just RTS for the rest ,.WORD allDone-RamDrvr ,.WORD allDone-RamDrvr ,.BYTE 9 ,.ASCII '.Ramdisk1' ; misc equates: $; myramBase .equ $00011000 $; myramSize .equ $2000 ; 4k for small Mac myramBase .equ $28000 myramSize .equ $50000 ; small Mac version assumes bufptr set to $11000 ; large Mac version assumes bufptr set to $28000 ; RamDisk Initialization routine ;_______________________________________________________________________ ; ; Routine: DiskOpen ; Arguments: A0 (input) -- pointer to open parameter block: ; A1 (input) -- DCE entry ptr for this driver ; D0 (output) -- result code ; Register use: A3 = pointer into cache DiskOpen MOVEM.L A0-A6/D0-D7,-(SP) 0; currently hardwired to top 320K or so of a 512K mac 0; or 4K for 128K Mac 0; zero the ram space: 0MOVE.L #myRamSize/4,D0 ; # longs in ram space 0SUBQ #1,D0 ; for DBRA 0MOVEQ #0,D1 0MOVE.L #myramBase,A3 ; A3 points to ram space zeros MOVE.L D1,(A3)+ ; zero mem 0DBRA D0,zeros 1; now put fake directory in ram space: 0LEA myDir,A0 ; directory data (source) 0MOVE.L #myramBase+1024,A1 ; base of disk + boot block space 0MOVE.L #63,D0 ; 63 bytes is dir size 0_blockMove ; move the directory 0MOVEM.L (SP)+,A0-A6/D0-D7 ; restore regs 0MOVEQ #0,D0 ; optimistic completion code DiskRts RTS ; RamDisk Prime routine ;_______________________________________________________________________ ; ; ; Arguments: A0 (input) -- pointer to request parameter block ; A1 (input) -- pointer to disk DCE; ; ; Register use: A3 -- position pointer in ramDisk ; A4 -- points to the buffer DiskPrime MOVEM.L A0-A4/D3-D7,-(SP) ; be conservative with regs ,MOVE.L #myRamBase,A3 ; A3 points to base of ram disk ,;pretend we're a block device: ,MOVE.L DCtlPosition(A1),D0 ; current byte position ,ANDI.L #$FFFFFE00,D0 ; truncate to make multiple of 512 ,; transform to an address in RAM Disk by adding offset to base ,ADD.L D0,A3 ,MOVE.L IOBuffer(A0),A4 ; get ptr to buffer ,; now do read or write in one big gulp: ,MOVE.L IOByteCount(A0),D0 ; num bytes to transfer ,MOVE.L D0,IONumDone(A0) ; show all done ,ADD.L #511,D0 ; round up to multiple of 512 ,ANDI.L #$FFFFFE00,D0 ; by adding and truncating ,CMPI.B #AWrCmd,IOTrap+1(A0) ; is IOTrap a write? ,BNE.S aRead aWrite MOVE.L A4,A0 ; buffer is source ,MOVE.L A3,A1 ; ramDisk is dest ,BRA.S moveBits aRead MOVE.L A3,A0 ; assume read. ramDisk is source ,MOVE.L A4,A1 ; buffer is dest MoveBits _blockMove ; move the bytes ,MOVEM.L (SP)+,A0-A4/D3-D7 ; restore regs ,MOVEQ #0,D0 ; good completion code (can't fail) allDone MOVE.L JIODone,-(SP) ; push addr of IODone ,RTS ; and jump through it ; master block data: currently hardwired myDir .BYTE $D2,$D7 ; mac password ,.LONG 0 ; creation date & time ,.LONG 0 ; last backup ,.WORD 0 ; attributes (Write OK) ,.WORD 0 ; # files in dir ,.WORD 4 ; 1st file directory block ,.WORD 4 ; # directory blocks ,.WORD myRamSize/2048 - 2 ; # allcation blocks ,.LONG 2048 ; bytes/allocation block (long) ,.LONG 16384 ; bytes/allocation clump ,.WORD 8 ; 1st data block ,.LONG 1 ; next avail file # -- longint ,.WORD myRamSize/2048-2 ; # alloc blocks free hardwired for now ,.BYTE 7 ; string length ,.ASCII 'RamDisk' ; volume name ,.WORD 20 ; round out the master block ;_______________________________________________________________________ ; ; Routine: DiskControl ; Arguments: A0 (input) -- pointer to control call parameter block: ; CSCode = 1 for KillIO ; 7 for Eject ; 8 for setting tag buffer ; "fNV O1|>a N^`aLNu1h>!|$B.1|,G!K AB0NuNV,_$_ _H< aLNN^Nu%W_LN NV,_$_4 _`p NvSBnNlNN^Nu%W_C NV,_$_2"_ _BBBop NBSAf`N6SBjNN^Nu%W_STR NV,_$_24"_ _Bo p N SAfNSBnNN^Nu%W_PAOC NV,_$_2  _HBB,lD&(BDHD *: HD&6HEE0?RBJfJlRB?<-6Bo p NSCn0NSBnLxNN^Nu%W_I NV,_$_4gHz"`Hz?/ NN^Nu%W_B FALSETRUENV,_"_ _p / N,NuN^Nu%W_PAGE H@ f"NV Op(10g(N^ g0a`(1h>!|$B.Bh,C@!I AZ0LNuNV,_H o N@ o/H LTNuN^Nu%R_C NV,_$_ _H g a^ f`!|$B.0< H<1@,E@!J BBh Bf!|.1|,DA0NuN^Nu%_RESET NV,_$_2 _/ 1h>AX0NuN^Nu%_CLOSE NV,_H o1h>B.Bh(1|,B Bh!|$E@!J 2((A0JAgB/`|/oLTNuN^Nu%_EOF NV,_H o1h>B.Bh(1|,B Bh!|$E@!J $h A0  gB/`|/oLTNuN^Nu%_EOLN NV,_0<`N^Nu%_BLKRD NV,_B@$_BB24"_ _JAlBA1h>!A.1|,!B$!I J@g`2((A0Bg>NN^Nu%_BLKWR NV,_0<`N^Nu%_UREAD NV,_BBB$_246"_.$@0<0B. @g!|@.1|ը.1|,!C$!I g`4((Ah0$_Bg>NNN^Nu%_UWRIT NV,_$_?:>/ NuN^Nu%_IORES NV,_$_0/ NuN^Nu%_UCLR NV,_NuN^Nu%_UBUSY NV,_`N^Nu%_GET NV,_$_"NN^Nu%_PUT NV,_/ o/P _NuN^Nu%_UPARR NV,_$_0"NN^Nu%_SEEK BNuNu _N]NNV,_$_024/ NuN^Nu%_RCHCK NV,_$_ NN^Nu%_SRCHK :CODE:ICONRDITL^ALRTDLOGCNTLMENU 4$3$$?$$&&$$)Jm<3. "6F^5D!$ǐ^  0.INCLUDE tlasm:SYSEQU.TEXT 0.INCLUDE tlasm:SYSMACS.TEXT /.PROC chgDriveQueue,1 myRefNum .EQU 4 ;offset to refNum on stack *MOVEQ #DQElLnth,D0 ; get size of drive queue element *_NewPtr,SYS ; and allocate one *MOVE.W #0,DQFSID(A0) ; zero means local file system *MOVEQ #3,D0 ; call it drive number 3 *SWAP D0 *MOVE.W myRefNum(SP),D0 ; get my renum from the stack *_AddDrive *LEA Mparams,A0 ; point to params *_MountVol ; mount as a volume *MOVE.L (SP)+,A0 ; get rtn addr *ADDQ #2,SP ; strip arg *JMP (A0) ; ack to the application Mparams .BLOCK 12,0 ; header *.WORD 0,0 ; completion routine (NIL) *.WORD 0 ; ioresult *.WORD 0,0 ; misc don't-cares *.WORD 3 ; drive num *.END 3. "6F^5D!$ǐ^..*.INCLUDE tlasm:SysEqu.Text ;____________________________________________________________________________ ; ; fixSp is installed in System resource as type INIT, and simply sets a low ; memory variable which determines where the loader sets top of stack ; ; not really of general interest, but the use of type INIT for installing your ; driver may be. ; ; ; *.PROC fixSP ; sets bufPtr to reserve space for Ram Disk *MOVE.L #$28000,BufPtr *RTS *.END 3. "6F^nBgHmN;_N͞NNBNNB-N NBg?N /2/P OB !@BhBh1A (@P _\O.N"_"@ O!ABhBh @N _0ɩ oa o0` o /a _PONH@rtvxz|CJnk0`(-DЀQaaaaa0 HSLNuYaYJFjJg |0NuHpprvg* +g -fvRSgrЀҀЁSfJgDLNu$"_ _BWpH@o"Bakaj-Hp`aa N^=Gp` _NV~aa@k&"O0S@kgQ/RGPQa gNaZ4"a ABSBk BoB N^`a:>8laUOa_G&.4ak aagag=B `aax4&Bak aag4ag`2aaN"PB&. akaa@kpH@ `"n ga/?aag\O`&a< na4 BPJ4 _a`aH1< `"Pakn*ffx Zf`p` T(a ~ Ja"T a JPHSEka8SjjPJ Jpހa TSP:ka anBx ``a1; `"Pak*fPJaQJp `|?x `NuHtJg "T") $pRaF"T0)@a5BLNuH T"( Jka T"Hia0JjaLNuԕH瀀 TШ !@ L$a@LNuHȠ.LNuH4*kJ T"H pRD"aaH8aC*JQkQlQPIfaLjLL5x NuPQRSUVXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~¬ìŬƬǬȬɬʬˬ̬ͬάϬЬѬҬӬԬլ֬ج٬ڬ۬ܬݬެ߬  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭,NNuNV/.?./. /; ONN^Nu"_.NN"_ _NtN"_.pNfN"_.pNXN"_ L" _ . ANBN"_ M.N4NѠ/@N(Nu"_" _ . ANN"_ x.pNN"_ _KNN"_ _-NNѠ@NNu"_ .NN"_ _NN"_ _!.NN"_  _ NN"_ _H.NN"_ ".NN"_ _#NN"_ _%.NxN"_  _$NjN"_ _&.N\N"_ _(.NNN"_ _+NBN"_  _'N4N"_ _)N(N"_ _*NN"_ _INN"_ _JNN/ CH"C>""_Nu"_.2N"_..N" "_ _. ANОBBo ONu"_ 0_/ /Nu"_ / 2Nu"_1DN <2Nu/xjNu0/ o= _\ON oBo /HBoBoB Of0/ ?@.Nup`0/?@ O _TON _ /:Nu _NUNNV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_BHA0"H2@l02H`4 aS@j3 o#/IL._NuN^Nu%_INTER NV,_HA$0BP2I4RB6K"O$O8<4SDf JBZSBf0BB@0LNuN^Nu%_SING NV,_BHA 0"H26@l6K`4 aSCjAgm @H3 S@n`3 o#/IL._NuN^Nu%_UNION NV,_BHA 0"H26@l6K`4 FBaSCjAn3 o#/IL._NuN^Nu%_DIFF NV,_BHA 0"H26@l6K`Fa4 QSCjAo @H3 S@n3 o#/IL._NuN^Nu%_RDIFF NV,_H2/$0/&B$A(J@jB@@mH4J6Kg"O$O8<4SDfBZSBfTC?C$46JJDBCBDĉp R@@lLNu o /H"LJ_NuN^Nu%_RANGE NV,_H0/2/A"o@lB`TAk`! /HL._NuN^Nu%_ADJ NV,_BHv`N^Nu%_SETNE NV,_BHBCA$0"H2$I4@l4’J`Hf*SBj@gkIJafSAn`AJ`fRAk CB" o %/JL._NuN^Nu%_SETEQ NV,_BHC$2 I0$H`(N^Nu%_SETGE NV,_BHA$0"H2$I4@l4J`6 FCafSBj@gk IJaf SAjNqv`BCB" o %/JL._NuN^Nu%_SETLE Hertzfeld during the last two weeks of Sept 19832This nifty resource editing utility was written byVersion 1.5 -- 22-Oct-83Resource Editing Utility JoNVN^ _\ONSCROLLUJoNVN^ _\ONSCROLLDJoNVN^ _\ONPAGEUP JoNVN^ _\ONPAGEDOWJoNVH,. nfr F P(h/ N1AC 0.|=@Bg/N2>JGo>/ S@?N2BN1&_HnBg?</ N1/ N0/ N"HlN0/ N1bLN^ _\ONSCROLUPJoNVH,. nfz F P(h/ N0hAC 0.|=@Bg/N2 >Bg/N2_l>/ R@?N1BN0&_HnBg?/ |?N1 T/(NLN^ _\ONPAGEUP JoNVH(n nf"Bg/ N1:>/ |?N10 T/(NLN^ _\ONPAGEDOWJoNVH/-N/20.H<Bg/-N0>FB?N(_ T( " V n ]gNJgHmN/@ m PB( @;@0-|;@Bm;|HmN/+L m P|HnN0~BgN0z g\LN^.NuELECTTHJoNVH&n S,( g" SB( S(h g TB( T(P` S&P`BG`" F PO0pg?N F POB0pRG GoLN^.NuLEARSELJoNVHB(. D*( E P(h&L D-hBg/.N/0._> E Phm`>JGo6 Tho T hS@> T(P&L` T,(SGJGo F P,SG`&F`-KLN^ _\ONINDOBJEJoNVH>. B/. ?NH(_ f`R T(.f`DJG\ G]g n PO0p  n POp?N T(  T@LN^ _ NELECTONJoNVB.-n n+hBg/-N.nJ_o$/-?<Nn/./. Bg.N,|N^ _ NUTOUP JoNVB.-n n+hBg/-N. Bg/-N.0_^ n PH瀀Bg/-N-2L4(A B^g&/-?<Nv/./. ?<.N|N^ _ NUTODOWNJoNVH&n / N+-K n(h TJhf`P T-h0-H@ g/.N 0.H><:B/ ?Nn-_Jg n P( `x/ / ?NHnN-0.H=@ n lno0JFfBg/ / N:gRERG`/ / S@?NSF`nl0 EfBg/ / NdgSFSG`/ / R@?NZRE`Jn]n\g/ / ?  N4RF`$n^n_g/ / ?  NSEBgN,F gLN^ _PONELECTREJoNVH.. ,.Bp/N-&_/.HnHnHnN&h(S)GB,)F 9nBg/.N& 9_B G P(B,B, G P!K.@J@o" S/BC?<N@/ N*  _!@ F P0(R@ F P1@ G P0(R@ G P1@LN^ _ NDDENTRYJoNVH.. Bp/N-&_ G P0(R@ G P1@(SB)nBl)G BB,-KLN^ _PONAKETYPEJoNVHB m P=hBgN8BgN2JDf`=D~`Hn?NB.Bg/.N:JEoj=E|`\B/.?N2(_ gFBg/ N$0nf6. g B/-/.N&_| S +K/-/ / N RFinoRGinon<NLN^NuUILDTYPJoNV/Bg/./-HnN);_0-@gS@g(S@g`hBg/./.A`PBg/./.A>/N)l>`8Bg/./.A@/N)T>` Bg/./.BN)@>NF`/.N.N^.NuILECLICJoNVH(n Bg/./ HnN);_0-@gS@g(S@g`lBg/./.AV/N(>`TBg/./.A/N(>``$Bg/./.BN(l>/ N` / /.NLN^ _PONESCLICKJoNVH+n m(hBg/./. HnN(> G frBg/./.BN'J_g^Bg/.N'J_f* T|/.?<N' THh n P?(&N`& T|/.BgN' THh n P?(&NLN^ _PONNFOCLICJoNVH(n &LBN&g/ N&`4f /.Nh`$ k lf / /.N$`g / /.NLN^ _PONOLDERCLJoNVHB n P(h g< T\C p Vf$ T&h g S0(nf-K`` S&P` T(P`LN^ _ NINDENTRJoNVH&n.. G P(h G P0(S@ G P1@ T\"S\p Vf S"G"Q#P` Tg T(P` S"T"/ N(8LN^ _PONEMOVETYJoNVH,. BgN T: n P(hB/ T/( n P?(N&_ g S(hBgNb F P?(N@B T/( n P?(NB(/N!<N0 T.( T0(S@ T1@ F P0(S@ F P1@f S"T#P` G Pg G P.` S"G"Q" TJf// N/ N'@?NLN^ _PONEMOVEFRJoNVH,. (.BgNR=_ D P.(//N G P h P?(N\B G P/( D P?(N^(_/ N'H/ HnHnHnNDBg/ N=_/ Nl F P?(N/ G P/( D P?(HzNHn?<N/ ?.N/ ?.A?<N9t/N / NH F P&hB V" g S\"G"Q\p Vfz` S&P`  g$B/ G P/(N&_ F P"S" F P!K// / N?.NJLN^ _PONDDTOFILJoNVH m P(h g$ T. T&h g S,/-/ Nd&F`(G`LN^NuEROTHESJoNVHNBN"*, F h lg`p F.( G P&h gJ Sh S( S(h g0 T-P T.(g/-/ N.g// N(n`&D`/-N.g/NzLN^ _TONUTORCOPJoNVHBN"2,* E h lg`R E.( G P(h g: Th T( T&h g S-P S.(g// N:&n`(D`/NLN^NuLEARIT JoNVHBN!,* E h lg`D E.( m P(h g T&h g// N S&P` T(P`/N G P?(NLN^NuASTEIT JoNVN^.NuNVOKEEDJoNVH+n m,( F P(h g, T( T&h g S (g/ N݊ S&P` T(P`LN^.NuPENINFOJoNVJng /-nN `bHn?<d?<d?<?<NBBHnHzN<?<p/<BN T+_n/-nN?<N:Rm+mn m1| lN^NuPENTWIN About RMoverJoNVHBN &_f`+K m h lf / N` m h lf / N`Jf`BgN m P.(/N"Bg G P?<N5P/HzNHg BFBgN`Bg G P?<N5(/NN</N"b<N~JFl`0 m(P9FBlN BNڔ* m P!E m P!mLN^NuPENIT SystemJoNVH&n g& S(h g T./ N!x(G` S,/ N!j&F`LN^.NuEALLOCTJoNVH,.BgN> F(h T*( E P?(N T(gPB T h P/( T?(N&_ T=hBg/ N@8 H@g Hn?<N"/ ?.N./.N( TB( TB(Sm?N$LN^.NuLOSEINFJoNVHBN (_ g, l lf&l S.( G P (f/ N (l`LN^.NuLOSEALLJoNVH(n+L m h lfV/ N m+h~/ Np m~ P/(N^ m~ P>(JGg?N`BgN m~ PB m~ PBh`Pf/-N&B-y/-?<N\`0 m h lf/ NH` m h lf/-nNBnSmLN^.NuLOSEIT JoNVH,./N&F(k k lf BG` TO0pg?NRG Go`&g (mBG g T(g?NRG T(P`LN^.NuOGGLESEJoNVHAC 0A?<N1/N A?<N1/NBgA?<N1/N;_BJmn??-vN xB?<Bp/N(_?N `/ ?<HnHnHnN/.A?<N//N/ ?<Bg?<'NBHnN/ ?<HnHnHnN/./.N/ N nWD@LN^ _PONETRESNAJoNVHBgN>?-vN B?<Bp/NN(_?N / ?<HnHnHnNP0. H/A/N ^/.A?<N//N*/ ?<Bg?<'NBHnN/ ?<HnHnHnN/.HnN/ NA?<N.//.N nWD@LN^ _\ONETIDNUMJoNVHBN&_B/ N(_BgN8 f`8 T*( T,( k lf/ NBg T?(HnN_ k lf/ N T0.hW. @fBgN b F P?(N @B E P/(?.NF.JgBg/N& F P0hf*<N n?-vN PBg?<BN=_?N :`B E P/( T?(N :./HnHnHnN&/?.A?<N+/NP TJg T/(A?<N+/N`" T/BC?<N+f/ N  _!@ F P?(N h/ NZ mjHhN?N<N LN^NuETTHENAJoNVBg/.N ;_Bg/.N;_ mWJmVgdBg0-R@?N" gN0-S@kF @n@H0;N"(8.4<N`BgN`N:`N` N`Nt mWJmVg@ mfN`2 mo*/-?-HmNBgA?<N*8/Nh;_ mWJmVgR0-S@gS@gS@gS@g8`|y/-?<Nb`|BgNPN^.NuOCOMMANN)NV,_NUnN)zB/<B@Nb+_AJ/NHmxHmvHmrNAj/NtN~?AzC 0BmB#"Select the new printer-driver fileSelect the file to printA@About the Printer Application ---------SystemPrint...PAbort printingInstall printer...Configure printer...Set default print format...QuitQF ConnectorPrinter ConnectorTerminal Connector\`GF DVOKcu Open copyCancelDVXcuPEjectPDrive3 }3|< 0^0 (@DDVOK <l Printer Application 12/22/83 (C) 1983 Apple Computer Inc. Written by Owen Densmore and Donn Denman.<n This program is used to print files that have been spooled to disk, or to set up the environment for printing in some other application.n The system menu contains "Print..." to print spooled files, "Abort Printing" to halt printing, "Install printer..." to change printers, "Configure printer..." to change screen printinghformat, "Set default print format..." to change typical paper size, and "Quit" to go back to the Finder. The Connector menu is used to tell the system which connector your printer is plugged into - Terminal or Printer connector.: ALRTRDITL^DLOGvMENUSTR ICN#FREFBNDLPSYSCODE O`  _` `8C$$  4erminal or Printer connector.ba:8@About RMover...--------------]EditCutCopyPasteClear-------Set IDSet Name?FileOpenClose Show ScrapQuit"  System Heap$ Purgable$4 Locked4D Pre-load DT  Protected@dX @dX P@ww P@wwTV fFOKVdfCancel Enter the new ID:( 8ܐVV fFOKVdfCancel Enter the new name:( 8ܐHFZPOK nZvThat ID already exists!@RJFZPOK nZvThat name already exists!@Rp??~>?ppp8 8 0 PaxN@3 >^?(` 2?<\\JoNV?<N6\NGN^ _TONEAPERROJoNVHnNE"/.NEN^NuHECKCURJoNVNFf-|DRVRB?<NG +_B?<NG+_B?<NG+_/-/.NFb m Pp/-BgNF/-BgNF/-BgNFNFN^NuETUPMENJoNVHn?<Hn?? |? |?NCvBBHnHzHnHn?<NJ:A?<NY/<Bgp/</-ND(_/ NB?<NB&L7| lAC 0.S@=@0.R@=@0.R@=@0.|=@B/ HnHzX<BgBg m P0(S@??<BND* m P hn /-?<NCRm-LLN^NuAKENEWT Resource File JoNVH&n S(g"BNCB(_ gf/ NC&(l`` S| S-hAC|p S@n0~`$ | n P2SACBA0pARG Go S0(H/A/N2HnHnHn?<NHA?<NX?<N>Rm|yN^NuAKESCRA The ScrapJoNV/ (mJn^" Vg Sn T(P`-L (_N^ _TONINDFILEJoNV0.@=@0.|=@Bn=|HnN>N^ _TONNVERTBAJoNVH/-N=BG=|=| (n n]" Vg?.?.N> T&h/ NA S?<NT/N=/ NA?<?.N= T/( A/N.A?<NTn/N= T/BN>  _W(g0.| H?N0.|=@ T(PRG`NLN^ _\ONRAWFENTJoNVH/-N= mHhN=\/-N>Bg/-N>>B?NV(_/ ?<NLN^NuRAWFILEJoNVH(n?,?N<~`" Z@ n P2SACBA0pAzRG Go?<N?< ?< N7N?:,N72HzN7" S0(H/A/N(?:N7A?<NM/N6?< ?<0N7?:N6HzN6?:N6 SJf HzN6` S h P?<NMt/N6?< ?<@N6?:vN6HzfN6?:\N6 n P?(N*B E P/( S?(N-(_ gB/ N: =@`Bn0.H/A/N'@A?<NL/N6 f` E P-hACp Vf&Hn?<?<\?<4?<|N6"Hn/ N7T`RACp Vf*?<?<dN5-L n P?<NLl/N5`AC\p Vf6Hn?<?<\?<0.ؐn8=|`=| G@o,B?<@?N3-_Bg/.?N:>Bg/.?N,8 n=@ n=@/.HnN4Z/ N.?.N'LN^.NuRAWIWINpPICTTEXTCURSMENUThis font is called FONTPAT STR ICONSize: NoneName: ID = Type  JoNV/.N2?<(?<N2?:N2?<N2HzN2?:N2?< N2?<d?<$N2HzN2?< N2?<?<@N2Hz`N2~?<?<PN2HzN2jN^.NuRAWTWIN5Andy H/HnN/-p?<RN`8pp[p0pn=|/-pA/HnN9|LN^NuURSRPT NVH(m|G lWJSW+@gPpp[p?p1p;p0pc=|/-pA/HnN9|LN^NuHATRPT NV/ (m|B,/-xBgN9|(_N^NuET52MODNV/ (m||/-x<N9|(_N^NuET100MONV/ (m|,gHlN B,?<NBHmLN(_N^NuETNORMVNV/ (m|, gHlN |?<NBHmDN(_N^NuETINVVINV m|-H n|N^NuPECIAL NVH(m|G0S@g W@g*S@g.S@g0S@g:S@gDS@gB@ g>`V/-x<N`H|`@NL`:,g|`,,g|```,  lWg|9|LN^NuETMODE NVH(m|G0S@g$S@g,U@g4S@g6S@g8S@g@S@gHS@gF@ gB`X/-xBgN`L,gN `@B,`:N``4,gB,`(,gB,```,  lWgB,9|LN^NuESETMODNV m|-Hpp/pZ=|/-pA/HnN n1|N^NuDENT52 NVH(m|Jlg/-|NG+g6G+g6Bg?,?<?<N"Bg?,0,R@??<N"g 9l9l?,?,?<?<PHlN?<?<N9|LN^NuETMARGINVH(m|0,42SAC@A200S@AGA-H nP nP nP7|7|P||9|LN^NuETNORMANVH(m|0,42SAC@A200S@AGA-H nPP@ nP nP~)`0S@AO  RG GPo7|pPH7@||9|LN^NuETTWOHINVH(m|0,42SAC@A200S@AGA-H nPP@ nPP nP~)`0S@AO  RG GPo7|pPH7@||9|LN^NuETTWOTONVH(m|0,42SAC@A200S@AGA-H nP nP nPP~)`0S@AO  RG GPo7|pPH7@||9|LN^NuETTWOWINVH(m|=l~`0S@A @AG+gBS0gS@g6W@g@S@gJU@gT`^-jV@;mjHAj @`6AjPP`(AjPP `AjPP@` AjPPRGinof9|LN^NuETATTRSNV/-x<N m|1|N^NuLTKPAD NV/-xBgN m|1|N^NuSTALTKPNV/ (m| lf9|&`9|(9|(_N^NuETSTDFONV/ (m| lf9|&`9|(9|(_N^NuETALTFONV m|-HAjPPN^NuO NV m|-HmjN^NuI NV m|1|N^NuBORT NV m|-H;|~N m|1|N^NuARDABORNVN^NuOP NV m|1|N^NuSCPOUNDNV m|1|N^NuSCLPARENV m|1|N^NuSCRPARECODEJMENUWINDCNTLDITLALRTFDLOGjFONTSERD L4000(0Nq/Q [[-7A]K-+7;AKKb f MacTerm MacTermAlt:( ?<NVH nCJ""(n HnN `0.n>0.n<Gl:`:BB??<NP?NV >BB??<N8?N> </ ??BgN HAC / NHnN HHnN >/.NLN^ _PONNVHnN/. N n HhN Jg/. n HhN /.NN^ _PONNV n CJ"" nCJ""HnNb/.NXHnHn nHhN DHnN/.N4N^ _ NNVBg?<BN =_N^NuNV m P-H nCA&""/-HmNjN^NuNV/-/-NN^NuNV/-HmHmN6 mCA""/-HmHmNN^NuNV-| D n0N^NuNVHI&| DJSf0-ذl]2,l_gN<;lBmBm`X0-ڰl]2,T_g N@;lBmHmBgBgBgBgNl`"0-ܰl ]2, l_g N;l NLN^NuNVH/-?<NB/-?<N4BgN,N:Bpx/N r&_ SI>A)H)n 9n nB,HmBgBgBgBgNBmBmBm/ BBBHmN B/-?<N/-?<NLN^ _PONNV/ =|P=|d-|PFILB?<Np(_/ N /./B?<A/BA/N/ N.g, n PCp S@n0 n 0 n|` B. nB(_N^ _ NNV/ nCJp@"S@nHn?.?.0.n?0. n?NBBHnHn<BgB<p/Nf(_/ <Nl/ N$?. ND?.NB-L(_N^ _NNVH/.N nCA""HnN8?<?<NHmNHnNAC: 0BD~ U@<z`??NHnNGRE EDJPVA-HBgHnHnHnNzg/.?..N`(N`"N`N`N `|JgN`0.S@gS@g `BgN`<NzBgNNN^.NuNV/~`8 @/B?N" + Gf /-/:4N @/5BgNhRG Go m PpNR.N^NuDRVRNVHINBg??@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭t?< _?/t` o Pp(Dr8 F8 F"< `"<`"<`"< p8 F`f"<p`\"< p`R"<`6"<`."<`&"< `"<`"<`"<`"<p`"<`"<pAPH(&_Y/|`6| `.| `&| `| `| `|`|0@g S@gS@g`|` |`B,0@g S@gS@g `|``B,0.@"gS@g ` |`B,0.@%gS@g `|`|/.NzLN^.NuLOG1CON` NVH(nB?<Bp/NJ&_~`"/ ?Hn0S@A @HvHnNbRG Go, g/.?<N` /.?<N,g/.?<N` /.?<N,g/.?<N` /.?<N l f/.?<N` /.?<N/ NRBHnN0.[@k @ nH0;NHHvv/. nWDH?N/. nWDH?N`/. nWDH?N/. n WDH?N`Z/. n WDH?N/. n WDH?N`,/. nWDH?N/. nWDH?N0.k|nA2IDA0 <f nf`Bg/.Nr _WD@ Bg/.Nr _WD@Bg/.Nr _WD@Bg/.Nr _f9| `9| / NzLN^.NuLOG2CONNV/ B?<KBp/NJ(_/ ?<HnHnHnNb/. nA ?<N/N/ ?<Bg?<N/ NRBHnN0.k|nAD2IDA0 <f nf/. nHh NZ/ Nz(_N^.NuLOG3CONXNVH&m|IzTTT;|P~;|||mmmmmm|`,0S@AO A 0S@AO A@1RF FPo~`< n0S@A CACp> S@n0S@A @A1RG GoLN^.NuNITLINENV/~`& n0S@AO S@HH@J@J@WDpRG GPo.N^.NuNITTABSNVHB/<N&_+K| gB?</ p/N,/NB?</NR'_HkNHk.` n O 2.CRGino.N^ _NTUFFENTNV/ (n A)HA)HA:)H A)HA)HA(A)H A)HA*)H4A)H(A)H$A)H,A)H0A)H8A)H?<>?<"/ /N?<#?<#?<&/ /N?<(?<(?<+/ /N?<)?<)?<,/ /N?<7?<7?<-/ /N?<8?<8?<./ /N?<D?<D?</ /N?<E?<E?< / /Nz?<H?<H?< / /Nf?<M?<M?</ /NR?<?<?<4/ /N> S PA(HBg?<Bg/ /N$?<?<?</ /N?< ?< ?</ /N?< ?< ?</ /N?< ?< ?<$/ /N?<?<?</ /N?<?<?<5/ /N?<?<?<5/ /N?<?<?<2/ /N?<?<?<3/ /Np?<0?<9?< / /N\?<;?<;?< / /NH?<??<??<#/ /N4?<l?<l?</ /N ?<J?<J?< / /N ?<K?<K?< / /N?<A?<D?</ /N?<H?<H?</ /N?<c?<c?</ /N?<f?<f?</ /N?<g?<g?</ /N?<h?<h?</ /N?<m?<m?<1/ /Nl?<n?<n?</ /NX?<r?<r?</ /ND?<?<?<4/ /N0 S PA(HBg?<Bg/ /N?<?<?</ /N?< ?< ?</ /N?< ?< ?</ /N?< ?< ?<$/ /N?<?<?</ /N?<?<?<5/ /N?<?<?<5/ /N?<?<?<2/ /Nv?<?<?<3/ /Nb?<A?<D?</ /NN?<H?<H?</ /N:?<I?<I?</ /N&?<J?<J?</ /N?<K?<K?</ /N?<Y?<Y?<%/ /N?<Z?<Z?</ /N?<=?<=?<!/ /N?<>?<>?<"/ /N?< S PA(HBg?<Bg/ /N$?<A?<A?<// /N?<B?<B?<// /N?<0?<0?<0/ /N?<1?<1?<// /N?<2?<2?<0/ /N?<?<?</ /N?< ?< ?</ /N?< ?< ?</ /N?< ?< ?<$/ /Np?<?<?</ /N\?<?<?<5/ /NH?<?<?<5/ /N4?<?<?<2/ /N ?<?<?<3/ /N ?<?<?<4/ /NLN^.NuETSTATEp)NV/ (m|,g9|`9|(_N^NuOTESC NVH(m|9|9|~`0S@A @AGBS|RG G oB,LN^NuETPARMSNVH&m|0+2SAC @AI0 2-@|08B,LN^NuVALPARMNV/ (m|0,R@9@(_N^NuEXTPARMNVH(m|~` 0S@A @AG+g6RG Go,gG0,S6/ ?,?,N?,?,N9|LN^NuURSGO NV/ (m|9l489l6:9|(_N^NuAVECURSNV/ (m|N?,8?,:N9|(_N^NuSTRCURSNV m|1|N^NuURS52 NVH&m|I0-| R@8B,/ ?<?<PNA+HNLN^NuPARM NVH&m|I0-| R@8B,/ ?<?<NA+HLN^NuPARM NVH&m|0. 2SAC@A200S@AI=n>. `&0S@AO  0S@AO @9NRGino|Bg?,?. N9_Bg?,?.N29_|LN^ _\ONRASCOLSNVH(m|=n>. `40S@A @A200S@AACp> S@nRGino|LN^.NuRASROWSNV m|-H?<?<N~ nBhN^NuRASALL NV/ (m|?,4?,6?<PN0,4R@??<N>9|(_N^NuRASEOS NV/ (m|?<0,4S@?N?,4?<?,6NN(_N^NuRASBOS NV/ (m|,gNt` 0,g S@g S@g`N^` N`N$9|(_N^NuRASS100NV/ (m|?,4?,6?<PN9|(_N^NuRASEOL NV/ (m|?,4?<?,6N(_N^NuRASBOL NV m|-H n?(4?<?<PNxN^NuRASLINENV/ (m|,gNf` 0,g S@g S@g`NP` Nz`N9|(_N^NuRASL100NV?<?<N m|1|N^NuOME NVH(m|0,4n> Gl~??,6NLN^ _TONURSUP NVH(m|0.l4> Go~??,6NLN^ _TONURSDOWNNVH(m|0.l6> GPo~P?,4?NLN^ _TONURSRIGHNVH(m|0,6n> Gl~?,4?NLN^ _TONURSLEFTNVH(m|, ,g~`>,0-@AgS@gS@gS@g`?N`?N`?N6`?Nl9|LN^NuURSMOVENVH(m|G lW SWgpp[=|/-pA/HnN?,4HnNpA0AC=A/-pA R/HnN/-p?<;N?,6HnNpA0AC=A/-pA RAA&H0.HЋS&@BBBg0.2SAC@A200S@AHtN0nR@H/N./ //N܇ m|A&H/ /p/NR0.R@2.SA=A:`~0S@A @A200S@AA&HBg0S@A @A200S@AHtNl0H./ //Nf܇ m|A&H/ /p/NNRREino|0.2SAC@A200S@AA&HBBg0.2SAC@A200S@AHtN0H/0.S@H/N0./ //NLN^ _PONETSCRNSNVH/.N nC""&m|(n0HoB`0,Ho 9m9|QB0S@AA@2,HҰS/0AA@"0S/N-_B0,S@AA@2,HҰU/0,AA@"0S/NN-_ .R,&m|0.HnB`0.Hn=|=|`0.H=@0.H=@0.nfhBBg m|0.2SAC@C210S@AHpNR0H/0.S@H/N =@BB0.nR@H/N.`BBBg m|0.2SAC@C210S@AHpN0R@nH/Nj.R0.R@2.SA=A:`N"_0 _f`>N"_0 _f`>N"_0 _f`>N"_0 _f`>N"_0 _f`>N"_0 _f`>N"_0 _f`>N0/ o= _\ON oBo /HBoBoB Of0/ ?@.Nup`0/ O1@ _J_NNuNuNu _"_/N _.jN" "_ _./NuNVH>(n0,Tn o\2@"A2n @ A,<.< z@/L|Hp>L<,(!̇Hp͡QL|N^ _\ON"8jjgNu _0@BQN _NUNNV,_//0/2/ AH@B@2/Ё/@" /WXNuN^Nu%I_MUL4 NV,_// /"/ NP/A" /WXNuN^Nu%I_DIV4 NV,_// /"/ N/@" /WXNuN^Nu%I_MOD4 H>*jD,jD$&BBx㉰mRSDlJjDjDL|NuNV,_$_0 _"_S@kQNN^Nu%_MOVEL NV,_$_0 _"_S@k!QNN^Nu%_MOVER NV,_$_02 _SAkQNN^Nu%_FILLC NV,_HBB o0/2/gk gRBSAn` R gSBRAk?B/oL\NuN^Nu%_SCANE NV,_HBB o0/2/gk fRBSAn` R fSBRAk?B/oL\NuN^Nu%_SCANN NV,_H0/ oC"4JBAR`$aBBB`SBjS@j oC"0/H#//IL._NuN^Nu%_CAT NV,_H oB@BA"o BBBlBA`$HR` fSBj`RS@`?A"/oL\NuN^Nu%_POS NV,_H o0/2/SA"o BBA@m`S@j/o L NuB`N^Nu%_COPY NV,_$_02 _ @o0 Ao*BBAm"6@SCBoSA`@"H`RCoNN^Nu%_DEL NV,_$_0"_ _/ S@m.BABB@m"6B$I&I”@`#SBj`SAjNuN^Nu%_INS NV,_Hr`N^Nu%S_NE NV,_HBA o"oB@f`fS@j AA/oL\NuN^Nu%S_EQ NV,_H"o ov`dN^Nu%S_GT NV,_H"o oBC`BN^Nu%S_LE NV,_H o "ov` N^Nu%S_LT NV,_H o "oBCB@BA@m4`4`fSBj@n C`cC"/oL\NuN^Nu%S_GE NV,_BHA0"H2@l02H`4 aS@j3 o#/IL._NuN^Nu%_INTER NV,_HA$0BP2I4RB6K"O$O8<4SDf JBZSBf0BB@0LNuN^Nu%_SING NV,_BHA 0"H26@l6K`4 aSCjAgm @H3 S@n`3 o#/IL._NuN^Nu%_UNION NV,_BHA 0"H26@l6K`4 FBaSCjAn3 o#/IL._NuN^Nu%_DIFF NV,_BHA 0"H26@l6K`Fa4 QSCjAo @H3 S@n3 o#/IL._NuN^Nu%_RDIFF NV,_H2/$0/&B$A(J@jB@@mH4J6Kg"O$O8<4SDfBZSBfTC?C$46JJDBCBDĉp R@@lLNu o /H"LJ_NuN^Nu%_RANGE NV,_H0/2/A"o@lB`TAk`! /HL._NuN^Nu%_ADJ NV,_BHv`N^Nu%_SETNE NV,_BHBCA$0"H2$I4@l4’J`Hf*SBj@gkIJafSAn`AJ`fRAk CB" o %/JL._NuN^Nu%_SETEQ NV,_BHC$2 I0$H`(N^Nu%_SETGE NV,_BHA$0"H2$I4@l4J`6 FCafSBj@gk IJaf SAjNqv`BCB" o %/JL._NuN^Nu%_SETLE H"fNV O1|>a N^`aLNu1h>!|$B.1|,G!K AB0NuNV,_$_ _H< aLNN^Nu%W_LN NV,_$_4 _`p NvSBnNlNN^Nu%W_C NV,_$_2"_ _BBBop NBSAf`N6SBjNN^Nu%W_STR NV,_$_24"_ _Bo p N SAfNSBnNN^Nu%W_PAOC NV,_$_2  _HBB,lD&(BDHD *: HD&6HEE0?RBJfJlRB?<-6Bo p NSCn0NSBnLxNN^Nu%W_I NV,_$_4gHz"`Hz?/ NN^Nu%W_B FALSETRUENV,_"_ _p / N,NuN^Nu%W_PAGE H@ f"NV Op(10g(N^ g0a`(1h>!|$B.Bh,C@!I AZ0LNuNV,_H o N@ o/H LTNuN^Nu%R_C NV,_$_ _H g a^ f`!|$B.0< H<1@,E@!J BBh Bf!|.1|,DA0NuN^Nu%_RESET NV,_$_2 _/ 1h>AX0NuN^Nu%_CLOSE NV,_H o1h>B.Bh(1|,B Bh!|$E@!J 2((A0JAgB/`|/oLTNuN^Nu%_EOF NV,_H o1h>B.Bh(1|,B Bh!|$E@!J $h A0  gB/`|/oLTNuN^Nu%_EOLN NV,_0<`N^Nu%_BLKRD NV,_B@$_BB24"_ _JAlBA1h>!A.1|,!B$!I J@g`2((A0Bg>NN^Nu%_BLKWR NV,_0<`N^Nu%_UREAD NV,_BBB$_246"_.$@0<0B. @g!|@.1|ը.1|,!C$!I g`4((Ah0$_Bg>NNN^Nu%_UWRIT NV,_$_?:>/ NuN^Nu%_IORES NV,_$_0/ NuN^Nu%_UCLR NV,_NuN^Nu%_UBUSY NV,_`N^Nu%_GET NV,_$_"NN^Nu%_PUT NV,_/ o/P _NuN^Nu%_UPARR NV,_$_0"NN^Nu%_SEEK BNuNu _N]NNV,_$_024/ NuN^Nu%_RCHCK NV,_$_ NN^Nu%_SRCHK l NVHBg/:JN _WDgB/:.?<N"(_ n"TpC S@nLN^.NuOADCONFCNFGCNFGNVHBg/:N _WD  g0B/< N(_ T"npC S@n/ /:T?<HzJN`$B/::?<N"(_ T"npC S@n/ N/ N*LN^.NuAVECONFCNFGCNFGCNFGNVH&n..,. (G+gB`Bg/N*_Bg/NB_Bg/N2_Bg/N:_+ @ Gk Gk Gk pA0A G1A GC?<NA p@ S@nLN^ _ NETCONFINVH&n..,. (GJWD@/,NZ/,Nr/,Nb/,Nj/,Nz, @ Gh Gh Gh p GC GA ?<NCp@"S@nLN^ _ NETCONFINVJH(nB?<Bp/NJ-_~`(/.?Hn0S@A% @ANHpHnJNbRG G&oJfz`z0S@A% @AN/0?<N,H| =@0.2SAC%@AN/0?<N,HgS@gS@gS@g` |`|`|0S@A% @AN/0?<N,gx`x 0S@A% @AN/0?<N,g=|"`=|#0.2SAC%@AN/0?<N,HS@gU@g `=|%`=|&0.2SAC%@AHnN:/ Hn lR@??<?<PNDRGinXo(HnN.HlN*HmNLN^.NuEFRSHRENVH(m|BN֤&_<,Bg/,Nל9_ l.>N6AC 0.X@=@0.Y@=@HnBg?/ NzJGlHn?. n??.?.N`Hn?.?.?. n?NպBgHnHlHnNծHnN/ NHmN>LN^NuCROLLDSNVH(m|Bg/. N>Bg/,N_g/. S@?NֲNLN^ _\ONSPLYUP NVH(m|Bg/. N|>Bg/,Nt_g/. R@?NdNLN^ _\ONSPLYDN NVHHnNRBg/ /.N40n fBg/ N>/ 0.G?NNHBgN gLN^.NuAGESCRONVH(m|&n0. Y@H.2,@60.V@Y@H,7@/ ?,0,|S@?N"Hk?<?<QNLN^ _PONTTORC NV/ (n0l^2lW4,l^g-T()n(_N^.NuORTSEL NVH(n&m|0+|S@>T]2,k]g(0kl 89|0+|S@>ll 9G9|PLN^.NuLIPSEL NV/ nC""(m|HnN&0.lR@=@0.lR@=@0.nf<`H><`B><`<><S`6><`0><<`*><|`$><`~^`~>`~7`~.`~` ~`~ `~=G .N^ _TONUMFROMSNV/. HgS@g`~`~ .fSG=G .N^.NuUMFROMPNVH,.BGB F( HH/p/NͲ >BH/?<Nͨ >BH/B F( HH/p/ǸN͂ >BH/?<Nr >BH/B F( HH/p/NJNL >BH/?< N< >BH/BBg F( Nj0H//<N N >GIB BlBBlBg F<N7_7|=GBBgA/BgN&:JEg /Hz?NLN^.NuETCONFI SetConfigNVBn .g=| N^ _TONYTEFROMNVH(nBBnBBnBg<N4=_=| Bg,N0A@Bg,N0A@Bg,Nx0A@llp@BG,g~ ,g|OGBgA/BgN&<JFg / Hz?NLN^.NuETHANDS SetHandshakeNVH(n BBnBBnBg<NV=_=|BgA/BgN>JGg / Hz`?N. nC 0B0,H/BB.@H//<N ?<N N 9@LN^ _PONETSTATU GetStatusNV.HgS@g `-|.A `-|.B . HgS@g `-|In `-|Out n/HnHnHn?<N _C?<N0Pp@ S@nN^ _PONAMEFROMNV/BBnBBn=n=| -n =nBBgA/BgNv>JGg/.Hz?N.N^ _ NETBUFFE SetBufferNVBBnBBn=n=|BgA/BgN&=_Jng`0.H-@ N^ _TONERWAITINV/BBnBBn=n-n 0.H-@BBnBBgA/BgN>JGg` .gJGg`.N^ _PONERREAD NV/BBnBBn=n-n 0.H-@BBnBBgA/BgN">JGg/.HzF?N .g/.HzBgN.N^ _ NERWRITESerWrite.CountSerWriteNVH. H@.H@< m. HހB//<N:.-G LN^.NuRVRFROMNVH. .BgN>0jD@> md0S@A @ p PHM C@HK"AA# md0S@A @ p P/BN6  _ LN^.NuERINST NVH.N6HMA0` -gHpF@> m`O @O"ChA# mX HA@"RACChA# m` T@A@"TACChA# m` V@A@"VACChA#BgN<NHMA`LN^ _TONERINSTANV/Bg. .Nv>0jD@>. HAA@.HCAA"md2SAC"A"q"Q".N^.NuERUNIN NVH.NHMA0`gBgNp<NfHpF@>O Ah@"m`O"A# R@AAh@"mX"HCA# T@AAh@"m`"TACA# V@AAh@"m`"VACA#HMAB0`LN^ _TONERUNINSNVBB-B-B-B/::?<Nǎ+_/-Nf/-NX/-N8|N^NuNITSER SERDNVHBp&/NȆ&_(K ghB/<Nr.JgNBBB)G| B, | | 9|9|B,B,B,B,B,BlB"`/ N"-LLN^NuEWSER NVH(n.)n )nNBgHnNRBgA?<N)/N<<HnN,BgA?<N)/N</ N/ Nv/ BgBgN/,?<NxLN^ _NPENSER NV/ (nBg/,NȰJ_o/ N`BgBgNvNBg<NfNvN<(_N^.NuLOSESERNVJg /-Ndž/-Nv/-NBB-N^NuNDSER NV n n /. N6N^ _\ONETSERSPNV nh N^.NuETSERSPNV n n /. NN^ _\ONETSERPANV nh N^.NuETSERPANV n n /. NN^ _\ONETSERWINV nh N^.NuETSERWINV n n /. NdN^ _\ONETSERSTNV nh N^.NuETSERSTNV n n/. NN^ _\ONETSERBENV nh N^.NuETSERBENV n n/. NDN^ _\ONETSERCENV nh N^.NuETSERCENV n n/. NN^ _\ONETSERCTNV nh N^.NuETSERCTNV//.HnN.@J@g~`BG .N^.NuXASERCTNV n 1n/. N~N^ _\ONETSERCNNV n=h N^.NuETSERCNNV n 1n/. N8N^ _\ONETSERCFNV n=h N^.NuETSERCFNV n n/. NN^ _\ONETSERXONV nh N^.NuETSERXONV//.HnN.@J@g~`BG .N^.NuXASERXONV n n/. NrN^ _\ONETSERINNV nh N^.NuETSERINNV//.HnN.@J@g~`BG .N^.NuXASERINNV n/( n?(NN^.NuNDSERXNNV n/( n?(NN^.NuNDSERXFNV n=h nBhN^.NuXASERERNV n !n"N^ _PONETSERERNV n-h" N^.NuETSERERNVH(nBgBgN=_B?.N.JovBg/,N|Bg/,NÔ02@H(JoTo,`, o,<?.A/?N=F/,A/HnNČ0.Hg / HzBgNBg/,N(0H.Jo`Bg<N=_ l*`*<=E/,A/HnN0.Hg / Hz.BgN/ ?.A/?NLN^.NuERPOLL $SerPoll.Out.CountSerPoll.In.CountNV . l-n `-nN^ _PONMIN NV . o-n `-nN^ _PONMAX NVBgNxg mTHhN mTHhN~B `B N^.NuYGROWZONV/ nCp"S@n~P G^2SACO6pA A WgSG`=G .N^.NuRIMLEN NVHAd/NIAC" 0A)HBlBnBnBBgA/BgN<BgA/BgNF<;nZBG`O A@BRG GoBG`(O A\@H瀀B/<8N"L!RG GoBG`nO A\@ p(PBfB-dBlBG-K nB nBh nBBl B"B nBh7mZ'|$7|,B.RG GoBLN^NuNITCACH TermCacheNVH(n,HA@/4NJ,HA@ t&P K\-H n!l .A8"n#H 0+H n!@$Bg K\/<N >0+HГ)@ Bk,Hr@CA,HA@ t&P K\-H n-H nJho`& LN^.NuWITCHBUNVH-dHAA\@ p(P0,HДR.Hm\NIB Bl=mZ-GBgA/BgN <BgA/BgN ,<LN^NuLOSECACNVN^NuORGETALNVH,.*. &n+HA@ s(P0,HІ o:0<lH./A80,HЈ//N 0,HЇ9@ڇ/.N.&n+HA@ s(P/A80,HЈ//N r0,HІ9@LN^ _ NACHEBYTNV/Bg/. N4>Hm\/. H/N Hm\ m|A/p/N 0-AA@H"ҰR -RAA@!R.N^ _PONACHELINNVH,.flB=mZ-nB/-f . R/N -@=|-FBgA/BgN 8`B-dHAA\@ p(PB//-fN >BB . RHǐ/N :H f>A8H Ї/ .Ю/H/N LN^ _ NTCACHEDNVH.. RAA@O"CA$0S,O A@/0 RAA@"0U//. N n0 n!G nITTT nIGSSSSS9FLN^ _ NETCACHENVH n C"",.(m|0.nf0.2SAC@A200S@AA&H0.HЋS&@BBg m|0.2SAC@C210S@AHpN0H/0.S@H/N 8BB nR@H/N ./ //N x`0.2SAC@A200S@?<BgBgN4/ <:?<BgBgN"/ <;?<BgBgN/ <?<BgBgN/ <??<BgBgN/ <@?<BgBgN/ <A?<?<.?<nN/ <B?<?<S?<SN/ <C?<BgBgNx/ <D?<BgBgNf/ <E?<BgBgNT/ <F?<?<R?<RN>/ <G?<?<P?<PN(/ <H?<?<,?<lN/ <I?<BgBgN/ <J?<BgBgN/ <K?<BgBgN/ <L?<?< ?<MN/ <M?<?<-?<mN/ <N?<?<Q?<QN/ <O?<BgBgN/ <P?<BgBgNv/ <Q?<BgBgNd/ <R?<?<0?<pNN/ <S?<?<1?<qN8/ <T?<?<2?<rN"/ <U?<?<3?<sN / <V?<?<4?<tN/ <W?<?<5?<uN/ <X?<?<6?<vN/ <Y?<?<7?<wN/ <Z?<BgBgN/ <[?<?<8?<xN/ <\?<?<9?<yNv/ <]?<BgBgNd/ <^?<BgBgNR/ <_?<BgBgN@-LLN^NuNITKBD NVN^.NuPENKBD NVN^.NuLOSEKBDNV n-h=n 0. A@0.A@ n.HA_@!N^ _ NETKEYMANV n-h n.HA_@-p n0.@A n 0.@A n0N^ _NETKEYMANV n N^ _\ONETCLICKNV nP N^.NuETCLICKNV n nN^ _\ONETLOCKENV nh N^.NuETLOCKENV n nN^ _\ONETREPEANV nh N^.NuETREPEANV n nN^ _\ONETANSI NV nh N^.NuETANSI NV n nN^ _\ONETAPPLINV nh N^.NuETAPPLINV n nN^ _\ONETAPLCUNV nh N^.NuETAPLCUNVH><0.g S@g U@g` ><` ><`><B0. H/H/N|Jg<.`<.B0. H//<NZJgBH/p/NH </.?NLN^ _NBDSEND NVH(n&n>. Gf .H@BgY@gU@g[@g`~`~0Y@gS@gF`h+g2/ ?<Nf+g / ?<ONV` / ?<?NJ/ ?.N@` / ?.N4`$/ ?<N(+g / ?<ON/ ?.NLN^ _NBDPAD NV/ (n/ ?<N n(g n(g / ?<ON` / ?<[N.H@Bg&Y@g.U@g[@g`./ ?<AN`"/ ?<BN`/ ?<CN|` / ?<DNp(_N^ _NBDSPPADNV/>.B0. H//<NJg~/.?N,.N^ _NBDBS NVH n C""""(n0.W@gS@g S@g`*Bp/B/.?`>,,0.S@"XA7A X@7@0.S@.X@60,.S7@LN^ _ NOWRECT NV m|-H nCA""0.|=@0.X@=@0.Y@=@HnN\N^NuLIPTEXTNVH<. nB=| ><'Gl H >`JF\JG^gb H:p"|0A HH@J@< H > n//.HnHn?<N= _C?<NM`p@ S@n`LN^ _\ONNTTOSTRNV m|-H n/Bg/-tNT0 _ @ ](@@N^NuAVETIMENVH(m|&n0,42SAC@A200S@AA-H nA-H nV nVg 0,,l,>`>,,0,6S@"XA7A0,4.X@7@ kR@7@0+S@6Bg/,Nh:H S< Fl/.Bg .D@?N`/.BgBgBgBgNLN^.NuURSORRENV/ (m|BN9B o,HnNHnNBN9$ rЁ)@, @(_N^NuLINKCURNV/ (m|,gHnNHnN>BN8)_B,(_N^NuFFCURSONV. V@.VA@V. VA.VBAV. VA.VBAV. VA.VBAV. VA.VBAVR@ N^.NuAMEATTRNVH m|-H(n&n>.BT n"n3h0S@AO @=sN<0R@8n n&Bg?.0S@AO @?3NNgRG```02SACO@9 F24SBEOA9n oLN^ _ NAKERUN NVH(m|NP0,2SAC@A<0,g0,2SAC@A200S@AG0,2SAC@A200S@AHt?<?<PHnN ,R)@ ,R)@-l/ HnN*jN /,Bg/,Nh0R@?NdHmN/,Bg/,ND0R@?N@0,R@9@0,2SAC@2,4SBEAAC30,2SAC@A200S@AACp> S@n0,U@=@>,`, R@2SAC@2SAC"AAC3RGino0,S@2SAC@A10,2SAC@A200S@AAB00,R@9@|,g/-|N LN^NuCROLLUPNVH(m|0,2SAC@A<00,2SAC@2,4SBEAAC30,2SAC@A200S@AACp> S@n0,2SAC@A200S@AAB00,T@=@>,`, S@2SAC@2SAC"AAC3SGinl0,R@2SAC@A10,S@9@|,g/-|NLN^NuCROLLDONVHHn ?<?<Nb(m|0. 2SAC@A200S@AA-H nGNVVg~(`~PHn?<?N9n 49n6B,LN^.NuOTORC NV/ (m|0,4lfN`0,4R@??,6N>(_N^NuEXTLINENVH(m|0,42SAC@A200S@AA-H nGVVg~(`~Pl6fl`N0,6R@9@69|LN^NuEXTCOL NV m|-H n?(4?<NN^NuR NV m|-H n(gNNN^NuF NV/ (m|0,4lfN`0,4S@??,6N&9|(_N^NuEVLF NV/ (m| l6o?,40,6S@?N(_N^NuACKSPACNVNp m|1|N^NuOINDEX NVH(m|0,42SAC@A200S@AA-H nGVVg|(`|P>,6GoRG GPW2SACOA;0p@g?,4?N:LN^NuAB NV/ (m|0,62SACOA;9|(_N^NuETTAB NV/ (m|0,62SACOA;B0(_N^NuLEARTABNVH(m|~`0S@AOA;B0pRG GPoLN^NuLEARALLNVH(m|G lfJSW+@gNp` SfN9|LN^NuABCLEARNV/ (m|?,4?<N&N9|(_N^NuRAP NVH(m|,gN0,42SAC@A200S@AG0,62SACO0,62SACO@7jNBg?+?,6N7_Bg?+?,6N7_NV||LN^NuISPCHARNVH(m|Bg/-tNXJ_obBg/-tNn;_ mo 0-|;@ l P0,2SAC@2-C@A0@AA@&p/ N/`LN^NuROCESSCNV/ (m|0. S@,X@?0. S@.X@2,0@?N .V.VgF0. S@,?BgN.V.VgBg0,2D@?N.g Bg?,.N۴(_N^ _\ONENTORC NV/ (m|/,Bg/,NNNH(_N^NuAKEVISINVH(m|BN&_NN nW,g&N.=l.~`?<HlN-RGino`HlBg0,.D@?/ N۬/ NۀBlHmNLN^ _TONCROLLSCNV/ (m|B..V, .W,g?<NڔHmDNr`?<NڂHmLN`.g p.@B@.??<?<N5D?<TNH.g ?,(N6`?,&N,(_N^ _TONETUPQD NVH m|-H(nG mT-HBNچ*/N0. nn>. =T|`0S@AO @24GSA80S@AO @?4N?. ???,HnN\HnNrHnNٴ?. ??,NPg ?<Nl`?< Nb/. S@? GR@?NB R@>RFinof`(?. ?<?<P?,HnNHnNHnN,g /. ?N` /.?N`LN^ _NROCESSKNVXH nC""(m|0.Y@H.l<0.nH.FS@:=EX>`HǾnFAZCp S@n S@H/HnZHnNHnZHn lR@??<?<PN`H 2SAC@A200S@AGH 2SAC@A200S@AHt?<?<Pcopy this large a scrap.@7TOK<  The "^0" feature is coming soon!Z-AJOK< :MacTerminal Version -.8, by Mike Boich and Martin HaeberliN6-rOK76KrCancel##2iNumber:#n2...a title(P MacTerminalP Clipboard/About MacTerminal..-wFileNewGet Settings..Save Settings..Save Text and Settings.. Send FileQuita1EditUndo-CutCopyPasteClear-Show Clipboard1Commands Send BreakLogon@PhoneSet Phone Number..DialHangupKSettingsTerminal Settings..Convenience Settings..J 2?< ?< ?< \?< `?< b?< f?<G?<Hn?<J?<H(?<K?< ?< 4?< H?< B?< ?<?< ?<?< (?<Z?<?<2?<%4?<?<?<^0?< L?< ?< ?<N?< j?<H ?<H?<J?<HP?< $?< ?< J?< D?< d?< ?< 2?< b?< ?< h?< |?< F?< ~?<p?< ?<,0?<!?<"?<+?<+?<+?<.?<+h?<-?<-?<!?<* ?<!R?<,?<!&?<,P?<?<Z?<?<?<@?< ?<r?<\?<*?<?<?<?<?< F?<?<.?< ?<?<?<\?< H?<?<?< ?<d?<?<0?< ?<`BBg/ /.A1N/N>`,Bg/ /.BN>N0`??.:. 0S@kl @ndH0;NT GfBg?<ABN<`, Go&/-?HnNBgA?<Nk/N<`0U@g S@gLW@gb`f/-/-HnNZHnNR/-/-HnNB/- mA?<Nj/NU`(/-/-HnNZHnNJ`N`??N`0S@gU@g(S@g8S@gVS@gfU@gv`Bg S@?N `zBg S@?N `fBg S@?N g mHhNR`DBg S@?N `0Bg S@?N `-g /-NS`/-NSN`??N`0S@g S@gLS@gR`X/-/-HnNZHnNj/-/-HnNB/- mA?<Niv/NTB`/-NU`/-NUR`^0S@gS@g,`R/-/-HnNZHnNr/-/-HnNB`(/-/-HnNZHnNb/-/-HnNBBgNLN^.NuOCOMMANNVHBg/-HnNz>0S@k @nH0;Nn|BN< .g /.N"`F .fJGf /.N`/-?/./.N&`|Hm/.N`n .fBg/./-Ng /-NRN`DB/-N,Jg"Bg/N00|:Bg/N"8??N^`/./-HmNhLN^NuOUSEEVENgNV,_NUNg|N*B-- g|N2/-NB/-NSNnNA/N~A/NtAB/Nj m/BgN _(g/-N(Bg/-NZJ_o/-/-/-/-N)Bg/-N8J_oN$Bg?B0-H/p/N fN`B0-H/p/N fNP`P+m -䰭f/-N/-NO/-N`& m(gN|/-N/-N0:/-N`|N NTVN]NeNuN^NuT100 PQRSUVXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~¬ìŬƬǬȬɬʬˬ̬ͬάϬЬѬҬӬԬլ֬ج٬ڬ۬ܬݬެ߬  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭"_ _-`:,`8"_ O`*/H`$"_ _`/x`/x`"_ L.p/ C2Nup`"_ M`/@`"_ @`"_" _ .`/x`"_ _K`"_ _-`"_ .`"_ _`"_ _!.jB``"_  _ `"_ _H.`"_ ".`"_ _#`"_ _%.jB``"_  _$`"_ _&.`"_ _(.`"_ _+`"_  _'`"_ _)`"_ _*`"_ _I`"_ _J`" "_ _."A`?zNu/x(Nu"_BW 80g(f>NNV/ B0.\@H/N(_ f`0.A8BlBl-L (_N^ _TONIPEOPENNV nJhg`/.NN^.NuIPECLOSNV n0A=@ N^.NuIPESIZENV n0(A=@ N^.NuIPEAVAINV/ (n=| Jlo80,A4A=A 0,R@HH@J@A9@0,S@A9@(_N^.NuIPEGET NVH(n 0,Tf`0,lHH@J@A>O  0,R@A9@LN^ _\ONIPEPUT NVH(n BGBg/.N.<JFmO  R@A> nPWJF]gO n0LN^ _ NIPEREADNVH&n*.(n 0kA< EPlM E0BG EPl / O4p@?N R@A>`LN^ _ NIPEWRITNVHBp/N(_ gBp`H/N&_ f/ NB`)K/ <N/ BgN/ <N ,/ <N `/ BgN / BgN / BgBg?<a?<AN/ <Bg?<s?<SN/ <Bg?<d?<DN/ <Bg?<f?<FN/ <Bg?<h?<HN~/ <Bg?<g?<GNj/ <Bg?<z?<ZNV/ <Bg?<x?<XNB/ <Bg?<c?<CN./ < Bg?<v?<VN/ < ?<BgBgN/ < Bg?<b?<BN/ < Bg?<q?<QN/ < Bg?<w?<WN/ <Bg?<e?<EN/ <Bg?<r?<RN/ <Bg?<y?<YN/ <Bg?<t?<TN|/ <?<?<1?<!Nf/ <?<?<2?<@NP/ <?<?<3?<#N:/ <?<?<4?<$N$/ <?<?<6?<^N/ <?<?<5?<%N/ <?<?<=?<+N/ <?<?<9?<(N/ <?<?<7?<&N/ <?<?<-?<_N/ <?<?<8?<*N/ <?<?<0?<)Nt/ <?<?<]?<}N^/ <Bg?<o?<ONJ/ < Bg?<u?<UN6/ <!?<?<[?<{N / <"Bg?<i?<IN / <#Bg?<p?<PN/ <$?<?< ?< N/ <%Bg?<l?<LN/ <&Bg?<j?<JN/ <'?<?<'?<"N/ <(Bg?<k?<KN/ <)?<?<;?<:Nz/ <*?<?<\?<|Nd/ <+?<?<,?<N/ <0?<?< ?< N/ <1Bg?< ?< N/ <2?<?<`?<~N/ <3?<?<?<N/ <4?<?< ?< N/ <5?<BgBgN|/ <6?<BgBgNj/ <7?<BgBgNX/ <8?<BgBgNF/ <9 g1| !n 1n N^ _PONE@MacTalkby Bill Atkinson-------------->File Send Files Receive FilesQuit ndUU ndUU ndUU ndUU ndUU@@A :@B b<POK F2"2Invalid name or password. Click OK and try again.44P<POK F2"Addressee ^0 is not recognized.44\l OK\llCancel,<name,<lpassword h#Please type your name and password:2<POK F2"^044D<POK F2"Error receiving ^0.44OK pCancel  Send mail to:(8=MRbgw|(8p=MpRbpgwp|pppN<POK F2"Please make a selection first.448 ݔHZ8  ސx'(%,WR7 G(a84 `ph8:>ICON2DITL>DLOGALRTMENUCODE !I 1   o           i 40Z^M`j2.AIn NT.AOutM6@.BIn NPz~.BOut!Nu!NupEGIKMPrtv88a*Hzz!>NupEGIhKMrtv@88A!A@!H`pp"#H$$P&J&6aPPC B)5D*G!I"p6{QrdA"a@pNu@ `  `  P @@ Gr$@H4*L|E 0JjXX.UAn L[Ns @@B>IK$x` IK$xGr aG(*P(( i#BBNu$x`$xAprXfaaBX0`\Af0B* p/8Nu$x`$xA2SAf BjB,Nu_Af8j*gap`SAf$HzB,(X2fI0r@G&6I66NuSAf $4`*(SAgSAf aT.`p`$x`$x@|PaDf a,g*B*@f xN@J@kpNsB*Fp`&x NuJ*gJ*f J*g J*gpNupNu$x`$xJ*f J*g af"R@`~(NuB*J*fNu$x`$xax@|j,g3 RBCft5B.a:FJ@ja ``P`@|J*ga:aHj bg*a pNs/8NuAJgBNuag@`&j6* L,Nu0BdCNu(x:!$Jk`gULGACa`.x:/8$NuG`G($[&SJ*gr*g*fP`XJ*g"KaTjJB*`zafRACfrBfNu5A,J*gaP@jdf*aNuG`G$[&Svp*(*0gxJ*gp"KB*`"G`G$[&S*gH瀀0| @H@0+/LJk [jNuJk(NupJ*fNu,~  " j&s}'w1p0 U)T,M11$B1 e1bH1  e)8 4M 1 7TB i 1`HƪP65;эb ¨Ԁ $ ө5Wz q 1\HƤQ"gO$4?s<T œUP$ U-UTaB q >H!!N#F$85cUHQ mP$@~! WaB1 i 0HJ"!R#F$45c RQ1U"$E1cBq$e 0bHQ" 2gN$25s8E3"R %œPa!Ot\GQ'~/6$158"'  @@   @ D  8p8  #(-27<AFFKPUZ_diijmrw} $).38=BGLQV[`ejmqty ~  !H $j&s}'w1pR H#$$U)T,M11$B1 e1bH1: H $?=e)8 4M 1 7TB i 1`HƪP9Rߚ $@N¨Ԁ $ ө5Wz q 1\HƤQ"~$I $U_œUP$ U-UTaB q >H!!_HG?@mP$@~! WaB1 i 0HJ"!:#A  ?"$E1cBq$e 0bHQ" D"HA  $ œPa!Ot\GQ'"Hy   @@    @   8p   #(-27<AFFKPUZ_diijmrw} $).38=BGLQV[`ejmqtyy~  '@@@Terminal Settings %@@Comfort Settings!@@K Phone Setup @@-ww @@7ww @@Aww%6OKJ|CancelTerminal Setup#2FTerminal#P2VT100#2VT52#2TTY<KK Baud Rate<PK50<K75<K110<K@134.5PP_150P_200P_300P_6600dPs1200ds1800ds2000ds62400xP3600x4800x9600xE19200PParityPEvenOddNoneR HandshakePXon/Xoff, Clear To Send6rNoneCommmunicationsOn Line^LocalCharacter Width7 Bits8 BitsV@7|OKA@_|CancelConvenience Settings:F ZAuto WraparoundFZYesFZ@No 2F Scrolling2"Smoothx2Normaln Remember Lines Off Top:nYesn@No Retain Line Breaks:Yes@No`@7|OK< ?Sorry, there is insufficient memory to $#>, ?<?<&?<?<?<$?<?<?<*?<"?<0?<V?<D?<?<?<h?<?<?<:?<.(m6 G f?<?,0N` G f?,20,0|?N`?NLN^ _TONNV?< N?< NN^NuNV/.A/N>HnNHN^.NuNVBg?H< FH=Gz` RRREinoLN^ _PONNVHz NN^.Nu 27 Sep 83NV/0.@|>HnBg | ??< X@?NHnN.N^ _TONNVH8. @|> @AI?<?NLAC 0|`4`@:JEfz? RF FoHnNB ,2м/?g?NLN^ _TON NV/BgBgHm N .;_ =m ~`&Bg? @CA/N 8 @AB0RGino.N^NuNV/HmXN G]m ^g` @A0  @A?N,<BgNg\HnNt0.| H> Gl~m o>- Gg,GlRF`SF @A0g @A?N``LN^NuNVH=m ~` @A0fRGinoBg?<BN8`=m ~` @AI,>gjA-HAC 0A/HnNTBgA/A ./NP g Hz~Nf`&Bg @CA/p@/N$ g Hz:N:`Bg/ BHnN X<*,*BJoJBg?.Hn/<A/N <BgA//<N g HzN``Bg?.N ^<Bg/ BHnN <*,.BJoHBg?.Hn/<A/N F<BgA//<NT g Hz:Nj`*`Bg?.N<B,>?NRGinozLN^NuSendFile resource failedSendFile data failedSendFile header failedSendFile command failedSendFileNVxHBgN g`Bg?BgHnBHnN>>JGg HzN`4,.BJonBA//<NJfHzZNBg?.N`>`Bg?.Hn/<A/N\>JGgHzNBg?.N(>`œ`Bg?.N>BgHnBHnN>,.BJojBA//<NJfHzN:Bg?.N>`bBg?.Hn/<A/N>JGgHzHNBg?.N>`,`BgA/NBg?.Np>NN`LN^NuError writing resource.Failed to get ResourceError writing Data.Failed to get DataOpenFile failed.GetFiles failed to get header.GetFiles command is bad.SendFileGetFiles failed to get command.NVJnn`hAH/N0. S@gS@g.`P nm"/-,?.HnNtBgHnN 6=_B-`$0.S@g S@g S@g`N` N`|N^.NuNVHB?-FN.Bg/Nr;_@Bg/Nh;_>?-@NBNP V,?-@?->N?-@?->NBgNr m@W m>WD@-g``-gAHfN`-g(AH/N/-/<N^ ;@F-DgN`n-m/.N`^-@@-g*AH/N~` @A(/0BgNRG Go`~` @A(/0BgNRG GoNLN^NuNV?<NhN^.NuNV/Nd~`h @/B?N\" A(! Gf" @C( q Pp/-,/:8NX @A(/0BgN @A(/0BgN.RG Go.N^NuDRVRNVN^NuNNV,_NU:NA6/NLNXN|B/<NN+_NA/NN-gNBg?"(0-@N^Nu0/N"/ONu2 OBBh2Nu _ /2Nu/xNu _0"$BAlDB@lHAHBAlDB@lN "_ _BAVWD @N _0H"_`BQNNVA!nBhBh=@ N^ _XONNVA!nBhBh!n "n2=@N^ _ NNVA!nBhBh!n  "n2=@N^ _ NNVA1n=@ N^ _TONr`BANVA1n!n "n . !Q.ё!@$1|,JAg`=@N^ _NNV O1n1|JV D. N^ _TONNVA!nBh1n gBh(=h(N^ _\ONNVA"n!I1n1n  " "$2("6"@ (:ШD""H"LN^ _PONNV O"n!IB(1n Bh !Y !Y$1Y(Bh*Bh,Bh. N^ _\ONЬPQRSUVXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~¬ìŬƬǬȬɬʬˬ̬ͬάϬЬѬҬӬԬլ֬ج٬ڬ۬ܬݬެ߬  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMPQNOTUVWXYZ[\]^_`abcdefghijklpqrstuvw{|}~­ĭŭƭǭȭɭʭ˭̭ͭέϭЭѭҭӭԭխ֭׭ح٭ڭۭܭݭޭ߭"_" _ .NѠ/@Nu"_ _-N"_ _KN"_ .N"_ _N"_ ".N"_ _#N"_  _$N"_ _%.N"_ _N"_ _N"_ _N"_ _N//0/2/ AH@B@2/Ё/@" /WXNu// /"/ N2/A" /WXNu// /"/ N/@" /WXNuH>*jD,jD$&BBx㉰mRSDlJjDjDL|NuH0/2/A"o@lB`TAk`! /HL._NuBNuNu _N]N _NUNNVH/-NBNR (+@/-NjB/< N&_A/NbB-|B-BgHzBHnNr>BgHzBHnNr>?