From ecad2b1e6c68d3fca31d7f9fd06678d390b00e77 Mon Sep 17 00:00:00 2001 From: nanochess Date: Mon, 6 Nov 2017 13:28:48 -0600 Subject: [PATCH] Indents nested preprocessor. Allows label in its own line. Tries to preserve horizontal position of comments. --- LICENSE | 22 +++++ README | 5 ++ pretty6502 | Bin 13204 -> 17612 bytes pretty6502.c | 228 ++++++++++++++++++++++++++++++++++++++++++++----- pretty6502.exe | Bin 64000 -> 67072 bytes 5 files changed, 235 insertions(+), 20 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..496122f --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2017 Oscar Toledo G. http://nanochess.org/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README b/README index 47430f6..86e0aa9 100644 --- a/README +++ b/README @@ -13,6 +13,8 @@ Arguments: label: mnemonic operand comment -s1 Code in three columns label: mnemonic+operand comment + -p0 Processor unknown. + -p1 Processor 6502 + DASM syntax (default) -m8 Start of mnemonic column (default) -o16 Start of operand column (default) -c32 Start of comment column (default) @@ -21,6 +23,9 @@ Arguments: -a0 Align comments to nearest column -a1 Comments at line start are aligned to mnemonic (default) + -n4 Nesting spacing (can be any number + of spaces or multiple of tab size) + -l Put labels in its own line Assumes all your labels are at start of line and there is space before mnemonic. diff --git a/pretty6502 b/pretty6502 index 29dcbb91516c9848912ac4af6e28bf25f286b5f4..01eaa29b384cc367a533469fcb3c4eb64e435935 100755 GIT binary patch literal 17612 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 literal 13204 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 diff --git a/pretty6502.c b/pretty6502.c index 69c46bd..02ae2d1 100644 --- a/pretty6502.c +++ b/pretty6502.c @@ -6,6 +6,7 @@ ** © Copyright 2017 Oscar Toledo G. ** ** Creation date: Nov/03/2017. +** Revision date: Nov/06/2017. Processor selection. Indents nested IF/ENDIF. Tries to preserve vertical structure of comments. Allows label in its own line. */ #include @@ -13,9 +14,113 @@ #include #include -#define VERSION "v0.1" +#define VERSION "v0.2" int tabs; +/* +** 6502 mnemonics +*/ +char *mnemonics_6502[] = { + "adc", "anc", "and", "ane", "arr", "asl", "asr", "bcc", + "bcs", "beq", "bit", "bmi", "bne", "bpl", "brk", "bvc", + "bvs", "clc", "cld", "cli", "clv", "cmp", "cpx", "cpy", + "dcp", "dec", "dex", "dey", "eor", "inc", "inx", "iny", + "isb", "jmp", "jsr", "las", "lax", "lda", "ldx", "ldy", + "lsr", "lxa", "nop", "ora", "pha", "php", "pla", "plp", + "rla", "rol", "ror", "rra", "rti", "rts", "sax", "sbc", + "sbx", "sec", "sed", "sei", "sha", "shs", "shx", "shy", + "slo", "sre", "sta", "stx", "sty", "tax", "tay", "tsx", + "txa", "txs", "tya", NULL, +}; + +#define DONT_RELOCATE_LABEL 0x01 +#define LEVEL_IN 0x02 +#define LEVEL_OUT 0x04 +#define LEVEL_MINUS 0x08 + +/* +** DASM directives +*/ +struct { + char *directive; + int flags; +} directives_dasm[] = { + "=", DONT_RELOCATE_LABEL, + "align", 0, + "byte", 0, + "dc", 0, + "ds", 0, + "dv", 0, + "echo", 0, + "eif", LEVEL_OUT, + "else", LEVEL_MINUS, + "end", 0, + "endif", LEVEL_OUT, + "endm", LEVEL_OUT, + "eqm", DONT_RELOCATE_LABEL, + "equ", DONT_RELOCATE_LABEL, + "err", 0, + "hex", 0, + "if", LEVEL_IN, + "ifconst", LEVEL_IN, + "ifnconst", LEVEL_IN, + "incbin", 0, + "incdir", 0, + "include", 0, + "list", 0, + "long", 0, + "mac", LEVEL_IN, + "mexit", 0, + "org", 0, + "processor", 0, + "rend", 0, + "repeat", LEVEL_IN, + "repend", LEVEL_OUT, + "rorg", 0, + "seg", 0, + "set", DONT_RELOCATE_LABEL, + "subroutine", DONT_RELOCATE_LABEL, + "trace", 0, + "word", 0, + NULL, 0, +}; + +/* +** Comparison without case +*/ +int memcmpcase(char *p1, char *p2, int size) +{ + while (size--) { + if (tolower(*p1) != tolower(*p2)) + return 1; + p1++; + p2++; + } + return 0; +} + +/* +** Check for opcode or directive +*/ +int check_opcode(char *p1, char *p2) +{ + int c; + int length; + + for (c = 0; directives_dasm[c].directive != NULL; c++) { + length = strlen(directives_dasm[c].directive); + 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]); + if (length == p2 - p1 && memcmpcase(p1, mnemonics_6502[c], p2 - p1) == 0) + return -(c + 1); + } + return 0; +} + /* ** Request space in line */ @@ -55,10 +160,13 @@ int main(int argc, char *argv[]) { int c; int style; + int processor; int start_mnemonic; int start_operand; int start_comment; int align_comment; + int nesting_space; + int labels_own_line; FILE *input; FILE *output; int allocation; @@ -68,6 +176,10 @@ int main(int argc, char *argv[]) char *p2; int current_column; int request; + int current_level; + int prev_comment_original_location; + int prev_comment_final_location; + int flags; /* ** Show usage if less than 3 arguments (program name counts as one) @@ -87,6 +199,8 @@ int main(int argc, char *argv[]) fprintf(stderr, " label: mnemonic operand comment\n"); fprintf(stderr, " -s1 Code in three columns\n"); fprintf(stderr, " label: mnemonic+operand comment\n"); + fprintf(stderr, " -p0 Processor unknown\n"); + fprintf(stderr, " -p1 Processor 6502 + DASM syntax (default)\n"); fprintf(stderr, " -m8 Start of mnemonic column (default)\n"); fprintf(stderr, " -o16 Start of operand column (default)\n"); fprintf(stderr, " -c32 Start of comment column (default)\n"); @@ -95,6 +209,9 @@ int main(int argc, char *argv[]) fprintf(stderr, " -a0 Align comments to nearest column\n"); fprintf(stderr, " -a1 Comments at line start are aligned\n"); fprintf(stderr, " to mnemonic (default)\n"); + fprintf(stderr, " -n4 Nesting spacing (can be any number\n"); + fprintf(stderr, " of spaces or multiple of tab size)\n"); + fprintf(stderr, " -l Puts labels in its own line\n"); fprintf(stderr, "\n"); fprintf(stderr, "Assumes all your labels are at start of line and there is space\n"); fprintf(stderr, "before mnemonic.\n"); @@ -108,11 +225,14 @@ int main(int argc, char *argv[]) ** Default settings */ style = 0; + processor = 1; start_mnemonic = 8; start_operand = 16; start_comment = 32; tabs = 0; align_comment = 1; + nesting_space = 4; + labels_own_line = 0; /* ** Process arguments @@ -131,6 +251,13 @@ int main(int argc, char *argv[]) exit(1); } break; + case 'p': /* Processor */ + processor = atoi(&argv[c][2]); + if (processor < 0 || processor > 1) { + fprintf(stderr, "Bad processor code: %d\n", processor); + exit(1); + } + break; case 'm': /* Mnemonic start */ start_mnemonic = atoi(&argv[c][2]); break; @@ -150,6 +277,12 @@ int main(int argc, char *argv[]) exit(1); } break; + case 'n': /* Nesting space */ + nesting_space = atoi(&argv[c][2]); + break; + case 'l': /* Labels in own line */ + labels_own_line = 1; + break; default: /* Other */ fprintf(stderr, "Unknown argument: %c\n", argv[c][1]); exit(1); @@ -189,6 +322,10 @@ int main(int argc, char *argv[]) fprintf(stderr, "Operand error: -m%d isn't a multiple of %d\n", start_comment, tabs); exit(1); } + if (nesting_space % tabs) { + fprintf(stderr, "Operand error: -n%d isn't a multiple of %d\n", nesting_space, tabs); + exit(1); + } } /* @@ -250,29 +387,62 @@ int main(int argc, char *argv[]) fprintf(stderr, "Unable to open output file: %s\n", argv[c]); exit(1); } + prev_comment_original_location = 0; + prev_comment_final_location = 0; + current_level = 0; p = data; while (p < data + allocation) { current_column = 0; p1 = p; - if (*p1 && !isspace(*p1) && *p1 != ';') { /* Label */ - while (*p1 && !isspace(*p1) && *p1 != ';') - p1++; - fwrite(p, sizeof(char), p1 - p, output); - current_column = p1 - p; + p2 = p1; + while (*p2 && !isspace(*p2) && *p2 != ';') + p2++; + if (p2 - p1) { /* Label */ + fwrite(p1, sizeof(char), p2 - p1, output); + current_column = p2 - p1; + p1 = p2; } else { current_column = 0; } while (*p1 && isspace(*p1)) p1++; + flags = 0; if (*p1 && *p1 != ';') { /* Mnemonic */ - if (*p1 == '=') - request = start_operand; - else - request = start_mnemonic; - request_space(output, ¤t_column, request, 1); p2 = p1; - while (*p2 && !isspace(*p2)) + while (*p2 && !isspace(*p2) && *p2 != ';') p2++; + if (processor == 1) { + c = check_opcode(p1, p2); + if (c == 0) { + request = start_mnemonic; + } else if (c < 0) { + request = start_mnemonic; + } else { + flags = directives_dasm[c - 1].flags; + if (flags & DONT_RELOCATE_LABEL) + request = start_operand; + else + request = start_mnemonic; + } + } else { + request = start_mnemonic; + } + + /* + ** Move label to own line + */ + if (current_column != 0 && labels_own_line != 0 && (flags & DONT_RELOCATE_LABEL) == 0) { + fputc('\n', output); + current_column = 0; + } + if (flags & LEVEL_OUT) { + if (current_level > 0) + current_level--; + } + request += current_level * nesting_space; + if (flags & LEVEL_MINUS) + request -= nesting_space; + request_space(output, ¤t_column, request, 1); fwrite(p1, sizeof(char), p2 - p1, output); current_column += p2 - p1; p1 = p2; @@ -280,6 +450,7 @@ int main(int argc, char *argv[]) p1++; if (*p1 && *p1 != ';') { /* Operand */ request = start_operand; + request += current_level * nesting_space; request_space(output, ¤t_column, request, 1); p2 = p1; while (*p2 && *p2 != ';') { @@ -305,16 +476,33 @@ int main(int argc, char *argv[]) while (*p1 && isspace(*p1)) p1++; } + if (flags & LEVEL_IN) { + current_level++; + } } if (*p1 == ';') { /* Comment */ - if (current_column == 0) - request = 0; - else if (current_column < start_mnemonic) - request = start_mnemonic; - else - request = start_comment; - if (current_column == 0 && align_comment == 1) - request = start_mnemonic; + + /* + ** Try to keep comments horizontally aligned (only works + ** if spaces were used in source file) + */ + p2 = p1; + while (p2 - 1 >= p && isspace(*(p2 - 1))) + p2--; + if (p2 == p && p1 - p == prev_comment_original_location) { + request = prev_comment_final_location; + } else { + prev_comment_original_location = p1 - p; + if (current_column == 0) + request = 0; + else if (current_column < start_mnemonic) + request = start_mnemonic; + else + request = start_comment; + if (current_column == 0 && align_comment == 1) + request = start_mnemonic; + prev_comment_final_location = request; + } request_space(output, ¤t_column, request, 0); p2 = p1; while (*p2) diff --git a/pretty6502.exe b/pretty6502.exe index cba50a8aa7afa03f71f029d39b545bb2c3ed52fa..8872ba1c68a9d3fe5bf7d4f43981b2cfdc6209b0 100644 GIT binary patch delta 28993 zcmd_Te?XMQ_CNmYvcRf~iwcN{xGE|N83ib~VvDj!CAx?#lA@xLE20tZ`lH0vR?78} zQm5{v0qI(Li?yy^3-&DOxUx@e84KAeTCjY$Q zf=I7!cvqx+!?Pm2yx|PeS<4pNsI27svzR4mx+*}bIwalY$F)cSsy?b-l5_%?ISTg4 z2}nbw07+_Ly;Vb1CN@?zE-?C%B*n2@_0))6ze$owAyqzGBq>_8V^|bBt?q=n-umK58ICF$;=$Y=ooDZS77s-ya@r-~&NxFPxRz4 z>uONB&03JSj)H;C^GZ^~{G!HFzCZAHwQHNqT~xcLmu&75^j&gJmuu38bDRMglBD0f z1DSGum#q1G4iFYTP^rjm?v``VmVU0w;~e8*DjZY5Cobu?hnVs+Pk(q>5(APP5j+FJJXhJG4ssJdU<}aJbfL zG?qHog{oYW9!pfA(e|03m33A0lFOI&6QZI9_tckgeSOtLHw)sjaJi?t-tqt;kBiM7 zjpxav2Kk>PxSg6P=LqP3Lv;<-M)z^eiRiOJ&^1uy-};*Ba&%VsC4HRgn_S9{bR z`PyKf5~DfKRjCcoSN}sTNw#gMkoOyo&NrAWycw$LICC+wABKI}0c_7q|N>BsK( zVNVnGV?Xv!3f5_BCiEMA^hO`CCJ@+KKep6|)e^SakDcwqW)gOdA3NEHT~F9zKQ_*X z-ALFw{n-AYPNg5)2%X|bck31GVZsjeW54%d+X>stk3H?fh6Mrpo53fEH+|Sl!v4dL z-Rr~J2-_sEP6+d1A9@d=U-1*K^kq@g42DZwNo$kXfgR|_e(l315LV^Kp7dcC64rxtNodNeKJ24} z{oIe;?ZY-W3H^>A{h$whlCUrMvE@Fjt{1S(kG;!>H4wJakInR9V+p&|j~(a3&LM2B z9~%j*6IxuV;?KoMQj@ts!XMTGl}OsPBB_Js0D0U%iI_Tg0HQ;oI!TLjlbI{XeT2je zba8c>d7r*okEtW)?89V}HCy#Zw604x*@xIRQZqh4m97RF|D7R1$Y_QEI5~eGEe5*n z`Xjk2cm7`4yw}Bx-T18BJ3#+X6>5-k_UaGqIB76R-q^?XAd$`cXaNY@h>VL~?>shnk-sB1vueg14`=t_Exj|BUjn z>T*?fN$Z2~soF3M>uRoTFR{}4S$(V{LgG|Joca(ae@9$L)w%phKd1J#pGZc&Oy_oy zyTPAZ*Y?SExk_fSKl6Co!T-q2R5EL6g=>54Ke9*q%XYXbJA^DcNEZ1WvuuZ{1I}zT zS178!rw31AtHPU8K}^tx%jCPNlFT)>&-j zRO(Brgz9~|x6nT-mLQ59zrI)q6+?TE&$8{NVm1C^ww}s5F}kw(

gEj*cPJ4uDg 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 OX-&WuUfKhVGW{Q$hrg%* delta 26167 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