]> git.sur5r.net Git - cc65/blobdiff - doc/c64.sgml
'--no-std-lib' was renamed to '--no-target-lib'
[cc65] / doc / c64.sgml
index 3d042d220dabf2763c2cbcc8b778a517dfa47df1..328a77ab6ace6ba69b6efd6edee50e14d0876c23 100644 (file)
@@ -1,10 +1,9 @@
 <!doctype linuxdoc system>
 
 <article>
-
-<title>Commodore 64 specific information for cc65
-<author>Ullrich von Bassewitz, <htmlurl url="mailto:uz@cc65.org" name="uz@cc65.org">
-<date>2003-09-23
+<title>Commodore 64-specific information for cc65
+<author><url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz"><newline>
+<url url="mailto:greg.king5@verizon.net" name="Greg King">
 
 <abstract>
 An overview over the C64 runtime system as it is implemented for the cc65 C
@@ -19,11 +18,11 @@ compiler.
 <sect>Overview<p>
 
 This file contains an overview of the C64 runtime system as it comes with the
-cc65 C compiler. It describes the memory layout, C64 specific header files,
+cc65 C compiler. It describes the memory layout, C64-specific header files,
 available drivers, and any pitfalls specific to that platform.
 
-Please note that C64 specific functions are just mentioned here, they are
-described in detail in the separate <htmlurl url="funcref.html" name="function
+Please note that C64-specific functions are just mentioned 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.
@@ -32,10 +31,10 @@ information.
 <sect>Binary format<p>
 
 The standard binary output format generated by the linker for the C64 target
-is a machine language program with a one line BASIC stub. This means that a
-program can be loaded as BASIC program and started with RUN. It is of course
-possible to change this behaviour by using a modified startup file and linker
-config.
+is a machine language program with a one line BASIC stub, which calls the
+machine language part via SYS. This means that a program can be loaded as
+BASIC program and started with RUN. It is of course possible to change this
+behaviour by using a modified startup file and linker config.
 
 
 <sect>Memory layout<p>
@@ -63,18 +62,104 @@ Special locations:
 </descrip><p>
 
 
+<sect>Linker configurations<p>
+
+The ld65 linker comes with a default config file for the Commodore&nbsp;64,
+which is used via <tt/-t c64/. The
+c64 package comes with additional secondary linker config files, which are
+used via <tt/-t c64 -C &lt;configfile&gt;/.
+
+
+<sect1>default config file (<tt/c64.cfg/)<p>
+
+The default configuration is tailored to C programs. It supplies the load
+address and a small BASIC stub that starts the compiled program using a SYS
+command.
+
+
+<sect1><tt/c64-asm.cfg/<p>
+
+This configuration is made for assembler programmers who don't need a special
+setup. The default start address is &dollar;801. It can be changed with the
+linker command line option <tt/--start-addr/. All standard segments with the
+exception of <tt/zeropage/ are written to the output file and a two byte load
+address is prepended.
+
+To use this config file, assemble with <tt/-t c64/ and link with <tt/-C
+c64-asm.cfg/. The former will make sure that correct character translation is
+in effect, while the latter supplies the actual config. When using <tt/cl65/,
+use both command line options.
+
+Sample command line for <tt/cl65/:
 
-<sect>Platform specific header files<p>
+<tscreen><verb>
+cl65 -o file.prg -t c64 -C c64-asm.cfg source.s
+</verb></tscreen>
+
+To generate code that loads to &dollar;C000:
+
+<tscreen><verb>
+cl65 -o file.prg --start-addr $C000 -t c64 -C c64-asm.cfg source.s
+</verb></tscreen>
+
+It is also possible to add a small BASIC header to the program, that uses SYS
+to jump to the program entry point (which is the start of the code segment).
+The advantage is that the program can be started using RUN.
+
+To generate a program with a BASIC SYS header, use
 
