hh_amis2k driver rewrite (nw)

This commit is contained in:
hap 2019-03-06 21:47:37 +01:00
parent d246606018
commit 1c30786bc5
13 changed files with 554 additions and 428 deletions

View File

@ -30,12 +30,13 @@ public:
// S2000 has a hardcoded 7seg table, that (unlike S2200) is officially // S2000 has a hardcoded 7seg table, that (unlike S2200) is officially
// uncustomizable, but wildfire proves to be an exception to that rule. // uncustomizable, but wildfire proves to be an exception to that rule.
void set_7seg_table(const u8 *ptr) { m_7seg_table = ptr; } void set_7seg_table(const u8 *ptr) { m_7seg_table = ptr; } // d0=A, d1=B, etc.
void data_64x4(address_map &map); void data_64x4(address_map &map);
void data_80x4(address_map &map); void data_80x4(address_map &map);
void program_1_5k(address_map &map); void program_1_5k(address_map &map);
void program_1k(address_map &map); void program_1k(address_map &map);
protected: protected:
// construction/destruction // construction/destruction
amis2000_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 bu_bits, u8 callstack_bits, u8 callstack_depth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data) amis2000_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 bu_bits, u8 callstack_bits, u8 callstack_depth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data)

View File

@ -220,11 +220,13 @@ void amis2000_base_device::op_disn()
// DISN: set D-latch to ACC+carry via on-die segment decoder // DISN: set D-latch to ACC+carry via on-die segment decoder
static const u8 lut_segment_decoder[0x10] = static const u8 lut_segment_decoder[0x10] =
{ {
// 0-F digits in bit order [DP]abcdefg 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0-7
0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x77, 0x1f, 0x4e, 0x3d, 0x4f, 0x47 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 // 8-F
}; };
const u8 *ptr = (m_7seg_table != nullptr) ? m_7seg_table : lut_segment_decoder; const u8 *lut = (m_7seg_table != nullptr) ? m_7seg_table : lut_segment_decoder;
m_d = ptr[m_acc] | (m_carry ? 0x80 : 0x00);
// segments are in order [DP]abcdefg
m_d = bitswap<7>(lut[m_acc],0,1,2,3,4,5,6) | (m_carry ? 0x80 : 0x00);
d_latch_out(true); d_latch_out(true);
} }
@ -500,7 +502,6 @@ void amis2000_base_device::op_rf2()
} }
// AMI S2152 specific handlers // AMI S2152 specific handlers
void amis2152_cpu_device::d2f_timer_clock() void amis2152_cpu_device::d2f_timer_clock()

View File

@ -21,9 +21,9 @@ public:
~speaker_sound_device() {} ~speaker_sound_device() {}
// configuration // configuration
void set_levels(int num_levels, const int16_t *levels) { m_num_levels = num_levels; m_levels = levels;} void set_levels(int num_levels, const int16_t *levels) { m_num_levels = num_levels; m_levels = levels; }
void level_w(int new_level); void level_w(int new_level); // can use as writeline
protected: protected:
// device-level overrides // device-level overrides

View File

