mirror of
https://github.com/cc65/cc65.git
synced 2024-12-28 22:30:12 +00:00
500 lines
16 KiB
Plaintext
500 lines
16 KiB
Plaintext
<!doctype linuxdoc system>
|
|
|
|
<article>
|
|
<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
|
|
compiler.
|
|
</abstract>
|
|
|
|
<!-- Table of contents -->
|
|
<toc>
|
|
|
|
<!-- Begin the document -->
|
|
|
|
<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,
|
|
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 <url url="funcref.html" name="function
|
|
reference">. Even functions marked as "platform dependent" may be available on
|
|
more than one platform. Please see the function reference for more
|
|
information.
|
|
|
|
|
|
<sect>Binary format<p>
|
|
|
|
The standard binary output format generated by the linker for the C64 target
|
|
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>
|
|
|
|
cc65 generated programs with the default setup run with the I/O area and the
|
|
kernal ROM enabled (memory under the kernal may be used for graphics or as
|
|
extended memory - see the sections about graphics and extended memory
|
|
drivers). The BASIC ROM is disabled, which gives a usable memory range of
|
|
$0800 - $CFFF. This means that kernal entry points may be called
|
|
directly, but using the BASIC ROM is not possible without additional code.
|
|
|
|
Special locations:
|
|
|
|
<descrip>
|
|
<tag/Text screen/
|
|
The text screen is located at $400 (as in the standard setup).
|
|
|
|
<tag/Stack/
|
|
The C runtime stack is located at $CFFF and growing downwards.
|
|
|
|
<tag/Heap/
|
|
The C heap is located at the end of the program and grows towards the C
|
|
runtime stack.
|
|
|
|
</descrip><p>
|
|
|
|
|
|
<sect>Linker configurations<p>
|
|
|
|
The ld65 linker comes with a default config file for the Commodore 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 <configfile>/.
|
|
|
|
|
|
<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 $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/:
|
|
|
|
<tscreen><verb>
|
|
cl65 -o file.prg -t c64 -C c64-asm.cfg source.s
|
|
</verb></tscreen>
|
|
|
|
To generate code that loads to $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
|
|
|
|
<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 $D000
|
|
and $FF3F.
|
|
|
|
In memory constrained situations the memory from $400 to $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>
|
|
|
|
The functions listed below are special for the C64. See the <url
|
|
url="funcref.html" name="function reference"> for declaration and usage.
|
|
|
|
<itemize>
|
|
<item>get_ostype
|
|
</itemize>
|
|
|
|
|
|
<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 <url url="funcref.html" name="function reference"> for
|
|
declaration and usage.
|
|
|
|
<itemize>
|
|
<item>cbm_close
|
|
<item>cbm_closedir
|
|
<item>cbm_k_setlfs
|
|
<item>cbm_k_setnam
|
|
<item>cbm_k_load
|
|
<item>cbm_k_save
|
|
<item>cbm_k_open
|
|
<item>cbm_k_close
|
|
<item>cbm_k_readst
|
|
<item>cbm_k_chkin
|
|
<item>cbm_k_ckout
|
|
<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
|
|
<item>cbm_read
|
|
<item>cbm_readdir
|
|
<item>cbm_save
|
|
<item>cbm_write
|
|
<item>get_tv
|
|
<item>waitvsync
|
|
</itemize>
|
|
|
|
|
|
<sect1>Hardware access<p>
|
|
|
|
The following pseudo variables declared in the <tt/c64.h/ header file do allow
|
|
access to hardware located in the address space. Some variables are
|
|
structures, accessing the struct fields will access the chip registers.
|
|
|
|
<descrip>
|
|
|
|
<tag><tt/VIC/</tag>
|
|
The <tt/VIC/ structure allows access to the VIC II (the graphics
|
|
controller). See the <tt/_vic2.h/ header file located in the include
|
|
directory for the declaration of the structure.
|
|
|
|
<tag><tt/SID/</tag>
|
|
The <tt/SID/ structure allows access to the SID (the sound interface
|
|
device). See the <tt/_sid.h/ header file located in the include directory
|
|
for the declaration of the structure.
|
|
|
|
<tag><tt/CIA1, CIA2/</tag>
|
|
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/_6526.h/.
|
|
|
|
<tag><tt/COLOR_RAM/</tag>
|
|
A character array that mirrors the color RAM of the C64 at $D800.
|
|
|
|
</descrip><p>
|
|
|
|
|
|
|
|
<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.
|
|
|
|
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 (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 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-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-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-kerberos.emd (c64_kerberos_emd)/</tag>
|
|
A driver for the Kerberos MIDI Cartridge. The cartridge has 512
|
|
pages of 256 bytes for a total of 128KB.
|
|
|
|
<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, 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-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-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/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 (c64_hitjoy_joy)/</tag>
|
|
Driver for the Digital Excess & 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 (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 (c64_stdjoy_joy)/</tag>
|
|
Supports up to two standard joysticks connected to the joysticks port of
|
|
the C64.
|
|
|
|
<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>
|
|
|
|
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 (c64_swlink_ser)/</tag>
|
|
Driver for the SwiftLink cartridge. Supports up to 38400 baud, requires hardware
|
|
flow control (RTS/CTS) and does 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>
|
|
|
|
|
|
|
|
<sect>Limitations<p>
|
|
|
|
|
|
<sect1>Realtime clock<p>
|
|
|
|
The realtime clock functions use the CIA1 TOD clock. As that clock only stores
|
|
the time but not the date, the date set by <tt/clock_settime()/ is simply stored
|
|
inside the C library for retrieval in the same program via <tt/clock_gettime()/.
|
|
|
|
|
|
|
|
<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 directly by BASIC, the following syntax was chosen:
|
|
|
|
<tscreen><verb>
|
|
RUN:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
|
|
</verb></tscreen>
|
|
|
|
<enum>
|
|
<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.
|
|
|
|
|
|
<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">.
|
|
|
|
|
|
|
|
<sect>License<p>
|
|
|
|
This software is provided 'as-is', without any expressed or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
<enum>
|
|
<item> The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
<item> Altered source versions must be plainly marked as such, and must not
|
|
be misrepresented as being the original software.
|
|
<item> This notice may not be removed or altered from any source
|
|
distribution.
|
|
</enum>
|
|
|
|
</article>
|