summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/debut.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/debut.cpp')
-rw-r--r--src/mame/drivers/debut.cpp59
1 files changed, 29 insertions, 30 deletions
diff --git a/src/mame/drivers/debut.cpp b/src/mame/drivers/debut.cpp
index 345b63940cb..300427dc098 100644
--- a/src/mame/drivers/debut.cpp
+++ b/src/mame/drivers/debut.cpp
@@ -9,8 +9,6 @@ Released in 1994 in Russian Federation by ЭНЕРГОПРИБОР (Energopribor
It's running the Mirage chess engine by Vladimir Rybinkin, originally made for MS-DOS.
TODO:
-- where is lcd segments common active state? (see m_lcd_data), current implementation
- is wrong, it will occasionally display wrong (inverted) digits
- where does the interrupt come from?
- Debut-M is an updated version? Or is it the same program as Debut with a redesigned case?
@@ -83,7 +81,7 @@ protected:
private:
// devices/pointers
- required_device<cpu_device> m_maincpu;
+ required_device<i8086_cpu_device> m_maincpu;
required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display;
required_device<dac_bit_interface> m_dac;
@@ -97,12 +95,12 @@ private:
// I/O handlers
INTERRUPT_GEN_MEMBER(interrupt);
DECLARE_READ8_MEMBER(input_r);
- DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(latch_w);
+ DECLARE_WRITE_LINE_MEMBER(lcd_update_w);
- u8 m_select;
+ u8 m_latch[5];
u8 m_dac_data;
- u8 m_lcd_data;
- u8 m_digit_data[4];
+ u8 m_lcd_update;
};
void debut_state::machine_start()
@@ -111,16 +109,14 @@ void debut_state::machine_start()
m_out_digit.resolve();
// zerofill
- m_select = 0;
+ memset(m_latch, 0, sizeof(m_latch));
m_dac_data = 0;
- m_lcd_data = 0;
- memset(m_digit_data, 0, sizeof(m_digit_data));
+ m_lcd_update = 0;
// register for savestates
- save_item(NAME(m_select));
+ save_item(NAME(m_latch));
save_item(NAME(m_dac_data));
- save_item(NAME(m_lcd_data));
- save_item(NAME(m_digit_data));
+ save_item(NAME(m_lcd_update));
}
@@ -137,7 +133,7 @@ INTERRUPT_GEN_MEMBER(debut_state::interrupt)
READ8_MEMBER(debut_state::input_r)
{
u8 data = 0;
- u8 sel = m_select & 0xf;
+ u8 sel = m_latch[0] & 0xf;
// a1-a3,d0: multiplexed inputs
// read keypad
@@ -151,38 +147,40 @@ READ8_MEMBER(debut_state::input_r)
return ~data;
}
-WRITE8_MEMBER(debut_state::control_w)
+WRITE8_MEMBER(debut_state::latch_w)
{
u8 mask = 1 << offset;
- u8 prev = m_select;
+ u8 prev = m_latch[0];
// a1-a3,d0: 74259
- m_select = (m_select & ~mask) | ((data & 1) ? mask : 0);
+ // a1-a3,d1-d4: lcd panel 7seg data
+ for (int i = 0; i < 5; i++)
+ m_latch[i] = (m_latch[i] & ~mask) | (BIT(data, i) ? mask : 0);
// 74259 q0-q3: input mux/led select
// 74259 q4,q5: led data
- m_display->matrix(~m_select >> 4 & 3, 1 << (m_select & 0xf));
+ m_display->matrix(~m_latch[0] >> 4 & 3, 1 << (m_latch[0] & 0xf));
// 74259 q7: toggle speaker
- if (~m_select & prev & 0x80)
+ if (~m_latch[0] & prev & 0x80)
{
m_dac_data ^= 1;
m_dac->write(m_dac_data);
}
+}
- // a1-a3,d1-d4 go to lcd panel
- // clock lcd digit segments
- for (int i = 0; i < 4; i++)
+WRITE_LINE_MEMBER(debut_state::lcd_update_w)
+{
+ // 8086 S5 also goes to the lcd panel
+ if (!state && m_lcd_update)
{
- if (BIT(~data, i + 1))
- m_digit_data[i] = (m_digit_data[i] & ~mask) | (m_lcd_data << offset);
+ u8 xorval = (m_latch[4] & 1) ? 0xff : 0;
- m_out_digit[i] = bitswap<8>(m_digit_data[i],0,7,4,3,2,1,6,5);
+ for (int i = 0; i < 4; i++)
+ m_out_digit[i] = bitswap<8>(m_latch[i+1] ^ xorval,0,7,4,3,2,1,6,5);
}
- // where is lcd common state?
- if (offset == 0)
- m_lcd_data = BIT(~data, 4);
+ m_lcd_update = state;
}
@@ -200,7 +198,7 @@ void debut_state::main_map(address_map &map)
void debut_state::main_io(address_map &map)
{
- map(0x00, 0x0f).rw(FUNC(debut_state::input_r), FUNC(debut_state::control_w)).umask16(0x00ff);
+ map(0x00, 0x0f).rw(FUNC(debut_state::input_r), FUNC(debut_state::latch_w)).umask16(0x00ff);
}
@@ -237,6 +235,7 @@ void debut_state::debutm(machine_config &config)
m_maincpu->set_periodic_int(FUNC(debut_state::interrupt), attotime::from_hz(380));
m_maincpu->set_addrmap(AS_PROGRAM, &debut_state::main_map);
m_maincpu->set_addrmap(AS_IO, &debut_state::main_io);
+ m_maincpu->if_handler().set(FUNC(debut_state::lcd_update_w));
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
@@ -274,4 +273,4 @@ ROM_END
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
-CONS( 1994, debutm, 0, 0, debutm, debutm, debut_state, empty_init, "Energopribor", "Debut-M", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1994, debutm, 0, 0, debutm, debutm, debut_state, empty_init, "Energopribor", "Debut-M", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )