debut: fix occasional inverted lcd digits (nw)

This commit is contained in:
hap 2019-07-31 16:28:56 +02:00
parent 84e96a6e54
commit ad83cf2ab2
3 changed files with 36 additions and 37 deletions

View File

@ -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. It's running the Mirage chess engine by Vladimir Rybinkin, originally made for MS-DOS.
TODO: 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? - where does the interrupt come from?
- Debut-M is an updated version? Or is it the same program as Debut with a redesigned case? - Debut-M is an updated version? Or is it the same program as Debut with a redesigned case?
@ -83,7 +81,7 @@ protected:
private: private:
// devices/pointers // devices/pointers
required_device<cpu_device> m_maincpu; required_device<i8086_cpu_device> m_maincpu;
required_device<sensorboard_device> m_board; required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display; required_device<pwm_display_device> m_display;
required_device<dac_bit_interface> m_dac; required_device<dac_bit_interface> m_dac;
@ -97,12 +95,12 @@ private:
// I/O handlers // I/O handlers
INTERRUPT_GEN_MEMBER(interrupt); INTERRUPT_GEN_MEMBER(interrupt);
DECLARE_READ8_MEMBER(input_r); 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_dac_data;
u8 m_lcd_data; u8 m_lcd_update;
u8 m_digit_data[4];
}; };
void debut_state::machine_start() void debut_state::machine_start()
@ -111,16 +109,14 @@ void debut_state::machine_start()
m_out_digit.resolve(); m_out_digit.resolve();
// zerofill // zerofill
m_select = 0; memset(m_latch, 0, sizeof(m_latch));
m_dac_data = 0; m_dac_data = 0;
m_lcd_data = 0; m_lcd_update = 0;
memset(m_digit_data, 0, sizeof(m_digit_data));
// register for savestates // register for savestates
save_item(NAME(m_select)); save_item(NAME(m_latch));
save_item(NAME(m_dac_data)); save_item(NAME(m_dac_data));
save_item(NAME(m_lcd_data)); save_item(NAME(m_lcd_update));
save_item(NAME(m_digit_data));
} }
@ -137,7 +133,7 @@ INTERRUPT_GEN_MEMBER(debut_state::interrupt)
READ8_MEMBER(debut_state::input_r) READ8_MEMBER(debut_state::input_r)
{ {
u8 data = 0; u8 data = 0;
u8 sel = m_select & 0xf; u8 sel = m_latch[0] & 0xf;
// a1-a3,d0: multiplexed inputs // a1-a3,d0: multiplexed inputs
// read keypad // read keypad
@ -151,38 +147,40 @@ READ8_MEMBER(debut_state::input_r)
return ~data; return ~data;
} }
WRITE8_MEMBER(debut_state::control_w) WRITE8_MEMBER(debut_state::latch_w)
{ {
u8 mask = 1 << offset; u8 mask = 1 << offset;
u8 prev = m_select; u8 prev = m_latch[0];
// a1-a3,d0: 74259 // 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 q0-q3: input mux/led select
// 74259 q4,q5: led data // 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 // 74259 q7: toggle speaker
if (~m_select & prev & 0x80) if (~m_latch[0] & prev & 0x80)
{ {
m_dac_data ^= 1; m_dac_data ^= 1;
m_dac->write(m_dac_data); m_dac->write(m_dac_data);
} }
}
// a1-a3,d1-d4 go to lcd panel WRITE_LINE_MEMBER(debut_state::lcd_update_w)
// clock lcd digit segments {
for (int i = 0; i < 4; i++) // 8086 S5 also goes to the lcd panel
if (!state && m_lcd_update)
{ {
if (BIT(~data, i + 1)) u8 xorval = (m_latch[4] & 1) ? 0xff : 0;
m_digit_data[i] = (m_digit_data[i] & ~mask) | (m_lcd_data << offset);
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? m_lcd_update = state;
if (offset == 0)
m_lcd_data = BIT(~data, 4);
} }
@ -200,7 +198,7 @@ void debut_state::main_map(address_map &map)
void debut_state::main_io(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_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_PROGRAM, &debut_state::main_map);
m_maincpu->set_addrmap(AS_IO, &debut_state::main_io); 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); SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); 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 // 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 )

View File

@ -325,5 +325,5 @@ ROM_END
******************************************************************************/ ******************************************************************************/
/* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ /* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */
CONS( 1990, corona, 0, 0, corona, corona, corona_state, empty_init, "Saitek", "Kasparov Corona (ver. D+)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) // aka Corona II CONS( 1990, corona, 0, 0, corona, corona, corona_state, empty_init, "Saitek", "Kasparov Corona (ver. D+)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka Corona II
CONS( 1988, coronaa, corona, 0, corona, corona, corona_state, empty_init, "Saitek", "Kasparov Corona (ver. C)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) CONS( 1988, coronaa, corona, 0, corona, corona, corona_state, empty_init, "Saitek", "Kasparov Corona (ver. C)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -577,9 +577,9 @@ ROM_END
******************************************************************************/ ******************************************************************************/
/* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ /* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */
CONS( 1987, stratos, 0, 0, stratos, stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) CONS( 1987, stratos, 0, 0, stratos, stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1987, stratosa, stratos, 0, stratos, stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) CONS( 1987, stratosa, stratos, 0, stratos, stratos, stratos_state, empty_init, "SciSys", "Kasparov Stratos (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1990, tking, 0, 0, tking2, tking2, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (ver. D)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) // aka Turbo King II CONS( 1990, tking, 0, 0, tking2, tking2, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (ver. D)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka Turbo King II
CONS( 1988, tkinga, tking, 0, tking, stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (ver. B, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) CONS( 1988, tkinga, tking, 0, tking, stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (ver. B, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1988, tkingb, tking, 0, tking, stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (ver. B, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS | MACHINE_CLICKABLE_ARTWORK ) CONS( 1988, tkingb, tking, 0, tking, stratos, stratos_state, empty_init, "Saitek", "Kasparov Turbo King (ver. B, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )