From c77d0b4ef5b8951a58d4a6101f4a45f5641a6248 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 21 Oct 2024 21:18:50 +0900 Subject: misc/mjsenpu.cpp: Cleaned up code: (#12885) * Use palette_device handlers for palette. * Corrected video RAM width, and changed to allocate on start. * Constrain screen update to clipping rectangle. * Fixed input matrix reading. * Reduce literal tags, changed logging to use logerror, made come variables const. * Reduce duplication, and improved ROM region names. * Added notes about languages for in-game text and voice samples. * Use C++ line comments for single-line comments. --- src/mame/misc/mjsenpu.cpp | 262 ++++++++++++++++++---------------------------- 1 file changed, 104 insertions(+), 158 deletions(-) diff --git a/src/mame/misc/mjsenpu.cpp b/src/mame/misc/mjsenpu.cpp index 7c1a2795ac9..799045eec23 100644 --- a/src/mame/misc/mjsenpu.cpp +++ b/src/mame/misc/mjsenpu.cpp @@ -16,7 +16,7 @@ The test mode for this game is very buggy, this is not a MAME bug the same behavior has been observed on the original PCB. - One example of this is the dipswitch viewer, which should show 3 + One example of this is the DIP switch viewer, which should show 3 rows of 8 1/0 values, one for each switch. ie 00000000 @@ -25,7 +25,7 @@ However.. - Instead of properly representing each of the dips, the 1st switch in + Instead of properly representing each of the banks, the 1st switch in each bank ends up turning on/off the entire row display (for rows 2/3 it shifts row 1 by one pixel) @@ -63,16 +63,17 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_oki(*this, "oki") + , m_palette(*this, "palette") , m_hopper(*this, "hopper") , m_mainram(*this, "mainram") // , m_vram(*this, "vram") - , m_palette(*this, "palette") + , m_io_key(*this, "KEY%u", 0U) { } - void mjsenpu(machine_config &config); + void mjsenpu(machine_config &config) ATTR_COLD; - void init_mjsenpu(); + void init_mjsenpu() ATTR_COLD; protected: virtual void machine_start() override ATTR_COLD; @@ -80,83 +81,53 @@ protected: virtual void video_start() override ATTR_COLD; private: - /* devices */ + // devices required_device m_maincpu; required_device m_oki; + required_device m_palette; required_device m_hopper; required_shared_ptr m_mainram; // required_shared_ptr m_vram; - uint8_t m_pal[0x200] = { }; - uint32_t m_vram0[0x20000 / 4] = { }; - uint32_t m_vram1[0x20000 / 4] = { }; - uint8_t m_control = 0; - uint8_t m_mux = 0; - uint8_t palette_low_r(offs_t offset); - uint8_t palette_high_r(offs_t offset); - void palette_low_w(offs_t offset, uint8_t data); - void palette_high_w(offs_t offset, uint8_t data); - void set_palette(int offset); + required_ioport_array<5> m_io_key; + + std::unique_ptr m_vram[2]; + uint8_t m_control = 0; + uint8_t m_key_matrix_select = 0; void control_w(uint8_t data); - void mux_w(uint8_t data); + void key_matrix_w(uint8_t data); - uint32_t muxed_inputs_r(); + uint32_t key_matrix_r(); - uint32_t mjsenpu_speedup_r(); + uint32_t speedup_r(); - uint32_t vram_r(offs_t offset); - void vram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + uint16_t vram_r(offs_t offset); + void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint32_t screen_update_mjsenpu(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + static rgb_t mjsenpu_B6G5R5(uint32_t raw); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - required_device m_palette; - void mjsenpu_32bit_map(address_map &map) ATTR_COLD; - void mjsenpu_io(address_map &map) ATTR_COLD; + void main_map(address_map &map) ATTR_COLD; + void main_portmap(address_map &map) ATTR_COLD; }; -uint8_t mjsenpu_state::palette_low_r(offs_t offset) -{ - return m_pal[(offset * 2) + 0]; -} - - -uint8_t mjsenpu_state::palette_high_r(offs_t offset) +rgb_t mjsenpu_state::mjsenpu_B6G5R5(uint32_t raw) { - return m_pal[(offset * 2) + 1]; + return rgb_t(pal5bit(raw >> 0), pal5bit(raw >> 5), pal6bit(raw >> 10)); } -void mjsenpu_state::set_palette(int offset) -{ - uint16_t paldata = (m_pal[(offset * 2) + 0] << 8) | (m_pal[(offset * 2) + 1]); - m_palette->set_pen_color(offset, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal6bit(paldata >> 10)); -} -void mjsenpu_state::palette_low_w(offs_t offset, uint8_t data) +uint16_t mjsenpu_state::vram_r(offs_t offset) { - m_pal[(offset * 2)+0] = data; - set_palette(offset); + return m_vram[BIT(m_control, 0)][offset]; } -void mjsenpu_state::palette_high_w(offs_t offset, uint8_t data) +void mjsenpu_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - m_pal[(offset * 2)+1] = data; - set_palette(offset); -} - - -uint32_t mjsenpu_state::vram_r(offs_t offset) -{ - if (m_control & 0x01) return m_vram1[offset]; - else return m_vram0[offset]; -} - -void mjsenpu_state::vram_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - if (m_control & 0x01) COMBINE_DATA(&m_vram1[offset]); - else COMBINE_DATA(&m_vram0[offset]); + COMBINE_DATA(&m_vram[BIT(m_control, 0)][offset]); } void mjsenpu_state::control_w(uint8_t data) @@ -171,7 +142,7 @@ void mjsenpu_state::control_w(uint8_t data) // bits 0x08 is used in the alt payout / hopper mode (see dipswitches) - // 0x04 seem to be hopper/ticket related? different ones get used depending on the dips + // 0x04 seem to be hopper/ticket related? different ones get used depending on the DIP switches m_hopper->motor_w(BIT(~data, 2)); // bit 0x02 could be coin counter? @@ -181,69 +152,51 @@ void mjsenpu_state::control_w(uint8_t data) m_control = data; // if (data &~0x9e) -// printf("control_w %02x\n", data); +// logerror("control_w %02x\n", data); } -void mjsenpu_state::mux_w(uint8_t data) +void mjsenpu_state::key_matrix_w(uint8_t data) { - if ((data != 0x80) && - (data != 0x9e) && - (data != 0x9d) && - (data != 0x9b) && - (data != 0x97) && - (data != 0x8f)) - printf("mux_w %02x\n", data); - - m_mux = data; + if ((data & 0xe0) != 0x80) + logerror("key_matrix_w %02x\n", data); + + // bit 0 to 4: Key matrix select + // Bit 5 to 6: unknown, always clear? + // bit 7: unknown, always set? + m_key_matrix_select = data; } -uint32_t mjsenpu_state::muxed_inputs_r() +uint32_t mjsenpu_state::key_matrix_r() { - switch (m_mux) + uint32_t result = 0xffffffff; + for (unsigned i = 0; i < m_io_key.size(); i++) { - case 0x80: // not read - break; - - case 0x9e: - return ioport("MUX_9E")->read(); - - case 0x9d: - return ioport("MUX_9D")->read(); - - case 0x9b: - return ioport("MUX_9B")->read(); - - case 0x97: - return ioport("MUX_97")->read(); - - case 0x8f: - return ioport("MUX_8F")->read(); + if (BIT(~m_key_matrix_select, i)) + result &= m_io_key[i]->read(); } - - logerror("muxed_inputs_r with %02x\n", m_mux); - - return 0x00000000;// 0xffffffff; + return result; } -void mjsenpu_state::mjsenpu_32bit_map(address_map &map) + +void mjsenpu_state::main_map(address_map &map) { - map(0x00000000, 0x001fffff).ram().share("mainram"); - map(0x40000000, 0x401fffff).rom().region("user2", 0); // main game rom + map(0x00000000, 0x001fffff).ram().share(m_mainram); + map(0x40000000, 0x401fffff).rom().region("maindata", 0); // main game rom map(0x80000000, 0x8001ffff).rw(FUNC(mjsenpu_state::vram_r), FUNC(mjsenpu_state::vram_w)); - map(0xffc00000, 0xffc000ff).rw(FUNC(mjsenpu_state::palette_low_r), FUNC(mjsenpu_state::palette_low_w)); - map(0xffd00000, 0xffd000ff).rw(FUNC(mjsenpu_state::palette_high_r), FUNC(mjsenpu_state::palette_high_w)); + map(0xffc00000, 0xffc000ff).rw(m_palette, FUNC(palette_device::read8_ext), FUNC(palette_device::write8_ext)).share("palette_ext"); + map(0xffd00000, 0xffd000ff).rw(m_palette, FUNC(palette_device::read8), FUNC(palette_device::write8)).share("palette"); map(0xffe00000, 0xffe007ff).ram().share("nvram"); - map(0xfff80000, 0xffffffff).rom().region("user1", 0); // boot rom + map(0xfff80000, 0xffffffff).rom().region("mainboot", 0); // boot rom } -void mjsenpu_state::mjsenpu_io(address_map &map) +void mjsenpu_state::main_portmap(address_map &map) { - map(0x4000, 0x4003).r(FUNC(mjsenpu_state::muxed_inputs_r)); + map(0x4000, 0x4003).r(FUNC(mjsenpu_state::key_matrix_r)); map(0x4010, 0x4013).portr("IN1"); map(0x4023, 0x4023).w(FUNC(mjsenpu_state::control_w)); @@ -252,26 +205,14 @@ void mjsenpu_state::mjsenpu_io(address_map &map) map(0x4040, 0x4043).portr("DSW2"); map(0x4050, 0x4053).portr("DSW3"); - map(0x4063, 0x4063).w(FUNC(mjsenpu_state::mux_w)); + map(0x4063, 0x4063).w(FUNC(mjsenpu_state::key_matrix_w)); map(0x4073, 0x4073).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); } static INPUT_PORTS_START( mjsenpu ) - PORT_START("MUX_8F") // in joystick mode? - PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_START1 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) - PORT_BIT( 0x000000ff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) - PORT_BIT( 0xffffff00, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("MUX_9E") + PORT_START("KEY0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) @@ -281,7 +222,7 @@ static INPUT_PORTS_START( mjsenpu ) PORT_BIT( 0x0000003f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("MUX_9D") + PORT_START("KEY1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) @@ -291,7 +232,7 @@ static INPUT_PORTS_START( mjsenpu ) PORT_BIT( 0x0000003f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("MUX_9B") + PORT_START("KEY2") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) @@ -301,7 +242,7 @@ static INPUT_PORTS_START( mjsenpu ) PORT_BIT( 0x0000003f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("MUX_97") + PORT_START("KEY3") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) @@ -311,6 +252,18 @@ static INPUT_PORTS_START( mjsenpu ) PORT_BIT( 0x0000003f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) PORT_BIT( 0xffffffc0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_START("KEY4") // in joystick mode? + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_START1 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CONDITION("DSW3",0x08,EQUALS,0x00) + PORT_BIT( 0x000000ff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("DSW3",0x08,EQUALS,0x08) + PORT_BIT( 0xffffff00, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("IN1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) @@ -325,9 +278,6 @@ static INPUT_PORTS_START( mjsenpu ) PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) PORT_BIT( 0xffffff00, IP_ACTIVE_LOW, IPT_UNUSED ) - - - PORT_START("DSW1") PORT_DIPNAME( 0x00000003, 0x00000003, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x00000000, DEF_STR( 2C_1C ) ) @@ -408,32 +358,30 @@ INPUT_PORTS_END void mjsenpu_state::video_start() { -} + for (int i = 0; i < 2; i++) + { + uint32_t const vram_size = 0x20000 / 2; + m_vram[i] = make_unique_clear(vram_size); + save_pointer(NAME(m_vram[i]), vram_size, i); + } +} -uint32_t mjsenpu_state::screen_update_mjsenpu(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t mjsenpu_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint32_t const *const vram = (m_control & 0x01) ? m_vram0 : m_vram1; + uint16_t const *const vram = m_vram[BIT(~m_control, 0)].get(); - int count = 0; - for (int y=0;y < 256;y++) + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { - for (int x=0;x < 512/4;x++) + offs_t count = (y << 8) | (cliprect.min_x >> 1); + for (int x = (cliprect.min_x >> 1); x <= ((cliprect.max_x + 1) >> 1); x++) { - int color; - - color = vram[count] & 0x000000ff; - bitmap.pix(y, x*4 + 2) = color; + uint8_t color = vram[count] & 0x00ff; + bitmap.pix(y, x*2 + 0) = color; - color = (vram[count] & 0x0000ff00) >> 8; - bitmap.pix(y, x*4 + 3) = color; - - color = (vram[count] & 0x00ff0000) >> 16; - bitmap.pix(y, x*4 + 0) = color; - - color = (vram[count] & 0xff000000) >> 24; - bitmap.pix(y, x*4 + 1) = color; + color = (vram[count] & 0xff00) >> 8; + bitmap.pix(y, x*2 + 1) = color; count++; } @@ -444,11 +392,8 @@ uint32_t mjsenpu_state::screen_update_mjsenpu(screen_device &screen, bitmap_ind1 void mjsenpu_state::machine_start() { - save_item(NAME(m_pal)); - save_item(NAME(m_vram0)); - save_item(NAME(m_vram1)); save_item(NAME(m_control)); - save_item(NAME(m_mux)); + save_item(NAME(m_key_matrix_select)); } void mjsenpu_state::machine_reset() @@ -466,10 +411,10 @@ following clocks are on the PCB void mjsenpu_state::mjsenpu(machine_config &config) { - /* basic machine hardware */ - E132XT(config, m_maincpu, 27000000*2); /* ?? Mhz */ - m_maincpu->set_addrmap(AS_PROGRAM, &mjsenpu_state::mjsenpu_32bit_map); - m_maincpu->set_addrmap(AS_IO, &mjsenpu_state::mjsenpu_io); + // basic machine hardware + E132XT(config, m_maincpu, 27000000*2); // ?? Mhz + m_maincpu->set_addrmap(AS_PROGRAM, &mjsenpu_state::main_map); + m_maincpu->set_addrmap(AS_IO, &mjsenpu_state::main_portmap); m_maincpu->set_vblank_int("screen", FUNC(mjsenpu_state::irq0_line_hold)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); @@ -477,28 +422,29 @@ void mjsenpu_state::mjsenpu(machine_config &config) // more likely coins out? TICKET_DISPENSER(config, m_hopper, attotime::from_msec(50)); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(512, 256); screen.set_visarea(0, 512-1, 0, 256-16-1); - screen.set_screen_update(FUNC(mjsenpu_state::screen_update_mjsenpu)); + screen.set_screen_update(FUNC(mjsenpu_state::screen_update)); screen.set_palette(m_palette); - PALETTE(config, m_palette).set_entries(0x100); + PALETTE(config, m_palette).set_format(2, &mjsenpu_state::mjsenpu_B6G5R5, 0x100); + m_palette->set_membits(8); SPEAKER(config, "mono").front_center(); - OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00); /* 1 Mhz? */ + OKIM6295(config, m_oki, 1000000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.00); // 1 Mhz? } ROM_START( mjsenpu ) - ROM_REGION32_BE( 0x80000, "user1", 0 ) /* Hyperstone CPU Code */ + ROM_REGION32_BE( 0x80000, "mainboot", 0 ) // Hyperstone CPU Code ROM_LOAD( "u1", 0x000000, 0x080000, CRC(ebfb1079) SHA1(9d676c635d5ee464df5730518399e141ebc515ed) ) - ROM_REGION32_BE( 0x200000, "user2", 0 ) /* Hyperstone CPU Code */ + ROM_REGION32_BE( 0x200000, "maindata", 0 ) // Hyperstone CPU Code ROM_LOAD16_WORD_SWAP( "u13", 0x000000, 0x200000, CRC(a803c5a5) SHA1(61c7386a1bb6224b788de01293697d0e896839a8) ) ROM_REGION( 0x080000, "oki", 0 ) @@ -507,9 +453,9 @@ ROM_END -uint32_t mjsenpu_state::mjsenpu_speedup_r() +uint32_t mjsenpu_state::speedup_r() { - int pc = m_maincpu->pc(); + offs_t const pc = m_maincpu->pc(); if (pc == 0xadb8) { @@ -517,7 +463,7 @@ uint32_t mjsenpu_state::mjsenpu_speedup_r() } else { - // printf("%08x\n", pc); + // logerror("%08x\n", pc); } return m_mainram[0x23468/4]; @@ -539,10 +485,10 @@ void mjsenpu_state::init_mjsenpu() (loops for 744256 instructions) */ // not especially effective, might be wrong. - m_maincpu->space(AS_PROGRAM).install_read_handler(0x23468, 0x2346b, read32smo_delegate(*this, FUNC(mjsenpu_state::mjsenpu_speedup_r))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x23468, 0x2346b, read32smo_delegate(*this, FUNC(mjsenpu_state::speedup_r))); } } // anonymous namespace - -GAME( 2002, mjsenpu, 0, mjsenpu, mjsenpu, mjsenpu_state, init_mjsenpu, ROT0, "Oriental Soft", "Mahjong Senpu", 0 ) +// Japanese text (excluding test mode), Chinese voice and test mode texts +GAME( 2002, mjsenpu, 0, mjsenpu, mjsenpu, mjsenpu_state, init_mjsenpu, ROT0, "Oriental Soft", "Mahjong Senpu (Japan)", 0 ) -- cgit v1.2.3