@ -2,339 +2,390 @@
// copyright-holders:hap // copyright-holders:hap
/*************************************************************************** /***************************************************************************
Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen AMI S2000 series handhelds or other simple devices.
* AMI S2150, labeled C10641
This is an electronic handheld pinball game. It has dozens of small leds
to create the illusion of a moving ball, and even the flippers are leds.
A drawing of a pinball table is added as overlay.
NOTE!: MAME external artwork is required
TODO: TODO:
- driver needs a cleanup when another AMI S2000 handheld gets dumped/added - were any other handhelds with this MCU released?
- wildfire sound can be improved, volume decay should be more steep at the start,
- sound emulation could still be improved and the pitch sounds wrong too (latter is an MCU emulation problem)
- when the game strobes a led faster, it should appear brighter, for example when - leds are sometimes strobed faster/longer to appear at a different brightness,
the ball hits one of the bumpers eg. wildfire bumpers
- 7seg decoder is guessed
- MCU clock is unknown
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "cpu/amis2000/amis2000.h" #include "cpu/amis2000/amis2000.h"
#include "machine/timer.h" #include "machine/timer.h"
#include "sound/spkrdev.h" #include "sound/spkrdev.h"
#include "speaker.h" #include "speaker.h"
#include "wildfire.lh" // this is a test layout, use external artwork // internal artwork
#include "wildfire.lh"
// master clock is a single stage RC oscillator: R=?K, C=?pf, //#include "hh_amis2k_test.lh" // common test-layout - use external artwork
// S2000 default frequency is 850kHz
#define MASTER_CLOCK (850000)
class wildfire_state : public driver_device class hh_amis2k_state : public driver_device
{
public:
hh_amis2k_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0),
m_out_x(*this, "%u.%u", 0U, 0U),
m_out_a(*this, "%u.a", 0U),
m_out_digit(*this, "digit%u", 0U),
m_speaker(*this, "speaker"),
m_display_wait(33),
m_display_maxy(1),
m_display_maxx(0)
{ }
// devices
required_device<amis2000_base_device> m_maincpu;
optional_ioport_array<4> m_inp_matrix; // max 4
output_finder<0x20, 0x20> m_out_x;
output_finder<0x20> m_out_a;
output_finder<0x20> m_out_digit;
optional_device<speaker_sound_device> m_speaker;
// misc common
u16 m_a; // MCU address bus
u8 m_d; // MCU data bus
int m_f; // MCU F_out pin
u16 m_inp_mux; // multiplexed inputs mask
u8 read_inputs(int columns);
// display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
int m_display_maxy; // display matrix number of rows
int m_display_maxx; // display matrix number of columns (max 31 for now)
u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
void set_display_segmask(u32 digits, u32 mask);
void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
};
// machine start/reset
void hh_amis2k_state::machine_start()
{
// resolve handlers
m_out_x.resolve();
m_out_a.resolve();
m_out_digit.resolve();
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_decay, 0, sizeof(m_display_decay));
memset(m_display_segmask, 0, sizeof(m_display_segmask));
m_a = 0;
m_d = 0;
m_f = 0;
m_inp_mux = 0;
// register for savestates
save_item(NAME(m_display_maxy));
save_item(NAME(m_display_maxx));
save_item(NAME(m_display_wait));
save_item(NAME(m_display_state));
save_item(NAME(m_display_decay));
save_item(NAME(m_display_segmask));
save_item(NAME(m_a));
save_item(NAME(m_d));
save_item(NAME(m_f));
save_item(NAME(m_inp_mux));
}
void hh_amis2k_state::machine_reset()
{
}
/***************************************************************************
Helper Functions
***************************************************************************/
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
void hh_amis2k_state::display_update()
{
for (int y = 0; y < m_display_maxy; y++)
{
u32 active_state = 0;
for (int x = 0; x <= m_display_maxx; x++)
{
// turn on powered segments
if (m_display_state[y] >> x & 1)
m_display_decay[y][x] = m_display_wait;
// determine active state
u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state |= (ds << x);
// output to y.x, or y.a when always-on
if (x != m_display_maxx)
m_out_x[y][x] = ds;
else
m_out_a[y] = ds;
}
// output to digity
if (m_display_segmask[y] != 0)
m_out_digit[y] = active_state & m_display_segmask[y];
}
}
TIMER_DEVICE_CALLBACK_MEMBER(hh_amis2k_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
for (int x = 0; x <= m_display_maxx; x++)
if (m_display_decay[y][x] != 0)
m_display_decay[y][x]--;
display_update();
}
void hh_amis2k_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
void hh_amis2k_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
{
if (digits & 1)
m_display_segmask[i] = mask;
digits >>= 1;
}
}
void hh_amis2k_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
if (update)
display_update();
}
// generic input handlers
u8 hh_amis2k_state::read_inputs(int columns)
{
u8 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read();
return ret;
}
/***************************************************************************
Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs)
***************************************************************************/
namespace {
/***************************************************************************
Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen
* AMI S2150, labeled C10641
* RC circuit for speaker volume decay (see patent US4334679 FIG.5,
the 2 resistors at A12 are 10K and the cap is 4.7uF)
This is an electronic handheld pinball game. It has dozens of small leds
to create the illusion of a moving ball, and even the flippers are leds.
A drawing of a pinball table is added as overlay.
led translation table: led Lzz from patent US4334679 FIG.4* = MAME y.x:
*note: 2 mistakes in it: L19 between L12 and L14 should be L13, and L84 should of course be L48
0 = - 10 = 6.6 20 = 4.5 30 = 5.3 40 = 5.7 50 = 11.6
1 = 10.7 11 = 5.6 21 = 4.4 31 = 4.3 41 = 6.0 51 = 11.5
2 = 10.0 12 = 6.5 22 = 5.4 32 = 5.2 42 = 7.0 52 = 11.4
3 = 10.1 13 = 7.5 23 = 6.3 33 = 5.1 43 = 8.0 53 = 11.3
4 = 10.2 14 = 8.5 24 = 7.3 34 = 11.7 44 = 9.0 60 = 3.6
5 = 10.3 15 = 9.4 25 = 11.1 35 = 7.1 45 = 6.7 61 = 3.6(!)
6 = 10.4 16 = 8.4 26 = 9.3 36 = 9.1 46 = 7.7 62 = 3.5
7 = 10.5 17 = 7.4 27 = 9.2 37 = 5.0 47 = 8.7 63 = 3.5(!)
8 = 8.6 18 = 11.2 28 = 8.2 38 = 6.1 48 = 9.7 70 = 3.3
9 = 7.6 19 = 5.5 29 = 11.0 39 = 8.1 49 = -
NOTE!: MAME external artwork is required
***************************************************************************/
class wildfire_state : public hh_amis2k_state
{ {
public: public:
wildfire_state(const machine_config &mconfig, device_type type, const char *tag) : wildfire_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag), hh_amis2k_state(mconfig, type, tag)
m_maincpu(*this, "maincpu"),
m_speaker(*this, "speaker"),
m_a12_decay_timer(*this, "a12_decay"),
m_digits(*this, "digit%u", 0U),
m_lamps(*this, "lamp%u", 0U)
{ } { }
void wildfire(machine_config &config); void prepare_display();
private:
virtual void machine_start() override;
DECLARE_WRITE8_MEMBER(write_d); DECLARE_WRITE8_MEMBER(write_d);
DECLARE_WRITE16_MEMBER(write_a); DECLARE_WRITE16_MEMBER(write_a);
DECLARE_WRITE_LINE_MEMBER(write_f); DECLARE_WRITE_LINE_MEMBER(write_f);
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void speaker_update();
TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim);
double m_speaker_volume;
void wildfire(machine_config &config);
bool index_is_7segled(int index); protected:
void display_update(); virtual void machine_start() override;
TIMER_DEVICE_CALLBACK_MEMBER(reset_q2);
void write_a12(int state);
void sound_update();
required_device<amis2152_cpu_device> m_maincpu;
required_device<speaker_sound_device> m_speaker;
required_device<timer_device> m_a12_decay_timer;
output_finder<3> m_digits;
output_finder<16 * 10> m_lamps; // only ones ending in 0-7 are used, 8-9 are unused
u8 m_d;
u16 m_a;
u8 m_q2;
u8 m_q3;
u16 m_display_state[0x10];
u8 m_display_decay[0x100];
}; };
void wildfire_state::machine_start()
/***************************************************************************
LED Display
***************************************************************************/
// The device strobes the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
// decay time, in steps of 1ms
#define DISPLAY_DECAY_TIME 40
inline bool wildfire_state::index_is_7segled(int index)
{ {
// first 3 A are 7segleds hh_amis2k_state::machine_start();
return (index < 3);
// zerofill/init
m_speaker_volume = 0;
save_item(NAME(m_speaker_volume));
} }
// lamp translation table: Lzz from patent US4334679 FIG.4 = MAME lampxxy, // handlers
// where xx is led column and y is led row, eg. lamp103 is output A10 D3
// (note: 2 mistakes in the patent: the L19 between L12 and L14 should be L13, and L84 should of course be L48)
/*
L0 = - L10 = lamp60 L20 = lamp41 L30 = lamp53 L40 = lamp57 L50 = lamp110
L1 = lamp107 L11 = lamp50 L21 = lamp42 L31 = lamp43 L41 = lamp66 L51 = lamp111
L2 = lamp106 L12 = lamp61 L22 = lamp52 L32 = lamp54 L42 = lamp76 L52 = lamp112
L3 = lamp105 L13 = lamp71 L23 = lamp63 L33 = lamp55 L43 = lamp86 L53 = lamp113
L4 = lamp104 L14 = lamp81 L24 = lamp73 L34 = lamp117 L44 = lamp96 L60 = lamp30
L5 = lamp103 L15 = lamp92 L25 = lamp115 L35 = lamp75 L45 = lamp67 L61 = lamp30(!)
L6 = lamp102 L16 = lamp82 L26 = lamp93 L36 = lamp95 L46 = lamp77 L62 = lamp31
L7 = lamp101 L17 = lamp72 L27 = lamp94 L37 = lamp56 L47 = lamp87 L63 = lamp31(!)
L8 = lamp80 L18 = lamp114 L28 = lamp84 L38 = lamp65 L48 = lamp97 L70 = lamp33
L9 = lamp70 L19 = lamp51 L29 = lamp116 L39 = lamp85 L49 = -
*/
void wildfire_state::display_update() void wildfire_state::speaker_update()
{ {
u16 active_state[0x10]; if (~m_a & 0x1000)
m_speaker_volume = 1.0;
for (int i = 0; i < 0x10; i++) m_speaker->level_w(m_f * 0x7fff * m_speaker_volume);
{
// update current state
m_display_state[i] = (m_a >> i & 1) ? m_d : 0;
active_state[i] = 0;
for (int j = 0; j < 0x10; j++)
{
int di = j << 4 | i;
// turn on powered segments
if (m_display_state[i] >> j & 1)
m_display_decay[di] = DISPLAY_DECAY_TIME;
// determine active state
int ds = (m_display_decay[di] != 0) ? 1 : 0;
active_state[i] |= (ds << j);
}
}
// on difference, send to output
for (int i = 0; i < 0x10; i++)
{
if (index_is_7segled(i))
m_digits[i] = bitswap<7>(active_state[i],0,1,2,3,4,5,6);
for (int j = 0; j < 8; j++)
m_lamps[(i * 10) + j] = BIT(active_state[i], j);
}
} }
TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::display_decay_tick) TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim)
{ {
// slowly turn off unpowered segments // volume decays when speaker is off (divisor and timer period determine duration)
for (int i = 0; i < 0x100; i++) m_speaker_volume /= 1.001;
if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i]) speaker_update();
m_display_decay[i]--;
display_update();
} }
void wildfire_state::prepare_display()
/***************************************************************************
Sound
***************************************************************************/
// Sound output is via a speaker between transistors Q2(from A12) and Q3(from F_out)
// A12 to Q2 has a little electronic circuit going, causing a slight delay.
// (see patent US4334679 FIG.5, the 2 resistors are 10K and the cap is a 4.7uF electrolytic)
// decay time, in steps of 1ms
#define A12_DECAY_TIME 5 /* a complete guess */
void wildfire_state::sound_update()
{ {
m_speaker->level_w(m_q2 & m_q3); // A0-A2 are 7segs
set_display_segmask(7, 0x7f);
display_matrix(8, 12, m_d, ~m_a);
} }
WRITE_LINE_MEMBER(wildfire_state::write_f)
{
// F_out pin: speaker out
m_q3 = (state) ? 1 : 0;
sound_update();
}
TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::reset_q2)
{
m_q2 = 0;
sound_update();
}
void wildfire_state::write_a12(int state)
{
if (state)
{
m_a12_decay_timer->adjust(attotime::never);
m_q2 = state;
sound_update();
}
else if (m_a >> 12 & 1)
{
// falling edge
m_a12_decay_timer->adjust(attotime::from_msec(A12_DECAY_TIME));
}
}
/***************************************************************************
I/O
***************************************************************************/
WRITE8_MEMBER(wildfire_state::write_d) WRITE8_MEMBER(wildfire_state::write_d)
{ {
// D0-D7: leds out // D0-D7: led/7seg data
m_d = data; m_d = bitswap<8>(data,7,0,1,2,3,4,5,6);
display_update(); prepare_display();
} }
WRITE16_MEMBER(wildfire_state::write_a) WRITE16_MEMBER(wildfire_state::write_a)
{ {
data ^= 0x1fff; // active-low // A0-A11: digit/led select
// A12: enable speaker
write_a12(data >> 12 & 1);
// A0-A2: select 7segleds
// A3-A11: select other leds
m_a = data; m_a = data;
display_update(); prepare_display();
// A12: speaker on
speaker_update();
} }
WRITE_LINE_MEMBER(wildfire_state::write_f)
{
// F: speaker out
m_f = state;
speaker_update();
}
// config
/***************************************************************************
Inputs
***************************************************************************/
static INPUT_PORTS_START( wildfire ) static INPUT_PORTS_START( wildfire )
PORT_START("IN1") // I PORT_START("IN.0") // I
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END INPUT_PORTS_END
// 7seg decoder table differs from default, this one is made by hand
/***************************************************************************
Machine Config
***************************************************************************/
void wildfire_state::machine_start()
{
m_digits.resolve();
m_lamps.resolve();
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
memset(m_display_decay, 0, sizeof(m_display_decay));
m_d = 0;
m_a = 0;
m_q2 = 0;
m_q3 = 0;
// register for savestates
save_item(NAME(m_display_state));
save_item(NAME(m_display_decay));
save_item(NAME(m_d));
save_item(NAME(m_a));
save_item(NAME(m_q2));
save_item(NAME(m_q3));
}
// LED segments A-G
enum
{
lA = 0x40,
lB = 0x20,
lC = 0x10,
lD = 0x08,
lE = 0x04,
lF = 0x02,
lG = 0x01
};
static const u8 wildfire_7seg_table[0x10] = static const u8 wildfire_7seg_table[0x10] =
{ {
0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, // 0-9 unaltered 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7
0x77, // A -> unused? 0x7f, 0x6f, 0x77, 0x73, 0x39, 0x38, 0x79, 0x40 // 8, 9, ?, P, ?, L, ?, -
lA+lB+lE+lF+lG, // b -> P
0x4e, // C -> unused?
lD+lE+lF, // d -> L
0x4f, // E -> unused?
lG // F -> -
}; };
static s16 wildfire_speaker_levels[0x8000];
void wildfire_state::wildfire(machine_config &config) void wildfire_state::wildfire(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
AMI_S2152(config, m_maincpu, MASTER_CLOCK); AMI_S2152(config, m_maincpu, 850000); // approximation - RC osc. R=?, C=?
m_maincpu->set_7seg_table(wildfire_7seg_table); m_maincpu->set_7seg_table(wildfire_7seg_table);
m_maincpu->read_i().set_ioport("IN1"); m_maincpu->read_i().set_ioport("IN.0");
m_maincpu->write_d().set(FUNC(wildfire_state::write_d)); m_maincpu->write_d().set(FUNC(wildfire_state::write_d));
m_maincpu->write_a().set(FUNC(wildfire_state::write_a)); m_maincpu->write_a().set(FUNC(wildfire_state::write_a));
m_maincpu->write_f().set(FUNC(wildfire_state::write_f)); m_maincpu->write_f().set(FUNC(wildfire_state::write_f));
TIMER(config, "display_decay").configure_periodic(FUNC(wildfire_state::display_decay_tick), attotime::from_msec(1)); TIMER(config, "display_decay").configure_periodic(FUNC(hh_amis2k_state::display_decay_tick), attotime::from_msec(1));
TIMER(config, "a12_decay").configure_generic(FUNC(wildfire_state::reset_q2));
config.set_default_layout(layout_wildfire); config.set_default_layout(layout_wildfire);
/* no video! */
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
TIMER(config, "speaker_decay").configure_periodic(FUNC(wildfire_state::speaker_decay_sim), attotime::from_usec(100));
// set volume levels (set_output_gain is too slow for sub-frame intervals)
for (int i = 0; i < 0x8000; i++)
wildfire_speaker_levels[i] = i;
m_speaker->set_levels(0x8000, wildfire_speaker_levels);
} }
// roms
ROM_START( wildfire )
ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 )
// Typed in from patent US4334679, data should be correct(it included checksums). 1st half was also dumped/verfied with release version.
ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) )
ROM_CONTINUE( 0x0600, 0x0200 )
ROM_END
} // anonymous namespace
/*************************************************************************** /***************************************************************************
@ -342,12 +393,5 @@ void wildfire_state::wildfire(machine_config &config)
***************************************************************************/ ***************************************************************************/
ROM_START( wildfire )
ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) ) // from patent US4334679, data should be correct (it included checksums). 1st half was dumped/verfied too.
ROM_CONTINUE( 0x0600, 0x0200 )
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( 1979, wildfire, 0, 0, wildfire, wildfire, wildfire_state, empty_init, "Parker Brothers", "Wildfire (patent)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: pretty sure that it matches the commercial release CONS( 1979, wildfire, 0, 0, wildfire, wildfire, wildfire_state, empty_init, "Parker Brothers", "Wildfire (patent)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: pretty sure that it matches the commercial release

View File

@ -77,6 +77,7 @@ public:
u16 m_inp_mux; // multiplexed inputs mask u16 m_inp_mux; // multiplexed inputs mask
u16 read_inputs(int columns, u16 colmask = ~0); u16 read_inputs(int columns, u16 colmask = ~0);
virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
// display common // display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
@ -238,6 +239,12 @@ u16 hh_cop400_state::read_inputs(int columns, u16 colmask)
return ret; return ret;
} }
INPUT_CHANGED_MEMBER(hh_cop400_state::reset_button)
{
// when an input is directly wired to MCU reset pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
/*************************************************************************** /***************************************************************************
@ -1061,8 +1068,6 @@ public:
DECLARE_WRITE8_MEMBER(write_d); DECLARE_WRITE8_MEMBER(write_d);
DECLARE_WRITE8_MEMBER(write_l); DECLARE_WRITE8_MEMBER(write_l);
DECLARE_WRITE8_MEMBER(write_g); DECLARE_WRITE8_MEMBER(write_g);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void funrlgl(machine_config &config); void funrlgl(machine_config &config);
}; };
@ -1101,15 +1106,9 @@ static INPUT_PORTS_START( funrlgl )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("RESET") PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, funrlgl_state, reset_button, nullptr) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_cop400_state, reset_button, nullptr)
INPUT_PORTS_END INPUT_PORTS_END
INPUT_CHANGED_MEMBER(funrlgl_state::reset_button)
{
// middle button is directly tied to MCU reset pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
void funrlgl_state::funrlgl(machine_config &config) void funrlgl_state::funrlgl(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */

View File

@ -70,7 +70,6 @@
TODO: TODO:
- cdkong discrete sound (simple volume decay, simulated for now)
- cgalaxn discrete sound (alien attacking sound effect) - cgalaxn discrete sound (alien attacking sound effect)
- gckong random lockups (tap the jump button repeatedly): mcu stack overflow, - gckong random lockups (tap the jump button repeatedly): mcu stack overflow,
works ok if stack levels is increased, 38800 B rev. has more stack levels? works ok if stack levels is increased, 38800 B rev. has more stack levels?
@ -2149,7 +2148,7 @@ public:
DECLARE_WRITE8_MEMBER(plate_w); DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE16_MEMBER(grid_w); DECLARE_WRITE16_MEMBER(grid_w);
void speaker_decay_reset(); void speaker_update();
TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim);
double m_speaker_volume; double m_speaker_volume;
void cdkong(machine_config &config); void cdkong(machine_config &config);
@ -2169,19 +2168,20 @@ void cdkong_state::machine_start()
// handlers // handlers
void cdkong_state::speaker_decay_reset() void cdkong_state::speaker_update()
{ {
if (m_r[1] & 8) if (m_r[1] & 8)
m_speaker_volume = 1.0; m_speaker_volume = 1.0;
m_speaker->set_output_gain(0, m_speaker_volume); int level = (m_d & 8) ? 0x7fff : 0;
m_speaker->level_w(level * m_speaker_volume);
} }
TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim) TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim)
{ {
// volume decays when speaker is off (divisor and timer period determine duration) // volume decays when speaker is off (divisor and timer period determine duration)
speaker_decay_reset(); speaker_update();
m_speaker_volume /= 1.015; m_speaker_volume /= 1.02;
} }
void cdkong_state::prepare_display() void cdkong_state::prepare_display()
@ -2194,7 +2194,7 @@ WRITE8_MEMBER(cdkong_state::plate_w)
{ {
// R13: speaker on // R13: speaker on
m_r[offset] = data; m_r[offset] = data;
speaker_decay_reset(); speaker_update();
// R0x-R6x: vfd plate // R0x-R6x: vfd plate
int shift = offset * 4; int shift = offset * 4;
@ -2205,7 +2205,8 @@ WRITE8_MEMBER(cdkong_state::plate_w)
WRITE16_MEMBER(cdkong_state::grid_w) WRITE16_MEMBER(cdkong_state::grid_w)
{ {
// D3: speaker out // D3: speaker out
m_speaker->level_w(data >> 3 & 1); m_d = data;
speaker_update();
// D4-D14: vfd grid // D4-D14: vfd grid
m_grid = data >> 4 & 0x7ff; m_grid = data >> 4 & 0x7ff;
@ -2226,6 +2227,8 @@ static INPUT_PORTS_START( cdkong )
PORT_BIT( 0x7ff8, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x7ff8, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END INPUT_PORTS_END
static s16 cdkong_speaker_levels[0x8000];
void cdkong_state::cdkong(machine_config &config) void cdkong_state::cdkong(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
@ -2251,7 +2254,13 @@ void cdkong_state::cdkong(machine_config &config)
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
TIMER(config, "speaker_decay").configure_periodic(FUNC(cdkong_state::speaker_decay_sim), attotime::from_msec(1)); TIMER(config, "speaker_decay").configure_periodic(FUNC(cdkong_state::speaker_decay_sim), attotime::from_msec(1));
// set volume levels (set_output_gain is too slow for sub-frame intervals)
for (int i = 0; i < 0x8000; i++)
cdkong_speaker_levels[i] = i;
m_speaker->set_levels(0x8000, cdkong_speaker_levels);
} }
// roms // roms
@ -4419,7 +4428,7 @@ CONS( 1984, machiman, 0, 0, machiman, machiman, machiman_state, empty_in
CONS( 1984, pairmtch, 0, 0, pairmtch, pairmtch, pairmtch_state, empty_init, "Bandai", "Pair Match", MACHINE_SUPPORTS_SAVE ) CONS( 1984, pairmtch, 0, 0, pairmtch, pairmtch, pairmtch_state, empty_init, "Bandai", "Pair Match", MACHINE_SUPPORTS_SAVE )
CONS( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE ) CONS( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE )
CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE )
CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
CONS( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE ) CONS( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE )
CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE ) CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE )

View File

@ -47,7 +47,7 @@ public:
u16 m_inp_mux; // multiplexed inputs mask u16 m_inp_mux; // multiplexed inputs mask
u8 read_inputs(int columns); u8 read_inputs(int columns);
DECLARE_INPUT_CHANGED_MEMBER(reset_button); virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
// display common // display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
@ -292,7 +292,7 @@ static INPUT_PORTS_START( cfrogger )
PORT_CONFSETTING( 0x00, "1" ) PORT_CONFSETTING( 0x00, "1" )
PORT_CONFSETTING( 0x08, "2" ) PORT_CONFSETTING( 0x08, "2" )
PORT_START("IN.3") // fake PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, nullptr) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, nullptr)
INPUT_PORTS_END INPUT_PORTS_END
@ -416,7 +416,7 @@ static INPUT_PORTS_START( gjungler )
PORT_CONFSETTING( 0x00, "A" ) PORT_CONFSETTING( 0x00, "A" )
PORT_CONFSETTING( 0x08, "B" ) PORT_CONFSETTING( 0x08, "B" )
PORT_START("IN.3") // fake PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, nullptr) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, nullptr)
INPUT_PORTS_END INPUT_PORTS_END

View File

@ -40,7 +40,6 @@
- tweak MCU frequency for games when video/audio recording surfaces(YouTube etc.) - tweak MCU frequency for games when video/audio recording surfaces(YouTube etc.)
- some of the games rely on the fact that faster/longer strobed leds appear brighter, - some of the games rely on the fact that faster/longer strobed leds appear brighter,
eg. hccbaskb(player led), .. eg. hccbaskb(player led), ..
- leboom discrete sound for volume decay (simulated for now)
- ttfball: discrete sound part, for volume gating? - ttfball: discrete sound part, for volume gating?
- what's the relation between hccbaskb and tbaskb? Is one the bootleg - what's the relation between hccbaskb and tbaskb? Is one the bootleg
of the other? Or are they both made by the same subcontractor? of the other? Or are they both made by the same subcontractor?
@ -101,6 +100,7 @@ public:
u16 read_inputs(int columns, u16 colmask = ~0); u16 read_inputs(int columns, u16 colmask = ~0);
u8 read_rotated_inputs(int columns, u8 rowmask = ~0); u8 read_rotated_inputs(int columns, u8 rowmask = ~0);
virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
// display common // display common
int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms)
@ -274,6 +274,12 @@ u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask)
return ~ret & rowmask; return ~ret & rowmask;
} }
INPUT_CHANGED_MEMBER(hh_pic16_state::reset_button)
{
// when an input is directly wired to MCU MCLR pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
/*************************************************************************** /***************************************************************************
@ -432,8 +438,6 @@ public:
void prepare_display(); void prepare_display();
DECLARE_WRITE8_MEMBER(write_b); DECLARE_WRITE8_MEMBER(write_b);
DECLARE_WRITE8_MEMBER(write_c); DECLARE_WRITE8_MEMBER(write_c);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void pabball(machine_config &config); void pabball(machine_config &config);
}; };
@ -488,15 +492,9 @@ static INPUT_PORTS_START( pabball )
PORT_CONFSETTING( 0x20, "2" ) PORT_CONFSETTING( 0x20, "2" )
PORT_START("RESET") PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, pabball_state, reset_button, nullptr) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pic16_state, reset_button, nullptr)
INPUT_PORTS_END INPUT_PORTS_END
INPUT_CHANGED_MEMBER(pabball_state::reset_button)
{
// reset button is directly tied to MCLR pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
void pabball_state::pabball(machine_config &config) void pabball_state::pabball(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
@ -1859,7 +1857,7 @@ CONS( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_
CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK ) CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, tbaskb, 0, 0, tbaskb, tbaskb, tbaskb_state, empty_init, "Tandy Radio Shack", "Electronic Basketball (Tandy)", MACHINE_SUPPORTS_SAVE ) CONS( 1979, tbaskb, 0, 0, tbaskb, tbaskb, tbaskb_state, empty_init, "Tandy Radio Shack", "Electronic Basketball (Tandy)", MACHINE_SUPPORTS_SAVE )

View File

@ -394,6 +394,12 @@ u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask)
return ret; return ret;
} }
INPUT_CHANGED_MEMBER(hh_tms1k_state::reset_button)
{
// when an input is directly wired to MCU INIT pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button) INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button)
{ {
m_power_on = (bool)(uintptr_t)param; m_power_on = (bool)(uintptr_t)param;
@ -2915,8 +2921,6 @@ public:
DECLARE_WRITE16_MEMBER(write_r); DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o); DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k); DECLARE_READ8_MEMBER(read_k);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void eleciq(machine_config &config); void eleciq(machine_config &config);
}; };
@ -2999,15 +3003,9 @@ static INPUT_PORTS_START( eleciq )
PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("RESET") PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, eleciq_state, reset_button, nullptr) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, nullptr)
INPUT_PORTS_END INPUT_PORTS_END
INPUT_CHANGED_MEMBER(eleciq_state::reset_button)
{
// reset button is directly wired to TMS1000 INIT pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
void eleciq_state::eleciq(machine_config &config) void eleciq_state::eleciq(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
@ -4317,8 +4315,6 @@ public:
DECLARE_WRITE16_MEMBER(write_r); DECLARE_WRITE16_MEMBER(write_r);
DECLARE_WRITE16_MEMBER(write_o); DECLARE_WRITE16_MEMBER(write_o);
DECLARE_READ8_MEMBER(read_k); DECLARE_READ8_MEMBER(read_k);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
void f2pbball(machine_config &config); void f2pbball(machine_config &config);
}; };
@ -4381,15 +4377,9 @@ static INPUT_PORTS_START( f2pbball )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast")
PORT_START("RESET") PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, f2pbball_state, reset_button, nullptr) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, nullptr)
INPUT_PORTS_END INPUT_PORTS_END
INPUT_CHANGED_MEMBER(f2pbball_state::reset_button)
{
// reset button is directly wired to TMS1000 INIT pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
void f2pbball_state::f2pbball(machine_config &config) void f2pbball_state::f2pbball(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
@ -4671,7 +4661,7 @@ static INPUT_PORTS_START( gpoker )
PORT_START("IN.3") // R3 PORT_START("IN.3") // R3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_D) PORT_NAME("9/Deal") // DL, shares pad with 9 PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // 9/DL
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE
@ -4689,6 +4679,10 @@ static INPUT_PORTS_START( gpoker )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Bet") // BT PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Bet") // BT
PORT_START("FAKE") // 9/DL are electronically the same button
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL
INPUT_PORTS_END INPUT_PORTS_END
void gpoker_state::gpoker(machine_config &config) void gpoker_state::gpoker(machine_config &config)
@ -4770,7 +4764,7 @@ WRITE16_MEMBER(gjackpot_state::write_r)
DB] SP] DB] SP]
[1] [2] [3] [DS] [DR] [1] [2] [3] [DS] [DR]
BT] HT] BT] HT]
[10/1] [T] [MD [CH [AC] [10/0] [T] [MD [CH [AC]
GO] ST] GO] ST]
*/ */

View File

@ -57,6 +57,7 @@ public:
u8 read_inputs(int columns); u8 read_inputs(int columns);
u8 read_rotated_inputs(int columns, u8 rowmask = 0xf); u8 read_rotated_inputs(int columns, u8 rowmask = 0xf);
virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button);
virtual DECLARE_INPUT_CHANGED_MEMBER(power_button); virtual DECLARE_INPUT_CHANGED_MEMBER(power_button);
virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off); virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off);
virtual void power_off(); virtual void power_off();

