mirror of
https://github.com/holub/mame
synced 2025-10-08 09:30:17 +03:00
Added PLS100 (82S100) PLA emulation which utilizes a binary JED fusemap. [Curt Coder]
This commit is contained in:
parent
97685083b1
commit
1f25060412
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -935,6 +935,8 @@ src/emu/machine/pic8259.c svneol=native#text/plain
|
|||||||
src/emu/machine/pic8259.h svneol=native#text/plain
|
src/emu/machine/pic8259.h svneol=native#text/plain
|
||||||
src/emu/machine/pit8253.c svneol=native#text/plain
|
src/emu/machine/pit8253.c svneol=native#text/plain
|
||||||
src/emu/machine/pit8253.h svneol=native#text/plain
|
src/emu/machine/pit8253.h svneol=native#text/plain
|
||||||
|
src/emu/machine/pls100.c svneol=native#text/plain
|
||||||
|
src/emu/machine/pls100.h svneol=native#text/plain
|
||||||
src/emu/machine/ram.c svneol=native#text/plain
|
src/emu/machine/ram.c svneol=native#text/plain
|
||||||
src/emu/machine/ram.h svneol=native#text/plain
|
src/emu/machine/ram.h svneol=native#text/plain
|
||||||
src/emu/machine/rescap.h svneol=native#text/plain
|
src/emu/machine/rescap.h svneol=native#text/plain
|
||||||
|
@ -226,6 +226,7 @@ EMUMACHINEOBJS = \
|
|||||||
$(EMUMACHINE)/pd4990a.o \
|
$(EMUMACHINE)/pd4990a.o \
|
||||||
$(EMUMACHINE)/pic8259.o \
|
$(EMUMACHINE)/pic8259.o \
|
||||||
$(EMUMACHINE)/pit8253.o \
|
$(EMUMACHINE)/pit8253.o \
|
||||||
|
$(EMUMACHINE)/pls100.o \
|
||||||
$(EMUMACHINE)/ram.o \
|
$(EMUMACHINE)/ram.o \
|
||||||
$(EMUMACHINE)/roc10937.o \
|
$(EMUMACHINE)/roc10937.o \
|
||||||
$(EMUMACHINE)/rp5c01.o \
|
$(EMUMACHINE)/rp5c01.o \
|
||||||
|
136
src/emu/machine/pls100.c
Normal file
136
src/emu/machine/pls100.c
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
|
||||||
|
PLS100 16xPAL_TERMSx8 Programmable Logic Array emulation
|
||||||
|
|
||||||
|
Copyright MESS Team.
|
||||||
|
Visit http://mamedev.org for licensing and usage restrictions.
|
||||||
|
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "pls100.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// DEVICE TYPE DEFINITION
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
const device_type PLS100 = &device_creator<pls100_device>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// INLINE HELPERS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// parse_fusemap -
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
inline void pls100_device::parse_fusemap()
|
||||||
|
{
|
||||||
|
jed_data jed;
|
||||||
|
jedbin_parse(machine().region(tag())->base(), machine().region(tag())->bytes(), &jed);
|
||||||
|
UINT32 fusenum = 0;
|
||||||
|
m_xor = 0;
|
||||||
|
|
||||||
|
for (int term = 0; term < PAL_TERMS; term++)
|
||||||
|
{
|
||||||
|
m_and_comp[term] = 0;
|
||||||
|
m_and_true[term] = 0;
|
||||||
|
m_or[term] = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < PAL_INPUTS; i++)
|
||||||
|
{
|
||||||
|
m_and_comp[term] |= jed_get_fuse(&jed, fusenum++) << i;
|
||||||
|
m_and_true[term] |= jed_get_fuse(&jed, fusenum++) << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int f = 0; f < PAL_OUTPUTS; f++)
|
||||||
|
{
|
||||||
|
m_or[term] |= !jed_get_fuse(&jed, fusenum++) << f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int f = 0; f < PAL_OUTPUTS; f++)
|
||||||
|
{
|
||||||
|
m_xor |= jed_get_fuse(&jed, fusenum++) << f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// get_product -
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
inline int pls100_device::get_product(int term)
|
||||||
|
{
|
||||||
|
UINT16 input_true = m_and_true[term] | m_i;
|
||||||
|
UINT16 input_comp = m_and_comp[term] | (m_i ^ 0xffff);
|
||||||
|
|
||||||
|
return (input_true & input_comp) == 0xffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// update_outputs -
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
inline void pls100_device::update_outputs()
|
||||||
|
{
|
||||||
|
m_s = 0;
|
||||||
|
|
||||||
|
for (int term = 0; term < PAL_TERMS; term++)
|
||||||
|
{
|
||||||
|
if (get_product(term))
|
||||||
|
{
|
||||||
|
m_s |= m_or[term];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// LIVE DEVICE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// pls100_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
pls100_device::pls100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
|
: device_t(mconfig, PLS100, "PLS100", tag, owner, clock)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_start - device-specific startup
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void pls100_device::device_start()
|
||||||
|
{
|
||||||
|
// parse fusemap
|
||||||
|
assert(machine().region(tag()) != NULL);
|
||||||
|
parse_fusemap();
|
||||||
|
|
||||||
|
// register for state saving
|
||||||
|
save_item(NAME(m_i));
|
||||||
|
save_item(NAME(m_s));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// read -
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
UINT8 pls100_device::read(UINT16 input)
|
||||||
|
{
|
||||||
|
m_i = input;
|
||||||
|
|
||||||
|
update_outputs();
|
||||||
|
|
||||||
|
return m_s ^ m_xor;
|
||||||
|
}
|
94
src/emu/machine/pls100.h
Normal file
94
src/emu/machine/pls100.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
|
||||||
|
PLS100 16x48x8 Programmable Logic Array emulation
|
||||||
|
|
||||||
|
Copyright MESS Team.
|
||||||
|
Visit http://mamedev.org for licensing and usage restrictions.
|
||||||
|
|
||||||
|
**********************************************************************
|
||||||
|
_____ _____
|
||||||
|
FE 1 |* \_/ | 28 Vcc
|
||||||
|
I7 2 | | 27 I8
|
||||||
|
I6 3 | | 26 I9
|
||||||
|
I5 4 | | 25 I10
|
||||||
|
I4 5 | | 24 I11
|
||||||
|
I3 6 | 82S100 | 23 I12
|
||||||
|
I2 7 | 82S101 | 22 I13
|
||||||
|
I1 8 | PLS100 | 21 I14
|
||||||
|
I0 9 | PLS101 | 20 I15
|
||||||
|
F7 10 | | 19 _CE
|
||||||
|
F6 11 | | 18 F0
|
||||||
|
F5 12 | | 17 F1
|
||||||
|
F4 13 | | PAL_OUTPUTS F2
|
||||||
|
GND 14 |_____________| 15 F3
|
||||||
|
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef __PLS100__
|
||||||
|
#define __PLS100__
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "jedparse.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// MACROS / CONSTANTS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
#define PAL_INPUTS 16
|
||||||
|
#define PAL_OUTPUTS 8
|
||||||
|
#define PAL_TERMS 48
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///*************************************************************************
|
||||||
|
// INTERFACE CONFIGURATION MACROS
|
||||||
|
///*************************************************************************
|
||||||
|
|
||||||
|
#define MCFG_PLS100_ADD(_tag) \
|
||||||
|
MCFG_DEVICE_ADD(_tag, PLS100, 0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///*************************************************************************
|
||||||
|
// TYPE DEFINITIONS
|
||||||
|
///*************************************************************************
|
||||||
|
|
||||||
|
// ======================> pls100_device
|
||||||
|
|
||||||
|
class pls100_device : public device_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
pls100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
UINT8 read(UINT16 input);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start();
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline void parse_fusemap();
|
||||||
|
inline int get_product(int term);
|
||||||
|
inline void update_outputs();
|
||||||
|
|
||||||
|
UINT16 m_i;
|
||||||
|
UINT8 m_s;
|
||||||
|
UINT16 m_and_true[PAL_TERMS];
|
||||||
|
UINT16 m_and_comp[PAL_TERMS];
|
||||||
|
UINT16 m_or[PAL_TERMS];
|
||||||
|
UINT8 m_xor;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type PLS100;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user