mirror of
https://github.com/holub/mame
synced 2025-05-06 14:25:54 +03:00
Imported MM74C922 KBE from MESS. (no whatsnew)
This commit is contained in:
parent
a8ce511e1c
commit
06fe09e29b
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -837,6 +837,8 @@ src/emu/machine/mc68901.c svneol=native#text/plain
|
||||
src/emu/machine/mc68901.h svneol=native#text/plain
|
||||
src/emu/machine/microtch.c svneol=native#text/plain
|
||||
src/emu/machine/microtch.h svneol=native#text/plain
|
||||
src/emu/machine/mm74c922.c svneol=native#text/plain
|
||||
src/emu/machine/mm74c922.h svneol=native#text/plain
|
||||
src/emu/machine/mos6529.c svneol=native#text/plain
|
||||
src/emu/machine/mos6529.h svneol=native#text/plain
|
||||
src/emu/machine/msm5832.c svneol=native#text/plain
|
||||
|
@ -194,10 +194,11 @@ EMUMACHINEOBJS = \
|
||||
$(EMUMACHINE)/mc146818.o \
|
||||
$(EMUMACHINE)/mc6852.o \
|
||||
$(EMUMACHINE)/mc68901.o \
|
||||
$(EMUMACHINE)/msm5832.o \
|
||||
$(EMUMACHINE)/msm58321.o \
|
||||
$(EMUMACHINE)/mm74c922.o \
|
||||
$(EMUMACHINE)/microtch.o \
|
||||
$(EMUMACHINE)/mos6529.o \
|
||||
$(EMUMACHINE)/msm5832.o \
|
||||
$(EMUMACHINE)/msm58321.o \
|
||||
$(EMUMACHINE)/msm6242.o \
|
||||
$(EMUMACHINE)/nmc9306.o \
|
||||
$(EMUMACHINE)/nvram.o \
|
||||
|
226
src/emu/machine/mm74c922.c
Normal file
226
src/emu/machine/mm74c922.c
Normal file
@ -0,0 +1,226 @@
|
||||
/**********************************************************************
|
||||
|
||||
MM74C922/MM74C923 16/20-Key Encoder emulation
|
||||
|
||||
Copyright MESS Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "mm74c922.h"
|
||||
#include "machine/devhelpr.h"
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// MACROS / CONSTANTS
|
||||
//**************************************************************************
|
||||
|
||||
#define LOG 1
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
const device_type MM74C922 = mm74c922_device_config::static_alloc_device_config;
|
||||
const device_type MM74C923 = mm74c922_device_config::static_alloc_device_config;
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE CONFIGURATION
|
||||
//**************************************************************************
|
||||
|
||||
GENERIC_DEVICE_CONFIG_SETUP(mm74c922, "MM74C922")
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_config_complete - perform any
|
||||
// operations now that the configuration is
|
||||
// complete
|
||||
//-------------------------------------------------
|
||||
|
||||
void mm74c922_device_config::device_config_complete()
|
||||
{
|
||||
// inherit a copy of the static data
|
||||
const mm74c922_interface *intf = reinterpret_cast<const mm74c922_interface *>(static_config());
|
||||
if (intf != NULL)
|
||||
*static_cast<mm74c922_interface *>(this) = *intf;
|
||||
|
||||
// or initialize to defaults if none provided
|
||||
else
|
||||
{
|
||||
memset(&m_out_da_func, 0, sizeof(m_out_da_func));
|
||||
memset(&m_in_x1_func, 0, sizeof(m_in_x1_func));
|
||||
memset(&m_in_x2_func, 0, sizeof(m_in_x2_func));
|
||||
memset(&m_in_x3_func, 0, sizeof(m_in_x3_func));
|
||||
memset(&m_in_x4_func, 0, sizeof(m_in_x4_func));
|
||||
memset(&m_in_x5_func, 0, sizeof(m_in_x5_func));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// static_set_config - configuration helper
|
||||
//-------------------------------------------------
|
||||
|
||||
void mm74c922_device_config::static_set_config(device_config *device, int max_y)
|
||||
{
|
||||
mm74c922_device_config *mm74c922 = downcast<mm74c922_device_config *>(device);
|
||||
|
||||
mm74c922->m_max_y = max_y;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// INLINE HELPERS
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// change_output_lines -
|
||||
//-------------------------------------------------
|
||||
|
||||
inline void mm74c922_device::change_output_lines()
|
||||
{
|
||||
if (m_next_da != m_da)
|
||||
{
|
||||
m_da = m_next_da;
|
||||
|
||||
if (LOG) logerror("MM74C922 '%s' Data Available: %u\n", tag(), m_da);
|
||||
|
||||
devcb_call_write_line(&m_out_da_func, m_da);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// clock_scan_counters -
|
||||
//-------------------------------------------------
|
||||
|
||||
inline void mm74c922_device::clock_scan_counters()
|
||||
{
|
||||
if (!m_inhibit)
|
||||
{
|
||||
m_x++;
|
||||
m_x &= 0x03;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
inline void mm74c922_device::detect_keypress()
|
||||
{
|
||||
if (m_inhibit)
|
||||
{
|
||||
UINT8 data = devcb_call_read8(&m_in_x_func[m_x], 0);
|
||||
|
||||
if (BIT(data, m_y))
|
||||
{
|
||||
// key released
|
||||
m_inhibit = 0;
|
||||
m_next_da = 0;
|
||||
m_data = 0xff; // high-Z
|
||||
|
||||
if (LOG) logerror("MM74C922 '%s' Key Released\n", tag());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 data = devcb_call_read8(&m_in_x_func[m_x], 0);
|
||||
|
||||
for (int y = 0; y < m_config.m_max_y; y++)
|
||||
{
|
||||
if (!BIT(data, y))
|
||||
{
|
||||
// key depressed
|
||||
m_inhibit = 1;
|
||||
m_next_da = 1;
|
||||
m_y = y;
|
||||
|
||||
m_data = (y << 2) | m_x;
|
||||
|
||||
if (LOG) logerror("MM74C922 '%s' Key Depressed: X %u Y %u = %02x\n", tag(), m_x, y, m_data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// mm74c922_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
mm74c922_device::mm74c922_device(running_machine &_machine, const mm74c922_device_config &config)
|
||||
: device_t(_machine, config),
|
||||
m_x(0),
|
||||
m_y(0),
|
||||
m_next_da(0),
|
||||
m_config(config)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void mm74c922_device::device_start()
|
||||
{
|
||||
// resolve callbacks
|
||||
devcb_resolve_write_line(&m_out_da_func, &m_config.m_out_da_func, this);
|
||||
devcb_resolve_read8(&m_in_x_func[0], &m_config.m_in_x1_func, this);
|
||||
devcb_resolve_read8(&m_in_x_func[1], &m_config.m_in_x2_func, this);
|
||||
devcb_resolve_read8(&m_in_x_func[2], &m_config.m_in_x3_func, this);
|
||||
devcb_resolve_read8(&m_in_x_func[3], &m_config.m_in_x4_func, this);
|
||||
devcb_resolve_read8(&m_in_x_func[4], &m_config.m_in_x5_func, this);
|
||||
|
||||
// set initial values
|
||||
change_output_lines();
|
||||
|
||||
// allocate timers
|
||||
m_scan_timer = timer_alloc();
|
||||
m_scan_timer->adjust(attotime::zero, 0, attotime::from_hz(50));
|
||||
|
||||
// register for state saving
|
||||
save_item(NAME(m_inhibit));
|
||||
save_item(NAME(m_x));
|
||||
save_item(NAME(m_y));
|
||||
save_item(NAME(m_data));
|
||||
save_item(NAME(m_da));
|
||||
save_item(NAME(m_next_da));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_timer - handler timer events
|
||||
//-------------------------------------------------
|
||||
|
||||
void mm74c922_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
change_output_lines();
|
||||
clock_scan_counters();
|
||||
detect_keypress();
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// data_out_r -
|
||||
//-------------------------------------------------
|
||||
|
||||
UINT8 mm74c922_device::data_out_r()
|
||||
{
|
||||
if (LOG) logerror("MM74C922 '%s' Data Read: %02x\n", tag(), m_data);
|
||||
|
||||
return m_data;
|
||||
}
|
163
src/emu/machine/mm74c922.h
Normal file
163
src/emu/machine/mm74c922.h
Normal file
@ -0,0 +1,163 @@
|
||||
/**********************************************************************
|
||||
|
||||
MM74C922/MM74C923 16/20-Key Encoder emulation
|
||||
|
||||
Copyright MESS Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
|
||||
**********************************************************************
|
||||
_____ _____
|
||||
ROW Y1 1 |* \_/ | 18 Vcc
|
||||
ROW Y2 2 | | 17 DATA OUT A
|
||||
ROW Y3 3 | | 16 DATA OUT B
|
||||
ROW Y4 4 | | 15 DATA OUT C
|
||||
OSCILLATOR 5 | MM74C922 | 14 DATA OUT D
|
||||
KEYBOUNCE MASK 6 | | 13 _OUTPUT ENABLE
|
||||
COLUMN X4 7 | | 12 DATA AVAILABLE
|
||||
COLUMN X3 8 | | 11 COLUMN X1
|
||||
GND 9 |_____________| 10 COLUMN X2
|
||||
|
||||
_____ _____
|
||||
ROW Y1 1 |* \_/ | 20 Vcc
|
||||
ROW Y2 2 | | 19 DATA OUT A
|
||||
ROW Y3 3 | | 18 DATA OUT B
|
||||
ROW Y4 4 | | 17 DATA OUT C
|
||||
ROW Y5 5 | MM74C923 | 16 DATA OUT D
|
||||
OSCILLATOR 6 | | 15 DATA OUT E
|
||||
KEYBOUNCE MASK 7 | | 14 _OUTPUT ENABLE
|
||||
COLUMN X4 8 | | 13 DATA AVAILABLE
|
||||
COLUMN X3 9 | | 12 COLUMN X1
|
||||
GND 10 |_____________| 11 COLUMN X2
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __MM74C922__
|
||||
#define __MM74C922__
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// INTERFACE CONFIGURATION MACROS
|
||||
//**************************************************************************
|
||||
|
||||
#define MCFG_MM74C922_ADD(_tag, _config) \
|
||||
MCFG_DEVICE_ADD(_tag, MM74C922, 0) \
|
||||
MCFG_DEVICE_CONFIG(_config) \
|
||||
mm74c922_device_config::static_set_config(device, 4);
|
||||
|
||||
|
||||
#define MCFG_MM74C923_ADD(_tag, _config) \
|
||||
MCFG_DEVICE_ADD(_tag, MM74C923, 0) \
|
||||
MCFG_DEVICE_CONFIG(_config) \
|
||||
mm74c922_device_config::static_set_config(device, 5);
|
||||
|
||||
|
||||
#define MM74C922_INTERFACE(name) \
|
||||
const mm74c922_interface (name)=
|
||||
|
||||
|
||||
#define MM74C923_INTERFACE(name) \
|
||||
const mm74c922_interface (name)=
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> mm74c922_interface
|
||||
|
||||
struct mm74c922_interface
|
||||
{
|
||||
double m_cap_osc;
|
||||
double m_cap_debounce;
|
||||
|
||||
devcb_write_line m_out_da_func;
|
||||
|
||||
devcb_read8 m_in_x1_func;
|
||||
devcb_read8 m_in_x2_func;
|
||||
devcb_read8 m_in_x3_func;
|
||||
devcb_read8 m_in_x4_func;
|
||||
devcb_read8 m_in_x5_func;
|
||||
};
|
||||
|
||||
|
||||
// ======================> mm74c922_device_config
|
||||
|
||||
class mm74c922_device_config : public device_config,
|
||||
public mm74c922_interface
|
||||
{
|
||||
friend class mm74c922_device;
|
||||
|
||||
// construction/destruction
|
||||
mm74c922_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
|
||||
|
||||
public:
|
||||
// allocators
|
||||
static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
|
||||
virtual device_t *alloc_device(running_machine &machine) const;
|
||||
|
||||
// inline configuration helpers
|
||||
static void static_set_config(device_config *device, int max_y);
|
||||
|
||||
protected:
|
||||
// device_config overrides
|
||||
virtual void device_config_complete();
|
||||
|
||||
private:
|
||||
int m_max_y;
|
||||
};
|
||||
|
||||
|
||||
// ======================> mm74c922_device
|
||||
|
||||
class mm74c922_device : public device_t
|
||||
{
|
||||
friend class mm74c922_device_config;
|
||||
|
||||
// construction/destruction
|
||||
mm74c922_device(running_machine &_machine, const mm74c922_device_config &_config);
|
||||
|
||||
public:
|
||||
UINT8 data_out_r();
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
|
||||
private:
|
||||
inline void change_output_lines();
|
||||
inline void clock_scan_counters();
|
||||
inline void detect_keypress();
|
||||
|
||||
devcb_resolved_write_line m_out_da_func;
|
||||
devcb_resolved_read8 m_in_x_func[5];
|
||||
|
||||
int m_inhibit; // scan counter clock inhibit
|
||||
int m_x; // currently scanned column
|
||||
int m_y; // latched row
|
||||
|
||||
UINT8 m_data; // data latch
|
||||
|
||||
int m_da; // data available flag
|
||||
int m_next_da; // next value of data available flag
|
||||
|
||||
// timers
|
||||
emu_timer *m_scan_timer; // keyboard scan timer
|
||||
|
||||
const mm74c922_device_config &m_config;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
extern const device_type MM74C922;
|
||||
extern const device_type MM74C923;
|
||||
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user