View File

@ -22,52 +22,51 @@
<view name="Internal Layout"> <view name="Internal Layout">
<bounds left="0" right="100" top="0" bottom="178" /> <bounds left="0" right="100" top="0" bottom="178" />
<bezel name="digit2" element="digit"><bounds x="25" y="4" width="10" height="15" /></bezel> <bezel name="digit2" element="digit"><bounds x="26" y="4" width="10" height="15" /></bezel>
<bezel name="digit1" element="digit"><bounds x="35" y="4" width="10" height="15" /></bezel> <bezel name="digit1" element="digit"><bounds x="36" y="4" width="10" height="15" /></bezel>
<bezel name="digit0" element="digit"><bounds x="45" y="4" width="10" height="15" /></bezel> <bezel name="digit0" element="digit"><bounds x="46" y="4" width="10" height="15" /></bezel>
<bezel name="3.3" element="led"><bounds x="32.5" y="39.5" width="4.5" height="4.5" /></bezel> <bezel name="3.3" element="led"><bounds x="32.5" y="39.5" width="4.5" height="4.5" /></bezel> <!-- 1 -->
<bezel name="3.1" element="led"><bounds x="41.5" y="39.5" width="4.5" height="4.5" /></bezel> <bezel name="3.1" element="led"><bounds x="41.5" y="39.5" width="4.5" height="4.5" /></bezel> <!-- 2 -->
<bezel name="3.2" element="led"><bounds x="50.5" y="39.5" width="4.5" height="4.5" /></bezel> <bezel name="3.2" element="led"><bounds x="50.5" y="39.5" width="4.5" height="4.5" /></bezel> <!-- 3 -->
<bezel name="5.4" element="led"><bounds x="6.5" y="46.5" width="4.5" height="4.5" /></bezel> <bezel name="4.0" element="led"><bounds x="41.5" y="51" width="4.5" height="4.5" /></bezel> <!-- 4 -->
<bezel name="5.0" element="led"><bounds x="81" y="46.5" width="4.5" height="4.5" /></bezel> <bezel name="4.1" element="led"><bounds x="56.5" y="60" width="4.5" height="4.5" /></bezel> <!-- 5 -->
<bezel name="5.1" element="led"><bounds x="81" y="92" width="4.5" height="4.5" /></bezel> <bezel name="4.2" element="led"><bounds x="56.5" y="78" width="4.5" height="4.5" /></bezel> <!-- 6 -->
<bezel name="5.3" element="led"><bounds x="2.5" y="92" width="4.5" height="4.5" /></bezel> <bezel name="4.3" element="led"><bounds x="41.5" y="87" width="4.5" height="4.5" /></bezel> <!-- 7 -->
<bezel name="4.4" element="led"><bounds x="26.5" y="78" width="4.5" height="4.5" /></bezel> <!-- 8 -->
<bezel name="4.5" element="led"><bounds x="26.5" y="60" width="4.5" height="4.5" /></bezel> <!-- 9 -->
<bezel name="4.0" element="led"><bounds x="41.5" y="51" width="4.5" height="4.5" /></bezel> <bezel name="5.0" element="led"><bounds x="81" y="46.5" width="4.5" height="4.5" /></bezel> <!-- 10 -->
<bezel name="3.0" element="led"><bounds x="41.5" y="69.5" width="4.5" height="4.5" /></bezel> <bezel name="5.5" element="led"><bounds x="70.5" y="69.5" width="4.5" height="4.5" /></bezel> <!-- 11 -->
<bezel name="4.3" element="led"><bounds x="41.5" y="87" width="4.5" height="4.5" /></bezel> <bezel name="5.1" element="led"><bounds x="81" y="92" width="4.5" height="4.5" /></bezel> <!-- 12 -->
<bezel name="5.2" element="led"><bounds x="41.5" y="105" width="4.5" height="4.5" /></bezel> <bezel name="5.2" element="led"><bounds x="41.5" y="105" width="4.5" height="4.5" /></bezel> <!-- 13 -->
<bezel name="6.1" element="led"><bounds x="41.5" y="123" width="4.5" height="4.5" /></bezel> <bezel name="5.3" element="led"><bounds x="2.5" y="92" width="4.5" height="4.5" /></bezel> <!-- 14 -->
<bezel name="6.4" element="led"><bounds x="41.5" y="141" width="4.5" height="4.5" /></bezel> <bezel name="6.0" element="led"><bounds x="12.5" y="69.5" width="4.5" height="4.5" /></bezel> <!-- 15 -->
<bezel name="7.1" element="led"><bounds x="41.5" y="171" width="4.5" height="4.5" /></bezel> <bezel name="5.4" element="led"><bounds x="6.5" y="46.5" width="4.5" height="4.5" /></bezel> <!-- 16 -->
<bezel name="6.1" element="led"><bounds x="41.5" y="123" width="4.5" height="4.5" /></bezel> <!-- 17 -->
<bezel name="6.2" element="led"><bounds x="24" y="133" width="4.5" height="4.5" /></bezel> <!-- 18 -->
<bezel name="6.3" element="led"><bounds x="58.5" y="133" width="4.5" height="4.5" /></bezel> <!-- 19 -->
<bezel name="4.5" element="led"><bounds x="26.5" y="60" width="4.5" height="4.5" /></bezel> <bezel name="6.4" element="led"><bounds x="41.5" y="141" width="4.5" height="4.5" /></bezel> <!-- 20 -->
<bezel name="4.1" element="led"><bounds x="56.5" y="60" width="4.5" height="4.5" /></bezel> <bezel name="6.5" element="led"><bounds x="12.5" y="149" width="4.5" height="4.5" /></bezel> <!-- 21 -->
<bezel name="4.4" element="led"><bounds x="26.5" y="78" width="4.5" height="4.5" /></bezel> <bezel name="7.0" element="led"><bounds x="70.5" y="149" width="4.5" height="4.5" /></bezel> <!-- 22 -->
<bezel name="4.2" element="led"><bounds x="56.5" y="78" width="4.5" height="4.5" /></bezel> <bezel name="7.1" element="led"><bounds x="41.5" y="171" width="4.5" height="4.5" /></bezel> <!-- 23 -->
<bezel name="6.0" element="led"><bounds x="12.5" y="69.5" width="4.5" height="4.5" /></bezel> <bezel name="7.2" element="led"><bounds x="93" y="136.5" width="4.5" height="4.5" /></bezel> <!-- 24 -->
<bezel name="6.5" element="led"><bounds x="12.5" y="149" width="4.5" height="4.5" /></bezel> <bezel name="7.3" element="led"><bounds x="93" y="115" width="4.5" height="4.5" /></bezel> <!-- 25 -->
<bezel name="5.5" element="led"><bounds x="70.5" y="69.5" width="4.5" height="4.5" /></bezel> <bezel name="7.4" element="led"><bounds x="93" y="86.5" width="4.5" height="4.5" /></bezel> <!-- 26 -->
<bezel name="7.0" element="led"><bounds x="70.5" y="149" width="4.5" height="4.5" /></bezel>
<bezel name="3.4" element="led"><bounds x="20.5" y="105" width="4.5" height="4.5" /></bezel> <bezel name="3.0" element="led"><bounds x="41.5" y="69.5" width="4.5" height="4.5" /></bezel> <!-- A -->
<bezel name="3.5" element="led"><bounds x="62.5" y="105" width="4.5" height="4.5" /></bezel> <bezel name="3.4" element="led"><bounds x="20.5" y="105" width="4.5" height="4.5" /></bezel> <!-- B -->
<bezel name="6.2" element="led"><bounds x="24" y="133" width="4.5" height="4.5" /></bezel> <bezel name="3.5" element="led"><bounds x="62.5" y="105" width="4.5" height="4.5" /></bezel> <!-- C -->
<bezel name="6.3" element="led"><bounds x="58.5" y="133" width="4.5" height="4.5" /></bezel> <bezel name="8.0" element="led"><bounds x="7" y="115" width="4.5" height="4.5" /></bezel> <!-- D -->
<bezel name="7.4" element="led"><bounds x="93" y="86.5" width="4.5" height="4.5" /></bezel> <bezel name="8.1" element="led"><bounds x="76" y="115" width="4.5" height="4.5" /></bezel> <!-- E -->
<bezel name="7.3" element="led"><bounds x="93" y="115" width="4.5" height="4.5" /></bezel> <bezel name="8.2" element="led"><bounds x="35.5" y="156" width="4.5" height="4.5" /></bezel> <!-- F -->
<bezel name="7.2" element="led"><bounds x="93" y="136.5" width="4.5" height="4.5" /></bezel> <bezel name="8.3" element="led"><bounds x="47" y="156" width="4.5" height="4.5" /></bezel> <!-- G -->
<bezel name="8.0" element="led"><bounds x="7" y="115" width="4.5" height="4.5" /></bezel> <bezel name="10.a" element="ledr"><bounds x="5.75" y="121" width="7" height="3" /></bezel> <!-- under D -->
<bezel name="8.1" element="led"><bounds x="76" y="115" width="4.5" height="4.5" /></bezel> <bezel name="9.a" element="ledr"><bounds x="74.75" y="121" width="7" height="3" /></bezel> <!-- under E -->
<bezel name="8.2" element="led"><bounds x="35.5" y="156" width="4.5" height="4.5" /></bezel> <bezel name="10.a" element="ledr"><bounds x="34.25" y="162" width="7" height="3" /></bezel> <!-- under F -->
<bezel name="8.3" element="led"><bounds x="47" y="156" width="4.5" height="4.5" /></bezel> <bezel name="9.a" element="ledr"><bounds x="45.75" y="162" width="7" height="3" /></bezel> <!-- under G -->
<bezel name="10.a" element="ledr"><bounds x="5.75" y="121" width="7" height="3" /></bezel>
<bezel name="9.a" element="ledr"><bounds x="74.75" y="121" width="7" height="3" /></bezel>
<bezel name="10.a" element="ledr"><bounds x="34.25" y="162" width="7" height="3" /></bezel>
<bezel name="9.a" element="ledr"><bounds x="45.75" y="162" width="7" height="3" /></bezel>
</view> </view>
</mamelayout> </mamelayout>

