Currently, you can build VLIR applications only if your code is written in assembly -- no C code allowed.
In your sources, only the command .segment "
NAME"
will decide which code/data goes where. File-names don't matter. Segments
CODE
, RODATA
, DATA
, and BSS
go into VLIR part #0. Segment
VLIR1
goes into VLIR part #1, VLIR2
goes into VLIR part #2, and so
on.
The GEOS resource file's contents are similar to
the sequential-file example, but there also is a
VLIR
section and a structure VLIR
tag. Here is that part:
VLIR vlir-head.bin 0x3000 {
vlir-0.bin ; CODE, RODATA, DATA, BSS
vlir-1.bin ; VLIR1
vlir-2.bin ; VLIR2
}
(Source files are only .s
.)
OK, we have "cvthead.grc
", so let's allow grc to compile
it:
$ grc cvthead.grcNow, there are two new files: "
cvthead.cfg
" and
"cvthead.s
" -- the first one is a config. file for ld65,
and the second one contains the GEOS .cvt
header. It can be assembled:
$ ca65 -t geos cvthead.sNow, we have "
cvthead.o
". The rest of the assembly
sources can be assembled:
$ ca65 -t geos vlir0.s $ ca65 -t geos vlir1.s $ ca65 -t geos vlir2.sNote that the file-names here, although similar to those from the
VLIR
section of the .grc
file, are not significant. The only thing
that matters is which code will go into which segment.
Now, we can generate binaries. This time, the order of the arguments on the command-line is not important.
$ ld65 -C cvthead.cfg vlir1.o cvthead.o vlir0.o vlir2.oAs defined in the
.grc
file, we now have the binary parts of the
VLIR file: "vlir-head.bin
", "vlir-0.bin
",
"vlir-1.bin
", and "vlir-2.bin
".
The last step is to put them together in the right order -- the order of the
arguments is important this time! As suggested in the comments at the end
of "cvthead.cfg
", we do:
$ grc -vlir output.cvt vlir-head.bin vlir-0.bin vlir-1.bin vlir-2.binThat is the end. The file "
output.cvt
" can be
deconverted under GEOS. Note that -C cvthead.cfg
was used on the
ld65 command-line instead of the switch -t geos
.