diff options
author | 2012-10-10 15:18:42 +0000 | |
---|---|---|
committer | 2012-10-10 15:18:42 +0000 | |
commit | fa09b1ba207c53c4f025bbf8ab4ea588248538bc (patch) | |
tree | a98801b108996fd2ea42a2e8ce53348d16797c43 /src/lib | |
parent | 75612647b506b8c87f73c2719569036de9f38b55 (diff) |
Added experimental support for using Berkeley PLA files as input to jedutil. [Curt Coder]
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/lib.mak | 1 | ||||
-rw-r--r-- | src/lib/util/plaparse.c | 264 | ||||
-rw-r--r-- | src/lib/util/plaparse.h | 56 |
3 files changed, 321 insertions, 0 deletions
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 <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#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__ */ |