Millfork: a middle-level programming language targeting 6502- and Z80-based microcomputers and home consoles
This project is maintained by KarolS
If you’re creating a prg file and your main
function may be located at address $2710 hex (10000 decimal) or higher,
you might need to define the DISPLACED_MAIN=1
preprocessor feature.
A multifile program is a program stored on a disk that consists of the main program file that is executed first and several other files that can be loaded into memory on demand. This allows for creating programs that are larger than 64 kilobytes.
Millfork allows building such programs, but leaves several things to the programmer:
tracking of which parts of the program are currently loaded and which are not
whether memory ranges of various parts overlap or not
whether loading succeeded or not
You will need to create a platform definition file with multiple segments. The default segment should start at $80D. Example:
segments=default,extra
; the first file will contain the initial code:
default_code_segment=default
segment_default_start=$80D
segment_default_codeend=$7fff
segment_default_datastart=after_code
segment_default_end=$7fff
; the second file will contain the extra code:
segment_extra_start=$8000
segment_extra_codeend=$9fff
segment_extra_datastart=after_code
segment_extra_end=$cfff
You also need to set style=per_segment
in the [output]
section.
Annotate things you want to place in that file with the segment
keyword:
segment(extra)
void extra_function () {
//
}
Then in your code you need to load the file:
load_file(last_used_device(), "eee"z)
if errno == err_ok {
extra_function()
} else {
// handle error
}
(Prefer last_used_device()
instead of hardcoded 8
, so your program will work when loaded from any disk drive.)
Compiling the program with -o OUTPUT
will yield several PRG files.
The default segment will be in OUTPUT.prg
, the segment called extra
in OUTPUT.extra.prg
and so on.
The Millfork compiler does not create Commodore disk images.
You can use a variety of tools to perform that task,
for example the c1541
tool shipped with the VICE emulator.
To create a new disk image for the last example, use:
c1541 -format "example,01" d64 example.d64 -write OUTPUT.prg start -write OUTPUT.extra.prg eee