mirror of
https://github.com/holub/mame
synced 2025-07-01 00:09:18 +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/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
|
||||
|
@ -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 \
|
||||
|
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 "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 <source.jed> <target.bin> [fuses] -- convert JED to binary form\n"
|
||||
" jedutil -convert <source.bin> <target.jed> -- convert binary to JED form\n"
|
||||
" jedutil -convert <source.jed> <target.bin> [fuses] -- convert JEDEC to binary 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.bin> <pal name> -- 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user