]> git.sur5r.net Git - cc65/blobdiff - doc/apple2.sgml
remote TABs in doc/ and test/
[cc65] / doc / apple2.sgml
index 7443e50b7df27ea6b85e4f0a8a94bc3292b0417b..648ee56db7bb83bf85c91670103098e09d396757 100644 (file)
@@ -1,10 +1,8 @@
 <!doctype linuxdoc system>
 
 <article>
-
 <title>Apple&nbsp;&rsqb;&lsqb; specific information for cc65
 <author><url url="mailto:ol.sc@web.de" name="Oliver Schmidt">
-<date>2014-04-10
 
 <abstract>
 An overview over the Apple&nbsp;&rsqb;&lsqb; runtime system as it is
@@ -34,20 +32,14 @@ more information.
 <sect>Binary format<p>
 
 The standard binary file format generated by the linker for the
-Apple&nbsp;&rsqb;&lsqb; target is a binary program with a 4 byte DOS 3.3 header
-containing the load address and load length. The default load address is
-&dollar;803.
-
-<bf/AppleCommander 1.3.5/ or later (available at <url
-url="http://applecommander.sourceforge.net/">) includes the option <tt/-cc65/
-that allows to put binary files with a DOS 3.3 header onto disk images
-containing DOS 3.3 as well as ProDOS 8.
+Apple&nbsp;&rsqb;&lsqb; target is an <url name="AppleSingle"
+url="http://kaiser-edv.de/documents/AppleSingle_AppleDouble.pdf"> file.
+The default load address is &dollar;803.
 
-For ProDOS 8 system programs the load address is fixed to &dollar;2000 so there
-is no need for a header. Thus the linker configuration
-<ref id="apple-sys-cfg" name="apple2-system.cfg"> for those programs
-omits the DOS 3.3 header. The right AppleCommander option to put system files
-without a header on a ProDOS 8 disk image is <tt/-p/.
+<bf/AppleCommander 1.4.0/ or later (available at <url
+url="https://applecommander.github.io/">) includes the option <tt/-as/ that
+allows to put AppleSingle files onto disk images containing DOS 3.3 as well
+as ProDOS 8.
 
 
 <sect>Memory layout<p>
@@ -85,17 +77,17 @@ several usefull settings:
 
 <descrip>
 
-  <tag>LCADDR: &dollar;D400, LCSIZE: &dollar;C00</tag>
+  <tag>LC address: &dollar;D400, LC size: &dollar;C00</tag>
   For plain vanilla ProDOS 8 which doesn't actually use the Language Card bank 2
   memory from &dollar;D400 to &dollar;DFFF. This is the default setting.
 
-  <tag>LCADDR: &dollar;D000, LCSIZE: &dollar;1000</tag>
+  <tag>LC address: &dollar;D000, LC size: &dollar;1000</tag>
   For ProDOS 8 together with the function <tt/rebootafterexit()/. If a program
   doesn't quit to the ProDOS 8 dispatcher but rather reboots the machine after
   exit then a plain vanilla ProDOS 8 doesn't make use of the Language Card bank
   2 at all.
 
-  <tag>LCADDR: &dollar;D000, LCSIZE: &dollar;3000</tag>
+  <tag>LC address: &dollar;D000, LC size: &dollar;3000</tag>
   For plain vanilla DOS 3.3 which doesn't make use of the Language Card at all.
 
 </descrip><p>
@@ -121,9 +113,8 @@ Parameters:
   <tag><tt/STARTADDRESS:/ Program start address</tag>
   Default: &dollar;803. Use <tt/-S &lt;addr&gt;/ to set a different start address.
 
-  <tag><tt/__EXEHDR__:/ Executable file header</tag>
-  Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
-  the header.
+  <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+  Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
 
   <tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
   Default: &dollar;800. Use <tt/-D __STACKSIZE__=&lt;size&gt;/ to set a different
@@ -149,8 +140,13 @@ Parameters:
 Configuration for a system program running on ProDOS 8 and using the memory from
 &dollar;2000 to &dollar;BEFF.
 
+Parameters:
+
 <descrip>
 
+  <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+  Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
+
   <tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
   Default: &dollar;800. Use <tt/-D __STACKSIZE__=&lt;size&gt;/ to set a different
   stack size.
@@ -166,20 +162,55 @@ Configuration for a system program running on ProDOS 8 and using the memory from
 </descrip><p>
 
 
