gamemachine, boris: use pwm_display (nw)

This commit is contained in:
hap 2019-06-29 20:44:15 +02:00
parent 86b0229ba2
commit 804fc3d188
7 changed files with 96 additions and 151 deletions

View File

@ -38,6 +38,7 @@ public:
void matrix_partial(u8 start, u8 height, u64 rowsel, u64 rowdata, bool upd = true);
void matrix(u64 rowsel, u64 rowdata, bool upd = true) { matrix_partial(0, m_height, rowsel, rowdata, upd); }
void update(); // apply changes to m_rowdata
void clear() { matrix(0, 0); }
// directly handle individual element (does not affect m_rowsel), y = row num, x = row bit
int read_element(u8 y, u8 x) { return BIT(m_rowdata[y], x); }

View File

@ -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);
}

View File

@ -5,6 +5,7 @@
Applied Concepts Boris Diplomat
Hardware notes:
- F3870 MCU (Motorola SC80265P or Fairchild SL90259)
- 256 bytes RAM(2*2112-1)
- 8-digit 7seg led panel
@ -19,7 +20,7 @@ as SL90259.
#include "emu.h"
#include "cpu/f8/f8.h"
#include "machine/f3853.h"
#include "machine/timer.h"
#include "video/pwm.h"
// internal artwork
#include "aci_borisdpl.lh" // clickable
@ -33,9 +34,8 @@ public:
borisdpl_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_keypad(*this, "LINE%u", 1U),
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 borisdpl(machine_config &config);
@ -49,15 +49,13 @@ protected:
private:
// devices/pointers
required_device<cpu_device> m_maincpu;
required_ioport_array<4> m_keypad;
required_device_array<timer_device, 8> m_delay_display;
output_finder<8> m_out_digit;
required_device<pwm_display_device> m_display;
required_ioport_array<4> m_inputs;
void main_map(address_map &map);
void main_io(address_map &map);
TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
void update_display();
DECLARE_WRITE8_MEMBER(digit_w);
DECLARE_READ8_MEMBER(input_r);
DECLARE_WRITE8_MEMBER(matrix_w);
@ -71,22 +69,22 @@ private:
std::unique_ptr<u8[]> m_ram;
u8 m_ram_address;
u8 m_matrix;
u8 m_digit_data;
};
void borisdpl_state::machine_start()
{
// resolve handlers
m_out_digit.resolve();
// zerofill
m_ram = make_unique_clear<u8[]>(0x100);
m_ram_address = 0;
m_matrix = 0;
m_digit_data = 0;
// register for savestates
save_pointer(NAME(m_ram), 0x100);
save_item(NAME(m_ram_address));
save_item(NAME(m_matrix));
save_item(NAME(m_digit_data));
}
@ -97,27 +95,23 @@ void borisdpl_state::machine_start()
// F3870 ports
TIMER_DEVICE_CALLBACK_MEMBER(borisdpl_state::delay_display)
void borisdpl_state::update_display()
{
// clear digits if inactive
if (param != (m_matrix & 7))
m_out_digit[param] = 0;
m_display->matrix(1 << (m_matrix & 7), m_digit_data);
}
WRITE8_MEMBER(borisdpl_state::digit_w)
{
// digit segments, update display here
m_out_digit[m_matrix & 7] = ~data & 0x7f;
// digit segments
m_digit_data = ~data & 0x7f;
update_display();
}
WRITE8_MEMBER(borisdpl_state::matrix_w)
{
// d0-d2: MC14028B to input/digit select
// digits are strobed, so on falling edge, delay them going off to prevent flicker or stuck display
if ((data & 7) != (m_matrix & 7))
m_delay_display[m_matrix & 7]->adjust(attotime::from_msec(20), m_matrix & 7);
m_matrix = data;
update_display();
}
READ8_MEMBER(borisdpl_state::input_r)
@ -125,7 +119,7 @@ READ8_MEMBER(borisdpl_state::input_r)
// d4-d7: multiplexed inputs (only one lane can be selected at the same time)
u8 data = m_matrix;
if ((m_matrix & 7) < 4)
data |= m_keypad[m_matrix & 3]->read() << 4;
data |= m_inputs[m_matrix & 3]->read() << 4;
return data;
}
@ -156,25 +150,25 @@ void borisdpl_state::main_io(address_map &map)
******************************************************************************/
static INPUT_PORTS_START( borisdpl )
PORT_START("LINE1")
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("B/W") // black/white
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
PORT_START("LINE2")
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A.1 / Pawn")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B.2 / Knight")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C.3 / Bishop")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("Rank")
PORT_START("LINE3")
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D.4 / Rook")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E.5 / Queen")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F.6 / King")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Time")
PORT_START("LINE4")
PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Set")
@ -207,9 +201,8 @@ void borisdpl_state::borisdpl(machine_config &config)
psu.write_b().set(FUNC(borisdpl_state::ram_address_w));
/* video hardware */
for (int i = 0; i < 8; i++)
TIMER(config, m_delay_display[i]).configure_generic(FUNC(borisdpl_state::delay_display));
PWM_DISPLAY(config, m_display).set_size(8, 7);
m_display->set_segmask(0xff, 0x7f);
config.set_default_layout(layout_aci_borisdpl);
}

