From 0696158dfef3b7dcd00bda58f20a1e6ddfc21134 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 26 Dec 2024 01:59:17 +0100 Subject: 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] --- src/devices/cpu/e0c6200/e0c6s46.cpp | 161 +++++++++++++++++++++++------------- src/devices/cpu/e0c6200/e0c6s46.h | 3 + src/mame/handheld/hh_e0c6x.cpp | 148 ++++++++++++++++++++++++++++----- src/mame/mame.lst | 3 + 4 files changed, 234 insertions(+), 81 deletions(-) diff --git a/src/devices/cpu/e0c6200/e0c6s46.cpp b/src/devices/cpu/e0c6200/e0c6s46.cpp index 02b8d25faca..23d110887e9 100644 --- a/src/devices/cpu/e0c6200/e0c6s46.cpp +++ b/src/devices/cpu/e0c6200/e0c6s46.cpp @@ -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; diff --git a/src/devices/cpu/e0c6200/e0c6s46.h b/src/devices/cpu/e0c6200/e0c6s46.h index e0b7148423e..d70d0779d99 100644 --- a/src/devices/cpu/e0c6200/e0c6s46.h +++ b/src/devices/cpu/e0c6200/e0c6s46.h @@ -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; diff --git a/src/mame/handheld/hh_e0c6x.cpp b/src/mame/handheld/hh_e0c6x.cpp index 38d3acde69b..b79a012c7d1 100644 --- a/src/mame/handheld/hh_e0c6x.cpp +++ b/src/mame/handheld/hh_e0c6x.cpp @@ -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 ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 625b6a419fc..27051c7c781 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -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 -- cgit v1.2.3