Sometimes it is necessary to port code written for older assemblers to ca65.
In some cases, this can be done without any changes to the source code by
using the emulation features of ca65 (see
.FEATURE
). In other cases, it is necessary to make changes to the
source code.
Probably the biggest difference is the handling of the
.ORG
directive. ca65 generates relocatable code, and placement is
done by the linker. Most other assemblers generate absolute code, placement is
done within the assembler and there is no external linker.
In general it is not a good idea to write new code using the emulation features of the assembler, but there may be situations where even this rule is not valid.
You need to use some of the ca65 emulation features to simulate the behaviour of such simple assemblers.
; if you want TASS style labels without colons
.feature labels_without_colons
; if you want TASS style character constants
; ("a" instead of the default 'a')
.feature loose_char_term
.word *+2 ; the cbm load address
[yourcode here]
notice that the two emulation features are mostly useful for porting
sources originally written in/for TASS, they are not needed for the
actual "simple assembler operation" and are not recommended if you are
writing new code from scratch.
.RES
directive.
; *=$2000
.res $2000-* ; reserve memory up to $2000
Please note that other than the original TASS, ca65 can never move the program
counter backwards - think of it as if you are assembling to disk with TASS.
.ifeq
/.endif
/.goto
etc.) must be
rewritten to match ca65 syntax. Most importantly notice that due to the lack
of .goto
, everything involving loops must be replaced by
.REPEAT
.
.ORG
directive instead of
.offs
-constructs.
.org $1800
[floppy code here]
.reloc ; back to normal
cl65 --start-addr 0x0ffe -t none myprog.s -o myprog.prg
Note that you need to use the actual start address minus two, since two bytes
are used for the cbm load address.