X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=doc%2Fapple2.sgml;h=eef0eed3d58262010d67c5d81656513312393052;hb=8cb930b50e93647cd28debfc40f39fcf6507797b;hp=03e533974b6bd252fbb6f67e0d0bac7565aed8dc;hpb=bd2185c57be7aaaffeaa7a6f19d22204ceaa9f8e;p=cc65 diff --git a/doc/apple2.sgml b/doc/apple2.sgml index 03e533974..eef0eed3d 100644 --- a/doc/apple2.sgml +++ b/doc/apple2.sgml @@ -3,8 +3,8 @@
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 @@ -24,49 +24,35 @@ Apple ][ specific header files, available drivers, and any 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> - -in the linker configuration to have the linker remove it. +<sect>Binary format<p> -Please note that there is a "Apple ][ ProDOS 8 system program -for loading binary programs" available in the cc65 User Contributions section. -It adds all benefits of a ProDOS 8 system program to the standard binary -program generated by the linker for the Apple ][ target. +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 $9600, so 35.5K of memory 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 HIMEM and grows downwards, regardless of how your linker config file is setup. @@ -74,10 +60,261 @@ Special locations: <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> Programs containing Apple ][ specific code may use the @@ -87,15 +324,20 @@ Programs containing Apple ][ specific code may use the <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 @@ -105,40 +347,33 @@ you cannot do it, it just means that there's no help. <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> @@ -147,74 +382,115 @@ how to use it. <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. Note: This driver is incompatible with any DOS using - the language card memory! + <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> -]CALL2048:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 +]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 </verb></tscreen> <enum> @@ -228,25 +504,149 @@ supported by BASIC, the following syntax was choosen: </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">. + + +<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> + + so that for example slot 6 drive 2 is mapped to <tt/device/ 14. -These are defined to be OpenApple + number key. + <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> -<sect>Bugs/Feedback<p> +<descrip> -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>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, @@ -265,6 +665,3 @@ freely, subject to the following restrictions: </enum> </article> - - -