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