Add the ability to mcs51 family processors to use port bits as inputs

which actually are used as outputs because a "0" has been written to 
them. The CMOS chips in the family may be misused in this way when a
low impedance source is connected to them. [Couriersud]
This commit is contained in:
couriersud 2015-04-12 00:35:56 +02:00
parent ba775aedec
commit d4658277e4
2 changed files with 24 additions and 4 deletions

View File

@ -286,6 +286,11 @@ mcs51_cpu_device::mcs51_cpu_device(const machine_config &mconfig, device_type ty
m_ds5002fp.mcon = 0;
m_ds5002fp.rpctl = 0;
m_ds5002fp.crc = 0;
/* default to standard cmos interfacing */
for (int i=0; i < ARRAY_LENGTH(m_forced_inputs); i++)
m_forced_inputs[i] = 0;
}
@ -2079,10 +2084,10 @@ UINT8 mcs51_cpu_device::sfr_read(size_t offset)
{
/* Read/Write/Modify operations read the port latch ! */
/* Move to memory map */
case ADDR_P0: return RWM ? P0 : P0 & IN(MCS51_PORT_P0);
case ADDR_P1: return RWM ? P1 : P1 & IN(MCS51_PORT_P1);
case ADDR_P2: return RWM ? P2 : P2 & IN(MCS51_PORT_P2);
case ADDR_P3: return RWM ? P3 : P3 & IN(MCS51_PORT_P3);
case ADDR_P0: return RWM ? P0 : (P0 | m_forced_inputs[0]) & IN(MCS51_PORT_P0);
case ADDR_P1: return RWM ? P1 : (P1 | m_forced_inputs[1]) & IN(MCS51_PORT_P1);
case ADDR_P2: return RWM ? P2 : (P2 | m_forced_inputs[2]) & IN(MCS51_PORT_P2);
case ADDR_P3: return RWM ? P3 : (P3 | m_forced_inputs[3]) & IN(MCS51_PORT_P3);
case ADDR_PSW:
case ADDR_ACC:

View File

@ -72,6 +72,16 @@ enum
MCS51_PORT_TX = 0x20004, /* P3.1 */
};
/* At least CMOS devices may be forced to read from ports configured as output.
* All you need is a low impedance output connect to the port.
*/
#define MCFG_MCS51_PORT1_CONFIG(_forced_inputs) \
mcs51_cpu_device::set_port_forced_input(*device, 1, _forced_inputs);
#define MCFG_MCS51_PORT2_CONFIG(_forced_inputs) \
mcs51_cpu_device::set_port_forced_input(*device, 2, _forced_inputs);
#define MCFG_MCS51_PORT3_CONFIG(_forced_inputs) \
mcs51_cpu_device::set_port_forced_input(*device, 3, _forced_inputs);
class mcs51_cpu_device : public cpu_device
{
@ -82,6 +92,9 @@ public:
void i8051_set_serial_tx_callback(write8_delegate tx_func);
void i8051_set_serial_rx_callback(read8_delegate rx_func);
// configuration helpers
static void set_port_forced_input(device_t &device, UINT8 port, UINT8 forced_input) { downcast<mcs51_cpu_device &>(device).m_forced_inputs[port] = forced_input; }
protected:
// device-level overrides
virtual void device_start();
@ -137,6 +150,8 @@ protected:
UINT8 m_irq_active; /* mask which irq levels are serviced */
UINT8 m_irq_prio[8]; /* interrupt priority */
UINT8 m_forced_inputs[4]; /* allow read even if configured as output */
int m_icount;
struct mcs51_uart