mirror of
https://github.com/fachat/xa65.git
synced 2024-06-08 23:29:30 +00:00
CPU handling in file65, reloc65, and ldo65
This commit is contained in:
parent
cc03ac80be
commit
e51b1e7f41
|
@ -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
|
bss segment to the end of the data segment
|
||||||
(\-xd and \-xb options override the derived address) before extracting.
|
(\-xd and \-xb options override the derived address) before extracting.
|
||||||
.TP
|
.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
|
.B \-\-help
|
||||||
Show summary of options.
|
Show summary of options.
|
||||||
.TP
|
.TP
|
||||||
|
|
|
@ -37,6 +37,36 @@
|
||||||
#define author "Written by Andre Fachat"
|
#define author "Written by Andre Fachat"
|
||||||
#define copyright "Copyright (C) 1997-2002 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 read_options(FILE *fp);
|
||||||
int print_labels(FILE *fp, int offset);
|
int print_labels(FILE *fp, int offset);
|
||||||
|
|
||||||
|
@ -81,7 +111,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
i = 1;
|
i = 1;
|
||||||
|
|
||||||
if (strstr(argv[i], "--help") || strstr(argv[i], "-?")) {
|
if (strstr(argv[i], "--help") || strstr(argv[i], "-?") || strstr(argv[i], "-h")) {
|
||||||
usage(stdout);
|
usage(stdout);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
@ -114,7 +144,7 @@ int main(int argc, char *argv[]) {
|
||||||
xapar = 1;
|
xapar = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -127,11 +157,12 @@ int main(int argc, char *argv[]) {
|
||||||
printf("%s: o65 version %d %s file\n", argv[i], hdr[5],
|
printf("%s: o65 version %d %s file\n", argv[i], hdr[5],
|
||||||
hdr[7]&0x10 ? "object" : "executable");
|
hdr[7]&0x10 ? "object" : "executable");
|
||||||
printf(" mode: %04x =",mode );
|
printf(" mode: %04x =",mode );
|
||||||
printf("%s%s%s%s%s\n",
|
printf("[%s][%sbit][%s relocation][CPU %s][CPU2 %s]%s\n",
|
||||||
(mode & 0x1000)?"[object]":"[executable]",
|
(mode & 0x1000)?"object":"executable",
|
||||||
(mode & 0x2000)?"[32bit]":"[16bit]",
|
(mode & 0x2000)?"32":"16",
|
||||||
(mode & 0x4000)?"[page relocation]":"[byte relocation]",
|
(mode & 0x4000)?"page":"byte",
|
||||||
(mode & 0x8000)?"[CPU 65816]":"[CPU 6502]",
|
(mode & 0x8000)?"65816":"6502",
|
||||||
|
cpunames[(mode & FM_CPU2) >> 4],
|
||||||
aligntxt[mode & 3]);
|
aligntxt[mode & 3]);
|
||||||
}
|
}
|
||||||
if(mode & 0x2000) {
|
if(mode & 0x2000) {
|
||||||
|
|
|
@ -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 {
|
typedef struct {
|
||||||
char *name;
|
char *name;
|
||||||
int len;
|
int len;
|
||||||
|
@ -133,6 +149,21 @@ file65 file;
|
||||||
unsigned char cmp[] = { 1, 0, 'o', '6', '5' };
|
unsigned char cmp[] = { 1, 0, 'o', '6', '5' };
|
||||||
unsigned char hdr[26] = { 1, 0, 'o', '6', '5', 0 };
|
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;
|
int verbose = 0;
|
||||||
|
|
||||||
void usage(FILE *fp)
|
void usage(FILE *fp)
|
||||||
|
@ -189,7 +220,7 @@ int main(int argc, char *argv[]) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strstr(argv[1], "--help") || strstr(argv[1], "-?")) {
|
if (strstr(argv[1], "--help") || strstr(argv[1], "-?") || strstr(argv[1], "-h")) {
|
||||||
usage(stdout);
|
usage(stdout);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
@ -201,6 +232,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
/* read options */
|
/* read options */
|
||||||
while(i<argc && argv[i][0]=='-') {
|
while(i<argc && argv[i][0]=='-') {
|
||||||
|
arg = NULL;
|
||||||
/* process options */
|
/* process options */
|
||||||
switch(argv[i][1]) {
|
switch(argv[i][1]) {
|
||||||
case 'v':
|
case 'v':
|
||||||
|
@ -271,7 +303,7 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr,"file65: %s unknown option, use '-?' for help\n",argv[i]);
|
fprintf(stderr,"file65: %s unknown option, use '-h for help\n",argv[i]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
@ -305,20 +337,10 @@ int main(int argc, char *argv[]) {
|
||||||
{
|
{
|
||||||
int er = 0;
|
int er = 0;
|
||||||
int trgcpu = 0;
|
int trgcpu = 0;
|
||||||
const char *modenames[16] = {
|
if (verbose) {
|
||||||
"documented 6502",
|
printf("Starting CPU type calculation with mode %s (%d) ...\n",
|
||||||
"65C02 (CMOS with BBR/BBS/RMB/SMB)",
|
cpunames[trgcpu], trgcpu);
|
||||||
"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"
|
|
||||||
};
|
|
||||||
for(i=0;i<j;i++) {
|
for(i=0;i<j;i++) {
|
||||||
int fcpu;
|
int fcpu;
|
||||||
file = fp[i];
|
file = fp[i];
|
||||||
|
@ -340,7 +362,11 @@ int main(int argc, char *argv[]) {
|
||||||
trgmode |= 0x0200;
|
trgmode |= 0x0200;
|
||||||
}
|
}
|
||||||
// CPU bits
|
// CPU bits
|
||||||
fcpu = (file->mode & 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) {
|
switch (fcpu) {
|
||||||
case 0x0: // bare minimum documented 6502 is just fine
|
case 0x0: // bare minimum documented 6502 is just fine
|
||||||
break;
|
break;
|
||||||
|
@ -350,17 +376,26 @@ int main(int argc, char *argv[]) {
|
||||||
if (trgmode & 0x8000 || trgcpu == 5) {
|
if (trgmode & 0x8000 || trgcpu == 5) {
|
||||||
fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) "
|
fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) "
|
||||||
"is incompatible with previous 65816 CPU mode\n",
|
"is incompatible with previous 65816 CPU mode\n",
|
||||||
file->fname, fcpu, modenames[fcpu]);
|
file->fname, fcpu, cpunames[fcpu]);
|
||||||
er = 1;
|
er = 1;
|
||||||
}
|
}
|
||||||
// fall-through
|
// fall-through
|
||||||
case 0x2: // 65SC02 - CMOS without BBR/BBS/RMB/SMB, compatible with 65816
|
case 0x2: // 65SC02 - CMOS without BBR/BBS/RMB/SMB, compatible with 65816
|
||||||
case 0x5: // 65816 in 6502 emulation mode
|
|
||||||
if (trgcpu == 4) {
|
if (trgcpu == 4) {
|
||||||
// is incompatible with nmos6502 with undocumented opcodes
|
// is incompatible with nmos6502 with undocumented opcodes
|
||||||
fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) "
|
fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) "
|
||||||
"is incompatible with previous files with mode %d (%s)\n",
|
"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;
|
er = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -370,19 +405,19 @@ int main(int argc, char *argv[]) {
|
||||||
// is incompatible with nmos6502 with undocumented opcodes
|
// is incompatible with nmos6502 with undocumented opcodes
|
||||||
fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) is "
|
fprintf(stderr, "Error: file '%s' in CPU mode %d (%s) is "
|
||||||
"incompatible with previous files with mode %d (%s)\n",
|
"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;
|
er = 1;
|
||||||
}
|
}
|
||||||
if (trgmode & 0x8000) {
|
if (trgmode & 0x8000) {
|
||||||
fprintf(stderr, "Error: file '%s' in mode %d (%s) is incompatible with previous 65816 CPU mode\n",
|
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;
|
er = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (fcpu > 5) {
|
if (fcpu > 5) {
|
||||||
printf("Warning: unknown CPU mode %d (%s) detected in file %s\n",
|
printf("Warning: unknown CPU mode %d (%s) detected in file %s\n",
|
||||||
fcpu, modenames[fcpu], file->fname);
|
fcpu, cpunames[fcpu], file->fname);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -412,10 +447,15 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (verbose && !er) {
|
||||||
|
printf("... to new target %s (%d)\n",
|
||||||
|
cpunames[trgcpu], trgcpu);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (er) {
|
if (er) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
trgmode |= trgcpu << 4;
|
||||||
}
|
}
|
||||||
if (maxalign) {
|
if (maxalign) {
|
||||||
printf("Info: Alignment at %d-boundaries required\n", maxalign + 1);
|
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) {
|
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",
|
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);
|
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",
|
printf(" data: align fill %04x, relocate from %04x to %04x (diff is %04x, length is %04x)\n",
|
||||||
|
|
|
@ -34,6 +34,21 @@
|
||||||
#define author "Written by Andre Fachat"
|
#define author "Written by Andre Fachat"
|
||||||
#define copyright "Copyright (C) 1997-2002 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 {
|
typedef struct {
|
||||||
char *fname;
|
char *fname;
|
||||||
size_t fsize;
|
size_t fsize;
|
||||||
|
@ -74,13 +89,32 @@ void usage(FILE *fp)
|
||||||
" -X extracts the file such that text and data\n"
|
" -X extracts the file such that text and data\n"
|
||||||
" segments are chained, i.e. possibly relocating\n"
|
" segments are chained, i.e. possibly relocating\n"
|
||||||
" the data segment to the end of the text segment\n"
|
" the data segment to the end of the text segment\n"
|
||||||
|
" -C <CPU> 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"
|
" -v verbose output\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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 main(int argc, char *argv[]) {
|
||||||
int i = 1, mode, hlen;
|
int i = 1, mode, hlen;
|
||||||
|
int j;
|
||||||
size_t n;
|
size_t n;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int tflag = 0, dflag = 0, bflag = 0, zflag = 0;
|
int tflag = 0, dflag = 0, bflag = 0, zflag = 0;
|
||||||
|
@ -89,13 +123,15 @@ int main(int argc, char *argv[]) {
|
||||||
char *outfile = "a.o65";
|
char *outfile = "a.o65";
|
||||||
int extract = 0;
|
int extract = 0;
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
|
int trgcpu = -1; // output file target CPU flag (-1 = do not change)
|
||||||
|
char *arg; // temporary argument pointer
|
||||||
|
|
||||||
if (argc <= 1) {
|
if (argc <= 1) {
|
||||||
usage(stderr);
|
usage(stderr);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strstr(argv[1], "--help") || strstr(argv[1], "-?")) {
|
if (strstr(argv[1], "--help") || strstr(argv[1], "-?") || strstr(argv[1], "-h")) {
|
||||||
usage(stdout);
|
usage(stdout);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
@ -106,6 +142,7 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
while(i<argc) {
|
while(i<argc) {
|
||||||
|
arg = NULL;
|
||||||
if(argv[i][0]=='-') {
|
if(argv[i][0]=='-') {
|
||||||
/* process options */
|
/* process options */
|
||||||
switch(argv[i][1]) {
|
switch(argv[i][1]) {
|
||||||
|
@ -166,8 +203,27 @@ int main(int argc, char *argv[]) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'C':
|
||||||
|
if(argv[i][2]) arg=argv[i]+2;
|
||||||
|
else if(i + 1 < argc) arg=argv[++i];
|
||||||
|
if (arg == NULL) {
|
||||||
|
printf("Missing CPU parameter to -C - ignored\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
if (cpunames[j] != NULL && !strcmp(arg, cpunames[j])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (j == 16) {
|
||||||
|
printf("Unknown CPU identifier '%s' for -C - ignored\n",
|
||||||
|
arg);
|
||||||
|
} else {
|
||||||
|
trgcpu = j;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr,"%s: %s unknown option, use '-?' for help\n",programname,argv[i]);
|
fprintf(stderr,"%s: %s unknown option, use '-h' for help\n",programname,argv[i]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -187,12 +243,26 @@ int main(int argc, char *argv[]) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
if((n>=file.fsize) && (!memcmp(file.buf, cmp, 5))) {
|
if((n>=file.fsize) && (!memcmp(file.buf, cmp, 5))) {
|
||||||
mode=file.buf[7]*256+file.buf[6];
|
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]);
|
fprintf(stderr,"reloc65: %s: 32 bit size not supported\n", argv[i]);
|
||||||
} else
|
} else
|
||||||
if(mode & 0x4000) {
|
if(mode & FM_RELOC) {
|
||||||
fprintf(stderr,"reloc65: %s: pagewise relocation not supported\n", argv[i]);
|
fprintf(stderr,"reloc65: %s: pagewise relocation not supported\n", argv[i]);
|
||||||
} else {
|
} 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);
|
hlen = BUF+read_options(file.buf+BUF);
|
||||||
|
|
||||||
file.tbase = file.buf[ 9]*256+file.buf[ 8];
|
file.tbase = file.buf[ 9]*256+file.buf[ 8];
|
||||||
|
|
|
@ -6,8 +6,10 @@ VERBOSE=
|
||||||
|
|
||||||
XA=../../xa
|
XA=../../xa
|
||||||
LDO=../../ldo65
|
LDO=../../ldo65
|
||||||
|
RELOC=../../reloc65
|
||||||
|
FILE=../../file65
|
||||||
|
|
||||||
all: test1 test2 test3 test4
|
all: test1 test2 test3 test4 cpus relocsame overwrite linkup1 linkup2
|
||||||
|
|
||||||
%.o65: %.a65
|
%.o65: %.a65
|
||||||
${XA} -R -o $@ $<
|
${XA} -R -o $@ $<
|
||||||
|
@ -17,7 +19,6 @@ test1: ${FILES}
|
||||||
${LDO} ${VERBOSE} -o $@.o65 $^
|
${LDO} ${VERBOSE} -o $@.o65 $^
|
||||||
cmp $@.o65 $@.ok
|
cmp $@.o65 $@.ok
|
||||||
|
|
||||||
|
|
||||||
# test with files in order of decreasing align
|
# test with files in order of decreasing align
|
||||||
test2: ${FILES}
|
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
|
${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 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
|
${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:
|
clean:
|
||||||
rm -f *.o65
|
rm -f *.o65 *.tmp
|
||||||
|
|
||||||
|
|
BIN
xa/tests/mode/c6502-ad4.ok
Normal file
BIN
xa/tests/mode/c6502-ad4.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c6502-at2.ok
Normal file
BIN
xa/tests/mode/c6502-at2.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65816-ad4.ok
Normal file
BIN
xa/tests/mode/c65816-ad4.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65816-at2.ok
Normal file
BIN
xa/tests/mode/c65816-at2.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65c02-ad4.ok
Normal file
BIN
xa/tests/mode/c65c02-ad4.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65c02-at2.ok
Normal file
BIN
xa/tests/mode/c65c02-at2.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65ce02-ad4.ok
Normal file
BIN
xa/tests/mode/c65ce02-ad4.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65ce02-at2.ok
Normal file
BIN
xa/tests/mode/c65ce02-at2.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65sc02-ad4.ok
Normal file
BIN
xa/tests/mode/c65sc02-ad4.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/c65sc02-at2.ok
Normal file
BIN
xa/tests/mode/c65sc02-at2.ok
Normal file
Binary file not shown.
7
xa/tests/mode/linkup1.ok
Normal file
7
xa/tests/mode/linkup1.ok
Normal file
|
@ -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)
|
BIN
xa/tests/mode/n6502-ad4.ok
Normal file
BIN
xa/tests/mode/n6502-ad4.ok
Normal file
Binary file not shown.
BIN
xa/tests/mode/n6502-at2.ok
Normal file
BIN
xa/tests/mode/n6502-at2.ok
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user