View File

@ -23,54 +23,49 @@
<bezel name="digit0" element="digit"><bounds x="147" y="318" width="13" height="20" /></bezel> <bezel name="digit0" element="digit"><bounds x="147" y="318" width="13" height="20" /></bezel>
<bezel element="digit"><bounds x="160" y="318" width="13" height="20" /></bezel> <!-- unconnected --> <bezel element="digit"><bounds x="160" y="318" width="13" height="20" /></bezel> <!-- unconnected -->
<bezel name="4.0" element="led"><bounds x="162" y="12" width="6" height="6" /></bezel> <bezel name="3.0" element="led"><bounds x="235" y="226" width="6" height="6" /></bezel> <!-- 1 -->
<bezel name="4.1" element="led"><bounds x="118" y="12" width="6" height="6" /></bezel> <bezel name="3.1" element="led"><bounds x="235" y="190" width="6" height="6" /></bezel> <!-- 2 -->
<bezel name="3.2" element="led"><bounds x="235" y="154" width="6" height="6" /></bezel> <!-- 3 -->
<bezel name="3.3" element="led"><bounds x="235" y="119" width="6" height="6" /></bezel> <!-- 4 -->
<bezel name="3.4" element="led"><bounds x="217" y="47" width="6" height="6" /></bezel> <!-- 5 -->
<bezel name="4.0" element="led"><bounds x="162" y="12" width="6" height="6" /></bezel> <!-- 6 -->
<bezel name="4.1" element="led"><bounds x="118" y="12" width="6" height="6" /></bezel> <!-- 7 -->
<bezel name="4.2" element="led"><bounds x="63" y="47" width="6" height="6" /></bezel> <!-- 8 -->
<bezel name="4.3" element="led"><bounds x="99" y="58" width="6" height="6" /></bezel> <!-- 9 -->
<bezel name="4.2" element="led"><bounds x="63" y="47" width="6" height="6" /></bezel> <bezel name="4.4" element="led"><bounds x="140" y="58" width="6" height="6" /></bezel> <!-- 10 -->
<bezel name="4.3" element="led"><bounds x="99" y="58" width="6" height="6" /></bezel> <bezel name="4.5" element="led"><bounds x="184" y="58" width="6" height="6" /></bezel> <!-- 11 -->
<bezel name="4.4" element="led"><bounds x="140" y="58" width="6" height="6" /></bezel> <bezel name="5.0" element="led"><bounds x="176" y="98" width="6" height="6" /></bezel> <!-- 13 -->
<bezel name="4.5" element="led"><bounds x="184" y="58" width="6" height="6" /></bezel> <bezel name="5.1" element="led"><bounds x="140" y="110" width="6" height="6" /></bezel> <!-- 14 -->
<bezel name="3.4" element="led"><bounds x="217" y="47" width="6" height="6" /></bezel> <bezel name="5.2" element="led"><bounds x="103" y="98" width="6" height="6" /></bezel> <!-- 15 -->
<bezel name="7.2" element="led"><bounds x="126" y="141" width="6" height="6" /></bezel> <!-- 17 -->
<bezel name="7.3" element="led"><bounds x="153" y="141" width="6" height="6" /></bezel> <!-- 18 -->
<bezel name="3.0" element="led"><bounds x="235" y="226" width="6" height="6" /></bezel> <bezel name="5.3" element="led"><bounds x="176" y="165" width="6" height="6" /></bezel> <!-- 20 -->
<bezel name="3.1" element="led"><bounds x="235" y="190" width="6" height="6" /></bezel> <bezel name="5.4" element="led"><bounds x="103" y="165" width="6" height="6" /></bezel> <!-- 21 -->
<bezel name="3.2" element="led"><bounds x="235" y="154" width="6" height="6" /></bezel> <bezel name="6.0" element="led"><bounds x="89" y="201" width="6" height="6" /></bezel> <!-- 23 -->
<bezel name="3.3" element="led"><bounds x="235" y="119" width="6" height="6" /></bezel> <bezel name="6.1" element="led"><bounds x="188" y="201" width="6" height="6" /></bezel> <!-- 24 -->
<bezel name="6.2" element="led"><bounds x="219" y="233" width="6" height="6" /></bezel> <!-- 25 -->
<bezel name="6.3" element="led"><bounds x="140" y="231" width="6" height="6" /></bezel> <!-- 26 -->
<bezel name="6.4" element="led"><bounds x="58" y="233" width="6" height="6" /></bezel> <!-- 27 -->
<bezel name="8.4" element="led"><bounds x="113" y="250" width="6" height="6" /></bezel> <!-- 28 -->
<bezel name="9.4" element="led"><bounds x="165" y="250" width="6" height="6" /></bezel> <!-- 29 -->
<bezel name="5.0" element="led"><bounds x="176" y="98" width="6" height="6" /></bezel> <bezel name="9.5" element="led"><bounds x="158" y="271" width="6" height="6" /></bezel> <!-- 30 -->
<bezel name="5.1" element="led"><bounds x="140" y="110" width="6" height="6" /></bezel> <bezel name="8.5" element="led"><bounds x="120" y="271" width="6" height="6" /></bezel> <!-- 31 -->
<bezel name="5.2" element="led"><bounds x="103" y="98" width="6" height="6" /></bezel> <bezel name="6.5" element="led"><bounds x="140" y="293" width="6" height="6" /></bezel> <!-- 32 -->
<bezel name="7.4" element="led"><bounds x="140" y="177" width="6" height="6" /></bezel> <!-- 33 -->
<bezel name="7.0" element="led"><bounds x="96" y="270" width="6" height="6" /></bezel> <!-- 34 -->
<bezel name="7.1" element="led"><bounds x="180" y="270" width="6" height="6" /></bezel> <!-- 35 -->
<bezel name="8.0" element="led"><bounds x="120" y="258" width="6" height="6" /></bezel> <!-- 36 -->
<bezel name="8.1" element="led"><bounds x="108" y="264" width="6" height="6" /></bezel> <!-- 37 -->
<bezel name="8.2" element="led"><bounds x="108" y="276" width="6" height="6" /></bezel> <!-- 38 -->
<bezel name="8.3" element="led"><bounds x="120" y="282" width="6" height="6" /></bezel> <!-- 39 -->
<bezel name="7.2" element="led"><bounds x="126" y="141" width="6" height="6" /></bezel> <bezel name="9.2" element="led"><bounds x="158" y="282" width="6" height="6" /></bezel> <!-- 40 -->
<bezel name="7.3" element="led"><bounds x="153" y="141" width="6" height="6" /></bezel> <bezel name="9.3" element="led"><bounds x="170" y="276" width="6" height="6" /></bezel> <!-- 41 -->
<bezel name="5.4" element="led"><bounds x="103" y="165" width="6" height="6" /></bezel> <bezel name="9.0" element="led"><bounds x="170" y="264" width="6" height="6" /></bezel> <!-- 42 -->
<bezel name="7.4" element="led"><bounds x="140" y="177" width="6" height="6" /></bezel> <bezel name="9.1" element="led"><bounds x="158" y="258" width="6" height="6" /></bezel> <!-- 43 -->
<bezel name="5.3" element="led"><bounds x="176" y="165" width="6" height="6" /></bezel>
<bezel name="6.4" element="led"><bounds x="58" y="233" width="6" height="6" /></bezel>
<bezel name="6.0" element="led"><bounds x="89" y="201" width="6" height="6" /></bezel>
<bezel name="6.3" element="led"><bounds x="140" y="231" width="6" height="6" /></bezel>
<bezel name="6.1" element="led"><bounds x="188" y="201" width="6" height="6" /></bezel>
<bezel name="6.2" element="led"><bounds x="219" y="233" width="6" height="6" /></bezel>
<bezel name="6.5" element="led"><bounds x="140" y="293" width="6" height="6" /></bezel>
<bezel name="8.4" element="led"><bounds x="113" y="250" width="6" height="6" /></bezel>
<bezel name="9.4" element="led"><bounds x="165" y="250" width="6" height="6" /></bezel>
<bezel name="7.0" element="led"><bounds x="96" y="270" width="6" height="6" /></bezel>
<bezel name="8.1" element="led"><bounds x="108" y="264" width="6" height="6" /></bezel>
<bezel name="8.0" element="led"><bounds x="120" y="258" width="6" height="6" /></bezel>
<bezel name="9.1" element="led"><bounds x="158" y="258" width="6" height="6" /></bezel>
<bezel name="9.0" element="led"><bounds x="170" y="264" width="6" height="6" /></bezel>
<bezel name="7.1" element="led"><bounds x="180" y="270" width="6" height="6" /></bezel>
<bezel name="8.2" element="led"><bounds x="108" y="276" width="6" height="6" /></bezel>
<bezel name="8.5" element="led"><bounds x="120" y="271" width="6" height="6" /></bezel>
<bezel name="9.5" element="led"><bounds x="158" y="271" width="6" height="6" /></bezel>
<bezel name="9.3" element="led"><bounds x="170" y="276" width="6" height="6" /></bezel>
<bezel name="8.3" element="led"><bounds x="120" y="282" width="6" height="6" /></bezel>
<bezel name="9.2" element="led"><bounds x="158" y="282" width="6" height="6" /></bezel>
</view> </view>
</mamelayout> </mamelayout>