-Programs containing C64 specific code may use the <tt/c64.h/ or <tt/cbm.h/
+<tscreen><verb>
+cl65 -o file.prg -u __EXEHDR__ -t c64 -C c64-asm.cfg source.s
+</verb></tscreen>
+
+Please note that in this case a changed start address doesn't make sense,
+since the program must be loaded to the BASIC start address.
+
+<sect>Extras<p>
+
+<sect1>80 Columns conio driver<p>
+
+The C64 package comes with an alternative software driven 80 columns
+module <tt/c64-soft80.o/ which uses the memory under I/O between &dollar;D000
+and &dollar;FF3F.
+
+In memory constrained situations the memory from &dollar;400 to &dollar;7FF
+can be made available to a program by calling <tt/_heapadd ((void *) 0x0400, 0x0400);/
+at the beginning of <tt/main()/. Doing so is beneficial even if the program
+doesn't use the the heap explicitly because loading a driver uses the heap implicitly.
+
+Using <tt/c64-soft80.o/ is as simple as placing it on the linker command
+line like this:
+
+<tscreen><verb>
+cl65 -t c64 myprog.c c64-soft80.o
+</verb></tscreen>
+
+Note that the soft80 conio driver is incompatible with the
+<tt/c64-ram.emd (c64_ram_emd)/ extended memory driver and the
+ <tt/c64-hi.tgi (c64_hi_tgi)/ graphics driver.
+
+<sect2>80 Columns conio driver (monochrome)<p>
+
+In an (even more) memory constrained situation, a size optimized version of the
+software driven 80 columns module may be used, which only supports one common
+text color for the whole screen.
+
+<tscreen><verb>
+cl65 -t c64 myprog.c c64-soft80mono.o
+</verb></tscreen>
+
+<sect>Platform-specific header files<p>
+
+Programs containing C64-specific code may use the <tt/c64.h/ or <tt/cbm.h/
 header files. Using the later may be an option when writing code for more than
 one CBM platform, since it includes <tt/c64.h/ and declares several functions
 common to all CBM platforms.
 
 
-<sect1>C64 specific functions<p>
+<sect1>C64-specific functions<p>
 
-The functions listed below are special for the C64. See the <htmlurl
+The functions listed below are special for the C64. See the <url
 url="funcref.html" name="function reference"> for declaration and usage.
 
 <itemize>
@@ -82,10 +167,37 @@ url="funcref.html" name="function reference"> for declaration and usage.
 </itemize>
 
 
-<sect1>CBM specific functions<p>
+<sect1>C64-specific accelerator functions<p>
+
+The functions listed below are accelerator functions for the C64. See the <url
+url="funcref.html" name="function reference"> for declaration and usage.
+
+<itemize>
+<item>detect_c128
+<item>detect_c64dtv
+<item>detect_c65
+<item>detect_chameleon
+<item>detect_scpu
+<item>detect_turbomaster
+<item>get_c128_speed
+<item>get_c64dtv_speed
+<item>get_c65_speed
+<item>get_chameleon_speed
+<item>get_scpu_speed
+<item>get_turbomaster_speed
+<item>set_c128_speed
+<item>set_c64dtv_speed
+<item>set_c65_speed
+<item>set_chameleon_speed
+<item>set_scpu_speed
+<item>set_turbomaster_speed
+</itemize>
+
+
+<sect1>CBM-specific functions<p>
 
 Some functions are available for all (or at least most) of the Commodore
-machines. See the <htmlurl url="funcref.html" name="function reference"> for
+machines. See the <url url="funcref.html" name="function reference"> for
 declaration and usage.
 
 <itemize>
@@ -103,6 +215,8 @@ declaration and usage.
 <item>cbm_k_basin
 <item>cbm_k_bsout
 <item>cbm_k_clrch
+<item>cbm_k_tksa
+<item>cbm_k_second
 <item>cbm_load
 <item>cbm_open
 <item>cbm_opendir
@@ -133,9 +247,9 @@ structures, accessing the struct fields will access the chip registers.
   for the declaration of the structure.
 
   <tag><tt/CIA1, CIA2/</tag>
