diff options
Diffstat (limited to 'src/mame/drivers/aci_boris.cpp')
-rw-r--r-- | src/mame/drivers/aci_boris.cpp | 58 |
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); } |