e0c6s46: fix issue with k input irq, add buzzer envelope

Systems promoted to working
---------------------------
Stack Challenge [hap]

New working systems
-------------------
Digital Monster (Japan) [hap, azya]
Digital Monster Ver. 2 (Japan) [hap, azya]
Digital Monster Ver. 3 (Japan) [hap, azya]
This commit is contained in:
hap 2024-12-26 01:59:17 +01:00
parent aa137c5cf5
commit 0696158dfe
4 changed files with 234 additions and 81 deletions

View File

@ -10,9 +10,7 @@ E0C6S48: 8192x12 ROM, 768x4 RAM, 2*102x4 VRAM, LCD has 16 commons and 51 segment
TODO:
- finish i/o ports
- serial interface
- buzzer envelope addition
- what happens if OSC3 is selected while OSCC (bit 2) is low?
- K input interrupt can trigger if input is active while writing to the mask register
- add mask options for ports (eg. buzzer on output port R4x is optional)
*/
@ -148,6 +146,7 @@ void e0c6s46_device::device_start()
m_bz_43_on = 0;
m_bz_freq = 0;
m_bz_envelope = 0;
m_bz_envelope_count = 0;
m_bz_duty_ratio = 0;
m_bz_1shot_on = 0;
m_bz_1shot_running = false;
@ -190,6 +189,7 @@ void e0c6s46_device::device_start()
save_item(NAME(m_bz_43_on));
save_item(NAME(m_bz_freq));
save_item(NAME(m_bz_envelope));
save_item(NAME(m_bz_envelope_count));
save_item(NAME(m_bz_duty_ratio));
save_item(NAME(m_bz_1shot_on));
save_item(NAME(m_bz_1shot_running));
@ -211,12 +211,12 @@ void e0c6s46_device::device_reset()
memset(m_irqflag, 0, sizeof(m_irqflag));
memset(m_irqmask, 0, sizeof(m_irqmask));
// reset other i/o
// reset other I/O
m_data->write_byte(0xf41, 0xf);
m_data->write_byte(0xf54, 0xf);
m_data->write_byte(0xf70, 0x0);
m_data->write_byte(0xf71, 0x8);
m_data->write_byte(0xf73, m_svd & 0xc0);
m_data->write_byte(0xf73, m_svd & 3);
m_data->write_byte(0xf74, 0x0);
m_data->write_byte(0xf75, 0x4);
@ -276,13 +276,19 @@ bool e0c6s46_device::check_interrupt()
for (int pri = 5; pri >= 0; pri--)
{
// hw glitch note, not emulated: if a new interrupt is requested in the
// middle of handling this interrupt, irq vector may be an OR of 2 vectors
m_irq_vector = 2*pri + 2;
// middle of handling this interrupt, IRQ vector may be an OR of 2 vectors
m_irq_vector = 2 * pri + 2;
int reg = priorder[pri];
m_irq_id = reg;
switch (reg)
{
// IK0/IK1 only have 1 flag bit
case IRQREG_INPUT0: case IRQREG_INPUT1:
if (m_irqflag[reg])
return true;
break;
// other: mask vs flag
default:
if (m_irqflag[reg] & m_irqmask[reg])
@ -301,20 +307,24 @@ void e0c6s46_device::execute_set_input(int line, int state)
return;
state = (state) ? 1 : 0;
int port = line >> 2 & 1;
u8 port = line >> 2 & 1;
u8 bit = 1 << (line & 3);
u8 prev = m_port_k[port];
m_port_k[port] = (m_port_k[port] & ~bit) | (state ? bit : 0);
// set interrupt on falling/rising edge of input
// set IRQ flag on falling/rising edge of input
u8 dfk = (port == 0) ? m_dfk0 : 0xf;
u8 edge = ~(prev ^ dfk) & (m_port_k[port] ^ dfk) & bit;
if (m_irqmask[IRQREG_INPUT0 + port] & edge)
{
m_irqflag[IRQREG_INPUT0 + port] |= edge;
m_irqflag[IRQREG_INPUT0 + port] |= 1;
m_possible_irq = true;
}
// clock programmable timer on falling edge of K03
if ((prev & ~m_port_k[port] & bit) && m_prgtimer_on && (m_prgtimer_select & 7) < 2)
clock_prgtimer();
}
@ -330,28 +340,22 @@ void e0c6s46_device::write_r(u8 port, u8 data)
data &= 0xf;
m_port_r[port] = data;
// ports R0x-R3x can be high-impedance
u8 out = data;
if (port < 4 && !(m_r_dir >> port & 1))
out = 0xf;
switch (port)
if (port < 4)
{
case 0: m_write_r[0](port, out, 0xff); break;
case 1: m_write_r[1](port, out, 0xff); break;
case 2: m_write_r[2](port, out, 0xff); break;
case 3: m_write_r[3](port, out, 0xff); break; // TODO: R33 PTCLK/_SRDY
// R4x: special output
case 4:
// d3: buzzer on: direct output or 1-shot output
if ((data & 8) != m_bz_43_on)
{
m_bz_43_on = data & 8;
reset_buzzer();
}
write_r4_out();
break;
// ports R0-R3 can be high-impedance
u8 mask = BIT(m_r_dir, port) ? 0xf : 0;
m_write_r[port](port, data | (mask ^ 0xf), mask);
}
else
{
// R43: buzzer on: direct output or 1-shot output
if ((data & 8) != m_bz_43_on)
{
m_bz_43_on = data & 8;
reset_bz_envelope();
reset_buzzer();
}
write_r4_out();
}
}
@ -360,8 +364,8 @@ void e0c6s46_device::write_r4_out()
// R40: _FOUT(clock inverted output)
// R42: FOUT or _BZ
// R43: BZ(buzzer)
u8 out = (m_port_r[4] & 2) | (m_bz_pulse << 3) | (m_bz_pulse << 2 ^ 4);
m_write_r[4](4, out, 0xff);
u8 data = (m_port_r[4] & 2) | (m_bz_pulse << 3) | (m_bz_pulse << 2 ^ 4);
m_write_r[4](4, data, 0xf);
}
@ -372,20 +376,18 @@ void e0c6s46_device::write_p(u8 port, u8 data)
data &= 0xf;
m_port_p[port] = data;
// don't output if port direction is set to input
if (!(m_p_dir >> port & 1))
return;
m_write_p[port](port, data, 0xff);
// high-impedance if port is set to input
u8 mask = BIT(m_p_dir, port) ? 0xf : 0;
m_write_p[port](port, data | (mask ^ 0xf), mask);
}
u8 e0c6s46_device::read_p(u8 port)
{
// return written value if port direction is set to output
if (m_p_dir >> port & 1)
if (BIT(m_p_dir, port))
return m_port_p[port];
return m_read_p[port](port, 0xff);
return m_read_p[port](port);
}
@ -410,6 +412,10 @@ TIMER_CALLBACK_MEMBER(e0c6s46_device::core_256_cb)
if (m_bz_1shot_on != 0 && m_256_src_pulse == 1)
clock_bz_1shot();
// clock buzzer envelope on rising edge if it's on
if (m_bz_envelope & 1 && m_256_src_pulse == 1)
clock_bz_envelope();
// clock-timer is always running, advance it on falling edge
// (handle clock_clktimer last in case of watchdog reset)
if (m_256_src_pulse == 0)
@ -440,7 +446,7 @@ void e0c6s46_device::clock_clktimer()
{
m_clktimer_count++;
// irq on falling edge of 32, 8, 2, 1hz
// IRQ on falling edge of 32, 8, 2, 1hz
u8 flag = 0;
if ((m_clktimer_count & 0x07) == 0)
flag |= 1;
@ -478,7 +484,7 @@ void e0c6s46_device::clock_stopwatch()
{
m_swl_slice = 0;
// bcd counter, irq on falling edge of 10 and 1hz
// bcd counter, IRQ on falling edge of 10 and 1hz
m_swl_count = (m_swl_count + 1) % 10;
if (m_swl_count == 0)
{
@ -486,10 +492,10 @@ void e0c6s46_device::clock_stopwatch()
m_swh_count = (m_swh_count + 1) % 10;
if (m_swh_count == 0)
m_irqflag[IRQREG_STOPWATCH] |= 2;
}
if (m_irqflag[IRQREG_STOPWATCH] & m_irqmask[IRQREG_STOPWATCH])
m_possible_irq = true;
if (m_irqflag[IRQREG_STOPWATCH] & m_irqmask[IRQREG_STOPWATCH])
m_possible_irq = true;
}
}
}
@ -498,7 +504,7 @@ void e0c6s46_device::clock_stopwatch()
void e0c6s46_device::clock_prgtimer()
{
// irq and reload when it reaches zero
// IRQ and reload when it reaches zero
if (--m_prgtimer_count == 0)
{
m_irqflag[IRQREG_PRGTIMER] |= 1;
@ -540,7 +546,7 @@ TIMER_CALLBACK_MEMBER(e0c6s46_device::prgtimer_cb)
void e0c6s46_device::schedule_buzzer()
{
// only schedule next buzzer timeout if it's on
if (m_bz_43_on != 0 && !m_bz_1shot_running)
if (m_bz_43_on && !m_bz_1shot_running)
return;
// pulse width differs per frequency selection
@ -558,10 +564,13 @@ void e0c6s46_device::schedule_buzzer()
TIMER_CALLBACK_MEMBER(e0c6s46_device::buzzer_cb)
{
// invert pulse wave and write to output
m_bz_pulse ^= 1;
write_r4_out();
// invert pulse wave if buzzer is on
if (m_bz_43_on && !m_bz_1shot_running)
m_bz_pulse = 0;
else
m_bz_pulse ^= 1;
write_r4_out();
schedule_buzzer();
}
@ -579,8 +588,8 @@ void e0c6s46_device::clock_bz_1shot()
// reload counter the 1st time
if (m_bz_1shot_count == 0)
{
reset_buzzer();
m_bz_1shot_count = (m_bz_freq & 8) ? 16 : 8;
reset_buzzer();
}
// stop ringing when counter reaches 0
@ -591,6 +600,24 @@ void e0c6s46_device::clock_bz_1shot()
}
}
void e0c6s46_device::clock_bz_envelope()
{
if (--m_bz_envelope_count == 0)
{
m_bz_envelope_count = (m_bz_envelope & 2) ? 32 : 16;
// maximum duty addition is 7
if (m_bz_duty_ratio < 7)
m_bz_duty_ratio++;
}
}
void e0c6s46_device::reset_bz_envelope()
{
m_bz_envelope_count = (m_bz_envelope & 2) ? 32 : 16;
m_bz_duty_ratio = 0;
}
//-------------------------------------------------
@ -667,17 +694,17 @@ u8 e0c6s46_device::io_r(offs_t offset)
{
switch (offset)
{
// irq flags, masks
// IRQ flags, masks
case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05:
{
// irq flags are reset(acked) when read
// IRQ flags are reset(acked) when read
u8 flag = m_irqflag[offset];
if (!machine().side_effects_disabled())
m_irqflag[offset] = 0;
return flag;
}
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15:
return m_irqmask[offset-0x10];
return m_irqmask[offset & 7];
// K input ports
case 0x40: case 0x42:
@ -761,18 +788,34 @@ void e0c6s46_device::io_w(offs_t offset, u8 data)
{
switch (offset)
{
// irq masks
// IRQ masks
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15:
{
static const u8 maskmask[6] = { 0xf, 3, 1, 1, 0xf, 0xf };
m_irqmask[offset-0x10] = data & maskmask[offset-0x10];
m_possible_irq = true;
u8 prev = m_irqmask[offset & 7];
m_irqmask[offset & 7] = data & maskmask[offset & 7];
u8 rise = ~prev & m_irqmask[offset & 7];
if (rise)
{
m_possible_irq = true;
if (offset >= 0x14)
{
u8 port = offset & 1;
u8 dfk = (port == 0) ? m_dfk0 : 0xf;
// IK flag gets set if input is active at rising edge of mask bit
if (rise & (m_port_k[port] ^ dfk))
m_irqflag[offset & 7] |= 1;
}
}
break;
}
// K input ports
case 0x41:
// d0-d3: K0x irq on 0: rising edge, 1: falling edge
// d0-d3: K0x IRQ on 0: rising edge, 1: falling edge
m_dfk0 = data;
break;
@ -926,8 +969,8 @@ void e0c6s46_device::io_w(offs_t offset, u8 data)
// d1: envelope cycle selection
// d2: reset envelope
// d3: trigger one-shot buzzer
if (data & 1)
logerror("io_w enabled envelope, PC=$%04X\n", m_prev_pc);
if (~m_bz_envelope & data & 1 || data & 4)
reset_bz_envelope();
m_bz_envelope = data & 3;
m_bz_1shot_on |= data & 8;
break;

View File

@ -159,6 +159,7 @@ private:
u8 m_bz_43_on;
u8 m_bz_freq;
u8 m_bz_envelope;
u8 m_bz_envelope_count;
u8 m_bz_duty_ratio;
u8 m_bz_1shot_on;
bool m_bz_1shot_running;
@ -169,6 +170,8 @@ private:
void schedule_buzzer();
void reset_buzzer();
void clock_bz_1shot();
void clock_bz_envelope();
void reset_bz_envelope();
u32 m_osc1;
u32 m_osc3;

View File

@ -11,12 +11,15 @@ to play the games for a longer time. For the drivers that don't have an SVG
screen, use -prescale or -nofilter to disable bilinear filtering.
TODO:
- stackch only LEFT and ON buttons work, both are bit 0, MCU opcode bug?
- SVGs could be more accurate? it seems they're handmade instead of a 1:1 scan
like for eg. the Game & Watch LCDs
- in stackch, you can still move around when the game is paused, maybe BTANB?
- digimon external port is unemulated
- alienfev unmapped reads/writes, or are they harmless?
- SVGs could be more accurate? Instead of 1:1 scans like with Game & Watch,
they were created by tracing segments by hand from macro photos
- redo tamamot SVG, LCD was not available and azya redrew it from online photos
- add LCD deflicker like hh_sm510? see venusdm for example
- hook up LCD contrast, does any game use it? (eg. for fade-out)
- hook up LCD contrast, stackch and alienfev support user-defined contrast,
but it doesn't look like any game uses it for eg. fade-out
*******************************************************************************/
@ -45,6 +48,7 @@ public:
{ }
DECLARE_INPUT_CHANGED_MEMBER(input_changed);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
protected:
virtual void machine_start() override ATTR_COLD;
@ -79,6 +83,12 @@ INPUT_CHANGED_MEMBER(hh_e0c6x_state::input_changed)
m_maincpu->set_input_line(param, newval ? ASSERT_LINE : CLEAR_LINE);
}
INPUT_CHANGED_MEMBER(hh_e0c6x_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);
}
/*******************************************************************************
@ -94,7 +104,8 @@ INPUT_CHANGED_MEMBER(hh_e0c6x_state::input_changed)
* Seiko Epson E0C6S46 MCU under epoxy
* 32*16 LCD screen + 8 custom segments, 1-bit sound
Generation 2 is on the exact same hardware.
Generation 2 is on the exact same hardware. It's nearly the same game, they
only changed the graphics.
*******************************************************************************/
@ -129,7 +140,7 @@ void tama_state::tama(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_refresh_hz(32);
screen.set_refresh_hz(60);
screen.set_size(1119, 1080);
screen.set_visarea_full();
@ -167,11 +178,12 @@ ROM_END
/*******************************************************************************
Bandai Tamagotchi Angel (aka Angel Gotch in Japan)
* Seiko Epson E0C6S48
Bandai Tamagotchi Angel (Tenshitchi no Tamagotchi (aka Angel Gotch) in Japan)
* PCB label: TAL-1, 00-83520-001
* Seiko Epson E0C6S48 under epoxy
* 32*16 LCD screen + 8 custom segments, 1-bit sound
Mothra no Tamagotch is on similar hardware.
Mothra no Tamagotchi is on similar hardware.
*******************************************************************************/
@ -206,7 +218,7 @@ void tamaang_state::tamaang(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_refresh_hz(32);
screen.set_refresh_hz(60);
screen.set_size(1119, 1080);
screen.set_visarea_full();
@ -239,6 +251,91 @@ ROM_END
/*******************************************************************************
Bandai Digital Monster (retroactively called Ver. 1)
* PCB label: TDM-1, 00-83830-001
* Seiko Epson E0C6S48 MCU under epoxy
* external port on P20, for connecting to another Digimon handheld
* 32*16 LCD screen + 8 custom segments, 1-bit sound
The sequels (Ver. 2 to Ver. 4) are on the same hardware, and are compatible
with eachother for battle mode.
*******************************************************************************/
class digimon_state : public hh_e0c6x_state
{
public:
digimon_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_e0c6x_state(mconfig, type, tag)
{ }
void digimon(machine_config &config);
};
// inputs
static INPUT_PORTS_START( digimon )
PORT_INCLUDE( tama )
PORT_START("RESET")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(digimon_state::reset_button), 0) PORT_NAME("Reset")
INPUT_PORTS_END
// config
void digimon_state::digimon(machine_config &config)
{
// basic machine hardware
E0C6S48(config, m_maincpu, 32.768_kHz_XTAL);
m_maincpu->set_osc3(1'000'000);
m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3);
m_maincpu->write_segs().set(FUNC(digimon_state::lcd_segment_w));
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_refresh_hz(60);
screen.set_size(1113, 1080);
screen.set_visarea_full();
config.set_default_layout(layout_hh_e0c6x_lcd);
// sound hardware
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25);
}
// roms
ROM_START( digimon )
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "digimon.bin", 0x0000, 0x4000, CRC(08ffac1b) SHA1(1dde9b0aa81c8f4a1e22d3a79d4743833fc6cba7) )
ROM_REGION( 157940, "screen", 0)
ROM_LOAD( "digimon.svg", 0, 157940, CRC(91fc473e) SHA1(9c64e120b31d16455b87cffcad029082b5b98c2e) )
ROM_END
ROM_START( digimonv2 )
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "digimonv2.bin", 0x0000, 0x4000, CRC(19a9e54e) SHA1(ab860ca9f31f478532122cb9d20f59964a080a27) )
ROM_REGION( 157940, "screen", 0)
ROM_LOAD( "digimon.svg", 0, 157940, CRC(91fc473e) SHA1(9c64e120b31d16455b87cffcad029082b5b98c2e) )
ROM_END
ROM_START( digimonv3 )
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "digimonv3.bin", 0x0000, 0x4000, CRC(3000cf30) SHA1(0acd50e623e20d857e13bae150ac03405896cf2b) )
ROM_REGION( 157940, "screen", 0)
ROM_LOAD( "digimon.svg", 0, 157940, CRC(91fc473e) SHA1(9c64e120b31d16455b87cffcad029082b5b98c2e) )
ROM_END
/*******************************************************************************
Epoch Chibi Pachi: Alien Fever
@ -280,7 +377,7 @@ void alienfev_state::alienfev(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(32);
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(39, 16);
screen.set_visarea_full();
@ -349,7 +446,7 @@ void venusdm_state::venusdm(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(32);
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32, 20);
screen.set_visarea_full();
@ -386,6 +483,10 @@ ROM_END
the 1992 Radio Shack catalog). Did E0C6S46 exist already, or is this a newer
revision?
BTANB:
- it doesn't allow 2 button presses at the same time, making fast gameplay
impossible (eg. left or right + rotate button)
*******************************************************************************/
class stackch_state : public hh_e0c6x_state
@ -405,7 +506,7 @@ static INPUT_PORTS_START( stackch )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_CB(0) PORT_NAME("Left / Level")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_CB(1) PORT_NAME("Down / Start")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_CB(2) PORT_NAME("Right / Height")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_CB(3)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_CB(3) PORT_NAME("Rotate / Contrast")
PORT_START("K1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_ON ) PORT_CHANGED_CB(4) PORT_NAME("On / Off")
@ -426,7 +527,7 @@ void stackch_state::stackch(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_refresh_hz(32);
screen.set_refresh_hz(60);
screen.set_size(856, 1080);
screen.set_visarea_full();
@ -457,14 +558,17 @@ ROM_END
*******************************************************************************/
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
SYST( 1997, tama, 0, 0, tama, tama, tama_state, empty_init, "Bandai", "Tamagotchi (Gen. 1, World)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
SYST( 1997, tamag2, 0, 0, tama, tama, tama_state, empty_init, "Bandai", "Tamagotchi (Gen. 2, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
SYST( 1997, tamaang, 0, 0, tamaang, tamaang, tamaang_state, empty_init, "Bandai", "Angel Gotch (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
SYST( 1997, tamamot, 0, 0, tamaang, tama, tamaang_state, empty_init, "Bandai", "Mothra no Tamagotch (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
SYST( 1997, tama, 0, 0, tama, tama, tama_state, empty_init, "Bandai", "Tamagotchi (Gen. 1, World)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
SYST( 1997, tamag2, 0, 0, tama, tama, tama_state, empty_init, "Bandai", "Tamagotchi (Gen. 2, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
SYST( 1997, tamaang, 0, 0, tamaang, tamaang, tamaang_state, empty_init, "Bandai", "Tenshitchi no Tamagotchi (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
SYST( 1997, tamamot, 0, 0, tamaang, tama, tamaang_state, empty_init, "Bandai", "Mothra no Tamagotchi (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
SYST( 1997, digimon, 0, 0, digimon, digimon, digimon_state, empty_init, "Bandai", "Digital Monster (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NODEVICE_LAN )
SYST( 1998, digimonv2, 0, 0, digimon, digimon, digimon_state, empty_init, "Bandai", "Digital Monster Ver. 2 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NODEVICE_LAN )
SYST( 1998, digimonv3, 0, 0, digimon, digimon, digimon_state, empty_init, "Bandai", "Digital Monster Ver. 3 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NODEVICE_LAN )
SYST( 1997, alienfev, 0, 0, alienfev, alienfev, alienfev_state, empty_init, "Epoch", "Chibi Pachi: Alien Fever", MACHINE_SUPPORTS_SAVE )
SYST( 1997, alienfev, 0, 0, alienfev, alienfev, alienfev_state, empty_init, "Epoch", "Chibi Pachi: Alien Fever", MACHINE_SUPPORTS_SAVE )
SYST( 1997, venusdm, 0, 0, venusdm, venusdm, venusdm_state, empty_init, "Nikko", "Beans Collection: Venus Diet Monogatari", MACHINE_SUPPORTS_SAVE )
SYST( 1997, venusdm, 0, 0, venusdm, venusdm, venusdm_state, empty_init, "Nikko", "Beans Collection: Venus Diet Monogatari", MACHINE_SUPPORTS_SAVE )
SYST( 1991, stackch, 0, 0, stackch, stackch, stackch_state, empty_init, "Tandy Corporation", "Stack Challenge", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
SYST( 1991, stackch, 0, 0, stackch, stackch, stackch_state, empty_init, "Tandy Corporation", "Stack Challenge", MACHINE_SUPPORTS_SAVE )

View File

@ -19147,6 +19147,9 @@ qkspeller // National Semiconductor
@source:handheld/hh_e0c6x.cpp
alienfev // Epoch
digimon // Bandai
digimonv2 // Bandai
digimonv3 // Bandai
stackch // Tandy Corporation
tama // Bandai
tamaang // Bandai