From e51b1e7f4189aa219a234963f5181211a7307109 Mon Sep 17 00:00:00 2001 From: Andre Fachat Date: Wed, 29 Nov 2023 13:48:04 +0100 Subject: [PATCH] CPU handling in file65, reloc65, and ldo65 --- xa/man/reloc65.1 | 9 ++++ xa/misc/file65.c | 45 +++++++++++++++--- xa/misc/ldo65.c | 88 +++++++++++++++++++++++++---------- xa/misc/reloc65.c | 78 +++++++++++++++++++++++++++++-- xa/tests/mode/Makefile | 71 ++++++++++++++++++++++++++-- xa/tests/mode/c6502-ad4.ok | Bin 0 -> 34 bytes xa/tests/mode/c6502-at2.ok | Bin 0 -> 34 bytes xa/tests/mode/c65816-ad4.ok | Bin 0 -> 34 bytes xa/tests/mode/c65816-at2.ok | Bin 0 -> 34 bytes xa/tests/mode/c65c02-ad4.ok | Bin 0 -> 34 bytes xa/tests/mode/c65c02-at2.ok | Bin 0 -> 34 bytes xa/tests/mode/c65ce02-ad4.ok | Bin 0 -> 34 bytes xa/tests/mode/c65ce02-at2.ok | Bin 0 -> 34 bytes xa/tests/mode/c65sc02-ad4.ok | Bin 0 -> 34 bytes xa/tests/mode/c65sc02-at2.ok | Bin 0 -> 34 bytes xa/tests/mode/linkup1.ok | 7 +++ xa/tests/mode/n6502-ad4.ok | Bin 0 -> 34 bytes xa/tests/mode/n6502-at2.ok | Bin 0 -> 34 bytes 18 files changed, 260 insertions(+), 38 deletions(-) create mode 100644 xa/tests/mode/c6502-ad4.ok create mode 100644 xa/tests/mode/c6502-at2.ok create mode 100644 xa/tests/mode/c65816-ad4.ok create mode 100644 xa/tests/mode/c65816-at2.ok create mode 100644 xa/tests/mode/c65c02-ad4.ok create mode 100644 xa/tests/mode/c65c02-at2.ok create mode 100644 xa/tests/mode/c65ce02-ad4.ok create mode 100644 xa/tests/mode/c65ce02-at2.ok create mode 100644 xa/tests/mode/c65sc02-ad4.ok create mode 100644 xa/tests/mode/c65sc02-at2.ok create mode 100644 xa/tests/mode/linkup1.ok create mode 100644 xa/tests/mode/n6502-ad4.ok create mode 100644 xa/tests/mode/n6502-at2.ok diff --git a/xa/man/reloc65.1 b/xa/man/reloc65.1 index eda869b..d7d73e4 100644 --- a/xa/man/reloc65.1 +++ b/xa/man/reloc65.1 @@ -47,6 +47,15 @@ file. Relocating data segment to the end of the text segment and bss segment to the end of the data segment (\-xd and \-xb options override the derived address) before extracting. .TP +.B \-C cputype +Define a new CPU type for the output file. Available values are +"6502" - documented 6502 opcodes only +"NMOS6502" - "6502" plus undocumented opcodes are being used +"65SC02" - extends "6502" with the CMOS opcodes, except BBR/BBS/SMB/RMB +"65C02" - extends "65SC02" with the BBR/BBS/SMB/RMB opcodes +"65CE02" - extends 65C02 with additional CE-specific opcodes +"65816" - i.e. 65816 in 6502 emulation mode; extends "65SC02"(!) +.TP .B \-\-help Show summary of options. .TP diff --git a/xa/misc/file65.c b/xa/misc/file65.c index 064f588..6c69b46 100644 --- a/xa/misc/file65.c +++ b/xa/misc/file65.c @@ -37,6 +37,36 @@ #define author "Written by Andre Fachat" #define copyright "Copyright (C) 1997-2002 Andre Fachat." +/* o65 file format mode bits */ +#define FM_OBJ 0x1000 +#define FM_SIZE 0x2000 +#define FM_RELOC 0x4000 +#define FM_CPU 0x8000 + +#define FM_CPU2 0x00f0 + +#define FM_CPU2_6502 0x0000 +#define FM_CPU2_65C02 0x0010 +#define FM_CPU2_65SC02 0x0020 +#define FM_CPU2_65CE02 0x0030 +#define FM_CPU2_NMOS 0x0040 +#define FM_CPU2_65816E 0x0050 + +const char *cpunames[16] = { + "6502", + "65C02", + "65SC02", + "65CE02", + "NMOS6502", + "65816", + NULL, NULL, + "6809", NULL, // 1000 - + "Z80", NULL, NULL, // 1010 - + "8086", // 1101 - + "80286", // 1110 - + NULL +}; + int read_options(FILE *fp); int print_labels(FILE *fp, int offset); @@ -81,7 +111,7 @@ int main(int argc, char *argv[]) { i = 1; - if (strstr(argv[i], "--help") || strstr(argv[i], "-?")) { + if (strstr(argv[i], "--help") || strstr(argv[i], "-?") || strstr(argv[i], "-h")) { usage(stdout); exit(0); } @@ -114,7 +144,7 @@ int main(int argc, char *argv[]) { xapar = 1; break; default: - fprintf(stderr,"%s: %s unknown option\n",programname,argv[i]); + fprintf(stderr,"%s: %s unknown option, use '-h' for help\n",programname,argv[i]); break; } } else { @@ -127,11 +157,12 @@ int main(int argc, char *argv[]) { printf("%s: o65 version %d %s file\n", argv[i], hdr[5], hdr[7]&0x10 ? "object" : "executable"); printf(" mode: %04x =",mode ); - printf("%s%s%s%s%s\n", - (mode & 0x1000)?"[object]":"[executable]", - (mode & 0x2000)?"[32bit]":"[16bit]", - (mode & 0x4000)?"[page relocation]":"[byte relocation]", - (mode & 0x8000)?"[CPU 65816]":"[CPU 6502]", + printf("[%s][%sbit][%s relocation][CPU %s][CPU2 %s]%s\n", + (mode & 0x1000)?"object":"executable", + (mode & 0x2000)?"32":"16", + (mode & 0x4000)?"page":"byte", + (mode & 0x8000)?"65816":"6502", + cpunames[(mode & FM_CPU2) >> 4], aligntxt[mode & 3]); } if(mode & 0x2000) { diff --git a/xa/misc/ldo65.c b/xa/misc/ldo65.c index 0adf85e..2a6df95 100644 --- a/xa/misc/ldo65.c +++ b/xa/misc/ldo65.c @@ -54,6 +54,22 @@ The process of linking works as follows: */ +/* o65 file format mode bits */ +#define FM_OBJ 0x1000 +#define FM_SIZE 0x2000 +#define FM_RELOC 0x4000 +#define FM_CPU 0x8000 + +#define FM_CPU2 0x00f0 + +#define FM_CPU2_6502 0x0000 +#define FM_CPU2_65C02 0x0010 +#define FM_CPU2_65SC02 0x0020 +#define FM_CPU2_65CE02 0x0030 +#define FM_CPU2_NMOS 0x0040 +#define FM_CPU2_65816E 0x0050 + + typedef struct { char *name; int len; @@ -133,6 +149,21 @@ file65 file; unsigned char cmp[] = { 1, 0, 'o', '6', '5' }; unsigned char hdr[26] = { 1, 0, 'o', '6', '5', 0 }; +const char *cpunames[16] = { + "documented 6502", + "65C02 (CMOS with BBR/BBS/RMB/SMB)", + "65SC02 (CMOS without BBR/BBS/RMB/SMB)", + "65CE02", + "6502 with undocumented opcodes", + "65816 in 6502 emulation mode", + "n/a", "n/a", + "6809?", "n/a", // 1000 - + "Z80?", "n/a", "n/a", // 1010 - + "8086?", // 1101 - + "80286?", // 1110 - + "n/a" +}; + int verbose = 0; void usage(FILE *fp) @@ -189,7 +220,7 @@ int main(int argc, char *argv[]) { exit(1); } - if (strstr(argv[1], "--help") || strstr(argv[1], "-?")) { + if (strstr(argv[1], "--help") || strstr(argv[1], "-?") || strstr(argv[1], "-h")) { usage(stdout); exit(0); } @@ -201,6 +232,7 @@ int main(int argc, char *argv[]) { /* read options */ while(imode & 0x00f0) >> 4; + fcpu = (file->mode & FM_CPU2) >> 4; + if (verbose) { + printf("Matching file %s with CPU %s (%d) to target %s (%d) ...\n", + file->fname, cpunames[fcpu], fcpu, cpunames[trgcpu], trgcpu); + } switch (fcpu) { case 0x0: // bare minimum documented 6502 is just fine break; @@ -350,17 +376,26 @@ int main(int argc, char *argv[]) { if (trgmode & 0x8000 || trgcpu == 5) { fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) " "is incompatible with previous 65816 CPU mode\n", - file->fname, fcpu, modenames[fcpu]); + file->fname, fcpu, cpunames[fcpu]); er = 1; } // fall-through case 0x2: // 65SC02 - CMOS without BBR/BBS/RMB/SMB, compatible with 65816 - case 0x5: // 65816 in 6502 emulation mode if (trgcpu == 4) { // is incompatible with nmos6502 with undocumented opcodes fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) " "is incompatible with previous files with mode %d (%s)\n", - file->fname, fcpu, modenames[fcpu], trgcpu, modenames[trgcpu]); + file->fname, fcpu, cpunames[fcpu], trgcpu, cpunames[trgcpu]); + er = 1; + } + break; + + case 0x5: // 65816 in 6502 emulation mode + if (trgcpu == 1 || trgcpu == 3) { + // 65C02 and 65CE02 are incompatible with nmos6502 with undocumented opcodes + fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) is " + "incompatible with previous files with mode %d (%s)\n", + file->fname, fcpu, cpunames[fcpu], trgcpu, cpunames[trgcpu]); er = 1; } break; @@ -370,19 +405,19 @@ int main(int argc, char *argv[]) { // is incompatible with nmos6502 with undocumented opcodes fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) is " "incompatible with previous files with mode %d (%s)\n", - file->fname, fcpu, modenames[fcpu], trgcpu, modenames[trgcpu]); + file->fname, fcpu, cpunames[fcpu], trgcpu, cpunames[trgcpu]); er = 1; } if (trgmode & 0x8000) { fprintf(stderr, "Error: file '%s' in mode %d (%s) is incompatible with previous 65816 CPU mode\n", - file->fname, 4, modenames[4]); + file->fname, 4, cpunames[4]); er = 1; } break; default: if (fcpu > 5) { printf("Warning: unknown CPU mode %d (%s) detected in file %s\n", - fcpu, modenames[fcpu], file->fname); + fcpu, cpunames[fcpu], file->fname); } break; } @@ -412,10 +447,15 @@ int main(int argc, char *argv[]) { } break; } + if (verbose && !er) { + printf("... to new target %s (%d)\n", + cpunames[trgcpu], trgcpu); + } } if (er) { exit(1); } + trgmode |= trgcpu << 4; } if (maxalign) { printf("Info: Alignment at %d-boundaries required\n", maxalign + 1); @@ -515,7 +555,7 @@ printf("zbase=%04x+len=%04x->%04x, file->zbase=%04x, f.zlen=%04x -> zdiff=%04x\n */ if (verbose > 0) { - printf("Relocating file: %s\n", file->fname); + printf("Relocating file: %s [CPU %s]\n", file->fname, cpunames[((file->mode & FM_CPU2) >> 4) & 0x0f]); printf(" text: align fill %04x, relocate from %04x to %04x (diff is %04x, length is %04x)\n", file->talign, file->tbase, file->tbase + file->tdiff, file->tdiff, file->tlen); printf(" data: align fill %04x, relocate from %04x to %04x (diff is %04x, length is %04x)\n", diff --git a/xa/misc/reloc65.c b/xa/misc/reloc65.c index 7d4dec6..11195c2 100644 --- a/xa/misc/reloc65.c +++ b/xa/misc/reloc65.c @@ -34,6 +34,21 @@ #define author "Written by Andre Fachat" #define copyright "Copyright (C) 1997-2002 Andre Fachat." +/* o65 file format mode bits */ +#define FM_OBJ 0x1000 +#define FM_SIZE 0x2000 +#define FM_RELOC 0x4000 +#define FM_CPU 0x8000 + +#define FM_CPU2 0x00f0 + +#define FM_CPU2_6502 0x0000 +#define FM_CPU2_65C02 0x0010 +#define FM_CPU2_65SC02 0x0020 +#define FM_CPU2_65CE02 0x0030 +#define FM_CPU2_NMOS 0x0040 +#define FM_CPU2_65816E 0x0050 + typedef struct { char *fname; size_t fsize; @@ -74,13 +89,32 @@ void usage(FILE *fp) " -X extracts the file such that text and data\n" " segments are chained, i.e. possibly relocating\n" " the data segment to the end of the text segment\n" + " -C Set the o65 CPU flags in the output for the following CPUs:\n" + " 6502, 65SC02, 65C02, 65CE02, 65816, NMOS6502\n" + " (for details see the man page)\n" " -v verbose output\n" " --version output version information and exit\n" " --help display this help and exit\n"); } +const char *cpunames[16] = { + "6502", + "65C02", + "65SC02", + "65CE02", + "NMOS6502", + "65816", + NULL, NULL, + "6809", NULL, // 1000 - + "Z80", NULL, NULL, // 1010 - + "8086", // 1101 - + "80286", // 1110 - + NULL +}; + int main(int argc, char *argv[]) { int i = 1, mode, hlen; + int j; size_t n; FILE *fp; int tflag = 0, dflag = 0, bflag = 0, zflag = 0; @@ -89,13 +123,15 @@ int main(int argc, char *argv[]) { char *outfile = "a.o65"; int extract = 0; int verbose = 0; + int trgcpu = -1; // output file target CPU flag (-1 = do not change) + char *arg; // temporary argument pointer if (argc <= 1) { usage(stderr); exit(1); } - if (strstr(argv[1], "--help") || strstr(argv[1], "-?")) { + if (strstr(argv[1], "--help") || strstr(argv[1], "-?") || strstr(argv[1], "-h")) { usage(stdout); exit(0); } @@ -106,6 +142,7 @@ int main(int argc, char *argv[]) { } while(i=file.fsize) && (!memcmp(file.buf, cmp, 5))) { mode=file.buf[7]*256+file.buf[6]; - if(mode & 0x2000) { + if(mode & FM_SIZE) { fprintf(stderr,"reloc65: %s: 32 bit size not supported\n", argv[i]); } else - if(mode & 0x4000) { + if(mode & FM_RELOC) { fprintf(stderr,"reloc65: %s: pagewise relocation not supported\n", argv[i]); } else { + if (trgcpu >= 0) { + // change CPU flags + mode &= ~FM_CPU; + mode &= ~FM_CPU2; + mode |= (trgcpu << 4); + if (trgcpu == 5) { + // this trgcpu is actually 65816 in emulation mode + // unsure if we should do an own cmdline option + mode |= FM_CPU; // 65816 native + } + } + file.buf[6] = mode & 0xff; + file.buf[7] = (mode >> 8) & 0xff; + hlen = BUF+read_options(file.buf+BUF); file.tbase = file.buf[ 9]*256+file.buf[ 8]; diff --git a/xa/tests/mode/Makefile b/xa/tests/mode/Makefile index 20805d4..148e4fe 100644 --- a/xa/tests/mode/Makefile +++ b/xa/tests/mode/Makefile @@ -6,8 +6,10 @@ VERBOSE= XA=../../xa LDO=../../ldo65 +RELOC=../../reloc65 +FILE=../../file65 -all: test1 test2 test3 test4 +all: test1 test2 test3 test4 cpus relocsame overwrite linkup1 linkup2 %.o65: %.a65 ${XA} -R -o $@ $< @@ -17,7 +19,6 @@ test1: ${FILES} ${LDO} ${VERBOSE} -o $@.o65 $^ cmp $@.o65 $@.ok - # test with files in order of decreasing align test2: ${FILES} ${LDO} ${VERBOSE} -o $@.o65 ab256.o65 ab4.o65 ab2.o65 ab1.o65 ad256.o65 ad4.o65 ad2.o65 ad1.o65 at256.o65 at4.o65 at2.o65 at1.o65 @@ -35,6 +36,70 @@ test4: ${FILES} ${LDO} ${VERBOSE} -bt 1027 -bd 1027 -o $@.o65 ab2.o65 at2.o65 ad2.o65 ab4.o65 at4.o65 ad4.o65 ad256.o65 at256.o65 ab256.o65 || exit 0 && exit 1 ${LDO} ${VERBOSE} -bt 1028 -bd 1028 -o $@.o65 ab2.o65 at2.o65 ad2.o65 ab4.o65 at4.o65 ad4.o65 ad256.o65 at256.o65 ab256.o65 || exit 0 && exit 1 +c6502: at2.o65 ad4.o65 + for i in $^; do ${RELOC} -C 6502 -o $@-$$i $$i; done + cmp $@-at2.o65 $@-at2.ok + cmp $@-ad4.o65 $@-ad4.ok + +c65c02: at2.o65 ad4.o65 + for i in $^; do ${RELOC} -C 65C02 -o $@-$$i $$i; done + cmp $@-at2.o65 $@-at2.ok + cmp $@-ad4.o65 $@-ad4.ok + +c65ce02: at2.o65 ad4.o65 + for i in $^; do ${RELOC} -C 65CE02 -o $@-$$i $$i; done + cmp $@-at2.o65 $@-at2.ok + cmp $@-ad4.o65 $@-ad4.ok + +c65sc02: at2.o65 ad4.o65 + for i in $^; do ${RELOC} -C 65SC02 -o $@-$$i $$i; done + cmp $@-at2.o65 $@-at2.ok + cmp $@-ad4.o65 $@-ad4.ok + +c65816: at2.o65 ad4.o65 + for i in $^; do ${RELOC} -C 65816 -o $@-$$i $$i; done + cmp $@-at2.o65 $@-at2.ok + cmp $@-ad4.o65 $@-ad4.ok + +n6502: at2.o65 ad4.o65 + for i in $^; do ${RELOC} -C NMOS6502 -o $@-$$i $$i; done + cmp $@-at2.o65 $@-at2.ok + cmp $@-ad4.o65 $@-ad4.ok + +cpus: c65816 c6502 n6502 c65sc02 c65c02 c65ce02 + # prereq for the following + +relocsame: + ${RELOC} -o $@.o65 c65816-ad4.o65 + cmp $@.o65 c65816-ad4.o65 + ${RELOC} -o $@.o65 c65sc02-at2.o65 + cmp $@.o65 c65sc02-at2.o65 + +overwrite: + # overwrite 65816 with nmos 6502 + ${RELOC} -C NMOS6502 -o $@-1.o65 c65816-at2.o65 + cmp $@-1.o65 n6502-at2.o65 + # overwrite 65sc02 with 65c02 + ${RELOC} -C 65C02 -o $@-2.o65 c65sc02-ad4.o65 + cmp $@-2.o65 c65c02-ad4.o65 + +linkup1: + ${LDO} -v -o $@.o65 c6502-ad4.o65 c65c02-at2.o65 c65sc02-ad4.o65 + ${FILE} $@.o65 > $@.tmp + cmp $@.tmp $@.ok + +linkup2: + # incompatible links + ${LDO} ${VERBOSE} -o $@.o65 c6502-ad4.o65 c65c02-at2.o65 c65816-ad4.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 c6502-ad4.o65 c65ce02-at2.o65 c65816-ad4.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 c6502-ad4.o65 c65816-at2.o65 c65c02-ad4.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 c6502-ad4.o65 c65816-at2.o65 c65ce02-ad4.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 c65816-at2.o65 c65ce02-ad4.o65 c65c02-at2.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 n6502-at2.o65 c65ce02-ad4.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 n6502-at2.o65 c65c02-ad4.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 n6502-at2.o65 c65sc02-ad4.o65 || exit 0 && exit 1 + ${LDO} ${VERBOSE} -o $@.o65 n6502-at2.o65 c65816-ad4.o65 || exit 0 && exit 1 + clean: - rm -f *.o65 + rm -f *.o65 *.tmp diff --git a/xa/tests/mode/c6502-ad4.ok b/xa/tests/mode/c6502-ad4.ok new file mode 100644 index 0000000000000000000000000000000000000000..e3d425548bf4c058cea1d0621a0de7faa75565d7 GIT binary patch literal 34 ecmZQ%$Tu@(U}9hpU|?WiVPs%%08&6E0ssIZi~%wU}RumVPIfzfKWiz2_Oan06i=M&Hw-a literal 0 HcmV?d00001 diff --git a/xa/tests/mode/c65c02-ad4.ok b/xa/tests/mode/c65c02-ad4.ok new file mode 100644 index 0000000000000000000000000000000000000000..580ef61c8b3ad698bef00217a6793779d8e29232 GIT binary patch literal 34 ecmZQ%$Tu@(5Mp2uU|?WiVPs%%08&6E0ssIbOaVs# literal 0 HcmV?d00001 diff --git a/xa/tests/mode/c65c02-at2.ok b/xa/tests/mode/c65c02-at2.ok new file mode 100644 index 0000000000000000000000000000000000000000..e4e0f7fc5cf2ada759aa740e37e61c5e885df705 GIT binary patch literal 34 gcmZQ%$Tu@(5M*EwU}RumVPIfzfKWiz2_Oan04S^i4gdfE literal 0 HcmV?d00001 diff --git a/xa/tests/mode/c65ce02-ad4.ok b/xa/tests/mode/c65ce02-ad4.ok new file mode 100644 index 0000000000000000000000000000000000000000..b2b721399d6c19b9b06c1ab1c54e60bde884621f GIT binary patch literal 34 ecmZQ%$Tu@(Fk)a3U|?WiVPs%%08&6E0ssIe%mHTr literal 0 HcmV?d00001 diff --git a/xa/tests/mode/c65ce02-at2.ok b/xa/tests/mode/c65ce02-at2.ok new file mode 100644 index 0000000000000000000000000000000000000000..a19d3efe4462a9ee9de2feb163a2e91f657e09eb GIT binary patch literal 34 gcmZQ%$Tu@(Fl1m5U}RumVPIfzfKWiz2_Oan04yv5E&u=k literal 0 HcmV?d00001 diff --git a/xa/tests/mode/c65sc02-ad4.ok b/xa/tests/mode/c65sc02-ad4.ok new file mode 100644 index 0000000000000000000000000000000000000000..ba08ed70407451bff7e9e0efb6e22e1fca0acc88 GIT binary patch literal 34 ecmZQ%$Tu@(P-0*ZU|?WiVPs%%08&6E0ssId3;|aF literal 0 HcmV?d00001 diff --git a/xa/tests/mode/c65sc02-at2.ok b/xa/tests/mode/c65sc02-at2.ok new file mode 100644 index 0000000000000000000000000000000000000000..19d8e6d55816f941810df735917831e395bdf30d GIT binary patch literal 34 gcmZQ%$Tu@(P-I{bU}RumVPIfzfKWiz2_Oan04i((9smFU literal 0 HcmV?d00001 diff --git a/xa/tests/mode/linkup1.ok b/xa/tests/mode/linkup1.ok new file mode 100644 index 0000000..3799b9c --- /dev/null +++ b/xa/tests/mode/linkup1.ok @@ -0,0 +1,7 @@ +linkup1.o65: o65 version 0 executable file + mode: 0012 =[executable][16bit][byte relocation][CPU 6502][CPU2 65C02][align 4] + text segment @ $0400 - $0401 [$0001 bytes] + data segment @ $1000 - $1005 [$0005 bytes] + bss segment @ $4000 - $4000 [$0000 bytes] + zero segment @ $0002 - $0002 [$0000 bytes] + stack size $0000 bytes (i.e. unknown) diff --git a/xa/tests/mode/n6502-ad4.ok b/xa/tests/mode/n6502-ad4.ok new file mode 100644 index 0000000000000000000000000000000000000000..346fa6983c25708cc3b67edc245ed551b585db3e GIT binary patch literal 34 ecmZQ%$Tu@(aAIH(U|?WiVPs%%08&6E0ssIgi~)B5 literal 0 HcmV?d00001 diff --git a/xa/tests/mode/n6502-at2.ok b/xa/tests/mode/n6502-at2.ok new file mode 100644 index 0000000000000000000000000000000000000000..10fec82f429e5e73c1ad308ba9ae58b86eb96afd GIT binary patch literal 34 gcmZQ%$Tu@(aAaT*U}RumVPIfzfKWiz2_Oan04?kSJ^%m! literal 0 HcmV?d00001