8L2C)pJJJJ IH(ȱH:=IH[H`@HcH  $ +   I/H`JLNGȄBȄF aK  haaFF  mJm# KKJ UJ )J ۈ) ;J3ȱJFȱJGJKaȄM  aaNNJFLGJL L? &PRODOS `DaElH$?EGvѶK+`L HHLy XP LM ŠϠĠӠS)*+,+`F)) (*=GJFjJJA QE'+ '== `@ STSP8QSS8 m P o R(8RLnSOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: xةw,@  ȱlmi8#)!) >dLԡm#i㰼m#iЕOLԡȱfg hi !dLԡ憦  Ljmkm l y`2 Lԡ8(Je稽)ʈ@LLOGO' %LOGO19pO!I%LOGO2A+O!I%LOGO3X O! ILOGO4hO!I+LOGO.SYSTEMjOI&PRODOSn<O! !,USEFUL.TOOLS HO!I&FORMAT O!I*FORMAT.BINO!IFORMAT.HELPO!I)MAIN.HELPO!ISAMPLESO!I?  !"#$%&'()*+,-./0123456789:;<=>?JJJJI  e 0! 1  Ǻ p Ƚ ߮`Law/ ɯ΀ff ș8`1+LOGO2(),'+'+()(, ֠ ֠53ȥ63` ֠73ȥ83` ֠35ȥ45` ֠ ֠75ȥ85` ֠-5ȥ.5` ֠37ȥ47` ֠ ֠57ȥ67`-7ȥ.7`Q3ȥR3`Q5ȩH5`3ȩ13`5161`7ȩ17` &Ѡ3ȱ334` CѠ CѠ5ȱ556`5-ȱ5.`5-ȱ5.`v3ȱv4`;5ȱ;6` Ѡ7ȱ778`E5ȱE6`EȱEEF`vȱvvw`1516` r { <  W ` i(` N3`48` hэ-ȱ--.Le3`5`7`E`1`=`3`5` hъ--` hэ-` hъI1--`7`=`3ȑ7` إ6` 8 ^֠57 C #LӍL 8 ^֍"5 !7ȱ57Lӑ7ȱ5LoӠ575ȱ5565ȑ7 ֩" #ЍLjLՍ5Q7;" ȱ57U'ȱ5LӠ57A C`57, &ؠ575!57 C 8` ` ֩! Ҡ577"ȱ57 , n ߩ! n" (. X` `8` Z ^ ӥ6H h` Ҡ7.ȱ7-L ؠ57d57ȱ57 C8F`5 UՍ7 UՍͭ+ȍ5 UՍ7 UՍͭ Cť8`` *Ց5 *Ց5 C`5A[i ` SՑ5 SՑ5 C`5a{8 `A12?/,Er39;5=73 57-CHpqpphppq)xy&p%ppppp%q&`hzh{z{zHz{zH9z bL֩?/ bL֩A1>G589r bL֩9E(93";5=7-C bL֢357CHH hpȵphpȵppq`#p`9H9H9p:q9ȱ99:L ֥p3q4` ֥p5q6` ֥p7q8` ץ%p&q%ȱ%%&ppxyx`yxH h0yxL34`56`78`/0`CD`EF`75758686` &L<ѥ5364`7384`-3.4`E3F4`3v4w`Q3R4`1324`?3@4`314` 314`1516`Z65[66`[66Z65`G3H4`3G4H` 1 1`3141`1121`3 14 1`1 11 1` 11`3546`7586`E5F6`I5J6`1526`C5D6`3748`5768`I7J8`=7>8`5-6.`7-8.`3E4F`3Q4R`5E6F`5162`5I6J`7C8D`C7D8`3;4<`3A4B`3?4@`S3T4`U5V6`W7X8`3S4T`5U6V`7W8X`' ڠ%&xypqp0%xypȑpȑpȥ%pȥ&pp%q&)ppipqq`3(ʵ3'ʊH eh`'1( eک '1( eک'1(LeڥQpRq`pdqS`pȱppq`p p`)*' ')@d') %','++)' @'ȥ)'ȥ*'Lڠ')1'+ȱ',+))'ȥ*'')(*+',(Lqڥ*T,)++)@ )ȱ))*(+'++',(Lڱ+)+)ȱ))*(+'++',(Lڍ`K`-` | &Ѡ"53ȑ53H & Ch5Luh 8L.5?7--65??-%+.6??';'!) -, 67+56>?8</( -,%7/1/26'?<?( e-.$-7576><<< --,.,%->6'75767'''$''--5.$-77><$-5-.m7?7-$<,-5.$5--?7>>'<{{z z z } {{{}z{{{{)||?{I}{t{i}?|w||||||~|}|{t{i}?}c}c{{z } }{}}z{{{{){I~{t{i|ϼ{t{i|\ [])(+-*=>?[ QA.jsg,0A+Xo8098/J|ej<FFKꑂzT_S y݉9Y׷m G8h2 u2)3.l L~O.  !L` d" N ! V C b-` Li5Q6H` e$L Vѥ.1-`0 @0`0)0` 9LVѥ-/.0` 9Lh 9L@ N LC @L< @LC z*&( Lqe-| .6Lw-5.6L Lqe "ѥ3-ж4.а * ե394: <  N E 0 ե-.0 L Z֭-0. L Z֥A3B4 V V V֥;3<4 V֥93:4 V LV֢ors`B0S`0``` +5Y6ZoӠo ors` 0` ````D0M`v``` i%YZڠrs ̠sgtu`0` ```L%g | < i  &L | < k  &L | < k  &L < k 0 ٗ4  &8L Nl" :L<ъH < Xe | N1hL!h L< Vѥ-.h- jЩ" &L< d. *) ! i6N52` ? (h Bh ѩ``dQSRLٮ``Lb3 rh2 ޅ p 4 rh ի R r i?` Y` b իL֍() `0P ʆm lno rnilhhiH Dim H 4shlhoiޥiHJ) fh)ie ee`iHhHm H 4sh pH 4shio! il BiLcihhhi` j& j! V j0 թ` ! l i թ` } i*` } i i i`5n6N`5ɂ6N`L C L" N L< j N` j N   ` } N` /j6` @j`L @j L /j &` j l lL j l lL \j | < @ _ Oe 4 ٥F wLGy,EF M׍LGy mLz Oe  ` gե/ u g a a MLw )8 | C " rLy r < t & rLy 1q r` ֩1 L$z L$z 3 L$z ٖ4 L$z gL$z n5N65N6 @ g a d: e k @(( 7e0).   ٩/.0Lx$0A/= | }թ&L  ) )Ї g aե0)0/L |ة L 7 f~L :, <~L :! i <~hl <~ 5hgLBi BiLZ  f~mh i hg f~L{LBi  o f~L*{  f~ oL : o <~LJ{ <~ : oL 5 <~Lj{   i ( f~Lu{L r0  ~L<~ r0 L~LZ  f~ :  L~ u{ : i }a   : L~ -  r0  r-L{ ZL : Tmh  5L <~ TLLZ  n f~ nLoʆ.  f~hl. 5L L| y 8_]-`^.F.f-F.f-F.f-[e-[\e.\ ~ 5L | : <~L|L뀭HH wߢ[Hp pph[ hh,`LrL袥o"i  : @Lc { @ {Lc` Gߢ[HpgC pph[L_hhk. y_ըP8`֨Q } >OҨO Ũ BL } * f m0 q wL} qLzhh }Lzk w %gk iLrhh %g u{- : U- r -L} r - Lhhlh Bi \i ݩL ih hm 5` oi SsLL+s l~Lhlh`[H\H m ~h\h[inhi`0H hhni` .  iL i ~0 i m 5`hl3 5. )  i (inm nimhLimhL[H\H   5 h\h[`lhniLBilhi iLr :io i mhh`hlin`c[d\ L  _a  a_   _[`\`_``_`_`\`[_` a[b\[\`  _]`^`[]\^`ab`aba`\b[a` _[`\[\[` i  acbd`[c\d`[_ \`a`[` U ` i ` [` [`g][^\`_`k][@^\acCbd` Ȁ[`k ပ[`~~hgLBihg 5hm! 4soi SsL +shHij Bi[H\H 8h\h[jihhLBi :+iok i#hm!L4s U r L8kLiL\illʆmno`l` i }  P РL I!I`3I!7I`-.(-((U-`a aHaH`Ⱦa 0 r0  <~L뀠 8Hh0`H( ~ o  zL  {Lɛ ZLh( ` Ϧ /OҨ> 0@)A$ը֨ ٨ר_بi` kL 5Lk t Ɓ o %L Ҁ +g om %L3  l ՚LՃ GLy CH $#C# $$@hCL  LX  j  `  j   (L z     LI  l& g ٖ& jO ; k ٖ& jS ; O "S  4L ` HHH NDS phhh Lp `0HHH s ք Lahhh ߄ ք L~hhhLG  '`G (` #ȥ##H$HHI#J$ 0)0L00 0M NK#L$ 0)0LD0J0 0N Nhh$h#`-. L֥-LL ե- ե.-`MNMMM #I$JN8NNN #K$LH)hJJJJH)b$h)  Jb#` WLy  `  I,-`./ nL7  lW 8L]  b5b6L$z HLy HbAbB` GLI HLI ` O ٖ4 ؠS ٖ4 N  ՚ J?  c  8> c  8Ly t } $c` L  `    ` OLy SLy0H E ҊEJJJLh `bQ##` ! #ȥ#` ! Q#)ȥQ#)`. ,-   `GA) bI1#L>b# ȱ#`JiJ# ȱ#b% A)b-A b%B)b-B` 8,H-! hIiH!h8.H/ f!hIiHh8F0*+!0Nn Έ* +S*+*80  F0 ! L6mm! ! L6`0*(L% 'L%`E) bQ##Ee")jL0  %L8  %L `  SL,L & &eee` 90`8` (  %L  %i,i-`"LL " [ ٖ j 90`8` Ћ˥  7L Ћ 78`./` #0Ɍ`s` #0```, O S WL NW nLW ٖ g k W ٖb  ;  8 i aa)"` 0@Ii _ ٖ Ι ٗO 喭@ ;L 8O  @0 A L Ii Ii c ٖ Ι ٗS 喭@ ;LD 8S `b_b[bc GbCH I LX N n`b b  H C S ٖ[ j/ %  ;S [ c ` S` blHH bl hhL ͖ w   hhR w w ,0  pL`  k0 Vѥ-LyL k0 k0  Lz8Lz }Lz j0(  | Vѥ. & @`.ʎ`0@`Τ`. u0 uΤ`2 ll ll k u nVL𶍥 7m N! Vѥ- -. mЩ" Υ) -. Υ jЩ" XΥL$z XL$z 7mL$z j Zl tO (0;5   Vѥ-Ly  Vѥ.Ly C Lz Cѥ6 ةL LtL j0 ‘ V NҪ-!.Ly ‘Lz | &`, Lّ }L$z } } L$z @jL z k0  |  L$z, Hj6  } L, Hj } # L$z6 kLy } ?L$z j0 }Ln  ѥ8 L$z k0 ԐLy6 kLz }Lz ^ Z b g  (` j0 }L̒ ѥ8LzLz k0 ԐLz kL z, k * f m q qL'z, Lz } | " CL$z @ | < & L'z 2j/ r  W N { <  ` C & W CЫL'z Qj | @j L葥6 r  W L$zL; k0  | 7 L$zL } }g < & V Lѓ } } L$z b k03 Z kL  L Z k0 ? &LL @jLz d Qj z ة516 @  Lid  } | iL8d  i | }L i eLz i e r _q0% }ե6 | " i3_4N LV Sf ` س0 ` t L[ש-.   < j j &-L jЩ$ L 0?@ L) bl bl bk /O L kL i ` ``) ` ުO0 ` H `hi ` bkLa:ͷ3 k` ek Ϧ Pa> 0?@AL2L bk L bk K^)LL  i `> 0?@ALy @j k k bL zL SfL bk իLz | @ /O * f _q0 wL q }  N @ wL bk /O> * 0?@/A*i@ f o0  1 L` Lqթ5L bk /O La0 a`L`! ѧ Ƭ`L=`) ` D Z֢``` kH ek } Ϧ iH- .`> 0?`@`A````7`8``. DL$zLy`; g/ r`H rh`/ r %g c ة` bk /O * f o0  rL Lq  kL 1g V p  r k 媩L%g b #a$i$^ajJJJJ) F jF jHHH rh rh rh r(`) i0Ly ?׬0 `5`6L$z* bk bL?`@` bkL bk æ /Ot 7g [ L%g+ bk æ /Ot 7g . z L%g bk /O L. bkL k ` i L-6L` 08```Ly l0` ````,L l0` ```` 0ӹ```Ly k ` i L毥6L`) i0Ly ?׬0 `5`6L$z D z  i     7 K 58`_`` u E_` uLrȹ`/`L `0L >OD`      H 7 hʊL`D)ɀ#) r r r / rLr D tLr r r r  #`` uLr``)HH` rhh`H rh` @j | i LCL C C FLX 0 @  C 848C8 1H82 "EP"STW8\8R8a8 1f82"RA3!Tu8z8p88 1828"UN6888 182D"UN6888 182O"NB6!U8888 182X"UN\8888 182d"NTu8!U8989 1 92"DP"NE9"FI9"DE$9)99.9 1392ղ"EF"YDB9"OPG9!CL9Q9=9V9 1[92~"NE"FIj9"DEo9t9e9y9 1~92 "IVW8"IT9"IM9"PR9999 192x599 192"GO999 192"LP"HE9999 192"AB^6!L::9 : 1:2Y"ES"OD:!N#:(::-: 12:2c"YC1"ECA:!RF:K:<:P: 1U:2"OS3"EPd:"XDi:"AUn:!.s:x:_:}: 1:2"MIj9"XA:"XE:"AU:!.:::: 1:2"CA6!.:::: 1:2"EN98"NT:"CO:!.:::: 1:2".Di:;: ; 1;2'".E:;;"; 1';22"SI2"ER6;".V;;@;1;E; 1J;2?"BKY;T;^; 1c;2L"BGr;m;w; 1|;2U"AN"LE;!C;;;; 1;2~"CS;;; 1;2!D8;;; 1;2"TP"DO;;;; 1;2!F3;;< 1<2σ"FD<<< 1!<2"FI60<+<5< 1:<2օ!H%3I<D=C=9=H= 1M=2"RT\=W=a= 1f=2"CH"UNu="CRz=".S==p== 1=2"ETr;!S==== 1=2"TH"SE==== 1=2'"ET"TP>="SE===> 1>2Y"TS="SE>!.>>>$> 1)>2i"TX"SE8>=>3>B> 1G>2"TY"SEV>[>Q>`> 1e>2"NP"OWt>"SHy>~>o>> 1>2f3>> 1>2‡"DS"AR>"OW>!T>>>> 1>2e"OW"ND>"WI>>>> 1>2m"AP"WR>>>? 1?2"XC 2??? 1?2"YC 2-?(?2? 17?2!"TO8F?A?K? 1P?2"CT;"AR_?d?Z?i? 1n?2!C>=}?x?? 1?2ϔ"ER3"FF?"DI???? 1?2"US"IN?!M???? 1?2!I4??? 1?2"IE4"OT?"QU?"NT?!I@ @?@ 1@2 "CT"DU"@"RO'@!P,@ 1@@6@ 1;@2Y"SP"ESJ@!LO@T@E@Y@ 1^@2i"RP"TEm@"EAr@"GRw@|@h@@ 1@2N?@@ 1@2a"OM"ND@"RA@@@@ 1@2"ND7"AI@"EM@!R@@@@ 1@2"RE@@@@ 1@2ԕ!R@1 AAA 1A2ߕ"IN!S&A+A!A0A 15A2"SQ\=DA?AIA 1NA2"UM!S]A bAXAgA 1lA2"CO{AvAA 1A2"AU]2!PAAAA 1A2"TOt>"UTA!BAAAA 1A2#"YP"KEAAAA 1A2."DD1"PAAAAA 1B2"WA3B BB 1B2"@%B*B 1/B2Ţ"RS 2"CU>BCB9BHB 1MB2"FS\BWBaB 1fB2"ETCB!SuBzBpBB 1B2$"ID="TWB"SEBBBB 1B2S"SSBBB 1B2r98BB 1B2|!WBBBB 1B2 "OPh1"LLB!ACCB C 1C2G"AD"LOC".B$C)CC.C 13C2y"VE"SABC".BGCLC=CQC 1VC2"LO]2!CeCjC`CoC 1tC2"EA6"OSC"CLCC~CC 1C2!"IR"EDC"ATC"REC!CCCCC 1C2("BB1"RIC!DCCCC 1C2m"IT5"EDCCCD 1D2w"RF!EDDDD 1#D2"ELh1"IL2D!F7D="EAIF!RNFSFDFXF 1]F2W"TRNF"SElFqFgFvF 1{F2"TE"RIF"TWF"SEFFFF 1F2~"EP>="ITF"WRF"ETF!SFFFF 1F2"IT7"WRFFFF 1F2FFF 1G2"OG"ALG"ATG!CG G G%G 1*G2D"RO{7"RP9G!E>GCG4GHG 1MG2U"OP"PR\G!GaGfGWGkG 1pG2m!P-5GzGG 1G2z!PaGGGG 1G2!P{7GGG 1G2"EMaG!RGGGG 1G2"ATu=!CGGGG 1G2F"RR 2!EH HHH 1H2"HR>!T$H)HH.H 13H2ϔ!-BH=HGH 1LH2 !*[HVH`H 1eH2N!/tHoHyH 1~H2!+HHH 1H2Y!<HHH 1H2i!>HHH 1H2Ď"II"SCH!AHHHH 1H2֎"ORW8"EFH!BIIH I 1I2"BFII#I 1(I20"BL7I2I*L%L/L 14L2`"TY< CL>LHL 1ML2G"IF\LWLaL 1fL2z"FF!IuLzLpLL 1L2!I1LLL 1L2\GLL 1L2ʟ"AT"PEL"RELLLL 1L2("UN!RLLLL 1L2}"ST\GMLM 1 M2"TEf3MMM 1$M2!A;1 3M.M8M 1=M2ڠ 2GMLM 1QM2 !N8`M[MeM 1jM2>"AL"OCyM!L~MMtMM 1M2_"KE"MAMMMM 1M2q6MM 1M2"AMW8!NMMMM 1M2"HI3!TMMMM 1M2C!( NNN 1N2!) #NN(N 1-N2"TO3N\3N3N3N3N3N4N$4NB4Ne4N4N4N4N4O#5 OF5Oi5O5O5O5"O5'O6,O;61OY66O|6;O6@O6EO6JO7OO!7TO:7YOX7^Oq7cO7hO7mO7rO7wO7|O8O/8OM8Ok8O8O8O8O8O8O9O89O`9O9O9O9O9O9O:O7:OZ:O:O:O:O:O;O,;OO;Ph;P; P;P;P;P;!P <&P&<+P?<0PX<5Pl<:PP.>PL>Pj>P>P>P>P>P ?P#?PQBCQBHQBMQBRQBWQC\Q8CaQ[CfQyCkQCpQCuQCzQ DQ(DQKDQiDQ}DQDQDQDQDQEQ6EQOEQrEQEQEQEQEQEQFQ?FQbFQFQFQFQFQGQ/GRRGRuG RGRGRGRGRG$RH)R8H.RQH3RjH8RH=RHBRHGRHLRHQRIVR-I[RFI`RZIeRxIjRIoRItRIyRI~RJRJR;JROJRcJRJRJRJRJRKR!KR?KRSKRqKRKRKRKRKRKRLR LR9LRRLRkLRLRLSLSL SLSMS)MSBMSVM#SoM(SM-SM2SM7SM prompt means you are defining a procedure. -ESC returns you to top level. Defining a Procedure TO TO name begins the definition. END alone on a line ends the definition. Using the Editor EDIT "name or EDIT [list] EDITFILE "filename EDN "name or EDN [list] EDNS (EDit NameS) Special key -ESC Stops procedure and returns to top level CONTROL-L Full Graphics CONTROL-S Split Screen CONTROL-T Full Text CONTROL-W Pauses, waits until any key is pressed CONTROL-Z Executes a pause Editor Command -A Accept the contents of edit buffer -ESC Exit the editor ARROWS Move cursor one line or space DELETE Delete character to the left of cursor CONTROL-F Delete character under cursor CONTROL-O Open a line at the current position CONTROL-D Delete character to the left of cursor CONTROL-R Replace the last deleted line CONTROL-X Delete the line CONTROL-Y Delete to end of line -UP Move cursor up 1 page -DOWN Move cursor down 1 page -RIGHT Move cursor right one word -LEFT Move cursor left one word -> Move cursor to end of line -< Move cursor to start of line -1 Go to beginning of buffer through through -9 Go to end of buffer (U*U*U*U*T*U*U*U*U*@*UժժժՀP*WYZ[\]^_`abcdefgT*UT*!GgBBBJ@Ox>Ng8ԪժժժՂԪժժժ^glaxD>pgq9o< U*U*U*U*TT*U*U*U*U*@*UժժժՀP*U*UU*ժժժժQ(>B>R"PD"ԪժժժՀ  U*U*U*U*UU@*UժժժP* U*U U*ժժժժAOcBBBb"8^D"Ԫժժժ> (U*U*U*U*Ap U*U*U*U*U UЪժժժժ@*UժժժP* U*U*U*U*ժժժժABBBB"@QD"ԪժժժBl! (U*U*U*U* U*U*U*U*U (UЪժժժՊP*UժժP*(U*U*U*U*ЪժժժժosB~"Q B<Q(E  E@"(U*U*U*U*U*U*U*U*U**UժժժՂP*UՊԪ@*P*U*U*U*U*>~~B>BЪժժժՊԪժժժGB _(E< E@@"(U*U*U*U*U*U*U*U*U**UժժժՂP*ԂЊP*TP *U*U*U*U*!BBBFЪժժժՂԪժժժ! A(E" E@ "(U*U*U*U*TO MENU.STARTER TS CT IF NOT FILEP "SAMPLES/MENU [PR SE [Could not find] WORD PREFIX "SAMPLES/MENU. TYPE [Press RETURN.] MAKE "J RL CT ERALL STOP] PR [It takes about 45 seconds to load the] PR [menu. Please wait.] MAKE "INUM 1 MAKE "SP PREFIX MAKE "PREFIX WORD PREFIX "SAMPLES/ SETPREFIX :PREFIX LOAD "MENU STARTUP CT SETPREFIX :SP UNBURYALL ERALL END MAKE "STARTUP [MENU.STARTER] *Quark*x $ !;%"&#', "!# @ IwL0)pX 0 i W L $6%78+)* ] )A0@0(, ] ' 8e;;',)7(+ &* &*),] I (l$0JJJ )` )) *9)F9jF9jJJ<( G b  +  L  0C8 I ̬  ޮ8V0ikl^ *^ *68q&8` I. IO Ȅ"IL #"࿐99Q꽌ɪ꽌Iܠ89*:%:E9 I,8` }꽌ɪ꽌I`$<꽌0V9Y 089 9Y 0%9켌  I8`; L/  # H_ \ h]9: H89E IL  :: )  h)  :L hL `ʊ `0($ p,&"    !"#$%&'()*+,-./0123456789:;<=>? INTERPRETER LOAD FAILURE PRESS CONTROL RESET TO REBOOTCe! H$q!r! c&L*!M8tl # ) y!s!(&s!t! c&E )?  @ e!l!0 $l!0u!v! c&-) &ύw!x! c&Эb)0I0 ( d!N)Gi/ h!4 n!o!p! k! iL X%>!L;!ΠΠҠ`}!!!"!!!l4"# G$YO!-e(eR9B}PBiBmopqrstuvwxyz{|}~PN!-RB}PBiB ,m# m# J Qڨ)̰n]e мȱ ; ̀𩠙< iO P F V >Z SY ɘL` X _ [ V7 c L '0%O '8O JmO * ʈ0  0ŠϠĠ͢Š͠͠ϠŠŠϠĠخ͠ YYZLYLYLY뿩 8@  *$ MNЩUM  L 5   8 0 8 `0 / x X$$ $&$0`ŠӠέԠŠҬîʎ1DžϠ)&8f ZHH)hh8JhJJJJJ '&H(&8H) 12 (j21 h!hH h %)Ђ12H)M0 h10200I20h2 9&`L#`)&!2"L  :8! ȱɈ  )1& ` (Xp< @1& )m1&1&.1&4& M1&i  ``rȱȱȱȱ0]cȱeem<(ȱ=(ȱ>(=(ȱF(=(ȱN( '<( z' #'Lg&`L' 'L& ' Lg& 'L&8ei` ,$`ee` `<( '<( '` ' ' '`hh8`8`=(>(F(`}N(`e`H)hJJ'0JJ)` (< ( < *? ( < (? ( < (? ( <*? * **? *? *? ( < *? ( <ꠙ,<ʆ>*=?BC8 é&'112`HB-4F 1"aɿ LL@ Nϰ H  @h( L Lh  @`bLJCAB@=?<>=?<>CAB@?A` / L  <>` ڢF]PL8i m L   4< L  BLRAM' hLDLآ <B*IBGF08Lé'+8H <(h`@؍L3،h@ihAiȱ@JJJJq@)@%vȱ@Hȱ@Ah@E@c%e J) LxL LxJiB LxJ) <ҩxNhHHHHL(  аƠx@BEOD  а(`( C)CJJJlBJ,~@~@}J@` ߩ%S @ ~`EhhhѺ0 h ѐ# ѐ ѐ ѐ 0 HϭэLпllllhh8` QSTV'P0ōҍJJJJ ɺi) ɺiL9Ҏw s)?ef t Ұs Ӱ s  |Ґ `l@Hȱ@I|HXAT^^ȱH ɯ|ȩxz^5H)/@a)_xx .0 :A[8@`,xx^x}z}Б|` Ґ L` א@>)I3|8^_0`1a`K8`@Nȱ@O@ lIiNȽN)/ȩ/N`@[ WHJjjjRhA &'KI0JHi Q`RC8` @ l3Nz@) Wڎ} ԭziz}`0 iڰ0GF ݰ#Q0 ڰW,u0 Q ۩.H hȑNWȮvNuW8`xzNxz0NN` װG8`F@ 0 [ [LթK8` I8`FHGH ܪhGhF ݰբFF芝 ݰFG ݮI m IHHyHȘI ݰLԩ` ՠ @/@ 7@Юz)mzʈ@=ȱ@/ȱ@9;<2DE)7I0 '*5 ܰ701FG ݰ( ְLݩI mIH` @= t=0FG ݰ ֬HFG ݰFG ݰ%" ݰX)Im'F(G)* ݰ4 ֭ $H ݰ%HFFHGHG ݐ`R8`ͮͯ)` װ H` /ٰR(*؅IHHЍ@`[8W ؐeXW Y* YQ8`X*؅IFG ݐ`[[ p8D`F` ilH)HFȍHG ݰ$%X&Y!8* J8` Lע  )I '`8ZiFG`Z*؅IH3H [( [ )WxzȱHx`Z8eHI ٰSB0 ؠQFXʈ pٌz`z8mz0_`,|{0H {hi LٍxȽxhQ0GF{z8y`FaG ݰ ڰ`Q0{z Wڭ01 E8`1݊0 iڰ$Q0̩GF ݰ ڰ ڰ`12)1`0Q`ȎQi 0U`z)x8`x`Q ېW }װG =۰A)H Qʈh0)*FG'(`)P P8ʈ` ۰0)i `uv8`QR ܍\FG[ ݰNQFG ݰ< \0 FGLۮQ[0 GF8TU`H8` ܹ ,[F G 8\[` FG `QJJJJ`\HQ\hn)[N\jN\jN\jbN\.d WݰHi\ ݰ;\Qf ݰ*bNd[ ee`Z8` Wݰ#ddc c 5ݐ`bcG .G .G .G8d*JFd eeQFG`QJJJJi LWݩH8`Qf ݰQfe0 ݰ Q c`e ݰe`fQiygihB0Hf0gFhG ݪh0`שB*xEDr0C а(`(8`R@`M8`R8@hʈIR)Fk8FF lL|߹ LߠRC8`V)@ iR)Fl8FVzkJ l_ F Lr߹) +V&lJ(b .RFG/8` .lJHIH IL9߅FHGI ѭlJkjHIH;7IRJJ Zߐ3HIHIL|ߩJKJK`FHIG ߰( ߬RȢMjJLk)eKM`R)` J FJZk ߰$Z0 ߰ZJFJL8`JGBJ T RFG`BH TRFG`H RhHBF  GxDER0r0C а(`(8` L*J R :"L ݢH R : R9` א@ P8`RSB8` RJJJJ=) ) )Wв<J8` GR悔0FRZ $ ӭ+j ;ސHR  4Rh8` ߰Q R@`ZWSSZ (RS W )8`)i п`  H h)N$%Rjmkn LL⭚ L l L ;ް  0pnJo )@rNJOK ;ްiKKnnkk llIJo m nJФ̭lJkjHFIH rHIGrxKE а((H hH h8`8m@ȭn@L;ެR8NjNO 8q pjJLm`nRnʱLN.MOklMEKP/nMEKnLCL-qMp Okl,jpmeNNO(`JNKORL ;ް/  0P L8 | ZߠRJ`L@mȱ@nR `@Nȱ@OR`RjM}FIF` tJMF t 3 tJF` R` H  ^h)N@ N; L  ;ް$ )bJTU f۰ ) H BhL ) . )lJkjIGHIFHR  PLnEnʱNLMOklMEKP%nMEKnL2 Okl,jm PjeNNO P(` R  F .AlJFHIGHIR HIHI`  .` .AR HF HG IhHIhH  i ` ܰ ii` )0CGHFHBFG ЪhFhG`@5~R͔ M @BRi ׭~` .R 4#R0 iڮQ)`L@.~R Ri ~8`L Ӑ L~ Ӱ )ܹ0 )p )@ )  R0FG ݰ حFG ׬R234 / F) F ְR)f ݰ`H@h~`h`R`N8`  ) NRȢJ@jJjR@ʈLP 簞KIJHRȢjRjjk)lJn 8 ΄R  bH8R )ꭁJJJJR RȢjI ;ސh(8H Nh(`R@`@Rȱ@ ` אB@8ZTUQ qۮQUT?H>8T2hU3JJJJ)@` װ%I -=) t 0@)N8` @LL א=@ 5ȹQP8` &iQ` C0 5B C)yz( ȹ`y8myz8mz@8` װG8`F  װ P=)@N8`)@J 5yy)0F1G ݰy &밀L֢ȹLݠ@ȅH@ILҠ,|0` װJ WP8`TU fېH8,=)N 0 [01)@L` b讀 'ܰݩ ݰ L֬Qyy`O WݰI0F1G ݰ:%&N  ݰ# 'ܰFG ݐ`J HHR hh` 0 @ LFL q[̄T 0̄ȩF𸽒G ݰ 0` ݰFG ݐ ` ~ qͬ ݰFG ݐ` ~* q% L`FGLݮ 'ܰ8`FHGH] 'ܰ]hGhF`@Bɼ>K@J5 ]9X(K ]XXKR Ko`V8`no` & on ]I9XX`)HJJJh`OeNeO࿰ ]9XАO`@ȭ@` ON CNJKO`HHHHхhhhhIL@Ae P o**ӂӹ]|wKIJK,-NOPQRSuHUSTON!' @   !"#$Ԡ͠ˠĠԠLL`BLLТТТТТТТТТТТТТТТCOPR. APPLE,1983LM Mh@8nЍLЭ 0J @L:LLLՐ`BLڑL COPYRIGHT APPLE, 1983 h@ 0J @L:HUSTONP8H  ): e: y8鰕:Jjjj<)yi8i;i(*=>hP8`;Zx3QTTSRWVUHEVhEhH)IWHPHHHAHHHLaVEWLӿFGV*& .V  JJJJH :h Ei :EX`'8`jWC)p> pCYY 轊( ( BV ( p0 \BiJ @i> i'j:ZH i@ioZZH h ȭnWǥBJ 8X` +>*L o % YZoY 3 NZ`rZLkZq8r7IZiZkk 8 s q | kн Z)*>>` @ $(,048<@DHLPTX\`dh 0ުlptx| 0($ p,&"op8`kkV꽌ɪɖxl*k-kmMl 꽌ɪ`8` ZsDE8T8Wpq 7I꽌ɪ꽌ɭ蠪:VE:8`]V]H)]V])]T])] >8hUD` Y`> Hh݌(`HCJJJJ)*h`8L:HhHh VY>:Y)`;R?AJ;<ȰY)`Y?)`ȐҰ ;HhHh=`Hh `Hh`DEiȍ018V%&8V)HV)hH)hHIhդD?DRIDQD); ?JDQD]`MY pY)p  p` XʩXύX X A %  % ɍNH hɛɘɉɈ $ Lc :Lcې)ɮ۰ɺ'Ɲ Lc  : X i % $ɛ$ɘɉ ɈL :Lɍ)ې)ɮ۰ɺH h 'ĝL  LL L)'L L L'L  (L(L $ʩ $$ $L `ީ %  &@DEF   %LҠؠӠ΢ϠԩҠŠƠԠԠŠӢɯϠҠůȠԠĠ à TO ARCR :RADIUS :DEGREES LOCAL "STEP LOCAL "REM MAKE "STEP 2 * :RADIUS * 3.1416 / 36 MAKE "REM REMAINDER :DEGREES 10 REPEAT :DEGREES / 10 [RT 5 FD :STEP RT 5] IF :REM > 0 [FD :STEP * :REM / 10 RT :REM] END TO ARCL :RADIUS :DEGREES LOCAL "STEP LOCAL "REM MAKE "STEP 2 * :RADIUS * 3.1416 / 36 MAKE "REM REMAINDER :DEGREES 10 REPEAT :DEGREES / 10 [LT 5 FD :STEP LT 5] IF :REM > 0 [FD :STEP * :REM / 10 LT :REM] END TO CIRCLER :RADIUS LOCAL "STEP MAKE "STEP 2 * :RADIUS * 3.1416 / 36 REPEAT 36 [RT 5 FD :STEP RT 5] END TO CIRCLEL :RADIUS LOCAL "STEP MAKE "STEP 2 * :RADIUS * 3.1416 / 36 REPEAT 36 [LT 5 FD :STEP LT 5] END TO POLY :SIDE :ANGLE FD :SIDE RT :ANGLE POLY :SIDE :ANGLE END TO ABS :NUM OP IF :NUM < 0 [-:NUM] [:NUM] END TO CONVERT :N :FRBASE :TOBASE OP DEC.TO.ANYBASE ANYBASE.TO.DEC :N :FRBASE 1 :TOBASE END TO ANYBASE.TO.DEC :N :BASE :POWER IF EMPTYP :N [OP 0] OP (:POWER * C.TO.N LAST :N) + ANYBASE.TO.DEC BL :N :BASE :POWER * :BASE END TO DEC.TO.ANYBASE :N :BASE IF :N < :BASE [OP N.TO.C :N] OP WORD DEC.TO.ANYBASE INT QUOTIENT :N :BASE :BASE N.TO.C REMAINDER :N :BASE END TO C.TO.N :N IF NUMBERP :N [OP :N] OP (ASCII :N) - 55 END TO N.TO.C :N IF :N < 10 [OP :N] OP CHAR 55 + :N END TO DECTOHEX :N OP CONVERT :N 10 16 END TO HEXTODEC :N OP CONVERT :N 16 10 END TO DIVISORP :A :B OP 0 = REMAINDER :B :A END TO LOG :X OP .434294 * LN :X END TO LN :X LOCAL "RLIST IF :X < 0 [OP [CAN'T DO LOG OF NEGATIVE NUMBERS]] IF :X = 1 [OP 0] IF :X < 1 [MAKE "RLIST ROOT (1 / :X) 1 -1] [MAKE "RLIST ROOT :X 1 1] OP (FIRST BF :RLIST) * (LN1 FIRST :RLIST) / (LAST :RLIST) END TO ROOT :X :NPWR :CONST IF :X < 1.2 [OP (LIST :X :NPWR :CONST)] OP ROOT (SQRT :X) (2 * :NPWR) :CONST END TO LN1 :X MAKE "X (:X - 1) / (:X +1) OP 2 * (:X + (PWR :X 3) / 3 + ( PWR :X 5) / 5) END TO PWR :A :X IF AND (:A < 0) NOT (:X = INT :X) [PR (SE :A [TO POWER] :X [IS A COMPLEX NUMBER!]) STOP] IF OR :A = 1 :X = INT :X [OP INTPWR :A :X] OP EXP ((LN :A) * :X) END TO INTPWR :A :INTP IF OR :A = 1 :INTP = 0 [OP 1] IF :INTP < 0 [OP 1 / PWRLOOP (:A) (-:INTP)] OP PWRLOOP :A :INTP END TO PWRLOOP :A :INTP IF :INTP = 0 [OP 1] OP :A * PWRLOOP :A :INTP - 1 END TO EXP :X LOCAL "E MAKE "E 2.71828 IF (:X - INT :X) = 0 [OP INTPWR :E :X] OP (INTPWR :E INT :X) * (1 + EFRAC (:X - INT :X) 1 1) END TO EFRAC :FRAC :COUNT :TERM IF :COUNT > 9 [OP 0] MAKE "TERM :TERM * :FRAC / :COUNT OP :TERM + EFRAC :FRAC :COUNT + 1 :TERM END TO ; :COMMENT END TO FOREVER :INSTRUCTIONLIST RUN :INSTRUCTIONLIST FOREVER :INSTRUCTIONLIST END TO MAP :CMD :LIST IF EMPTYP :LIST [STOP] RUN LIST :CMD WORD "" FIRST :LIST MAP :CMD BF :LIST END TO SORT :ARG :LIST IF EMPTYP :ARG [OP :LIST] MAKE "LIST INSERT FIRST :ARG :LIST OP SORT BF :ARG :LIST END TO INSERT :A :L IF EMPTYP :L [OP ( LIST :A )] IF BEFOREP :A FIRST :L [OP FPUT :A :L] OP FPUT FIRST :L INSERT :A BF :L END TO WHILE :CONDITION :INSTRUCTIONLIST TEST RUN :CONDITION IFFALSE [STOP] RUN :INSTRUCTIONLIST WHILE :CONDITION :INSTRUCTIONLIST END TO DRIVE IF KEYP [LISTEN] FD 1 DRIVE END TO LISTEN MAKE "ANS RC IF :ANS = "S [THROW "TOPLEVEL] IF :ANS = "R [RT 10] IF :ANS = "L [LT 10] END TO TEACH LOCAL "THISLINE DEFINE "PROGRAM [[]] CLEARSCREEN GETLINES NAMEIT END TO GETLINES TYPE "?? MAKE "THISLINE READLIST IF :THISLINE = [END] [STOP] IF :THISLINE = [ERASE] [WIPEOUT] [IF (FIRST :THISLINE) = "TO [ ] [RUNSTORE]] GETLINES END TO WIPEOUT DEFINE "PROGRAM BUTLAST TEXT "PROGRAM CLEARSCREEN RUN [PROGRAM] END TO RUNSTORE CATCH "ERROR [RUN :THISLINE STORE STOP] PRINT FIRST BUTFIRST ERROR END TO STORE DEFINE "PROGRAM LPUT :THISLINE TEXT "PROGRAM END TO NAMEIT LOCAL "NAME PRINT [WHAT SHOULD I CALL THIS?] MAKE "NAME READLIST IF EMPTYP :NAME [ERASE "PROGRAM STOP] IF DEFINEDP FIRST :NAME [TRYAGAIN] [COPY] END TO TRYAGAIN PRINT SENTENCE FIRST :NAME [IS ALREADY DEFINED.] PRINT [] NAMEIT END TO COPY DEFINE FIRST :NAME TEXT "PROGRAM PRINT SENTENCE FIRST :NAME [DEFINED] ERASE "PROGRAM END TO CLEAROLD SETCURSOR [22 5] PR :B TYPE :BLANK SETCURSOR [22 7] PR :B TYPE :BLANK SETCURSOR [22 10] PR :B TYPE :BLANK END TO CLEARMSG TYPE.AT [0 15] :BLANK END TO SETUP .BLOAD "FORMAT.BIN 8192 CATCH "ERROR [LOADHELP "FORMAT.HELP] SETWIDTH 40 TYPE.AT [13 0] [Logo Formatter] SETCURSOR [0 1] REPEAT 39 [TYPE "=] SETCURSOR [0 22] REPEAT 39 [TYPE "-] TYPE.AT [5 5] [Slot Number:] TYPE.AT [5 7] [Drive:] TYPE.AT [5 10] [Volume Name:] TYPE.AT [0 23] ( WORD CHAR 193 "- "ESC CHAR 32 "quit, CHAR 32 CHAR 193 "- "? CHAR 32 "help ) MAKE "BLANK CHAR 32 REPEAT 38 [MAKE "BLANK WORD :BLANK CHAR 32] MAKE "B CHAR 32 REPEAT 16 [MAKE "B WORD :B CHAR 32] END TO GET.NAME SETCURSOR [22 10] MAKE "NAME UPPERCASE RW IF NOT VALIDPATH :NAME [NOTIFY [Bad Volume Name] OP GET.NAME] CLEARMSG OP :NAME END TO GET.DRIVE SETCURSOR [22 7] MAKE "DRIVE RW IF NOT MEMBERP :DRIVE [1 2] [NOTIFY [Bad Drive Number] OP GET.DRIVE] CLEARMSG OP :DRIVE END TO GET.SLOT SETCURSOR [22 5] MAKE "SLOT RW IF NOT MEMBERP :SLOT [1 2 3 4 5 6 7] [NOTIFY [Bad Slot Number] OP GET.SLOT] CLEARMSG OP :SLOT END TO NOTIFY :MSG TOOT 440 4 TYPE.AT [0 15] :MSG END TO GET.INPUTS MAKE "SLOT GET.SLOT MAKE "DRIVE GET.DRIVE MAKE "NAME GET.NAME END TO TYPE.AT :POS :MSG SETCURSOR :POS TYPE :MSG END TO .START LOCAL [SLOT DRIVE NAME] CLEAROLD GET.INPUTS MAKE "RESULT FORMAT :SLOT :DRIVE :NAME IF :RESULT > 10 [NOTIFY [Format Failed. Check drive and slot] GO "END] GO WORD "R :RESULT LABEL "R0 TYPE.AT [0 17] :BLANK TYPE.AT [0 18] :BLANK TYPE.AT [0 17] [Format Successful.] GO "END LABEL "R1 GO "END LABEL "R2 LABEL "R3 LABEL "R4 NOTIFY [Bad Slot, Drive or Volume Name.] LABEL "END .START END TO START LOCAL [BLANK B RESULT] CATCH "ERROR [SETUP .START] CT CATCH "ERROR [LOADHELP "MAIN.HELP] END TO .EXAMINESTR :LOC :LEN IF :LEN = 0 [OP "] LOCAL "K MAKE "K :LOC + 1 LOCAL "TEMP MAKE "TEMP CHAR .EXAMINE :LOC REPEAT :LEN - 1 [MAKE "TEMP WORD :TEMP CHAR .EXAMINE :K MAKE "K :K + 1] OP :TEMP END TO IS.CHAR :CH IF AND 64 < ASCII :CH 91 > ASCII :CH [OP "TRUE] OP "FALSE END TO BADCHAR :CH IF IS.CHAR :CH [OP "FALSE] IF MEMBERP :CH [0 1 2 3 4 5 6 7 8 9 .] [OP "FALSE] OP "TRUE END TO VALIDPATH :NAME IF 0 = COUNT :NAME [OP "FALSE] LOCAL "K MAKE "K 1 REPEAT COUNT :NAME [IF BADCHAR ITEM :K :NAME [OP "FALSE] [] MAKE "K :K + 1] OP IS.CHAR ITEM 1 :NAME END TO .DEPOSITSTR :LOC :NAME .DEPOSIT :LOC COUNT :NAME LOCAL "K MAKE "K 1 REPEAT COUNT :NAME [.DEPOSIT :LOC + :K ASCII ITEM :K :NAME MAKE "K :K + 1] END TO YES? :POS SETCURSOR :POS TYPE CHAR 32 TYPE CHAR 32 LOCAL "TEMP MAKE "TEMP UPPERCASE RW IF MEMBERP :TEMP [YES Y] [OP "TRUE] IF MEMBERP :TEMP [NO N] [OP "FALSE] PR [Please answer YES or NO.] OP YES? :POS END TO DESTROY? :NAME LOCAL "T SETCURSOR [0 17] PR [Do you really want to destroy] TYPE SE [the contents of] :NAME MAKE "T YES? CURSOR TYPE.AT [0 17] :BLANK TYPE.AT [0 18] :BLANK OP :T END TO FORMAT :S :D :NAME IF NOT MEMBERP :S [1 2 3 4 5 6 7] [OP 2] IF NOT MEMBERP :D [1 2] [OP 3] IF NOT VALIDPATH :NAME [OP 4] LOCAL "TEMP MAKE "TEMP OL :S :D IF NOT EMPTYP :TEMP [IF NOT DESTROY? :TEMP [OP 1]] .DEPOSITSTR 8201 :NAME .CALL 8195 OP .EXAMINE 8198 END TO OL :D :S .DEPOSIT 8199 ASCII FIRST ( WORD :D ) .DEPOSIT 8200 ASCII FIRST ( WORD :S ) .CALL 8192 OP .EXAMINESTR 8219 REMAINDER .EXAMINE 8218 16 END MAKE "STARTUP [START] LU Lk    )   1   ` ) ` 0 + *  ` 0 !  ` :% P J% `x :!(`+L!!'L!!i08` $%6%JJJJ6% "N$%`)p#%#%**LS!ׅکP$% #! :$Ld!өЭ %iԩѥѮ#% #!#%L! c$%L!%L! %L!"%%%%%L!#% j"#% "ѥ#H#% #!h` \I꽌ɪVɭսɖ0սɖ!ɖ 꽌ɪ\8`꽌ɪɖ۽*ݽ%ݙEۈзЮ꽌ɪФ`7%6%$%\8%$%9%86%7I$%i$%8%8% 8 #K$ :$9% #W$ :$8%н :$$%)* 7%7%` %݌HhHh # # # #V %꩖݌$ %݌ # # # # #`Hh݌`80^݌Hh $ $݌ -$ -$ -$ $ $ $EEHJНh ,$ -$ -$ -$`HJН݌h Hh݌`8`0($ p,&"!%֠Ls$Ԯ#% #L%#% .#ҥҭ"%%%&%8 % %Hh#% j"<ԥ%/8`#% j"#% "ع&%0 &%`%%8`"% %%#% j"%%8` % %$Lh$DEFAULT.NAME %%&)&%%&&12)ͳ&(8.2) % % % % & '%%`') ':% Ƚ;%):%ȭȩÑȩ'ȩ ' >&)<&Ȋ=&& &`%-&JJJ& &Hȱh & Hhh&&`BFG& &&&%C &`l&Hh`& &` ' & & &`<&)'<&)n=&j<&` &'<&=&=&j<&8iH' <&<&=& '=&=& 'h ' &RH '=& '<& '<& '=&h ' &` Ȋ8j`h8``' '` ' '``8'  `8L2C)pJJJJ IH(ȱH:=IH[H`@HcH  $ +   I/H`JLNGȄBȄF aK  haaFF  mJm# KKJ UJ )J ۈ) ;J3ȱJFȱJGJKaȄM  aaNNJFLGJL L? &PRODOS `DaElH$?EGvѶK+`L HHLy XP LM ŠϠĠӠS)*+,+`F)) (*=GJFjJJA QE'+ '== `@ STSP8QSS8 m P o R(8RLnSOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: xةw,@  ȱlmi8#)!) >dLԡm#i㰼m#iЕOLԡȱfg hi !dLԡ憦  Ljmkm l y`2 Lԡ8(Je稽)ʈ@LPRO ȩ'ȩ ' >&)<&Ȋ=&& &`%-&JJJ& &Hȱh & Hhh&&`BFG& &&&%C &`l&Hh`& &` ' & & &`<&)'<&)n=&j<&` &'<&=&=&j<&8iH' <&<&=& '=&=& 'h ' &RH '=& '<& '<& '=&h ' &` Ȋ8j`h8``' '` ' '``8'  `8L2C Formatting A Disk The slot number you enter must be between 1 and 7. The drive number you enter must be 1 or 2. The volume name must contain only numbers, letters, and periods. The name must start with a letter. Turtle Graphics Commands Command Example FORWARD (FD) FD 10 BACK (BK) BK 60 RIGHT (RT) RT 45 LEFT (LT) LT 130 SETPC pen color SETPC 2 SETBG background SETBG 5 SHOWTURTLE (ST) ST HIDETURTLE (HT) HT CLEARSCREEN (CS) CS PENUP (PU) PU PENDOWN (PD) PD PENERASE (PE) PE The ? prompt means you are at the top level. The > prompt means you are defining a procedure. -ESC returns you to top level. Defining a Procedure TO as in TO NAME begins the definition. END alone on a line ends the definition. Using the Editor EDIT "name or EDIT [list] EDITFILE "filename EDN "name or EDN [list] EDNS (EDit NameS) Special key -ESC Stops procedure and returns to top level CONTROL-L Full Graphics CONTROL-S Split Screen CONTROL-T Full Text CONTROL-W Pauses, waits until any key is pressed CONTROL-Z Executes a pause SAMPLESvO'  '$MENU O!IMENU.DATAO!I(MENU.DOCO!I,POLYSPI.PLUS qO!I,ADV.GRAPHICS O !I&MEMORY /O !IMEMORY.DOCIO !I*LOGO.SINGS2 O !I+MUSIC.INTROO !I*MUSIC.HELPO !I+TUNED.NOTESsO !I,SAMPLE.TUNESO !ITO SHOW.MENU SETWIDTH 40 LOCAL "DASH MAKE "DASH "_ REPEAT 38 [MAKE "DASH WORD :DASH "_] TY.AT [0 1] :DASH TY.AT [0 22] :DASH TY.AT [10 0] [LOGO SAMPLE PROGRAMS] TY.AT [0 20] [Type a number, or select with the UP or] TY.AT [0 21] [DOWN ARROW key. Then press RETURN.] END TO SHOW.20 SETCURSOR [0 2] REPEAT 20 [PR :BLANK] SETCURSOR [0 2] REPEAT 20 [PR RW] END TO R.LINES SETREAD :NAME SHOW.20 IF READPOS = FILELEN :NAME [SETREAD [] SETCURSOR [38 23] MAKE "CH RC STOP] SETREAD [] SETCURSOR [38 23] MAKE "CH RC IF :CH = CHAR 27 [STOP] R.LINES END TO READ.FILE :NAME LOCAL "CH CATCH "ERROR [OPEN :NAME R.LINES] SETREAD [] CLOSE :NAME END TO SHOW.FRAME TY.AT [0 1] :DASH TY.AT [0 22] :DASH END TO INTRO CT LOCAL "DASH MAKE "DASH "- REPEAT 38 [MAKE "DASH WORD :DASH "-] LOCAL "BLANK MAKE "BLANK CHAR 32 REPEAT 38 [MAKE "BLANK WORD :BLANK CHAR 32] SHOW.FRAME TY.AT [0 23] [RETURN TO CONTINE, ESC TO CANCEL] TY.AT [14 0] [INTRODUCTION] READ.FILE WORD :PREFIX "MENU.DOC END TO LOAD.DATA :F OPEN :F SETREAD :F LOCAL "K MAKE "K 1 REPEAT 7 [MAKE WORD "M. :K RW MAKE WORD "IM. :K RW MAKE "K :K + 1] SETREAD [] CLOSE :F END TO WAITKEY IF KEYP [STOP] WAITKEY END TO CLEARKEY :X IF KEYP [CLEARKEY RC] END TO READKEYS SETCURSOR FIRST ITEM :K + 1 :M.LIST TYPE THING WORD "I LAST ITEM :K + 1 :M.LIST WAITKEY MAKE "CH RC IF OR MEMBERP :CH [1 2 3 4 5 6 7] MEMBERP ASCII :CH [10 11] [SETCURSOR FIRST ITEM :K + 1 :M.LIST TYPE THING LAST ITEM :K + 1 :M.LIST] IF :CH = CHAR 13 [OP :K] IF :CH = CHAR 10 [MAKE "K :K + 1] IF :CH = CHAR 11 [MAKE "K :K - 1] IF MEMBERP :CH [1 2 3 4 5 6 7] [MAKE "K :CH] IF NOT OR MEMBERP :CH [1 2 3 4 5 6 7] MEMBERP ASCII :CH [13 10 11] [TOOT 200 10] IF :K < 1 [MAKE "K FIRST :M.LIST] IF :K > FIRST :M.LIST [MAKE "K 1] OP READKEYS END TO STARTUP2 IF NAMEP "F1.1 [] [LOAD.DATA "MENU.DATA] MAKE "M.LIST [7 [[5 4] M.1] [[5 6] M.2] [[5 8] M.3] [[5 10] M.4] [[5 12] M.5] [[5 14] M.6] [[5 16] M.7]] SETWIDTH 40 CLEARKEY 1 END TO DO.MENU :M.LIST :ITEM LOCAL "K MAKE "K 2 REPEAT FIRST :M.LIST [SETCURSOR FIRST ITEM :K :M.LIST TYPE THING LAST ITEM :K :M.LIST MAKE "K :K + 1] MAKE "K :ITEM LOCAL "CH OP READKEYS END TO MAIN.MENU SHOW.MENU MAKE "INUM DO.SOMETHING DO.MENU :M.LIST :INUM MAIN.MENU END TO TY.AT :LOC :OBJ SETCURSOR :LOC TYPE :OBJ END TO NOSAMPLE CT PR [I'm sorry, I can't find that file.] PR [Press RETURN.] MAKE "JUNK RL END TO CHECKRESTART UNBURYALL IF DEFINEDP "DO.MENU [STOP] SETWIDTH 40 PR [I can reload the menu or return] PR [directly to Logo. Reloading takes] PR [about 45 seconds.] PR [] TYPE SE [Do you want me to reload \(\Y/N\)?] CHAR 32 MAKE "T UPPERCASE RC IF OR ( :T = CHAR 27 ) ( :T = "N ) [THROW "BEGIN] CT PR [Please wait while I reload the menu.] LOAD "MENU STARTUP2 END TO RUN.PROG :NAME :TIME IF NOT FILEP :NAME [NOSAMPLE CHECKRESTART STOP] BURYALL RECYCLE CT TY.AT [0 5] ( SE [Loading] :NAME [...] ) TY.AT [3 7] ( SE [\(\about] :TIME [seconds\)] ) CATCH "ERROR [LOAD :NAME] CLOSEALL SETREAD [] SETWRITE [] ERALL CHECKRESTART END TO DO.SOMETHING :R IF :R = 1 [INTRO OP :R] IF :R = 2 [RUN.PROG "POLYSPI.PLUS 70 OP :R] IF :R = 3 [RUN.PROG "ADV.GRAPHICS 45 OP :R] IF :R = 4 [RUN.PROG "MEMORY 70 OP :R] IF :R = 5 [MAKE.ROOM RUN.PROG "LOGO.SINGS 150 OP :R] IF :R = 6 [RUN.PROG "MOUSE.QUIZ 140 OP :R] IF :R = 7 [THROW "BEGIN] END TO MAKE.ROOM UNBURYALL BURY [MAIN.MENU DO.SOMETHING MAKE.ROOM RUN.PROG CHECKRESTART NOSAMPLE TY.AT] BURYNAME [INUM PREFIX SP R] ERALL END TO STARTUP IF NOT DEFINEDP "MENU.STARTER [MAKE "INUM 1 MAKE "SP PREFIX MAKE "PREFIX PREFIX] STARTUP2 CATCH "BEGIN [MAIN.MENU] CT END MAKE "STARTUP [IF NOT NAMEP "INUM [STARTUP]] 1. Introduction 1. 2. Polyspi's and More 2. 3. Advanced Graphics 3. 4. Musical Memory Game 4. 5. Logo Sings 5. 6. Mouse Quiz 6. 7. Return to Logo 7. The sample programs on this disk demonstrate some of the capabilities of Logo and provide you with examples you might like to look at as you learn to create your own Logo programs. You'll find sample programs that do interesting graphic designs, allow you to play a simple imitation game, test your knowledge of mouse trivia, or turn your keyboard into a musical instrument and create your own tunes. After you become familiar with Logo, you may want to examine these programs to see how they work. From the top level, use the SETPREFIX command to set the prefix to the appropriate subdirectory, and then use LOAD. For example, to study the music program, you would use these commands: ?SETPREFIX "/LOGO/SAMPLES ?LOAD "LOGO.SINGS TO START CATCH "BEGIN [.GO] END TO Q? IF KEYP [ESC? RC] END TO .GO TS CT PO.EMBED Q? PO.PILE START2 END TO .POLY :SIZE :ANGLE :TOTALTURN IF NOT ( :TOTALTURN = 0 ) [IF 0 = REMAINDER :TOTALTURN 360 [STOP]] FD :SIZE RT :ANGLE .POLY :SIZE :ANGLE :TOTALTURN + :ANGLE END TO PENSET IF HEADING < 90 [SETPC 5 STOP] IF HEADING < 180 [SETPC 3 STOP] IF HEADING < 270 [SETPC 4 STOP] IF HEADING < 360 [SETPC 2 STOP] END TO ELLIPTICAL :A :B :SIZE :ANGLE :INC :FACTOR IF NOT :TOTALTURN < 360 [STOP] PU SETPOS SE :A * COS ( :FACTOR * HEADING ) :B * SIN ( :FACTOR * HEADING ) PD PENSET .POLY :SIZE :ANGLE 0 SETHEADING HEADING + :INC MAKE "TOTALTURN :TOTALTURN + :INC Q? ELLIPTICAL :A :B :SIZE :ANGLE :INC :FACTOR END TO CIRC :RADIUS :SIZE :ANGLE :INC :FACTOR IF NOT :TOTALTURN < 360 [STOP] PU SETPOS SE :RADIUS * COS ( :FACTOR * HEADING ) :RADIUS * SIN ( :FACTOR * HEADING ) PD PENSET .POLY :SIZE :ANGLE 0 SETHEADING HEADING + :INC MAKE "TOTALTURN :TOTALTURN + :INC Q? CIRC :RADIUS :SIZE :ANGLE :INC :FACTOR END TO PDCIRC :RADIUS :SIZE :ANGLE :INC :FACTOR :N IF :TOTALTURN > :N [STOP] SETPOS SE :RADIUS * COS ( :FACTOR * HEADING ) :RADIUS * SIN ( :FACTOR * HEADING ) PD PENSET SETHEADING HEADING + :INC MAKE "TOTALTURN :TOTALTURN + :INC Q? PDCIRC :RADIUS :SIZE :ANGLE :INC :FACTOR :N END TO SPOT PD DOT POS PU END TO POLYELL :SIZE :ANGLE :INC :A :B :FACTOR CS HT MAKE "TOTALTURN 0 ELLIPTICAL :A :B :SIZE :ANGLE :INC :FACTOR END TO POLYCIRC :SIZE :ANGLE :INC :RADIUS :FACTOR :N CS PU MAKE "TOTALTURN 0 PDCIRC :RADIUS :SIZE :ANGLE :INC :FACTOR :N PU HOME MAKE "TOTALTURN 0 Q? CIRC :RADIUS :SIZE :ANGLE :INC :FACTOR END TO .DOT :SIDE :TURN FORWARD :SIDE RIGHT :TURN CC SPOT IF OR XCOR > 100 YCOR > 100 [STOP] Q? .DOT :SIDE + 0.3 :TURN END TO PO.POLYSPI :X :Y PR.AT SE :X :Y [TO POLYSPI :SIDE :TURN :INC] PR.AT SE :X :Y + 1 [FD :SIDE RT :TURN] PR.AT SE :X :Y + 2 [POLYSPI :SIDE + :INC :TURN :INC] PR.AT SE :X :Y + 3 [END] END TO CC SETPC FIRST :PC MAKE "PC LPUT FIRST :PC BF :PC END TO PILE :SIDE :TURN IF :SIDE < 10 [STOP] CC POLY :SIDE :TURN HEADING PU FD :SIDE / 2 RT :TURN / 2 PD Q? PILE :SIDE * COS ( :TURN / 2 ) :TURN END TO START3 FS HT CS POLYCIRC 40 90 5 65 1 360 Q? WAIT 150 Q? CS CLEARTEXT FULLSCREEN POLYELL 100 180 6 12 12 -2 Q? WAIT 150 Q? CS POLYELL 70 180 3 14 5 4 Q? WAIT 150 END TO SPIDOT :TURN LOCAL "PC MAKE "PC [2 3 4 5] PU .DOT 1 :TURN END TO PATTERN REPEAT 6 [POLYSPI 60 60 -2 30 PU SETPOS [0 0] PD RT 60] END TO POLYSPI :FD :RT :INC :N IF :N = 0 [STOP] FD :FD RT :RT CC Q? POLYSPI :FD + :INC :RT :INC :N - 1 END TO PO.SPI CLEARTEXT TEXTSCREEN PR.AT [1 5] [Spirals are extensions of polygons.] PR.AT [1 7] [The POLY procedure is changed so that] PR.AT [1 9] [the side increases every time the] PR.AT [1 11] [procedure is repeated:] PO.POLYSPI 5 14 PR.AT [1 20] [Press RETURN to continue, ESC to quit.] WAIT.FOR.READING END TO START2 PO.SPI CS FS ST LOCAL "PC MAKE "PC [2 3 4 5] POLYSPI 5 90 3 50 HT Q? WAIT 150 Q? CS ST POLYSPI 5 87 3 50 HT Q? WAIT 150 Q? CS ST POLYSPI 5 123 3 60 HT Q? WAIT 150 Q? CS ST POLYSPI 5 60 1 100 HT Q? WAIT 150 Q? CS ST PATTERN HT Q? WAIT 150 Q? CS ST SPIDOT 20 HT Q? WAIT 150 Q? CS ST SPIDOT 45 HT CS Q? WAIT 150 Q? START3 END TO ESC? :K IF :K = CHAR 27 [THROW "BEGIN] END TO POLYPILE :SIDE :TURN FS LOCAL "FD MAKE "PC [2 3 4 5] MAKE "FD :SIDE / 2 / SIN ( :TURN / 2 ) PU FD :FD RT 90 + :TURN / 2 PD PILE :SIDE :TURN END TO PO.PILE CS ST POLYPILE 150 90 HT Q? WAIT 150 Q? CS ST POLYPILE 110 60 HT Q? WAIT 150 Q? CS POLYPILE 70 45 Q? WAIT 150 Q? END TO PO.POLY PR.AT [5 4] [TO POLY :SIDE :ANGLE :HEAD] PR.AT [5 5] [FD :SIDE RT :ANGLE] PR.AT [5 6] [IF HEADING = "HEAD [STOP]] PR.AT [5 7] [POLY :SIDE :ANGLE :HEAD] PR.AT [5 8] [END] END TO POLY :FD :RT :HD FD :FD RT :RT IF HEADING = :HD [STOP] POLY :FD :RT :HD END TO PR.AT :XY :IT SETCURSOR :XY TYPE :IT END TO PO.EMBED CLEARTEXT TEXTSCREEN PR.AT [0 2] [By using the POLY procedure] PO.POLY PR.AT [0 11] [polygons can be embedded in polygons] PR.AT [0 13] [and rotated for interesting effects.] PR.AT [0 16] [Press RETURN to continue.] PR.AT [0 17] [You can press ESC to quit at any time.] WAIT.FOR.READING END TO WAIT.FOR.READING REPEAT 90 [WAIT 30 IF KEYP [ESC? RC STOP]] END MAKE "STARTUP [START] TO MATH CS FS ST AX IF KEYP [ESC? RC] SETPC 4 HT SINC 0 -100 PU IF KEYP [ESC? RC] LT 90 BK 15 .SIN IF KEYP [ESC? RC] SETPC 5 COSC 0 -100 PU IF KEYP [ESC? RC] SETPOS [100 95] .COS END TO AX PU .LF 100 RT 90 PD SETPC 1 FD 100 BK 200 FD 100 RT 90 FD 200 PU END TO SINC :ANG :Z IF :ANG > 360 [STOP] PD DOT LIST :Z + :ANG / 2 100 * SIN :ANG IF KEYP [ESC? RC] SINC :ANG + 2 :Z END TO .SIN RT 90 .S FD 4 RT 90 PD FD 10 PU .LF 4 PD .LF 10 RT 150 FD 10 / COS 30 LT 150 FD 10 END TO COSC :ANG :Z IF :ANG > 360 [STOP] DOT LIST :Z + :ANG / 2 100 * COS :ANG IF KEYP [ESC? RC] COSC :ANG + 2 :Z END TO .COS LT 90 .C FD 4 .C PD .LF 10 PU .LF 9 .S END TO .S PD REPEAT 2 [FD 5 LT 90] FD 5 REPEAT 2 [RT 90 FD 5] PU END TO .LF :D LT 90 FD :D END TO .C PD REPEAT 2 [FD 5 .LF 5] PU END TO VLIN :B :T :X PU SETPOS SE :X :B PD SETPOS SE :X :T END TO PAINT :L :R :B :T IF KEYP [ESC? RC] IF 0 < RANDOM 5 [STOP] SETPC ( 4 + RANDOM 2 ) REPEAT ( :R - :L + 1 ) / 2 [VLIN :B :T :L MAKE "L :L + 2] SETPC 0 END TO HORIZONTAL :L :R :B :T IF KEYP [ESC? RC] LOCAL "MID IF ( :T - :B ) < :MIN [PAINT :L :R :B :T STOP] MAKE "MID :B + RANDOM ( :T - :B + 1 ) HLIN :L :R :MID VERTICAL :L :R :B :MID - 1 VERTICAL :L :R :MID + 1 :T END TO HLIN :L :R :Y PU SETPOS SE :L :Y PD SETPOS SE :R :Y END TO VERTICAL :L :R :B :T IF KEYP [ESC? RC] LOCAL "MID IF ( :R - :L ) < :MIN [PAINT :L :R :B :T STOP] MAKE "MID :L + RANDOM ( :R - :L + 1 ) VLIN :B :T :MID HORIZONTAL :L :MID - 1 :B :T HORIZONTAL :MID + 1 :R :B :T END TO MONDRIAN :MIN CS HT SETBG 1 SETPC 0 VERTICAL -139 139 -119 119 END TO painting TEXTSCREEN CLEARTEXT PR.AT [4 5] [The Mondrian program creates] PR.AT [4 7] [random "paintings" that are] PR.AT [4 9] [partly controlled by a variable.] PR.AT [1 18] [Press RETURN to continue, ESC to quit.] Q? CT SS PR.AT [12 23] [MONDRIAN 55] MONDRIAN 55 IF KEYP [ESC? RC] WAIT 200 IF KEYP [ESC? RC] PR.AT [12 23] [MONDRIAN 25] MONDRIAN 25 IF KEYP [ESC? RC] WAIT 200 IF KEYP [ESC? RC] SETBG 6 WAIT 100 END TO START CATCH "BEGIN [.START] END TO Q? REPEAT 40 [WAIT 30 IF KEYP [ESC? RC STOP]] END TO .START TEXTSCREEN CLEARTEXT PR.AT [0 5] [You will now see two examples of fairly] PR.AT [0 7] [advanced turtle graphics:] PR.AT [6 10] [A math function plotting program] PR.AT [6 12] [An "intelligent" painting program] PR.AT [0 18] [Press RETURN to continue, ESC to quit.] Q? MATH IF KEYP [ESC? RC] WAIT 100 IF KEYP [ESC? RC] PAINTING END TO ESC? :K IF :K = CHAR 27 [THROW "BEGIN] END TO PR.AT :XY :IT SETCURSOR :XY TYPE :IT END MAKE "STARTUP [START] TO START LOCAL "ALREADY CATCH "BEGIN [.START] CT END TO .START TS CT POFILE "MEMORY.DOC PR.AT [6 21] [Press RETURN to begin or] TY.AT [12 22] [ESC to quit.] TEST RC.RAN = CHAR 27 CT IFTRUE [STOP] IF NOT NAMEP "K.1 [SETDATA] INIT GAME END TO RC.RAN IF KEYP [OP RC] MAKE "J RANDOM 100 OP RC.RAN END TO YESNO PR [Please answer YES or NO.] END TO ASK :MESSAGE :LOC SETCURSOR :LOC TYPE SE :MESSAGE CHAR 32 LOCAL "ANS MAKE "ANS RL IF EMPTYP :ANS [YESNO OP ASK :MESSAGE :LOC] IF NOT MEMBERP UPPERCASE FIRST :ANS [YES Y NO N] [YESNO OP ASK :MESSAGE :LOC] OP "Y = UPPERCASE FIRST FIRST :ANS END TO ESC? :K IF :K = CHAR 27 [THROW "BEGIN] END TO PR.AT :P :X SETCURSOR :P TYPE :X END TO TY.AT :P :X SETCURSOR :P TYPE :X END TO DO.HELP CT POFILE "MEMORY.DOC TY.AT [0 21] [Press RETURN to continue.] MAKE "JUNK RC MAKE "ALREADY "FALSE MAKE "DID.H "TRUE END TO INIT MAKE "ALREADY "FALSE MAKE "DID.H "FALSE MAKE "HIGH.K (WORD CHAR 32 + 128 CHAR 32 + 128 CHAR 32 + 128) MAKE "NORM.K (WORD CHAR 32 CHAR 32 CHAR 32 ) MAKE "HIGH.M (WORD :HIGH.K :HIGH.K CHAR 32 + 128) MAKE "NORM.M (WORD :NORM.K :NORM.K CHAR 32) MAKE "9 1046.29 MAKE "8 987.749 MAKE "7 880 MAKE "6 783.969 MAKE "5 698.439 MAKE "4 659.239 MAKE "3 587.309 MAKE "2 523.209 MAKE "1 493.862 END TO GAME GEN.PLAYLIST WAIT 70 PGAME 1 0 AGAIN GAME END TO SORRY :ERRORS :COUNT TOOT 100 20 MAKE "OK "FALSE RECYCLE END TO GEN.PLAYLIST MAKE "PLAYLIST [] REPEAT 30 [MAKE "PLAYLIST FPUT 1 + RANDOM 9 :PLAYLIST] END TO PGAME :TIMES :ERRORS MAKE "DID.H "FALSE IF :ERRORS = 3 [STOP] SETDISPLAY MAKE "OK "TRUE MYTURN YOURTURN IF :DID.H [MAKE "TIMES :TIMES - 1] IF OK [PGAME :TIMES + 1 :ERRORS] [PGAME :TIMES :ERRORS + 1] END TO AGAIN IF KEYP [CBUFF RC] SETCURSOR [0 18] IF NOT ASK [One more time \(\Y\/\N\)?] CURSOR [THROW "BEGIN] MAKE "ALREADY "FALSE END TO CBUFF :K IF KEYP [CBUFF RC] END TO CHECK :KEY :COUNT :ERRORS IF NOT ( ITEM :COUNT :PLAYLIST ) = :KEY [SORRY :ERRORS + 1 :COUNT] END TO OK OP :OK END TO KEYPLAY :KEY :COUNT :TIMES :ERRORS IF :KEY = CHAR 27 [THROW "BEGIN] IF OR :KEY = CHAR 128 + ASCII "? :KEY = CHAR 128 + ASCII "/ [DO.HELP STOP] IF NUMBERP :KEY [IF :KEY > 0 [PLAY :KEY] [MAKE "OK "FALSE]] [MAKE "OK "FALSE] CHECK :KEY :COUNT :ERRORS IF :COUNT = :TIMES [STOP] IF OK [KEYPLAY HIDDEN.RC :COUNT + 1 :TIMES :ERRORS] END TO PLAY :KEY HIGHLIGHT :KEY TOOT THING :KEY 15 NORMAL :KEY END TO LISTPLAY :COUNT :TIMES PLAY ITEM :COUNT :PLAYLIST IF :COUNT = :TIMES [STOP] LISTPLAY :COUNT + 1 :TIMES END TO HIGHLIGHT :KEY MAKE "X (:KEY - 1) * 4 + 2 TY.AT SE :X 10 :HIGH.K TY.AT SE :X 11 :HIGH.K TY.AT SE :X 12 :HIGH.K TY.AT SE :X + 1 11 CHAR 128 + ASCII :KEY END TO NORMAL :KEY MAKE "X (:KEY - 1) * 4 + 2 TY.AT SE :X 10 :NORM.K TY.AT SE :X 11 :NORM.K TY.AT SE :X 12 "___ TY.AT SE :X + 1 11 :KEY END TO MYTURN CHECKMYTURN SHOWDATA LISTPLAY 1 :TIMES END TO YOURTURN CHECKYOURTURN CBUFF 0 KEYPLAY HIDDEN.RC 1 :TIMES :ERRORS IF OK [WAIT 20] END TO WAITKEY IF KEYP [STOP] WAITKEY END TO HIDDEN.RC WAITKEY OP RC END TO CHECKMYTURN TY.AT [13 7] "_ TY.AT [13 5] "X END TO CHECKYOURTURN TY.AT [13 5] "_ TY.AT [13 7] "X END TO SHOWDATA TY.AT [37 5] :TIMES TY.AT [37 7] :ERRORS END TO SETDISPLAY IF :ALREADY [STOP] CT MAKE "K 0 REPEAT 23 [PR THING WORD "K. :K MAKE "K :K + 1] MAKE "ALREADY "TRUE END TO REP :K :CH LOCAL "T MAKE "T :CH REPEAT :K - 1 [MAKE "T WORD :T :CH] OP :T END TO SETDATA MAKE "K.0 WORD REP 12 CHAR 32 "MUSICAL\ MEMORIES MAKE "K.1 REP 39 "= MAKE "K.2 " MAKE "K.3 " MAKE "K.4 WORD REP 13 CHAR 32 "__ MAKE "K.5 (WORD REP 2 CHAR 32 "My\ Turn\ \ \ |__| rep 4 char 32 "Notes\ To\ Play:) MAKE "K.6 :K.4 MAKE "K.7 (WORD REP 2 CHAR 32 "Your\ Turn\ |__| rep 4 char 32 "Errors:) MAKE "K.8 " MAKE "K.9 WORD REP 2 CHAR 32 REP 9 WORD "___ CHAR 32 MAKE "K.10 (WORD CHAR 32 "| REP 9 (WORD CHAR 32 CHAR 32 CHAR 32 "|) MAKE "K.11 (WORD CHAR 32 "|\ 1\ |\ 2\ |\ 3\ |\ 4\ |\ 5\ |\ 6\ |\ 7\ |\ 8\ |\ 9\ | MAKE "K.12 WORD CHAR 32 "|___|___|___|___|___|___|___|___|___| MAKE "K.13 " MAKE "K.14 " MAKE "K.15 " MAKE "K.16 " MAKE "K.17 " MAKE "K.18 " MAKE "K.19 " MAKE "K.20 " MAKE "K.21 REP 39 "- MAKE "K.22 (WORD "ESC\ quit, CHAR 32 CHAR 193 "- "?\ help) END MAKE "STARTUP [START] MUSICAL MEMORY GAME This is a game in which I play a note, or a sequence of notes, and you repeat them. Each time you respond correctly, the sequence becomes longer. The screen shows numbered boxes that represent the number keys on the keyboard. To play the notes just press the number keys on your keyboard. TO TY.AT :P :M SETCURSOR :P TYPE :M END TO PR.AT :P :M SETCURSOR :P PR :M END TO GENERALREAD :GROUP :SUFFIX IF NOT MEMBERP CHAR :TEMP :VALID.NOTES [OP SPECIALCASE] IF :RECORDING = "FALSE [OP ITEM :TEMP THING WORD :GROUP ".NOTES] MAKE "TUNE.SYMBOLS SE :TUNE.SYMBOLS ( WORD :X ITEM :TEMP :SYMBOLS :SUFFIX ) MAKE "TUNE.FREQ SE :TUNE.FREQ SE ITEM :TEMP THING WORD :GROUP ".NOTES :X SHOWNOTE LAST :TUNE.SYMBOLS OP LAST BL :TUNE.FREQ END TO CENTER :LIST LOCAL "WORD MAKE "WORD FIRST :LIST MAKE "LIST BF :LIST REPEAT COUNT :LIST [MAKE "WORD ( WORD :WORD CHAR 32 FIRST :LIST ) MAKE "LIST BF :LIST] TY.AT SE INTQUOTIENT ( 40 - COUNT :WORD ) 2 0 :WORD END TO RECORDSCREEN CT SHOW.FRAME TY.AT [12 0] [Play and Record] PR.AT [0 3] [Play from the keyboard, and your notes] PR [will be recorded.] TY.AT [0 23] [ESC to menu, P plays tune, DELETE note] TY.AT [0 7] SE [Your tune:] CHAR 32 TYPE :TUNE.SYMBOLS IF ( COUNT :TUNE.SYMBOLS ) > 0 [TYPE CHAR 32] END TO CLEARLINE PR :BLANK END TO SHOW.20 SETCURSOR [0 2] REPEAT 20 [CLEARLINE] SETCURSOR [0 2] REPEAT 20 [PR RW] END TO READ.THE.LINES SETREAD :NAME SHOW.20 IF READPOS = FILELEN :NAME [SETREAD [] SETCURSOR [38 23] MAKE "CH RC STOP] SETREAD [] SETCURSOR [38 23] MAKE "CH RC IF :CH = CHAR 27 [STOP] READ.THE.LINES END TO LOADNAMES1 IF READPOS = FILELEN :NAME [STOP] LOCAL "NEWNAME MAKE "NEWNAME FIRST RL IF NAMEP WORD :NEWNAME ".SYMBOLS [MAKE "NEWNAME RL MAKE "NEWNAME RL LOADNAMES1 STOP] IF NAMEP WORD :NEWNAME ".FREQ [MAKE "NEWNAME RL MAKE "NEWNAME RL LOADNAMES1 STOP] IF NOT MEMBERP :NEWNAME :TUNE.LIST [MAKE "TUNE.LIST SE :TUNE.LIST :NEWNAME] MAKE WORD :NEWNAME ".SYMBOLS RL MAKE WORD :NEWNAME ".FREQ RL LOADNAMES1 END TO SAVETUNES :TUNE.LIST IF EMPTYP :TUNE.LIST [STOP] PR FIRST :TUNE.LIST PR THING WORD FIRST :TUNE.LIST ".SYMBOLS PR THING WORD FIRST :TUNE.LIST ".FREQ SAVETUNES BF :TUNE.LIST END TO LOADNAMES CATCH "ERROR [LOADNAMES1 STOP] END TO MUSIC.SAVE :NAME IF FILEP :NAME [SHOWERROR [FILE ALREADY EXISTS] STOP] SETCURSOR [0 8] CLEARLINE SETCURSOR [0 8] TYPE [SAVING...] OPEN :NAME SETWRITE :NAME PR [MUSIC.DATA] SAVETUNES :TUNE.LIST SETWRITE [] CLOSE :NAME SETCURSOR [0 10] SHOWERROR [Tunes saved.] END TO WHATFILE TY.AT [0 8] [WHAT FILE?] TYPE CHAR 32 OP FIRST RL END TO MUSIC.LOAD :NAME IF NOT FILEP :NAME [SHOWERROR [FILE DOES NOT EXIST] STOP] SETCURSOR [0 8] CLEARLINE TY.AT [0 8] [Loading...] OPEN :NAME SETREAD :NAME IF NOT EQUALP [MUSIC.DATA] RL [CLOSE :NAME SETREAD [] SHOWERROR [NOT A MUSIC DATA FILE] STOP] LOADNAMES SETREAD [] CLOSE :NAME SETCURSOR [0 10] SHOWERROR SE :NAME [loaded.] END TO LOAD.SAMPLES CT SHOW.FRAME TY.AT [0 23] :BLANK CENTER [Loading Samples] MUSIC.LOAD "SAMPLE.TUNES END TO PLAY2 CT SHOW.FRAME CENTER [Playing Tunes] TY.AT [0 23] [RETURN to menu] SETCURSOR [0 5] IF EMPTYP :TUNE.LIST [SHOWERROR [There are no tunes in memory.] STOP] TYPE [The current tunes are] TY.AT [0 7] :TUNE.LIST PR.AT [0 18] [Which tune do you want to play?] LOCAL "TEMP MAKE "TEMP UPPERCASE FIRST RL IF NOT MEMBERP :TEMP :TUNE.LIST [SHOWERROR [That tune is not in the list.] PLAY2 STOP] PLAYCON THING WORD :TEMP ".FREQ PLAY2 END TO RECORD1 CT SHOW.FRAME CENTER [Recording and Changing Tunes] TY.AT [8 23] [, RETURN to exit] TY.AT [0 5] [The current tunes are] TY.AT [0 7] :TUNE.LIST IF EMPTYP :TUNE.LIST [TYPE [There are no tunes in memory.]] PR.AT [0 14] [Create a new tune by typing a name] PR [not in the list. Change a tune by ] PR [typing a name in the list.] TY.AT [0 18] (SE [Which one to record?] CHAR 32) LOCAL "TEMP MAKE "TEMP UPPERCASE FIRST RL IF NOT MEMBERP :TEMP :TUNE.LIST [MAKE "TUNE.LIST SE :TUNE.LIST :TEMP MAKE WORD :TEMP ".SYMBOLS [] MAKE WORD :TEMP ".FREQ [] MAKE "CURRENT.TUNE :TEMP MAKE "TUNE.SYMBOLS THING WORD :CURRENT.TUNE ".SYMBOLS MAKE "TUNE.FREQ THING WORD :CURRENT.TUNE ".FREQ RECORD2 END TO LOAD.SAVE1 CT SHOW.FRAME TY.AT [0 23] :BLANK CENTER [Load/Save Tunes] TY.AT [0 6] [Do you want to load or save \(\L/S\)\?] TYPE CHAR 32 LOCAL "TEMP MAKE "TEMP UPPERCASE FIRST RL IF :TEMP = "L [MUSIC.LOAD WHATFILE STOP] IF :TEMP = "S [MUSIC.SAVE WHATFILE STOP] SHOWERROR [Please enter L or S.] END TO PLAY1 CT SHOW.FRAME CENTER [Play Without Recording] TY.AT [0 23] [ESC to menu] PR.AT [0 5] [Play From the Keyboard] MAKE "RECORDING "FALSE CATCH "RETURN [TYPE.MUSIC] END TO ALL.BUT :LIST :OBJ LOCAL "NEWLIST MAKE "NEWLIST [] REPEAT COUNT :LIST [IF EQUALP :OBJ ( FIRST :LIST ) [] [MAKE "NEWLIST SE :NEWLIST FIRST :LIST] MAKE "LIST BF :LIST] OP :NEWLIST END TO ERASE.TUNES1 CT SHOW.FRAME CENTER [Erase Tunes] TY.AT [0 23] [RETURN to menu] SETCURSOR [0 5] IF EMPTYP :TUNE.LIST [SHOWERROR [There are no tunes to erase.] STOP] TYPE [The current tunes are] TY.AT [0 7] :TUNE.LIST PR.AT [0 18] [Which tune do you want to erase?] LOCAL "TEMP MAKE "TEMP UPPERCASE FIRST RL IF NOT MEMBERP :TEMP :TUNE.LIST [SHOWERROR [That tune is not in the list.] ERASE.TUNES1 STOP] MAKE "TUNE.LIST ALL.BUT :TUNE.LIST :TEMP ERN WORD :TEMP ".SYMBOLS ERN WORD :TEMP ".FREQ END TO READ.FILE :NAME LOCAL "CH CATCH "ERROR [OPEN :NAME READ.THE.LINES] SETREAD [] CLOSE :NAME END TO INTRO1 CT SHOW.FRAME TY.AT [0 23] [RETURN to continue, ESC to menu] CENTER [Introduction] READ.FILE "MUSIC.INTRO END TO SHOWERROR :LIST PR [] LOCAL "TEMP MAKE "TEMP CURSOR PR :LIST TYPE [Press RETURN] LOCAL "JUNK MAKE "JUNK RL SETCURSOR :TEMP CLEARLINE CLEARLINE END TO SHOW.FRAME TY.AT [0 1] :DASH TY.AT [0 22] :DASH TY.AT [0 23] CHAR 193 (TYPE "- "? CHAR 32 "HELP) END TO DO :C IF :C = 1 [INTRO1 STOP] IF :C = 2 [PLAY1 STOP] IF :C = 3 [RECORD1 STOP] IF :C = 4 [ERASE.TUNES1 STOP] IF :C = 5 [PLAY2] IF :C = 6 [LOAD.SAVE1 STOP] IF :C = 7 [CHANGEDUR STOP] IF :C = 8 [LOAD.SAMPLES STOP] IF :C = 9 [THROW "THEEND] END TO SHOW.MENU SETWIDTH 40 SHOW.FRAME TY.AT [15 0] [Logo Sings] TY.AT [7 3] [1\.\ Introduction] TY.AT [7 5] [2\.\ Play] TY.AT [7 7] [3\.\ Record or Change Tune] TY.AT [7 9] [4\.\ Erase Existing Tune] TY.AT [7 11] [5\.\ Play Existing Tune] TY.AT [7 13] [6\.\ Load/Save Tunes to Disk] TY.AT [7 15] [7\.\ Change Common Duration] TY.AT [7 17] [8\.\ Load Samples] TY.AT [7 19] [9\.\ Quit] TY.AT [0 21] SE [Type your choice and press RETURN] CHAR 32 CATCH "ERROR [DO FIRST RL] SHOW.MENU END TO RECORD2 RECORDSCREEN MAKE "RECORDING "TRUE CATCH "RETURN [TYPE.MUSIC] MAKE WORD :CURRENT.TUNE ".SYMBOLS :TUNE.SYMBOLS MAKE WORD :CURRENT.TUNE ".FREQ :TUNE.FREQ END TO CHANGEDUR CT SHOW.FRAME CENTER [Change Duration] TY.AT [0 23] [RETURN to menu] PR.AT [0 4] SE [The duration is currently] :DUR TY.AT [0 6] SE [Enter your new duration] CHAR 32 MAKE "DUR FIRST RL END TO TYPE.MUSIC CATCH "ERROR [TYPE.NOTES] TYPE.MUSIC END TO TYPE.NOTES IF KEYP [PLAYIT] TYPE.NOTES END TO PLAYIT IF BUTTONP 0 [TOOT FLATREAD :DUR * :X STOP] IF BUTTONP 1 [TOOT SHARPREAD :DUR * :X STOP] TOOT NATURALREAD :DUR * :X END TO PLAYCON :NOTES IF EMPTYP :NOTES [STOP] TOOT FIRST :NOTES :DUR * FIRST BF :NOTES PLAYCON BF BF :NOTES END TO DELETELAST MAKE "TUNE.FREQ BL BL :TUNE.FREQ MAKE "TUNE.SYMBOLS BL :TUNE.SYMBOLS RECORDSCREEN OP 0 END TO NATURALREAD LOCAL "TEMP MAKE "TEMP ASCII RC OP GENERALREAD "NATURAL " END TO SHARPREAD LOCAL "TEMP MAKE "TEMP ( ASCII RC ) - 128 OP GENERALREAD "SHARP "# END TO SHOWNOTE :NOTE TYPE :NOTE TYPE CHAR 32 END TO SPECIALCASE IF MEMBERP CHAR :TEMP [1 2 3 4 5 6 7 8 9] [MAKE "X :TEMP - ASCII "0] IF :TEMP = 27 [THROW "RETURN] IF :RECORDING = "FALSE [OP 0] IF :TEMP = 127 [OP DELETELAST] IF OR :TEMP = ASCII "P :TEMP = ASCII "p [PLAYCON :TUNE.FREQ] OP 0 END TO FLATREAD LOCAL "TEMP MAKE "TEMP ( ASCII RC ) - 128 OP GENERALREAD "FLAT "% END TO RUN.MUSIC LOCAL "DUR LOCAL "RECORDING LOCAL "X LOCAL "TUNE.FREQ LOCAL "TUNE.SYMBOLS LOCAL "TUNE.LIST LOCAL "DASH LOCAL "BLANK STARTUP LOADHELP "MUSIC.HELP MAKE "DASH "- REPEAT 38 [MAKE "DASH WORD :DASH "-] MAKE "BLANK CHAR 32 REPEAT 38 [MAKE "BLANK WORD :BLANK CHAR 32] MAKE "RECORDING "FALSE MAKE "X 1 MAKE "DUR 5 MAKE "TUNE.FREQ [] MAKE "TUNE.SYMBOLS [] MAKE "TUNE.LIST [] CATCH "THEEND [SHOW.MENU] CATCH "ERROR [LOADHELP WORD :SP "MAIN.HELP] END TO STARTUP MAKE "MUSIC.DATA [SYMBOLS NATURAL.NOTES FLAT.NOTES SHARP.NOTES VALID.NOTES MUSIC.DATA] MAKE "VALID.NOTES SE [z x c v b n m , a s d f g h j k q w e r t y u i Z X C V B N M < A S D F G H J K Q W E R T Y U I] CHAR 32 END MAKE "STARTUP [LOAD "TUNED.NOTES RUN.MUSIC] This program lets you compose and play music. The Apple's keyboard becomes a musical keyboard, and the notes you play can be recorded, saved, and played again. Middle-C is played with a capital "Z" and symbolized by "C." The whole octave is as follows: Note: C D E F G A B CC Key: Z X C V B N M < The next octave is as follows: Note: CC DD EE FF GG AA BB CCC Key: A S D F G H J K The highest octave is as follows: Note: CCC DDD EEE FFF GGG AAA BBB CCCC Key: Q W E R T Y U I The low notes are symbolized and played by lowercase letters. The octave below middle-C is as follows: Note: cc dd ee ff gg aa bb C Key: q w e r t y u i The next octave is as follows: Note: ccc ddd eee fff ggg aaa bbb cc Key: a s d f g h j k The lowest octave is as follows: Note: cccc dddd eeee ffff gggg Key: z x c v b aaaa bbbb ccc n m , The notes you play are stored in tunes which can be named and kept in memory, or saved on disk for furture use. You can play sharps and flats by holding down one of the Apple keys as you play. Pressing OPEN APPLE makes the note flat; pressing SOLID APPLE makes the note sharp. A pound sign (#) after a symbol indicates that the note is a sharp. A percent sign (%) after a note indicates that the note is a flat. Each note is played for a multiple of the common duration. Exactly what multiple depends on the number displayed before the symbol. The number keys (1 through 9) change the current multiple. To play a note twice as long, press the 2 key before you press the key for the note. You can put a rest in your tune using the SPACE bar. The rest is symbolized by an "R." The duration of rests can be modified the same way the duration of notes is modified. You can get a summary of this introduction by asking for help (OPEN APPLE-?). Middle-C is played with a capital "Z" and symbolized by "C." The whole octave is as follows: Note: C D E F G A B CC Key: Z X C V B N M > The next octave is as follows: Note: CC DD EE FF GG AA BB CCC Key: A S D F G H J K The highest octave is as follows: Note: CCC DDD EEE FFF GGG AAA BBB CCCC Key: Q W E R T Y U I The low notes are symbolized and played by lowercase letters. The octave below middle-C is as follows: Note: cc dd ee ff gg aa bb C Key: q w e r t y u i The next octave is as follows: Note: ccc ddd eee fff ggg aaa bbb cc Key: a s d f g h j k The lowest octave is as follows: Note: cccc dddd eeee ffff gggg Key: z x c v b aaaa bbbb ccc n m , Press OPEN APPLE with a note key for flat notes (%) Press SOLID APPLE with a note key for sharp notes (#) Press the SPACE bar for rest (R) MAKE "VALID.NOTES [z x c v b n m , a s d f g h j k q w e r t y u i Z X C V B N M < A S D F G H J K Q W E R T Y U I] MAKE "SHARP.NOTES [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 E 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 581 0 0 0 0 581 431 370 780 1553 787 890 1007 2680 1130 1328 0 547 485 0 0 1200 1626 655 1850 2420 383 1360 320 2090 285 0 0 0 0 0 0 70 52 44 89 178 94 105 118 285 133 141 0 66 59 0 0 141 189 79 212 269 47 158 39 239 35 0 0 0 0 D] MAKE "FLAT.NOTES [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 E 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 0 0 0 515 383 320 655 1360 700 787 890 2250 1007 1070 0 485 431 0 0 1070 1460 581 1626 2090 341 1200 285 1850 257 0 0 0 0 0 0 63 47 39 79 158 84 94 105 257 118 125 0 59 52 0 0 125 168 70 189 239 42 141 35 212 32 0 0 0 0 D] MAKE "MUSIC.DATA [SYMBOLS NATURAL.NOTES FLAT.NOTES SHARP.NOTES VALID.NOTES MUSIC.DATA] MAKE "SYMBOLS [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 R 0 0 0 0 0 0 0 0 0 0 0 ccc 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 CC 0 0 0 0 CC G E EE EEE FF GG AA CCCC BB CCC 0 B A 0 0 CCC FFF DD GGG BBB F DDD D AAA C 0 0 0 0 0 0 ccc gggg eeee eee ee fff ggg aaa C bbb cc 0 bbbb aaaa 0 0 cc ff ddd gg bb ffff dd dddd aa cccc 0 0 0 0 0] MAKE "NATURAL.NOTES [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 E 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 547 0 0 0 0 547 405 341 700 1460 741 838 948 2420 1070 1130 0 515 457 0 0 1130 1553 620 1760 2250 361 1290 302 1990 269 0 0 0 0 0 0 66 50 42 84 168 89 100 112 269 125 133 0 63 56 0 0 133 178 75 200 257 44 149 37 225 33 0 0 0 0 D] MUSIC.DATA TWINKLE 2C 2C 2G 2G 2A 2A 4G 2F 2F 2E 2E 2D 2D 4C 2G 2G 2F 2F 2E 2E 4D 2G 2G 2F 2F 2E 2E 4D 2C 2C 2G 2G 2A 2A 4G 2F 2F 2E 2E 2D 2D 4C 269 2 269 2 405 2 405 2 457 2 457 2 405 4 361 2 361 2 341 2 341 2 302 2 302 2 269 4 405 2 405 2 361 2 361 2 341 2 341 2 302 4 405 2 405 2 361 2 361 2 341 2 341 2 302 4 269 2 269 2 405 2 405 2 457 2 457 2 405 4 361 2 361 2 341 2 341 2 302 2 302 2 269 4 FRERE 2C 2D 2E 2C 2C 2D 2E 2C 2E 2F 4G 2E 2F 4G 1G 1A 1G 1F 2E 2C 1G 1A 1G 1F 2E 2C 2C 2gg 4C 2C 2gg 4C 269 2 302 2 341 2 269 2 269 2 302 2 341 2 269 2 341 2 361 2 405 4 341 2 361 2 405 4 405 1 457 1 405 1 361 1 341 2 269 2 405 1 457 1 405 1 361 1 341 2 269 2 269 2 200 2 269 4 269 2 200 2 269 4 OLDMAN 2G 2E 4G 2G 2E 4G 2A 2G 2F 2E 2D 2E 2F 1E 1F 2G 2C 1C 1C 2C 1C 1D 1E 1F 4G 2G 2D 2D 2F 2E 2D 4C 405 2 341 2 405 4 405 2 341 2 405 4 457 2 405 2 361 2 341 2 302 2 341 2 361 2 341 1 361 1 405 2 269 2 269 1 269 1 269 2 269 1 302 1 341 1 361 1 405 4 405 2 302 2 302 2 361 2 341 2 302 2 269 4 JINGLE 2E 2E 4E 2E 2E 4E 2E 2G 3C 1D 3E 2R 2F 2F 3F 1F 2F 2E 2E 1E 1E 2G 2G 2F 2D 8C 341 2 341 2 341 4 341 2 341 2 341 4 341 2 405 2 269 3 302 1 341 3 0 2 361 2 361 2 361 3 361 1 361 2 341 2 341 2 341 1 341 1 405 2 405 2 361 2 302 2 269 8 *MOUSE.QUIZO !I.MOUSE.QUIZ.DOCO !I)QUESTIONSO !I%MOUSE O !IMOUSE.BIN O !\I)MOUSE.DOCO !ITO START LOCAL "MOUSE LOAD "MOUSE MAKE "MOUSE MOUSEON DO.INTRO CATCH "BEGIN [.START] CLOSEALL SETREAD [] IF :MOUSE [MOUSEOFF] CT END TO .START MAKE "LINE "_ REPEAT 18 [MAKE "LINE WORD :LINE "_] MAKE "LINE ( WORD :LINE CHAR 32 CHAR 32 ) REPEAT 18 [MAKE "LINE WORD :LINE "_] MAKE "OPTIONS CHAR 32 REPEAT 7 [MAKE "OPTIONS WORD :OPTIONS CHAR 32] MAKE "OPTIONS WORD :OPTIONS "Quit REPEAT 7 [MAKE "OPTIONS WORD :OPTIONS CHAR 32] MAKE "OPTIONS WORD :OPTIONS "|| REPEAT 7 [MAKE "OPTIONS WORD :OPTIONS CHAR 32] MAKE "OPTIONS WORD :OPTIONS "Help IF NOT :MOUSE [MAKE "OPTIONS (SE [ESC quit,] (WORD CHAR 193 "- "?) [help]) MAKE "LINE []] OPEN "QUESTIONS SETREAD "QUESTIONS IF NOT EQUALP "Q RW [STOP] DO.IT CT TYPE.AT [0 5] [THAT'S ALL FOLKS!!!] WAIT 120 END TO TYPE.AT :P :X SETCURSOR :P TYPE :X END TO PR.AT :P :X SETCURSOR :P PR :X END TO SAFE.RC LOCAL [T R] MAKE "R READER SETREAD [] MAKE "T RC SETREAD :R OP :T END TO HIDDEN.RC IF KEYP [OP SAFE.RC] OP HIDDEN.RC END TO C.BUF :X IF KEYP [C.BUF SAFE.RC] END TO READ.KEYBOARD LOCAL "T C.BUF 0 MAKE "T HIDDEN.RC IF 127 < ASCII :T [MAKE "T CHAR ( ASCII :T ) - 128] IF :T = "/ [MAKE "T "?] OP :T END TO SETUP TYPE.AT [15 0] [Mouse Quiz] DRAW.Q.BOX :Q.TEXT DRAW.ANSWERS :A.TEXT TYPE.AT [0 22] :LINE TYPE.AT [0 23] :OPTIONS END TO WAITFOR IF AND :MOUSE MBUTTONP [MAKE "MOUSE "TRUE STOP] IF KEYP [MAKE "MOUSE "FALSE IGNORE RC STOP] WAITFOR END TO DO.INTRO SHOW.FILE "MOUSE.QUIZ.DOC CT PR.AT [0 4] [You can use a mouse or the keyboard] PR [to take the quiz.] PR [] PR [Press RETURN to use the keyboard or] PR [hold down the mouse button to use] TYPE [the mouse.] WAITFOR CT END TO MYNUMBERP :WORD IF MEMBERP CHAR 32 :WORD [OP "FALSE] OP NUMBERP :WORD END TO INV :W IF AND 64 < ASCII :W 96 > ASCII :W [OP CHAR 64 + ASCII :W] [OP CHAR 128 + ASCII :W] END TO DO.INV.SIDES :X TYPE "| REPEAT :X - 2 [TYPE CHAR 128 + 32] TYPE "| END TO INVERSE :W IF 1 = COUNT :W [OP INV :W] OP WORD INV FIRST :W INVERSE BF :W END TO INV.BOX :POS :WIDTH :HEIGHT LOCAL "K TYPE.AT :POS CHAR 32 REPEAT :WIDTH - 2 [TYPE "_] MAKE "K 1 REPEAT :HEIGHT [SETCURSOR SE FIRST :POS :K + LAST :POS DO.INV.SIDES :WIDTH MAKE "K :K + 1] END TO HIGH.ANS :A.NUM LOCAL [HEIGHT WIDTH POS X K A.TEXT] MAKE "A.TEXT ITEM :A.NUM :CHOICES MAKE "HEIGHT 2 + COUNT :A.TEXT MAKE "WIDTH 2 + MAXLEN :A.TEXT MAKE "POS LOC.OF :A.NUM - 1 :WIDTH MAKE "X FIRST :POS MAKE "ANSWER.LOCS LPUT ( SE :POS :WIDTH :HEIGHT ) :ANSWER.LOCS INV.BOX :POS :WIDTH :HEIGHT MAKE "K 1 REPEAT COUNT :A.TEXT [TYPE.AT SE :X + 1 :K + 1 + LAST :POS INVERSE ITEM :K :A.TEXT MAKE "K :K + 1] END TO BETWEENP :X :Y :Z IF :X < :Y [OP "FALSE] IF :X > :Z [OP "FALSE] OP "TRUE END TO LOC.IN.BOX :X :Y :BOX LOCAL [LOW.X LOW.Y] MAKE "LOW.X FIRST ITEM :BOX :ANSWER.LOCS IF NOT BETWEENP :X :LOW.X :LOW.X + ITEM 3 ITEM :BOX :ANSWER.LOCS [OP "FALSE] MAKE "LOW.Y ITEM 2 ITEM :BOX :ANSWER.LOCS IF NOT BETWEENP :Y :LOW.Y :LOW.Y + ITEM 4 ITEM :BOX :ANSWER.LOCS [OP "FALSE] OP "TRUE END TO GOOD.JOB TOOT 273 5 TOOT 273 5 TOOT 273 5 TOOT 370 20 HIGH.ANS :ANS RECYCLE END TO CHECK.ANSWER :USER.ANS IF :USER.ANS = :ANS [GOOD.JOB] [SORRY] END TO MAPLOC :LOC LOCAL [X Y] MAKE "X FIRST :LOC MAKE "Y LAST :LOC IF :Y = 23 [IF :X < 20 [OP CHAR 27] [OP "?]] IF LOC.IN.BOX :X :Y 1 [OP 1] IF 1 = COUNT :CHOICES [OP 0] IF LOC.IN.BOX :X :Y 2 [OP 2] IF 2 = COUNT :CHOICES [OP 0] IF LOC.IN.BOX :X :Y 3 [OP 3] IF 3 = COUNT :CHOICES [OP 0] IF LOC.IN.BOX :X :Y 4 [OP 4] OP 0 END TO DO.IT IF READPOS = FILELEN "QUESTIONS [STOP] CT GET.Q.AND.A QUESTION :Q :CHOICES DO.IT END TO ODDP :K OP NOT EQUALP :K 2 * INTQUOTIENT :K 2 END TO LOC.OF :K :SIZE IF ODDP :K [OP SE :Q.START + :Q.WIDTH - :SIZE 9 + 7 * INTQUOTIENT :K 2] OP SE :Q.START 9 + 7 * INTQUOTIENT :K 2 END TO DRAW.A.BOX :A.TEXT :A.NUM LOCAL [HEIGHT WIDTH POS X K] MAKE "HEIGHT 2 + COUNT :A.TEXT MAKE "WIDTH 2 + MAXLEN :A.TEXT MAKE "POS LOC.OF :A.NUM - 1 :WIDTH MAKE "X FIRST :POS MAKE "ANSWER.LOCS LPUT ( SE :POS :WIDTH :HEIGHT ) :ANSWER.LOCS BOX :POS :WIDTH :HEIGHT TYPE.AT :POS :A.NUM MAKE "K 1 REPEAT COUNT :A.TEXT [TYPE.AT SE :X + 1 :K + 1 + LAST :POS ITEM :K :A.TEXT MAKE "K :K + 1] END TO DRAW.Q.BOX :Q.TEXT LOCAL [HEIGHT X K] MAKE "HEIGHT 2 + COUNT :Q.TEXT MAKE "Q.WIDTH 2 + MAXLEN :Q.TEXT MAKE "X INTQUOTIENT 40 - :Q.WIDTH 2 BOX SE :X 1 :Q.WIDTH :HEIGHT MAKE "K 1 REPEAT COUNT :Q.TEXT [TYPE.AT SE :X + 1 2 + :K ITEM :K :Q.TEXT MAKE "K :K + 1] MAKE "Q.START :X END TO READ.CHOICES MAKE "A [] READ.CHOICE MAKE "CHOICES LPUT :A :CHOICES IF :MORE [READ.CHOICES] END TO GET.Q.AND.A MAKE "Q [] READ.QUESTION IGNORE RW MAKE "CHOICES [] READ.CHOICES END TO IGNORE :L END TO READ.CHOICE LOCAL "TEMP MAKE "TEMP RW IF MYNUMBERP :TEMP [MAKE "MORE "TRUE STOP] IF OR "TRUE = LISTP :TEMP :TEMP = "Q [MAKE "MORE "FALSE STOP] MAKE "A SE :A :TEMP READ.CHOICE END TO READ.QUESTION LOCAL "TEMP MAKE "TEMP RW IF NUMBERP :TEMP [MAKE "ANS :TEMP STOP] MAKE "Q SE :Q :TEMP READ.QUESTION END TO MAXLEN :LIST LOCAL [ANS K] MAKE "ANS COUNT FIRST :LIST MAKE "K 2 REPEAT ( COUNT :LIST ) - 1 [TEST :ANS < COUNT ITEM :K :LIST IFT [MAKE "ANS COUNT ITEM :K :LIST] MAKE "K :K + 1] OP :ANS END TO GET.ANSWER IF :MOUSE [MAKE "USER.ANS MAPLOC TRACKIT] [MAKE "USER.ANS READ.KEYBOARD] IF :USER.ANS = CHAR 27 [THROW "BEGIN] IF :USER.ANS = "? [DO.HELP SETUP GET.ANSWER STOP] IF :USER.ANS = 0 [GET.ANSWER STOP] CHECK.ANSWER :USER.ANS END TO DRAW.ANSWERS :A.TEXT MAKE "ANSWER.LOCS [] MAKE "K 1 REPEAT COUNT :A.TEXT [DRAW.A.BOX ITEM :K :A.TEXT :K MAKE "K :K + 1] END TO QUESTION :Q.TEXT :A.TEXT SETUP GET.ANSWER END TO DO.SIDES :X TYPE "| REPEAT :X - 2 [TYPE CHAR 32] TYPE "| END TO BOX :POS :WIDTH :HEIGHT LOCAL "K TYPE.AT :POS CHAR 32 REPEAT :WIDTH - 2 [TYPE "_] MAKE "K 1 REPEAT :HEIGHT [SETCURSOR SE FIRST :POS :K + LAST :POS DO.SIDES :WIDTH MAKE "K :K + 1] SETCURSOR SE 1 + FIRST :POS :HEIGHT + LAST :POS REPEAT :WIDTH - 2 [TYPE "_] END TO SORRY TOOT 100 20 HIGH.ANS :ANS TYPE.AT [4 0] [THE RIGHT ANSWER IS HIGHLIGHTED.] RECYCLE WAIT 120 END TO DO.HELP CT SHOW.FILE "MOUSE.QUIZ.DOC CT END TO SHOW.FILE :NAME CT LOCAL "D MAKE "D "- REPEAT 38 [MAKE "D WORD :D "-] LOCAL "BLANK MAKE "BLANK CHAR 32 REPEAT 38 [MAKE "BLANK WORD :BLANK CHAR 32] TYPE.AT [0 1] :D TYPE.AT [0 22] :D TYPE.AT [0 23] [RETURN TO CONTINUE, ESC TO CANCEL] TYPE.AT [15 0] [MOUSE QUIZ] R.FILE :NAME END TO R.FILE :NAME LOCAL "R MAKE "R READER LOCAL "CH CATCH "ERROR [OPEN :NAME R.LINES] SETREAD :R CLOSE :NAME END TO R.LINES SETREAD :NAME SHOW.20 IF READPOS = FILELEN :NAME [SETCURSOR [38 23] MAKE "CH SAFE.RC STOP] SETCURSOR [38 23] IF SAFE.RC = CHAR 27 [STOP] R.LINES END TO SHOW.20 SETCURSOR [0 2] REPEAT 20 [PR :BLANK] SETCURSOR [0 2] REPEAT 20 [PR RW] END MAKE "STARTUP [START] Welcome to MOUSE QUIZ, a program that tests your knowledge of mouse trivia. You will be asked a series of multiple choice questions about famous mice. Before you begin, you are asked whether you want to use the keyboard or a mouse to answer the questions. To answer with the mouse, just move the mouse so that the screen pointer is on the answer you want. Then click the mouse button. To answer from the keyboard, type a number. The MOUSE QUIZ program uses a number of procedures to respond to the mouse. You can use these same procedures in your own Logo programs. They're in the file MOUSE and its associated file MOUSE.BIN. Just load the file MOUSE from top level. On this disk, its prefix is /LOGO/SAMPLES/. MOUSE automatically loads the assembly language subroutines from MOUSE.BIN. The procedures available in MOUSE are described in the file MOUSE.DOC in the same subdirectory. Use POFILE to print this description on the screen. Q What famous rodent first appeared in the film "Steamboat Willy"? 3 1 Chuck E. Cheese 2 Mighty Mouse 3 Mickey Mouse Q Which of the following is out of place? 4 1 Mickey Mouse 2 Mighty Mouse 3 Chuck E. Cheese 4 Donald Duck Q In the nursery rhyme "Hickory Dickory," what time the did the mouse run down the clock? 3 1 12 o'clock 2 3 o'clock 3 1 o'clock 4 5 o'clock Q In the nursery rhyme "Three Blind Mice," whom did the mice run after? 2 1 Mother Goose 2 The Farmer's Wife 3 Old Mother Hubbard 4 Jack & Jil l Q Who is known for the slogan "Here I come to save the day!"? 1 1 Mighty Mouse 2 Mickey Mouse 3 Mouse That Roared Q Who is the mascot for the restaurant chain called "Pizza Time Theatre"? 3 1 Mickey Mouse 2 Mighty Mouse 3 Chuck E. Cheese Q What movie featuring rodents has a hit title song sung by Michael Jackson? 3 1 Willard 2 Steamboat Willy 3 Ben Q Who wrote "Of Mice And Men"? 2 1 Shakespeare 2 Steinbeck 3 Shelly TO SETMOUSE :L .DW 23578 FIRST :L .DW 23580 FIRST BF :L .CALL 23807 END TO MBUTTONP .CALL 23732 OP ( .EXAMINE 23582 ) > 127 END TO MOUSEOFF .DEPOSIT 23577 0 .CALL 23723 END TO CLAMPMOUSE :L .DW 23583 FIRST :L .DW 23585 FIRST BF :L .DEPOSIT 23587 0 .CALL 23840 MAKE "L BF BF :L .DW 23583 FIRST :L .DW 23585 FIRST BF :L .DEPOSIT 23587 1 .CALL 23840 .CALL 23873 END TO MOUSEON .CALL 23628 IF 0 = .EXAMINE 23576 [OP "FALSE] .DEPOSIT 23577 1 .CALL 23723 CLAMPMOUSE [0 304 0 368] OP "TRUE END TO INIT .BLOAD "MOUS E.BIN 23576 END TO .EW :ADR LOCAL "T MAKE "T .EXAMINE ( :ADR + 1 ) IF :T > 127 [OP -65537 + ( :T * 256 ) + .EXAMINE :ADR] [OP ( :T * 256 ) + .EXAMINE :ADR] END TO .DW :ADR :WORD IF :WORD < 0 [MAKE "WORD 65537 + :WORD] .DEPOSIT :ADR REMAINDER :WORD 256 .DEPOSIT :ADR + 1 INTQUOTIENT :WORD 256 END TO SCALE :X :Y .DEPOSIT 23588 :X .DEPOSIT 23589 :Y END TO TRACKIT SCALE 3 4 .CALL 23881 SCALE 0 0 OP SE .EW 23578 .EW 23580 END TO MOUSE .CALL 23732 OP SE .EW 23578 .EW 23580 END MAKE "STARTUP [INIT] BLH\h`Į)\*\,\-\h +\`J\K\ȅ0$8  ۥ\ *\\ )\8\J\K\`\ .\` .\)\\\8\8\\$\ N\n\L\%\ N\n\L\` .\`)\\\\8\8 .\`\x \x!\"\#\ .\` .\`G]H] ] \\&\\'\ ^\ ]H]G]` ]]]` ]]]`]HJ) h)i `x&\]'\] ]]]&\]'\](\] ](`x&\]'\]]] ](` ]\&\\'\ ]` THE MOUSE PROCEDURES The procedures in the MOUSE file let you track and control the Apple mouse from within your Logo programs. The mouse procedures depend on the assembly language routines stored in the file MOUSE.BIN. When you load MOUSE into the workspace, MOUSE.BIN is also loaded automatically. The procedure MOUSEON lets you turn the mouse on. It searches the I/O space for the first mouse card it finds and turns it on. The procedure MOUSEOFF turns off the mouse. The procedure MOUSE outputs a list of two numbers, the X and Y coordinates of the mouse. The procedure MBUTTONP outputs TRUE if the mouse button is pressed and FALSE if it is not pressed. The procedure CLAMPMOUSE restricts the mouse movement to the region described by its input. The input is a list [MinX MaxX MinY MaxY]. The procedure SETMOUSE sets the mouse position to the position described by its input [x y]. The procedure TRACKIT tracks the mouse on a 40-column screen and outputs the position of the mouse when the button is pushed. The procedure SCALE causes the mouse position to be scaled by factors of 2. For example SCALE 4 3 would cause the X movement of the mouse to be scaled by 16 and the Y movement of the mouse to be scaled by 8. The procedures .DW and .EW allow communication between the mouse procedures and the assembly language routines in memory. The procedure INIT loads the assembly language code into memory.