]> git.sur5r.net Git - cc65/blob - doc/atari.sgml
Merge pull request #386 from IrgendwerA8/EasierDisplayLists
[cc65] / doc / atari.sgml
1 <!doctype linuxdoc system>
2
3 <article>
4
5 <title>Atari specific information for cc65
6 <author>
7 <url url="mailto:shawnjefferson@24fightingchickens.com" name="Shawn Jefferson"> and<newline>
8 <url url="mailto:chris@groessler.org" name="Christian Groessler">
9 <date>2014-04-24
10
11 <abstract>
12 An overview over the Atari runtime system as it is implemented for the cc65 C
13 compiler.
14 </abstract>
15
16 <!-- Table of contents -->
17 <toc>
18
19 <!-- Begin the document -->
20
21 <sect>Overview<p>
22
23 This file contains an overview of the Atari runtime system as it comes
24 with the cc65 C compiler. It describes the memory layout, Atari specific
25 header files, available drivers, and any pitfalls specific to that
26 platform.
27
28 The Atari runtime support comes in two flavors: <tt/atari/ and <tt/atarixl/.
29 The <tt/atari/ target supports all Atari 8-bit computers, the <tt/atarixl/ only
30 supports XL type or newer machines (excluding the 600XL).
31
32 The <tt/atarixl/ runtime makes the whole 64K of memory available, with the
33 exception of the I/O area at &dollar;D000 - &dollar;D7FF. Since the
34 <tt/atarixl/ runtime has some <ref name="limitations" id="limitations">, it is
35 recommended to use the <tt/atari/ target unless lack of memory dictates the
36 use of the <tt/atarixl/ target.
37
38 Please note that Atari specific functions are just mentioned here, they are
39 described in detail in the separate <url url="funcref.html" name="function
40 reference">. Even functions marked as "platform dependent" may be available on
41 more than one platform. Please see the function reference for more
42 information.
43
44
45 <sect>Binary format<p>
46
47 The Atari DOS executable file format supports more than one load block (<it/chunk/).
48
49 The default binary output format generated by the linker for the
50 Atari target is a machine language program with a standard executable
51 header (FF FF &lt;load chunk #1&gt; ... &lt;load chunk #n&gt).
52 A load chunk has the format &lsqb;&lt;2 byte start address&gt; &lt;2 bytes end address&gt;
53 &lt;chunk data&gt;&rsqb;.
54 A run vector is added to the end of the
55 file (&dollar;02E0 &dollar;02E1 &lt;run vector&gt;) and is calculated using
56 the <tt/start/ label in crt0.s.  (Technically the run vector is also a load chunk,
57 but is not regarded as such here.)
58
59 An <tt/atari/ program has two load chunks, an <tt/atarixl/ program has three load
60 chunks.  The load chunks are defined in the linker configuration files.  For more
61 detailed information about the load chunks see the chapter
62 <ref name="Technical details" id="techdetail">. For the discussion here it's
63 sufficient to know that the first load chunk(s) do preparation work and the
64 main part of the program is in the last load chunk.
65
66 The values determining the size of the main part of the program (the second load
67 chunk for <tt/atari/, the third load chunk for <tt/atarixl/) are calculated in
68 the crt0.s file from the __STARTUP_LOAD__ and __BSS_LOAD__ values.
69 Be aware of that if you create a custom linker config file and start moving segments around (see section
70 <ref name="Reserving a memory area inside the program" id="memhole">).
71
72
73 <sect>Memory layout<p>
74
75 <sect1><tt/atari/ target<p>
76
77 The default linker config file assumes that the BASIC ROM is disabled (or
78 the BASIC cartridge unplugged). This gives a usable memory range of
79 &lsqb;&dollar;2000-&dollar;BC1F&rsqb;. The library startup code examines the
80 current memory configuration, which depends on the size of the
81 installed memory and cartridges. It does so by using the value in
82 the MEMTOP (&dollar;2E5) variable as highest memory address the program
83 can use. The initial stack pointer, which is the upper bound of
84 memory used by the program, is set to this value, minus an optionally
85 defined __RESERVED_MEMORY__ value.
86
87 The default load address of &dollar;2000 can be changed by creating a custom
88 linker config file or by using the "--start-addr" cl65 command line
89 argument or the "--start-addr" or "-S" ld65 command line arguments.
90
91 Please note that the first load chunk (which checks the available memory)
92 will always be loaded at &dollar;2E00, regardless of the specified start
93 address. This address can only be changed by a custom linker config file.
94
95 Special locations:
96
97 <descrip>
98   <tag/Text screen/
99   The text screen depends on the installed memory size and cartridges
100   and can be obtained from the SAVMSC variable (&dollar;58).
101
102   <tag/Stack/
103   The C runtime stack is located at MEMTOP and grows downwards,
104   regardless of how your linker config file is setup.  This
105   accommodates the different memory configurations of the Atari
106   machines, as well as having a cartridge installed.  You can override
107   this behaviour by writing your own crt0.s file and linking it to
108   your program (see also <ref name="Final note"
109   id="memhole_final_note">).
110
111   <tag/Heap/
112   The C heap is located at the end of the program and grows towards the C
113   runtime stack.
114
115 </descrip><p>
116
117 <sect1><tt/atarixl/ target<p>
118
119 The startup code rearranges the memory as follows:
120
121 <enum>
122 <item>Sceen memory and display list are moved below the program start address.
123 <item>The ROM is disabled, making the memory in the areas &lsqb;&dollar;C000-&dollar;CFFF&rsqb;
124 and &lsqb;&dollar;D800-&dollar;FFF9&rsqb; available.
125 <item>Character generator data is copied from ROM to the CHARGEN location specified in the
126 linker config file.  This is (in the default <tt/atarixl.cfg/ file) at the same address as
127 where it is in ROM (&dollar;E000, it can be changed, see <ref name="atarixl chargen location"
128 id="chargenloc">).  With the character generator at &dollar;E000, there are two upper memory
129 areas available, &lsqb;&dollar;D800-&dollar;DFFF&rsqb; and &lsqb;&dollar;E400-&dollar;FFF9&rsqb;.
130 </enum>
131
132 With the default load address of &dollar;2400 this gives a usable memory range of
133 &lsqb;&dollar;2400-&dollar;CFFF&rsqb;.
134
135 Please note that the first load chunk (which checks the system
136 compatibilty and available memory) will always be loaded at
137 &dollar;2E00, regardless of the specified start address. This address
138 can only be changed by a custom linker config file.
139
140 Special locations:
141
142 <descrip>
143   <tag/Text screen/
144   The text screen depends on the selected load address (&dollar;2400
145   by default), and resides directly before that address, rounded to the next
146   lower page boundary.
147   The screen memory's start address can be obtained from the SAVMSC variable
148   (&dollar;58).
149
150   <tag/Stack/
151   The C runtime stack is located at end of the MAIN memory area (&dollar;CFFF)
152   and grows downwards.
153
154   <tag/Heap/
155   The C heap is located at the end of the program (end of BSS segment) and
156   grows towards the C runtime stack.
157
158 </descrip><p>
159
160 <sect>Linker configurations<p>
161
162 The ld65 linker comes with default config files for the Atari. There
163 are two targets for the Atari, <tt/atari/ and <tt/atarixl/.
164 The default config file for <tt/atari/ is selected with
165 <tt/-t atari/, and the default config file for <tt/atarixl/ is selected with
166 <tt/-t atarixl/.
167 The Atari package comes with additional secondary linker config files which
168 can be used via <tt/-t atari -C &lt;configfile&gt;/ (for <tt/atari/ target) or
169 <tt/-t atarixl -C &lt;configfile&gt;/ (for <tt/atarixl/ target).
170
171 <sect1><tt/atari/ config files<p>
172
173 <sect2>default config file (<tt/atari.cfg/)<p>
174
175 The default configuration is tailored to C programs. It creates files
176 which have a default load address of &dollar;2000.
177
178 The files generated by this config file include the
179 <ref name="&dquot;system check&dquot;" id="syschk"> load chunk. It can
180 optionally be left out, see <ref name="Getting rid of the &dquot;system check&dquot; load chunk" id="nosyschk">.
181
182 <sect2><tt/atari-asm.cfg/<p>
183
184 This config file aims to give the assembler programmer maximum
185 flexibility. All program segments (<tt/CODE/, <tt/DATA/, etc.) are
186 optional.
187
188 By default it creates regular DOS executable files, which have a default
189 load address of &dollar;2E00. It's also possible to generate an image of
190 just the program data without EXE header, load address, or (auto-)start address.
191 To you so, you have to define the symbols <tt/__AUTOSTART__/ and <tt/__EXEHDR__/
192 when linking the program. Therefore, to generate a "plain" binary file, pass the
193 options "<tt/-D__AUTOSTART__=1 -D__EXEHDR__=1/" to the linker.
194 It's also possible to create a non auto-starting program file, by defining
195 only the <tt/__AUTOSTART__/ symbol. Such a program has to be run manually
196 after being loaded by DOS (for example by using the "M" option of DOS 2.5).
197 Defining only the <tt/__EXEHDR__/ symbol will create a (useless) file which
198 doesn't conform to the DOS executable file format (like a "plain" binary file)
199 but still has the "autostart" load chunk appended.
200
201 The sections of the file which the defines refer to (<tt/__AUTOSTART__/ for
202 the autostart trailer, <tt/__EXEHDR__/ for the EXE header and load address)
203 is <it/left out/, keep this in mind.
204
205 The values you assign to the two symbols <tt/__AUTOSTART__/ and <tt/__EXEHDR__/
206 don't matter.
207
208 <sect2><tt/atari-cart.cfg/<p>
209
210 This config file can be used to create 8K or 16K cartridges. It's suited both
211 for C and assembly language programs.
212
213 By default, an 8K cartridge is generated. To create a 16K cartridge, pass the
214 size of the cartridge to the linker, like "<tt/-D__CARTSIZE__=0x4000/".
215 The only valid values for <tt/__CARTSIZE__/ are 0x2000 and 0x4000.
216
217 The option byte of the cartridge can be set with the <tt/__CARTFLAGS__/
218 value, passed to the linker. The default value is &dollar;01, which means
219 that the cartridge doesn't prevent the booting of DOS.
220
221 The option byte will be located at address &dollar;BFFD. For more information
222 about its use, see e.g. "Mapping the Atari".
223
224 <sect2><tt/atari-cassette.cfg/<p>
225
226 This config file can be used to create cassette boot files. It's suited both
227 for C and assembly language programs.
228
229 The size of a cassette boot file is restricted to 32K. Larger programs
230 would need to be split in more parts and the parts to be loaded manually.
231
232 To write the generated file to a cassette, a utility (<tt/w2cas.com/) to run
233 on an Atari is provided in the <tt/util/ directory of <tt/atari/ target dir.
234
235 <sect1><tt/atarixl/ config files<p>
236
237 <sect2>default config file (<tt/atarixl.cfg/)<p>
238
239 The default configuration is tailored to C programs. It creates files
240 which have a default load address of &dollar;2400.
241
242 The files generated by this config file include the
243 <ref name="&dquot;system check&dquot;" id="syschkxl"> load chunk. It can
244 optionally be left out, see <ref name="Getting rid of the &dquot;system check&dquot; load chunk" id="nosyschk">.
245
246 <sect2><tt/atarixl-largehimem.cfg/<p>
247
248 This is the same as the default config file, but it rearranges the
249 high memory beneath the ROM into one large block. In order for this
250 config file to work, the runtime library has to be recompiled with a
251 special define. See the file <tt/libsrc&sol;atari&sol;Makefile.inc/ in the
252 source distribution.
253
254 The files generated by this config file include the
255 <ref name="&dquot;system check&dquot;" id="syschkxl"> load chunk. It can
256 optionally be left out, see <ref name="Getting rid of the &dquot;system check&dquot; load chunk" id="nosyschk">.
257
258
259 <sect>Platform specific header files<p>
260
261 Programs containing Atari specific code may use the <tt/atari.h/
262 header file.
263
264
265 <sect1>Atari specific functions<p>
266
267 The functions and global variable listed below are special for the Atari.
268 See the <url url="funcref.html" name="function reference"> for declaration and usage.
269
270 <itemize>
271 <item>get_ostype
272 <item>get_tv
273 <item>_dos_type
274 <item>_gtia_mkcolor
275 <item>_getcolor
276 <item>_getdefdev
277 <item>_graphics
278 <item>_is_cmdline_dos
279 <item>_rest_vecs
280 <item>_save_vecs
281 <item>_scroll
282 <item>_setcolor
283 <item>_setcolor_low
284 </itemize>
285
286
287 <sect1>Hardware access<p>
288
289 The following pseudo variables declared in the <tt/atari.h/ header
290 file do allow access to hardware located in the address space. Some
291 variables are structures, accessing the struct fields will access the
292 chip registers.
293
294 <descrip>
295
296   <tag><tt/GTIA_READ/ and <tt/GTIA_WRITE/</tag>
297   The <tt/GTIA_READ/ structure allows read access to the GTIA. The
298   <tt/GTIA_WRITE/ structure allows write access to the GTIA.
299   See the <tt/_gtia.h/ header file located in the include directory
300   for the declaration of the structure.
301
302   <tag><tt/POKEY_READ/ and <tt/POKEY_WRITE/</tag>
303   The <tt/POKEY_READ/ structure allows read access to the POKEY. The
304   <tt/POKEY_WRITE/ structure allows write access to the POKEY.
305   See the <tt/_pokey.h/ header file located in the include directory
306   for the declaration of the structure.
307
308   <tag><tt/ANTIC/</tag>
309   The <tt/ANTIC/ structure allows read access to the ANTIC.
310   See the <tt/_antic.h/ header file located in the include directory
311   for the declaration of the structure.
312
313   <tag><tt/PIA/</tag>
314   The <tt/PIA/ structure allows read access to the PIA 6520.
315   See the <tt/_pia.h/ header file located in the include directory
316   for the declaration of the structure.
317
318 </descrip><p>
319
320 <sect1>Display lists<p>
321
322 A major feature of the Atari graphics chip "ANTIC" is to
323 process instructions for the display generation.
324 cc65 supports constructing these display lists by offering defines
325 for the instructions. In conjunction with the "void"-variable extension
326 of cc65, display lists can be created quite comfortable:
327
328 <verb>
329 ...
330 unsigned char ScreenMemory[100];
331
332 void DisplayList =
333 {
334         DL_BLK8,
335         DL_BLK8,
336         DL_BLK8,
337         DL_LMS(DL_CHR20x8x2),
338         ScreenMemory,
339         DL_CHR20x8x2,
340         DL_CHR20x8x2,
341         DL_CHR20x8x2,
342         DL_BLK4,
343         DL_CHR20x8x2,
344         DL_JVB
345 };
346 ...
347 POKEW(560,(unsigned int)&amp;DisplayList);              // SDLSTL
348 ...
349 </verb>
350
351 Please inspect the <tt/_antic.h/ header file to detemine the supported
352 instruction names. Modifiers on instructions can be nested without need
353 for an order:
354
355 <tt/DL_LMS(DL_HSCROL(DL_VSCROL(DL_DLI(DL_MAP80x4x2))))/
356
357 Please mind that ANTIC has memory alignment requirements for "player
358 missile graphics"-data, font data, display lists and screen memory. Creation
359 of a special linker configuration with appropriate aligned segments and
360 switching to that segment in the c-code is usually neccessary. A more memory
361 hungry solution consists in using the "<tt/posix_memalign()/" function in
362 conjunction with copying your data to the allocated memory.
363
364 <sect1>Character mapping<p>
365
366 The Atari has two representations for characters:
367 <enum>
368 <item> ATASCII is character mapping which is similar to ASCII and used
369 by the CIO system of the OS. This is the default mapping of cc65 when
370 producing code for the atari target.
371 <item> The internal/screen mapping represents the real value of the
372 screen ram when showing a character.
373 </enum>
374
375 For direct memory access (simplicity and speed) enabling the internal
376 mapping can be useful. This can be achieved by including the
377 "<tt/atari_screen_charmap.h/" header.
378
379 A word of caution: Since the <tt/0x00/ character has to be mapped in an
380 incompatible way to the C-standard, the usage of string functions in
381 conjunction with internal character mapped strings delivers unexpected
382 results regarding the string length. The end of strings are detected where
383 you may not expect them (too early or (much) too late). Internal mapped
384 strings typically support the "<tt/mem...()/" functions.
385
386 <em>For assembler sources the macro "<tt/scrcode/" from the "<tt/atari.mac/"
387 package delivers the same feature.</em>
388
389 You can switch back to the ATASCII mapping by including
390 "<tt/atari_atascii_charmap.h/".
391
392 A final note: Since cc65 has currently some difficulties with string merging
393 under different mappings, defining remapped strings works only flawlessly
394 with static array initialization:
395
396 <verb>
397 #include &lt;atari\_screen\_charmap.h&gt;
398 char pcScreenMappingString[] = "Hello Atari!";
399
400 #include &lt;atari_atascii_charmap.h&gt;
401 char pcAtasciiMappingString[] = "Hello Atari!";
402 </verb>
403
404 delivers correct results, while
405
406 <verb>
407 #include &lt;atari_screen_charmap.h&gt;
408 char* pcScreenMappingString = "Hello Atari!";
409
410 #include &lt;atari_atascii_charmap.h&gt;
411 char* pcAtasciiMappingString = "Hello Atari!";
412 </verb>
413
414 does not.
415
416
417 <sect>Loadable drivers<p>
418
419 The names in the parentheses denote the symbols to be used for static linking of the drivers.
420
421
422 <sect1>Graphics drivers<p>
423
424 <table><tabular ca="rrrr">
425 <tt/atari/|<tt/atarixl/|screen resolution|display pages@<hline>
426 <tt/atr3.tgi (atr3_tgi)/|<tt/atrx3.tgi (atrx3_tgi)/|40x24x4 (CIO mode 3, ANTIC mode 8)|1@
427 <tt/atr4.tgi (atr4_tgi)/|<tt/atrx4.tgi (atrx4_tgi)/|80x48x2 (CIO mode 4, ANTIC mode 9)|1@
428 <tt/atr5.tgi (atr5_tgi)/|<tt/atrx5.tgi (atrx5_tgi)/|80x48x4 (CIO mode 5, ANTIC mode A)|1@
429 <tt/atr6.tgi (atr6_tgi)/|<tt/atrx6.tgi (atrx6_tgi)/|160x96x2 (CIO mode 6, ANTIC mode B)|1@
430 <tt/atr7.tgi (atr7_tgi)/|<tt/atrx7.tgi (atrx7_tgi)/|160x96x4 (CIO mode 7, ANTIC mode D)|1@
431 <tt/atr8.tgi (atr8_tgi)/|<tt/atrx8.tgi (atrx8_tgi)/|320x192x2 (CIO mode 8, ANTIC mode F)|1@
432 <tt/atr8p2.tgi (atr8p2_tgi)/|<tt/atrx8p2.tgi (atrx8p2_tgi)/|320x192x2 (CIO mode 8, ANTIC mode F)|2@
433 <tt/atr9.tgi (atr9_tgi)/|<tt/atrx9.tgi (atrx9_tgi)/|80x192x16b (CIO mode 9, ANTIC mode F, GTIA mode &dollar;40)|1@
434 <tt/atr9p2.tgi (atr9p2_tgi)/|<tt/atrx9p2.tgi (atrx9p2_tgi)/|80x192x16b (CIO mode 9, ANTIC mode F, GTIA mode &dollar;40)|2@
435 <tt/atr10.tgi (atr10_tgi)/|<tt/atrx10.tgi (atrx10_tgi)/|80x192x9 (CIO mode 10, ANTIC mode F, GTIA mode &dollar;80)|1@
436 <tt/atr10p2.tgi (atr10p2_tgi)/|<tt/atrx10p2.tgi (atrx10p2_tgi)/|80x192x9 (CIO mode 10, ANTIC mode F, GTIA mode &dollar;80)|2@
437 <tt/atr11.tgi (atr11_tgi)/|<tt/atrx11.tgi (atrx11_tgi)/|80x192x16h (CIO mode 11, ANTIC mode F, GTIA mode &dollar;C0)|1@
438 <tt/atr14.tgi (atr14_tgi)/|<tt/atrx14.tgi (atrx14_tgi)/|160x192x2 (CIO mode 14, ANTIC mode C)|1@
439 <tt/atr15.tgi (atr15_tgi)/|<tt/atrx15.tgi (atrx15_tgi)/|160x192x4 (CIO mode 15, ANTIC mode E)|1@
440 <tt/atr15p2.tgi (atr15p2_tgi)/|<tt/atrx15p2.tgi (atrx15p2_tgi)/|160x192x4 (CIO mode 15, ANTIC mode E)|2
441 </tabular>
442 <!-- <caption>bla bla -->
443 </table>
444
445
446 Many graphics modes require more memory than the text screen which is
447 in effect when the program starts up. Therefore the programmer has to
448 tell the program beforehand the memory requirements of the graphics
449 modes the program intends to use.
450
451 On the <tt/atari/ target his can be done by using the __RESERVED_MEMORY__
452 linker config variable. The number specified there describes the number
453 of bytes to subtract from the top of available memory as seen from the
454 runtime library. This memory is then used by the screen buffer.
455
456 On the <tt/atarixl/ target the screen memory resides below the program
457 load address.  In order to reserve memory for a graphics mode, one
458 simply uses a higher program load address.  There are restrictions on
459 selectable load addresses,
460 see <ref name="Selecting a good program load address" id="loadaddr">.
461
462 The numbers for the different graphics modes presented below should
463 only be seen as a rule of thumb. Since the screen buffer memory needs
464 to start at specific boundaries, the numbers depend on the current top
465 of available memory.
466 The following numbers were determined by a BASIC program.
467
468 <table>
469 <tabular ca="rr">
470 graphics mode|reserved memory@<hline>
471 0|1@
472 1|1@
473 2|1@
474 3|1@
475 4|1@
476 5|182@
477 6|1182@
478 7|3198@
479 8|7120@
480 9|7146@
481 10|7146@
482 11|7146@
483 12|162@
484 13|1@
485 14|3278@
486 15|7120@
487 16|1@
488 17|1@
489 18|1@
490 19|1@
491 20|1@
492 21|184@
493 22|1192@
494 23|3208@
495 24|7146@
496 25|7146@
497 26|7146@
498 27|7146@
499 28|162@
500 29|1@
501 30|3304@
502 31|7146
503 </tabular>
504 <caption>reserved memory required for different graphics modes
505 </table>
506
507 The values of "1" are needed because the graphics command crashes if
508 it doesn't have at least one byte available. This seems to be a bug of
509 the Atari ROM code.
510
511 Default drivers: <tt/atr8.tgi (atr8_tgi)/ and <tt/atrx8.tgi (atrx8_tgi)/.
512
513 <sect1>Extended memory drivers<p>
514
515 Currently there is only one extended memory driver.  It manages the second 64K of a 130XE.
516
517 <table>
518 <tabular ca="rr">
519 <tt/atari/|<tt/atarixl/@<hline>
520 <tt/atr130.emd (atr130_emd)/|<tt/atrx130.emd (atrx130_emd)/
521 </tabular>
522 </table>
523
524 <sect1>Joystick drivers<p>
525
526 Currently there are two joystick drivers available:
527
528 <table>
529 <tabular ca="rrr">
530 <tt/atari/|<tt/atarixl/|description@<hline>
531 <tt/atrstd.joy (atrstd_joy)/|<tt/atrxstd.joy (atrxstd_joy)/|Supports up to two/four standard joysticks connected to the joystick ports of the Atari. (Four on the pre-XL systems, two on XL or newer.)@
532 <tt/atrmj8.joy (atrmj8_joy)/|<tt/atrxmj8.joy (atrxmj8_joy)/|Supports up to eight standard joysticks connected to a MultiJoy adapter.
533 </tabular>
534 </table>
535
536 Default drivers: <tt/atrstd.joy (atrstd_joy)/ and <tt/atrxstd.joy (atrxstd_joy)/.
537
538 <sect1>Mouse drivers<p>
539
540 Currently there are five mouse drivers available:
541
542 <table>
543 <tabular ca="rrr">
544 <tt/atari/|<tt/atarixl/|description@<hline>
545 <tt/atrjoy.mou (atrjoy_mou)/|<tt/atrxjoy.mou (atrxjoy_mou)/|Supports a mouse emulated by a standard joystick.@
546 <tt/atrst.mou (atrst_mou)/|<tt/atrxst.mou (atrxst_mou)/|Supports an Atari ST mouse.@
547 <tt/atrami.mou (atrami_mou)/|<tt/atrxami.mou (atrxami_mou)/|Supports an Amiga mouse.@
548 <tt/atrtrk.mou (atrtrk_mou)/|<tt/atrxtrk.mou (atrxtrk_mou)/|Supports an Atari trakball.@
549 <tt/atrtt.mou (atrtt_mou)/|<tt/atrxtt.mou (atrxtt_mou)/|Supports an Atari touch tablet.
550 </tabular>
551 </table>
552
553 All mouse devices connect to joystick port #0.
554
555 Default drivers: <tt/atrst.mou (atrst_mou)/ and <tt/atrxst.mou (atrxst_mou)/.
556
557 <sect2>Mouse callbacks<p>
558
559 There are two mouse callbacks available.
560 <p>
561 The "text mode" callbacks (<tt/mouse_txt_callbacks/) display the mouse cursor as a "diamond" character
562 on the standard "GRAPHICS 0" text mode screen. The mouse cursor character can be changed by an
563 assembly file defining the character by exporting the zeropage symbol <tt/mouse_txt_char/.
564 The default file looks like this:
565 <tscreen><verb>
566         .export mouse_txt_char : zp = 96     ; 'diamond' screen code
567 </verb></tscreen>
568 <p>
569 The "P/M" callbacks (<tt/mouse_pm_callbacks/) use Player-Missile graphics for the mouse cursor.
570 The cursor shape can be changed, too, by an assembly file. Here's the default shape definition:
571 <tscreen><verb>
572         .export mouse_pm_bits
573         .export mouse_pm_height    : zeropage
574         .export mouse_pm_hotspot_x : zeropage
575         .export mouse_pm_hotspot_y : zeropage
576         .rodata
577 mouse_pm_bits:
578         .byte   %11110000
579         .byte   %11000000
580         .byte   %10100000
581         .byte   %10010000
582         .byte   %10001000
583         .byte   %00000100
584         .byte   %00000010
585 mouse_pm_height = * - mouse_pm_bits
586 ; hot spot is upper left corner
587 mouse_pm_hotspot_x = 0
588 mouse_pm_hotspot_y = 0
589 </verb></tscreen>
590 <p>
591 <tt/mouse_pm_bits/ defines the shape of the cursor, <tt/mouse_pm_height/ defines the number of
592 bytes in <tt/mouse_pm_bits/. <tt/mouse_pm_hotspot_x/ and <tt/mouse_pm_hotspot_y/ define the
593 position in the shape where "the mouse points to". When using this callback page #6 (&dollar;600
594  - &dollar;6FF) is used for the P/M graphics data and no P/M graphics can otherwise be used
595 by the program. The height of the shape (<tt/mouse_pm_height/)
596 must not exceed 32 lines since the callback routines cannot handle more than 32 lines.
597 <p>
598 The default callbacks definition (<tt/mouse_def_callbacks/) is an alias for the "P/M" callbacks.
599
600 <sect1>RS232 device drivers<p>
601
602 Currently there is one RS232 driver.  It uses the R: device (therefore
603 an R: driver needs to be installed) and was tested with the 850
604 interface module.
605
606 <table>
607 <tabular ca="rr">
608 <tt/atari/|<tt/atarixl/@<hline>
609 <tt/atrrdev.ser (atrrdev_ser)/|<tt/atrxrdev.ser (atrxrdev_ser)/
610 </tabular>
611 </table>
612
613
614 <sect>Limitations<p>
615
616 <sect1><tt/atarixl/<#if output="info|latex2e"> limitations</#if><label id="limitations"<p>
617
618 <itemize>
619 <item>The display is cleared at program start and at program termination.  This is a side
620 effect of relocating the display memory below the program start address.
621 <item>Not all possible CIO and SIO functions are handled by the runtime stub code which banks
622 the ROM in and out.  All functions used by the runtime library are handled, though.
623 <item>The <tt/_sys()/ function is not supported.
624 <item>It is not compatible with DOSes or other programs using the memory below the ROM.
625 </itemize>
626
627 <sect>DIO implementation<label id="dio"><p>
628
629 The Atari supports disk drives with either 128 or 256 byte sectors.
630 The first three sectors of any disk are always 128 bytes long though. This is
631 because the system can only boot from 128 bytes sectors.
632
633 Therefore the DIO read and write functions transfer only 128 bytes
634 for sectors 1 to 3, regardless of the type of diskette.
635
636
637 <sect>CONIO implementation<label id="conio"><p>
638
639 The console I/O is speed optimized therefore support for XEP80 hardware
640 or f80.com software is missing. Of course you may use stdio.h functions.
641
642
643 <sect>Technical details<label id="techdetail"><p>
644
645 <sect1><tt/atari/<#if output="info|latex2e"> details</#if><p>
646
647 <sect2><#if output="info|latex2e"><tt/atari/ </#if>Load chunks<p>
648
649 An <tt/atari/ program contains two load chunks.
650
651 <enum>
652 <item>"system check"<label id="syschk">&nl;
653 This load chunk is always loaded at address &dollar;2E00, and checks if the system has
654 enough memory to run the program. It also checks if the program start address is not
655 below MEMLO. If any of the checks return false, the loading of the program is aborted.&nl;
656 The contents of this chunk come from the SYSCHKCHNK memory area of the linker config file.
657 <item>main program&nl;
658 This load chunk is loaded at the selected program start address (default &dollar;2000) and
659 contains all of the code and data of the program.&nl;
660 The contents of this chunk come from the MAIN memory area of the linker config file.
661 </enum>
662
663
664 <sect1><tt/atarixl/<#if output="info|latex2e"> details</#if><p>
665
666 <sect2>General operation<p>
667
668 The <tt/atarixl/ target banks out the ROM while the program is running in
669 order to make more memory available to the program.
670
671 The screen memory is by default located at the top of available memory,
672 &dollar;BFFF if BASIC is not enabled, &dollar;9FFF if BASIC is enabled.
673 Therefore, in order to create a largest possible continuous memory area,
674 the screen memory is moved below the program load address.  This gives
675 a memory area from &lt;program load addr&gt; to &dollar;CFFF.
676
677 The startup code installs wrappers for interrupt handlers and ROM routines.
678 When an interrupt or call to a ROM routine happens, the wrappers enable the
679 ROM, call the handler or routine, and disable the ROM again.
680
681 The "wrapping" of the ROM routines is done by changing the ROM entry
682 point symbols in <tt/atari.inc/ to point to the wrapper functions.
683
684 For ROM functions which require input or output buffers, the wrappers
685 copy the data as required to buffers in low memory.
686
687 <sect2><#if output="info|latex2e"><tt/atarixl/ </#if>Load chunks<label id="xlchunks"><p>
688
689 An <tt/atarixl/ program contains three load chunks.
690
691 <enum>
692 <item>"system check"<label id="syschkxl">&nl;
693 This load chunk is always loaded at address &dollar;2E00, and checks if the system is
694 suitable for running the program. It also checks if there is enough room between MEMLO
695 and the program start address to move the text mode screen buffer there. If any of the
696 checks return false, the loading of the program is aborted.&nl;
697 The contents of this chunk come from the SYSCHKCHNK memory area of the linker config file.
698 <item>"shadow RAM prepare"&nl;
699 The second load chunk gets loaded to the selected program load address (default &dollar;2400).
700 It moves the screen memory below the program load address, copies the character generator
701 from ROM to its new place in RAM, and copies the parts of the program which reside in
702 high memory below the ROM to their place. The high memory parts are included in this load chunk.&nl;
703 At the beginning of this load chunk there is a .bss area, which is not part of the
704 EXE file. Therefore the on-disk start address of this load chunk will be higher than the
705 selected start address. This .bss area (segment LOWBSS) contains the buffers for the
706 double buffering of ROM input and output data.  If you add contents to this segment be aware
707 that the contents won't be zero initialized by the startup code.&nl;
708 The contents of this chunk come from the SRPREPCHNK memory area of the linker config file.
709 <item>main program&nl;
710 This load chunk is loaded just above the LOWBSS segment, replacing the code of
711 the previous load chunk. It contains all remaining code and data sections of the program,
712 including the startup code.&nl;
713 The contents of this chunk come from the RAM memory area of the linker config file.
714 </enum>
715
716 <sect2>Moving screen memory below the program start address<p>
717
718 When setting a graphics mode, the ROM looks at the RAMTOP location. RAMTOP
719 describes the amount of installed memory in pages (RAMTOP is only one byte).
720 The screen memory and display list are placed immediately below RAMTOP.
721
722 Now in order to relocate the screen memory to lower memory, the startup code
723 puts a value into RAMTOP which causes the ROM routines to allocate the display
724 memory below the program start address and then it issues a ROM call to setup
725 the regular text mode.
726
727 <sect2>Selecting a good program load address<label id="loadaddr"><p>
728
729 Due to the movement of the screen memory below the program start, there are some
730 load addresses which are sub-optimal because they waste memory or prevent a
731 higher resolution graphics mode from being enabled.
732
733 There are restrictions at which addresses screen memory (display buffer and display
734 list) can be placed. The display buffer cannot cross a 4K boundary and a display
735 list cannot cross a 1K boundary.
736
737 The startup code takes this into account when moving the screen memory down.
738 If the program start address (aligned to the next lower page boundary) minus
739 the screen buffer size would result in a screen buffer which spans a 4K
740 boundary, the startup code lowers RAMTOP to this 4K boundary.&nl;
741 The size of the screen buffer in text mode is 960 (&dollar;3C0) bytes. So, for
742 example, a selected start address of &dollar;2300 would span the 4K boundary
743 at &dollar;2000. The startup code would adjust the RAMTOP value in such way that
744 the screen memory would be located just below this boundary (at &dollar;1C40).
745 This results in the area &lsqb;&dollar;2000-&dollar;22FF&rsqb; being wasted.
746 Additionally, the program might fail to load since the lowest address used
747 by the screen memory could be below MEMLO. (The lowest address used in this
748 example would be at &dollar;1C20, where the display list would allocated.)
749
750 These calculations are performed by the startup code (in the first two
751 load chunks), but the startup code only takes the default 40x24 text mode
752 into account. If the program later wants to load TGI drivers which set
753 a more memory consuming graphics mode, the user has to pick a higher
754 load address.
755 Using higher resolution modes there is a restriction in the ROM that it
756 doesn't expect RAMTOP to be at arbitrary values. The Atari memory modules
757 came only in 8K or 16K sizes, so the ROM expects RAMTOP to only have
758 values in 8K steps. Therefore, when using the highest resolution modes
759 the program start address must be at an 8K boundary.
760
761
762 <sect2>Character generator location<label id="chargenloc"><p>
763
764 The default <tt/atarixl/ linker config file (<tt/atarixl.cfg/) leaves the
765 character generator location at the same address where it is in ROM
766 (&dollar;E000). This has the disadvatage to split the upper memory into
767 two parts (&lsqb;&dollar;D800-&dollar;DFFF&rsqb; and
768 &lsqb;&dollar;E400-&dollar;FFF9&rsqb;). For applications which
769 require a large continuous upper memory area, an alternative linker
770 config file (<tt/atarixl-largehimem.cfg/) is provided. It relocates the
771 character generator to &dollar;D800, providing a single big upper
772 memory area at &lsqb;&dollar;DC00-&dollar;FFF9&rsqb;.
773
774 With the character generator at a different address than in ROM, the routines
775 which enable and disable the ROM also have to update the chargen pointer.
776 This code is not enabled by default. In order to enable it,
777 uncomment the line which sets CHARGEN_RELOC in <tt/libsrc&sol;atari&sol;Makefile.inc/
778 and recompile the <tt/atarixl/ runtime library.
779
780 <sect>Other hints<p>
781
782
783 <sect1>Function keys<p>
784
785 Function keys are mapped to Atari + number key.
786
787
788 <sect1>Passing arguments to the program<p>
789
790 Command line arguments can be passed to <tt/main()/ when the used DOS supports it.
791
792 <enum>
793 <item>Arguments are separated by spaces.
794 <item>Leading and trailing spaces around an argument are ignored.
795 <item>The first argument passed to <tt/main/ is the program name.
796 <item>A maximum number of 16 arguments (including the program name) are
797       supported.
798 </enum>
799
800
801 <sect1>Interrupts<p>
802
803 The runtime for the Atari uses routines marked as <tt/.INTERRUPTOR/ for
804 interrupt handlers. Such routines must be written as simple machine language
805 subroutines and will be called automatically by the VBI handler code
806 when they are linked into a program. See the discussion of the <tt/.CONDES/
807 feature in the <url url="ca65.html" name="assembler manual">.
808
809 Please note that on the Atari targets the <tt/.INTERRUPTOR/s are being
810 run in NMI context. The other targets run them in IRQ context.
811
812 <sect1>Reserving a memory area inside a program<label id="memhole"><p>
813
814 (This section is primarily applicable to the <tt/atari/ target, but the
815 principles apply to <tt/atatixl/ as well.)
816
817 The Atari 130XE maps its additional memory into CPU memory in 16K
818 chunks at address &dollar;4000 to &dollar;7FFF. One might want to
819 prevent this memory area from being used by cc65. Other reasons to
820 prevent the use of some memory area could be to reserve space for the
821 buffers for display lists and screen memory.
822 <p>
823 The Atari executable format allows holes inside a program, e.g. one
824 part loads into &dollar;2E00 to &dollar;3FFF, going below the reserved
825 memory area (assuming a reserved area from &dollar;4000 to
826 &dollar;7FFF), and another part loads into &dollar;8000 to
827 &dollar;BC1F.
828 <p>
829 Each load chunk of the executable starts with a 4 byte header which
830 defines its load address and size. In the following linker config files
831 these headers are named HEADER and SECHDR (for the MEMORY layout), and
832 accordingly NEXEHDR and CHKHDR (for the SEGMENTS layout).
833 <p>
834 <sect2>Low code and high data example<p>
835 Goal: Create an executable with 2 load chunks which doesn't use the
836 memory area from &dollar;4000 to &dollar;7FFF. The CODE segment of
837 the program should go below &dollar;4000 and the DATA and RODATA
838 segments should go above &dollar;7FFF.
839 <p>
840 The main problem is that the EXE header generated by the cc65 runtime
841 lib is wrong. It defines a single load chunk with the sizes/addresses
842 of the STARTUP, LOWCODE, ONCE, CODE, RODATA, and DATA segments, in
843 fact, the whole user program (we're disregarding the "system check"
844 load chunk here).
845 <p>
846 The contents of the EXE header come from the EXEHDR and MAINHDR segments.
847 The EXEHDR segment just contains the &dollar;FFFF value which is required
848 to be the first bytes of the EXE file.&nl;
849 The MAINHDR are defined in in crt0.s. This cannot be changed without
850 modifying and recompiling the cc65 atari runtime library. Therefore
851 the original contents of this segment must be discarded and be
852 replaced by a user created one. This discarding is done by assigning the
853 MAINHDR segment to the (new introduced) DISCARD memory area. The DISCARD memory area is
854 thrown away in the new linker config file (written to file "").
855 We add a new FSTHDR segment for the chunk header of the first chunk.
856 <p>
857 The user needs to create a customized linker config file which adds
858 new memory areas and segments to hold the new header data for the first load
859 chunk and the header data for the second load chunk. Also an assembly source file
860 needs to be created which defines the contents of the new header data
861 for the two load chunks.
862 <p>
863 <p>
864 This is an example of a modified cc65 Atari linker configuration file
865 (split.cfg):
866 <tscreen><verb>
867 SYMBOLS {
868     __STACKSIZE__:       value = $800   type = weak;    # 2K stack
869     __RESERVED_MEMORY__: value = $0000, type = weak;
870 }
871 FEATURES {
872     STARTADDRESS: default = $2E00;
873 }
874 MEMORY {
875     ZP: start = $82, size = $7E, type = rw, define = yes;
876
877     HEADER: start = $0000, size = $2, file = %O;        # first load chunk
878
879     FSTHDR: start = $0000, size = $4, file = %O;        # second load chunk
880     RAMLO: start = %S, size = $4000 - %S, file = %O;
881
882     DISCARD: start = $4000, size = $4000, file = "";
883
884     SECHDR: start = $0000, size = $4, file = %O;        # second load chunk
885     RAM: start = $8000, size = $3C20, file = %O;        # $3C20: matches upper bound $BC1F
886 }
887 SEGMENTS {
888     EXEHDR: load = HEADER, type = ro;
889
890     MAINHDR: load = DISCARD, type = ro;
891
892     NEXEHDR: load = FSTHDR, type = ro;                  # first load chunk
893     STARTUP: load = RAMLO, type = ro, define = yes;
894     LOWCODE: load = RAMLO, type = ro, define = yes, optional = yes;
895     ONCE: load = RAMLO, type = ro, optional = yes;
896     CODE: load = RAMLO, type = ro, define = yes;
897
898     CHKHDR: load = SECHDR, type = ro;                   # second load chunk
899     RODATA: load = RAM, type = ro, define = yes;
900     DATA: load = RAM, type = rw, define = yes;
901     BSS: load = RAM, type = bss, define = yes;
902
903     ZEROPAGE: load = ZP, type = zp;
904     AUTOSTRT: load = RAM, type = ro;                    # defines program entry point
905 }
906 FEATURES {
907     CONDES: segment = ONCE,
908             type = constructor,
909             label = __CONSTRUCTOR_TABLE__,
910             count = __CONSTRUCTOR_COUNT__;
911     CONDES: segment = RODATA,
912             type = destructor,
913             label = __DESTRUCTOR_TABLE__,
914             count = __DESTRUCTOR_COUNT__;
915 }
916 </verb></tscreen>
917 <p>
918
919 A new memory area DISCARD was added.
920 It gets loaded with the contents of the (now unused) MAINHDR segment. But the
921 memory area isn't written to the output file. This way the contents of
922 the MAINHDR segment get discarded.
923 <p>
924 The newly added NEXEHDR segment defines the correct chunk header for the
925 first intended load chunk. It
926 puts the STARTUP, LOWCODE, ONCE, and CODE segments, which are the
927 segments containing only code, into load chunk #1 (RAMLO memory area).
928 <p>
929 The header for the second load chunk comes from the new CHKHDR
930 segment. It puts the RODATA, DATA, BSS, and ZPSAVE segments into load
931 chunk #2 (RAM memory area).
932 <p>
933 <p>
934 The contents of the new NEXEHDR and CHKHDR segments come from this
935 file (split.s):
936 <tscreen><verb>
937         .import __CODE_LOAD__, __BSS_LOAD__, __CODE_SIZE__
938         .import __DATA_LOAD__, __RODATA_LOAD__, __STARTUP_LOAD__
939
940         .segment "NEXEHDR"
941         .word    __STARTUP_LOAD__
942         .word    __CODE_LOAD__ + __CODE_SIZE__ - 1
943
944         .segment "CHKHDR"
945         .word    __RODATA_LOAD__
946         .word    __BSS_LOAD__ - 1
947 </verb></tscreen>
948 <p>
949 Compile with
950 <tscreen><verb>
951 cl65 -t atari -C split.cfg -o prog.com prog.c split.s
952 </verb></tscreen>
953
954 <sect2>Low data and high code example<p>
955
956
957 Goal: Put RODATA and DATA into low memory and STARTUP, LOWCODE, ONCE,
958 CODE, BSS, ZPSAVE into high memory (split2.cfg):
959
960 <tscreen><verb>
961 SYMBOLS {
962     __STACKSIZE__:       value = $800   type = weak;    # 2K stack
963     __RESERVED_MEMORY__: value = $0000, type = weak;
964 }
965 FEATURES {
966     STARTADDRESS: default = $2E00;
967 }
968 MEMORY {
969     ZP: start = $82, size = $7E, type = rw, define = yes;
970
971     HEADER: start = $0000, size = $2, file = %O;        # first load chunk
972
973     FSTHDR: start = $0000, size = $4, file = %O;        # second load chunk
974     RAMLO: start = %S, size = $4000 - %S, file = %O;
975
976     DISCARD: start = $4000, size = $4000, file = "";
977
978     SECHDR: start = $0000, size = $4, file = %O;        # second load chunk
979     RAM: start = $8000, size = $3C20, file = %O;        # $3C20: matches upper bound $BC1F
980 }
981 SEGMENTS {
982     EXEHDR: load = HEADER, type = ro;                     # discarded old EXE header
983
984     MAINHDR: load = DISCARD, type = ro;
985
986     NEXEHDR: load = FSTHDR, type = ro;                  # first load chunk
987     RODATA: load = RAMLO, type = ro, define = yes;
988     DATA: load = RAMLO, type = rw, define = yes;
989
990     CHKHDR: load = SECHDR, type = ro;                   # second load chunk
991     STARTUP: load = RAM, type = ro, define = yes;
992     ONCE: load = RAM, type = ro, optional = yes;
993     CODE: load = RAM, type = ro, define = yes;
994     BSS: load = RAM, type = bss, define = yes;
995
996     ZEROPAGE: load = ZP, type = zp;
997     AUTOSTRT: load = RAM, type = ro;                    # defines program entry point
998 }
999 FEATURES {
1000     CONDES: segment = ONCE,
1001             type = constructor,
1002             label = __CONSTRUCTOR_TABLE__,
1003             count = __CONSTRUCTOR_COUNT__;
1004     CONDES: segment = RODATA,
1005             type = destructor,
1006             label = __DESTRUCTOR_TABLE__,
1007             count = __DESTRUCTOR_COUNT__;
1008 }
1009 </verb></tscreen>
1010
1011 New contents for NEXEHDR and CHKHDR are needed (split2.s):
1012 <tscreen><verb>
1013         .import __STARTUP_LOAD__, __BSS_LOAD__, __DATA_SIZE__
1014         .import __DATA_LOAD__, __RODATA_LOAD__
1015
1016         .segment "NEXEHDR"
1017         .word    __RODATA_LOAD__
1018         .word    __DATA_LOAD__ + __DATA_SIZE__ - 1
1019
1020         .segment "CHKHDR"
1021         .word    __STARTUP_LOAD__
1022         .word    __BSS_LOAD__ - 1
1023 </verb></tscreen>
1024
1025 Compile with
1026 <tscreen><verb>
1027 cl65 -t atari -C split2.cfg -o prog.com prog.c split2.s
1028 </verb></tscreen>
1029
1030 <sect2>Final note<label id="memhole_final_note"><p>
1031
1032 There are two other memory areas which don't appear directly in the
1033 linker config file. They are the stack and the heap.
1034
1035 The cc65 runtime lib places the stack location at the end of available
1036 memory. This is dynamically set from the MEMTOP system variable at
1037 startup. The heap is located in the area between the end of the BSS
1038 segment and the top of the stack as defined by __STACKSIZE__.
1039
1040 If BSS and/or the stack shouldn't stay at the end of the program,
1041 some parts of the cc65 runtime lib need to be replaced/modified.
1042
1043 common/_heap.s defines the location of the heap and atari/crt0.s
1044 defines the location of the stack by initializing sp.
1045
1046
1047 <sect1>Upgrading from an older cc65 version<p>
1048
1049 If you are using a customized linker config file you might get some errors
1050 regarding the MAINHDR segment. Like this:
1051
1052 <tscreen><verb>
1053 ld65: Error: Missing memory area assignment for segment `MAINHDR'
1054 </verb></tscreen>
1055
1056 The old "HEADER" memory description contained six bytes: &dollar;FFFF
1057 and the first and last memory addess of the program. For the "system
1058 check" load chunk this had to be split into two memory assigments. The
1059 "HEADER" now only contains the &dollar;FFFF. The main program's first
1060 and last memory address were moved to a new segment, called "MAINHDR",
1061 which in the new linker config file goes into its own memory area (also
1062 called "MAINHDR").&nl;&nl;
1063 A simple way to adapt your old linker config file is to add the
1064 following line to the "SEGMENTS" section:
1065
1066 <tscreen><verb>
1067 MAINHDR: load = HEADER, type = ro;
1068 </verb></tscreen>
1069
1070
1071
1072 <sect1>Getting rid of the "system check" load chunk<label id="nosyschk"><p>
1073
1074 If, for some reason, you don't want to include the "system check" load
1075 chunk, you can do so by defining the symbol <tt/__SYSTEM_CHECK__/ when linking the
1076 program. The "system check" chunk doesn't include vital parts of the
1077 program. So if you don't want the system checks, it is save to leave them out.
1078 This is probably mostly interesting for debugging.
1079
1080 When using cl65, you can leave it out with this command line:
1081
1082 <tscreen><verb>
1083 cl65 -Wl -D__SYSTEM_CHECK__=1 <arguments>
1084 </verb></tscreen>
1085
1086 The value you assign to <tt/__SYSTEM_CHECK_/ doesn't matter. If the
1087 <tt/__SYSTEM_CHECK__/ symbol is defined, the load chunk won't be included.
1088
1089
1090 <sect>License<p>
1091
1092 This software is provided 'as-is', without any expressed or implied
1093 warranty.  In no event will the authors be held liable for any damages
1094 arising from the use of this software.
1095
1096 Permission is granted to anyone to use this software for any purpose,
1097 including commercial applications, and to alter it and redistribute it
1098 freely, subject to the following restrictions:
1099
1100 <enum>
1101 <item>  The origin of this software must not be misrepresented; you must not
1102         claim that you wrote the original software. If you use this software
1103         in a product, an acknowledgment in the product documentation would be
1104         appreciated but is not required.
1105 <item>  Altered source versions must be plainly marked as such, and must not
1106         be misrepresented as being the original software.
1107 <item>  This notice may not be removed or altered from any source
1108         distribution.
1109 </enum>
1110
1111 </article>