-  Access to the two CIA (complex interface adapater) chips is available via
+  Access to the two CIA (complex interface adapter) chips is available via
   the <tt/CIA1/ and <tt/CIA2/ variables. The structure behind these variables
-  is explained in <tt/_cia.h/.
+  is explained in <tt/_6526.h/.
 
   <tag><tt/COLOR_RAM/</tag>
   A character array that mirrors the color RAM of the C64 at &dollar;D800.
@@ -146,92 +260,155 @@ structures, accessing the struct fields will access the chip registers.
 
 <sect>Loadable drivers<p>
 
+The names in the parentheses denote the symbols to be used for static linking of the drivers.
+
+
+<label id="graphics-drivers">
 <sect1>Graphics drivers<p>
 
 <em>Note:</em> All available graphics drivers for the TGI interface will use
-the space below the I/O area and kernal ROM, so you can have hires graphics in
-the standard setup without any memory loss or need for a changed
-configuration.
+the space below the I/O area and Kernal ROM; so, you can have hires graphics in
+the standard setup without any memory loss or need for a changed configuration.
+
+You can use a mouse driver at the same time that you use a TGI driver.  But, if
+you want to see the default mouse pointer on the graphics screen, then you
+explicitly must link a special object file into your program.  It will put the
+arrow into the "high RAM" area where the bitmaps are put.  Its name is
+"<tt/c64-tgimousedata.o/".  Example:
+
+<tscreen><verb>
+cl65 -t c64 -o program-file main-code.c subroutines.s c64-tgimousedata.o
+</verb></tscreen>
 
 <descrip>
-  <tag><tt/c64-hi.tgi/</tag>
+  <tag><tt/c64-hi.tgi (c64_hi_tgi)/</tag>
   This driver features a resolution of 320*200 with two colors and an
