<article>
<title>Apple ][ specific information for cc65
-<author>Ullrich von Bassewitz, <htmlurl url="mailto:uz@cc65.org" name="uz@cc65.org">
-<date>2003-12-16
+<author><url url="mailto:ol.sc@web.de" name="Oliver Schmidt">
+<date>2014-04-10
<abstract>
An overview over the Apple ][ runtime system as it is
pitfalls specific to that platform.
Please note that Apple ][ specific functions are just mentioned
-here, they are described in detail in the separate <htmlurl url="funcref.html"
+here, they are described in detail in the separate <url url="funcref.html"
name="function reference">. Even functions marked as "platform dependent" may
be available on more than one platform. Please see the function reference for
more information.
-<sect>Binary format<p>
-
-The standard binary output format generated by the linker for the
-Apple ][ target is a machine language program with a 4 byte DOS
-3.3 header. The standard load address is $800.
-
-The DOS header is in its own segment named <tt/EXEHDR/. If you don't want the
-header for some reason, you can change
-
-<verb>
- HEADER: start = $0000, size = $4, file = %O;
-</verb>
-
-to
-<verb>
- HEADER: start = $0000, size = $4, file = "";
-</verb>
+<sect>Binary format<p>
-in the linker configuration to have the linker remove it.
+The standard binary file format generated by the linker for the
+Apple ][ target is an <url name="AppleSingle"
+url="http://kaiser-edv.de/documents/AppleSingle_AppleDouble.pdf"> file.
+The default load address is $803.
+<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>
In the standard setup, cc65 generated programs use the memory from
-$800 to $8E00, so 33.5K of memory (including the stack) is
-available. ROM calls are possible without further precautions.
+$803 to $95FF, so 35.5 KB of RAM are available.
Special locations:
<descrip>
+
<tag/Stack/
- The C runtime stack is located at $8DFF and growing downwards.
+ The C runtime stack is located at HIMEM and grows downwards, regardless of
+ how your linker config file is setup.
<tag/Heap/
The C heap is located at the end of the program and grows towards the C
runtime stack.
+
+</descrip><p>
+
+While running <tt/main()/ the Language Card bank 2 is enabled for read access.
+However while running module constructors/destructors the Language Card is disabled.
+
+Enabling the Language Card allows to use it as additional memory for cc65
+generated code. However code is never automatically placed there. Rather code
+needs to be explicitly placed in the Language Card either per file by compiling
+with <tt/--code-name LC/ or per function by enclosing in <tt/#pragma code-name
+(push, "LC")/ and <tt/#pragma code-name (pop)/. In either case the cc65 runtime
+system takes care of actually moving the code into the Language Card.
+
+The amount of memory available in the Language Card for generated code depends
+on the <ref id="link-configs" name="linker configuration"> parameters. There are
+several usefull settings:
+
+<descrip>
+
+ <tag>LC address: $D400, LC size: $C00</tag>
+ For plain vanilla ProDOS 8 which doesn't actually use the Language Card bank 2
+ memory from $D400 to $DFFF. This is the default setting.
+
+ <tag>LC address: $D000, LC size: $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>LC address: $D000, LC size: $3000</tag>
+ For plain vanilla DOS 3.3 which doesn't make use of the Language Card at all.
+
+</descrip><p>
+
+
+
+<sect>Linker configurations<label id="link-configs"><p>
+
+The ld65 linker comes with a default config file for the Apple ][,
+which is used via <tt/-t apple2/.
+The apple2 package comes with additional secondary linker config files, which
+are used via <tt/-t apple2 -C <configfile>/.
+
+
+<sect1>default config file (<tt/apple2.cfg/)<label id="apple-def-cfg"><p>
+
+Default configuration for a binary program.
+
+Parameters:
+
+<descrip>
+
+ <tag><tt/STARTADDRESS:/ Program start address</tag>
+ Default: $803. Use <tt/-S <addr>/ 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: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
+ stack size.
+
+ <tag><tt/__HIMEM__:/ Highest usable memory address presumed at link time</tag>
+ Default: $9600. Use <tt/-D __HIMEM__=<addr>/ to set a different
+ highest usable address.
+
+ <tag><tt/__LCADDR__:/ Address of code in the Language Card</tag>
+ Default: $D400. Use <tt/-D __LCADDR__=<addr>/ to set a different
+ code address.
+
+ <tag><tt/__LCSIZE__:/ Size of code in the Language Card</tag>
+ Default: $C00. Use <tt/-D __LCSIZE__=<size>/ to set a different
+ code size.
+
+</descrip><p>
+
+
+<sect1><tt/apple2-system.cfg/<label id="apple-sys-cfg"><p>
+
+Configuration for a system program running on ProDOS 8 and using the memory from
+$2000 to $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: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
+ stack size.
+
+ <tag><tt/__LCADDR__:/ Address of code in the Language Card</tag>
+ Default: $D400. Use <tt/-D __LCADDR__=<addr>/ to set a different
+ code address.
+
+ <tag><tt/__LCSIZE__:/ Size of code in the Language Card</tag>
+ Default: $C00. Use <tt/-D __LCSIZE__=<size>/ to set a different
+ code size.
+
+</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: $803. Use <tt/-S <addr>/ 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: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
+ stack size.
+
+ <tag><tt/__HIMEM__:/ Highest usable memory address presumed at link time</tag>
+ Default: $9600. Use <tt/-D __HIMEM__=<addr>/ to set a different
+ highest usable address.
+
+ <tag><tt/__LCADDR__:/ Address of code in the Language Card</tag>
+ Default: $D400. Use <tt/-D __LCADDR__=<addr>/ to set a different
+ code address.
+
+ <tag><tt/__LCSIZE__:/ Size of code in the Language Card</tag>
+ Default: $C00. Use <tt/-D __LCSIZE__=<size>/ to set a different
+ code size.
+
+</descrip><p>
+
+
+<sect1><tt/apple2-overlay.cfg/<p>
+
+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: $803. Use <tt/-S <addr>/ 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: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
+ stack size.
+
+ <tag><tt/__HIMEM__:/ Highest usable memory address presumed at link time</tag>
+ Default: $9600. Use <tt/-D __HIMEM__=<addr>/ to set a different
+ highest usable address.
+
+ <tag><tt/__LCADDR__:/ Address of code in the Language Card</tag>
+ Default: $D400. Use <tt/-D __LCADDR__=<addr>/ to set a different
+ code address.
+
+ <tag><tt/__LCSIZE__:/ Size of code in the Language Card</tag>
+ Default: $C00. Use <tt/-D __LCSIZE__=<size>/ to set a different
+ code size.
+
+ <tag><tt/__OVERLAYSIZE__:/ Size of code in the overlays</tag>
+ Default: $1000. Use <tt/-D __OVERLAYSIZE__=<size>/ to set a different
+ code size.
+
</descrip><p>
+<sect1><tt/apple2-asm.cfg/<p>
+
+Configuration for an assembler program that doesn't need a special setup.
+
+Parameters:
+
+<descrip>
+
+ <tag><tt/STARTADDRESS:/ Program start address</tag>
+ Default: $803. Use <tt/-S <addr>/ to set a different start address.
+
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: No. Use <tt/-u __EXEHDR__ apple2.lib/ to add the AppleSingle header.
+
+</descrip><p>
+
+
+
+<sect>ProDOS 8 system programs<p>
+
+ProDOS 8 system programs are always loaded to the start address $2000.
+For cc65 programs this means that the 6 KB from $800 to $2000 are
+by default unused. There are however several options to make use of that memory
+range.
+
+
+<sect1>LOADER.SYSTEM<p>
+
+The easiest (and for really large programs in fact the only) way to have a cc65
+program use the memory from $800 to $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 <tt/__HIMEM__/ set to $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 <program>.SYSTEM as a system program. For
+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>
+
+If the cc65 program can be successfully linked as system program using the linker
+configuration <ref id="apple-sys-cfg" name="apple2-system.cfg">, but
+uses the heap either explicitly or implicitly (i.e. by loading a driver) then
+the memory from $800 to $2000 can be added to the heap by calling
+<tt/_heapadd ((void *) 0x0800, 0x1800);/ at the beginning of <tt/main()/.
+
+
+<sect1>ProDOS 8 I/O buffers<p>
+
+ProDOS 8 requires for every open file a page-aligned 1 KB I/O buffer. By default
+these buffers are allocated by the cc65 runtime system on the heap using
+<tt/posix_memalign()/. While this is generally the best solution it means quite
+some overhead for (especially rather small) cc65 programs which do open files
+but don't make use of the heap otherwise.
+
+The apple2 package comes with the alternative ProDOS 8 I/O buffer allocation
+module <tt/apple2-iobuf-0800.o/ which uses the memory between $800 and
+the program start address for the 1 KB I/O buffers. For system programs (with
+start address $2000) this results in up to 6 I/O buffers and thus up to 6
+concurrently open files.
+
+While using <tt/_heapadd()/ as described in the section above together with the
+default I/O buffer allocation basically yields the same placement of I/O buffers
+in memory the primary benefit of <tt/apple2-iobuf-0800.o/ is a reduction in code
+size - and thus program file size - of more than 1400 bytes.
+
+Using <tt/apple2-iobuf-0800.o/ is as simple as placing it on the linker command
+line like this:
+
+<tscreen><verb>
+cl65 -t apple2 -C apple2-system.cfg myprog.c apple2-iobuf-0800.o
+</verb></tscreen>
+
+
<sect>Platform specific header files<p>
<sect1>Apple ][ specific functions<p>
The functions listed below are special for the Apple ][. See
-the <htmlurl url="funcref.html" name="function reference"> for declaration and
+the <url url="funcref.html" name="function reference"> for declaration and
usage.
<itemize>
+<item>_auxtype
+<item>_dos_type
+<item>_filetype
<item>get_ostype
+<item>rebootafterexit
+<item>ser_apple2_slot
+<item>tgi_apple2_mix
</itemize>
-
<sect1>Hardware access<p>
There's currently no support for direct hardware access. This does not mean
<sect>Loadable drivers<p>
-<em>Note:</em> Since the Apple ][ doesn't have working disk I/O
-(see <ref id="limitations" name="section "Limitations"">), the
-available drivers cannot be loaded at runtime (so the term "loadable drivers"
-is somewhat misleading). Instead, the drivers have to be converted using the
-<htmlurl url="co65.html" name="co65 utility"> and statically linked. While
-this may seem overhead, it has two advantages:
+The names in the parentheses denote the symbols to be used for static linking of the drivers.
-<enum>
-<item>The interface is identical to the one used for other platforms
- and to the one for the Apple ][ once it has disk I/O.
-<item>Once disk I/O is available, existing code can be changed to load drivers
- at runtime with almost no effort.
-</enum>
+<sect1>Graphics drivers<p>
+<descrip>
-<sect1>Graphics drivers<p>
+ <tag><tt/a2.lo.tgi (a2_lo_tgi)/</tag>
+ This driver features a resolution of 40×48 with 16 colors.
-<em>Note:</em> Since memory for the high resolution graphics has to be allocated,
-programs using graphics drivers will have to be linked using a special linker
-configuration. See the <tt/apple2-tgi.cfg/ file in the documentation
-directory, and the <htmlurl url="ld65.html" name="linker documentation"> on
-how to use it.
+ The function <tt/tgi_apple2_mix()/ allows to activate 4 lines of text. The
+ function clears the corresponding area at the bottom of the screen.
-<descrip>
+ <tag><tt/a2.hi.tgi (a2_hi_tgi)/</tag>
+ This driver features a resolution of 280×192 with 8 colors and two
+ hires pages. Note that programs using this driver will have to be linked
+ with <tt/-S $4000/ to reserve the first hires page or with <tt/-S $6000/
+ to reserve both hires pages.
- <tag><tt/a2.lo.tgi/</tag>
- This driver was written by Stefan Haubenthal. It features a resolution of
- 40×40 with 16 colors. At the bottom of the screen, 4 additional text lines
- are available.
+ The function <tt/tgi_apple2_mix()/ allows to activate 4 lines of text. The
+ function doesn't clear the corresponding area at the bottom of the screen.
- <tag><tt/a2.hi.tgi/</tag>
- This driver was written by Stefan Haubenthal. It features a resolution of
- 280×192 with 6 colors.
+ In memory constrained situations the memory from $803 to $1FFF
+ can be made available to a program by calling <tt/_heapadd ((void *) 0x0803, 0x17FD);/
+ at the beginning of <tt/main()/. Doing so is beneficial even if the program
+ doesn't use the the heap explicitly because loading the driver (and in fact
+ already opening the driver file) uses the heap implicitly.
</descrip><p>
<descrip>
- <tag><tt/a2.lc.emd/</tag>
- Gives access to 12KB RAM (48 pages of 256 bytes each) on the
- Apple ][ language card. The driver was contributed by
- Stefan Haubenthal.
+ <tag><tt/a2.auxmem.emd (a2_auxmem_emd)/</tag>
+ Gives access to 47.5 KB RAM (190 pages of 256 bytes each) on an Extended
+ 80-Column Text Card.
-</descrip><p>
+ Note that this driver doesn't check for the actual existence of the memory
+ and that it doesn't check for ProDOS 8 RAM disk content!
+</descrip><p>
<sect1>Joystick drivers<p>
<descrip>
- <tag><tt/a2.stdjoy.joy/</tag>
+ <tag><tt/a2.stdjoy.joy (a2_stdjoy_joy)/</tag>
Supports up to two standard analog joysticks connected to the game port of
the Apple ][.
</descrip><p>
-
<sect1>Mouse drivers<p>
-Currently no drivers available (in fact, the API for loadable mouse drivers
-does not exist).
+<descrip>
+
+ <tag><tt/a2.stdmou.mou (a2_stdmou_mou)/</tag>
+ Driver for the AppleMouse II Card. Searches all Apple II slots
+ for an AppleMouse II Card compatible firmware. The default bounding
+ box is [0..279,0..191].
+
+ Programs using this driver will have to be linked with <tt/-S $4000/
+ to reserve the first hires page if they are intended to run on an
+ Apple ][ (in contrast to an Apple //e) because the
+ AppleMouse II Card firmware writes to the hires page when initializing
+ on that machine.
+
+ Note that the Apple ][ default mouse callbacks support text
+ mode only.
+
+</descrip><p>
<sect1>RS232 device drivers<p>
-No serial drivers are currently available for the Apple ][.
+<descrip>
+
+ <tag><tt/a2.ssc.ser (a2_ssc_ser)/</tag>
+ Driver for the Apple II Super Serial Card. Supports up to 19200 baud,
+ hardware flow control (RTS/CTS) and interrupt driven receives. Note
+ that because of the peculiarities of the 6551 chip transmits are not
+ interrupt driven, and the transceiver blocks if the receiver asserts
+ flow control because of a full buffer.
+ The driver defaults to slot 2. Call <tt/ser_apple2_slot()/ prior to
+ <tt/ser_open()/ in order to select a different slot. <tt/ser_apple2_slot()/
+ succeeds for all Apple II slots, but <tt/ser_open()/ fails with
+ <tt/SER_ERR_NO_DEVICE/ if there's no SSC firmware found in the selected slot.
+</descrip><p>
-<sect>Limitations<label id="limitations"><p>
-<sect1>Disk I/O<p>
-The existing library for the Apple ][ doesn't implement C file
-I/O. There are two hacks for the <tt/read()/ and <tt/write()/ routines in
-place, which will make functions work that read from or write to <tt/stdout/
-(like <tt/printf()/). However, these functions have some shortcomings which
-won't be fixed, because they're going to be replaced anyway.
+<sect>Limitations<p>
-To be more concrete, this limitation means that you cannot use any of the
-following functions (and a few others):
-<itemize>
-<item>fclose
-<item>fopen
-<item>fread
-<item>fprintf
-<item>fputc
-<item>fscanf
-<item>fwrite
-<item>...
-</itemize>
+<sect1>DOS 3.3<p>
+
+Although the standard binaries generated by the linker for the Apple ][
+generally run both on DOS 3.3 (with Applesoft BASIC) and on ProDOS 8 (with
+BASIC.SYSTEM) there are some limitations for DOS 3.3:
+
+<descrip>
+
+ <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
+ linked drivers have to be used instead.
+
+ <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
+ mouse and RS232 device drivers are not functional as they depend on interrupts.
+
+</descrip><p>
+
+
+<sect1>Direct console I/O<p>
+
+<descrip>
+
+ <tag/Color/
+ The Apple ][ has no color text mode. Therefore the functions textcolor(),
+ bgcolor() and bordercolor() have no effect.
+
+</descrip><p>
+
<sect>Other hints<p>
+
<sect1>Passing arguments to the program<p>
-Command line arguments can be passed to <tt/main()/. Since this is not
-supported by BASIC, the following syntax was choosen:
+Command line arguments can be passed to <tt/main()/ after BLOAD. Since this is not
+supported by BASIC, the following syntax was chosen:
<tscreen><verb>
- RUN:REM,ARG1," ARG2", ARG 3,, ARG5, ...
+]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
</verb></tscreen>
<enum>
-<item>Arguments are separated by commas.
-<item>There must be a comma after the first <tt/REM/.
-<item>Leading spaces are ignored; trailing spaces are included unless the
- argument was quoted.
+<item>Arguments are separated by spaces.
+<item>Arguments may be quoted.
+<item>Leading and trailing spaces around an argument are ignored. Spaces within
+ a quoted argument are allowed.
<item>The first argument passed to <tt/main/ is the program name.
+<item>A maximum number of 10 arguments (including the program name) are
+ supported.
</enum>
-<sect1>Function keys<p>
+<sect1>Interrupts<p>
+
+The runtime for the Apple ][ uses routines marked as
+<tt/.INTERRUPTOR/ for ProDOS 8 interrupt handlers. Such routines must be
+written as simple machine language subroutines and will be called
+automatically by the interrupt handler code when they are linked into a
+program. See the discussion of the <tt/.CONDES/ feature in the <url
+url="ca65.html" name="assembler manual">.
-These are defined to be OpenApple + number key.
+<sect1>DIO<p>
+<descrip>
+
+ <tag/Drive ID/
+ The function <url url="dio.html#s1" name="dio_open()"> has the single
+ parameter <tt/device/ to identify the device to be opened. Therefore an
+ Apple II slot and drive pair is mapped to that <tt/device/ according
+ to the formula
+
+ <tscreen>
+ device = slot + (drive - 1) * 8
+ </tscreen>
-<sect>Bugs/Feedback<p>
+ so that for example slot 6 drive 2 is mapped to <tt/device/ 14.
-If you have problems using the library, if you find any bugs, or if you're
-doing something interesting with it, I would be glad to hear from you. Feel
-free to contact me by email (<htmlurl url="mailto:uz@cc65.org"
-name="uz@cc65.org">).
+ <tag/Sector count/
+ The function <url url="dio.html#s3" name="dio_query_sectcount()"> returns
+ the correct sector count for all ProDOS 8 disks. However for any non-ProDOS 8
+ disk it simply always returns 280 (which is only correct for a 140 KB disk).
+ This condition is indicated by the <tt/_oserror/ value 82.
+
+</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>
+ #include <stdio.h>
+ #include <string.h>
+ #include <errno.h>
+ #include <apple2.h>
+
+ 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>
This software is provided 'as-is', without any expressed or implied
-warranty. In no event will the authors be held liable for any damages
+warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
</enum>
</article>
-
-
-