mirror of
https://github.com/fachat/xa65.git
synced 2024-06-26 08:29:29 +00:00
xa-2.3.9
This commit is contained in:
parent
c1fb2af9c2
commit
a98b3770ee
11
xa/ChangeLog
11
xa/ChangeLog
|
@ -324,3 +324,14 @@ xa-2.3.8
|
||||||
* Testsuite expanded.
|
* Testsuite expanded.
|
||||||
|
|
||||||
-- Cameron Kaiser <ckaiser@floodgap.com> 29 June 2017
|
-- Cameron Kaiser <ckaiser@floodgap.com> 29 June 2017
|
||||||
|
|
||||||
|
xa-2.3.9
|
||||||
|
|
||||||
|
* Fixed issue on Windows and DOS systems with the .bin pseudo-op (thanks
|
||||||
|
Bago Zonde).
|
||||||
|
* Documentation updated.
|
||||||
|
* Testsuite expanded.
|
||||||
|
* For the thirty year anniversary of xa, we're changing the name to xxxa.
|
||||||
|
(Just kidding.)
|
||||||
|
|
||||||
|
-- Cameron Kaiser <ckaiser@floodgap.com> 31 January 2019
|
||||||
|
|
|
@ -63,8 +63,7 @@ install: xa uncpk
|
||||||
#$(MKDIR) $(DOCDIR)/xa65
|
#$(MKDIR) $(DOCDIR)/xa65
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
#cd .. ; tar cvf xa-2.3.8A.tar xa-2.3.8 ; gzip xa-2.3.8A.tar
|
cd .. ; tar cvf xa-2.3.9.tar xa-2.3.9 ; gzip xa-2.3.9.tar
|
||||||
cd .. ; tar cvf xa-2.3.8.tar xa-2.3.8 ; gzip xa-2.3.8.tar
|
|
||||||
|
|
||||||
test: xa uncpk
|
test: xa uncpk
|
||||||
cd tests && ./harness -make="$(MAKE)" -cc="$(CC)" -cflags="$(CFLAGS)"
|
cd tests && ./harness -make="$(MAKE)" -cc="$(CC)" -cflags="$(CFLAGS)"
|
||||||
|
|
|
@ -3,7 +3,7 @@ derivatives). xa is a small, fast, portable two-pass assembler that compiles
|
||||||
under most ANSI C compilers. It is distributed under the GNU Public License
|
under most ANSI C compilers. It is distributed under the GNU Public License
|
||||||
(see COPYING).
|
(see COPYING).
|
||||||
|
|
||||||
The current version is 2.3.8, a bug fix to the long-lived 2.3.0, itself with
|
The current version is 2.3.9, a bug fix to the long-lived 2.3.0, itself with
|
||||||
compatibility improvements and new man-based documentation. It also completed
|
compatibility improvements and new man-based documentation. It also completed
|
||||||
the merge of the 65816 and 6502/R65C02 versions and thus the current xa can
|
the merge of the 65816 and 6502/R65C02 versions and thus the current xa can
|
||||||
generate code for all targets now.
|
generate code for all targets now.
|
||||||
|
|
138
xa/man/xa.1
138
xa/man/xa.1
|
@ -1,4 +1,4 @@
|
||||||
.TH XA "1" "29 June 2017"
|
.TH XA "1" "31 January 2019"
|
||||||
|
|
||||||
.SH NAME
|
.SH NAME
|
||||||
xa \- 6502/R65C02/65816 cross-assembler
|
xa \- 6502/R65C02/65816 cross-assembler
|
||||||
|
@ -10,8 +10,7 @@ xa \- 6502/R65C02/65816 cross-assembler
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B xa
|
.B xa
|
||||||
is a multi-pass cross-assembler for the 8-bit processors in the 6502 series
|
is a multi-pass cross-assembler for the 8-bit processors in the 6502 series
|
||||||
(such as
|
(such as the 6502, 65C02, 6504, 6507,
|
||||||
the 6502, 65C02, 6504, 6507,
|
|
||||||
6510, 7501, 8500, 8501 and 8502), the Rockwell R65C02, and
|
6510, 7501, 8500, 8501 and 8502), the Rockwell R65C02, and
|
||||||
the 16-bit 65816 processor. For a description of syntax, see
|
the 16-bit 65816 processor. For a description of syntax, see
|
||||||
.B ASSEMBLER SYNTAX
|
.B ASSEMBLER SYNTAX
|
||||||
|
@ -31,7 +30,7 @@ and
|
||||||
This option is now deprecated.
|
This option is now deprecated.
|
||||||
.TP
|
.TP
|
||||||
.B \-C
|
.B \-C
|
||||||
No CMOS opcodes (default is to allow R65C02 opcodes)
|
No CMOS opcodes (default is to allow R65C02 opcodes).
|
||||||
.TP
|
.TP
|
||||||
.B \-W
|
.B \-W
|
||||||
No 65816 opcodes (default).
|
No 65816 opcodes (default).
|
||||||
|
@ -228,6 +227,21 @@ for block instructions). A label may also be hard-specified with the
|
||||||
.B \-L
|
.B \-L
|
||||||
command line option.
|
command line option.
|
||||||
.LP
|
.LP
|
||||||
|
Redefining a label does not change previously assembled code that used the
|
||||||
|
earlier value. Therefore, because the program counter is a special type of
|
||||||
|
label, changing the program counter to a lower value does not reorder code
|
||||||
|
assembled previously and changing it to a higher value does not issue
|
||||||
|
padding to put subsequent code at the new location. This is intentional
|
||||||
|
behaviour to facilitate generating relocatable and position-independent code,
|
||||||
|
but can differ from other assemblers which use this behaviour for
|
||||||
|
linking. However, it is possible to use pseudo-ops to simulate other
|
||||||
|
assemblers' behaviour and use
|
||||||
|
.B xa
|
||||||
|
as a linker; see
|
||||||
|
.B PSEUDO-OPS
|
||||||
|
and
|
||||||
|
.BR LINKING .
|
||||||
|
.LP
|
||||||
For those instructions where the accumulator is the implied argument (such as
|
For those instructions where the accumulator is the implied argument (such as
|
||||||
.B asl
|
.B asl
|
||||||
and
|
and
|
||||||
|
@ -238,7 +252,7 @@ and
|
||||||
on R65C02; etc.), the idiom of explicitly specifying the accumulator with
|
on R65C02; etc.), the idiom of explicitly specifying the accumulator with
|
||||||
.B a
|
.B a
|
||||||
is unnecessary as the proper form will be selected if there is no explicit
|
is unnecessary as the proper form will be selected if there is no explicit
|
||||||
argument. In fact, for consistency with label handing, if there is a label
|
argument. In fact, for consistency with label handling, if there is a label
|
||||||
named
|
named
|
||||||
.BR a ,
|
.BR a ,
|
||||||
this will actually generate code referencing that label as a memory
|
this will actually generate code referencing that label as a memory
|
||||||
|
@ -464,7 +478,9 @@ repetitions of
|
||||||
will be inserted into the assembled object. For example,
|
will be inserted into the assembled object. For example,
|
||||||
.B .dsb 5,$10
|
.B .dsb 5,$10
|
||||||
will insert five bytes, each being 16 decimal, into the object. The arguments
|
will insert five bytes, each being 16 decimal, into the object. The arguments
|
||||||
may be expressions.
|
may be expressions. See
|
||||||
|
.B LINKING
|
||||||
|
for how to use this pseudo-op to link multiple objects.
|
||||||
.TP
|
.TP
|
||||||
.B .bin offset,length,"filename"
|
.B .bin offset,length,"filename"
|
||||||
Inlines a binary file without further interpretation specified by
|
Inlines a binary file without further interpretation specified by
|
||||||
|
@ -479,7 +495,9 @@ file's object. If
|
||||||
.B length
|
.B length
|
||||||
is zero, then the length of
|
is zero, then the length of
|
||||||
.BR filename ,
|
.BR filename ,
|
||||||
minus the offset, is used instead. The arguments may be expressions.
|
minus the offset, is used instead. The arguments may be expressions. See
|
||||||
|
.B LINKING
|
||||||
|
for how to use this pseudo-op to link multiple objects.
|
||||||
.TP
|
.TP
|
||||||
.B \&.(
|
.B \&.(
|
||||||
Opens a new block for scoping. Within a block, all labels defined are local to
|
Opens a new block for scoping. Within a block, all labels defined are local to
|
||||||
|
@ -757,6 +775,107 @@ you might use something like this in your library's code:
|
||||||
.br
|
.br
|
||||||
.B #endif
|
.B #endif
|
||||||
|
|
||||||
|
.SH LINKING
|
||||||
|
|
||||||
|
.B xa
|
||||||
|
is oriented towards generating sequential binaries. Code is strictly
|
||||||
|
emitted in order even if the program counter is set to a lower location
|
||||||
|
than previously assembled code, and padding is not automatically emitted
|
||||||
|
if the program counter is set to a higher location. Changing the program
|
||||||
|
location only changes new labels for code that is subsequently emitted;
|
||||||
|
previous emitted code remains unchanged. Fortunately, for many object files
|
||||||
|
these conventions have no effect on their generation.
|
||||||
|
.LP
|
||||||
|
However, some applications may require generating an object file built
|
||||||
|
from several previously generated components, and/or submodules which
|
||||||
|
may need to be present at specific memory locations. With a minor amount of
|
||||||
|
additional specification, it is possible to use
|
||||||
|
.B xa
|
||||||
|
for this purpose as well.
|
||||||
|
.LP
|
||||||
|
The first means of doing so uses the o65 format to make relocatable objects
|
||||||
|
that in turn can be linked by
|
||||||
|
.BR ldo65 (1)
|
||||||
|
(q.v.).
|
||||||
|
.LP
|
||||||
|
The second means involves either assembled code, or insertion of
|
||||||
|
previously built object or data files with
|
||||||
|
.BR .bin ,
|
||||||
|
using
|
||||||
|
.B .dsb
|
||||||
|
pseudo-ops with computed expression arguments to insert any necessary padding
|
||||||
|
between them, in the sequential order they are to reside in memory. Consider
|
||||||
|
this example:
|
||||||
|
.LP
|
||||||
|
|
||||||
|
.br
|
||||||
|
.word $1000
|
||||||
|
.br
|
||||||
|
* = $1000
|
||||||
|
.br
|
||||||
|
|
||||||
|
.br
|
||||||
|
; this is your code at $1000
|
||||||
|
.br
|
||||||
|
part1 rts
|
||||||
|
.br
|
||||||
|
; this label marks the end of code
|
||||||
|
.br
|
||||||
|
endofpart1
|
||||||
|
.br
|
||||||
|
|
||||||
|
.br
|
||||||
|
; DON'T PUT A NEW .word HERE!
|
||||||
|
.br
|
||||||
|
* = $2000
|
||||||
|
.br
|
||||||
|
.dsb (*-endofpart1), 0
|
||||||
|
.br
|
||||||
|
; yes, set it again
|
||||||
|
.br
|
||||||
|
* = $2000
|
||||||
|
.br
|
||||||
|
|
||||||
|
.br
|
||||||
|
; this is your code at $2000
|
||||||
|
.br
|
||||||
|
part2 rts
|
||||||
|
.br
|
||||||
|
.LP
|
||||||
|
This example, written for Commodore microcomputers using a 16-bit starting
|
||||||
|
address, has two "modules" in it: one block of code at $1000 (4096),
|
||||||
|
indicated by the code between labels
|
||||||
|
.B part1
|
||||||
|
and
|
||||||
|
.BR endofpart1 ,
|
||||||
|
and a second block at $2000 (8192) starting at label
|
||||||
|
.BR part2 .
|
||||||
|
.LP
|
||||||
|
The padding is computed by the
|
||||||
|
.B .dsb
|
||||||
|
pseudo-op between the two modules. Note that the program counter is set
|
||||||
|
to the new address and then a computed expression inserts the proper number
|
||||||
|
of fill bytes from the end of the assembled code in part 1 up to the new
|
||||||
|
program counter address. Since this itself advances the program counter,
|
||||||
|
the program counter is reset again, and assembly continues.
|
||||||
|
.LP
|
||||||
|
When the object this source file generates is loaded, there will be an
|
||||||
|
.B rts
|
||||||
|
instruction at address 4096 and another at address 8192, with null bytes
|
||||||
|
between them.
|
||||||
|
.LP
|
||||||
|
Should one of these areas need to contain a pre-built file, instead of
|
||||||
|
assembly code, simply use a
|
||||||
|
.B .bin
|
||||||
|
pseudo-op to load whatever portions of the file are required into the
|
||||||
|
output. The computation of addresses and number of necessary fill bytes
|
||||||
|
is done in the same fashion.
|
||||||
|
.LP
|
||||||
|
Although this example used the program counter itself to compute the
|
||||||
|
difference between addresses, you can use any label for this purpose,
|
||||||
|
keeping in mind that only the program counter determines where relative
|
||||||
|
addresses within assembled code are resolved.
|
||||||
|
|
||||||
.SH ENVIRONMENT
|
.SH ENVIRONMENT
|
||||||
|
|
||||||
.B xa
|
.B xa
|
||||||
|
@ -840,8 +959,11 @@ This manual page was written by David Weinehall <tao@acc.umu.se>,
|
||||||
Andre Fachat <fachat@web.de>
|
Andre Fachat <fachat@web.de>
|
||||||
and Cameron Kaiser <ckaiser@floodgap.com>.
|
and Cameron Kaiser <ckaiser@floodgap.com>.
|
||||||
Original xa package (C)1989-1997 Andre Fachat. Additional changes
|
Original xa package (C)1989-1997 Andre Fachat. Additional changes
|
||||||
(C)1989-2017 Andre Fachat, Jolse Maginnis, David Weinehall,
|
(C)1989-2019 Andre Fachat, Jolse Maginnis, David Weinehall,
|
||||||
Cameron Kaiser. The official maintainer is Cameron Kaiser.
|
Cameron Kaiser. The official maintainer is Cameron Kaiser.
|
||||||
|
|
||||||
|
.SH 30 YEARS OF XA
|
||||||
|
Yay us?
|
||||||
|
|
||||||
.SH WEBSITE
|
.SH WEBSITE
|
||||||
http://www.floodgap.com/retrotech/xa/
|
http://www.floodgap.com/retrotech/xa/
|
||||||
|
|
|
@ -55,9 +55,9 @@
|
||||||
#define ANZWARN 13
|
#define ANZWARN 13
|
||||||
|
|
||||||
#define programname "xa"
|
#define programname "xa"
|
||||||
#define progversion "v2.3.8"
|
#define progversion "v2.3.9"
|
||||||
#define authors "Written by Andre Fachat, Jolse Maginnis, David Weinehall and Cameron Kaiser"
|
#define authors "Written by Andre Fachat, Jolse Maginnis, David Weinehall and Cameron Kaiser"
|
||||||
#define copyright "Copyright (C) 1989-2017 Andre Fachat, Jolse Maginnis, David Weinehall\nand Cameron Kaiser."
|
#define copyright "Copyright (C) 1989-2019 Andre Fachat, Jolse Maginnis, David Weinehall\nand Cameron Kaiser."
|
||||||
|
|
||||||
/* exported globals */
|
/* exported globals */
|
||||||
int ncmos, cmosfl, w65816, n65816;
|
int ncmos, cmosfl, w65816, n65816;
|
||||||
|
@ -716,7 +716,7 @@ fprintf(stderr, "offset = %i length = %i fstart = %i flen = %i charo = %c\n",
|
||||||
fprintf(stderr, "fnam = %s\n", binfnam);
|
fprintf(stderr, "fnam = %s\n", binfnam);
|
||||||
*/
|
*/
|
||||||
/* primitive insurance */
|
/* primitive insurance */
|
||||||
if (!(foo = fopen(binfnam, "r"))) {
|
if (!(foo = fopen(binfnam, "rb"))) {
|
||||||
errout(E_FNF);
|
errout(E_FNF);
|
||||||
ner++;
|
ner++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -855,7 +855,7 @@ static void usage(int default816, FILE *fp)
|
||||||
" -G suppress list of exported globals\n");
|
" -G suppress list of exported globals\n");
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
" -DDEF=TEXT defines a preprocessor replacement\n"
|
" -DDEF=TEXT defines a preprocessor replacement\n"
|
||||||
" -Ocharset set output charset (PETSCII or ASCII), case-sensitive\n"
|
" -Ocharset set output charset (PETSCII, ASCII, etc.), case-sensitive\n"
|
||||||
" -Idir add directory `dir' to include path (before XAINPUT)\n"
|
" -Idir add directory `dir' to include path (before XAINPUT)\n"
|
||||||
" --version output version information and exit\n"
|
" --version output version information and exit\n"
|
||||||
" --help display this help and exit\n");
|
" --help display this help and exit\n");
|
||||||
|
|
|
@ -601,7 +601,7 @@ printf(" wrote %02x %02x %02x %02x %02x %02x\n",
|
||||||
"binclude1 offset = %i len = %i filename = %s endchar = %i\n",
|
"binclude1 offset = %i len = %i filename = %s endchar = %i\n",
|
||||||
offset, length, binfnam, i);
|
offset, length, binfnam, i);
|
||||||
#endif
|
#endif
|
||||||
if (!(foo = fopen(binfnam, "r"))) {
|
if (!(foo = fopen(binfnam, "rb"))) {
|
||||||
er = E_FNF;
|
er = E_FNF;
|
||||||
} else {
|
} else {
|
||||||
fseek(foo, 0, SEEK_END);
|
fseek(foo, 0, SEEK_END);
|
||||||
|
@ -1027,7 +1027,7 @@ int t_p2(signed char *t, int *ll, int fl, int *al)
|
||||||
"binclude2 offset = %i len = %i filename = %s endchar = %i\n",
|
"binclude2 offset = %i len = %i filename = %s endchar = %i\n",
|
||||||
offset, length, binfnam, i);
|
offset, length, binfnam, i);
|
||||||
#endif
|
#endif
|
||||||
if (!(foo = fopen(binfnam, "r"))) {
|
if (!(foo = fopen(binfnam, "rb"))) {
|
||||||
er = E_FNF;
|
er = E_FNF;
|
||||||
} else {
|
} else {
|
||||||
fseek(foo, 0, SEEK_END);
|
fseek(foo, 0, SEEK_END);
|
||||||
|
|
|
@ -36,6 +36,7 @@ op816/ Regression test for '816 opcodes (thanks Alessandro Gatti)
|
||||||
branch/ Branch range test
|
branch/ Branch range test
|
||||||
masmcom/ Another test for -M that generates totally valid code
|
masmcom/ Another test for -M that generates totally valid code
|
||||||
quotch/ Test quoting problematic characters (thanks Simon Rowe)
|
quotch/ Test quoting problematic characters (thanks Simon Rowe)
|
||||||
|
linkr/ Test linking using .dsb and generated code
|
||||||
|
|
||||||
Cameron Kaiser, André Fachat
|
Cameron Kaiser, André Fachat
|
||||||
|
|
||||||
|
|
BIN
xa/tests/linkr/ok
Normal file
BIN
xa/tests/linkr/ok
Normal file
Binary file not shown.
19
xa/tests/linkr/test.s
Normal file
19
xa/tests/linkr/test.s
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
; Actual example from man page
|
||||||
|
|
||||||
|
.word $1000
|
||||||
|
* = $1000
|
||||||
|
|
||||||
|
; this is your code at $1000
|
||||||
|
part1 rts
|
||||||
|
; this label marks the end of code
|
||||||
|
endofpart1
|
||||||
|
|
||||||
|
; DON'T PUT A NEW .word HERE!
|
||||||
|
* = $2000
|
||||||
|
.dsb (*-endofpart1), 0
|
||||||
|
; yes, set it again
|
||||||
|
* = $2000
|
||||||
|
|
||||||
|
; this is your code at $2000
|
||||||
|
part2 rts
|
||||||
|
|
Loading…
Reference in New Issue
Block a user