View File

@ -3,41 +3,126 @@
<!-- define elements --> <!-- define elements -->
<element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
<element name="digit" defstate="0"> <element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg> <led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg>
</element> </element>
<element name="led" defstate="0"> <element name="led" defstate="0">
<disk state="0"><color red="0.2" green="0.04" blue="0.05" /></disk> <disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
<disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk> <disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
</element> </element>
<!-- build screen --> <!-- build screen -->
<view name="Test Layout"> <view name="Internal Layout">
<bounds left="0" right="64" top="0" bottom="64" /> <bounds left="4" right="96.5" top="-2" bottom="172" />
<bezel element="static_black">
<bounds left="0" right="64" top="0" bottom="64" />
</bezel>
<bezel name="digit0" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel> <bezel name="digit0" element="digit"><bounds x="38" y="0" width="8" height="12" /></bezel>
<bezel name="digit1" element="digit"><bounds x="10" y="0" width="10" height="15" /></bezel> <bezel name="digit1" element="digit"><bounds x="46" y="0" width="8" height="12" /></bezel>
<bezel name="digit2" element="digit"><bounds x="20" y="0" width="10" height="15" /></bezel> <bezel name="digit2" element="digit"><bounds x="54" y="0" width="8" height="12" /></bezel>
<!-- 13*8 matrix (first 3 are the 7segs) --> <bezel name="10.7" element="led"><bounds x="90.5" y="135" width="4" height="4" /></bezel> <!-- L1 -->
<bezel name="10.0" element="led"><bounds x="90.5" y="117" width="4" height="4" /></bezel> <!-- L2 -->
<bezel name="10.1" element="led"><bounds x="90.5" y="99" width="4" height="4" /></bezel> <!-- L3 -->
<bezel name="10.2" element="led"><bounds x="90.5" y="81.5" width="4" height="4" /></bezel> <!-- L4 -->
<bezel name="10.3" element="led"><bounds x="90.5" y="63.5" width="4" height="4" /></bezel> <!-- L5 -->
<bezel name="10.4" element="led"><bounds x="84" y="46" width="4" height="4" /></bezel> <!-- L6 -->
<bezel name="10.5" element="led"><bounds x="73" y="32.5" width="4" height="4" /></bezel> <!-- L7 -->
<bezel name="8.6" element="led"><bounds x="60.5" y="26" width="4" height="4" /></bezel> <!-- L8 -->
<bezel name="7.6" element="led"><bounds x="47.5" y="23.5" width="4" height="4" /></bezel> <!-- L9 -->
<repeat count="13"> <bezel name="6.6" element="led"><bounds x="34.5" y="26" width="4" height="4" /></bezel> <!-- L10 -->
<param name="ypos" start="20" increment="2" /> <bezel name="5.6" element="led"><bounds x="21.5" y="32.5" width="4" height="4" /></bezel> <!-- L11 -->
<param name="rowno" start="0" increment="10" /> <bezel name="6.5" element="led"><bounds x="34.5" y="43.5" width="4" height="4" /></bezel> <!-- L12 -->
<repeat count="8"> <bezel name="7.5" element="led"><bounds x="47.5" y="41.5" width="4" height="4" /></bezel> <!-- L13 -->
<param name="xpos" start="0" increment="2" /> <bezel name="8.5" element="led"><bounds x="60.5" y="43.5" width="4" height="4" /></bezel> <!-- L14 -->
<param name="lampno" start="~rowno~" increment="1" /> <bezel name="9.4" element="led"><bounds x="73" y="54.5" width="4" height="4" /></bezel> <!-- L15 -->
<bezel name="lamp~lampno~" element="led"> <bezel name="8.4" element="led"><bounds x="65" y="59" width="4" height="4" /></bezel> <!-- L16 -->
<bounds x="~xpos~" y="~ypos~" width="1" height="1" /> <bezel name="7.4" element="led"><bounds x="52" y="65.5" width="4" height="4" /></bezel> <!-- L17 -->
</bezel> <bezel name="11.2" element="led"><bounds x="34.5" y="57.5" width="4" height="4" /></bezel> <!-- L18 -->
</repeat> <bezel name="5.5" element="led"><bounds x="21.5" y="54.5" width="4" height="4" /></bezel> <!-- L19 -->
<bezel name="4.5" element="led"><bounds x="6.5" y="57.5" width="4" height="4" /></bezel> <!-- L20 -->
<bezel name="4.4" element="led"><bounds x="15.5" y="72.5" width="4" height="4" /></bezel> <!-- L21 -->
<bezel name="5.4" element="led"><bounds x="26" y="68" width="4" height="4" /></bezel> <!-- L22 -->
<bezel name="6.3" element="led"><bounds x="41" y="72.5" width="4" height="4" /></bezel> <!-- L23 -->
<bezel name="7.3" element="led"><bounds x="58.5" y="81.5" width="4" height="4" /></bezel> <!-- L24 -->
<bezel name="11.1" element="led"><bounds x="66.5" y="72.5" width="4" height="4" /></bezel> <!-- L25 -->
<bezel name="9.3" element="led"><bounds x="80" y="72.5" width="4" height="4" /></bezel> <!-- L26 -->
<bezel name="9.2" element="led"><bounds x="77.5" y="90" width="4" height="4" /></bezel> <!-- L27 -->
<bezel name="8.2" element="led"><bounds x="60.5" y="99" width="4" height="4" /></bezel> <!-- L28 -->
<bezel name="11.0" element="led"><bounds x="47.5" y="90" width="4" height="4" /></bezel> <!-- L29 -->
<bezel name="5.3" element="led"><bounds x="30.5" y="81.5" width="4" height="4" /></bezel> <!-- L30 -->
<bezel name="4.3" element="led"><bounds x="17.5" y="90" width="4" height="4" /></bezel> <!-- L31 -->
<bezel name="5.2" element="led"><bounds x="32.5" y="90" width="4" height="4" /></bezel> <!-- L32 -->
<bezel name="5.1" element="led"><bounds x="21.5" y="108" width="4" height="4" /></bezel> <!-- L33 -->
<bezel name="11.7" element="led"><bounds x="32.5" y="108" width="4" height="4" /></bezel> <!-- L34 -->
<bezel name="7.1" element="led"><bounds x="47.5" y="112.5" width="4" height="4" /></bezel> <!-- L35 -->
<bezel name="9.1" element="led"><bounds x="73" y="108" width="4" height="4" /></bezel> <!-- L36 -->
<bezel name="5.0" element="led"><bounds x="13" y="126" width="4" height="4" /></bezel> <!-- L37 -->
<bezel name="6.1" element="led"><bounds x="32.5" y="121.5" width="4" height="4" /></bezel> <!-- L38 -->
<bezel name="8.1" element="led"><bounds x="63" y="121.5" width="4" height="4" /></bezel> <!-- L39 -->
<bezel name="5.7" element="led"><bounds x="13" y="148.5" width="4" height="4" /></bezel> <!-- L40 -->
<bezel name="6.0" element="led"><bounds x="26" y="139" width="4" height="4" /></bezel> <!-- L41 -->
<bezel name="7.0" element="led"><bounds x="43" y="135" width="4" height="4" /></bezel> <!-- L42 -->
<bezel name="8.0" element="led"><bounds x="51.5" y="135" width="4" height="4" /></bezel> <!-- L43 -->
<bezel name="9.0" element="led"><bounds x="69" y="139" width="4" height="4" /></bezel> <!-- L44 -->
<bezel name="6.7" element="led"><bounds x="38.5" y="152.5" width="4" height="4" /></bezel> <!-- L45 -->
<bezel name="7.7" element="led"><bounds x="47.5" y="152.5" width="4" height="4" /></bezel> <!-- L46 -->
<bezel name="8.7" element="led"><bounds x="56.5" y="152.5" width="4" height="4" /></bezel> <!-- L47 -->
<bezel name="9.7" element="led"><bounds x="47.5" y="166" width="4" height="4" /></bezel> <!-- L48 -->
<bezel name="3.3" element="led"><bounds x="21.5" y="41.5" width="4" height="4" /></bezel> <!-- L70 -->
<repeat count="40">
<param name="x" start="10.8" increment="0.02308" />
<param name="y" start="72" increment="-0.15128" />
<bezel name="11.6" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L50 -->
</repeat> </repeat>
<repeat count="40">
<param name="x" start="28.6" increment="0.11795" />
<param name="y" start="119" increment="-0.07949" />
<bezel name="11.5" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L51 -->
</repeat>
<repeat count="40">
<param name="x" start="78.7" increment="0.05128" />
<param name="y" start="110.7" increment="-0.13846" />
<bezel name="11.4" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L52 -->
</repeat>
<repeat count="40">
<param name="x" start="10.7" increment="0.15897" />
<param name="y" start="154.7" increment="0.0" />
<bezel name="11.3" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L53 -->
</repeat>
<repeat count="40">
<param name="x" start="61.8" increment="-0.11538" />
<param name="y" start="151.4" increment="-0.12308" />
<bezel name="3.6" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L60 -->
</repeat>
<repeat count="40">
<param name="x" start="76.3" increment="0.13333" />
<param name="y" start="84.2" increment="0.03333" />
<bezel name="3.6" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L61 -->
</repeat>
<repeat count="40">
<param name="x" start="34.2" increment="0.11538" />
<param name="y" start="151.4" increment="-0.12308" />
<bezel name="3.5" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L62 -->
</repeat>
<repeat count="40">
<param name="x" start="14.2" increment="0.14615" />
<param name="y" start="86.5" increment="-0.05897" />
<bezel name="3.5" element="led"><bounds x="~x~" y="~y~" width="3" height="3" /></bezel> <!-- L63 -->
</repeat>
</view> </view>
</mamelayout> </mamelayout>