--- Begin Message ---
Package: xa
Version: 2.3.8-2
Severity: normal
Tags: patch pending
Dear maintainer,
I've prepared an NMU for xa (versioned as 2.3.11-0.1) and
uploaded it to the archive.
Regards,
Stephen
diff -Nru xa-2.3.8/ChangeLog xa-2.3.11/ChangeLog
--- xa-2.3.8/ChangeLog 2017-06-30 07:01:10.000000000 +0200
+++ xa-2.3.11/ChangeLog 2020-05-03 23:06:29.000000000 +0200
@@ -324,3 +324,42 @@
* Testsuite expanded.
-- Cameron Kaiser <[email protected]> 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 <[email protected]> 31 January 2019
+
+xa-2.3.10
+
+ * Three fixes, all from Andre:
+ - Don't crash if a useless segment is referenced outside of relocating
+ mode (thanks Laszlo Barath for the report).
+ - Don't substitute within strings, for better cpp compatibility (thanks
+ Glenn Holmer for the report). I added the -S option for backwards
+ compatibility for the old behaviour; it will be removed in 2.4 and later.
+ - Fix underflow issue if a variable is late-bound (with -L) when that
+ variable is used in computations with negative offsets.
+ * Deprecated options will be removed in 2.4 and everything is warned.
+ * Documentation updated.
+ * Testsuite expanded.
+
+ -- Cameron Kaiser <[email protected]> 9 November 2019
+
+xa-2.3.11
+
+ * Compilation fix for gcc 10 (thanks Dan Horak).
+ * Allow pointer arithmetic in relocating mode within the same segment, since
+ the result is segmentless (thanks Andre for the report).
+ * .dsb with negative quantities shouldn't work (thanks Andre for the report).
+ * Stop a divide-by-zero floating point exception (thanks Frederic Cambus).
+ * Testsuite expanded.
+
+ -- Cameron Kaiser <[email protected]> 4 May 2020
+
diff -Nru xa-2.3.8/debian/changelog xa-2.3.11/debian/changelog
--- xa-2.3.8/debian/changelog 2020-07-24 12:48:44.000000000 +0200
+++ xa-2.3.11/debian/changelog 2020-07-24 12:48:44.000000000 +0200
@@ -1,3 +1,14 @@
+xa (2.3.11-0.1) unstable; urgency=medium
+
+ * Non-maintainer upload.
+ * New upstream release, which builds with GCC 10 (Closes: #957966).
+ * Override the build flags (the 2.3.11 build sets them unconditionnally,
+ unlike the 2.3.8 build).
+ * Set the linker so that the package can be cross-built; thanks to
+ Helmut Grohne for the patch (Closes: #948176).
+
+ -- Stephen Kitt <[email protected]> Fri, 24 Jul 2020 12:46:11 +0200
+
xa (2.3.8-2) unstable; urgency=low
* debian/control:
diff -Nru xa-2.3.8/debian/rules xa-2.3.11/debian/rules
--- xa-2.3.8/debian/rules 2020-07-24 12:48:44.000000000 +0200
+++ xa-2.3.11/debian/rules 2020-07-24 12:48:44.000000000 +0200
@@ -1,5 +1,11 @@
#!/usr/bin/make -f
+include /usr/share/dpkg/buildflags.mk
+include /usr/share/dpkg/buildtools.mk
+
+override_dh_auto_build:
+ dh_auto_build -- CC='$(CC)' LD='$$(CC)' CFLAGS='$(CPPFLAGS) $(CFLAGS)' LDFLAGS='$(LDFLAGS)'
+
override_dh_auto_install:
make install DESTDIR=$(CURDIR)/debian/xa65/usr
diff -Nru xa-2.3.8/Makefile xa-2.3.11/Makefile
--- xa-2.3.8/Makefile 2020-07-24 12:48:44.000000000 +0200
+++ xa-2.3.11/Makefile 2020-05-03 00:00:31.000000000 +0200
@@ -4,8 +4,8 @@
LD = gcc
# for testing. not to be used; build failures in misc/.
#CFLAGS = -O2 -W -Wall -pedantic -ansi
-CFLAGS += -O2
-LDFLAGS += -lc
+CFLAGS = -O2
+LDFLAGS = -lc
# for DOS?
# CC = gcc-go32
@@ -32,13 +32,13 @@
rm -f xa
xa:
- (cd src && LD=${LD} CC="${CC} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS}" ${MAKE})
+ (cd src && LD=${LD} CC="${CC} ${CFLAGS}" ${MAKE})
load:
- (cd loader && CC="${CC} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS}" ${MAKE})
+ (cd loader && CC="${CC} ${CFLAGS}" ${MAKE})
uncpk:
- (cd misc && CC="${CC} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS}" ${MAKE})
+ (cd misc && CC="${CC} ${CFLAGS}" ${MAKE})
dos: clean
(cd src && LD=gcc-go32 CC=gcc-go32 CFLAGS="-W -Wall -pedantic" ${MAKE})
@@ -63,8 +63,7 @@
#$(MKDIR) $(DOCDIR)/xa65
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.8.tar xa-2.3.8 ; gzip xa-2.3.8.tar
+ cd .. ; tar cvf xa-2.3.11.tar xa-2.3.11 ; gzip xa-2.3.11.tar
test: xa uncpk
cd tests && ./harness -make="$(MAKE)" -cc="$(CC)" -cflags="$(CFLAGS)"
diff -Nru xa-2.3.8/man/xa.1 xa-2.3.11/man/xa.1
--- xa-2.3.8/man/xa.1 2017-06-30 07:01:06.000000000 +0200
+++ xa-2.3.11/man/xa.1 2019-11-09 20:08:02.000000000 +0100
@@ -1,4 +1,4 @@
-.TH XA "1" "29 June 2017"
+.TH XA "1" "9 November 2019"
.SH NAME
xa \- 6502/R65C02/65816 cross-assembler
@@ -10,8 +10,7 @@
.SH DESCRIPTION
.B xa
is a multi-pass cross-assembler for the 8-bit processors in the 6502 series
-(such as
-the 6502, 65C02, 6504, 6507,
+(such as the 6502, 65C02, 6504, 6507,
6510, 7501, 8500, 8501 and 8502), the Rockwell R65C02, and
the 16-bit 65816 processor. For a description of syntax, see
.B ASSEMBLER SYNTAX
@@ -22,16 +21,8 @@
.B \-v
Verbose output.
.TP
-.B \-x
-Use old filename behaviour (overrides
-.BR \-o ,
-.B \-e
-and
-.BR \-l ).
-This option is now deprecated.
-.TP
.B \-C
-No CMOS opcodes (default is to allow R65C02 opcodes)
+No CMOS opcodes (default is to allow R65C02 opcodes).
.TP
.B \-W
No 65816 opcodes (default).
@@ -134,6 +125,23 @@
.TP
.B \-\-version
Show version of program.
+.LP
+The following options are
+.BR deprecated
+and will be removed in 2.4 and later versions:
+.TP
+.B \-x
+Use old filename behaviour (overrides
+.BR \-o ,
+.B \-e
+and
+.BR \-l ).
+.TP
+.B \-S
+Allow preprocessor substitution within strings (this is now disallowed
+for better
+.BR cpp (1)
+compatibility).
.SH ASSEMBLER SYNTAX
@@ -228,6 +236,21 @@
.B \-L
command line option.
.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
.B asl
and
@@ -238,7 +261,7 @@
on R65C02; etc.), the idiom of explicitly specifying the accumulator with
.B a
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
.BR a ,
this will actually generate code referencing that label as a memory
@@ -464,7 +487,9 @@
will be inserted into the assembled object. For example,
.B .dsb 5,$10
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
.B .bin offset,length,"filename"
Inlines a binary file without further interpretation specified by
@@ -479,7 +504,9 @@
.B length
is zero, then the length of
.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
.B \&.(
Opens a new block for scoping. Within a block, all labels defined are local to
@@ -757,6 +784,107 @@
.br
.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
.B xa
@@ -827,6 +955,20 @@
prefix. Otherwise, the assembler will attempt to optimize to 16 bits, which
may be undesirable.
+.SH "IMMINENT DEPRECATION"
+The following options and modes will be
+.B REMOVED
+in 2.4 and later versions of
+.BR xa :
+.LP
+.B \-x
+.LP
+.B \-S
+.LP
+the original
+.B mvn $xxxx
+syntax
+
.SH "SEE ALSO"
.BR file65 (1),
.BR ldo65 (1),
@@ -840,8 +982,11 @@
Andre Fachat <[email protected]>
and Cameron Kaiser <[email protected]>.
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.
+.SH 30 YEARS OF XA
+Yay us?
+
.SH WEBSITE
http://www.floodgap.com/retrotech/xa/
diff -Nru xa-2.3.8/README.1st xa-2.3.11/README.1st
--- xa-2.3.8/README.1st 2017-06-30 06:22:22.000000000 +0200
+++ xa-2.3.11/README.1st 2019-11-09 02:20:26.000000000 +0100
@@ -3,7 +3,7 @@
under most ANSI C compilers. It is distributed under the GNU Public License
(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.10, a bug fix to the long-lived 2.3.0, itself with
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
generate code for all targets now.
diff -Nru xa-2.3.8/src/Makefile xa-2.3.11/src/Makefile
--- xa-2.3.8/src/Makefile 2020-07-24 12:48:44.000000000 +0200
+++ xa-2.3.11/src/Makefile 2019-11-09 01:11:32.000000000 +0100
@@ -8,7 +8,7 @@
all: xa
xa: ${OBJ}
- ${LD} ${CPPFLAGS} ${CFLAGS} -o ../xa ${OBJ} ${LDFLAGS}
+ ${LD} -o ../xa ${OBJ} ${LDFLAGS}
clean:
rm -f *.o *.o65
diff -Nru xa-2.3.8/src/xaa.c xa-2.3.11/src/xaa.c
--- xa-2.3.8/src/xaa.c 2008-06-15 07:15:34.000000000 +0200
+++ xa-2.3.11/src/xaa.c 2020-05-03 23:00:05.000000000 +0200
@@ -98,7 +98,9 @@
afl = 0;
-/*printf("ag_term(%02x %02x %02x %02x %02x %02x\n",s[0],s[1],s[2],s[3],s[4],s[5]);*/
+/*
+printf("ag_term(%02x %02x %02x %02x %02x %02x\n",s[0],s[1],s[2],s[3],s[4],s[5]);
+*/
while(s[pp]=='-')
{
pp++;
@@ -119,8 +121,10 @@
if(s[pp]==T_LABEL)
{
er=l_get(cval(s+pp+1),v, &afl);
-/* printf("label: er=%d, seg=%d, afl=%d, nolink=%d, fundef=%d\n",
- er, segment, afl, nolink, fundef); */
+/*
+ printf("label: er=%d, seg=%d, afl=%d, nolink=%d, fundef=%d\n",
+ er, segment, afl, nolink, fundef);
+*/
if(er==E_NODEF && segment != SEG_ABS && fundef ) {
if( nolink || (afl==SEG_UNDEF)) {
er = E_OK;
@@ -136,7 +140,9 @@
{
*v=lval(s+pp+1);
pp+=4;
-/* printf("value: v=%04x\n",*v); */
+/*
+printf("value: v=%04x\n",*v);
+*/
}
else
if(s[pp]==T_POINTER)
@@ -144,7 +150,9 @@
afl = s[pp+1];
*v=cval(s+pp+2);
pp+=4;
-/* printf("pointer: v=%04x, afl=%04x\n",*v,afl); */
+/*
+printf("pointer: v=%04x, afl=%04x\n",*v,afl);
+*/
}
else
if(s[pp]=='*')
@@ -178,9 +186,10 @@
if((afl && !*nafl) && o==2) {
afl=(afl | *nafl); /* substract constant from pointer */
} else {
- if(segment!=SEG_ABS) {
+ /* allow math in the same segment */
+ if(segment!=SEG_ABS && segment != afl) {
if(!dsb_len) {
- er=E_ILLPOINTER;
+ er=E_ILLSEGMENT;
}
}
afl=0;
@@ -224,7 +233,7 @@
*w *=w2;
break;
case 4:
- if (w!=0)
+ if (w2!=0)
*w /=w2;
else
er =E_DIV;
diff -Nru xa-2.3.8/src/xa.c xa-2.3.11/src/xa.c
--- xa-2.3.8/src/xa.c 2017-06-30 06:24:04.000000000 +0200
+++ xa-2.3.11/src/xa.c 2020-05-06 23:39:58.000000000 +0200
@@ -55,13 +55,14 @@
#define ANZWARN 13
#define programname "xa"
-#define progversion "v2.3.8"
+#define progversion "v2.3.11"
#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-2020 Andre Fachat, Jolse Maginnis, David Weinehall\nand Cameron Kaiser."
/* exported globals */
int ncmos, cmosfl, w65816, n65816;
int masm = 0;
+int ppinstr = 0;
int nolink = 0;
int romable = 0;
int romaddr = 0;
@@ -210,6 +211,10 @@
case 'M':
masm = 1; /* MASM compatibility mode */
break;
+ case 'S':
+ ppinstr = 1; /* preprocessor substitution in strings ok */
+ fprintf(stderr, "Warning: -S is deprecated and will be removed in 2.4+!\n");
+ break;
case 'O': /* output charset */
{
char *name = NULL;
@@ -267,7 +272,7 @@
break;
case 'x': /* old filename behaviour */
oldfile = 1;
- fprintf(stderr, "Warning: -x is now deprecated and may disappear in future versions!\n");
+ fprintf(stderr, "Warning: -x is now deprecated and will be removed in 2.4+!\n");
break;
case 'I':
if(argv[i][2]==0) {
@@ -392,6 +397,8 @@
r_mode(RMODE_RELOC);
segment = SEG_TEXT;
} else {
+ /* prime old_segment in r_mode with SEG_TEXT */
+ segment = SEG_ABS;
r_mode(RMODE_ABS);
}
@@ -460,11 +467,13 @@
seg_pass2();
- if(!relmode) {
- r_mode(RMODE_ABS);
+ if(relmode) {
+ r_mode(RMODE_RELOC);
+ segment = SEG_TEXT;
} else {
- r_mode(RMODE_RELOC);
- segment = SEG_TEXT;
+ /* prime old_segment in r_mode with SEG_TEXT */
+ segment = SEG_ABS;
+ r_mode(RMODE_ABS);
}
er=pass2();
}
@@ -716,7 +725,7 @@
fprintf(stderr, "fnam = %s\n", binfnam);
*/
/* primitive insurance */
- if (!(foo = fopen(binfnam, "r"))) {
+ if (!(foo = fopen(binfnam, "rb"))) {
errout(E_FNF);
ner++;
} else {
@@ -825,8 +834,6 @@
programname);
fprintf(fp,
" -v verbose output\n"
- " -x old filename behaviour (overrides `-o', `-e', `-l')\n"
- " This is deprecated and may disappear in future versions!\n"
" -C no CMOS-opcodes\n"
" -W no 65816-opcodes%s\n"
" -w allow 65816-opcodes%s\n",
@@ -854,11 +861,16 @@
" Other segments must be specified with `-b?'\n"
" -G suppress list of exported globals\n");
fprintf(fp,
+ " -p? set preprocessor character to ?, default is #\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"
" --version output version information and exit\n"
" --help display this help and exit\n");
+ fprintf(fp,
+ "== These options are deprecated and will be removed in 2.4+! ==\n"
+ " -x old filename behaviour (overrides `-o', `-e', `-l')\n"
+ " -S allow preprocessor substitution within strings\n");
}
/*
diff -Nru xa-2.3.8/src/xa.h xa-2.3.11/src/xa.h
--- xa-2.3.8/src/xa.h 2008-07-02 07:04:25.000000000 +0200
+++ xa-2.3.11/src/xa.h 2019-11-09 01:36:39.000000000 +0100
@@ -22,7 +22,7 @@
#include "xah.h" /* For SEG_MAX */
extern int ncmos, cmosfl, w65816, n65816;
-extern int masm, nolink;
+extern int masm, nolink, ppinstr;
extern int noglob;
extern int showblk;
extern int relmode;
diff -Nru xa-2.3.8/src/xap.c xa-2.3.11/src/xap.c
--- xa-2.3.8/src/xap.c 2014-12-27 03:42:52.000000000 +0100
+++ xa-2.3.11/src/xap.c 2019-11-09 01:46:05.000000000 +0100
@@ -456,7 +456,25 @@
{
while(t[0]!='\0')
{
- while(!isalpha(t[0]) && t[0]!='_')
+ /* find start of a potential token to be replaced */
+ while(!isalpha(t[0]) && t[0]!='_') {
+
+ /* escape strings quoted with " */
+ if (!ppinstr && t[0] == '\"') {
+ do {
+ t++;
+ ti++;
+ } while (t[0] && t[0]!='\"');
+ }
+
+ /* escape strings quoted with ' */
+ if (!ppinstr && t[0] == '\'') {
+ do {
+ t++;
+ ti++;
+ } while (t[0] && t[0]!='\'');
+ }
+
if(t[0]=='\0')
break; /*return(E_OK);*/
else
@@ -464,6 +482,7 @@
t++;
ti++;
}
+ }
for(l=0;isalnum(t[l])||t[l]=='_';l++);
ld=l;
diff -Nru xa-2.3.8/src/xap.h xa-2.3.11/src/xap.h
--- xa-2.3.8/src/xap.h 2012-07-24 22:08:53.000000000 +0200
+++ xa-2.3.11/src/xap.h 2020-05-03 00:01:54.000000000 +0200
@@ -35,7 +35,7 @@
long gm_ppm(void);
long ga_ppm(void);
-Datei *filep;
-char s[MAXLINE];
+extern Datei *filep;
+extern char s[MAXLINE];
#endif /* __XA65_XAP_H__ */
diff -Nru xa-2.3.8/src/xat.c xa-2.3.11/src/xat.c
--- xa-2.3.8/src/xat.c 2014-12-28 03:11:28.000000000 +0100
+++ xa-2.3.11/src/xat.c 2020-05-03 01:13:18.000000000 +0200
@@ -479,48 +479,44 @@
dsb_len = 0;
} else
if(n==Ktext) {
-/* if(segment!=SEG_ABS) { */
segment = relmode ? SEG_TEXT : SEG_ABS;
t[0]=Ksegment;
t[1]=segment;
*ll=2;
er=E_OKDEF;
-/* } else {
- er=E_ILLSEGMENT;
- } */
} else
if(n==Kdata) {
-/* if(segment!=SEG_ABS) { */
+ if(relmode) {
segment = SEG_DATA;
t[0]=Ksegment;
t[1]=SEG_DATA;
*ll=2;
er=E_OKDEF;
-/* } else {
+ } else {
er=E_ILLSEGMENT;
- } */
+ }
} else
if(n==Kbss) {
-/* if(segment!=SEG_ABS) { */
+ if(relmode) {
segment = SEG_BSS;
t[0]=Ksegment;
t[1]=SEG_BSS;
*ll=2;
er=E_OKDEF;
-/* } else {
+ } else {
er=E_ILLSEGMENT;
- } */
+ }
} else
if(n==Kzero) {
-/* if(segment!=SEG_ABS) { */
+ if(relmode) {
segment = SEG_ZERO;
t[0]=Ksegment;
t[1]=SEG_ZERO;
*ll=2;
er=E_OKDEF;
-/* } else {
+ } else {
er=E_ILLSEGMENT;
- } */
+ }
} else
if (n==Kbin) {
int j;
@@ -601,7 +597,7 @@
"binclude1 offset = %i len = %i filename = %s endchar = %i\n",
offset, length, binfnam, i);
#endif
- if (!(foo = fopen(binfnam, "r"))) {
+ if (!(foo = fopen(binfnam, "rb"))) {
er = E_FNF;
} else {
fseek(foo, 0, SEEK_END);
@@ -704,8 +700,14 @@
} else
sy=4+nk; /* absolute or zero page */
- /* length counter set to maximum length + 1 */
- bl=Maxbyt+1;
+ /* length counter set to maximum length + 1 */
+ if (w65816 || (t[l-1]=='@' || t[l-1] == '!')) {
+ /* for 65816 allow addressing modes up to 4 byte overall length */
+ bl=Maxbyt+1;
+ } else {
+ /* for other modes only check for addressing modes up to 3 byte overall length */
+ bl=Maxbyt;
+ }
/* find best fit for length of this operand */
while(--bl)
@@ -1027,7 +1029,7 @@
"binclude2 offset = %i len = %i filename = %s endchar = %i\n",
offset, length, binfnam, i);
#endif
- if (!(foo = fopen(binfnam, "r"))) {
+ if (!(foo = fopen(binfnam, "rb"))) {
er = E_FNF;
} else {
fseek(foo, 0, SEEK_END);
@@ -1203,6 +1205,9 @@
dsb_len = 1;
if(!(er=a_term(t+1,&j,&i,pc[segment],&afl,&label,0)))
{
+ if (j<0)
+ er=E_SYNTAX;
+ else
/*
if(t[i+1]!=',')
er=E_SYNTAX;
@@ -1375,9 +1380,19 @@
}
}
}
-
- bl=Maxbyt+1;
+ /* set bl to maximum overall length +1 as while() below starts with decrementing it */
+ if (w65816 || (t[*ll-1]=='@' || t[*ll-1] == '!')) {
+ /* for 65816 allow addressing modes up to 4 byte overall length */
+ bl=Maxbyt+1;
+ } else {
+ /* for other modes only check for addressing modes up to 3 byte overall length */
+ bl=Maxbyt;
+ }
+
+#ifdef DEBUG_AM
+ printf("--- trying to find am using: (max+1) bl=%d, sy=%d\n", bl, sy);
+#endif
while(--bl)
{
if((am=at[sy][bl-1])>=0)
@@ -1415,8 +1430,8 @@
{
#ifdef DEBUG_AM
fprintf(stderr,
-"b4: pc= %d, am = %d and vv[0] = %d, optimize = %d, bitmask = %d\n",
- pc[segment], am, vv[0], fl, (vv[0]&0xffff00));
+"b4: pc= %d, am = %d and vv[0] = %d, optimize = %d, bitmask = %u, er=%d\n",
+ pc[segment], am, vv[0], fl, (vv[0]&0xffff00), er);
#endif
/* terrible KLUDGE!!!! OH NOES!!!1!
@@ -1455,15 +1470,21 @@
else
{
bl=le[am];
+ if ((am != 11 && am != 16) && (vv[0] > 255 || vv[0] < -256) && bl == 2) {
+ er = E_OVERFLOW;
+ } else
+ if ((am != 11 && am != 16) && (vv[0] > 65535 || vv[0] < -65536) && (bl == 2 || bl == 3)) {
+ er = E_OVERFLOW;
+ } else
if( ((ct[n][am]&0x400) && memode) || ((ct[n][am]&0x800) && xmode)) {
bl++;
- }
+ }
*ll=bl;
}
#ifdef DEBUG_AM
-fprintf(stderr, "byte length is now %d\n", bl);
+fprintf(stderr, "byte length is now %d, am=%d, er=%d\n", bl, am, er);
#endif
if(!er)
@@ -1512,6 +1533,7 @@
}
} else
if(am==11 || am==16) {
+ /* relative, relative long */
if((segment!=SEG_ABS) && (!rlt[0])) {
er=E_ILLPOINTER;
} else {
diff -Nru xa-2.3.8/tests/csapiec/Makefile xa-2.3.11/tests/csapiec/Makefile
--- xa-2.3.8/tests/csapiec/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/csapiec/Makefile 2020-05-03 01:01:06.000000000 +0200
@@ -0,0 +1,12 @@
+default:
+ # xa should not allow this to happen. if it does, this test is no good.
+ ../../xa -DBUG=1 -o test.o test.s || exit 0 && exit 1
+ ../../xa -R -DBUG=1 -o testseg.o test.s || exit 0 && exit 1
+ # xa *should* allow this to happen.
+ ../../xa -o test.o test.s
+ ../hextool -cmp=test.ok < test.o
+ ../../xa -R -o testseg.o test.s
+ ../hextool -cmp=testseg.ok < testseg.o
+
+clean:
+ rm -f *.o
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/csapiec/test.ok and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/csapiec/test.ok differ
diff -Nru xa-2.3.8/tests/csapiec/test.s xa-2.3.11/tests/csapiec/test.s
--- xa-2.3.8/tests/csapiec/test.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/csapiec/test.s 2020-05-03 00:51:34.000000000 +0200
@@ -0,0 +1,32 @@
+ .text
+
+c0 =*-1
+
+#ifdef BUG
+ .data
+#endif
+
+cmdt .asc "$",0
+cow .asc "@",0
+c2 .asc "rename",0
+c3 .asc "scratch",0
+c4 .asc "copy",0
+c5 .asc "new",0
+c6 .asc "validate",0
+c7 .asc "initialize",0
+;c8 .asc "rmdir",0
+;c9 .asc "mkdir",0
+;c10 .asc "chdir",0
+c11 .asc "assign",0
+c12 .asc "cd",0
+c13 .asc "rd",0
+c14 .asc "md",0
+c15 .asc "drv",0 ; iec-bus-unit
+
+cmda .byt cmdt-c0
+ .byt <c0
+ .byt <cow-c0
+ .word <cow-c0
+ .byt c2-c0, c3-c0, c4-c0, c5-c0, c6-c0, c7-c0 /*,c8-c0*/
+ .byt /*c9-c0,c10-c0,*/ c11-c0, c12-c0, c13-c0, c14-c0, c15-c0, 0
+
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/csapiec/testseg.ok and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/csapiec/testseg.ok differ
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/linkr/ok and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/linkr/ok differ
diff -Nru xa-2.3.8/tests/linkr/test.s xa-2.3.11/tests/linkr/test.s
--- xa-2.3.8/tests/linkr/test.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/linkr/test.s 2019-11-09 01:11:32.000000000 +0100
@@ -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
+
diff -Nru xa-2.3.8/tests/math/divzero2.s xa-2.3.11/tests/math/divzero2.s
--- xa-2.3.8/tests/math/divzero2.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/math/divzero2.s 2020-05-03 23:05:14.000000000 +0200
@@ -0,0 +1,6 @@
+.word $
+xyz = 2
+zyx = xyz - xyz
+
+* = $0/zyx
+
diff -Nru xa-2.3.8/tests/math/divzero.s xa-2.3.11/tests/math/divzero.s
--- xa-2.3.8/tests/math/divzero.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/math/divzero.s 2020-05-03 23:04:42.000000000 +0200
@@ -0,0 +1,3 @@
+.word $
+* = $0/00
+
diff -Nru xa-2.3.8/tests/math/Makefile xa-2.3.11/tests/math/Makefile
--- xa-2.3.8/tests/math/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/math/Makefile 2020-05-03 23:05:22.000000000 +0200
@@ -0,0 +1,7 @@
+default:
+ # xa should not allow this to happen. if it does, this test is no good.
+ ../../xa -o divzero.o divzero.s || exit 0 && exit 1
+ ../../xa -o divzero2.o divzero2.s || exit 0 && exit 1
+
+clean:
+ rm -f *.o
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/neg_offset/a.o65 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/neg_offset/a.o65 differ
diff -Nru xa-2.3.8/tests/neg_offset/Makefile xa-2.3.11/tests/neg_offset/Makefile
--- xa-2.3.8/tests/neg_offset/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/Makefile 2020-05-03 01:03:57.000000000 +0200
@@ -0,0 +1,40 @@
+default: test0 test1 test2 test3 test4 test5 test6 test7 test8
+
+test0:
+ # this test must fail.
+ ../../xa -o test0.o test0.s || exit 0 && exit 1
+
+test1:
+ ../../xa -R -LLIB6502 test1.s -o test1.o
+ ../hextool -cmp=ok1 < test1.o
+
+test2:
+ ../../xa -R -LLIB6502 test2.s -o test2.o
+ ../hextool -cmp=ok2 < test2.o
+
+test3:
+ ../../xa -R -LLIB6502 test3.s -o test3.o
+ ../hextool -cmp=ok3 < test3.o
+
+test4:
+ ../../xa -R -LLIB6502 test4.s -o test4.o
+ ../hextool -cmp=ok4 < test4.o
+
+test5:
+ ../../xa -R -LLIB6502 test5.s -o test5.o
+ ../hextool -cmp=ok5 < test5.o
+
+test6:
+ # this test must fail.
+ ../../xa -R -LLIB6502 test6.s -o test6.o || exit 0 && exit 1
+
+test7:
+ # this test must fail.
+ ../../xa -R -LLIB6502 test7.s -o test7.o || exit 0 && exit 1
+
+test8:
+ # this test must fail.
+ ../../xa -R -LLIB6502 test8.s -o test8.o || exit 0 && exit 1
+
+clean:
+ rm -f *.o
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/neg_offset/ok1 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/neg_offset/ok1 differ
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/neg_offset/ok2 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/neg_offset/ok2 differ
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/neg_offset/ok3 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/neg_offset/ok3 differ
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/neg_offset/ok4 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/neg_offset/ok4 differ
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/neg_offset/ok5 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/neg_offset/ok5 differ
diff -Nru xa-2.3.8/tests/neg_offset/test0.s xa-2.3.11/tests/neg_offset/test0.s
--- xa-2.3.8/tests/neg_offset/test0.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test0.s 2020-05-03 01:03:22.000000000 +0200
@@ -0,0 +1,2 @@
+
+ .dsb -10, 32
diff -Nru xa-2.3.8/tests/neg_offset/test1.s xa-2.3.11/tests/neg_offset/test1.s
--- xa-2.3.8/tests/neg_offset/test1.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test1.s 2019-11-09 01:21:07.000000000 +0100
@@ -0,0 +1,6 @@
+
+ .text
+
+ jsr LIB6502-3
+
+
diff -Nru xa-2.3.8/tests/neg_offset/test2.s xa-2.3.11/tests/neg_offset/test2.s
--- xa-2.3.8/tests/neg_offset/test2.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test2.s 2019-11-09 01:21:29.000000000 +0100
@@ -0,0 +1,9 @@
+
+#define flib2osa_r LIB6502-3
+
+ .text
+
+ jsr flib2osa_r
+
+
+
diff -Nru xa-2.3.8/tests/neg_offset/test3.s xa-2.3.11/tests/neg_offset/test3.s
--- xa-2.3.8/tests/neg_offset/test3.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test3.s 2019-11-09 01:21:08.000000000 +0100
@@ -0,0 +1,6 @@
+
+ .text
+
+ jsr LIB6502-255
+
+
diff -Nru xa-2.3.8/tests/neg_offset/test4.s xa-2.3.11/tests/neg_offset/test4.s
--- xa-2.3.8/tests/neg_offset/test4.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test4.s 2019-11-09 01:21:08.000000000 +0100
@@ -0,0 +1,6 @@
+
+ .text
+
+ jsr LIB6502+256
+
+
diff -Nru xa-2.3.8/tests/neg_offset/test5.s xa-2.3.11/tests/neg_offset/test5.s
--- xa-2.3.8/tests/neg_offset/test5.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test5.s 2019-11-09 01:21:09.000000000 +0100
@@ -0,0 +1,6 @@
+
+ .text
+
+ jsr LIB6502-256
+
+
diff -Nru xa-2.3.8/tests/neg_offset/test6.s xa-2.3.11/tests/neg_offset/test6.s
--- xa-2.3.8/tests/neg_offset/test6.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test6.s 2019-11-09 01:21:09.000000000 +0100
@@ -0,0 +1,6 @@
+
+ .text
+
+ jsr LIB6502-65537
+
+
diff -Nru xa-2.3.8/tests/neg_offset/test7.s xa-2.3.11/tests/neg_offset/test7.s
--- xa-2.3.8/tests/neg_offset/test7.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test7.s 2019-11-09 01:21:09.000000000 +0100
@@ -0,0 +1,6 @@
+
+ .text
+
+ jsr 65536
+
+
diff -Nru xa-2.3.8/tests/neg_offset/test8.s xa-2.3.11/tests/neg_offset/test8.s
--- xa-2.3.8/tests/neg_offset/test8.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/neg_offset/test8.s 2019-11-09 01:21:09.000000000 +0100
@@ -0,0 +1,6 @@
+
+ .text
+
+ jsr LIB6502+65536
+
+
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/ppstrings/ok and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/ppstrings/ok differ
diff -Nru xa-2.3.8/tests/ppstrings/test.s xa-2.3.11/tests/ppstrings/test.s
--- xa-2.3.8/tests/ppstrings/test.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/ppstrings/test.s 2019-11-09 01:48:54.000000000 +0100
@@ -0,0 +1,15 @@
+
+#define DUP 123
+
+ .asc "DUP^@"
+
+ .asc '0DUP^@'
+
+ .asc "D","UP^@"
+
+ .asc "DUP
+
+ .asc "DU0
+
+ .asc "DU
+
diff -Nru xa-2.3.8/tests/README xa-2.3.11/tests/README
--- xa-2.3.8/tests/README 2017-06-30 06:54:20.000000000 +0200
+++ xa-2.3.11/tests/README 2020-05-03 23:04:15.000000000 +0200
@@ -16,6 +16,8 @@
prefixes)
nonl/ Patryk's no-new-line-on-last-line cases ;)
fordef/ Optimizer warnings for forward defined labels
+relocmode/ Tests to prevent use of irrational segments if relocating
+ mde isn't on
relocundef/ Tests for the detection of undefined references during a
reloc65 export
ldoreloc/ Test case for the relocation table reading of ldo when undef'd
@@ -27,6 +29,8 @@
incerr/ 1) .xl/.al should error without -w 2) error should be in
the correct file ('816)
binclude/ Binary include code with some weird casing
+ppstrings/ Don't substitute inside strings (unless -S)
+neg_offset/ Test negative offsets/values with/without relocation
chppch/ Changing preprocessor characters (-p)
charset/ Tests of when charsets should be honoured and when not
mvnmvp/ Test MVN MVP unusual addressing mode ('816)
@@ -36,6 +40,9 @@
branch/ Branch range test
masmcom/ Another test for -M that generates totally valid code
quotch/ Test quoting problematic characters (thanks Simon Rowe)
+linkr/ Test linking using .dsb and generated code
+csapiec/ Test on pointer arithmetic in relocating mode
+math/ Math tests (currently divide by zero, thanks Frederic Cambus)
Cameron Kaiser, André Fachat
diff -Nru xa-2.3.8/tests/relocmode/Makefile xa-2.3.11/tests/relocmode/Makefile
--- xa-2.3.8/tests/relocmode/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/relocmode/Makefile 2019-11-09 02:00:27.000000000 +0100
@@ -0,0 +1,10 @@
+default: test1
+
+test1:
+ # this should fail in non-relocating mode
+ ../../xa test1.s -o test1.o || exit 0 && exit 1
+ ../../xa -R test1.s -o test1.o
+ ../hextool -cmp=ok < test1.o
+
+clean:
+ rm -f *.o
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/relocmode/ok and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/relocmode/ok differ
diff -Nru xa-2.3.8/tests/relocmode/test1.s xa-2.3.11/tests/relocmode/test1.s
--- xa-2.3.8/tests/relocmode/test1.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/relocmode/test1.s 2019-11-09 02:00:05.000000000 +0100
@@ -0,0 +1,7 @@
+
+ lda foo
+
+ .data
+
+foo .byt $aa
+
diff -Nru xa-2.3.8/tests/reset_segment/Makefile xa-2.3.11/tests/reset_segment/Makefile
--- xa-2.3.8/tests/reset_segment/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/reset_segment/Makefile 2019-11-09 02:03:41.000000000 +0100
@@ -0,0 +1,10 @@
+default: test1
+
+test1:
+ ../../xa -R -LLIB6502 test1.s -o test1.o
+ ../hextool -cmp=ok1 < test1.o
+ ../../xa -R test2.s -o test2.o
+ ../hextool -cmp=ok2 < test2.o
+
+clean:
+ rm -f *.o
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/reset_segment/ok1 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/reset_segment/ok1 differ
Binary files /tmp/user/1000/KWOtsOxNdc/xa-2.3.8/tests/reset_segment/ok2 and /tmp/user/1000/OSWa8ZGOHD/xa-2.3.11/tests/reset_segment/ok2 differ
diff -Nru xa-2.3.8/tests/reset_segment/test1.s xa-2.3.11/tests/reset_segment/test1.s
--- xa-2.3.8/tests/reset_segment/test1.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/reset_segment/test1.s 2019-11-09 02:03:47.000000000 +0100
@@ -0,0 +1,12 @@
+
+ ; forward reference
+ ; results in illegal ptr arithmetic when segment
+ ; is not reset between pass1 and pass2
+
+ bne foo
+foo
+
+ .data
+
+
+
diff -Nru xa-2.3.8/tests/reset_segment/test2.s xa-2.3.11/tests/reset_segment/test2.s
--- xa-2.3.8/tests/reset_segment/test2.s 1970-01-01 01:00:00.000000000 +0100
+++ xa-2.3.11/tests/reset_segment/test2.s 2019-11-09 02:03:44.000000000 +0100
@@ -0,0 +1,23 @@
+
+ ; test absolute code embedded into relocatable mode
+
+ .text
+
+ lda foo
+ lda bar
+
+ ; go into absolute mode
+ *=$1234
+
+foo .asc "absolute",0
+
+ lda foo
+ lda bar
+
+ ; go back into relocatble mode
+ *=
+
+bar .asc "reloc",0
+
+
+
signature.asc
Description: PGP signature
--- End Message ---