mirror of
https://github.com/nanochess/pretty6502.git
synced 2024-12-27 00:29:18 +00:00
Added support for Z80 processor and tniASM. Solved bug in apostrophe processing
This commit is contained in:
parent
f3b66b8a31
commit
a1c8fa13fb
11
README
11
README
@ -6,26 +6,35 @@ Usage:
|
|||||||
pretty6502 [args] input.asm output.asm
|
pretty6502 [args] input.asm output.asm
|
||||||
|
|
||||||
DON'T USE SAME OUTPUT FILE AS INPUT, though it's possible,
|
DON'T USE SAME OUTPUT FILE AS INPUT, though it's possible,
|
||||||
you can DAMAGE YOUR SOURCE if this program has bugs.
|
you can DAMAGE YOUR SOURCE if Pretty6502 has undiscovered
|
||||||
|
bugs.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
-s0 Code in four columns (default)
|
-s0 Code in four columns (default)
|
||||||
label: mnemonic operand comment
|
label: mnemonic operand comment
|
||||||
-s1 Code in three columns
|
-s1 Code in three columns
|
||||||
label: mnemonic+operand comment
|
label: mnemonic+operand comment
|
||||||
|
|
||||||
-p0 Processor unknown.
|
-p0 Processor unknown.
|
||||||
-p1 Processor 6502 + DASM syntax (default)
|
-p1 Processor 6502 + DASM syntax (default)
|
||||||
|
-p2 Processor Z80 + tniASM syntax
|
||||||
|
|
||||||
-m8 Start of mnemonic column (default)
|
-m8 Start of mnemonic column (default)
|
||||||
-o16 Start of operand column (default)
|
-o16 Start of operand column (default)
|
||||||
-c32 Start of comment column (default)
|
-c32 Start of comment column (default)
|
||||||
|
|
||||||
-t8 Use tabs of size 8 to reach column
|
-t8 Use tabs of size 8 to reach column
|
||||||
-t0 Use spaces to align (default)
|
-t0 Use spaces to align (default)
|
||||||
|
|
||||||
-a0 Align comments to nearest column
|
-a0 Align comments to nearest column
|
||||||
-a1 Comments at line start are aligned
|
-a1 Comments at line start are aligned
|
||||||
to mnemonic (default)
|
to mnemonic (default)
|
||||||
|
|
||||||
-n4 Nesting spacing (can be any number
|
-n4 Nesting spacing (can be any number
|
||||||
of spaces or multiple of tab size)
|
of spaces or multiple of tab size)
|
||||||
|
|
||||||
-l Put labels in its own line
|
-l Put labels in its own line
|
||||||
|
|
||||||
-dl Change directives to lowercase
|
-dl Change directives to lowercase
|
||||||
-du Change directives to uppercase
|
-du Change directives to uppercase
|
||||||
-ml Change mnemonics to lowercase
|
-ml Change mnemonics to lowercase
|
||||||
|
106
pretty6502.c
106
pretty6502.c
@ -10,6 +10,8 @@
|
|||||||
** Tries to preserve vertical structure of comments.
|
** Tries to preserve vertical structure of comments.
|
||||||
** Allows label in its own line. Allows to change case
|
** Allows label in its own line. Allows to change case
|
||||||
** of mnemonics and directives.
|
** of mnemonics and directives.
|
||||||
|
** Revision date: Apr/16/2018. Added support for Z80 + tniASM. Solved bug in
|
||||||
|
** processing of apostrophe in operand.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -19,6 +21,7 @@
|
|||||||
|
|
||||||
#define VERSION "v0.2"
|
#define VERSION "v0.2"
|
||||||
int tabs;
|
int tabs;
|
||||||
|
int processor;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** 6502 mnemonics
|
** 6502 mnemonics
|
||||||
@ -36,6 +39,21 @@ char *mnemonics_6502[] = {
|
|||||||
"txa", "txs", "tya", NULL,
|
"txa", "txs", "tya", NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Z80 mnemonics
|
||||||
|
*/
|
||||||
|
char *mnemonics_z80[] = {
|
||||||
|
"adc", "add", "and", "bit", "call", "ccf", "cp", "cpd",
|
||||||
|
"cpdr", "cpi", "cpir", "cpl", "daa", "dec", "di", "djnz",
|
||||||
|
"ei", "ex", "exx", "halt", "im", "in", "inc", "ind",
|
||||||
|
"indr", "ini", "inir", "jp", "jr", "ld", "ldd", "lddr",
|
||||||
|
"ldi", "ldir", "neg", "nop", "or", "otdr", "otir", "out",
|
||||||
|
"outd", "outi", "pop", "push", "res", "ret", "reti", "retn",
|
||||||
|
"rl", "rla", "rlc", "rlca", "rld", "rr", "rra", "rrc",
|
||||||
|
"rrca", "rrd", "rst", "sbc", "scf", "set", "sla", "sra",
|
||||||
|
"srl", "sub", "xor", NULL,
|
||||||
|
};
|
||||||
|
|
||||||
#define DONT_RELOCATE_LABEL 0x01
|
#define DONT_RELOCATE_LABEL 0x01
|
||||||
#define LEVEL_IN 0x02
|
#define LEVEL_IN 0x02
|
||||||
#define LEVEL_OUT 0x04
|
#define LEVEL_OUT 0x04
|
||||||
@ -88,6 +106,36 @@ struct {
|
|||||||
NULL, 0,
|
NULL, 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** tniASM directives
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
char *directive;
|
||||||
|
int flags;
|
||||||
|
} directives_tniasm[] = {
|
||||||
|
"cpu", 0,
|
||||||
|
"db", 0,
|
||||||
|
"dc", 0,
|
||||||
|
"ds", 0,
|
||||||
|
"dw", 0,
|
||||||
|
"dephase", 0,
|
||||||
|
"else", LEVEL_MINUS,
|
||||||
|
"endif", LEVEL_OUT,
|
||||||
|
"equ", DONT_RELOCATE_LABEL,
|
||||||
|
"fname", 0,
|
||||||
|
"forg", 0,
|
||||||
|
"if", LEVEL_IN,
|
||||||
|
"ifdef", LEVEL_IN,
|
||||||
|
"ifexist", LEVEL_IN,
|
||||||
|
"incbin", 0,
|
||||||
|
"include", 0,
|
||||||
|
"org", 0,
|
||||||
|
"phase", 0,
|
||||||
|
"rb", 0,
|
||||||
|
"rw", 0,
|
||||||
|
NULL, 0,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Comparison without case
|
** Comparison without case
|
||||||
*/
|
*/
|
||||||
@ -110,17 +158,32 @@ int check_opcode(char *p1, char *p2)
|
|||||||
int c;
|
int c;
|
||||||
int length;
|
int length;
|
||||||
|
|
||||||
for (c = 0; directives_dasm[c].directive != NULL; c++) {
|
if (processor == 1) {
|
||||||
length = strlen(directives_dasm[c].directive);
|
for (c = 0; directives_dasm[c].directive != NULL; c++) {
|
||||||
if ((*p1 == '.' && length == p2 - p1 - 1 && memcmpcase(p1 + 1, directives_dasm[c].directive, p2 - p1 - 1) == 0) || (length == p2 - p1 && memcmpcase(p1, directives_dasm[c].directive, p2 - p1) == 0)) {
|
length = strlen(directives_dasm[c].directive);
|
||||||
return c + 1;
|
if ((*p1 == '.' && length == p2 - p1 - 1 && memcmpcase(p1 + 1, directives_dasm[c].directive, p2 - p1 - 1) == 0) || (length == p2 - p1 && memcmpcase(p1, directives_dasm[c].directive, p2 - p1) == 0)) {
|
||||||
}
|
return c + 1;
|
||||||
}
|
}
|
||||||
for (c = 0; mnemonics_6502[c] != NULL; c++) {
|
}
|
||||||
length = strlen(mnemonics_6502[c]);
|
for (c = 0; mnemonics_6502[c] != NULL; c++) {
|
||||||
if (length == p2 - p1 && memcmpcase(p1, mnemonics_6502[c], p2 - p1) == 0)
|
length = strlen(mnemonics_6502[c]);
|
||||||
return -(c + 1);
|
if (length == p2 - p1 && memcmpcase(p1, mnemonics_6502[c], p2 - p1) == 0)
|
||||||
}
|
return -(c + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (processor == 2) {
|
||||||
|
for (c = 0; directives_tniasm[c].directive != NULL; c++) {
|
||||||
|
length = strlen(directives_tniasm[c].directive);
|
||||||
|
if (length == p2 - p1 && memcmpcase(p1, directives_tniasm[c].directive, p2 - p1) == 0) {
|
||||||
|
return c + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (c = 0; mnemonics_z80[c] != NULL; c++) {
|
||||||
|
length = strlen(mnemonics_z80[c]);
|
||||||
|
if (length == p2 - p1 && memcmpcase(p1, mnemonics_z80[c], p2 - p1) == 0)
|
||||||
|
return -(c + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +226,6 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int style;
|
int style;
|
||||||
int processor;
|
|
||||||
int start_mnemonic;
|
int start_mnemonic;
|
||||||
int start_operand;
|
int start_operand;
|
||||||
int start_comment;
|
int start_comment;
|
||||||
@ -206,7 +268,8 @@ int main(int argc, char *argv[])
|
|||||||
fprintf(stderr, " -s1 Code in three columns\n");
|
fprintf(stderr, " -s1 Code in three columns\n");
|
||||||
fprintf(stderr, " label: mnemonic+operand comment\n");
|
fprintf(stderr, " label: mnemonic+operand comment\n");
|
||||||
fprintf(stderr, " -p0 Processor unknown\n");
|
fprintf(stderr, " -p0 Processor unknown\n");
|
||||||
fprintf(stderr, " -p1 Processor 6502 + DASM syntax (default)\n");
|
fprintf(stderr, " -p1 Processor 6502 + DASM syntax (default)\n");
|
||||||
|
fprintf(stderr, " -p2 Processor Z80 + tniASM syntax\n");
|
||||||
fprintf(stderr, " -m8 Start of mnemonic column (default)\n");
|
fprintf(stderr, " -m8 Start of mnemonic column (default)\n");
|
||||||
fprintf(stderr, " -o16 Start of operand column (default)\n");
|
fprintf(stderr, " -o16 Start of operand column (default)\n");
|
||||||
fprintf(stderr, " -c32 Start of comment column (default)\n");
|
fprintf(stderr, " -c32 Start of comment column (default)\n");
|
||||||
@ -265,7 +328,7 @@ int main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
case 'p': /* Processor */
|
case 'p': /* Processor */
|
||||||
processor = atoi(&argv[c][2]);
|
processor = atoi(&argv[c][2]);
|
||||||
if (processor < 0 || processor > 1) {
|
if (processor < 0 || processor > 2) {
|
||||||
fprintf(stderr, "Bad processor code: %d\n", processor);
|
fprintf(stderr, "Bad processor code: %d\n", processor);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -438,14 +501,17 @@ int main(int argc, char *argv[])
|
|||||||
p2 = p1;
|
p2 = p1;
|
||||||
while (*p2 && !isspace(*p2) && *p2 != ';')
|
while (*p2 && !isspace(*p2) && *p2 != ';')
|
||||||
p2++;
|
p2++;
|
||||||
if (processor == 1) {
|
if (processor != 0) {
|
||||||
c = check_opcode(p1, p2);
|
c = check_opcode(p1, p2);
|
||||||
if (c == 0) {
|
if (c == 0) {
|
||||||
request = start_mnemonic;
|
request = start_mnemonic;
|
||||||
} else if (c < 0) {
|
} else if (c < 0) {
|
||||||
request = start_mnemonic;
|
request = start_mnemonic;
|
||||||
} else {
|
} else {
|
||||||
flags = directives_dasm[c - 1].flags;
|
if (processor == 1)
|
||||||
|
flags = directives_dasm[c - 1].flags;
|
||||||
|
else if (processor == 2)
|
||||||
|
flags = directives_tniasm[c - 1].flags;
|
||||||
if (flags & DONT_RELOCATE_LABEL)
|
if (flags & DONT_RELOCATE_LABEL)
|
||||||
request = start_operand;
|
request = start_operand;
|
||||||
else
|
else
|
||||||
@ -518,9 +584,11 @@ int main(int argc, char *argv[])
|
|||||||
p2++;
|
p2++;
|
||||||
} else if (*p2 == '\'') {
|
} else if (*p2 == '\'') {
|
||||||
p2++;
|
p2++;
|
||||||
while (*p2 && *p2 != '"')
|
if (p2 - p1 < 6 || memcmp(p2 - 6, "AF,AF'", 6) != 0) {
|
||||||
p2++;
|
while (*p2 && *p2 != '\'')
|
||||||
p2++;
|
p2++;
|
||||||
|
p2++;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
p2++;
|
p2++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user