-  adjustable palette (that means that the two colors can be choosen out of a
+  adjustable palette (that means that the two colors can be chosen out of a
   palette of the 16 C64 colors).
 </descrip><p>
 
+Note that the graphics drivers are incompatible with the
+<tt/c64-ram.emd (c64_ram_emd)/ extended memory driver and the
+ <tt/c64-soft80.o/ software 80-columns conio driver.
+
 
 <sect1>Extended memory drivers<p>
 
 <descrip>
 
-  <tag><tt/c64-georam.emd/</tag>
-  A driver for the GeoRam cartridge. The driver will always assume 2048 pages
-  of 256 bytes each. There are no checks, so if your program knows better,
-  just go ahead.
+  <tag><tt/c64-65816.emd (c64_65816_emd)/</tag>
+  Extended memory driver for 65816 (eg SCPU) based extra RAM.
+  Written and contributed by Marco van den Heuvel.
+
+  <tag><tt/c64-c256k.emd (c64_c256k_emd)/</tag>
+  A driver for the C64 256K memory expansion. This driver offers 768 pages of
+  256 bytes each. Written and contributed by Marco van den Heuvel.
+
+  <tag><tt/c64-dqbb.emd (c64_dqbb_emd)/</tag>
+  A driver for the Double Quick Brown Box cartridge. This driver offers
+  64 pages of 256 bytes each. Written and contributed by Marco van den Heuvel.
+
+  <tag><tt/c64-georam.emd (c64_georam_emd)/</tag>
+  A driver for the Berkeley Softworks GeoRam cartridge. The driver will
+  determine the available RAM from the connected cartridge. It supports 64KB
+  up to 2048KB of RAM.
 
-  <tag><tt/c64-ram.emd/</tag>
-  A driver for the hidden RAM below the I/O area and kernal ROM. Supports 48
+  <tag><tt/c64-isepic.emd (c64_isepic_emd)/</tag>
+  A driver for the ISEPIC cartridge. This driver offers just 8 pages of 256
+  bytes each. Written and contributed by Marco van den Heuvel.
+
+  <tag><tt/c64-ram.emd (c64_ram_emd)/</tag>
+  A driver for the hidden RAM below the I/O area and kernal ROM. Supports 47
   256 byte pages. Please note that this driver is incompatible with any of the
-  graphics drivers!
+  graphics drivers, or the soft80 conio driver!
+
+  <tag><tt/c64-ramcart.emd (c64_ramcart_emd)/</tag>
+  A driver for the RamCart 64/128 written and contributed by Maciej Witkowiak.
+  Will test the hardware for the available RAM.
 
-  <tag><tt/c64-ramcart.emd/</tag>
-  A driver for the RamCart 64/128. Will test the hardware for the available
-  RAM.
+  <tag><tt/c64-reu.emd (c64_reu_emd)/</tag>
+  A driver for the CBM REUs. The driver will test the connected REU to find
+  out how much RAM is present.
 
-  <tag><tt/c64-reu.emd/</tag>
-  A driver for the CBM REUs. The driver will determine from the connected REU
-  if it supports 128KB of RAM or more. In the latter case, 256KB are assumed,
-  but since there are no range checks, the application can use more memory if
-  it has better knowledge about the hardware than the driver.
+  <tag><tt/c64-vdc.emd (c64_vdc_emd)/</tag>
+  A driver for the VDC memory of the C128. Written and contributed by Maciej
+  Witkowiak. Can be used if the program is running in C64 mode of the C128.
+  Autodetects the amount of memory available (16 or 64K) and offers 64 or 256
+  pages of 256 bytes each.
 
-  <tag><tt/c64-vdc.emd/</tag>
-  A driver for the VDC memory of the C128. Can be used if the program is
-  running in C64 mode of the C128. Autodetects the amount of memory available
-  (16 or 64K) and offers 64 or 256 pages of 256 bytes each.
+  <tag><tt/dtv-himem.emd (dtv_himem_emd)/</tag>
+  A driver for the C64 D2TV (the second or PAL version). This driver offers
+  indeed 7680 pages of 256 bytes each.
 
 </descrip><p>
 
 
 <sect1>Joystick drivers<p>
 
+The default drivers, <tt/joy_stddrv (joy_static_stddrv)/, point to <tt/c64-stdjoy.joy (c64_stdjoy_joy)/.
+
 <descrip>
 
-  <tag><tt/c64-hitjoy.joy/</tag>
-  Driver for the Digital Excess & Hitmen adapter. See
-  <htmlurl url="http://www.digitalexcess.de/downloads/productions.php"
-  name="http://www.digitalexcess.de/downloads/productions.php"> on
+  <tag><tt/c64-hitjoy.joy (c64_hitjoy_joy)/</tag>
+  Driver for the Digital Excess &amp; Hitmen adapter contributed by Groepaz.
+  See <url url="http://www.digitalexcess.de/downloads/productions.php"> on
   instructions how to build one. Up to four joysticks are supported.
 
-  <tag><tt/c64-ptvjoy.joy/</tag>
-  Driver for the Protovision 4-player adapter. See
-  <htmlurl url="http://www.protovision-online.de/hardw/hardwstart.htm"
-  name="http://www.protovision-online.de/hardw/hardwstart.htm"> for prices
-  and building instructions. Up to four joysticks are supported.
+  <tag><tt/c64-ptvjoy.joy (c64_ptvjoy_joy)/</tag>
+  Driver for the Protovision 4-player adapter contributed by Groepaz. See
+  <url url="http://www.protovision-online.de/hardw/4_player.php?language=en"
+  name="Protovision shop"> for prices and building instructions. Up to four
+  joysticks are supported.
 
-  <tag><tt/c64-stdjoy.joy/</tag>
+  <tag><tt/c64-stdjoy.joy (c64_stdjoy_joy)/</tag>
   Supports up to two standard joysticks connected to the joysticks port of
   the C64.
 
-</descrip><p>
+  <tag><tt/c64-numpad.joy (c64_numpad_joy)/</tag>
+  Supports one joystick emulated by the numberpad of the C128 in C64 mode,
+  the firebutton is labeled &dquot;5&dquot; and ENTER.
 
+</descrip><p>
 
 
 <sect1>Mouse drivers<p>
 
-Currently no drivers available (in fact, the API for loadable mouse drivers
-does not exist).
+You can use these drivers in text-mode or graphics-mode (TGI) programs.  See
+the description of <ref id="graphics-drivers" name="the graphics drivers">.
+
+The default drivers, <tt/mouse_stddrv (mouse_static_stddrv)/, point to <tt/c64-1351.mou (c64_1351_mou)/.
+
+<descrip>
+
+  <tag><tt/c64-1351.mou (c64_1351_mou)/</tag>
+  Supports a standard mouse connected to port #0 of the C64.
+
+  <tag><tt/c64-inkwell.mou (c64_inkwell_mou)/</tag>
+  Supports the Inkwell Systems lightpens, connected to port #0 of the C64.
+  It can read both the one-button 170-C and the two-button 184-C pens.  (It can
+  read other lightpens and light-guns that send their button signal to the
+  joystick left-button pin or the paddle Y [up/down] pin.)
+
+  <tag><tt/c64-joy.mou (c64_joy_mou)/</tag>
+  Supports a mouse emulated by a standard joystick, e.g. 1350 mouse, in port
+  #1 of the C64.
+
+  <tag><tt/c64-pot.mou (c64_pot_mou)/</tag>
+  Supports a potentiometer device, e.g. Koala Pad, connected to port #1 of
+  the C64.
+
+</descrip><p>
 
 
 <sect1>RS232 device drivers<p>
 
 <descrip>
 
-  <tag><tt/c64-swlink.ser/</tag>
-  Driver for the SwiftLink cartridge. Supports up to 38400 baud, hardware flow
-  control (RTS/CTS) and interrupt driven receives. Note that because of the
-  peculiarities of the 6551 chip together with the use of the NMI, transmits
-  are not interrupt driven, and the transceiver blocks if the receiver asserts
+  <tag><tt/c64-swlink.ser (c64_swlink_ser)/</tag>
+  Driver for the SwiftLink cartridge. Supports up to 38400 BPS, hardware flow
+  control (RTS/CTS), and interrupt-driven receives. Note that, because of the
+  peculiarities of the 6551 chip, together with the use of the NMI, transmits
+  are not interrupt driven; and, the transceiver blocks if the receiver asserts
   flow control because of a full buffer.
 
 </descrip><p>
@@ -244,31 +421,45 @@ does not exist).
 
 <sect>Other hints<p>
 
