SULLIVAN@suny-bing.CSNET (05/09/87)
OK folks -- here we go again. I hope this gets a wider distribution than last time! All Ace C files are included here. Use an editor to extract the individual files. Files ending in .com or .obj are uuencoded. Please read the accompanying message about the legal status of Ace C. Fred Sullivan Dept. Math. Sci. SUNY at Binghamton sullivan @suny-bing.csnet -------- acec.com -------- begin 640 acec.com M__]+/\Y"3&<_0V%N)W0@9FEN9"!$,3I%3D=)3D4N3T)*FZD,HD @5N2I69U$ M ZD_G44#J0.=0@.I!)U* R!6Y! BJ4Z-1 .I/XU% ZD)C4(#C4D#H@ @5N2I M (43I1/P_&P* *D G4D#J0:=2 .=10.I@)U$ ZD'G4(#(%;D,,*M@@:=1 .- M_C^M@P:=10.-_S_NA ;0 ^Z%!JV$!CCM@@:=2 .MA0;M@P:=20,@5N2I#)U" M R!6Y$P +&%C90$ "4#WGB@\ !2@ !0S5!XN0084H@ 4544>+D$&%*0 %)=# M'BY!!A2F !0U11XN0084&D(>3T$$%@$ )N] 'G-! AY800)\QO\>[4$$'C1! M GS&_WS$_QYD0008%"X 'C=!" HO129X0'S&_P0O12P8%@ #'S:_WS$_QYA M009\VO\46$(>1D$&?.[_?,3_'F%!!GSN_Q1:0AY&00847D)\[/\>3T$&?-K_ M%'( 'B)!!@I'168 ,E %&1"?-C_'D]!!B0[0'SN_Q1W !XB008*245F #H M0!1T0GSL_QY/008D.T >;FD")#M *,3_(!Y800(4A$(>3T$$'CU! AXQ00(@ M ,L 8L PL \L !(L !4L !@L !LL "$L "<L "HL "TL # L #,L #DL M $(L $@L %0L %<L %HL &\L '(L '4L 'XL (0L (<L (TL ) L )DL )PL M )\L *4L *@L *LL *XL +$L* ( @ 0"" !F" "6022,070 "1[07( M !X?000DAD$H_O\@* ( <OK_'NU!!( @@ 9@$ YD%R^O]R^O\>1D$& M? @OC_&!1R !XB008.@@ 9@$ XT$4H4)R^/\>3T$&<OK_'NU!!"2I08( M "C^_R 4L$(>3T$$<O[_'D!!!(+^_VX !"$ 90A0< !Y20004G >4D$$ M'C%! B!]?R!4:&4@04-%0R!#($-O;7!I;&5RFR @(&)Y($IO:&X@4&%L979I M8V@@86YD(%)A;'!H(%=A;&1E;IN; $, 0T-# !R<)7.; $-A;B=T(&]P96XZ M("5SFP!#86XG="!O<&5N.B E<YL '5!R97-S(&$@:V5Y('1O(&5X:70@=&\@ M1$]3FP!C86XG="!O<&5N("5SFP!F:6QE;F%M92 H;W(@4D5455).('1O(&5X M:70I/R ;FGVGA;[5 I6:13[5!0L 18. # L;@X "EAI%L]""B=%%#%4%@$ M+!@6 *-44*.44*3T4,"E-%"D%%"DM%"D5%"D-%"CU%"BM%"BU%'@Q] A0Q M5!8 "P8%B( #!8! I1118! I-15XY10H[11[X:0(>G6H"'L9J A[.> ($ M044F]VD4U&L>I'X$( 1%180 )QJ%.QK'E5^!"8Y:A3T:QY5?@0F(6H4 0 4 M P >\W8&)#)J%/IK'I)^!!0" !0# ![S=@8>[' "))5J%/]K'I)^!"94:A0! M !0! ![S=@8>[' "))5J% 5L'I)^!"9O:A0" !0! ![S=@8>[' "))5J% IL M'I)^!": :AY=:P(DE6H4$VP>DGX$)I%J'KB B25:AZ(; (><7X")/AI( 0K M180 *9J( 0[11@>MYT$!"M%&![@G004644$*T48!$E%&!X000@@%OM4"E)I M!%)I& 16:50F7&L$4FEN"0 0A@0 \&H$4FEN"P 0&!8# $J.)E!K!%)I&!ZJ MG00$4FEN# 0&!;_ #H8!%)I&!0, !8! "PL$!@6" ^+ HQ1012:6X* ! 8 M%@( 2!HZ:P12:6X) ! 8%@, 2(XF2&L$,448%@$ /@HQ100Q11@>,IX$!%)I M;@X "E)I),QJ( 1+129J:Q0;;!ZD?@06 *5T44,50>57X$%#-48%5%+! * M,44FCFL$,448%B( 2HXFH&L4BFA@5T4L& 0Q10PD=VL4BF@$5T4L&!8 P4 MBF@4-&P>1D$&%(IH%'( 'B)!!@I+168 ,]K%#9L'J1^!!X,?0(@;6ES<VEN M9R!C;&]S:6YG(&)R86-K970 97AT97)N( !C:&%R( !I;G0@ &-H87(@ &EN M=" (VEN8VQU9&4 (V1E9FEN90!#86XG="!N97-T(&EN8VQU9&4@9FEL97, M2 !/<&5N(&9A:6QU<F4@;VX@:6YC;'5D92!F:6QE "@" !0!<QY5?@0F9VP6 M H_O\@? 'FZ6!(0 'IL% -S'J1^!!04<QZ3>@0$-T4H_O\@* \ ?//_ M'DA\!(0 )YL%!9S'J1^!'S\_WSQ_QZO>@0.)N!L@OS_;@D $(8$ +]L?//_ M'H%Z!(+\_VX, !"$! #2;'SS_QZ!>@2"_/]N# 8%@0 #"3^;'SS_Q0$ !0" M !0$ !0! !XQ>PQ\_/]\\?\>KWH$#A0V<WSQ_QY/0084.G,>57X$A &VT4 M/',>I'X$<OS_'JJ=!!3[5!0L 18. # L;@X "EAI%@ "C]%%$]S'E5^!(0 M +1M?//_'DA\!"9];7SS_Q[I>@0F8&U\\_\>@7H$?//_% % !#]%&!Z\ M>PH$/T5N @ */T4DA&T447,>I'X$'G%^ A1G<QZ5?@2$ "G;11I<QZ2?@2$ M "G;11K<QZD?@0>8'H")K%M)+1M)#EM?/[_!#]%0 X6 */44$/T4F"&X4 M>G,>57X$)N-M% $ <OS_'F)N!A[L< (D!6X4?W,>DGX$)OYM% ( <OS_'F)N M!A[L< (D!6X4A',>I'X$),)M%)9S'E5^!"8S;GP !YNE@2$ E;A2:<QZD M?@1R >.IH$'NQP B1';AYE;P*& P!';A0 !XOG 0>JIL"%@ "CU%%/M4 M%"P!%@X ,"QN#@ *6&DH\?\@* \ %@$ )F%O!#]%A =VXH\?\@%*ES'E5^ M!":);H#S_P, )(YN@//_ 0!\]_\>2'P$A GFX>>7H"%*MS'E5^!";#;AX< M?0*&70"^;AY@>@(FNVXDOFXDJ&Z \_\# 'P 'SU_Q[I>@0.)C5O@@ ;@D M&(+Q_PR" !N"@ 8@NO_#'SU_W+M_X+\_VX, ! 8%O\ .BP8@OS_&!0, !8! M "PL$!@6" ^+ Z" !N# 8@O/_&!;_ #H,@@ &!0, !8! "PL&(+S_Q@6 M" \# 0_11@6 @ N"C]%'F!Z B9+;RCQ_R 4K7,>57X$A 7F\4KW,>I'X$ M)&5N*/'_(!0S5 1512P0D"9U;P1%18XF?&\@).AP%+YS'E5^!":4;Q0! ![< M=P0>[' ").AP%,1S'I)^!":L;Q0" ![<=P0>[' ").AP%,ES'I)^!":];QX M<0(DZ' 4S',>DGX$&L]O%-!S'I)^!(XFXF]B544>*G$"%@$ "E-%).AP%-1S M'I)^!!KT;Q3;<QZ2?@2.)@IP8E5%%'< 'JAQ!!8" I3123H<!3B<QZ2?@0F M)' 49 >J'$$%@( "E-%).AP%.9S'I)^!!HV<!3N<QZ2?@2.)DEP8E5%'H=T M A8) I3123H<!3V<QZ2?@0F9' >.G("'NQP A8# I3123H<!3]<QZ2?@0: M=G 4!'0>DGX$CB:-<&)511Y3<@(>[' "%@0 "E-%).AP% MT'I)^!":H<!Z# M<@(>[' "%@4 "E-%).AP%!1T'I)^!!JZ<!09=!Z2?@2.)LUP8E5%'@UV A8( M I3123H<!0>=!Z2?@0FVG DZ' >E($"'NQP A8' I3101312 4('0>57X$ MA _W 4(G0>I'X$(%Y!110T=!Y5?@2$ F<01%128?<10W=!ZD?@0D(W$> M96\") -Q8D%%("@( 'SZ_P18:0Y\_/\$/44.?/[_'GI\ @YR_O\>I)4$'F5O M G+\_QXOG 0*/46"^O\*6&D4270>57X$A =7%R_O\>MYT$*/C_('P !YZ M? (.&![<FP1R_O\>MYT$'F5O G+\_QXOG 0*/46"^O\*6&ER >MYT$*/C_ M("@, 'SV_P18:0Y\^/\$/44.?/K_'GI\ @Y\_/\>>GP"#H#^_P ?/;_'I%\ M!'+Z_QZWG02,\O^$=P#R<7+\_QZDE00>96\")!1R'F5O A1.=!Y5?@2$ ) M<A14=!ZD?@1R_/\>I)4$'NQP G+Z_Q[<FP1R_/\>MYT$@O;_"EAI<OC_'B^< M! H]11[4? (H]/\@'F!Z H0 $=R'I2! A0 !XOG 0>JIL"("@" 'P ![G M? (.A 9W(H_O\@@@ ;@( $A@>+YP$@@ ;@8 $A@>W)L$*/[_("@" !3/ M0@0G14@FEW(4970>I'X$? !"=%&!8, "X.@@ &!;/0EHFR7*" !N! 2 M)KMR),ER!@ &!(8%@P +@XDHW*" !JST+8<A1V=!ZD?@2" !N" 2)O%R M@@ ;@@ $A@>W)L$)/UR@@ ;@0 $A@>W)L$*/[_(%T ;75S="!B92!C;VYS M=&%N= != &EL;&5G86P@9G5N8W1I;VX@;W(@9&5C;&%R871I;VX )7.; "@ M;6ES<VEN9R!O<&5N('!A<F5N "D :6QL96=A;"!A<F=U;65N="!N86UE "D M+ !E>'!E8W1E9"!C;VUM80!C:&%R &EN=" =W)O;F<@;G5M8F5R(&%R9W, M87-M $YE961E9"!A9&1R97-S "H 6P L &5X<&5C=&5D(&-O;6UA &-H87(@ M &EN=" )"@ :68H &EF( !W:&EL92@ =VAI;&4@ &1O( !S=VET8V@H '-W M:71C:" <F5T=7)N &)R96%K.P!B<F5A:R 8V]N=&EN=64 9F]R* !F;W(@ M #L .P!M:7-S:6YG('-E;6EC;VQO;@ D*0!M:7-S:6YG(&9I;F%L(&5N9 !E M;'-E '=H:6QE &1O('=I=&@@;F\@=VAI;&4 3F\@86-T:79E('=H:6QE<P!. M;R!A8W1I=F4@=VAI;&5S "@6 'SZ_WS__WS\_Q8 P,#GSL_P18:0Y\[O\$ M/44.?/+_'GI\ @Z \/\ 'SL_QZ1? 041WD>DWH$'I2! A1)>1Z3>@042WD> MDWH$!@$ &!1.>1Y5?@0,A [G045GD>57X$D(XF^'047'D>I'X$?/C_'GI\ M @Z, 0 F$'5\^O^"]O\.)#EU?/[_'FZ6!(0 "5U?/[_'IR8!)".)B]U%'EY M'J1^!'+^_W+V_QX5G 84B7D>57X$A 3'44BWD>I'X$!@$ &!29>1Y5?@0, M&F-U%*%Y'E5^!(XF:74D '5\_/\>>GP"#G+\_Q[<FP1R^/\>MYT$'F5O @8! M !@4IWD>57X$#(0 *YU!@ &!2O>1Y5?@0,A KG44M7D>57X$D(XFM'4D M?W6"_/]N 0 8'MR;!'+\_QZWG02, :T'6, 0".)M9U)/AT@OK_)N-U<OK_ M'MR;!(+\_VX! !@>MYT$<O+_'K>=!(+L_PI8:7+N_QXOG 0*/44>U'P"*.K_ M("@, 'SV_P18:0Y\^/\$/44.?/K_'GI\ @Y\_/\>>GP"#GS^_QYZ? (.? M'GI\ @Y\]O\>D7P$%+AY'I-Z!!2Z>1Y5?@2$ !@=AZ4@0(>[' "<OK_'K>= M!!2\>1Y5?@2$ ""=AZ4@0(>[' "<OS_'@*<!'( ![<FP1R_O\>MYT$%+YY M'E5^!(0 *=V'I2! A3 >1Z3>@1R^O\>W)L$<@ 'K>=!!YE;P)R_O\>W)L$ M<OS_'K>=!(+V_PI8:7+X_QXOG 0*/44>U'P"*/3_(!3">1Y5?@2$ #R=A3$ M>1ZD?@0@* ( * ( * D * ( %@$ )MAW%@$ )L5W'F!Z B86=RCQ_R" \_\! M !32>1Y5?@0F+7> ]?\# "0R=X#U_P$ ?/?_'DA\!(0 $)W'GEZ GP 'SU M_QZO>@0.)H)W@@ ;@L $(0# &5W@N__&!8# $J.)G9W@@ ;@L &!8! PD M@G>"[_^& P""=QZ!>@(4U'D>57X$)JQW?//_'E-L @Z"\_\FHG> ]?\" "2L M=X#U_P, @//_ @!\]_]R\_]RZ?]R[?]RY_\>,7L,),5W) 5W%-9Y'E5^!(0 M -5W*/'_("3_=BCQ_R H @ H @ 6 0 FRG@6 0 FMW@>8'H")OEW*/S_(!38 M>1Y5?@0F"WB # "00>( $ %(%H'DA\!(0 "!X'GEZ A2!:![I>@0F M,7@4@6@>@7H$%-IY'E5^!"9M>'S^_QY3; (.@O[_)F5X@ @""^O^$ @!B M>'S^_X+\_Q@6 0 ^#B1J>(#^_P( )(YX@OK_A $ ?GB" 8%@, 2HXFB7B M_O\! "2.>(#^_P( %(%H<O[_@O;_& 0]16X" !@>O'L*!#U%?O[_&!XOG 0* M/44DMW@DZ'<4W'D>57X$A QW@H_/\@).)W*/S_("@! !;[5 I2:012:1@$ M5FE4)D-Y!%)I;@D $(0$ YY!%)I;@P $(8$ 1Y? $ %H< #"0+>7P! !:( M PD*WD$4FEN"P 0A , )'E\ 0 6AP ,)"MY? $ %H@ #(P! !@$4FD8'EN> M!@12:6X. I2:237>"C__R H "D )"@ 9&5F875L= !C87-E( G8V%S92<@ M;W(@)V1E9F%U;'0G(&5X<&5C=&5D &-O;G-T86YT(&YE961E9 Z $UI<W-I M;F<@8V]L;VX 9&5F875L= !C87-E( !D969A=6QT &-A<V4@ "0I "@ .P [ M "D *0 Z $UI<W-I;F<@8V]L;VX *@!; "P *@!; "P * ( @ ><7X" M@OS_A ]GD>8)L"%)Y]'I5^!(0 #MZ'F!Z B8,>B0[>AY\@0*"_/^$ < M>AYUFP(>8)L"!@ &!)N @ .%*!]'E5^!(0 #AZ)#MZ)/9Y%*)]'I-Z!(+\ M_R95>G+\_W+^_QZ!FP8D7'IR >MIL$*/[_(!YQ?@(4I'T>E7X$&GAZ%#-4 M!%5%+!"0CB 4IGT>I'X$(!2Z?7+\_QY/0084SGT>I'X$('+^_QY5?@2$ "F M>A38?1ZD?@0@%.A]'J1^!" H @" #[5(( !@$5FE*)N)Z<OS_<O[_'J%^ M!B;6>H( "C^_R & 8$FX. XDMWH6 H_O\@* ( !@ &!3[5!0L 18. M # L;@X #H( !@$6&E*)BI[<@ <OK_'J%^!B8>>X( "C^_R & 8$FX. M XD_WH6 H_O\@<O;_'J]Z! I2:29">P12:2 $5FD8%/M4%"P!%@X ,"Q: M)EQ[%/1]'J1^! 16:0I2:016:1AR]/\>GGX&!%)I;@D &(SV_PP$4FEN"@ 8 MC/C_# 12:6X+ !B"_/\,!%)I;@P &(+Z_PP$4FD8% P %@$ +"P8@OK_&!8( M #P,!%9I;@X "E9I!%)I('+X_Q[I>@0*4FDFS7L$4FD@!%AI&!3[5!:&$RP8 M%@X +EHFZ'L4$7X>I'X$!%AI"E)I!%AI&'+V_QZ>?@8$4FEN"0 8C/C_# 12 M:6X* !B,^O\,!%)I;@L &!8" P$4FEN# 8@OS_# 12:1@4# 6 0 L+!B" M_/\8%@@ / P$6&EN#@ *6&D$4FD@'G%^ A0S5 1512P0&!X*002$ !B?!8 M """_O\8%#-4!%5%+!@>GGX&'IM^ A8! "!>.44@C/[_&!8P %(8C/S_&!8Y M $XZ( 0G11@4ST(6R L&!8, "Y()JQ\%"U^'J1^!!8 HQ100Q168& --\ M!"=%1$0*)T5&1AB"_/\88#%%*BP2#B2R?" >YWP")N9\!"=%&!8, "X*)T4@ M!"=%A,]"^7P41'X>I'X$) )]!"=%&!8, "X@(!0S5 1512P0(!0S5!8 "P8 M%@ "E5%#" 4,U0$544L$(0 #Y]!$5%)C-]%@ (!Y#?0(>WGX")!Q]'HE^ M B 6 0 FG7T$1T6$ !8?18! I%12 $2T4*,T6$ !I?01'10HS110S5 0S M11@>C'X&9@ F7T$,T48'A]!! 1+12:0?18 I+1226?18 I'122:?2 D M0WT@*0 L "D .P!I;&QE9V%L('-Y;6)O;"!N86UE "5S(&%L<F5A9'D@9&5F M:6YE9)L <V5E(&%B;W9E &UI<W-I;F<@8G)A8VME= !N;W0@9&5F:6YE9 !' M3$]"04P@<WEM8F]L('1A8FQE(&]V97)F;&]W &QO8V%L('-Y;6)O;"!T86)L M92!O=F5R9FQO=P!T;V\@;6%N>2!A8W1I=F4@=VAI;&5S &YO(&%C=&EV92!W M:&EL97, 'H-^ H0 &E^'D-] A[>?@(D57YR_O\>DGX$(!Z#?@*$ ""?AY# M?0(>WGX"( "E*@!.*@!P*@"#*@ *@# *@#O*@ (*P!F*P"1*P"]*Q0_@10S M5!Y/0086 0 *,44$,46(547/?B3%?EXQ122T?A0@ !Y2000DOWX40X%R_/\> M3T$&'O- B 4BF@49 >'$$&%@ "E5%"E=%%#-4!%5%+! 8'GY\!"8'?UY5 M123Q?AZ#?@(4,U0$544L$ A4:2:8@ )4:80@ #A_%(IH8%=%+!@"5&D,'HE^ M AZ#?@(DE8 "5&F$(@"H?Q2*:&!712P8'HE^ @P4,U0$544L$(8B )A_%#-4 M!%5%+!"$ !N?Q1*@1ZD?@04,U0$544L$(1< (A_%(IH8%=%+!@>B7X"#!2* M:&!712P8'HE^ @PD37\4BFA@5T4L&!Z)?@(,))6 E1IA"< &( 4BFA@5T4L M&!Z)?@(,%#-4!%5%+!"&)P (@!0S5 1512P0A WG\46($>I'X$%#-4!%5% M+!"$7 #X?Q2*:&!712P8'HE^ @P4BFA@5T4L&!Z)?@(,)+U_%(IH8%=%+!@> MB7X"#"25@ )4:1@>AGX$)HB 'IA^ @HQ129(@ 1711@4BF@$5T4L& 0Q11@> M84$&+ I7122%@!8 HQ110S5 1512P0&!Z&?@08!#%%&!8( $PZ)H& )'& M7C%%)$Z %(IH8%=%+!@>B7X"#"1K@!Z;?@(DE8 4BFA@5T4L&!Z)?@(,) M_ M%(IH!%=%+!@6 *544,%#-4%(IH'F%!!FX" I712 4@6@>2'P$A R( > M>7H"%)=#8#5%*BP8!"U%;A%1#@0M11@4$5$$+44L&!2!:!YA009N 0 L"BU% M'H-^ A270V U12HL& 0M16X140X4$5$$+44L&!0S5 1512P8'F%!!@HQ100M M11@$,45N 0 L"BU%'@Q] @0M16@? SZ!%&N!'J1^!" E<YL 7IL@)7.; &UI M<W-I;F<@<75O=&4 ;6ES<VEN9R!A<&]S=')O<&AE &UA8W)O('1A8FQE(&9U M;&P * 8 ?/S_'LJ!!":0@7S\_QYRE00H^O\@* 8 ?/S_'LJ!!":H@7S\_QYR ME004 (L>DGX$)L:!?/S_'LJ!!";#@7S\_QYRE00DJ($H^O\@* @ ?/K_<O3_ M'J.#! X4 HL>DGX$)O*!%&.<<O3_<O;_'C"#""0I@Q0%BQZ2?@0F#((4:YQR M]/]R]O\>,(,()"F#% B+'I)^!"8F@A1SG'+T_W+V_QXP@P@D*8,4"XL>DGX$ M)D""%'N<<O3_<O;_'C"#""0I@Q0.BQZ2?@0F6H(4@YQR]/]R]O\>,(,()"F# M%!&+'I)^!"9T@A2KG'+T_W+V_QXP@P@D*8,4%8L>DGX$)HZ"%*.<<O3_<O;_ M'C"#""0I@Q09BQZ2?@0FJ((4FYQR]/]R]O\>,(,()"F#%!R+'I)^!";"@A23 MG'+T_W+V_QXP@P@D*8,4'XL>DGX$)MR"%(N<<O3_<O;_'C"#""0I@Q0BBQZ2 M?@0F(H."^O^$ #R@AZG>@*"]O]N @ 2)@"#'F"; GS\_Q[*@00F$8-\_/\> M<I4$<O;_'DJ5!!8 "CX_R D*8."^O\H^/\@%@ */C_("@( (+V_X0 #^# M'J=Z H+T_VX" !(F38,>8)L"<O3_'G*5!!Y@FP)\_/\>HX,$)FF#?/S_'G*5 M!(+R_Q@68YQ(&GV#@O+_&!9KG$B.)I&#<O3_?/K_'LV4!B:1@QY7G )R\O\B M @;T_Q(8'DJ5!"CX_R H @ H @ H @ &_/\8!O;_$A@>,80$#A8DBQ@>DGX$ M&!8 $@FTH,&_/\2*/K_( ;\_Q(FXH,&^/\2&!YRE00&_O\8!#E%1 HY10X& M_O\2&!X"G 0>E($"!@ & 0Y140*.44.'M]V @8 !(8'MR;! ;^_Q(8'K>= M!!Z4@0(& 2&!ZWG006 H^O\@* ( * ( * 8 !OK_& ;R_Q(8'N*$! X> M<7X"%B:+&!Z5?@08%@ 2"9DA ;Z_Q(H]O\@!OK_$B9TA ;T_Q(8'G*5! ;X M_Q@$.45$"CE%#AY@FP(>5)L"%@ &!XSG00>ZYP"%BF+&!Y5?@0FTH0&^/\2 M&![OFP0&_/\8'N*$!":[A ;\_Q@><I4$'F"; AY4FP(6 8'C.=!![KG (D ME(0&^/\2&!ZWG006 H]O\@* ( * ( * 8 !OK_& ;R_Q(8'I.%! X><7X" M%BR+&!Z5?@08%@ 2"85A0;Z_Q(H]O\@!OK_$B8EA0;T_Q(8'G*5! ;X_Q@$ M.45$"CE%#AY@FP(>5)L"%@ &!XSG00>ZYP"%B^+&!Y5?@0F@X4&^/\2&!X" MG 0&_/\8'I.%!"9LA0;\_Q@><I4$'F"; AY4FP(6 8'C.=!![KG (D184& M^/\2&!ZWG006 H]O\@* ( * 8 !OK_& ;T_Q(8'FJ&! X><7X"%C-4& 15 M12P0&!9\ $H8%@ 2AK>A18RBQ@>E7X$&!8 $H:WH46-8L8'I5^!!@6 !* M)NF%!OK_$BCX_R &^O\2)OF%!O;_$A@><I4$%@$ )F:&%CB+&!Z5?@08%@ M2!@6 !*)B:&%CN+&!Z5?@08%@ 2!@6 !*)ER&%CZ+&!Y5?@0F4H8>8)L" M!OS_&!YJA@0F2X8&_/\8'G*5!!Z+G (D6886 H^/\@)&.&%@ */C_("3Y MA2CX_R H @ H!@ &^O\8!O3_$A@>%X<$#AYQ?@(6,U08!%5%+! 8%EX 2A@6 M !*&J6&%D"+&!Z5?@08%@ 2B:PA@;Z_Q(H^/\@!OK_$B; A@;V_Q(8'G*5 M!!8! "83AQ9#BQ@>E7X$&!8 $@F"8<61HL8'I)^!";_AAY@FP(&_/\8'A>' M!";XA@;\_Q@><I4$'I.< B0&AQ8 "CX_R D$(<6 H^/\@),"&*/C_("@" M "@& ;Z_Q@&]/\2&![>AP0.'G%^ A8S5!@$544L$!@6)@!*&!8 $H:4H<6 M2(L8'I5^!!@6 !*)EV'!OK_$BCX_R &^O\2)FV'!O;_$A@><I4$%@$ )MJ' M%DN+&!Z5?@08%@ 2!@6 !*)IJ'%DZ+&!Z5?@08%@ 2!@6 !*)M"'%E&+ M&!Y5?@0FQH<>8)L"!OS_&![>AP0FOX<&_/\8'G*5!!Z;G (DS8<6 H^/\@ M)->'%@ */C_("1MARCX_R H @ H!@ &^O\8!O3_$A@>GH@$#AYQ?@(64XL8 M'I5^!!@6 !(&!8 $HF'8@65HL8'I5^!!@6 !(&!8 $HF*(@&^O\2*/C_ M( ;Z_Q(F.(@&]O\2&!YRE006 0 FFH@668L8'I)^!"9GB!Y@FP(&_/\8'IZ( M!"9@B ;\_Q@><I4$'N.< B27B!9<BQ@>DGX$)I"('F"; @;\_Q@>GH@$)HF( M!OS_&!YRE00>ZYP"))>(%@ */C_("0XB"CX_R H @ H!@ &^O\8!O3_$A@> M>XL$#AYQ?@(67XL8'I5^!!@6 !(&!8 $HF!XD688L8'I5^!!@6 !(&!8 M $HF!XD68XL8'I5^!!@6 !(&!8 $HF!XD69HL8'I5^!!@6 !(&!8 $HF M$HD&^O\2*/C_(!9IBQ@>E7X$&!8 $H:+XD6;(L8'I5^!!@6 !*)CJ)!OK_ M$BCX_R &^O\2)DJ)!O;_$A@><I4$%@$ )OR*%F^+&!Z2?@0FI8D>8)L"!OS_ M&!Y[BP0F<HD&_/\8'G*5! ;V_Q(8%@( *BP2&!8 $H:E(D&_/\8%@( *BP2 M&!8 $HFGHD>&YT")$J)'ON< B3YBA9RBQ@>DGX$)OJ)'F"; @;\_Q@>>XL$ M)L>)!OS_&!YRE00&]O\2&!8" "HL$A@6 !*&NF)!OS_&!8" "HL$A@6 !* M)O.)'BN= B1*B1X+G0(D^8H6,U08!%5%+! 8%CP 2!@6 !*)B**%G6+&!Z5 M?@08%@ 2!@6 !*)G:*!%5%1 I511Y@FP(&_/\8'GN+!"9#B@;\_Q@><I4$ M!O;_$A@6 @ J+!(8%@ 2AIEB@;\_Q@6 @ J+!(8%@ 2B9OBAX3G0(D2HD> M\YP")/F*%C-4& 1512P0&!8^ $@8%@ 2B:>BA9XBQ@>E7X$&!8 $@8%@ M2B;RB@15140*544>8)L"!OS_&!Y[BP0FOXH&_/\8'G*5! ;V_Q(8%@( *BP2 M&!8 $H:X8H&_/\8%@( *BP2&!8 $HFZXH>(YT")$J)'@.= B3YBA8 "CX M_R D2HDH^/\@+ K/0 M/0 J/0 O/0 E/0 \/#T /CX] "8] %X] 'P] #T M/P!\? !\? F)@ F)@!\? !\/0!\? !\/0!\ %X] %X] %X )CT )B8 )CT M)@ ]/0 A/0 ]/0 A/0 \ #X /#T /CT /CX /#P /#T /CT /#P /CX * @ M?/K_<O3_'BZ,! X><7X"%%B1'I5^!(0 **+%%N1'I5^!)".&K>+%%Z1'I5^ M!!JWBQ1BD1Z5?@2.)L&+@OK_*/C_((+Z_R;.BW+V_QYRE006 0 F*HP49I$> M57X$)OJ+'F"; GS\_QXNC 0F\XM\_/\><I4$'J.< B0GC!1ID1Z2?@0F((P> M8)L"?/S_'BZ,!"89C'S\_QYRE00>JYP")">,%@ */C_("3.BRCX_R H" !\ M^O]R]/\>@8T$#AYQ?@(4,U0$544L$(8K %N,%#-4!%5%+! 8%BT 2HXF98R" M^O\H^/\@%&R1'I5^!!IWC!1OD1Z5?@2.)H&,@OK_*/C_((+Z_R:.C'+V_QYR ME006 0 F?8T4<I$>57X$)NZ,'F"; GS\_QZ!C00FLXQ\_/\><I4$<O;_?/K_ M'LV4!B;$C!Y7G )\_/]R]/\>S90&)MV,'G6; AY7G (>=9L"'F.< G+V_WSZ M_Q[OE 8D>HT4=)$>DGX$)G.-'F"; GS\_QZ!C00F#8U\_/\><I4$<O;_?/K_ M'LV4!B8>C1Y7G )\_/]R]/\>S90&)C>-'G6; AY7G (>=9L"'FN< H+V_VX$ M !*$ @!0C8( !@6 @!(CB9FC1Y@FP(>5)L"% $ 'C.=!!ZCG )R]O]\^O\> M[Y0&)'J-%@ */C_("2.C"CX_R H" !\^O]R]/\>?HX$#AYQ?@(4,U0$544L M$(8J +N-%#-4!%5%+!"&+P"[C10S5 1512P0&!8E $J.)L6-@OK_*/C_(!1V MD1Z5?@0:X8T4>9$>E7X$&N&-%'R1'I5^!(XFZXV"^O\H^/\@@OK_)OB-<O;_ M'G*5!!8! "9ZCA1_D1Y5?@0F)(X>8)L"?/S_'H&-!"8=CGS\_QYRE00><YP" M)'>.%(&1'I)^!"9*CAY@FP)\_/\>?HX$)D..?/S_'G*5!!Y[G (D=XX4@Y$> MDGX$)G".'F"; GS\_QY^C@0F:8Y\_/\><I4$'H.< B1WCA8 "CX_R D^(TH M^/\@* 0 %(61'E5^!";5CG+Z_QY^C@2$ ";CAZG>@*"^O]N @ 2)JF.'F"; M G+Z_QYRE00>RYP"@OK_;@0 $H0" ,2.'LN< G+Z_QY*E006 H_/\@)%21 M%(B1'I)^!"8ICW+Z_QY^C@2$ #OCAZG>@*"^O]N @ 2)OV.'F"; G+Z_QYR ME00>UYP"@OK_;@0 $H0" !B/'M>< G+Z_QY*E006 H_/\@)%21%(N1'I)^ M!"92CW+Z_QY^C@0F1(]R^O\><I4$'K.< A8 "C\_R D5)$4C9$>DGX$)GN/ M<OK_'GZ.!"9MCW+Z_QYRE00>OYP"%@ */S_("14D120D1Z2?@0FLX]R^O\> M?HX$)I:/<OK_'G*5!!Y@FP(>5)L"% 'C.=!![CG (6 H_/\@)%21%)*1 M'I)^!"8.D'+Z_QY^C@0FSH]R^O\><I4$? @OC_;@ $@XF[H^"^O]N @ 8 M@O[_;@H $ XD^8^"^O]N @ 8%@( #H+Z_VX$ !@6 .%@$ */S_("14D124 MD1Z2?@0F>I!R^O\>?HX$A *Y 4EI$>I'X$? @OC_;@ $@Z"^O]N! 8 M@O[_;@H $ Z"^O]N @ 2)E:0%@ */S_(!Y4FP)R >=)T$@OK_;@( &(+^ M_VX* ! .%@ */S_("14D7S^_W+X_QZLD00.%*:1'I)^!";ID(+^_X0 )N0 M'J=Z H+Z_VX" !(FJ9 >8)L"<OK_'G*5!![+G *"^O]N! 2A ( Q) >RYP" M<OK_'DJ5!![7G *"^O]N! 2A ( WY >UYP"%@ */S_("14D12ID1Z2?@0F M39&"_O^$ #_D!ZG>@*"^O]N @ 2)@V1'F"; G+Z_QYRE00>UYP"@OK_;@0 M$H0" "B1'M>< G+Z_QY*E00>RYP"@OK_;@0 $H0" $.1'LN< A8 "C\_R D M5)&"_O\H_/\@*/S_(#X^ #P\ #P\/0 ^/CT /CX /#P *ST +3T *P M "H] M "\] "4] "H +P E "LK "TM "T )"T (0 J "8 :6QL96=A;"!A9&1R97-S M "LK "TM "@$ 'S^_W+X_QX2DP0.? @OC_;@ $@X><7X"%#-4!%5%+! 8 M%EL 2!KGD10S5 1512P0&!8H $B.)MZ2%@$ )MZ2%-J9'E5^!":"DH( (0 M R2%-R9'J1^!"0UDH( &X) !"$ P BDG+Z_QYRE00D-9*" !N"0 0A@( M-9(4[)D>I'X$'F"; AZ4@0(4_)D>DWH$@@ ;@H $(0" %22'E>< AYCG *" M^O]N 8@OC_;@0 &!8 X.@OK_;@( &(+^_VX* ! .@/[_ 0 DVY(4_ID> MDGX$)M22@@ A GI(4 >WGD$),*2@@ ;@D $(8$ +N2<OK_'G*5!!0 M ![>>00DPI)R >WGD$?/[_@OC_;@ &!8 X.)-N2@O[_*/S_("3JD8( M (0 .V2@O[_*/S_((( &X) !"$! +DQY4FP)R >=)T$%@ */S_((+^ M_RC\_R H#P""[_]N! 8%@ #A0 FAY5?@0F6Y-\ !R[?\>RH$$#A0"FAZ2 M?@0F39-\ !R[?\>RH$$#B0UDQ0$FAZ3>@2" H\?\@?/7_'DA\!":>E'SS M_WSS_Q[I>@0.)N:3<O/_'HJ:!(+O_VX !B"\?\.@N__;@( &(+Q_VX* ! . M@O/_;@D $(0# +J3@N__;@( &!8" Z"[_]N! 8@O'_;@H $ Z"\_]N"0 0 MA ( WY."[_]N! 8@O'_;@H $ X6 H\?\@).:3%@$ */'_('SS_WSS_QZO M>@0.)FV4@O/_;@D $(8$ &V4@N__;@ &(+Q_PZ"[_]N @ 8%@ #H+S_VX) M !"& @!$E(+S_VX) !"$ P ]E(+O_VX$ !B"\?]N"@ 0#A8! "CQ_R >5)L" M<O/_'G2=!(+O_VX" !B"[?]N! 8@N__;@H $ X.%@ */'_('SS_WSS_Q0$ M !0" !0 !0! !XQ>PP.@N__;@ &(+Q_PZ"[_]N @ 8%@ #BCQ_R!\_O\> MOI4$)L*4@N__;@ &(+M_VX" !@6 .#BCQ_R DR904!IH>I'X$*/'_((+\ M_VX$ !*& @#=E!8 """_O]N! 2)NN4%@ (!8! """_/]N! 2)@&5@O[_ M;@0 $HXF$I6"_/]N! 8%@ #B1)E8+^_VX$ !(F296"_/]N 8@OS_;@ M$@Z"_/]N @ 8@OS_;@( $@Z"_/]N! 8@OS_;@0 $@X@@O[_;@( $H0 &65 M@O[_;@ $A@>OYH$)'&5@O[_;@( $A@> )L$((+^_VX !(FA96"_O]N @ 2 MD(XFEY6"_O]N 2&!Y-F@0DHY6"_O]N @ 2&!XFFP0@%!F:'I-Z!!Z4@0(4 M&YH>DWH$<O[_'@*<!"!R_O\>;I8$)M>5'E2; @0W11@>,YT$)&J6<O[_'IR8 M!";PE1Y4FP($-T48'C.=!"1JEA0Q5!Y5?@0F9I8$*T4*-T44,U0$544L$(8B M #*6%#-4!%5%+!"$ =EB0REA1916 K12P8'HE^ A@>[)@$#"0 E@0K11@4 MN L6 0 N4B9(EA0=FAZD?@1>5444645@*T4L&!8 P>5)L"!#=%&!X)G@0D M:I86 @%@$ ("@& 'P (#Z_P #A0TFAY5?@0FAY9T_/\4-IH>DGX$)I&6 M%#-4!%5%+! 8'GY\!(0 *J6%@ */K_((#^_PH %#-4!%5%+!"$, #QEEY5 M110S5 1512P0"%1I E1I&!9X $@:WI8"5&D8%E@ 2(XF[): _O\0 %Y5123Q MEH#^_P@ %#-4!%5%+! (5&DF>9@"5&D8'GY\!"8BEWP '+^_X+Z_S 8 E1I M&!8P "XL#B1SF )4:6A (J7 E1I&!9 % F/I<"5&D8%D< 3(XF3Y<"5&D8 M%C< +@A4:21WEP)4:1@68 !0)F.7 E1I&!9G $R.)G27 E1I&!97 "X(5&DD M=Y<D>9A\ !R_O^"^O\P& )4:2P.)'.8 E1I&!8J $@FII<4,U0$545N 0 L M$!@>?GP$CB;$EUY517+X_QYNE@0& 8$A@$-T4P#B3QEB1SF )4:1@6+P!( M)N"7%#-4!%5%;@$ +! 8'GY\!(XF_I=>545R^/\>;I8$!@ &!(8!#=%,@XD M\98D<Y@"5&D8%BL 2"8:F!0S5 1516X! "P0&!Y^? 2.)C:87E5%<OC_'FZ6 M! 8 !@2<#=%#B3QEB1SF )4:1@6+0!()E*8%#-4!%5%;@$ +! 8'GY\!(XF M<)A>545R^/\>;I8$!@ &!(8!#=%+@XD\98D<Y@D>9A>544D\9:"_/\FAYA\ M ""_O] #H+X_VX !B"_O\*-T4.%@$ */K_(!8 HW110XFAY5?@2$ "R MF!8 " >B7X""%1I&!8G $HFQI@"5&F.CB;=F 0W11@6" ^&![LF (L"C=% M)+*8@O[_;@ & 0W10X6 0 @%#-4!%5%&!8! "XL$ A4:0)4:89< B9 E1I M(!Z)?@((5&D"5&F$;@ ;F1:; " "5&F$9@ GF19] " "5&F$= SF19_ " " M5&F$8@ _F19^ " "5&F$=0!+F18< " "5&F$9 !7F18= " "5&F$; !CF18> M " "5&F$<@!OF18? " "5&F$;0![F18- " "5&F$9P"'F1;] " "5&F$90"3 MF18; " "5&D8'GY\!";6F0)4:1@6, N"%1I%#-4!%5%+! 8'GY\!";6F0)4 M:1@6"@ P&!0S5&!512P0&!8P "XL"%1I)*F9 E1I(%L 8V%N)W0@<W5B<V-R M:7!T &-A;B=T('-U8G-C<FEP= != "@ * L "D :6YV86QI9"!E>'!R97-S M:6]N "@ *0!S=')I;F<@<W!A8V4@97AH875S=&5D "T *P G !0 1)11@> M)4$&<O[_'C.=!"""_O]N"0 0A@, 9IJ"_O]N"@ 0&!8! $B.)G>:% $ !$E% M&!XE008D@IH4 @ $2448'B5!!G+^_QYTG00@% , !$E%&!XE0084_P""_/]N M# 0.AB"_/\8% P %@$ +"P0&!8( #XL& 0]12X8'C.=!"""_O]N"0 0A@, MV)J"_O]N"@ 0&!8! $B.)NF:% 0 !$E%&!XE008D])H4!0 $2448'B5!!H+^ M_VX !@>=)T$((S^_X0! !:;% 8 !$E%&!XE008D(9L4!P $2448'B5!!A[) MG@(@C/[_A $ /)L4" $2448'B5!!B1'FQ0) 1)11@>)4$&(!0* 1)11@> M)4$&(!0+ 1)11@>)4$&(!0, 1)11@>)4$&!#U%;@( "CU%(!0. 1)11@> M)4$&(!0/ 1)11@>)4$&<OS_'G2=!(+^_VX" !@>7)T$!#U%&(+\_RX*/44@ M%! !$E%&!XE008@%!$ !$E%&!XE00:"_O]N @ 8'ER=! 0]11B"_/\N"CU% M'LF> B 4$@ $2448'B5!!G+^_QZ!G00@% T !$E%&!XE009R_O\>@9T$(!03 M 1)11@>)4$&<O[_'H&=!" 4+@ $2448'B5!!G+\_QXSG01R_O\>@9T$((+^ M_Q@$/44N"C%%!#%%)E.<%!0 !$E%&!XE008$,448'C.=!(+^_R 4%0 $2448 M'B5!!B 4%@ >WYX$(!07 ![?G@0@%!@ 'M^>!" 4&0 >WYX$(!0: ![?G@0@ M%!L 'M^>!" 4' >WYX$(!0= ![?G@0@%!X 'M^>!" 4'P >WYX$(!0@ 1) M11@>)4$&(!0A 1)11@>)4$&(!0B 1)11@>)4$&(!0C 1)11@>)4$&(!0D M ![?G@0@%"4 'M^>!" 4)@ >WYX$(!0G ![?G@0@%"@ 'M^>!" 4*0 >WYX$ M(!0J ![?G@0@%"L 'M^>!" 4+ >WYX$(!0M ![?G@0@%(, !$E%&!XE00:" M_O\8!$E%&!XE00:"_O\8%@@ /!@$2448'B5!!B 4@@ $2448'B5!!H+^_Q@$ M2448'B5!!B!R_O\>N)X$&!Z!G00@%( !$E%&!XE00:"_O\8!$E%&!XE00:" M_O\8%@@ /!@$2448'B5!!B!R_O\>N)X$&!ZWG00@%($ !$E%&!XE00:"_O\8 M!$E%&!XE00:"_O\8%@@ /!@$2448'B5!!B 4A $2448'B5!!H+^_Q@$2448 M'B5!!H+^_Q@6" \& 1)11@>)4$&(!2% 1)11@>)4$&@O[_& 1)11@>)4$& M@O[_&!8( #P8!$E%&!XE008@%(8 !$E%&!XE00:"_O\8!$E%&!XE00:"_O\8 M%@@ /!@$2448'B5!!B H @!\ !R^O\>N)X$#HSZ_Q@$2448'B5!!H( !@$ M2448'B5!!H( !@6" \& 1)11@>)4$&@OS_$":IGG;\_Q 8!$E%&!XE008D MDIX4 $2448'B5!!BC^_R""_O\8%OM4+A@6#@ R;A G( 0]11@6 @ N"CU% M( 0]16X" H]12",_O\8!$E%&!XE008$/448%@( +@H]12 *LLKL<:%R8BQ MQH7(H *QQH7*R+'&A<N@ +'*\ O1R- #R-#UJ0"J8)BB &#)7_ =R3"0%,DZ MD!7)09 ,R5N0#<EAD 3)>Y %H@"I 6"I *I@B+'&R5_P\,DPD/').I#HR4&0 MZ<E;D.#)89#AR7N0V$Q**HBQHJBQH/ (R*J8H "1HHJB & @%2R@ +&@\ ?) M+_ &R-#UJ0%@R+&@R2K0ZXBI )&@3),JB+&BJ+&@R2#0#LBQH,D@\/FJF* MD:**H@!@H@"QQH7)B+'&A<BQHH7*L<CP%:3*T:#0#* YLKFR-#NYLG0ZJD M8*7*H "1HF"QQH7+B+'&A<JQHAAEH(7(I:%I (7)3!8JB+&FT 2I *I@A<Z$ MS+&DA<C(L:2%R: L:*%RK'(\"*DRM&@T V@ .;*YLC0[N;)3"0KYLSFS*7, MQ<ZPR JH3!4KI,JQH"!1*M#HF* D:*DS,B8"JC(L:2JB+&D8(BQHJBQH,E? M\![),) 4R3J0%LE!D S)6Y .R6&0!,E[D :8H "1HF#(T-FQQH7)B+'&A<B@ M K'&A<K(L<:%RZ L<J1R,BQRI'((%$J\ /(T/2I )'(8" *K'*T<C0 IA@ *J0"J8. "X0)G/Z end --------------- end of acec.com --------------- fastc.com --------- begin 640 fastc.com M__]+/^9.3&<_0V%N)W0@9FEN9"!$,3I%3D=)3D4N3T)*FZD,HD @5N2I69U$ M ZD_G44#J0.=0@.I!)U* R!6Y! BJ4Z-1 .I/XU% ZD)C4(#C4D#H@ @5N2I M (43I1/P_&P* *D G4D#J0:=2 .=10.I@)U$ ZD'G4(#(%;D,,*M@@:=1 .- M_C^M@P:=10.-_S_NA ;0 ^Z%!JV$!CCM@@:=2 .MA0;M@P:=20,@5N2I#)U" M R!6Y$P +&%C90$ "4#G3B@" !3)21[B3006 0 FYT >=DD"%,M)%%-*'N)- M!@;H PIG2GP !0 O 1G2BX.!&=*&(+^_Q@$3DH8'FI-"'!G2@II2@1I2AB" M_O]P9TI:)G) %-))%%-*@OS_&!8 !#(8'N)-""030 1.2A@>?TT$%%-*%'< M'H5-!@I.2A8 I02A[O0 ($:4H8!&=*+F@ +- !&=*& 1I2A@$9THN& 1. M2A@>;4T(!%!*: $ R4 4_$D$4$H8'N)-!B3D0 102B;=0!012@102A@>XDT& M).1 %"5*'N)-!"030![N30(H_O\@!&=*& 1I2E8FGT@$9TH0"%)* E)*7 M$4%< 0 1020>010$ !Z@2 0DG$@D)D%< @ F0237001G2FX$ ! 8%B( 2"9" M001G2FX% ! 8%@4 2(XF>$$$9TIN"0 0A", :T$4!P 4 0 4 P >ND@(% 8 M%# 'F%)!B1U010% !0O !YA208DRD$$9TIN! 0&!8C $@FE$$$9TIN!0 0 M&!8% $B.)LI!7E!*!&=*;@D $(0B ,!!% < % $ % , 'KI("!0& !0R !YA M208DRD$4!0 4,0 >84D&% 0 'J!(!"2<2"1X05P# -]!).E!'FQ* B2<2"3V M05P$ /9!7 4 ]D$D T(4! >H$@$))Q()!I"7 8 &D)<!P :0EP( !I"7 D M&D(D)T(4 0 >H$@$))Q()"]"7 H +T(D/$(4! >H$@$))Q()$1"7 L 1$(D MOT(4 >'$D$!&=*;@0 $(0, +)"!&=*$&X% AK2@)K2A@6! !,)G5" FM* M&!8" $J.&IA" FM*&!8. % FET(":TH8%A, 3":70@)K2A@6"P!*CHXFLD(4 M @ 4 0 4 P >ND@(% $ % H 'F%)!A0$ !Z@2 0DG$@DLD)<# #'0B2[101G M2FX! !"$"P#:0A0! !X<200$9TIN 0 0&!8+ $@F]D($9TIN!@ 0&!83 $B. M)KE#!&=*;@4 $ AK2@)K2H0F !A#%#, 'OQ(!"2<2"2Y0P)K2H0H "U#%#0 M'OQ(!"2<2"2Y0P)K2H0J $)#%#4 'OQ(!"2<2"2Y0P)K2H0L %=#%#8 'OQ( M!"2<2"2Y0P)K2A@6)0!()G9#!&=*;@, $) F=D,$9TIN! 0D(XFDD,$9TIN M!@ *9TH4! >H$@$7E!*))Q()+E# FM*A"0 IT,40@ >_$@$))Q()+E# FM* MA"4 N4,40P >_$@$))Q(!&=*;@$ $!@6 @!()M5#!&=*;@8 $!@6$P!(CB8) M1 1G2FX% ! (:TH":TJ$)@#W0Q1$ ![\2 0DG$@D"40":TJ$* )1!1% ![\ M2 0DG$@$9TIN 0 0&!8+ $@F)40$9TIN!0 0&!86 $B.)DE$% , % ( % , M'KI("!0" !0W !YA2084! >H$@$))Q(!&=*;@$ $!@6 @!()F5$!&=*;@4 M$!@6%@!(CB:)1!0# !0" !0# !ZZ2 @4 @ 4. >84D&% 0 'J!(!"2<2 1G M2FX! ! 8%@L 2":E1 1G2FX& ! 8%@T 2(XFY$0$9TIN!0 0&!8E $@FRT0$ M9TIN P 0D";+1 1G2FX$ !"0CB;D1 1G2FX& IG2A0$ !Z@2 1>4$HDG$@$ M9TIN 0 0&!8# $@F#T4$9TIN!0 0&!8) $@F#T4$9TIN!@ 0&!86 $B.)D5% M% , % , 'BE-!&X" !@>0DT&% , % $ % 0 'KI("!0# !0_ !YA2084! > MH$@$))Q(!&=*;@$ $!@6"P!()FA%!&=*;@, $) F:$4$9TIN! 0D(XFKD4$ M9TIN!0 0A"4 CD44!0 41P >84D&% $ 'J!(!"2<2"2N101G2FX% !"$) "N M110% !1( !YA2084 0 >H$@$))Q(% $ 'J!(!"2<2"3:0EP- ,-%)-!%% 0 M'J!(!"2<2"3815P. -A%).5%% $ 'J!(!"2<2"3M15P/ .U%)/I%% 8 'J!( M!"2<2"0"1EP0 )&) ]&% $ 'J!(!"2<2"0<1EP2 !Q&7!, '$8D*484! > MH$@$))Q()#%&7!0 ,48D<48$9TIN! 0A!0 9$84!@ 4 @ >*4T$&!0& !XI M300L&!Y"308$9TIN! *9TI>4$HD,484! >H$@$))Q()#%&7!4 \49<%@#Q M1EP7 /%&7!@ \49<&0#Q1EP: /%&7!L \49<' #Q1EP= /%&7!X \49<'P#Q M1EP@ /%&7"$ \49<(@#Q1EPC /%&7"0 \49<)0#Q1EPF /%&7"< \49<* #Q M1EPI /%&7"H \49<*P#Q1EPL /%&7"T \48D_D84 0 >H$@$))Q() 9'7"X M!D<D$T<4!P >H$@$))Q()"I'7"\ *D=<, J1UPQ "I'7#( *D<D-T<4! > MH$@$))Q()$Y'7#, 3D=<- !.1UPU $Y'7#8 3D<D6T<4!P >H$@$))Q()&-' M7#< 8T<D<$<4! >H$@$))Q()'A'7#@ >$<DA4<4! >H$@$))Q()(U'7#D MC4<DFD<4! >H$@$))Q()+%'7#H L4=<.P"Q1UP\ +%'7#T L4<DOD<4! > MH$@$))Q(),9'7#X QD<DTT<4! >H$@$))Q()-M'7#\ VT<DZ$<4! >H$@$ M))Q()/!'7$ \$<D_4<4! >H$@$))Q() 5(7$$ !4@D$D@4! >H$@$))Q( M)"E(7$( *4A<0P I2%Q$ "E(7$4 *4@D-D@4!P >H$@$))Q()#Y(7$8 /D@D M2T@4! >H$@$))Q()%A(7$< 6$A<2 !82"1E2!0! !Z@2 0DG$@D;4A<@ !M M2"1Z2!0# !Z@2 0DG$@D@DA<@0""2"2/2!0# !Z@2 0DG$@DDD@DF4@@))Q( M)-I()))().] ( 1G2AB"_/\8!$Y*&!YM30@$9TI^_O\*9TH@!OK_&!(8@OK_ M&!8! "XL#@;\_Q@2&(+Z_Q@6 0 N+ Z"_O\F^T@$9TI^^O\8!&=*?OK_$ QX M_O]X^O]X_/\DVD@@% 0 % ( % , 'KI("!0# (S\_Q@>84D&% < 'J!(!" $ M9TI^_O]N! 0AA4 +$D@!O[_&!)N @ .<O[_<OS_'BE-!!@6 0 ^&!Y"3084 M 0 4 ""^O]N @ 8'KI("%YG2EY02B $9TI^_/\*9TH$9TH8@OS_#%Y02B H M @ 6 0 FQ4D>$DX"'NY- A132AZ,3@0>H$T"%%-*%#I*'M!-!A132A1R !Z% M308*3DIF "^210^2A132A[B308D>4DDPDDH_O\@)'E)*/[_(!P )7,@+2T@ M "HJ*D524D]2*BHJFR5S(&ES(&=R96%T97(@=&AA;B E9$L@8GET97.; "5D M(&YE=R!I;G-T<G5C=&EO;G.; "5D(&YE=R!I;G-T<G5C=&EO;IL 3F\@;F5W M(&EN<W1R=6-T:6]N<YL 0T-# $-A;B=T(&]P96XZ("5SFP"I+D@@#$9HB/ % MH@E,:$O-&T;0'*X<1O %J0H@#$8H!@ $9TIN!0 0A L A4H4!0 >'$D$))A* M!&=*;@8 $(0+ )A*% 8 'AQ)!'S\_P1G2FX$ ! .!&=*;@0 $(0, ,A*!&=* M;@4 $(0) ,A*!&=*;@< $!@6!P!(CB8M2P1G2FX& !"$(@#\2@1G2FX( !"$ M(P#Q2A0[ ![I3 0H^O\@)/Q*%#H '@E-!"CZ_R $9TIN!@ 0A", +4L$9TIN M" 0A"( (DL4/0 >Z4P$*/K_("0M2Q0\ !X)300H^O\@@OS_A P 3DL$9TIN M!0 0A L 3DL$9TIN"0 0&!86 $B.)HI+% @ % ( 'BE-!!@4!P >*4T$+!@> M0DT&% 8 % % ( 'KI(" 1G2FX& IG2EY02AYL2@(H^O\@@OS_A P JTL$ M9TIN!0 0A L JTL$9TIN"0 0&!8' $B.)MU+% < % 8 % , 'KI("!0# !0 M !0$ !ZZ2 @4 P 40 >84D&% < 'J!(!"CZ_R""_/^$# S3 1G2FX% ! ( M:TH":TH8%@0 3!H.3 )K2A@6"P!(&@Y, FM*&!8/ $B.)C-,% ( % $ % , M'KI("!0! !0^ !YA2084! >H$@$*/K_((+\_X0) $A,!&=*;@4 $!@6# !( MCB:@3 1G2FX& ! (:TH":TIF! !F3 )K2A@6 @!*CAI[3 )K2F@. 'I, FM* M&!83 $R.CB:@3!0# !0! !0# !ZZ2 @4 @ 4.0 >84D&% 0 'J!(!"CZ_R"" M_/^$"0"_3!0! !0 !0$ !ZZ2 @4 0 400 >84D&@OS_A @ WDP4 0 4 4 M! >ND@(% $ %$8 'F%)!A0$ !Z@2 0H^O\@% 8 % $ % , 'KI("!0% (S\ M_Q@>84D&% 0 'J!(!" 4!0 4 0 4 P >ND@(% 0 C/S_&!YA2084! >H$@$ M( 1G2G[^_Q 8!&=*?OS_;@$ $!@6" ^+" $9TI^_/\8@OS_# 1G2G[\_VX! M !B"_/\8%@@ / P@ ,L 8L DL PL \L !(L !4L !@L !LL !XL "$L M "0L "<L "HL "TL # L #,L #8L #DL #PL #\L $(L $4L $@L $LL $XL M %$L %0L %<L %HL %TL & L &,L &8L &DL &PL &\L '(L '4L '@L 'LL M 'XL ($L (0L (<L (HL (TL ) L ),L )8L )DL )PL )\L *(L *4L *@L M *LL *XL +$L* ( @ 0"" !F" U3B0K3G0 "0:3G( !Y_300D)4XH M_O\@* ( <OK_'HQ.!( @@ 9@$ A4YR^O]R^O\>T$T&? @OC_&!1R M !Z%308.@@ 9@$ @DX4N4YR^/\>XDT&<OK_'HQ.!"1(3H( "C^_R 4R$X> MXDT$<O[_'KA-!(+^_VX !"$ "X3A0< ![E3004G >Y4T$'I=- B!C86XG M="!O<&5N("5SFP!F:6QE;F%M92 H;W(@4D5455).('1O(&5X:70I/R X +A # F<_ end ---------------- end of fastc.com ---------------- link.com --------- begin 640 link.com M__]+/SM&3&<_0V%N)W0@9FEN9"!$,3I%3D=)3D4N3T)*FZD,HD @5N2I69U$ M ZD_G44#J0.=0@.I!)U* R!6Y! BJ4Z-1 .I/XU% ZD)C4(#C4D#H@ @5N2I M (43I1/P_&P* *D G4D#J0:=2 .=10.I@)U$ ZD'G4(#(%;D,,*M@@:=1 .- M_C^M@P:=10.-_S_NA ;0 ^Z%!JV$!CCM@@:=2 .MA0;M@P:=20,@5N2I#)U" M R!6Y$P +&%C90$ "4 &MA2@ !3@C1Y^M 84H@ 4PZP>?K0&%*0 %,NL'GZT M!A[_M (4WD0>S[0$'D% B8\0"0R0![;M (@*%8 'MNT GRL_QZ@M00>C;0" M?*S_?*K_'O"T!!@6 0 N+!!F00!^0'RL_WRJ_Q[PM 08%@$ +BP8%@ #!1E ME7RJ_Q[JM 9\K/\4'$4>O;0&?*S_'K1 !!8! "BJ_R >V[0"%"!%'L^T!!ZB MM (>A+0"("A< ("L_P "L&L"K^L<J+_@JK_+! FVT!RHO^"JO\L$!@6+@!* MCB;D0'2L_R3"0'S&_W*@_Q[JM 9\QO^"JO\L&!0Z11[JM : L/\ 'S&_X*N M_RP0)B=!?-K_@J[_+!A\Q/^"K/\L$&Z QTL/\D D%\VO^"KO\L&!8 R ML/\ '*B_X*N_RP0)EU!?.[_@J[_+!ARH/^"K/\L$&Z QTL/\D.$%\[O^" MKO\L&!8 P4/T5\[/]\UO\>S[0(%@E "LNL%,N<%- ''F:T!A3%I!30!QYF MM 84/&X4I!\>9K0&%."1%(0#'F:T!A3!E10(!QYFM 9\IO^"H/\8%'( 'G*T M!@YF C0GRF_X*@_Q@4=P ><K0&#A8 K)K(*B_W#)K!"&+@#W08*B_QA@ MR:PL$!ARI/\>=;0&)-=!%%!%%!0 <J+_'EJT"![_M )\IO^"H/\8%'( 'G*T M!@YF C0A1E11[<KP1\QO\4=P ><K0&"LFL9@ 0T(4>D5\Q/\$R:P8'NNO M"!;+G J;I!;%I J5K!8! K)G'RR_W*D_Q[CK 8F,4-\LO\4<@ ><K0&"L>L M9@ @D(4AT5\L/\$QZP8'NNO"!8 ADE7RN_WRP_Q04 !0N !Z3M @.9@ MJ$(4DD4>W*\$)"9#?++_@JS_+!@4I$4>M[0&)KU")"9#?++_@JS_+!@4J44> MM[0&)A]#'C>M E[!K 2;I$1$"IND1D82)N=")-9"%)VD!,&L*BP8!)ND1D8* MFZ0.!)6L1$0*E:Q&1A(F"D,D^4(4EZP$P:PJ+!@$E:Q&1@J5K XD)D,4KD4> MW*\$!,>L&!YLM 0D54)RIO\>;+0$%,!%!,NL&![/M 8>N[("?*;_@J#_&!1R M !YRM 8.9@ :$,4V45RH/]RHO\>ZZ\(?*C_!,NL#A8 0 K%K K+K!8 K! MK K#K'RJ_Q3G11XVLP0.9@ F$,4[$4>W*\$%/\ !,FL&!YUM 84_P $R:P8 M'G6T!A3W11YCL 04 0 >E[ $% 'I>P!!3+G!3!E8*F_RHL$BHL$A@>=[ $ M<JC_'G>P!!;+G J;I!;%I J5K!8 K)G'RR_W*D_Q[CK 8FRT1\LO\4<@ > M<K0&"L>L9@ '404^T5\L/\$QZP8'NNO"!8 ADE7RN_WRP_Q04 !0N !Z3 MM @.9@ 0T04#D8>W*\$),!$?++_@JS_+!@4($8>M[0&)H%$%#Q&%@( +!@4 M/$84 "@6I!\L& 3'K!@>5[0(&!8" "X8!,FL&!Y:M @DP$1\LO^"K/\L&!0E M1AZWM 8FN40>K+ "'@*P E[!K!2=I 3!K"HL$@J;I!27K 3!K"HL$@J5K"3 M1!0J1A[<KP0$QZP8'FRT!"3P0W*F_QYLM 0$R:P8'FRT!"BD_R!]?R @(" @ M5&AE($%#12!,:6YK97*;(" @8GD@2F]H;B!086QE=FEC:"!A;F0@4F%L<&@@ M5V%L9&5NFYN; $Q.2P!0<F5S<R!K97D@=&\@97AI="!T;R!$3U.; "Y#3TT M'!R<G)R<)7.MK;Z@)7.@FP";04-%0TE/FT5.1TQ/040N3T)*FP!#86XG="!O M<&5N($Q.2R!F:6QEFP!C86XG="!W<FET92 8V%N)W0@9FEN9 !U;FMN;W=N M(&9I;&4@='EP90 N3T)* "Y#0T, =6YK;F]W;B!F:6QE('1Y<&4 /CX^0V]D M92!E;F1S(&%T("0E>" \/#R; $-A;B=T(')E+7)E860 ;6%I;@!.;R!M86EN M*"F; &%C90!C86XG="!R92UO<&5N(&9I;&4 =6YK;F]W;B!F:6QE('1Y<&4 M+D]"2@ N0T-# '5N:VYO=VX@9FEL92!T>7!E ..L!;8H @!\ !R^/]R^/\> M8+0&#A@6 !2)C"M@OK_;@ $(0[ NM).:L@OK_&!2FLQZ]M 8$R9PF)JT4 MJK-R^/\>S[0&%@$ */[_("3FK!8 "C^_R $E:QN 8!)6L;@( &!8! X. M%-&L'FZO!"95K2 6/$8*W*P4/$8$T:PL"MZL!-RL& 3>K%0F6Z]@W*P0"-NL M9H @JU>RZPD6*\"VZQ<@ "7K5R# )>M7(4 EZTDKZT$W*QN @ *W*P$RZQN M @ *RZPD6*\DMZU<@@"WK23#K5[<K%[+K"18KR3+K5R& ,NM)/>M!,NL& 3< MK&X ! 8!-RL;@$ $!@6" ^+"P*RZP$W*QN @ *W*PD6*\D_ZU<A #_K20S MK@3+K!@$W*QN 0& 3<K&X! ! 8%@@ /BP*T:PL"LNL!-RL& 31K&X" "P* MW*PD6*\D.ZY<@0 [KB2.K@3<K&X ! 8!-RL;@$ $!@6" ^+ K1K!@6$"=2 M)G&N!)ND& 31K!@6$"<N*BP8!,NL#B1_K@25K!@$T:PJ+!@$RZP.!-RL;@( M"MRL)%BO)'&N7(@ FZY<AP";KB1%KP3<K&X ! 8!-RL;@$ $!@6" ^+!@6 M$"<N"M&L!-RL;@( "MRL!-RL&!0! !0\;@2_K!@6"0 P+!@$W*P8'NJT!BPL M"MRL%,&5!+^L*BP8!)ND&!;+G"X8%@$ /'#1K X"VZR$B 3KQ3@D02_K"P8 M%@$ #"0PKQ3@D02_K"P8%@( # 2;I!@$T:PJ+!@$T:QN 0 .7K^L:(,#/Z\4 MKK,>W*\$)%BO)!.O)%6O%,"S'MRO!"18KR1MKR1(KR1EK03<K!@$WJQ*)FVO M%-"S'MRO!" H @!\ $QZP8% < %#Q&% H%@$ 0!@6 0! &!YCM X.: MGZ\4WK,>W*\$)-BO@@ &!:( $!*)KNO%/*S% *T<OS_'NNO""38KX+\_Q@4 M2 ,$QZP8%@0 /BP8'GNT! X6 H_O\@*/[_(!0,M'+\_Q[/M 8>H$ "(!05 MM'+Z_W+V_X+X_T 8'L^T"AZ@0 (@!,.LA $; $RZP*Q:P@!,6L&!Y%L 0$ MQ:QPPZP8%@$ +A@>1; $%."-!,.L& 3)K!@>6K0(!,NL"L6L%@ "L.L((+^ M_Q@$R:P8'G6T!H+^_Q@6" \& 3)K!@>=;0&((+^_Q F=K!V_O\0&!Z7L 0D M8[ @@O[_&!;_ #H8'I>P!(+^_Q@6" \&!;_ #H8'I>P!"",_O\8'J.S! 3# MK&@ !*NP'@*P B $E:QN @ 2"M.L%-&L'FZO!";!L" 6/$8*W*P4/$8$T:PL M"MZL!-RL& 3>K%0FJ+)@W*P0"-NL9H ^+ "VZP8%@$ /A@>E[ $)*6R MNL M7(( [$D$K%@W*P0&!Z7L 0DI;(D&K%<@P :L21!L03<K&X ! 8'I>P! 3< MK&X! ! 8'I>P! 3<K&X" K<K"2ELB1)L5R% $FQ)'>Q!-.L& 3<K&X ! L M& 3<K&X! ! 8%@@ /BP8'G>P! 3<K&X" K<K"2ELB1_L5R! '^Q)(ZQ!-RL M;@( "MRL)*6R)):Q7( EK$DZ+$$W*QN 0& 3<K&X! ! 8%@@ /BP*T:QF M$"?%L025K!@$T:PJ+!(8'G>P!"39L02;I!@$T:P8%A G+BHL$A@>=[ $!-RL M;@( "MRL)*6R),6Q7(0 \+$D*[($W*QN 0& 3<K&X! ! 8%@@ /BP*T:P$ MW*QN @ *W*QDT:QH ELF#<K! 8'I>P!"01LB2ELB01LER& #.R)&.R!,NL M& 3<K&X ! 8!-RL;@$ $!@6" ^+"P*RZP$W*QN @ *W*P> K ")*6R)'"R M7(@ <+)<AP!PLB22L@3<K!@$W*QN @ 8% H% 'I.T"&X# "P*W*PDI;(D ME;(DHK(4(+0>W*\$)*6R)+JR))6R)-&P!-RL& 3>K$HFNK(4+;0>W*\$(!8 M K1K 31K(B_K#6S)-*R7M&L),&R%."1!-&L+!"$ @ RLQ0\;@31K!@6"0 P M+ K5K 35K!@>-K,$"M>L&!8 %(F([,4RYP4P94$T:PJ+!(J+!@4RYP4P94$ MUZPJ+!(J+!(.)#*S%#NT!-6L&![/M 8>H$ "),RR(!8 K-K 3-K(B_K)NS M)$VS7LVL)#RS@O[_&!0\;@3-K!@6"0 P+!@4"0 $OZP8!,VL+A@>H+,*"L^L M!,^L9@ ?K,6 0! ( 3-K'#/K K-K!3@D03-K"P0A $ F+,$S:P@)$>S%@$ M0" "L 5BM#0T, )7.; %1O;R!M86YY(&=L;V)A;'.; &)A9"!B>71E(&-O M9&4NFP!B860@0T-#(&9I;&6; $-#0R!F:6QE('1O;R!L87)G99L 8V%N)W0@ M<F5A9"!F:6QE "Y#0T,@9FEL90!E<G)O<B E<P!;)7-=)7,Z)62; &)A9"!O M<"!C;V1EFP!B860@0T-#(&-O9&6; &YE=F5R(&1E9FEN960Z("5SFP RP M!BP "2P #"P #RP $BP %2P &"P &RP 'BP (2P )"P )RP *BP +2P ,"P M,RP -BP .2P /"P /RP 0BP 12P 2"P 2RP 3BP 42P 5"P 5RP 6BP 72P M8"P 8RP 9BP :2P ;"P ;RP <BP =2P >"P >RP ?BP @2P A"P ARP BBP MC2P D"P DRP EBP F2P G"P GRP HBP I2P J"P JRP KBP L2PH @ & 8 M%@$ #@8 !(8%@@ 3"8OM20CM08 !@21 XD"K4& 2&!YLM 0D&;4H_O\@ M* ( !OK_$A@>H+4$!@ &!8 X& 2&!8! $PFF+4&^O\2& ;Z_Q(8'KVT M!@8 !@&^/\2&!9R !@><K0&#@8 !(8%@$ 3":5M1;8M1@&^/\2&![/M 8& M^O\2&!Z@M00D1[4& 2*/[_(!;GM1@>S[0$!O[_$A@>I;0$!O[_$A@6 L M$!@6 !()M>U%AP &![2M 06G 8'M*T!!Z$M (@8V%N)W0@;W!E;B E<YL M9FEL96YA;64@*&]R(%)%5%523B!T;R!E>&ET*3\@ KARNQQH7%B+'&A<2@ M K'&A=3(L<:%U<BQQH6PR,BQQH6QR+'&A;*B (:SH/_(L<31U- 'R0#0]:6S M8*74&&6PA=20 N;5YK/0 >BEL\6QT-KDLM#6J?^J8*6@&(AQHH7(I:'(<:*% JR8BQQI'(L:(8:0&1HLBQHFD D:*(L:08:0&1I,BQI&D D:1@X +A F<_ end --------------- end of link.com --------------- acecio.c -------- /* ACEC IO ROUTINES */ /* To reduce the CCC file size, no arguements are defined in the assembly */ /* language functions. The arguements that should be passed if any, */ /* will be in the comment after the function name. */ /* */ /* Be sure to read the file FLOAT.TXT for a description of floating point */ /* functions. */ /* */ abs() /* (i) RETURNS absolute value of integer (removes the sign if any) */ /* same as Basic only with an integer value */ asm 0x2C03; alpha() /* (c) RETURNS 1 if c is aplabetic, 0 if not ('_' is alphabetic) */ asm 0x2C06; atof() /* (fp,asc) converts aschii to floating point. */ asm 0x2C09; bgets() /* (addr,len,iocb) get len# of bytes from iocb and put into addr. /* RETURNS: actual length transferred */ asm 0x2C0C; bputs() /* (addr,len,iocb) put len# of bytes into iocb. */ /* returns 1 if okay, else negative error number */ asm 0x2C0F; cgetc() /* (iocb) returns char from iocb, else negative of error number */ asm 0x2C12; cgets() /* (addr,iocb) gets a record from iocb (everything up to the */ /* next RETURN. Returns the length */ /* Like BASIC: INPUT #iocb,str$ */ asm 0x2C15; ciov() /* (iocb,command,addr,len,ax1,ax2) RETURNS: Y register (Y=1 if okay) */ /* Like Basic XIO command */ /* Used to call Operating System CIO. Use -1 to ignore any operand */ asm 0x2C18; clear() /* (addr,len) put zero into locations from addr through addr+len.*/ asm 0x2C1B; clog() /* (a,b) b=clog(a) Floating Point only! (same as Basic) */ asm 0x2C1E; close() /* (iocb) close iocb (same as BASIC: CLOSE #iocb)*/ asm 0x2C21; color() /* (col) set color for plotting (same as Basic) */ asm 0x2C24; copen() /* (name,mode) open filename in mode specified */ /* r-read, w-write, u-update, a-append, d-directory */ /* example: copen(filename,'r'); */ asm 0x2C27; cputc() /* (c,iocb) put byte c to iocb. RETURNS: - if error */ /* same as BASIC: PUT #iocb,c */ asm 0x2C2A; cputs() /* (addr,iocb) send string at addr to iocb. RETURNS: - if error */ asm 0x2C2D; dpeek() /* (addr) RETURNS word at addr */ asm 0x2C30; dpoke() /* (addr,word) poke word into addr. RETURNS: previous value (word) */ asm 0x2C33; drawto() /* (x,y) draw to x,y using color specified in color(c) */ asm 0x2C36; exit() /* return to DOS */ asm 0x2C39; exp() /* (a,b,c) c=a^b (floating point only!) */ asm 0x2C3C; fadd() /* (a,b,c) c=a+b (floating point only!) */ asm 0x2C3F; fast() /* turn off screen, turn on critic - results in faster computations */ /* [see slow()] */ asm 0x2C42; fdiv() /* (a,b,c) c=a/b floating division */ asm 0x2C45; find() /* (addr,len,c) look for character c starting at addr though addr+len */ /* returns position, or -1 if not found */ asm 0x2C48; fmul() /* (a,b,c) c=a*b floating multiplication */ asm 0x2C4B; fsub() /* (a,b,c) c=a-b floating subtraction */ asm 0x2C4E; ftoi() /* (f.p.) return integer value of floating point (will round off decimal part) */ asm 0x2C51; getchar() /* returns aschii key and echos it to the screen */ asm 0x2C54; getkey() /* returns asckii key but does not affect the screen */ /* Same as BASIC: OPEN #1,0,4,"K:":GET #1,var */ asm 0x2C57; gets() /* (addr) returns a string from the editor */ /* Same as BASIC: INPUT STR$ */ asm 0x2C5A; graphics() /* (num) closes, then opens iocb #6 in graphics mode specified (same as Basic) */ asm 0x2C5D; gtime() /* returns the integer value of the internal clock in 60ths of a second */ /* to clear the clock, use the C function: dpoke(19,0); */ asm 0x2C60; itof() /* (i,fp) converts integer i to floating point (fp) */ asm 0x2C63; locate() /* (x,y) returns the color at screen location x,y */ /* (same as Basic) */ asm 0x2C66; log() /* (a,b) b=log(a) floating point only! (same as Basic) */ asm 0x2C69; match() /* (s1,s2) return false if strings are different, 1 if the same */ /* It will return a 1 if s2 is equal to s1 even if s1 is longer. */ /* Example: match("testpattern","test"); will return true (1) */ asm 0x2C6C; move() /* (from,to,len) move len# of bytes at address one, to address two. */ /* No check is made to see if from string is overwriting to string */ asm 0x2C6F; normalize() /* (filename,ext) will convert filename to uppercase, */ /* append the extension if there isn't one already, */ /* and add D1: to the front if a drive isn't specified */ /* Example: normalize(fname,"C") where fname="test" will change fname to: */ /* "D1:TEST.C" */ /* One can change the default drive with the statement: */ /* poke(dpeek(0x2CB4),'n'); where n is the drive number */ /* To make it permanent, you must now save it to ENGINE.OBJ */ /* The load parameters can be found by using COMPACT.COM. (see COMPACT.TXT) */ asm 0x2C72; open() /* (iocb,ax1,ax2,fname) same as Basic open */ asm 0x2C75; peek() /* (addr) returns byte at addr (same as Basic) */ asm 0x2C78; plot() /* (x,y) plot point at x,y. Point color set by color(c) */ asm 0x2C7B; poke() /* (addr,c) poke c into addr, returns previous value */ asm 0x2C7E; position() /* (x,y) position cursor at x,y (same as Basic) */ asm 0x2C81; printf() /* see file PRINTF.TXT for explanation */ asm 0x2C84; putchar() /* (c) send c to the screen */ asm 0x2C87; rnd() /* (n) return random integer between 0 and n inclusive. */ /* if you want 0-255, use rnd(0) which is faster */ asm 0x2C8A; sfind() /* (s1,s2) search for string s2 in s1 and return position if found, */ /* else return -1 */ asm 0x2C8D; slow() /* turn on screen again after fast() */ asm 0x2C90; sound() /* (voice,pitch,distortion,volume) same as Basic */ asm 0x2C93; stick() /* (n) returns value of joystick #n */ asm 0x2C96; strcat() /* (s1,s2) append string 2 to end of string 1 */ asm 0x2C99; strcmp() /* (s1,s2) subtracts string 2 from string 1. */ /* It will return the first non-zero difference. */ /* Example: strcmp("Ab","ab") returns -32 */ /* Example: strcmp("ab","Ab") returns 32 */ /* Example: strcmp("ab","ab") returns 0 */ asm 0x2C9C; strcpy() /* (to,from) copy string 2 to string 1 */ asm 0x2C9F; strig() /* (n) return trigger button value of joystick #n */ asm 0x2CA2; strlen() /* (str) returns length of string */ asm 0x2CA5; tolower() /* (c) return lowercase value of c */ asm 0x2CA8; toupper() /* (c) returns uppercase value of c */ asm 0x2CAB; usr() /* (addr,args) does a JSR to addr, returns integer (A=low byte, X=high byte */ /* 0xBF=number of arguements, 0xC6=stack pointer to arguements */ asm 0x2CAE; val() /* (addr) returns integer value of string at addr (same as Basic) */ asm 0x2CB1; closeall() $( /* close all iocb's */ int i; for(i=1;i<8;++i) close(i); $) getread(s,ext) /* get the file name from the user, */ /* normalize it with the extension, and open it for reading */ /* Returns the iocb number */ char s[],ext[]; $( int iocb; getname(s); iocb=0; while(iocb<1) $( normalize(s,ext); iocb=copen(s,'r'); if(iocb<1) $( printf("can't open %s\n",s); getname(s); $) $) return iocb; $) getname(s) /* request the filename from the user */ char s[]; $( printf("filename (or RETURN to exit)? "); gets(s); if(!s[0]) $( putchar(''); putchar(''); exit(); $) $) --------------- end of acecio.c --------------- cformat.c --------- /* This program formats C files */ /* See CFORMAT.TXT for a detailed explanation of what if does */ /* */ #define PAD 2 /* number of spaces to indent after a "$(" */ #define SPACE 32 #define TAB 127 #define EOL 155 int iocb,count,i,length,csflag,dflag,iocb2; char s[20],c,lastchar,nextchar,*bufptr,*endptr,bak[20]; main() $( int backup; char *maxsize,*address; /* address MUST be the last variable defined!!! */ address=&address+100; /* This is the address for the text */ maxsize=0xBC00-address; /* Maximum text length */ printf("\f\t The ACE C Formatter\n\t by Ralph Walden\n\n"); printf("^M will insert a return\n^N will delete through the next return\n\n"); while(1) $( /* loop until user indicates no more files via getname() function */ dflag=csflag=iocb=count=lastchar=c=backup=0; slow(); getname(s); printf("Do you want a back-up? (Y/N)"); if(tolower(getkey())=='y') backup=1; putchar('\n'); fast(); closeall(); strcpy(bak,s); normalize(s,"C"); if(backup) $( if(i=find(bak,strlen(bak),'.')) *(bak+i)=0; /* erase the period */ normalize(bak,"BAK"); printf("\u%s <<< %s\n\n",s,bak); $) else printf("\u%s (no back-up)\n\n",s); if((iocb=copen(s,'r'))<1) $( printf("Can't open %s\n",s); continue; $) length=bgets(address,maxsize,iocb); /* read in all of the text */ /* address points to the stack, to which was added a safety margin of 100 */ /* This gives us an area for the buffer. address MUST be the last variable defined! */ close(iocb); if(length>=maxsize) $( printf("Text exceeds %dK\nYou wouldn't be able to link\nit either!\n",length/1024); continue; $) if(backup) $( if((iocb2=copen(bak,'w'))>0) $( bputs(address,length,iocb2); /* write all of the text to a backup */ close(iocb2); $) else $( printf("I can't open %s\nShall I continue without a back-up?\n(Y/N)",bak); if(toupper(getkey())!='Y') continue; $) $) endptr=address+length; /* get the length of the text */ *(endptr+1)=EOL; /* to avoid some checks for end of buffer */ if((iocb=copen(s,'w'))<0) $( printf("Can't open %s\n",s); continue; $) bufptr=address; while((i=find(address,length,TAB))>=0) *(bufptr+i)=SPACE; /* convert tabs to spaces */ while(*bufptr==SPACE) ++bufptr; /* remove any starting spaces */ for(;bufptr<endptr;++bufptr) $( /* MAIN LOOP */ while(((c=*bufptr)>'d') && (c != EOL)) out(*bufptr++); if(c==13) c=EOL; /* convert control M to a RETURN */ switch(c) $( case SPACE: /* remove all but one space */ out(SPACE); while(*bufptr==SPACE) ++bufptr; --bufptr; /* in order to read next character */ break; case 'b': /* handles "break" statements */ if(match(bufptr,"break;")) $( if(dflag) $( /* break after a default */ count-=PAD; csflag=dflag=0; $) else if(csflag) $( /* break after a case */ count-=PAD; csflag=0; $) $) out(c); break; case 'c': /* handles "case" statement */ if(match(bufptr,"case ")) $( csflag=1; /* indicate we are dealing with a case */ count+=PAD; /* increase the indentation */ $) out(c); break; case 'd': /* handles "default" statement */ if(match(bufptr,"default")) $( ++dflag; /* indicate that we have a default */ count+=PAD; $) out(c); break; case '0': /* convert all hex to upper case */ out(c); if(tolower(*(bufptr+1))=='x') $( out(*(bufptr+1)); bufptr+=2; while(hex(*bufptr)) out(toupper(*bufptr++)); --bufptr; /* so we will read it at top of loop */ $) break; case '$': /* this handles $( and $) */ nextchar= *(bufptr+1); lastchar= *(bufptr-1); if(nextchar=='(') $( if((lastchar != SPACE) && (lastchar != EOL) && (*(bufptr-2) != EOL)) out(SPACE); /* add a space */ count+=PAD; $) out(c); if(nextchar==')') count-=PAD; break; case '&': /* separate || and && with spaces */ case '|': lastchar= *(bufptr-1); if(lastchar==c) $( out(c); if(*(bufptr+1)!=SPACE) out(SPACE); $) else if((*(bufptr+1)==c) && (lastchar!=SPACE)) $( out(SPACE); out(c); $) else out(c); break; case '/': /* this handles comments */ if(*(bufptr+1)=='*') $( out(*bufptr++); /* '/' */ out(*bufptr++); /* '*' */ while(1) $( /* find the end of the comment */ while((*bufptr != EOL) && (*bufptr != '*')) $( out(*bufptr++); $) out(*bufptr); if(*bufptr == EOL) $( /* if the comment continues to the next line, we must add a '/*' */ i=1; while(*(bufptr+i)==SPACE) ++i; if(*(bufptr+i) != '/') $( out('/'); /* start the new line with a comment it it isn't already there */ out('*'); out(SPACE); $) $) else if(*(bufptr+1)=='/') break; /* end of comment */ ++bufptr; /* not the end of the comment, so we continue the loop */ $) $) else out(c); break; case EOL: /* this handles all returns */ out(c); if((bufptr+2)<endptr) $( ++bufptr; while(*bufptr==SPACE) ++bufptr; if(csflag) $( if((match(bufptr,"case ")) || (match(bufptr,"default"))) count-=PAD; $) i=0; /* adjust the padding according to "case", "default", etc. */ if((*bufptr=='$') && (*(bufptr+1)==')')) i=2; /* back up two spaces for statement close */ if(*bufptr=='/') i=count; /* don't add spaces if it's a comment line */ if(match(bufptr,"asm ")) i-=2; /* indent two spaces */ for(;i<count;++i) out(SPACE); /* send out the appropriate number of spaces */ --bufptr; $) break; case '"': /* handles quotes */ out(c); ++bufptr; while((*bufptr != '"') && (*bufptr != EOL)) out(*bufptr++); if(*bufptr == EOL) $( --bufptr; break; $) out(*bufptr); /* end of quote */ break; case 14: /* control N will delete through the next return */ while(*bufptr != EOL) ++bufptr; break; default : out(c); break; $) $) $) slow(); exit(); $) out(tc) char tc; $( cputc(tc,iocb); $) hex(c) /* determine if c is a hexadecimal character or not */ char c; $( if((c>='0' && c<='9') || (tolower(c)>='a' && tolower(c)<='f')) return 1; else return 0; $) ---------------- end of cformat.c ---------------- compact.c --------- /* File compacter. This will compact files with multiple load segments. */ /* It is useful for .COM files produced by C, and assembly language object files. */ /* Binary file must not exceed 6K! (about 49 sectors) */ char *buf,*begin,*end,*place,*endbuf,name[20]; main() $( int iocb,tmp; iocb=getread(name,"COM"); buf=0x5000; endbuf=bgets(buf,0x6000,iocb)+buf; if(getint(buf) != 0xFFFF) $( printf("Not a binary file!\n"); getkey(); exit(); $) buf+=2; /* get past the header */ place=buf; while(1) $( if((begin=getint(place))<0) break; /* end of file? */ end=getint(place+2); /* end of first module */ printf("\n%x - %x",begin,end); tmp=(end-begin)+5+place; if(tmp>=endbuf) break; /* end of file */ if(getint(tmp)==(end+1)) $( /* compact it */ printf(" Compacted"); *(place+2)=*(tmp+2); *(place+3)=*(tmp+3); move(tmp+4,tmp,endbuf-tmp); endbuf-=4; $) else place=tmp; $) close(iocb); copen(name,'w'); buf-=2; /* this is to get the header we discarde at the beginning */ iocb=bputs(buf,endbuf-buf,iocb); close(iocb); putchar(155); slow(); $) getint(where) char *where; $( if(where>endbuf) return -1; /* end of the file */ return *where+(*(where+1)<<8); $) ---------------- end of compact.c ---------------- filecmp.c --------- /* File compare */ /* This program will compare two files and tell you if they are the same */ int n1,n2,count,c,c2,a1,a2,a3; char name1[20],name2[20]; main() $( printf("Filename #1? "); gets(name1); printf("Filename #2? "); gets(name2); normalize(name1," "); normalize(name2," "); if((n1=copen(name1,'r'))<0) $( printf("can't open %s\n",name1); getkey(); exit(); $) if((n2=copen(name2,'r'))<0) $( printf("can't open %s\n",name2); getkey(); exit(); $) a1=a2=a3=count=0; fast(); while((c=cgetc(n1))>=0) $( if(c!=(c2=cgetc(n2))) $( slow(); printf(" Files are different at %d\n%s != %s\n%d != %d $%x != $%x",count,name1,name2,c,c2,c,c2); printf(" '%c' != '%c'\n",c,c2); printf("$%x $%x $%x >%x< $%x $%x $%x\n",a1,a2,a3,c,cgetc(n1),cgetc(n1),cgetc(n1)); exit(); $) ++count; a1=a2; a2=a3; a3=c; $) if((cgetc(n2)>0)) $( slow(); printf("%s is larger than %s\n",name2,name1); exit(); $) slow(); printf("%s == %s\n",name1,name2); exit(); $) ---------------- end of filecmp.c ---------------- graphics.c ---------- /* graphics and game i/o */ /* */ #define RAMTOP 0x6A #define PMCOLOR 0x2C0 #define SDMCTL 0x22F #define GRACTL 0xD01D #define CHBASE 0x2F4 #define PMBASE 0xD407 #define PLSIZE 0xD008 #define HPOSPL 0xD000 #define PLTOPF 0xD004 #define PLTOPL 0xD00C #define HITCLR 0xD01E #define OLDCHSET 0xE000 #define GRAF 0xD00D char *playbase,*charbase,playsize; /* */ /* initialize players */ /* */ pminit() /* this must be called before any use of the following PM functions */ $( int i; charbase=(peek(RAMTOP)-12)<<8; poke(PMBASE,peek(RAMTOP)-8); playbase=(peek(RAMTOP)-8)<<8; poke(RAMTOP,peek(RAMTOP)-16); graphics(0); pmgraphics(0); move(OLDCHSET,charbase,1024); poke(CHBASE,charbase>>8); $) pmflush() /* call this before returning to DOS to turn off PM graphics */ $( pmgraphics(0); poke(CHBASE,OLDCHSET>>8); poke(RAMTOP,peek(RAMTOP)+16); graphics(0); $) /* Set up PM graphics */ /* i=0 > inhibits PM graphics */ /* i=1 > single line resolution */ /* i=2 > double line resolution */ pmgraphics(i) int i; $( int j; if(i) $( poke(SDMCTL,i==1 ? 0x3E : 0x2E); /* enable DMA */ poke(GRACTL,3); playsize= (i==1) ? 8 : 7; clear(playbase,2048); playbase += (i==1) ? 1024 : 512; for(j=0;j<4;++j) poke(HPOSPL+j,0); $) else $( poke(SDMCTL,0x22); poke(GRACTL,0); for(j=0;j<4;++j) $( poke(HPOSPL+j,0); poke(GRAF+j,0); $) $) $) hitclear() /* clears the collision registers */ $( poke(HITCLR,0); $) pmcolor(n,hue,intensity) /* works like setcolor(), defines color of player n */ char n,hue,intensity; $( poke(PMCOLOR+n,(hue<<4)+intensity); $) /* define player width */ /* width=0 > normal width */ /* width=1 > double normal width */ /* width=3 > four times normal width */ pmwidth(n,width) char n,width; $( poke(PLSIZE+n,width); $) /* */ /* hitpf() and hitpl() return a 1 if who collided with hitwho, otherwise it will return 0. */ /* if hitwho is minus, a collision with any hitwho will return a 1 */ /* */ hitpf(who,hitwho) /* player-playfield collisions */ int who,hitwho; $( if(hitwho<0) return peek(PLTOPF+who); /* if hitwho is minus, check for any collision */ return (1<<hitwho) & peek(PLTOPF+who) ? 1 : 0; $) hitpl(who,hitwho) /* player-player collisions int who,hitwho; $( if(hitwho<0) return peek(PLTOPL+who); /* if hitwho is minus, check for any collision */ return (1<<hitwho) & peek(PLTOPL+who) ? 1 : 0; $) pmclear(n) /* clear the player n */ char n; $( clear(playbase+(n<<playsize), 1<<playsize); $) chget(c,s) /* get the character definition for c and put it in string s */ char c,*s; $( move((c<<3)+charbase,s,8); $) chaget(c,s) /* get the atari character definition for c and put it in string s */ char c,*s; $( move((c<<3)+OLDCHSET,s,8); $) chput(c,s) /* put string s into the character definition of c */ char c,*s; $( move(s,(c<<3)+charbase,8); $) /* used for defining and moving a player shape */ /* The first value of shape should contain the length. */ /* The second and last values should be \0 to clear previous value when moving the shape */ plmove(n,x,y,shape) /* move shape into player n, position (x,y). */ char n,x,y,*shape; $( move(shape+1,playbase+(n<<playsize)+y,*shape); poke(HPOSPL+n,x); $) pladdr(n) /* returns the address of player n */ char n; $( return playbase+(n<<playsize); $) /* setcolor(reg,hue,lum) /* -- set color reg to hue & lum combo /* same as Basic */ setcolor(reg,hue,lum) int reg; char hue,lum; $( poke(708+reg,(hue<<4)+(lum & 14)); $) /* */ /* fill(x,y,c) /* returns positive if successful /* */ fill(x,y,c) int x; char y,c; $( poke(765,c); dpoke(85,x); poke(84,y); return ciov(6,18,-1,-1,-1,-1); $) paddle(n) /* return position of paddle n */ char n; $( return peek(624+(n&7)); $) ptrig(n) /* return paddle trigger n */ char n; $( return peek(636+(n&7)); $) /* */ /* vstick(n) -- -1 if up, +1 if dn /* */ vstick(n) char n; $( switch(stick(n)&3) $( case 1: return 1; case 2: return -1; default: return 0; break; $) $) /* */ /* hstick(n) -- +1 if right, -1 if left /* */ hstick(n) char n; $( switch(stick(n)&0xC) $( case 4: return 1; case 8: return -1; default: return 0; break; $) $) ----------------- end of graphics.c ----------------- pmdemo.c -------- /* */ /* Demo the player graphics */ /* */ int x[4],y[4],dx[4],dy[4],shape[4],n; /* we use globals because they are faster than locals */ main() $( char i; while(1) $( poke(764,255); /* get ready to look for a key press */ pminit(); /* initialize player-missle graphics */ pmgraphics(1); /* single line resolution */ poke(710,0); /* background black */ putchar('\f'); /* clear the screen */ poke(0x2F0,1); /* turn off the cursor */ position(10,9); printf("A PM Graphics Demo\n"); position(10,10); printf("(look at PMDEMO.C)\n"); position(8,12); printf("Press a key to restart."); for(i=0;i<4;++i) $( pmcolor(i,4*i,8); /* define the colors */ pmwidth(i,0); /* normal width */ $) ballhack(); pmflush(); /* clear player missle graphics */ $) $) ballhack() $( shape[0]="\10\0\0\0\0\0\0\0\0\0\0"; shape[1]="\10\0\0\0\0\0\0\0\0\0\0"; shape[2]="\10\0\0\0\0\0\0\0\0\0\0"; shape[3]="\10\0\0\0\0\0\0\0\0\0\0"; for(n=0;n<4;++n) $( x[n]=rnd(150)+50; /* randomly select starting positions */ y[n]=rnd(150)+50; while(!(dx[n]=rnd(3)-1)); /* randomly select directions */ while(!(dy[n]=rnd(3)-1)); chget(rnd(127)+1,shape[n]+2); /* randomly select a character for the shape */ $) while(peek(764)==255) $( /* until a key is pressed */ for(n=0;n<4;++n) $( plmove(n,x[n],y[n],shape[n]); /* move the shape */ x[n]+=dx[n]; /* add the directions */ y[n]+=dy[n]; if(x[n]<41) $( dx[n]=1; continue; $) if(x[n]>200) $( dx[n]=-1; continue; $) if(y[n]<32) $( dy[n]=1; continue; $) if(y[n]>223) $( dy[n]=-1; continue; $) /* if we were looking for who we collided with, we would use hitpl(who,hitwho) */ if(hitpl(n,-1)) $( /* did it hit anyone? */ dx[n]=rnd(3)-1; while(!(dx[n]=rnd(3)-1)); while(!(dy[n]=rnd(3)-1)); y[n]+=dy[n]; plmove(n,x[n],y[n],shape[n]); pmclear(n); chget(rnd(127)+1,shape[n]+2); /* new shape drawn from character base */ hitclear(); $) $) $) $) --------------- end of pmdemo.c --------------- prime.c ------- /* Sieve of Eratosthenes */ /* See BYTE , January 1983, for comparision with other computers */ /* Takes about 5 minutes to run, with the screen off */ #define TRUE 1 #define FALSE 0 #define SIZE 8190 char flags[SIZE+1]; main() $( int i,prime,k,count,iter; printf("10 iterations\n"); fast(); dpoke(19,0); for(iter=1;iter <= 10;++iter) $( count=0; for(i=0;i <= SIZE;++i) flags[i]=TRUE; for(i=0;i <= SIZE;++i) $( if(flags[i]) $( prime=i+i+3; for(k=i+prime;k<=SIZE;k += prime) flags[k]=FALSE; ++count; $) $) $) k=gtime()/60; slow(); printf("%d primes (1899)\n",count); printf("%d seconds\n",k); $) -------------- end of prime.c -------------- engine.obj ---------- begin 640 engine.obj M__\ +"@_3#HV3"PR3,(U3%4T3'0U3&DU3(4M3.$S3"LM3!(V3"$U3 ,R3)(Q M3!\S3*,M3-4Q3%<N3&$N3+PQ3*<V3/,T3*PT3$\U3*,T3 N3)HT3+4T3#0U M3/4L3/XL3+@S3%TQ3(DU3-DT3,DQ3+XT3*TU3-LM3+0R3.DS3"\N3*TQ3#TN M3)@Q3 0O3 <M3)XS3$0R3%\U3.$U3(HS3*DN3+LN3,(M3)0S3'LR3*0R3)0R M3 \R3'LNVS)LQ #(L<"%Q8BQP(7$L<0XZ0*%OZ7 ..6_A<:EP>D A<>QPH7$ MR+'"A<6EPAAI H7"D +FPR"V+(74AM5,(3@@_BP@-#:B &"(A"H@-S:B &"( ML<9,^"RQQ@H*"@JJ8* #L<:%RXBQQH7*B+'&A<F(L<:%R&"(( TMH *QQIU" M Z %L<;)__ )G44#B+'&G40#H >QQLG_\ F=20.(L<:=2 .@"<G_L<;P!HBQ MQIU* Z +L<;)__ &B+'&G4L#(%;DF! (HO])_QAI 6"B &"(( TMT -,]2RI M!YU" ZD G4@#G4D#(%;D,-JB &#(L<8*"@H*JKU' XV^+;Q& \B,O2V@ +'& M('3D3'<M(!4MH@"$U;'*D<CP"LC0]^;)YLOHT/"88* %L<:9R "($/C(I<S0 M!J7-\!'&S<;,L<B1RLC0[>;)YLO0YV"@!+'&F<@ B!#XR(3-ILJES. T C& MRQ $J?^J8,K1R- $F*;-8,C0Z.;-YLG0XK'&A<F(L<:%R*( L<A@L<:%R<BQ MQH7,H "QQH7(L<BJI<R1R(JB & @+RY(R+'(JFA@(!4ML<B%S,BQR(7-I<N1 MR*7*B)'(ILVES&"QQH7TB+'&A?.$\B V*74A<@I?X74(-+9I<@P!:74IM5@ MI=5)_ZJEU$G_:0%@(!4ML<CP".;(T/CFR=#T3,DM(!4ML<CP#='*T G(T/7F MR>;+T.\X\<HP Z( 8*+_8(@@#2V.5B^]1@.-7"^]1P.-72_N7"_0 ^Y=+Z " ML<:%R,BQQH7)R$PJ+['&\-*%R8BQQH7(K0?DC5TOK0;DC5PO[EPOT /N72^I M (U6+\C(A,JI (6XJ?^%SH7/J0"%O(6^A;V%N86ZI+BQR/ ,R27P)"!5+^:X M3# O8*( H "$*" T-L" D/*8('HMA=2&U:+_FDPA.,BQR,DE\-4@ES*0 ,DM MT 6%ODQP+\DNT 6%O4QP+\E!D -,X"^B (V !<BQR,DZL K),) &Z)V !=#O MJ8"%\ZD%A?2I (7RZ*F;G8 %B(2X( #8(-+9I;W0"Z74A<ZDN(2Y3' OI=2% MS^;/I+A,<"^$N,E$\ -,DS"DRLBQQA 1A;Q)_X75B+'&2?\8:0%,!C"%U8BQ MQH74(*K9(.;8I;GP)Z L?,P \C0^:6\\ '(A+NEOM 9QLZEN\7.D *P":D@ M(%4OQL[0[R!2,$S?,"!2,,;.I<[P]*D@(%4OQLY,1#"EO/ +J2T@52^ESO " MQLZ@ (3RI/*Q\S 2R2[P%2!5+^;RI;K0$\;.3&4P*7_&S$Q5+^:ZI,_0Y6#& MSL;/T-3P]\E8\ -,Z#"DRLB$O+'&A=6(L<:%U*75T 2%O*742"GP2DI*2AAI M,,DZD )I!B!5+V@I#QAI,,DZD )I!B!5+Z6\\ FI (6\I=1,L##FN.;*YLI, M,"_)0] *I,JQQB!5+TS?,,E3\ -,$C2DRK'&A<3(L<:%Q:6YT 8@2S%,WS"@ M +'$\ /(T/F$NZ6^T!6EN\7.L FI("!5+\;.T/$@2S%,2#$@2S&EN\7.L FI M("!5+\;.T/%,WS"@ +'$\ L@52_FQ-#SYL70[V"B8(B$0H0.J5"%#ZD,G4(# M(%;DJ0.=0@.ID)U$ ZDQG44#H "QQIU+ RGP21R=2@-,="U3.HBQQH6W8+'& MA5;(L<:%5* L<:%5:6WC?L"8""8,2"W]9@P Z( 8$QZ+2"8,:)@J1&=0@-, M="T@F#$@D_6(\.3(T.3(( TMJ0F=0@.=20.(L<:%R9U% XBQQIU$ X7(H "$ MRX;S((8RIO.IFY'(3'0MB" -+:D,G4(#3'0ML<:-*S*(L<:-*C+&O\:_I<88 M:0*%QI "YL=,=.2QQC %JHBQQF"I #B(\<9(J0#(\<:J:& @%2V$S(3-L<J% MSK'(\!?%SO 7YLS0 N;-YLC0[N;)T.JFS:7,8*+_BF#(L<KP\M'(\/>@ /#< ML<:%R8BQQH7(H@"QR/ (R-#YYLGHT/288(BQQLE[L ;)89 "Z2"B &"(L<;) M09#VR5NP\FD@3*$R(!4MA,Z@$+'(()<RD<B($/;(L<CP"\DZ\"K)(/ #R-#Q MJ42-@ 6I,8V!!:DZC8(%H ZQR)F#!8@0^* 0N8 %D<B($/B@ +'(\ ?)+O < MR-#UJ2Z1R,B$S*3.L<JDS)'(R0#P!N;,YL[0[F"I$*J]0 /)__ (BAAI$!#R MJF"@ +'&G40#R+'&G44#J0.=0@/(L<:&R""7,J;(R4'P$\E2\!/)5_ 3R57P M$\E$\!.B_V"I"= .J030"JD(T :I#- "J0:=2@,@5N0P"(I*2DI*H@!@F$QZ M+8BQQJBY> *B &"(L<:HN1#0H@!@B+'&\ ^%R,;(K0K2Q<B0!_ %L/6M"M*B M &"B +'&G44#B+'&G40#J06=0@.=20,@5N0P"Z0HB*D D228H@!@F$QZ+<@@ M#2V(3+HSB" -+:D#G4(#H 6QQC &B+'&G4L#H :QQIU$ \BQQIU% Z "L<9, M=C/)1O #3-\PI,JQQJK(L<:H((G=(.;8H "Q\S 'R2[P&<C0]2E_D?/(J2Z1 M\\BI,)'SR*FPD?-,#C#(L?,0^"E_3$$TH .QQH7TB+'&A?.I (7R( #8H "Q MQH7,R+'&A<U,CS2@!;'&F<@ B!#XH 6QR)G4 +'*F> B!#S8* %N=0 D<R( M$/A@('4T(-O:3(\T('4T("C;3(\T('4T(&;:3(\T('4T(&#:3(\T(!4MH 6Q MR)G4 (@0^"#-WJ %N=0 D<J($/A@B+'&A=3(L<:%U<BQQH7*R+'&A<L@JME, MSC2(L<:JR+'&J"")W2#1WJ "L<:JR+'&J""8W2#;VB#,W: L<:%S,BQQH7- M3(\T(!4MH 6QR)G4 (@0^"#1WDS.-+'&A<F(L<:%R* %L<B9U "($/@@TMFF MU*758*TO H6VJ0"-+P*- -3F0F"EMHTO JD A4)@((XUJ0N=0@-,="T@CC6I M!YU" R!6Y+U( ZB]20.JF&"E%*838* $( TMH .QQIU) XBQQIU( XBQQIU% M XBQQIU$ V @%2VB +'*\ K1R- #R-#UJ0!@F&"B (BQQLE?\!/)09 ,R5N0 M"\EAD 3)>Y #J0!@J0%@J0.-#]*I (T(THBQQBD#"JJ@ K'&G0#2H 2QQBD/ M"@H*"H7(H :QQBD/!<CHG0#28" 5+9BFR_ +D<B(T/O&R^;)T/&DRO (B/ % MD<B(T/N1R&!,I/9,XO:M!N08:0&--3:M!^1I (TV-JT6Y!AI 8VQ,:T7Y&D MC;(QK13D&&D!C<TQK17D:0"-SC&M).08:0&-.#:M)>1I (TY-JTO H6VJ9J% MPJDVA<.M!T"%P*T(0(7!H !,#S<$!4 8(@(>I#8" *<V; H I<(8:0*%PI " MYL.@ $P/-['"A<3(L<*%Q:7"&&D"A<*0 N;#B*74D<1,#S>QPH7$R+'"A<6E MPAAI H7"D +FPZ75D<2(I=21Q$P/-\BQP(7%B+' A<2EU)'$I< XZ0*%P+ " MQL&QPN;"T +FPZJ]8SN-)3>]9#N-)C=,=.2QPH7$R+'"A<6EPAAI H7"D +F MPXBQQ(74A-5,#S>QPH7$R+'"A<6EPAAI H7"D +FP['$A=6(L<2%U$P/-['" M&&7 A=3(L<)EP8753*HVR+' A<6(L<"%Q*74D<2EU<B1Q(A,!#>QU(74A-5, M#S>QU*K(L=2(A=6&U$P/-Z7 &&D"A<"0 N;!L<*1P,BQPI' 3*HVL<*%U,BQ MPH753*HVI< 8:0*%P) "YL&EU)' I=7(D<"(3 \WIM2QP(74BI' R*;5L<"% MU8J1P(A,#S>EP!AI H7 D +FP<BQPJJ(L<*HI<*$PJ &&D"D<"EPVD R)' MAL.(3 \WH &QP(7#B+' A<*QPN;"T +FPXT[.*7 ..D A<"P L;!3 \WIL*Q MP(7"BI' R*;#L<"%PXJ1P(A,#S>QPJK(L<*%PX;"B$P/-Z74T.ZEU? )3%PX MI=0%U?#A3*HVI=31PM *R*75T<+0 TQ"/4PL/:7 &''"A<"EP<AQPH7!3*HV M!M0FU4P/-[' &&74A=3(L<!EU875B$P$-[' ..74A=3(L<#EU875B$P$-Z74 MA>"EU87AL<"%XLBQP(7C(/8ZH "EXH74I>.%U4P$-R $.4SA." $.: I>"% MU*7AA=5,!#>QP(7@R+' A>&EU:343*(ZL< %U(74R+' !=6%U8A,!#>QP$74 MA=3(L<!%U875B$P$-[' )=2%U,BQP"75A=6(3 0WIM3@"/ 7L<"%U,BQP. M\ 9*9M3*T/J%U8A,!#>$U<BQP(B%U$P$-Z;4X CP%[' A=3(L<#@ / &!M0J MRM#ZA=6(3 0WA-2QP(753 0WJ0 XY=2%U*D Y=6%U4P/-ZG_1=2%U*G_1=6% MU4P/-^;4T +FU4P/-Z74T +&U<;43 \W.+' Y=2JR+' B.758+' Q=30'<BQ MP(C%U= 5A-3FU$P$-[' Q=30\\BQP(C%U=#KA-2$U4P$-R#(.3#?$/(@R#DP MV-#KBM#H\-$@R#DPX=#*BM#'\-H@R#DPU1"^R+' B,75D+;0R;' Q=20KK#! MR+' B,75D*30M[' Q=20G/":T*W(L<"(Q=60I=".L<#%U)"=\)M,XSG(L<"( MQ=60D-#SL<#%U+#M3/@YH! &XB;C)N FX9 +I>#EYJ7AY>=,G#JEX,7FI>'E MYY *A>&EX.7FA>#FXHC0U&"B (7GA.;)@$7AA>20"HKEYH7FBN7GA>>DX*7A MR8!FY! (BCCEX*B*Y>&%XX3BAN"&X2!S.B3D$ N*..7@A>"*Y>&%X23D4 N* M..7BA>**Y>.%XV"EXT7AA>2EXS -2?^%XZ7B2?^%XDP5.Z7BT +&X\;BI>$0 M#:D ..7@A>:I .7AA>>%YZ7@A>:@ (3@A.&@$$;C9N*P#*7@9>:%X*7A9>>% MX4;A9N!FXV;BB-#G).00#3BI .7BA>*I .7CA>-@N2PG-T4W93>Z-M8V]C9V M-XTWEC>D-[LWQS=J.-\W]C<A.$4X7#AU.)$XHCBI.+LXS3CN./0X%#DE.38Y M1SEO.94YI3FT.;TYU3GJ.?\Y!CH2.AXZ)3HW.DLZ8#I^./4[*SQ:/) \&SU3 M/6@]>SV0/:$]R#WX/10^,#Y,/F@^C3ZM/M8^PCS2/.(\_#SP/@@_'C^QPH7$ MR+'"A<6EPAAI H7"D +FPXBQQ!AI 9'$A=30#<BQQ&D D<2%U8A,#S?(L<2( MA=5,#S>QPH7$R+'"A<6EPAAI H7"D +FP['$A=6(L<2%U!AI 9'$T C(L<1I M )'$B$P/-['"A<3(L<*%Q:7"&&D"A<*0 N;#.(BQQ.D!D<2%U+ -R+'$Z0"1 MQ(75B$P/-\BQQ(75B$P/-['"A<3(L<*%Q:7"&&D"A<*0 N;#L<2%U8BQQ(74 M..D!D<20 TP/-\BQQ.D D<2(3 \WI=31PM!TI=7(T<+0;4PH/:74T<+04*75 MR-'"\%U,*#VQPH7$R+'"A<4XI=2(\<2JI=7(\<000TPH/;'"A<3(L<*%Q3BE MU(CQQ*JEU<CQQ# IT!.*T!!,/#TXI=3QPJJEU<CQPA 4H &$U*7"&&D$A<*0 M N;#H !,#S>@ (34A-6@ K'"JLBQPH7#AL*@ $P/-SBEU/'"JJ75R/'",-S0 MQHK0PTP\/:75R-'"D+G0RZ74B-'"D+!,/#VEU<C1PI"ZT*2EU(C1PI"Q\*], M*#VEU!AQPH74I=7(<<*%U4RJ-K'"A<3(L<*%Q:7"&&D"A<*0 N;#I=08B''$ MA=2EU<AQQ(75B$P/-['"&&7 A<3(L<)EP87%I<(8:0*%PI "YL.EP!AI H7 MD +FP;'$D<"(L<21P$P/-['"&&7 A<3(L<)EP87%I<(8:0*%PI "YL-,"3RQ MPAAEP(7$R+'"9<&%Q:7"&&D"A<*0 N;#3#\\L<(89<"%Q,BQPF7!A<6EPAAI M H7"D +FPTQN/+'"&&7 A<3(L<)EP87%I<(8:0*%PI "YL-,I#RQPAAEP(7$ MR+'"9<&%Q:7 &&D"A<"0 N;!I<61P(BEQ)' 3*HVL<(89<"%Q,BQPF7!A<6( ML<089=2%U,BQQ&75A=5,JC:QPAAEP(7$R+'"9<&%Q:7"&&D"A<*0 N;#L<*1 MQ(75B+'"D<2%U$RJ-K'"&&7 A<3(L<)EP87%L<2%U8BQQ(743*HVL<(89<"% MQ,BQPF7!A<6(L<2%U(353*HVI=30"Z75T >$U(353 \WA-3FU$P/-Z74T.ZE ,U=#J3!<_X +A CHV end ----------------- end of engine.obj ----------------- engload.obj ----------- begin 640 engload.obj M__]3/_\_3&\_0V%N)W0@9FEN9"!$,3I%3D=)3D4N3T)*FZD,HD @5N2I89U$ M ZD_G44#J0.=0@.I!)U* R!6Y! :J5:-1 .I/XU% ZD)C4(#C4D#H@ @5N1L M"@"I )U) ZD&G4@#G44#J8"=1 .I!YU" R!6Y##*K8(&G40#C?X_K8,&G44# MC?\_[H0&T /NA0:MA 8X[8(&G4@#K84&[8,&G4D#(%;DJ0R=0@,@5N1, "S@ % N$";S\& end ------------------ end of engload.obj ------------------ asm.txt ------- Assembly language runs about 10 times faster than ACE C and takes up about a third of the space. ACE C provides the ability to define a function as an assembly language routine via the asm statement. To define the function use: func() $( asm address-of-function; Note that asm acts like a closing brace, signaling the end of the function. You need not include any arguments in func(). Any arguments between the parenthesis will be placed on a stack in the order that they occur. When your routine gets control, the pointer to the stack will be at $C6, and the number of arguments passed will be in $BF. To get the low byte of an arguement use: LDY #argumentnumber*2 LDA ($C6),Y To get the high byte, use LDY #arguementnumber*2+1. If you want to return an integer, load A with the low byte, and X with the high byte. To return a character, load A with the character, and X with a zero. End your code with an RTS. The page zero locations which are free are $80 through $B5, and $C8 through $CF. ACE C uses the Operating System's floating point registers, so though you may use them, don't leave a value in them expecting it to be there the next time your routine is called. Two additional locations that may be of value to you are $B7 - color from color(c), and $B6 the graphics in 559 before fast() was used. ENGINE.OBJ starts at $2C00, so you may use memory from LOMEM (value in $2E7) up to that. Also $400-$57F, and $600-$6FF is free. ($400-47F is the cassette buffer). LINK will tell you where the stack starts, so you could figure out a safe place well above that. Assemble your program with the extension ".OBJ". Be sure to include it in the ".LNK" file with the extension ".OBJ". The order it appears is not relevant. Note that both ENGINE.OBJ and ENGLOAD.OBJ use the load/run address at $2E0. -------------- end of asm.txt -------------- blue.txt -------- There are several differences between BLUE C and ACE C. The ACE C compiler runs 10 to 15 times faster, especially when using #define's. The Linker runs 4 to 5 times faster and the execution time of programs is about twice as fast. To maximize speed ACE C eliminates the following checks: 1) Eliminates check for different versions. If you link an ACE C ".CCC" file with DEEP BLUE C's DBC.OBJ your computer will crash. 2) Eliminates check for the stack overwritting into the screen. 3) Eliminates check for division by zero. Here are the more noticeable differences between the two compilers: 1) ACE C does not allow imbedded comments or comments to continue to the next line. 2) ACE C does not allow the tab character to be used as a space. 3) ACE C does accept programs with line numbers. 4) ACE C does do constant evaluation at compile time. 5) ACE C asm is VERY different then BLUE C. Don't use an assembly program for BLUE C with ACE C. (See ASM.TXT) 6) The fprintf function from BLUE C will work as a printf function in ACE C. (printf checks to see if an iocb was included). The printf function is part of ENGINE.OBJ. 7) Most BLUE C functions have been rewritten in assembly language and are part of ENGINE.OBJ. They run faster, and take up less space. 8) BLUE C loads at $3000; ACE C loads at $2C00. 9) The psuedo code has been extended by 27 instructions. These new instructions are used when FASTC.COM has been used on a ".CCC" file. There is no check for a bad code caused by a messed up file. 10) The usr(addr,arg1,arg2,...) acts just like the asm function. (See ASM.TXT) --------------- end of blue.txt --------------- cformat.txt ----------- CFORMAT.COM is a means for formatting your C programs. Run it using the "L" option from DOS. CFORMAT.COM will normalize the filename you give it with ".C". The backup option creates a file with the extension ".BAK" and then copys your original file to "filename.BAK". This enables you to retrieve the original from filename.BAK. CFORMAT examines all of your program that is not surronded by quotes or comments and makes the following changes: 1) Replace all tabs with spaces (the compiler won't accept tabs). 2) The lines following a $( will be indented 2 spaces until the closing $). 3) The instruction "asm" will be indented 2 spaces. 4) Lines after a "case" or a "default" will be indented 2 spaces until a "break;" is encountered. Note: you can end a "case" or "default" with a "return" or "continue", which CFORMAT will not interpret to be the end of the case/default statement. You can get around this by ALWAYS ending a "case" or "default" with a "break;", even if there was already a "continue;" or "return;". 5) All spaces at the beginning of the line are removed except for the indenting described in 2, 3, and 4. Multiple spaces within a line will be replaced by a single space. 6) || and && will have a single space around them. 7) If a /* is found, a check is made to see if there is a */ before the end of the line. If not, it will put a /* at the beginning of the next line if there isn't one already. This continues until the next */ is found. If none is found, the entire program will be turned into a large comment. (A good reason for using the provided back-up option.) The following control codes may be inserted in you source code for special effects: 1) If a control N is used, everything through the next return is deleted. (This is a way to combine two lines) 2) If a control M is used, it is replaced with a return character, thereby creating a new line. The source for CFORMAT is in the CFORMAT.C file so that you can customize the program. ------------------ end of cformat.txt ------------------ fastc.txt ---------- FASTC.COM will optimize ".CCC" files, lowering execution time 20-30%. A ".CCC" file is composed of "psuedo" instructions to be executed by ENGINE.OBJ. FASTC looks for certain sequences of instructions, and replaces them with a faster single instruction. Run FASTC by using the "L" option from DOS. When it requests a filename, specify a file already compiled by ACE C. FASTC will automatically add the extension ".CCC". The screen will be turned off while FASTC changes the file. When it is done, the number of new instructions will be displayed. ----------------- end of fastc.txt ----------------- float.txt --------- ACE C has a limited support of floating point by using the functions defined in ACECIO.C. To define a floating point number, use: char name[6];. Floating point will be the same as Basic only instead of using operators like + and -, etc., you must use one of the following functions: (for the examples, a,b,c are presumed to have been previously defined as: char a[6],b[6],c[6];) atof(a,str) - convert the string to a floating point and put it in a. Example: atof(a,"3.14276") - same as BASIC A=3.14276 clog(a,b) same as Basic B=CLOG(A) exp(a,b,c) same as Basic C=A^B fadd(a,b,c) same as Basic C=A+B fdiv(a,b,c) same as Basic C=A/B fmul(a,b,c) same as Basic C=A*B fsub(a,b,c) same as Basic C=A-B ftoi(a) this will return the integer value of a. This is NOT the same as Basic INT(A). Basic simply removes the decimal portion, whereas ftoi(a) will round the number either up or down. Example: atof(a,"1.9"); x=ftoi(a); - sets x=2. BASIC: A=1.9: X=INT(A) sets X=1. itof(i,a) converts the integer i to floating point and puts it in a (opposite of ftoi) log(a,b) same as Basic B=LOG(A) NOTE: any var may be used in the functions. Example: fadd(a,a,a) is the same as Basic A=A+A. To do something like A=B, use move(b,a,6);. ---------------- end of float.txt ---------------- printf.txt ---------- The printf function enables you to print information to the screen or any device. It takes a variable number of arguments. If the first argument is less than 255, it is assumed to be an iocb #, and everything is sent to that iocb. Otherwise the output is sent to the screen (iocb #0). The next argument is the format string, followed by any additional arguments. Everything in the format string will be sent out until a % is encountered. The character(s) following the % determine how the argument is to be printed. The first % is for the first argument after the format string, the second for the second argument, and so on. Too few arguments will cause garbage to be printed. The following characters may be used after the %: c - print a character d - print an integer f - print a floating point number s - print a string x - print a hexadecimal number % - print a percent sign Note: A character, integer, or hexadecimal value may be obtained from any variable defined as either char or int. A floating point number is assumed to have been defined as a 6 element char array. A number between the % and the character defines the field width. If there aren't enough characters or numbers in the argument, it will be filled out with spaces. A '-' before the number will left justify the field. A decimal point and a number will determine the decimal part printed in a floating point number, padded with up to 2 zeros if there aren't enough. Here are some examples: printf(">abcd<"); produces >abcd< printf(">%s<","abcd"); produces >abcd< printf(">%10s<","abcd"); produces > abcd< printf(">%-10s<","abcd"); produces >abcd < printf("%c %d %x",65,65,65); produces A 65 41 ----------------- end of printf.txt ----------------- readthis.txt ------------ THE COMPILER AND LINKER REQUIRE 48K. REMOVE ALL CARTRIDGES BEFORE USING. The ACE C compiler is a newer version of the DEEP BLUE C compiler from APX by John Palevich. ACE C, like DEEP BLUE C, is a subset of standard C, drawn primarily from Ron Cain's public domain C-compiler. Most programs written using ACE C can be run on any computer supporting standard C without alteration. If you already have DEEP BLUE C, be sure to read the file BLUE.TXT before using ACE C. Programs written with BLUE C will not necessarily run on ACE C. This text will not teach you how to program in C. If you are not familiar with C (and even if you are), I would advise you to obtain the book "The C Programming Language", by Brain W. Kernighan and Dennis M. Ritchie. It can be tough reading, but it will define the C language. If you have questions about ACE C, you may send them with a self-addressed, stamped envelope to: Ralph E. Walden 1821 Jefferson Eugene, Oregon 97402 All the programs on this disk use the normalize function in ACECIO.C when requesting filenames. When entering a filename, if you do not include a drive (Dn:) then it will be assumed you want D1:. In all cases, you do not need to include the extension. To run the programs on this disk use the "L" option (load) in DOS and type in the full filename. All programs with the extension ".COM" will run automatically when they are loaded. If you are using OS/A DOS, you can run the program by directly typing its primary name (the ".COM" will be supplied for you). The programs may be loaded from any drive, but the file "ENGINE.OBJ" MUST be on D1:. Included on this disk is a library of standard functions (ACECIO.CCC), and a library containing several graphics functions (GRAPHICS.CCC). For their descriptions, see the files of the same name with the extension ".C". ACE C supports the following: 1) The declarations char, int, and pointers (also extern). A char pointer may be used as an unsigned int for anything except multiplication and division. 2) Single dimension arrays. (No pointer arrays - they won't generate an error, but won't work like standard C.) Note: floating point functions are provided, but you must define a floating point number as: char name[6];. It will act as a char array except in floating point functions. (See FLOAT.TXT.) 3) Unary operators: +,-,*,&,++,--,!,$- (tilde). 4) Binary operators: +,-,*,/,%, |,^,&,==,!=,<<,>>,(op)=,&&,||,?:, (comma),(op)= (example: var += 3 (var=var+3).) 5) Statements: asm, break, case, continue, default, do, else, for, if, return, switch, while. 6) #define and #include. 7) Constants: decimal, hexadecimal, octal, backslash. Unsupported features of C (these are NOT in ACE C): 1) Structures, unions. 2) Multidimensional arrays. 3) Full floating point implementation (See FLOAT.TXT). 4) Functions returning anything but int. 5) Unary operator: sizeof. 6) Binary operator: type casting. Differences from standard C: 1) The last clause of a "switch" statement, either "case" or "default" must be terminated with a "break", "continue", or "return". 2) Characters are unsigned, and range from 0-255. 3) Standard C allows lines to continue onto the next line. ACE C is much more particular. ACE C allows code to begin with line numbers, therefore, unnumbered lines MUST begin with a non-number (Space or character) or it will be deleted. Strings and comments may NOT continue onto the next line. 4) C source code lines can be a maximum of 199 characters long after any expansion from #define's. 5) Functions may have a maximum of 126 arguments. 6) When ACE C encounters a /*, it considers that the end of the line. Therefore, comments may not be imbedded within a line, and they may not cross over to a new line. 7) ACE C will do constant evaluation at compile time provided there is nothing (Space, parenthesis, etc.) between the numbers and operators: num=5*6; will be num=30; at run time. num=5*(6); will remain the same. Evaluation is strictly right to left, and there is no order of precedence: num=5*6+1; is num=35. Use a space or parenthesis to override constant evaluation. 8) A tab character is not "white space", i.e. the compiler will try to compile it. (See CFORMAT.TXT for converting tabs into spaces.) 9) ACE C has an assembly language interface. Read the file ASM.TXT for a description of its use. BLUE C users: asm on ACE C is VERY different; be sure to read ASM.TXT! 10) Braces in standard C are replaced with $( and $). The tilde is replaced with $-. 11) Variables may not be defined within a statement. BACKSLASH: Use of the backslash within a single or double quote will generate the following codes: \b - backspace delete \d - cursor down \e - escape \f - clear screen \g - bell \l - cursor left \m - control M (can be used as a RETURN on IDS printers) \n - return \r - cursor right \t - tab \u - cursor up Additionly, a back space followed by a number will convert the number to its actual value. "\65\66" would generate the string "AB". NOTE: you cannot put a control comma (graphics heart) within a string since this is the end of the string character; you must use \0. USING ACE C: Here's a brief summary of how to get a C program running. A more extensive description follows. 1) Enter the program using the text editor of your choice and save it to disk with the extension ".C", with or without line numbers. 2) Load ACEC and compile the program. 3) Load LINK and link the program. 4) Load the program (which will automatically run). 1) EDITING: You may use any text editor that creates aschii files, with or without line numbers, to enter the source program. Note: CFORMAT.COM will do a lot of the formatting of a C program for you (See CFORMAT.TXT). You must save the file with the extension ".C". 2) COMPILING: The compiler and linker require 48k so you must remove any cartridges before running them. You run the compiler from Atari DOS using the 'L' option. The compiler filename is ACEC.COM. From OS/A+ DOS, just type ACEC, and press RETURN. The compiler will ask for the filename, which it will normalize with the extension ".C". The compiler will then create a file with the extension ".CCC" for use by the linker. When you press RETURN after the filename, the screen will be turned off while the program is compiled. If any error is encountered all compilation will stop, the screen will be turned on, and the line with an error message will be displayed. Take note of the error and press a key, which will return you to DOS. If compilation is done without errors, the screen will be turned back on, and a list of all the functions in the program will be displayed. Press RETURN to go back to DOS, or type in another filename to compile. Note: the largest ".CCC" file you can have is about 9K. It's safer to create several small files and link them together then to have one large file. Compiler directives in the source file: #define - whenever the compiler encounters the first string (all characters until the next space) it will replace it with the second string (everything to the end of the line or comment). Example: #define EOL 155; putchar(EOL); - this will be changed to putchar(155). Note: constant evaluation will be done on the second string. #include filename - this will include the filename specified. The filename will be normalized with the extension ".H" The included file is usually used as a header file containing extern declarations. 3) LINKING: The linker joins together all files that are to be part of the same program. You must first create a file with the extension ".LNK" which contains a list of the programs to link together. The only file types allowed are ".CCC" and ".OBJ" (object). All filenames are normalized with the extension ".CCC", so the extension is needed only for ".OBJ" files. (Assembly language files should have the extension ".OBJ".) The last file must be either "ENGINE.OBJ" or "ENGLOAD.OBJ". "ENGLOAD.OBJ" will result in "ENGINE.OBJ" being loaded from D1: whenever the program is run. "ENGINE.OBJ" is about 4000 bytes long, whereas ENGLOAD.OBJ is only about 130 bytes. Load the linker in the same manner as the compiler (the filename is LINK.COM). The linker will request the name of the link file, which will be normalized with the extension ".LNK". The linker will then create a file with the extension ".COM" which is ready to run. ACE C is actually a P-code interpreter and the code to run it, plus numerous IO functions described in ACECIO.C, is in the file ENGINE.OBJ. To access the IO routines in ENGINE.OBJ you must also include the file ACECIO in your LNK file. NOTE: both ACEC.COM and LINK.COM require ENGINE.OBJ to be on drive #1, as they use ENGLOAD.OBJ. If the linker does not find a LNK file, it will create the following file: filename.CCC ACECIO.CCC ENGLOAD.OBJ 4) RUNNING: Run your program the same way you run the linker and compiler. The extension will always be ".COM", which need not be included if you are using OS/A+ DOS. When your program is running correctly, you can use FASTC.COM on the ".CCC" files which will speed up your program by 20-30%. (See FASTC.TXT.) BE SURE TO READ ALL THE .TXT FILES, AND LOOK AT THE .C FILES FOR EXAMPLES. ------------------- end of readthis.txt -------------------