[comp.sys.atari.8bit] Ace C redistribution

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
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
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
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
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
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
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
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
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
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
,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
-------------------