mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
Added experimental support for using Berkeley PLA files as input to jedutil. [Curt Coder]
This commit is contained in:
parent
75612647b5
commit
fa09b1ba20
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -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/options.h svneol=native#text/plain
|
||||||
src/lib/util/palette.c 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/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.c svneol=native#text/plain
|
||||||
src/lib/util/png.h svneol=native#text/plain
|
src/lib/util/png.h svneol=native#text/plain
|
||||||
src/lib/util/pool.c svneol=native#text/plain
|
src/lib/util/pool.c svneol=native#text/plain
|
||||||
|
@ -50,6 +50,7 @@ UTILOBJS = \
|
|||||||
$(LIBOBJ)/util/opresolv.o \
|
$(LIBOBJ)/util/opresolv.o \
|
||||||
$(LIBOBJ)/util/options.o \
|
$(LIBOBJ)/util/options.o \
|
||||||
$(LIBOBJ)/util/palette.o \
|
$(LIBOBJ)/util/palette.o \
|
||||||
|
$(LIBOBJ)/util/plaparse.o \
|
||||||
$(LIBOBJ)/util/png.o \
|
$(LIBOBJ)/util/png.o \
|
||||||
$(LIBOBJ)/util/pool.o \
|
$(LIBOBJ)/util/pool.o \
|
||||||
$(LIBOBJ)/util/sha1.o \
|
$(LIBOBJ)/util/sha1.o \
|
||||||
|
264
src/lib/util/plaparse.c
Normal file
264
src/lib/util/plaparse.c
Normal file
@ -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;
|
||||||
|
}
|
56
src/lib/util/plaparse.h
Normal file
56
src/lib/util/plaparse.h
Normal file
@ -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__ */
|
@ -102,6 +102,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "corestr.h"
|
#include "corestr.h"
|
||||||
#include "jedparse.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
|
find_pal_data - finds the data associated
|
||||||
with a pal name
|
with a pal name
|
||||||
@ -2540,8 +2561,9 @@ static int print_usage()
|
|||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
" jedutil -convert <source.jed> <target.bin> [fuses] -- convert JED to binary form\n"
|
" jedutil -convert <source.jed> <target.bin> [fuses] -- convert JEDEC to binary form\n"
|
||||||
" jedutil -convert <source.bin> <target.jed> -- convert binary to JED form\n"
|
" jedutil -convert <source.pla> <target.bin> [fuses] -- convert Berkeley standard PLA to binary form\n"
|
||||||
|
" jedutil -convert <source.bin> <target.jed> -- convert binary to JEDEC form\n"
|
||||||
" jedutil -view <source.jed> <pal name> -- dump JED logic equations\n"
|
" jedutil -view <source.jed> <pal name> -- dump JED logic equations\n"
|
||||||
" jedutil -view <source.bin> <pal name> -- dump binary logic equations\n"
|
" jedutil -view <source.bin> <pal name> -- dump binary logic equations\n"
|
||||||
" jedutil -viewlist -- view list of supported devices\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[])
|
static int command_convert(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
const char *srcfile, *dstfile;
|
const char *srcfile, *dstfile;
|
||||||
int src_is_jed, dst_is_jed;
|
int src_is_jed, src_is_pla, dst_is_jed;
|
||||||
int numfuses = 0;
|
int numfuses = 0;
|
||||||
jed_data jed;
|
jed_data jed;
|
||||||
int err;
|
int err;
|
||||||
@ -2578,13 +2600,16 @@ static int command_convert(int argc, char *argv[])
|
|||||||
/* does the source end in '.jed'? */
|
/* does the source end in '.jed'? */
|
||||||
src_is_jed = is_jed_file(srcfile);
|
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'? */
|
/* does the destination end in '.jed'? */
|
||||||
dst_is_jed = is_jed_file(dstfile);
|
dst_is_jed = is_jed_file(dstfile);
|
||||||
|
|
||||||
/* error if neither or both are .jed */
|
/* 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;
|
return 1;
|
||||||
}
|
}
|
||||||
if (src_is_jed && dst_is_jed)
|
if (src_is_jed && dst_is_jed)
|
||||||
@ -2598,16 +2623,20 @@ static int command_convert(int argc, char *argv[])
|
|||||||
if (err != 0)
|
if (err != 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* if the source is JED, convert to binary */
|
/* if the source is JED or PLA, convert to binary */
|
||||||
if (src_is_jed)
|
if (src_is_jed || src_is_pla)
|
||||||
{
|
{
|
||||||
printf("Converting '%s' to binary form '%s'\n", srcfile, dstfile);
|
printf("Converting '%s' to binary form '%s'\n", srcfile, dstfile);
|
||||||
|
|
||||||
/* read the JEDEC data */
|
/* read the fuse data */
|
||||||
err = jed_parse(srcbuf, srcbuflen, &jed);
|
if (src_is_jed)
|
||||||
|
err = jed_parse(srcbuf, srcbuflen, &jed);
|
||||||
|
else if (src_is_pla)
|
||||||
|
err = pla_parse(srcbuf, srcbuflen, &jed);
|
||||||
|
|
||||||
switch (err)
|
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_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;
|
case JEDERR_BAD_FUSE_SUM: fprintf(stderr, "Fatal error: Bad fusemap checksum\n"); return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user