View File

@ -13,6 +13,8 @@ TODO:
- verify cartridge pinout, right now assume A0-A14 (max known cart size is 24KB).
Boris/Sargon cartridge is A0-A11 and 2 CS lines.
- auto-switch keypad overlays? no need for it yet
- (probably won't) add chesspieces to artwork? this machine supports more board
games than just chess: checkers, reversi, and even a blackjack game
*******************************************************************************
@ -103,7 +105,7 @@ private:
void update_display();
TIMER_DEVICE_CALLBACK_MEMBER(ca1_off) { m_via->write_ca1(0); }
u8 m_digit_select;
u8 m_inp_mux;
u16 m_digit_data;
u8 m_shift_data;
u8 m_shift_clock;
@ -123,13 +125,13 @@ private:
void ggm_state::machine_start()
{
// zerofill
m_digit_select = 0;
m_inp_mux = 0;
m_digit_data = 0;
m_shift_data = 0;
m_shift_clock = 0;
// register for savestates
save_item(NAME(m_digit_select));
save_item(NAME(m_inp_mux));
save_item(NAME(m_digit_data));
save_item(NAME(m_shift_data));
save_item(NAME(m_shift_clock));
@ -155,10 +157,7 @@ void ggm_state::update_reset(ioport_value state)
if (state)
{
m_via->reset();
// clear display
m_digit_select = 0;
update_display();
m_display->clear();
}
}
@ -192,7 +191,7 @@ READ8_MEMBER(ggm_state::cartridge_r)
void ggm_state::update_display()
{
u16 data = bitswap<16>(m_digit_data,15,7,2,11,10,3,1,9,6,14,12,5,0,4,13,8);
m_display->matrix(m_digit_select, data);
m_display->matrix(m_inp_mux, data);
}
WRITE_LINE_MEMBER(ggm_state::shift_clock_w)
@ -215,7 +214,7 @@ WRITE_LINE_MEMBER(ggm_state::shift_data_w)
WRITE8_MEMBER(ggm_state::select_w)
{
// input mux, digit select
m_digit_select = data;
m_inp_mux = data;
update_display();
}
@ -233,7 +232,7 @@ READ8_MEMBER(ggm_state::input_r)
// PB1-PB5: multiplexed inputs
for (int i = 0; i < 4; i++)
if (BIT(m_digit_select, i))
if (BIT(m_inp_mux, i))
data |= m_inputs[i]->read();
data = ~data << 1 & 0x3e;

View File

@ -10,7 +10,7 @@ It was possibly created by VTech, but they didn't distribute it by themselves
until later in 1980 as the Computer Game System. There's also a handheld version
"Mini Game Machine". VTech later made a sequel "Game Machine 2" with 5 games.
hardware notes:
Hardware notes:
- Mostek MK3870 MCU, 2KB internal ROM
- 12 digits 7seg VFD panel
- MC1455P(555 timer) + bunch of discrete components for sound
@ -20,6 +20,9 @@ TODO:
the MK3870 has an internal /2 divider, this is way too slow when compared to
video references of the game
BTANB:
- some digit segments get stuck after crashing in the GP game
*******************************************************************************
After boot, press a number to start a game:
@ -58,13 +61,16 @@ Grand Prix:
#include "emu.h"
#include "cpu/f8/f8.h"
#include "video/pwm.h"
#include "machine/f3853.h"
#include "machine/timer.h"
#include "speaker.h"
#include "machine/netlist.h"
#include "netlist/devices/net_lib.h"
// internal artwork
#include "tgm.lh"
/*
* Netlist below provided under Creative Commons CC0
*/
@ -156,13 +162,9 @@ public:
tgm_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_display(*this, "display"),
m_audio_pin(*this, "snd_nl:p%02u", 8U),
m_keypad(*this, "IN.%u", 0),
m_delay_display(*this, "delay_display_%u", 0),
m_out_digit(*this, "digit%u", 0U),
m_inp_mux(0),
m_digit_select(0),
m_digit_data(0)
m_inputs(*this, "IN.%u", 0)
{ }
void tgm(machine_config &config);
@ -173,17 +175,14 @@ protected:
private:
// devices/pointers
required_device<cpu_device> m_maincpu;
required_device<pwm_display_device> m_display;
required_device_array<netlist_mame_logic_input_device, 8> m_audio_pin;
required_ioport_array<10> m_keypad;
required_device_array<timer_device, 12> m_delay_display;
output_finder<12> m_out_digit;
required_ioport_array<10> m_inputs;
void main_map(address_map &map);
void main_io(address_map &map);
TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
void update_display(u16 edge);
void update_display();
DECLARE_WRITE8_MEMBER(mux1_w);
DECLARE_WRITE8_MEMBER(mux2_w);
DECLARE_WRITE8_MEMBER(digit_w);
@ -197,8 +196,10 @@ private:
void tgm_state::machine_start()
{
// resolve handlers
m_out_digit.resolve();
// zerofill
m_inp_mux = 0;
m_digit_select = 0;
m_digit_data = 0;
// register for savestates
save_item(NAME(m_inp_mux));
@ -212,42 +213,22 @@ void tgm_state::machine_start()
Devices, I/O
******************************************************************************/
// display handling
TIMER_DEVICE_CALLBACK_MEMBER(tgm_state::delay_display)
{
// clear VFD outputs
if (!BIT(m_digit_select, param))
m_out_digit[param] = 0;
}
void tgm_state::update_display(u16 edge)
{
for (int i = 0; i < 12; i++)
{
// output VFD digit data
if (BIT(m_digit_select, i))
m_out_digit[i] = m_digit_data;
// they're strobed, so on falling edge, delay them going off to prevent flicker or stuck display
// BTANB: some digit segments get stuck after crashing in the GP game, it's not due to the simulated delay here
else if (BIT(edge, i))
m_delay_display[i]->adjust(attotime::from_msec(20), i);
}
}
// MK3870 ports
void tgm_state::update_display()
{
// output VFD digit data
m_display->matrix(m_digit_select, m_digit_data);
}
WRITE8_MEMBER(tgm_state::mux1_w)
{
// P00-P06: input mux part
m_inp_mux = (m_inp_mux & 7) | (data << 3 & 0x3f8);
// P00-P07: digit select part
u16 prev = m_digit_select;
m_digit_select = (m_digit_select & 0xf) | (data << 4);
update_display(m_digit_select ^ prev);
update_display();
}
WRITE8_MEMBER(tgm_state::mux2_w)
@ -256,16 +237,15 @@ WRITE8_MEMBER(tgm_state::mux2_w)
m_inp_mux = (m_inp_mux & 0x3f8) | (data >> 5 & 7);
// P14-P17: digit select part
u16 prev = m_digit_select;
m_digit_select = (m_digit_select & 0xff0) | (data >> 4 & 0xf);
update_display(m_digit_select ^ prev);
update_display();
}
WRITE8_MEMBER(tgm_state::digit_w)
{
// P50-P57: digit 7seg data
m_digit_data = bitswap<8>(data,0,1,2,3,4,5,6,7);
update_display(0);
update_display();
}
READ8_MEMBER(tgm_state::input_r)
@ -275,7 +255,7 @@ READ8_MEMBER(tgm_state::input_r)
// P12,P13: multiplexed inputs
for (int i = 0; i < 10; i++)
if (m_inp_mux >> i & 1)
data |= m_keypad[i]->read();
data |= m_inputs[i]->read();
return data << 2;
}
@ -372,9 +352,8 @@ void tgm_state::tgm(machine_config &config)
psu.write_b().set(FUNC(tgm_state::digit_w));
/* video hardware */
for (int i = 0; i < 12; i++)
TIMER(config, m_delay_display[i]).configure_generic(FUNC(tgm_state::delay_display));
PWM_DISPLAY(config, m_display).set_size(12, 8);
m_display->set_segmask(0xfff, 0xff);
config.set_default_layout(layout_tgm);
/* sound hardware */

