Add logging to r10788 and fix timer setup (nw)

This commit is contained in:
jbu 2014-12-09 15:47:35 +01:00
parent 067104ef7f
commit 5806b90357
3 changed files with 54 additions and 11 deletions

View File

@ -41,6 +41,12 @@
#include "emu.h"
#include "machine/r10788.h"
#define VERBOSE 1
#if VERBOSE
#define LOG(x) logerror x
#else
#define LOG(x)
#endif
/*************************************
*
@ -53,8 +59,8 @@ const device_type R10788 = &device_creator<r10788_device>;
r10788_device::r10788_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, R10788, "Rockwell 10788", tag, owner, clock, "r10788", __FILE__),
m_reg(),
m_ktr(0), m_kts(0), m_kla(0), m_klb(0), m_enable(3), m_ker(0),
m_scan_counter(0),
m_ktr(0), m_kts(0), m_kla(0), m_klb(0), m_mask_a(15), m_mask_b(15), m_ker(0),
m_io_counter(0), m_scan_counter(0),
m_display(*this)
{
}
@ -71,12 +77,15 @@ void r10788_device::device_start()
save_item(NAME(m_kts));
save_item(NAME(m_kla));
save_item(NAME(m_klb));
save_item(NAME(m_enable));
save_item(NAME(m_mask_a));
save_item(NAME(m_mask_b));
save_item(NAME(m_ker));
save_item(NAME(m_io_counter));
save_item(NAME(m_scan_counter));
m_timer = timer_alloc(TIMER_DISPLAY);
m_timer->adjust(clocks_to_attotime(36));
// recurring timer every 36 cycles
m_timer->adjust(clocks_to_attotime(36), 0, clocks_to_attotime(36));
}
/**
@ -90,7 +99,8 @@ void r10788_device::device_reset()
m_kts = 0;
m_kla = 0;
m_klb = 0;
m_enable = 3;
m_mask_a = 15;
m_mask_b = 15;
m_ker = 0;
m_scan_counter = 0;
}
@ -105,13 +115,19 @@ void r10788_device::device_reset()
*/
void r10788_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
m_scan_counter = (m_scan_counter + 1) % 16;
UINT8 data;
switch (id)
{
case TIMER_DISPLAY:
m_display(m_scan_counter, m_reg[0][m_scan_counter] << 4 | m_reg[1][m_scan_counter], 0xff);
data = (m_reg[0][m_scan_counter] & m_mask_a) +
16 * (m_reg[1][m_scan_counter] & m_mask_b);
LOG(("%s: scan counter:%2d data:%02x\n", __FUNCTION__, m_scan_counter, data));
m_display(m_scan_counter, data, 0xff);
break;
default:
LOG(("%s: invalid timer id:%d\n", __FUNCTION__, id));
}
m_scan_counter = (m_scan_counter + 1) % 16;
}
/*************************************
@ -132,27 +148,39 @@ WRITE8_MEMBER( r10788_device::io_w )
switch (offset)
{
case KTR: // Transfer Keyboard Return
LOG(("%s: KTR data:%02x\n", __FUNCTION__, data));
m_ktr = data;
break;
case KTS: // Transfer Keyboard Strobe
LOG(("%s: KTS data:%02x\n", __FUNCTION__, data));
m_kts = data;
break;
case KLA: // Load Display Register A
LOG(("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data));
m_kla = data;
m_reg[0][m_io_counter] = m_kla;
break;
case KLB: // Load Display Register B
LOG(("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data));
m_klb = data;
m_reg[1][m_io_counter] = m_kla;
break;
case KDN: // Turn On Display
m_enable = 1 | 2;
LOG(("%s: KDN data:%02x\n", __FUNCTION__, data));
m_mask_a = 15;
m_mask_b = 15;
break;
case KAF: // Turn Off A
m_enable &= ~1;
LOG(("%s: KAF data:%02x\n", __FUNCTION__, data));
m_mask_a = 0;
m_mask_b &= ~3;
break;
case KBF: // Turn Off B
m_enable &= ~1;
LOG(("%s: KBF data:%02x\n", __FUNCTION__, data));
m_mask_b &= ~12;
break;
case KER: // Reset Keyboard Error
LOG(("%s: KER data:%02x\n", __FUNCTION__, data));
m_ker = 10;
break;
}
@ -167,23 +195,35 @@ READ8_MEMBER( r10788_device::io_r )
{
case KTR: // Transfer Keyboard Return
data = m_ktr;
LOG(("%s: KTR data:%02x\n", __FUNCTION__, data));
break;
case KTS: // Transfer Keyboard Strobe
data = m_kts;
LOG(("%s: KTS data:%02x\n", __FUNCTION__, data));
break;
case KLA: // Load Display Register A
m_kla = m_reg[0][m_io_counter];
data = m_kla;
LOG(("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data));
break;
case KLB: // Load Display Register B
m_klb = m_reg[1][m_io_counter];
data = m_klb;
LOG(("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data));
// FIXME: does it automagically increment at KLB write?
m_io_counter = (m_io_counter + 1) % 16;
break;
case KDN: // Turn On Display
LOG(("%s: KDN data:%02x\n", __FUNCTION__, data));
break;
case KAF: // Turn Off A
LOG(("%s: KAF data:%02x\n", __FUNCTION__, data));
break;
case KBF: // Turn Off B
LOG(("%s: KBF data:%02x\n", __FUNCTION__, data));
break;
case KER: // Reset Keyboard Error
LOG(("%s: KER data:%02x\n", __FUNCTION__, data));
break;
}
return data;

View File

@ -60,8 +60,10 @@ private:
UINT8 m_kts; //!< transfer keyboard strobe value
UINT8 m_kla; //!< display register A value
UINT8 m_klb; //!< display register B value
UINT8 m_enable; //!< display enable flags for A (1) and B (2)
UINT8 m_mask_a; //!< display enable bits for A
UINT8 m_mask_b; //!< display enable bits for B
UINT8 m_ker; //!< keyboard error value
int m_io_counter; //!< current I/O register index
int m_scan_counter; //!< current display scan
devcb_write8 m_display; //!< display updater
emu_timer* m_timer; //!< timer running at clock / 18 / 36

View File

@ -216,6 +216,7 @@ DRIVER_INIT_MEMBER(gts1_state,gts1)
*/
WRITE8_MEMBER(gts1_state::gts1_display_w)
{
LOG(("%s: offset:%d data:%02x\n", __FUNCTION__, offset, data));
output_set_digit_value(offset, data);
}