summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/aci_boris.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/aci_boris.cpp')
-rw-r--r--src/mame/drivers/aci_boris.cpp58
1 files changed, 17 insertions, 41 deletions
diff --git a/src/mame/drivers/aci_boris.cpp b/src/mame/drivers/aci_boris.cpp
index 0165a7a4382..7d87bd3efd2 100644
--- a/src/mame/drivers/aci_boris.cpp
+++ b/src/mame/drivers/aci_boris.cpp
@@ -5,6 +5,7 @@
Applied Concepts Boris (electronic chess computer)
+Hardware notes:
- MK3850N-3 CPU @ 2 MHz from XTAL, MK3853N memory interface
- 256 bytes RAM(2*2112), 2*AMI 2KB ROM (2nd ROM only half used)
- 8-digit 16seg led panel
@@ -23,7 +24,7 @@ ROM labeled 007-7027-00.
#include "emu.h"
#include "cpu/f8/f8.h"
#include "machine/f3853.h"
-#include "machine/timer.h"
+#include "video/pwm.h"
// internal artwork
#include "aci_boris.lh" // clickable
@@ -37,9 +38,8 @@ public:
boris_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_inputs(*this, "IN.%u", 0),
- m_delay_display(*this, "delay_display_%u", 0),
- m_out_digit(*this, "digit%u", 0U)
+ m_display(*this, "display"),
+ m_inputs(*this, "IN.%u", 0)
{ }
void boris(machine_config &config);
@@ -53,31 +53,25 @@ protected:
private:
// devices/pointers
required_device<cpu_device> m_maincpu;
+ required_device<pwm_display_device> m_display;
required_ioport_array<4> m_inputs;
- required_device_array<timer_device, 8> m_delay_display;
- output_finder<8> m_out_digit;
void main_map(address_map &map);
void main_io(address_map &map);
void update_reset(ioport_value state);
- TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
+ void update_display();
DECLARE_WRITE8_MEMBER(mux_w);
DECLARE_WRITE8_MEMBER(digit_w);
DECLARE_READ8_MEMBER(input_r);
- void update_4042();
-
u8 m_io[2]; // MK3850 I/O ports
u8 m_4042; // 4042 latch output
};
void boris_state::machine_start()
{
- // resolve handlers
- m_out_digit.resolve();
-
// zerofill
memset(m_io, 0, sizeof(m_io));
m_4042 = 0;
@@ -99,10 +93,7 @@ void boris_state::update_reset(ioport_value state)
// clear display
if (state)
- {
- for (int i = 0; i < 8; i++)
- m_delay_display[i]->adjust(attotime::zero, i);
- }
+ m_display->clear();
}
@@ -113,39 +104,24 @@ void boris_state::update_reset(ioport_value state)
// MK3850 ports/TTL
-TIMER_DEVICE_CALLBACK_MEMBER(boris_state::delay_display)
-{
- // 16 segments via port 1 and 4042 output (latched port 1)
- u16 mask = (param & 8) ? 0xffff : 0;
- m_out_digit[param & 7] = ~(m_4042 << 8 | m_io[1]) & mask;
-}
-
-void boris_state::update_4042()
+void boris_state::update_display()
{
// port 1 is latched as long as 4042 clock is low
// (yes low, this is actually (~~m_io[0] & 8) since output ports are inverted)
if (m_io[0] & 8)
m_4042 = bitswap<8>(m_io[1],4,2,0,6,5,1,3,7);
+
+ // 16 segments via port 1 and 4042 output (latched port 1)
+ u16 seg_data = ~(m_4042 << 8 | m_io[1]);
+ m_display->matrix(1 << (~m_io[0] & 7), seg_data);
}
WRITE8_MEMBER(boris_state::mux_w)
{
// IO00-IO02: 4028 A-C to digit/input mux (4028 D to GND)
- u8 prev = ~m_io[0] & 7;
- u8 sel = ~data & 7;
- if (sel != prev)
- {
- // digits are strobed, so on falling edge, delay them going off to prevent flicker or stuck display
- m_delay_display[prev]->adjust(attotime::from_msec(50), prev);
-
- // need a short delay on rising edge too, while boris sets up digit segments
- // (it writes port 1, increments digit, latches port 1, writes port 1 again)
- m_delay_display[sel]->adjust(attotime::from_usec(50), sel | 8);
- }
-
// IO03: clock 4042
m_io[0] = data;
- update_4042();
+ update_display();
}
READ8_MEMBER(boris_state::input_r)
@@ -163,7 +139,7 @@ WRITE8_MEMBER(boris_state::digit_w)
{
// IO10-IO17: digit segments
m_io[1] = data;
- update_4042();
+ update_display();
}
@@ -239,9 +215,9 @@ void boris_state::boris(machine_config &config)
smi.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
/* video hardware */
- for (int i = 0; i < 8; i++)
- TIMER(config, m_delay_display[i]).configure_generic(FUNC(boris_state::delay_display));
-
+ PWM_DISPLAY(config, m_display).set_size(8, 16);
+ m_display->set_segmask(0xff, 0xffff);
+ m_display->set_bri_levels(0.05);
config.set_default_layout(layout_aci_boris);
}