+<sect1><tt/apple2-hgr.cfg/<p>
+
+Configuration for a program including a hires page. See <tt>testcode/lib/apple/hgrtest.c</tt>
+for an example of such a program.
+
+Parameters:
+
+<descrip>
+
+  <tag><tt/STARTADDRESS:/ Program start address</tag>
+  Default: &dollar;803. Use <tt/-S &lt;addr&gt;/ to set a different start address.
+
+  <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+  Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
+
+  <tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
+  Default: &dollar;800. Use <tt/-D __STACKSIZE__=&lt;size&gt;/ to set a different
+  stack size.
+
+  <tag><tt/__HIMEM__:/ Highest usable memory address presumed at link time</tag>
+  Default: &dollar;9600. Use <tt/-D __HIMEM__=&lt;addr&gt;/ to set a different
+  highest usable address.
+
+  <tag><tt/__LCADDR__:/ Address of code in the Language Card</tag>
+  Default: &dollar;D400. Use <tt/-D __LCADDR__=&lt;addr&gt;/ to set a different
+  code address.
+
+  <tag><tt/__LCSIZE__:/ Size of code in the Language Card</tag>
+  Default: &dollar;C00. Use <tt/-D __LCSIZE__=&lt;size&gt;/ to set a different
+  code size.
+
+</descrip><p>
+
+
 <sect1><tt/apple2-overlay.cfg/<p>
 
-Configuration for overlay programs with the up to nine overlays. The overlay files
-don't include the DOS 3.3 header. See <tt>samples/overlaydemo.c</tt> for more
+Configuration for an overlay program with up to nine overlays. The overlay files
+don't include the AppleSingle header. See <tt>samples/overlaydemo.c</tt> for more
 information on overlays.
 
+Parameters:
+
 <descrip>
 
   <tag><tt/STARTADDRESS:/ Program start address</tag>
   Default: &dollar;803. Use <tt/-S &lt;addr&gt;/ to set a different start address.
 
-  <tag><tt/__EXEHDR__:/ Executable file header</tag>
-  Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
-  the header.
+  <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+  Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
 
   <tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
   Default: &dollar;800. Use <tt/-D __STACKSIZE__=&lt;size&gt;/ to set a different
@@ -206,7 +237,7 @@ information on overlays.
 
 <sect1><tt/apple2-asm.cfg/<p>
 
-Configuration for a assembler programs which don't need a special setup.
+Configuration for an assembler program that doesn't need a special setup.
 
 Parameters:
 
@@ -215,9 +246,8 @@ Parameters:
   <tag><tt/STARTADDRESS:/ Program start address</tag>
   Default: &dollar;803. Use <tt/-S &lt;addr&gt;/ to set a different start address.
 
-  <tag><tt/__EXEHDR__:/ Executable file header</tag>
-  Default: No header. Use <tt/-u __EXEHDR__ apple2.lib/ to add a DOS 3.3 header
-  (address and length).
+  <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+  Default: No. Use <tt/-u __EXEHDR__ apple2.lib/ to add the AppleSingle header.
 
 </descrip><p>
 
@@ -236,13 +266,14 @@ range.
 The easiest (and for really large programs in fact the only) way to have a cc65
 program use the memory from &dollar;800 to &dollar;2000 is to link it as binary
 (as opposed to system) program using the default linker configuration
-<ref id="apple-def-cfg" name="apple2.cfg"> with __HIMEM__ set to &dollar;BF00
-and load it with the targetutil LOADER.SYSTEM. The program then works like a system
+<ref id="apple-def-cfg" name="apple2.cfg"> with <tt/__HIMEM__/ set to &dollar;BF00
+and load it with the LOADER.SYSTEM utility. The program then works like a system
 program (i.e. quits to the ProDOS dispatcher).
 
 Using LOADER.SYSTEM is as simple as copying it to the ProDOS 8 directory of the
 program to load under name &lt;program&gt;.SYSTEM as a system program. For
-example the program <tt/MYPROG/ is loaded by <tt/MYPROG.SYSTEM/.
+example the program <tt/MYPROG/ is loaded by <tt/MYPROG.SYSTEM/. The right
+AppleCommander option to put LOADER.SYSTEM on a ProDOS 8 disk image is <tt/-p/.
 
 
 <sect1>Heap<p>
