 |
The Small Code/Data model |
Version 2.4 implements a rudimentary small code/data model.
It consists of converting any data reference to one of the following
three addressing modes:
-
address register indirect with displacement using a
specified address register, defaulting to
A4
(for references to the DATA
or BSS
section);
-
program counter indirect with displacement
(for references to the
CODE
section);
-
absolute word
(for absolute and 16-bit relocatable values).
These conversions do not take place unless a NEAR
directive is
encountered. The NEAR
directive can take one operand, which
must be either an address register or a symbol which has been
equated (using EQUR
) to an address register. Register A7
(SP
)
may not be used. If no register is given, A4
is assumed.
Conversion is done for all operands until a FAR
directive
is encountered. NEAR
and FAR
directives can occur any number
of times, enabling conversion to be turned on and off at will.
Backward references which cannot be converted (e.g. external
labels declared as XREF
) will remain as absolute long addressing.
All forward references are assumed to be convertible, since during
pass 1 A68k
has no way of telling whether conversion is possible.
If conversion turns out to be impossible, invalid object code will
be generated - an error message ("Invalid forward reference") will
indicate when this occurs.
Although the small code/data model can greatly reduce the
size of assembled programs, several restrictions apply:
I'll be the first to admit that this is a very crude and ugly
implementation. I hope to improve it in future versions.