diff --git a/.gitattributes b/.gitattributes index 7fca1b1e0b1..f3d699a17bb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2103,6 +2103,8 @@ src/lib/util/options.c svneol=native#text/plain src/lib/util/options.h svneol=native#text/plain src/lib/util/palette.c svneol=native#text/plain src/lib/util/palette.h svneol=native#text/plain +src/lib/util/plaparse.c svneol=native#text/plain +src/lib/util/plaparse.h svneol=native#text/plain src/lib/util/png.c svneol=native#text/plain src/lib/util/png.h svneol=native#text/plain src/lib/util/pool.c svneol=native#text/plain diff --git a/src/lib/lib.mak b/src/lib/lib.mak index eccf11556eb..e222218dbe9 100644 --- a/src/lib/lib.mak +++ b/src/lib/lib.mak @@ -50,6 +50,7 @@ UTILOBJS = \ $(LIBOBJ)/util/opresolv.o \ $(LIBOBJ)/util/options.o \ $(LIBOBJ)/util/palette.o \ + $(LIBOBJ)/util/plaparse.o \ $(LIBOBJ)/util/png.o \ $(LIBOBJ)/util/pool.o \ $(LIBOBJ)/util/sha1.o \ diff --git a/src/lib/util/plaparse.c b/src/lib/util/plaparse.c new file mode 100644 index 00000000000..c3a2261c564 --- /dev/null +++ b/src/lib/util/plaparse.c @@ -0,0 +1,264 @@ +/*************************************************************************** + + plaparse.h + + Parser for Berkeley standard PLA files into raw fusemaps. + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''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 AARON GILES 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. + +***************************************************************************/ + +#include +#include +#include +#include +#include "jedparse.h" +#include "plaparse.h" + + + +/*************************************************************************** + DEBUGGING +***************************************************************************/ + +#define LOG_PARSE 0 + + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +struct parse_info +{ + UINT32 inputs; + UINT32 outputs; + UINT32 terms; +}; + + + +/*************************************************************************** + UTILITIES +***************************************************************************/ + +/*------------------------------------------------- + iscrlf - is a line feed character +-------------------------------------------------*/ + +static int iscrlf(char c) +{ + return (c == 13 || c == 10); +} + + +/*------------------------------------------------- + suck_number - read a decimal value from the + character stream +-------------------------------------------------*/ + +static UINT32 suck_number(const UINT8 **psrc) +{ + const UINT8 *src = *psrc; + UINT32 value = 0; + + // loop over and accumulate digits + while (isdigit(*src)) + { + value = value * 10 + *src - '0'; + src++; + } + + // return a pointer to the string afterwards + *psrc = src; + return value; +} + + + +/*************************************************************************** + CORE IMPLEMENTATION +***************************************************************************/ + +/*------------------------------------------------- + process_field - process a single field +-------------------------------------------------*/ + +static void process_field(jed_data *data, const UINT8 *cursrc, const UINT8 *srcend, parse_info *pinfo) +{ + cursrc++; + + // switch off of the field type + switch (*cursrc) + { + // number of inputs + case 'i': + cursrc += 2; + pinfo->inputs = suck_number(&cursrc); + if (LOG_PARSE) printf("Inputs: %u\n", pinfo->inputs); + break; + + // number of outputs + case 'o': + cursrc += 2; + pinfo->outputs = suck_number(&cursrc); + if (LOG_PARSE) printf("Outputs: %u\n", pinfo->outputs); + break; + + // number of product terms + case 'p': + { + cursrc += 2; + pinfo->terms = suck_number(&cursrc); + if (LOG_PARSE) printf("Terms: %u\n", pinfo->terms); + + UINT32 curfuse = 0; + bool outputs = false; + + cursrc++; + while (cursrc < srcend && *cursrc != '.') + { + switch (*cursrc) + { + case '-': + if (!outputs) + { + jed_set_fuse(data, curfuse++, 1); + jed_set_fuse(data, curfuse++, 1); + + if (LOG_PARSE) printf("11"); + } + break; + + case '1': + if (outputs) + { + jed_set_fuse(data, curfuse++, 0); + + if (LOG_PARSE) printf("0"); + } + else + { + jed_set_fuse(data, curfuse++, 1); + jed_set_fuse(data, curfuse++, 0); + + if (LOG_PARSE) printf("10"); + } + break; + + case '0': + if (outputs) + { + jed_set_fuse(data, curfuse++, 1); + + if (LOG_PARSE) printf("1"); + } + else + { + jed_set_fuse(data, curfuse++, 0); + jed_set_fuse(data, curfuse++, 1); + + if (LOG_PARSE) printf("01"); + } + break; + + case ' ': + outputs = true; + if (LOG_PARSE) printf(" "); + break; + } + + if (iscrlf(*cursrc) && outputs) + { + outputs = false; + if (LOG_PARSE) printf("\n"); + } + + cursrc++; + } + + data->numfuses = curfuse; + break; + } + + // end of file + case 'e': + printf("End of file\n"); + break; + } + + cursrc++; +} + + + +/*------------------------------------------------- + pla_parse - parse a Berkeley standard PLA file + that has been loaded raw into memory +-------------------------------------------------*/ + +int pla_parse(const void *data, size_t length, jed_data *result) +{ + const UINT8 *cursrc = (const UINT8 *)data; + const UINT8 *srcend = cursrc + length; + const UINT8 *scan; + parse_info pinfo; + + result->numfuses = 0; + memset(result->fusemap, 0x00, sizeof(result->fusemap)); + + while (cursrc < srcend) + { + if (*cursrc == '#') + { + cursrc++; + while (cursrc < srcend && !iscrlf(*cursrc)) + cursrc++; + } + else if (*cursrc == '.') + { + scan = cursrc; + while (scan < srcend && !iscrlf(*scan)) + scan++; + if (scan >= srcend) + return JEDERR_INVALID_DATA; + + process_field(result, cursrc, srcend, &pinfo); + + cursrc = scan + 1; + } + + cursrc++; + } + + return JEDERR_NONE; +} diff --git a/src/lib/util/plaparse.h b/src/lib/util/plaparse.h new file mode 100644 index 00000000000..4d3f9c94a9f --- /dev/null +++ b/src/lib/util/plaparse.h @@ -0,0 +1,56 @@ +/*************************************************************************** + + plaparse.h + + Parser for Berkeley standard PLA files into raw fusemaps. + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''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 AARON GILES 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. + +***************************************************************************/ + +#ifndef __PLAPARSE_H__ +#define __PLAPARSE_H__ + +#include "osdcore.h" + + + +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ + +/* parse a file (read into memory) into a jed_data structure */ +int pla_parse(const void *data, size_t length, jed_data *result); + + + +#endif /* __PLAPARSE_H__ */ diff --git a/src/tools/jedutil.c b/src/tools/jedutil.c index 425eed24bfd..30ce53038ac 100644 --- a/src/tools/jedutil.c +++ b/src/tools/jedutil.c @@ -102,6 +102,7 @@ #include #include "corestr.h" #include "jedparse.h" +#include "plaparse.h" @@ -953,6 +954,26 @@ static int is_jed_file(const char *file) +/*------------------------------------------------- + is_pla_file - test if the file extension is + that of a Berkeley standard PLA file +-------------------------------------------------*/ + +static int is_pla_file(const char *file) +{ + int len; + + /* does the source end in '.pla'? */ + len = strlen(file); + + return (file[len - 4] == '.' && + tolower((UINT8)file[len - 3]) == 'p' && + tolower((UINT8)file[len - 2]) == 'l' && + tolower((UINT8)file[len - 1]) == 'a'); +} + + + /*------------------------------------------------- find_pal_data - finds the data associated with a pal name @@ -2540,8 +2561,9 @@ static int print_usage() { fprintf(stderr, "Usage:\n" - " jedutil -convert [fuses] -- convert JED to binary form\n" - " jedutil -convert -- convert binary to JED form\n" + " jedutil -convert [fuses] -- convert JEDEC to binary form\n" + " jedutil -convert [fuses] -- convert Berkeley standard PLA to binary form\n" + " jedutil -convert -- convert binary to JEDEC form\n" " jedutil -view -- dump JED logic equations\n" " jedutil -view -- dump binary logic equations\n" " jedutil -viewlist -- view list of supported devices\n" @@ -2559,7 +2581,7 @@ static int print_usage() static int command_convert(int argc, char *argv[]) { const char *srcfile, *dstfile; - int src_is_jed, dst_is_jed; + int src_is_jed, src_is_pla, dst_is_jed; int numfuses = 0; jed_data jed; int err; @@ -2578,13 +2600,16 @@ static int command_convert(int argc, char *argv[]) /* does the source end in '.jed'? */ src_is_jed = is_jed_file(srcfile); + /* does the source end in '.pla'? */ + src_is_pla = is_pla_file(srcfile); + /* does the destination end in '.jed'? */ dst_is_jed = is_jed_file(dstfile); /* error if neither or both are .jed */ - if (!src_is_jed && !dst_is_jed) + if (!src_is_jed && !src_is_pla && !dst_is_jed) { - fprintf(stderr, "At least one of the filenames must end in .jed!\n"); + fprintf(stderr, "At least one of the filenames must end in .jed or .pla!\n"); return 1; } if (src_is_jed && dst_is_jed) @@ -2598,16 +2623,20 @@ static int command_convert(int argc, char *argv[]) if (err != 0) return 1; - /* if the source is JED, convert to binary */ - if (src_is_jed) + /* if the source is JED or PLA, convert to binary */ + if (src_is_jed || src_is_pla) { printf("Converting '%s' to binary form '%s'\n", srcfile, dstfile); - /* read the JEDEC data */ - err = jed_parse(srcbuf, srcbuflen, &jed); + /* read the fuse data */ + if (src_is_jed) + err = jed_parse(srcbuf, srcbuflen, &jed); + else if (src_is_pla) + err = pla_parse(srcbuf, srcbuflen, &jed); + switch (err) { - case JEDERR_INVALID_DATA: fprintf(stderr, "Fatal error: Invalid .JED file\n"); return 1; + case JEDERR_INVALID_DATA: fprintf(stderr, "Fatal error: Invalid source file\n"); return 1; case JEDERR_BAD_XMIT_SUM: fprintf(stderr, "Fatal error: Bad transmission checksum\n"); return 1; case JEDERR_BAD_FUSE_SUM: fprintf(stderr, "Fatal error: Bad fusemap checksum\n"); return 1; }