summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/tms9902.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/tms9902.cpp')
-rw-r--r--src/devices/machine/tms9902.cpp102
1 files changed, 58 insertions, 44 deletions
diff --git a/src/devices/machine/tms9902.cpp b/src/devices/machine/tms9902.cpp
index 7e2db622d31..c25ea5eacc1 100644
--- a/src/devices/machine/tms9902.cpp
+++ b/src/devices/machine/tms9902.cpp
@@ -39,15 +39,29 @@
*****************************************************************************/
#include "emu.h"
-#include <math.h>
#include "tms9902.h"
-#define TRACE_LINES 0
-#define TRACE_CRU 0
-#define TRACE_DETAIL 0
-#define TRACE_BUFFER 0
-#define TRACE_ERROR 1
-#define TRACE_SETTING 0
+#include <math.h>
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_LINES (1U << 1)
+#define LOG_CRU (1U << 2)
+#define LOG_DETAIL (1U << 3)
+#define LOG_BUFFER (1U << 4)
+#define LOG_ERROR (1U << 5)
+#define LOG_SETTING (1U << 6)
+
+#define VERBOSE (LOG_ERROR)
+#include "logmacro.h"
+
+#define LOGGENERAL(...) LOGMASKED(LOG_GENERAL, __VA_ARGS__)
+#define LOGLINES(...) LOGMASKED(LOG_LINES, __VA_ARGS__)
+#define LOGCRU(...) LOGMASKED(LOG_CRU, __VA_ARGS__)
+#define LOGDETAIL(...) LOGMASKED(LOG_DETAIL, __VA_ARGS__)
+#define LOGBUFFER(...) LOGMASKED(LOG_BUFFER, __VA_ARGS__)
+#define LOGERROR(...) LOGMASKED(LOG_ERROR, __VA_ARGS__)
+#define LOGSETTING(...) LOGMASKED(LOG_SETTING, __VA_ARGS__)
+
enum
{
@@ -66,11 +80,11 @@ enum
Constructor
*/
tms9902_device::tms9902_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, TMS9902, "TMS9902 ACC", tag, owner, clock, "tms9902", __FILE__),
- m_int_cb(*this),
- m_rcv_cb(*this),
- m_xmit_cb(*this),
- m_ctrl_cb(*this)
+ : device_t(mconfig, TMS9902, tag, owner, clock)
+ , m_int_cb(*this)
+ , m_rcv_cb(*this)
+ , m_xmit_cb(*this)
+ , m_ctrl_cb(*this)
{
}
@@ -79,19 +93,19 @@ tms9902_device::tms9902_device(const machine_config &mconfig, const char *tag, d
*/
void tms9902_device::field_interrupts()
{
- bool new_int = (m_DSCH && m_DSCENB)
+ bool const new_int = (m_DSCH && m_DSCENB)
|| (m_RBRL && m_RIENB)
|| (m_XBRE && m_XBIENB)
|| (m_TIMELP && m_TIMENB);
- if (TRACE_DETAIL) logerror("interrupt flags (DSCH = %02x, DSCENB = %02x), (RBRL = %02x, RIENB = %02x), (XBRE = %02x, XBIENB = %02x), (TIMELP = %02x, TIMENB = %02x)\n",
- m_DSCH, m_DSCENB, m_RBRL, m_RIENB, m_XBRE, m_XBIENB, m_TIMELP, m_TIMENB);
+ LOGDETAIL("interrupt flags (DSCH = %02x, DSCENB = %02x), (RBRL = %02x, RIENB = %02x), (XBRE = %02x, XBIENB = %02x), (TIMELP = %02x, TIMENB = %02x)\n",
+ m_DSCH, m_DSCENB, m_RBRL, m_RIENB, m_XBRE, m_XBIENB, m_TIMELP, m_TIMENB);
if (new_int != m_INT)
{
// Only consider edges
m_INT = new_int;
- if (TRACE_LINES) logerror("/INT = %s\n", (m_INT)? "asserted" : "cleared");
- m_int_cb(m_INT? ASSERT_LINE : CLEAR_LINE);
+ LOGLINES("/INT = %s\n", m_INT ? "asserted" : "cleared");
+ m_int_cb(m_INT ? ASSERT_LINE : CLEAR_LINE);
}
}
@@ -106,7 +120,7 @@ void tms9902_device::rcv_cts(line_state state)
// CTSin is an internal register of the TMS9902 with positive logic
m_CTSin = (state==ASSERT_LINE);
- if (TRACE_LINES) logerror("CTS* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared");
+ LOGLINES("CTS* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared");
if (m_CTSin != previous)
{
@@ -136,7 +150,7 @@ void tms9902_device::rcv_cts(line_state state)
else
{
m_DSCH = false;
- if (TRACE_LINES) logerror("no change in CTS line, no interrupt.\n");
+ LOGLINES("no change in CTS line, no interrupt.\n");
}
}
@@ -155,7 +169,7 @@ void tms9902_device::set_clock(bool state)
void tms9902_device::rcv_dsr(line_state state)
{
bool previous = m_DSRin;
- if (TRACE_LINES) logerror("DSR* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared");
+ LOGLINES("DSR* = %s\n", (state==ASSERT_LINE)? "asserted" : "cleared");
m_DSRin = (state==ASSERT_LINE);
if (m_DSRin != previous)
@@ -166,7 +180,7 @@ void tms9902_device::rcv_dsr(line_state state)
else
{
m_DSCH = false;
- if (TRACE_LINES) logerror("no change in DSR line, no interrupt.\n");
+ LOGLINES("no change in DSR line, no interrupt.\n");
}
}
@@ -189,14 +203,14 @@ void tms9902_device::rcv_data(uint8_t data)
// Receive buffer was empty
m_RBRL = true;
m_ROVER = false;
- if (TRACE_BUFFER) logerror("Receive buffer loaded with byte %02x; RIENB=%d\n", data, m_RIENB);
+ LOGBUFFER("Receive buffer loaded with byte %02x; RIENB=%d\n", data, m_RIENB);
field_interrupts();
}
else
{
// Receive buffer was full
m_ROVER = true;
- if (TRACE_ERROR) logerror("Receive buffer still loaded; overflow error\n");
+ LOGERROR("Receive buffer still loaded; overflow error\n");
}
}
@@ -210,7 +224,7 @@ void tms9902_device::rcv_data(uint8_t data)
*/
void tms9902_device::rcv_framing_error()
{
- if (TRACE_ERROR) logerror("Detected framing error\n");
+ LOGERROR("Detected framing error\n");
m_RFER = true;
}
@@ -222,7 +236,7 @@ void tms9902_device::rcv_framing_error()
*/
void tms9902_device::rcv_parity_error()
{
- if (TRACE_ERROR) logerror("Detected parity error\n");
+ LOGERROR("Detected parity error\n");
m_RPER = true;
}
@@ -234,7 +248,7 @@ void tms9902_device::rcv_parity_error()
*/
void tms9902_device::rcv_break(bool value)
{
- if (TRACE_ERROR) logerror("Receive BREAK=%d (no effect)\n", value? 1:0);
+ LOGERROR("Receive BREAK=%d (no effect)\n", value? 1:0);
}
//------------------------------------------------
@@ -297,7 +311,7 @@ void tms9902_device::send_break(bool state)
if (state != m_BRKout)
{
m_BRKout = state;
- if (TRACE_LINES) logerror("Sending BREAK=%d\n", state? 1:0);
+ LOGLINES("Sending BREAK=%d\n", state? 1:0);
// Signal BRK (on/off) to the remote site
m_ctrl_cb((offs_t)(EXCEPT | BRK), state? 1:0);
@@ -329,7 +343,7 @@ double tms9902_device::get_baudpoll()
void tms9902_device::set_receive_data_rate()
{
int value = (m_CLK4M? 0x800 : 0) | (m_RDV8? 0x400 : 0) | m_RDR;
- if (TRACE_SETTING) logerror("receive rate = %04x\n", value);
+ LOGSETTING("receive rate = %04x\n", value);
// Calculate the ratio between receive baud rate and polling frequency
double fint = m_clock_rate / ((m_CLK4M) ? 4.0 : 3.0);
@@ -340,7 +354,7 @@ void tms9902_device::set_receive_data_rate()
// Thus the callback function should add up this value on each poll
// and deliver a data input not before it sums up to 1.
m_baudpoll = (double)(baud / (10*POLLING_FREQ));
- if (TRACE_SETTING) logerror ("baudpoll = %f\n", m_baudpoll);
+ LOGSETTING("baudpoll = %f\n", m_baudpoll);
m_last_config_value = value;
m_ctrl_cb((offs_t)CONFIG, RATERECV);
@@ -353,7 +367,7 @@ void tms9902_device::set_receive_data_rate()
void tms9902_device::set_transmit_data_rate()
{
int value = (m_CLK4M? 0x800 : 0) | (m_XDV8? 0x400 : 0) | m_XDR;
- if (TRACE_SETTING) logerror("set transmit rate = %04x\n", value);
+ LOGSETTING("set transmit rate = %04x\n", value);
m_last_config_value = value;
m_ctrl_cb((offs_t)CONFIG, RATEXMIT);
}
@@ -361,7 +375,7 @@ void tms9902_device::set_transmit_data_rate()
void tms9902_device::set_stop_bits()
{
int value = m_STOPB;
- if (TRACE_SETTING) logerror("set stop bits = %02x\n", value);
+ LOGSETTING("set stop bits = %02x\n", value);
m_last_config_value = value;
m_ctrl_cb((offs_t)CONFIG, STOPBITS);
}
@@ -369,7 +383,7 @@ void tms9902_device::set_stop_bits()
void tms9902_device::set_data_bits()
{
int value = m_RCL;
- if (TRACE_SETTING) logerror("set data bits = %02x\n", value);
+ LOGSETTING("set data bits = %02x\n", value);
m_last_config_value = value;
m_ctrl_cb((offs_t)CONFIG, DATABITS);
}
@@ -377,7 +391,7 @@ void tms9902_device::set_data_bits()
void tms9902_device::set_parity()
{
int value = (m_PENB? 2:0) | (m_ODDP? 1:0);
- if (TRACE_SETTING) logerror("set parity = %02x\n", value);
+ LOGSETTING("set parity = %02x\n", value);
m_last_config_value = value;
m_ctrl_cb((offs_t)CONFIG, PARITY);
}
@@ -386,7 +400,7 @@ void tms9902_device::transmit_line_state()
{
// 00ab cdef = setting line RTS=a, CTS=b, DSR=c, DCD=d, DTR=e, RI=f
// The 9902 only outputs RTS and BRK
- if (TRACE_SETTING) logerror("transmitting line state (only RTS) = %02x\n", (m_RTSout)? 1:0);
+ LOGSETTING("transmitting line state (only RTS) = %02x\n", (m_RTSout)? 1:0);
m_last_config_value = (m_RTSout)? RTS : 0;
m_ctrl_cb((offs_t)(LINES | RTS), RTS);
}
@@ -398,7 +412,7 @@ void tms9902_device::set_rts(line_state state)
if (lstate != m_RTSout)
{
// Signal RTS to the modem
- if (TRACE_SETTING) logerror("Set RTS=%d\n", lstate? 1:0);
+ LOGSETTING("Set RTS=%d\n", lstate? 1:0);
m_RTSout = lstate;
transmit_line_state();
}
@@ -429,7 +443,7 @@ void tms9902_device::initiate_transmit()
field_interrupts();
- if (TRACE_BUFFER) logerror("transmit XSR=%02x, RCL=%02x\n", m_XSR, m_RCL);
+ LOGBUFFER("transmit XSR=%02x, RCL=%02x\n", m_XSR, m_RCL);
m_xmit_cb((offs_t)0, m_XSR & (0xff >> (3-m_RCL)));
@@ -502,11 +516,11 @@ READ8_MEMBER( tms9902_device::cruread )
break;
case 0: // Bits 7-0
- if (TRACE_CRU) logerror("Reading received byte = %02x\n", m_RBR);
+ LOGCRU("Reading received byte = %02x\n", m_RBR);
answer = m_RBR;
break;
}
- if (TRACE_CRU && TRACE_DETAIL) logerror("Reading flag bits %d - %d = %02x\n", ((offset+1)*8-1), offset*8, answer);
+ if (VERBOSE & LOG_DETAIL) LOGCRU("Reading flag bits %d - %d = %02x\n", ((offset+1)*8-1), offset*8, answer);
return answer;
}
@@ -586,7 +600,7 @@ WRITE8_MEMBER( tms9902_device::cruwrite )
data &= 1; /* clear extra bits */
offset &= 0x1F;
- if (TRACE_CRU && TRACE_DETAIL) logerror("Setting bit %d = %02x\n", offset, data);
+ if (VERBOSE & LOG_DETAIL) LOGCRU("Setting bit %d = %02x\n", offset, data);
if (offset <= 10)
{
@@ -750,7 +764,7 @@ WRITE8_MEMBER( tms9902_device::cruwrite )
}
return;
case 17:
- if (TRACE_CRU) logerror("set BRKON=%d; BRK=%d\n", data, m_BRKout? 1:0);
+ LOGCRU("set BRKON=%d; BRK=%d\n", data, m_BRKout? 1:0);
m_BRKON = (data!=0);
if (m_BRKout && data==0)
{
@@ -778,13 +792,13 @@ WRITE8_MEMBER( tms9902_device::cruwrite )
// (the only way to clear the flag!)
m_RIENB = (data!=0);
m_RBRL = false;
- if (TRACE_CRU) logerror("Set RBRL=0, set RIENB=%d\n", data);
+ LOGCRU("Set RBRL=0, set RIENB=%d\n", data);
field_interrupts();
return;
case 19:
/* Transmit Buffer Interrupt Enable */
m_XBIENB = (data!=0);
- if (TRACE_CRU) logerror("set XBIENB=%d\n", data);
+ LOGCRU("set XBIENB=%d\n", data);
field_interrupts();
return;
case 20:
@@ -798,7 +812,7 @@ WRITE8_MEMBER( tms9902_device::cruwrite )
/* Data Set Change Interrupt Enable */
m_DSCENB = (data!=0);
m_DSCH = false;
- if (TRACE_CRU) logerror("set DSCH=0, set DSCENB=%d\n", data);
+ LOGCRU("set DSCH=0, set DSCENB=%d\n", data);
field_interrupts();
return;
case 31:
@@ -853,4 +867,4 @@ void tms9902_device::device_start()
m_sendtimer = timer_alloc(SENDTIMER);
}
-const device_type TMS9902 = device_creator<tms9902_device>;
+DEFINE_DEVICE_TYPE(TMS9902, tms9902_device, "tms9902", "TMS9902 ACC")