+
+<sect1>Escape code<p>
+
+For an Esc, press CTRL and the <tt/[/ key.
+
+
 <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()/. Since this is not
+supported directly by BASIC, the following syntax was chosen:
 
 <tscreen><verb>
-    RUN:REM,ARG1," ARG2", ARG 3,, ARG5, ...
+    RUN:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
 </verb></tscreen>
 
 <enum>
-<item>Arguments are separated by commas.
-<item>There must be a comma after the first <tt/REM/.
-<item>Leading spaces are ignored; trailing spaces are included unless the
-      argument was quoted.
-<item>The first argument passed to <tt/main/ is the program name.
+<item>Arguments are separated by spaces.
+<item>Arguments may be quoted.
+<item>Leading and trailing spaces around an argument are ignored. Spaces within
+      a quoted argument are allowed.
+<item>The first argument passed to <tt/main()/ is the program name.
+<item>A maximum number of 10 arguments (including the program name) are
+      supported.
 </enum>
 
 
+<sect1>Program return code<p>
+
+The program return code (low byte) is passed back to BASIC by use of the
+<tt/ST/ variable.
 
-<sect>Bugs/Feedback<p>
 
-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">).
+<sect1>Interrupts<p>
+
+The runtime for the C64 uses routines marked as <tt/.INTERRUPTOR/ for
+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">.
 
 
 
@@ -294,6 +485,3 @@ freely, subject to the following restrictions:
 </enum>
 
 </article>
-
-
-