mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
m6502/m5074x.cpp: Modernized logging, fixed Timer X mixing up the prescale and countdown values. [R. Belmont]
* Fixes several PowerBooks that were auto-polling ADB at 5 Hz instead of 70 Hz.
This commit is contained in:
parent
e83123dee7
commit
2fe2cb631e
@ -7,6 +7,13 @@
|
|||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "m5074x.h"
|
#include "m5074x.h"
|
||||||
|
|
||||||
|
#define LOG_ADC (1U << 1)
|
||||||
|
#define LOG_PORTS (1U << 2)
|
||||||
|
#define LOG_TIMER (1U << 3)
|
||||||
|
|
||||||
|
#define VERBOSE (0)
|
||||||
|
#include "logmacro.h"
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
// MACROS / CONSTANTS
|
// MACROS / CONSTANTS
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
@ -147,7 +154,7 @@ TIMER_CALLBACK_MEMBER(m5074x_device::timerx_tick)
|
|||||||
{
|
{
|
||||||
m_tmrx--;
|
m_tmrx--;
|
||||||
|
|
||||||
if (m_tmrx <= 0)
|
if (m_tmrx == 0)
|
||||||
{
|
{
|
||||||
m_tmrctrl |= TMRC_TMRXREQ;
|
m_tmrctrl |= TMRC_TMRXREQ;
|
||||||
m_tmrx = m_tmrxlatch;
|
m_tmrx = m_tmrxlatch;
|
||||||
@ -230,12 +237,14 @@ void m5074x_device::recalc_timer(int timer)
|
|||||||
case 0:
|
case 0:
|
||||||
hz = clock() / 16;
|
hz = clock() / 16;
|
||||||
hz /= (m_tmr12pre + 2);
|
hz /= (m_tmr12pre + 2);
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer 1, prescale %02x, fire at %d Hz\n", machine().describe_context(), m_tmr12pre, hz);
|
||||||
m_timers[TIMER_1]->adjust(attotime::from_hz(hz), 0, attotime::from_hz(hz));
|
m_timers[TIMER_1]->adjust(attotime::from_hz(hz), 0, attotime::from_hz(hz));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
hz = clock() / 16;
|
hz = clock() / 16;
|
||||||
hz /= (m_tmr12pre + 2);
|
hz /= (m_tmr12pre + 2);
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer 2, prescale %02x, fire at %d Hz\n", machine().describe_context(), m_tmr12pre, hz);
|
||||||
m_timers[TIMER_2]->adjust(attotime::from_hz(hz), 0, attotime::from_hz(hz));
|
m_timers[TIMER_2]->adjust(attotime::from_hz(hz), 0, attotime::from_hz(hz));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -247,12 +256,14 @@ void m5074x_device::recalc_timer(int timer)
|
|||||||
// stop bit?
|
// stop bit?
|
||||||
if (m_tmrctrl & TMRC_TMRXHLT)
|
if (m_tmrctrl & TMRC_TMRXHLT)
|
||||||
{
|
{
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer X halted\n", machine().describe_context());
|
||||||
m_timers[TIMER_X]->adjust(attotime::never, 0, attotime::never);
|
m_timers[TIMER_X]->adjust(attotime::never, 0, attotime::never);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hz = clock() / 16;
|
hz = clock() / 16;
|
||||||
hz /= (m_tmrxpre + 2);
|
hz /= (m_tmrxpre + 2);
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer X, prescale %02x, fire at %d Hz\n", machine().describe_context(), m_tmrxpre, hz);
|
||||||
m_timers[TIMER_X]->adjust(attotime::from_hz(hz), 0, attotime::from_hz(hz));
|
m_timers[TIMER_X]->adjust(attotime::from_hz(hz), 0, attotime::from_hz(hz));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -266,6 +277,9 @@ void m5074x_device::recalc_timer(int timer)
|
|||||||
|
|
||||||
void m5074x_device::send_port(uint8_t offset, uint8_t data)
|
void m5074x_device::send_port(uint8_t offset, uint8_t data)
|
||||||
{
|
{
|
||||||
|
LOGMASKED(LOG_PORTS, "%s: Write port %d, data %02x DDR %02x pull-ups %02x\n", machine().describe_context(), offset,
|
||||||
|
data, m_ddrs[offset], m_pullups[offset]);
|
||||||
|
|
||||||
m_write_p[offset](data);
|
m_write_p[offset](data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,6 +292,9 @@ uint8_t m5074x_device::read_port(uint8_t offset)
|
|||||||
// OR in ddr-masked version of port writes
|
// OR in ddr-masked version of port writes
|
||||||
incoming |= (m_ports[offset] & m_ddrs[offset]);
|
incoming |= (m_ports[offset] & m_ddrs[offset]);
|
||||||
|
|
||||||
|
LOGMASKED(LOG_PORTS, "%s: Read port %d, incoming %02x DDR %02x output latch %02x\n", machine().describe_context(), offset,
|
||||||
|
m_read_p[offset](), m_ddrs[offset], m_ports[offset]);
|
||||||
|
|
||||||
return incoming;
|
return incoming;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,31 +423,34 @@ uint8_t m5074x_device::tmrirq_r(offs_t offset)
|
|||||||
|
|
||||||
void m5074x_device::tmrirq_w(offs_t offset, uint8_t data)
|
void m5074x_device::tmrirq_w(offs_t offset, uint8_t data)
|
||||||
{
|
{
|
||||||
// printf("%02x to tmrirq @ %d\n", data, offset);
|
|
||||||
|
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
m_tmr12pre = data;
|
m_tmr12pre = data;
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer 1/2 prescale %02x\n", machine().describe_context(), data);
|
||||||
recalc_timer(0);
|
recalc_timer(0);
|
||||||
recalc_timer(1);
|
recalc_timer(1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
m_tmr1 = m_tmr1latch = data;
|
m_tmr1 = m_tmr1latch = data;
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer 1 latch %02x\n", machine().describe_context(), data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
m_tmr2 = m_tmr2latch = data;
|
m_tmr2 = m_tmr2latch = data;
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer 2 latch %02x\n", machine().describe_context(), data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
m_tmrxpre = m_tmrxlatch = data;
|
m_tmrxpre = data;
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer X prescale %02x\n", machine().describe_context(), data);
|
||||||
recalc_timer(2);
|
recalc_timer(2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
m_tmrx = data;
|
m_tmrx = m_tmrxlatch = data;
|
||||||
|
LOGMASKED(LOG_TIMER, "%s: timer X latch %02x\n", machine().describe_context(), data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
@ -548,7 +568,7 @@ uint8_t m50753_device::ad_r()
|
|||||||
|
|
||||||
void m50753_device::ad_start_w(uint8_t data)
|
void m50753_device::ad_start_w(uint8_t data)
|
||||||
{
|
{
|
||||||
logerror("%s: A-D start (IN%d)\n", machine().describe_context(), m_ad_control & 0x07);
|
LOGMASKED(LOG_ADC, "%s: A-D start (IN%d)\n", machine().describe_context(), m_ad_control & 0x07);
|
||||||
|
|
||||||
// starting a conversion. M50753 documentation says conversion time is 72 microseconds.
|
// starting a conversion. M50753 documentation says conversion time is 72 microseconds.
|
||||||
m_timers[TIMER_ADC]->adjust(attotime::from_usec(72));
|
m_timers[TIMER_ADC]->adjust(attotime::from_usec(72));
|
||||||
@ -561,6 +581,7 @@ uint8_t m50753_device::ad_control_r()
|
|||||||
|
|
||||||
void m50753_device::ad_control_w(uint8_t data)
|
void m50753_device::ad_control_w(uint8_t data)
|
||||||
{
|
{
|
||||||
|
LOGMASKED(LOG_ADC, "%s: %02x to A-D control\n", machine().describe_context(), data);
|
||||||
m_ad_control = data & 0x0f;
|
m_ad_control = data & 0x0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user