diff options
Diffstat (limited to 'src/mame/drivers/srmp6.cpp')
-rw-r--r-- | src/mame/drivers/srmp6.cpp | 733 |
1 files changed, 733 insertions, 0 deletions
diff --git a/src/mame/drivers/srmp6.cpp b/src/mame/drivers/srmp6.cpp new file mode 100644 index 00000000000..05cc14bc010 --- /dev/null +++ b/src/mame/drivers/srmp6.cpp @@ -0,0 +1,733 @@ +// license:??? +// copyright-holders:Sebastien Volpe, Tomasz Slanina, David Haywood +/* + Super Real Mahjong P6 (JPN Ver.) + (c)1996 Seta + +WIP driver by Sebastien Volpe, Tomasz Slanina and David Haywood + +Emulation Notes: +The graphics are compressed, using the same 8bpp RLE scheme as CPS3 uses +for the background on Sean's stage of Street Fighter III. + +DMA Operations are not fully understood + + +according prg ROM (offset $0fff80): + + S12 SYSTEM + SUPER REAL MAJAN P6 + SETA CO.,LTD + 19960410 + V1.00 + +TODO: + - fix sound emulation + - fix DMA operations + - fix video emulation + +Are there other games on this 'System S12' hardware ??? + +---------------- dump infos ---------------- + +[Jun/15/2000] + +Super Real Mahjong P6 (JPN Ver.) +(c)1996 Seta + +SX011 +E47-REV01B + +CPU: 68000-16 +Sound: NiLe +OSC: 16.0000MHz + 42.9545MHz + 56.0000MHz + +Chips: ST-0026 NiLe (video, sound) + ST-0017 + + +SX011-01.22 chr, samples (?) +SX011-02.21 +SX011-03.20 +SX011-04.19 +SX011-05.18 +SX011-06.17 +SX011-07.16 +SX011-08.15 + +SX011-09.10 68000 data + +SX011-10.4 68000 prg. +SX011-11.5 + + +Dumped 06/15/2000 + +*/ + + +#include "emu.h" +#include "cpu/m68000/m68000.h" +#include "sound/nile.h" + +class srmp6_state : public driver_device +{ +public: + srmp6_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_sprram(*this, "sprram"), + m_chrram(*this, "chrram"), + m_dmaram(*this, "dmaram"), + m_video_regs(*this, "video_regs"), + m_maincpu(*this, "maincpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette") { } + + UINT16* m_tileram; + required_shared_ptr<UINT16> m_sprram; + required_shared_ptr<UINT16> m_chrram; + optional_shared_ptr<UINT16> m_dmaram; + required_shared_ptr<UINT16> m_video_regs; + + UINT16 *m_sprram_old; + + int m_brightness; + UINT16 m_input_select; + + unsigned short m_lastb; + unsigned short m_lastb2; + int m_destl; + DECLARE_WRITE16_MEMBER(srmp6_input_select_w); + DECLARE_READ16_MEMBER(srmp6_inputs_r); + DECLARE_WRITE16_MEMBER(video_regs_w); + DECLARE_READ16_MEMBER(video_regs_r); + DECLARE_WRITE16_MEMBER(srmp6_dma_w); + DECLARE_READ16_MEMBER(tileram_r); + DECLARE_WRITE16_MEMBER(tileram_w); + DECLARE_WRITE16_MEMBER(paletteram_w); + DECLARE_READ16_MEMBER(srmp6_irq_ack_r); + DECLARE_DRIVER_INIT(INIT); + virtual void machine_start(); + virtual void video_start(); + UINT32 screen_update_srmp6(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void update_palette(); + UINT32 process(UINT8 b,UINT32 dst_offset); + required_device<cpu_device> m_maincpu; + required_device<gfxdecode_device> m_gfxdecode; + required_device<palette_device> m_palette; +}; + +#define VERBOSE 0 +#define LOG(x) do { if (VERBOSE) logerror x; } while (0) + +static const gfx_layout tiles8x8_layout = +{ + 8,8, + (0x100000*16)/0x40, + 8, + { 0,1,2,3,4,5,6,7 }, + { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 }, + { 0*64,1*64,2*64,3*64,4*64,5*64,6*64,7*64 }, + 8*64 +}; + +void srmp6_state::update_palette() +{ + INT8 r, g ,b; + int brg = m_brightness - 0x60; + int i; + + for(i = 0; i < 0x800; i++) + { + r = m_palette->basemem().read16(i) >> 0 & 0x1F; + g = m_palette->basemem().read16(i) >> 5 & 0x1F; + b = m_palette->basemem().read16(i) >> 10 & 0x1F; + + if(brg < 0) { + r += (r * brg) >> 5; + if(r < 0) r = 0; + g += (g * brg) >> 5; + if(g < 0) g = 0; + b += (b * brg) >> 5; + if(b < 0) b = 0; + } + else if(brg > 0) { + r += ((0x1F - r) * brg) >> 5; + if(r > 0x1F) r = 0x1F; + g += ((0x1F - g) * brg) >> 5; + if(g > 0x1F) g = 0x1F; + b += ((0x1F - b) * brg) >> 5; + if(b > 0x1F) b = 0x1F; + } + m_palette->set_pen_color(i, rgb_t(r << 3, g << 3, b << 3)); + } +} + +void srmp6_state::video_start() +{ + m_tileram = auto_alloc_array_clear(machine(), UINT16, 0x100000*16/2); + m_dmaram.allocate(0x100/2); + m_sprram_old = auto_alloc_array_clear(machine(), UINT16, 0x80000/2); + + /* create the char set (gfx will then be updated dynamically from RAM) */ + m_gfxdecode->set_gfx(0, global_alloc(gfx_element(m_palette, tiles8x8_layout, (UINT8*)m_tileram, 0, m_palette->entries() / 256, 0))); + m_gfxdecode->gfx(0)->set_granularity(256); + + m_brightness = 0x60; +} + +#if 0 +static int xixi=0; +#endif + +UINT32 srmp6_state::screen_update_srmp6(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + int alpha; + int x,y,tileno,height,width,xw,yw,sprite,xb,yb; + UINT16 *sprite_list = m_sprram_old; + UINT16 mainlist_offset = 0; + + union + { + INT16 a; + UINT16 b; + } temp; + + bitmap.fill(0, cliprect); + +#if 0 + /* debug */ + if(machine().input().code_pressed_once(KEYCODE_Q)) + { + ++xixi; + printf("%x\n",xixi); + } + + if(machine().input().code_pressed_once(KEYCODE_W)) + { + --xixi; + printf("%x\n",xixi); + } +#endif + + /* Main spritelist is 0x0000 - 0x1fff in spriteram, sublists follow */ + while (mainlist_offset<0x2000/2) + { + UINT16 *sprite_sublist = &m_sprram_old[sprite_list[mainlist_offset+1]<<3]; + UINT16 sublist_length=sprite_list[mainlist_offset+0]&0x7fff; //+1 ? + INT16 global_x,global_y, flip_x, flip_y; + UINT16 global_pal; + + /* end of list marker */ + if (sprite_list[mainlist_offset+0] == 0x8000) + break; + + + if(sprite_list[mainlist_offset+0]!=0) + { + temp.b=sprite_list[mainlist_offset+2]; + global_x=temp.a; + temp.b=sprite_list[mainlist_offset+3]; + global_y=temp.a; + + global_pal = sprite_list[mainlist_offset+4] & 0x7; + + if((sprite_list[mainlist_offset+5] & 0x700) == 0x700) + { + alpha = (sprite_list[mainlist_offset+5] & 0x1F) << 3; + } + else + { + alpha = 255; + } + // printf("%x %x \n",sprite_list[mainlist_offset+1],sublist_length); + + while(sublist_length) + { + sprite=sprite_sublist[0]&0x7fff; + flip_x=sprite_sublist[1]>>8&1; + flip_y=sprite_sublist[1]>>9&1; + temp.b=sprite_sublist[2]; + x=temp.a; + temp.b=sprite_sublist[3]; + y=temp.a; + //x+=global_x; + //y+=global_y; + + width=((sprite_sublist[1])&0x3); + height=((sprite_sublist[1]>>2)&0x3); + + height = 1 << height; + width = 1 << width; + + y-=height*8; + tileno = sprite; + //tileno += (sprite_list[4]&0xf)*0x4000; // this makes things worse in places (title screen for example) + + for(xw=0;xw<width;xw++) + { + for(yw=0;yw<height;yw++) + { + if(!flip_x) + xb=x+xw*8+global_x; + else + xb=x+(width-xw-1)*8+global_x; + + if(!flip_y) + yb=y+yw*8+global_y; + else + yb=y+(height-yw-1)*8+global_y; + + m_gfxdecode->gfx(0)->alpha(bitmap,cliprect,tileno,global_pal,flip_x,flip_y,xb,yb,0,alpha); + tileno++; + } + } + + sprite_sublist+=8; + --sublist_length; + } + } + mainlist_offset+=8; + } + + memcpy(m_sprram_old, m_sprram, 0x80000); + + if(machine().input().code_pressed_once(KEYCODE_Q)) + { + FILE *p=fopen("tileram.bin","wb"); + fwrite(m_tileram, 1, 0x100000*16, p); + fclose(p); + } + + + return 0; +} + +/*************************************************************************** + Main CPU memory handlers +***************************************************************************/ + +void srmp6_state::machine_start() +{ + membank("bank1")->configure_entries(0, 16, memregion("nile")->base(), 0x200000); +} + +WRITE16_MEMBER(srmp6_state::srmp6_input_select_w) +{ + m_input_select = data & 0x0f; +} + +READ16_MEMBER(srmp6_state::srmp6_inputs_r) +{ + if (offset == 0) // DSW + return ioport("DSW")->read(); + + switch (m_input_select) // inputs + { + case 1<<0: return ioport("KEY0")->read(); + case 1<<1: return ioport("KEY1")->read(); + case 1<<2: return ioport("KEY2")->read(); + case 1<<3: return ioport("KEY3")->read(); + } + + return 0; +} + + +WRITE16_MEMBER(srmp6_state::video_regs_w) +{ + switch(offset) + { + case 0x5e/2: // bank switch, used by ROM check + { + LOG(("%x\n",data)); + membank("bank1")->set_entry(data & 0x0f); + break; + } + + // set by IT4 + case 0x5c/2: // either 0x40 explicitely in many places, or according $2083b0 (IT4) + //Fade in/out (0x40(dark)-0x60(normal)-0x7e?(bright) reset by 0x00? + data = (!data)?0x60:(data == 0x5e)?0x60:data; + if (m_brightness != data) { + m_brightness = data; + update_palette(); + } + break; + + /* unknown registers - there are others */ + + // set by IT4 (jsr $b3c), according flip screen dsw + case 0x48/2: // 0 / 0xb0 if flipscreen + case 0x52/2: // 0 / 0x2ef if flipscreen + case 0x54/2: // 0x152 / 0x15e if flipscreen + + // set by IT4 ($82e-$846) + case 0x56/2: // written 8,9,8,9 successively + + default: + logerror("video_regs_w (PC=%06X): %04x = %04x & %04x\n", space.device().safe_pcbase(), offset*2, data, mem_mask); + break; + } + COMBINE_DATA(&m_video_regs[offset]); +} + +READ16_MEMBER(srmp6_state::video_regs_r) +{ + logerror("video_regs_r (PC=%06X): %04x\n", space.device().safe_pcbase(), offset*2); + return m_video_regs[offset]; +} + + +/* DMA RLE stuff - the same as CPS3 */ +UINT32 srmp6_state::process(UINT8 b,UINT32 dst_offset) +{ + int l=0; + + UINT8 *tram=(UINT8*)m_tileram; + + if (m_lastb == m_lastb2) //rle + { + int i; + int rle=(b+1)&0xff; + + for(i=0;i<rle;++i) + { + tram[dst_offset + m_destl] = m_lastb; + m_gfxdecode->gfx(0)->mark_dirty((dst_offset + m_destl)/0x40); + + dst_offset++; + ++l; + } + m_lastb2 = 0xffff; + + return l; + } + else + { + m_lastb2 = m_lastb; + m_lastb = b; + tram[dst_offset + m_destl] = b; + m_gfxdecode->gfx(0)->mark_dirty((dst_offset + m_destl)/0x40); + + return 1; + } +} + + +WRITE16_MEMBER(srmp6_state::srmp6_dma_w) +{ + UINT16* dmaram = m_dmaram; + + COMBINE_DATA(&dmaram[offset]); + if (offset==13 && dmaram[offset]==0x40) + { + const UINT8 *rom = memregion("nile")->base(); + UINT32 srctab=2*((((UINT32)dmaram[5])<<16)|dmaram[4]); + UINT32 srcdata=2*((((UINT32)dmaram[11])<<16)|dmaram[10]); + UINT32 len=4*(((((UINT32)dmaram[7]&3)<<16)|dmaram[6])+1); //??? WRONG! + int tempidx=0; + + /* show params */ + LOG(("DMA! %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n", + dmaram[0x00/2], + dmaram[0x02/2], + dmaram[0x04/2], + dmaram[0x06/2], + dmaram[0x08/2], + dmaram[0x0a/2], + dmaram[0x0c/2], + dmaram[0x0e/2], + dmaram[0x10/2], + dmaram[0x12/2], + dmaram[0x14/2], + dmaram[0x16/2], + dmaram[0x18/2], + dmaram[0x1a/2])); + + m_destl = dmaram[9]*0x40000; + + m_lastb = 0xfffe; + m_lastb2 = 0xffff; + + while(1) + { + int i; + UINT8 ctrl=rom[srcdata]; + ++srcdata; + + for(i=0;i<8;++i) + { + UINT8 p=rom[srcdata]; + + if(ctrl&0x80) + { + UINT8 real_byte; + real_byte = rom[srctab+p*2]; + tempidx+=process(real_byte,tempidx); + real_byte = rom[srctab+p*2+1];//px[DMA_XOR((current_table_address+p*2+1))]; + tempidx+=process(real_byte,tempidx); + } + else + { + tempidx+=process(p,tempidx); + } + + ctrl<<=1; + ++srcdata; + + + if(tempidx>=len) + { + LOG(("%x\n",srcdata)); + return; + } + } + } + } +} + +/* if tileram is actually bigger than the mapped area, how do we access the rest? */ +READ16_MEMBER(srmp6_state::tileram_r) +{ + return m_chrram[offset]; +} + +WRITE16_MEMBER(srmp6_state::tileram_w) +{ + //UINT16 tmp; + COMBINE_DATA(&m_chrram[offset]); + + /* are the DMA registers enabled some other way, or always mapped here, over RAM? */ + if (offset >= 0xfff00/2 && offset <= 0xfff1a/2 ) + { + offset &=0x1f; + srmp6_dma_w(space,offset,data,mem_mask); + } +} + +WRITE16_MEMBER(srmp6_state::paletteram_w) +{ + INT8 r, g, b; + int brg = m_brightness - 0x60; + + m_palette->write(space, offset, data, mem_mask); + + if(brg) + { + r = data >> 0 & 0x1F; + g = data >> 5 & 0x1F; + b = data >> 10 & 0x1F; + + if(brg < 0) { + r += (r * brg) >> 5; + if(r < 0) r = 0; + g += (g * brg) >> 5; + if(g < 0) g = 0; + b += (b * brg) >> 5; + if(b < 0) b = 0; + } + else if(brg > 0) { + r += ((0x1F - r) * brg) >> 5; + if(r > 0x1F) r = 0x1F; + g += ((0x1F - g) * brg) >> 5; + if(g > 0x1F) g = 0x1F; + b += ((0x1F - b) * brg) >> 5; + if(b > 0x1F) b = 0x1F; + } + + m_palette->set_pen_color(offset, rgb_t(r << 3, g << 3, b << 3)); + } +} + +READ16_MEMBER(srmp6_state::srmp6_irq_ack_r) +{ + m_maincpu->set_input_line(4, CLEAR_LINE); + return 0; // value read doesn't matter +} + +static ADDRESS_MAP_START( srmp6_map, AS_PROGRAM, 16, srmp6_state ) + AM_RANGE(0x000000, 0x0fffff) AM_ROM + AM_RANGE(0x200000, 0x23ffff) AM_RAM // work RAM + AM_RANGE(0x600000, 0x7fffff) AM_ROMBANK("bank1") // banked ROM (used by ROM check) + AM_RANGE(0x800000, 0x9fffff) AM_ROM AM_REGION("user1", 0) + + AM_RANGE(0x300000, 0x300005) AM_READWRITE(srmp6_inputs_r, srmp6_input_select_w) // inputs + AM_RANGE(0x480000, 0x480fff) AM_RAM_WRITE(paletteram_w) AM_SHARE("palette") + AM_RANGE(0x4d0000, 0x4d0001) AM_READ(srmp6_irq_ack_r) + + // OBJ RAM: checked [$400000-$47dfff] + AM_RANGE(0x400000, 0x47ffff) AM_RAM AM_SHARE("sprram") + + // CHR RAM: checked [$500000-$5fffff] + AM_RANGE(0x500000, 0x5fffff) AM_READWRITE(tileram_r,tileram_w) AM_SHARE("chrram") + //AM_RANGE(0x5fff00, 0x5fffff) AM_WRITE(dma_w) AM_SHARE("dmaram") + + AM_RANGE(0x4c0000, 0x4c006f) AM_READWRITE(video_regs_r, video_regs_w) AM_SHARE("video_regs") // ? gfx regs ST-0026 NiLe + AM_RANGE(0x4e0000, 0x4e00ff) AM_DEVREADWRITE("nile", nile_device, nile_snd_r, nile_snd_w) + AM_RANGE(0x4e0100, 0x4e0101) AM_DEVREADWRITE("nile", nile_device, nile_sndctrl_r, nile_sndctrl_w) + //AM_RANGE(0x4e0110, 0x4e0111) AM_NOP // ? accessed once ($268dc, written $b.w) + //AM_RANGE(0x5fff00, 0x5fff1f) AM_RAM // ? see routine $5ca8, video_regs related ??? + + //AM_RANGE(0xf00004, 0xf00005) AM_RAM // ? + //AM_RANGE(0xf00006, 0xf00007) AM_RAM // ? + +ADDRESS_MAP_END + + +/*************************************************************************** + Port definitions +***************************************************************************/ + +static INPUT_PORTS_START( srmp6 ) + + PORT_START("KEY0") + PORT_BIT( 0xfe01, IP_ACTIVE_LOW, IPT_UNUSED ) // explicitely discarded + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_A ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_E ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_I ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_M ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) + PORT_SERVICE_NO_TOGGLE( 0x0100, IP_ACTIVE_LOW ) + + PORT_START("KEY1") + PORT_BIT( 0xfe41, IP_ACTIVE_LOW, IPT_UNUSED ) // explicitely discarded + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_B ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_F ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_J ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_N ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) + PORT_BIT( 0x0180, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("KEY2") + PORT_BIT( 0xfe41, IP_ACTIVE_LOW, IPT_UNUSED ) // explicitely discarded + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_C ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_G ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_K ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) + PORT_BIT( 0x0180, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("KEY3") + PORT_BIT( 0xfe61, IP_ACTIVE_LOW, IPT_UNUSED ) // explicitely discarded + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_D ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_H ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_L ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) + PORT_BIT( 0x0180, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("DSW") /* 16-bit DSW1+DSW2 */ + PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coinage ) ) // DSW1 + PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x0001, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0003, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0006, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x0005, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0000, "Re-Clothe" ) + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, "Nudity" ) + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( On ) ) + PORT_DIPNAME( 0x0700, 0x0700, DEF_STR( Difficulty ) ) // DSW2 + PORT_DIPSETTING( 0x0000, "8" ) + PORT_DIPSETTING( 0x0100, "7" ) + PORT_DIPSETTING( 0x0200, "6" ) + PORT_DIPSETTING( 0x0300, "5" ) + PORT_DIPSETTING( 0x0400, "3" ) + PORT_DIPSETTING( 0x0500, "2" ) + PORT_DIPSETTING( 0x0600, "1" ) + PORT_DIPSETTING( 0x0700, "4" ) + PORT_DIPNAME( 0x0800, 0x0000, "Kuitan" ) + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Continues ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_SERVICE( 0x8000, IP_ACTIVE_LOW ) +INPUT_PORTS_END + +/*************************************************************************** + Machine driver +***************************************************************************/ + +static MACHINE_CONFIG_START( srmp6, srmp6_state ) + + MCFG_CPU_ADD("maincpu", M68000, 16000000) + MCFG_CPU_PROGRAM_MAP(srmp6_map) + MCFG_CPU_VBLANK_INT_DRIVER("screen", srmp6_state, irq4_line_assert) // irq3 is a timer irq, but it's never enabled + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(64*8, 64*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 42*8-1, 0*8, 30*8-1) + MCFG_SCREEN_UPDATE_DRIVER(srmp6_state, screen_update_srmp6) + + MCFG_PALETTE_ADD("palette", 0x800) + MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) + + MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + + MCFG_NILE_ADD("nile", 0) + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) +MACHINE_CONFIG_END + + +/*************************************************************************** + ROM definition(s) +***************************************************************************/ + +ROM_START( srmp6 ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "sx011-10.4", 0x000001, 0x080000, CRC(8f4318a5) SHA1(44160968cca027b3d42805f2dd42662d11257ef6) ) + ROM_LOAD16_BYTE( "sx011-11.5", 0x000000, 0x080000, CRC(7503d9cf) SHA1(03ab35f13b6166cb362aceeda18e6eda8d3abf50) ) + + ROM_REGION( 0x200000, "user1", 0 ) /* 68000 Data */ + ROM_LOAD( "sx011-09.10", 0x000000, 0x200000, CRC(58f74438) SHA1(a256e39ca0406e513ab4dbd812fb0b559b4f61f2) ) + + /* these are accessed directly by the 68k, DMA device etc. NOT decoded */ + ROM_REGION( 0x2000000, "nile", 0) /* Banked ROM */ + ROM_LOAD16_WORD_SWAP( "sx011-08.15", 0x0000000, 0x0400000, CRC(01b3b1f0) SHA1(bbd60509c9ba78358edbcbb5953eafafd6e2eaf5) ) // CHR00 + ROM_LOAD16_WORD_SWAP( "sx011-07.16", 0x0400000, 0x0400000, CRC(26e57dac) SHA1(91272268977c5fbff7e8fbe1147bf108bd2ed321) ) // CHR01 + ROM_LOAD16_WORD_SWAP( "sx011-06.17", 0x0800000, 0x0400000, CRC(220ee32c) SHA1(77f39b54891c2381b967534b0f6d380962eadcae) ) // CHR02 + ROM_LOAD16_WORD_SWAP( "sx011-05.18", 0x0c00000, 0x0400000, CRC(87e5fea9) SHA1(abd751b5744d6ac7e697774ea9a7f7455bf3ac7c) ) // CHR03 + ROM_LOAD16_WORD_SWAP( "sx011-04.19", 0x1000000, 0x0400000, CRC(e90d331e) SHA1(d8afb1497cec8fe6de10d23d49427e11c4c57910) ) // CHR04 + ROM_LOAD16_WORD_SWAP( "sx011-03.20", 0x1400000, 0x0400000, CRC(f1f24b35) SHA1(70d6848f77940331e1be8591a33d62ac22a3aee9) ) // CHR05 + ROM_LOAD16_WORD_SWAP( "sx011-02.21", 0x1800000, 0x0400000, CRC(c56d7e50) SHA1(355c64b38e7b266f386b9c0b906c8581fc15374b) ) // CHR06 + ROM_LOAD16_WORD_SWAP( "sx011-01.22", 0x1c00000, 0x0400000, CRC(785409d1) SHA1(3e31254452a30d929161a1ea3a3daa69de058364) ) // CHR07 +ROM_END + + + +/*************************************************************************** + Game driver(s) +***************************************************************************/ + +GAME( 1995, srmp6, 0, srmp6, srmp6, driver_device, 0, ROT0, "Seta", "Super Real Mahjong P6 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND) |