 |
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.