View File

@ -165,10 +165,7 @@ void mk1_state::update_reset(ioport_value state)
// clear display
if (state)
{
m_digit_select = 0;
update_display();
}
m_display->clear();
}

View File

@ -294,25 +294,25 @@
<bezel element="disk_white"><bounds x="34.5" y="54.5" width="1" height="1" /></bezel>
<bezel element="disk_black"><bounds x="44.5" y="54.5" width="1" height="1" /></bezel>
<bezel element="hl" inputtag="LINE4" inputmask="0x01"><bounds x="20" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE4" inputmask="0x02"><bounds x="30" y="30" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="LINE4" inputmask="0x04"><bounds x="40" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE1" inputmask="0x01"><bounds x="50" y="30" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="LINE1" inputmask="0x04"><bounds x="60" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="20" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="30" y="30" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="40" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="50" y="30" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="60" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="RESET" inputmask="0x01"><bounds x="80" y="30" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE3" inputmask="0x08"><bounds x="10" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE3" inputmask="0x01"><bounds x="20" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="LINE3" inputmask="0x02"><bounds x="30" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE3" inputmask="0x04"><bounds x="40" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="LINE1" inputmask="0x02"><bounds x="60" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="LINE4" inputmask="0x08"><bounds x="70" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="10" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="20" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="30" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="40" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="60" y="40" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="70" y="40" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE2" inputmask="0x01"><bounds x="20" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE2" inputmask="0x02"><bounds x="30" y="50" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="LINE2" inputmask="0x04"><bounds x="40" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE2" inputmask="0x08"><bounds x="60" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="LINE1" inputmask="0x08"><bounds x="80" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="20" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="30" y="50" width="10" height="10" /><color alpha="0.2" /></bezel>
<bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="40" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="60" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
<bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="80" y="50" width="10" height="10" /><color alpha="0.4" /></bezel>
</view>
</mamelayout>