@@ -422,7 +453,7 @@ BASIC.SYSTEM) there are some limitations for DOS 3.3:
 
 <descrip>
 
-  <tag>Disk File I/O</tag>
+  <tag>Disk file I/O</tag>
   There's no disk file I/O support. Any attempt to use it yields an error with
   <tt/errno/ set to <tt/ENOSYS/. This implicitly means that loadable drivers
   are in general not functional as they depend on disk file I/O. Therefore the statically
@@ -431,25 +462,54 @@ BASIC.SYSTEM) there are some limitations for DOS 3.3:
   <tag/Interrupts/
   There's no <tt/interruptor/ support. Any attempt to use it yields the message
   'FAILED TO ALLOC INTERRUPT' on program startup. This implicitly means that
-  <tt/a2.stdmou.mou/ and <tt/a2.ssc.ser/ are not functional as they depend on
-  interrupts.
+  mouse and RS232 device drivers are not functional as they depend on interrupts.
 
 </descrip><p>
 
 
 <sect1>Direct console I/O<p>
 
-<descrip>
+The Apple&nbsp;&rsqb;&lsqb; has no color text mode. Therefore the functions
+<tt/textcolor()/, <tt/bgcolor()/ and <tt/bordercolor()/ have no effect.
 
-  <tag/Color/
-  The Apple&nbsp;&rsqb;&lsqb; has no color text mode. Therefore the functions textcolor(),
-  bgcolor() and bordercolor() have no effect.
 
-  <tag/Cursor/
-  The Apple&nbsp;&rsqb;&lsqb; has no hardware cursor. Therefore the function cursor() has
-  no effect.
+<sect1>Random number generator<p>
+
+The random number seed is generated from the time the program waits for user input.
+Therefore it is necessary to wait for at least one user keypress either via Standard
+I/O or via Direct console I/O before initializing the pseudo random number generator.
 
-</descrip><p>
+
+<sect1>Realtime clock<p>
+
+There are several types of realtime clocks. It's not desirable to have specific code
+for all of them. As ProDOS 8 supports file timestamps, realtime clock owners usually
+use ProDOS 8 drivers for their realtime clock. Those drivers read the realtime clock
+and write the result to the date/time location in RAM (&dollar;BF90 to &dollar;BF93).
+ProDOS 8 reads the date/time from that RAM location. If there's no realtime clock the
+RAM location keeps containing zeros. ProDOS 8 uses those zeros as timestamps and the
+files show up in a directory as <tt/&lt;NO DATE&gt;/.
+
+There's no common interface to set realtime clocks so if a realtme clock <bf/IS/
+present there's just nothing to do. However, if there's <bf/NO/ realtime clock present,
+the user might very well be interested to "manually" set the RAM location in order to
+have timestamps. But he surely doesn't want to manually set the RAM location over and
+over again. Rather he wants to set it just once after booting ProDOS 8.
+
+From that perspective it makes most sense to not set both the date and the time but
+rather only set the date and have the time just stay zero. Then files show up in a
+directory as <tt/DD-MON-YY  0:00/.
+
+So <tt/clock_settime()/ checks if the current time equals 0:00. If it does <bf/NOT/
+then a realtime clock is supposed to be active and <tt/clock_settime()/ fails with
+<tt/ERANGE/. Otherwise <tt/clock_settime()/ sets the date - and completely ignores
+the time provided as parameter.
+
+<tt/clock_getres()/ too checks if the current time equals 0:00. If it does <bf/NOT/
+then a realtime clock is supposed to be active and <tt/clock_getres()/ returns a time
+resolution of one minute. Otherwise <tt/clock_getres()/ presumes that the only one
+who sets the RAM location is <tt/clock_settime()/ and therefore returns a time
+resolution of one day.
 
 
 
@@ -511,6 +571,109 @@ url="ca65.html" name="assembler manual">.
 </descrip><p>
 
 
+<sect1>Specifying file types for fopen<p>
+
+<descrip>
+
+  <tag>Explanation of File Types</tag>
+
+  ProDOS associates a file type and an auxiliary type with each file.
+  These type specifications are separate from the file's name, unlike
+  Windows which uses the file name's suffix (a.k.a.
+  extension) to specify the file type. For example, <tt/.exe/,
+  <tt/.doc/, or <tt/.bat/.
+  The ProDOS low-level
+  Machine-Language Interface (MLI) functions for creating and opening
+  files require these types to be specified. And if they don't match
+  with the file being opened, the operation may fail.
+
+  In contrast, the ISO C function <tt/fopen()/ and the POSIX function
+  <tt/open()/ have no parameter to specify either a file type or an
+  auxiliary type. Therefore, some additional mechanism for specifying
+  the file types is needed.
+
+  <tag>Specifying the File Type and Auxiliary Type</tag>
+
+  There are two global variables provided that allow the file type
+  and auxiliary type to be specified before a call to <tt/fopen()/
+  or <tt/open()/. They are defined in <tt/apple2_filetype.h/:
+
+  <tscreen>
+  <verb>
+  extern unsigned char _filetype;  /* Default: PRODOS_T_BIN */
+  extern unsigned int _auxtype;    /* Default: 0            */
+  </verb>
+  </tscreen>
+
+  The header file <tt/apple2_filetype.h/ also defines many values
+  that can be used to set these variables. It is included in
+  <tt/apple2.h/, which is in turn included in <tt/apple2enh.h/.
+  So it isn't necessary to include it directly. Just
+  include one of <tt/apple2.h/ or <tt/apple2enh.h/.
+
+  <tag>Example</tag>
+
+  A text file cannot be created with just the
+  standard C functions because they default to the binary type
+  <tt/PRODOS_T_BIN/. The <tt/_filetype/ variable must be set to
+  <tt/PRODOS_T_TXT/ to create a text file.
+
+  For a text file,
+  <tt/_auxtype/ specifies the record length. A zero record
+  length text file is referred to as a sequential text file.
+  This is equivalent to text files on
+  other operating systems, except that the line terminator is a
+  carriage return instead of a line-feed (Linux/BSD/MacOS) or
+  carriage return, line-feed pair (Windows).
+
+  The "sequential" text file terminology is in contrast to a
+  "random-access" text file which would
+  have a fixed-length, non-zero record length, so that the
+  file position of any individual record can be calculated.
+
+  For this example, the
+  <tt/_auxtype/ does not need to be set because it defaults to
+  the desired value, which is zero. To be more explicit,
+  <tt/_auxtype/ can also be set to <tt/PRODOS_AUX_T_TXT_SEQ/
+  which is defined as zero.
+
+  <tscreen>
+  <verb>
+    &num;include &lt;stdio.h&gt;
+    &num;include &lt;string.h&gt;
+    &num;include &lt;errno.h&gt;
+    &num;include &lt;apple2.h&gt;
+
+    void main(void)
+    {
+        FILE *out;
+        char *name = "MY.FAVS";
+
+        /*-----------------------------*/
+
+        _filetype = PRODOS_T_TXT;
+        _auxtype  = PRODOS_AUX_T_TXT_SEQ;
+
+        /*-----------------------------*/
+
+        if ((out = fopen(name, "w")) != NULL) {
+            fputs("Jorah Mormont\r", out);
+            fputs("Brienne of Tarth\r", out);
+            fputs("Daenerys Targaryen\r", out);
+            fputs("Sandor Clegane\r", out);
+            if (fclose(out) == EOF) {
+                fprintf(stderr, "fclose failed for %s: %s", name, strerror(errno));
+            }
+        }
+        else {
+            fprintf(stderr, "fopen failed for %s: %s", name, strerror(errno));
+        }
+    }
+  </verb>
+  </tscreen>
+
+</descrip><p>
+
 
 <sect>License<p>
 
@@ -523,14 +686,14 @@ including commercial applications, and to alter it and redistribute it
 freely, subject to the following restrictions:
 
 <enum>
-<item> The origin of this software must not be misrepresented; you must not
-       claim that you wrote the original software. If you use this software
-       in a product, an acknowledgment in the product documentation would be
-       appreciated but is not required.
-<item> Altered source versions must be plainly marked as such, and must not
-       be misrepresented as being the original software.
-<item> This notice may not be removed or altered from any source
-       distribution.
+<item>  The origin of this software must not be misrepresented; you must not
+        claim that you wrote the original software. If you use this software
+        in a product, an acknowledgment in the product documentation would be
+        appreciated but is not required.
+<item>  Altered source versions must be plainly marked as such, and must not
+        be misrepresented as being the original software.
+<item>  This notice may not be removed or altered from any source
+        distribution.
 </enum>
 
 </article>