mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
mirage.cpp: Added 93C46 EEPROM hook-up [Angelo Salese]
This commit is contained in:
parent
8a83bda9c6
commit
e71b080980
@ -1,14 +1,18 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Angelo Salese
|
||||
/* Mirage Youjuu Mahjongden
|
||||
/**********************************************************************************************
|
||||
|
||||
TODO:
|
||||
-eeprom emulation? Software settings all changes if you toggle the "flip screen" dip-switch
|
||||
Mirage Youjuu Mahjongden (c) 1994 Mitchell
|
||||
|
||||
Notes:To enter into Test Mode you need to keep pressed the Mahjong A button at start-up.
|
||||
*/
|
||||
Similar to simpl156.cpp with shifted stuff around.
|
||||
|
||||
TODO:
|
||||
- some unknown writes (irq acks / sprite DMA start presumably);
|
||||
|
||||
/*
|
||||
Notes:
|
||||
- To enter into full Test Mode you need to keep pressed the Mahjong A key at start-up.
|
||||
|
||||
===============================================================================================
|
||||
|
||||
Mirage Youjuu Mahjongden
|
||||
(c)1994 Mitchell
|
||||
@ -32,24 +36,26 @@ MBL-04.12K [b533123d]
|
||||
MR_00-.2A [3a53f33d]
|
||||
MR_01-.3A [a0b758aa]
|
||||
|
||||
*/
|
||||
***********************************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "machine/decocrpt.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "video/deco16ic.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "video/bufsprite.h"
|
||||
#include "video/decospr.h"
|
||||
|
||||
// mirage_state was also defined in mess/drivers/mirage.c
|
||||
class miragemi_state : public driver_device
|
||||
class miragemj_state : public driver_device
|
||||
{
|
||||
public:
|
||||
miragemi_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
miragemj_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_deco_tilegen1(*this, "tilegen1"),
|
||||
m_eeprom(*this, "eeprom"),
|
||||
m_oki_sfx(*this, "oki_sfx"),
|
||||
m_oki_bgm(*this, "oki_bgm"),
|
||||
m_spriteram(*this, "spriteram") ,
|
||||
@ -65,6 +71,7 @@ public:
|
||||
/* devices */
|
||||
required_device<m68000_device> m_maincpu;
|
||||
required_device<deco16ic_device> m_deco_tilegen1;
|
||||
required_device<eeprom_serial_93cxx_device> m_eeprom;
|
||||
required_device<okim6295_device> m_oki_sfx;
|
||||
required_device<okim6295_device> m_oki_bgm;
|
||||
required_device<buffered_spriteram16_device> m_spriteram;
|
||||
@ -73,8 +80,8 @@ public:
|
||||
required_shared_ptr<uint16_t> m_pf2_rowscroll;
|
||||
optional_device<decospr_device> m_sprgen;
|
||||
|
||||
DECLARE_WRITE16_MEMBER(mirage_mux_w);
|
||||
DECLARE_READ16_MEMBER(mirage_input_r);
|
||||
DECLARE_WRITE16_MEMBER(mjmux_w);
|
||||
DECLARE_READ16_MEMBER(mjmux_r);
|
||||
DECLARE_WRITE16_MEMBER(okim1_rombank_w);
|
||||
DECLARE_WRITE16_MEMBER(okim0_rombank_w);
|
||||
DECLARE_DRIVER_INIT(mirage);
|
||||
@ -85,12 +92,12 @@ public:
|
||||
DECO16IC_BANK_CB_MEMBER(bank_callback);
|
||||
};
|
||||
|
||||
void miragemi_state::video_start()
|
||||
void miragemj_state::video_start()
|
||||
{
|
||||
m_sprgen->alloc_sprite_bitmap();
|
||||
}
|
||||
|
||||
uint32_t miragemi_state::screen_update_mirage(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
uint32_t miragemj_state::screen_update_mirage(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
address_space &space = machine().dummy_space();
|
||||
uint16_t flip = m_deco_tilegen1->pf_control_r(space, 0, 0xffff);
|
||||
@ -112,12 +119,12 @@ uint32_t miragemi_state::screen_update_mirage(screen_device &screen, bitmap_rgb3
|
||||
}
|
||||
|
||||
|
||||
WRITE16_MEMBER(miragemi_state::mirage_mux_w)
|
||||
WRITE16_MEMBER(miragemj_state::mjmux_w)
|
||||
{
|
||||
m_mux_data = data & 0x1f;
|
||||
}
|
||||
|
||||
READ16_MEMBER(miragemi_state::mirage_input_r)
|
||||
READ16_MEMBER(miragemj_state::mjmux_r)
|
||||
{
|
||||
switch (m_mux_data & 0x1f)
|
||||
{
|
||||
@ -131,18 +138,22 @@ READ16_MEMBER(miragemi_state::mirage_input_r)
|
||||
return 0xffff;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(miragemi_state::okim1_rombank_w)
|
||||
WRITE16_MEMBER(miragemj_state::okim1_rombank_w)
|
||||
{
|
||||
m_oki_sfx->set_rom_bank(data & 0x3);
|
||||
}
|
||||
|
||||
WRITE16_MEMBER(miragemi_state::okim0_rombank_w)
|
||||
WRITE16_MEMBER(miragemj_state::okim0_rombank_w)
|
||||
{
|
||||
m_eeprom->clk_write(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE);
|
||||
m_eeprom->di_write(BIT(data, 4));
|
||||
m_eeprom->cs_write(BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
/*bits 4-6 used on POST? */
|
||||
m_oki_bgm->set_rom_bank(data & 0x7);
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( mirage_map, AS_PROGRAM, 16, miragemi_state )
|
||||
static ADDRESS_MAP_START( mirage_map, AS_PROGRAM, 16, miragemj_state )
|
||||
AM_RANGE(0x000000, 0x07ffff) AM_ROM
|
||||
/* tilemaps */
|
||||
AM_RANGE(0x100000, 0x101fff) AM_DEVREADWRITE("tilegen1", deco16ic_device, pf1_data_r, pf1_data_w) // 0x100000 - 0x101fff tested
|
||||
@ -154,15 +165,13 @@ static ADDRESS_MAP_START( mirage_map, AS_PROGRAM, 16, miragemi_state )
|
||||
AM_RANGE(0x130000, 0x1307ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
|
||||
AM_RANGE(0x140000, 0x14000f) AM_DEVREADWRITE8("oki_sfx", okim6295_device, read, write, 0x00ff)
|
||||
AM_RANGE(0x150000, 0x15000f) AM_DEVREADWRITE8("oki_bgm", okim6295_device, read, write, 0x00ff)
|
||||
// AM_RANGE(0x140006, 0x140007) AM_READ(random_readers)
|
||||
// AM_RANGE(0x150006, 0x150007) AM_READNOP
|
||||
AM_RANGE(0x160000, 0x160001) AM_WRITENOP
|
||||
AM_RANGE(0x168000, 0x16800f) AM_DEVWRITE("tilegen1", deco16ic_device, pf_control_w)
|
||||
AM_RANGE(0x16a000, 0x16a001) AM_WRITENOP
|
||||
AM_RANGE(0x16c000, 0x16c001) AM_WRITE(okim1_rombank_w)
|
||||
AM_RANGE(0x16c002, 0x16c003) AM_WRITE(okim0_rombank_w)
|
||||
AM_RANGE(0x16c004, 0x16c005) AM_WRITE(mirage_mux_w)
|
||||
AM_RANGE(0x16c006, 0x16c007) AM_READ(mirage_input_r)
|
||||
AM_RANGE(0x16c004, 0x16c005) AM_WRITE(mjmux_w)
|
||||
AM_RANGE(0x16c006, 0x16c007) AM_READ(mjmux_r)
|
||||
AM_RANGE(0x16e000, 0x16e001) AM_WRITENOP
|
||||
AM_RANGE(0x16e002, 0x16e003) AM_READ_PORT("SYSTEM_IN")
|
||||
AM_RANGE(0x170000, 0x173fff) AM_RAM
|
||||
@ -171,45 +180,14 @@ ADDRESS_MAP_END
|
||||
|
||||
static INPUT_PORTS_START( mirage )
|
||||
PORT_START("SYSTEM_IN")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_SERVICE( 0x0008, IP_ACTIVE_LOW )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
|
||||
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Flip_Screen ) )
|
||||
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read)
|
||||
PORT_BIT( 0xffc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("KEY0")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_A )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_E )
|
||||
@ -289,28 +267,29 @@ static GFXDECODE_START( mirage )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
DECO16IC_BANK_CB_MEMBER(miragemi_state::bank_callback)
|
||||
DECO16IC_BANK_CB_MEMBER(miragemj_state::bank_callback)
|
||||
{
|
||||
return ((bank >> 4) & 0x7) * 0x1000;
|
||||
}
|
||||
|
||||
void miragemi_state::machine_start()
|
||||
void miragemj_state::machine_start()
|
||||
{
|
||||
save_item(NAME(m_mux_data));
|
||||
}
|
||||
|
||||
void miragemi_state::machine_reset()
|
||||
void miragemj_state::machine_reset()
|
||||
{
|
||||
m_mux_data = 0;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( mirage, miragemi_state )
|
||||
static MACHINE_CONFIG_START( mirage, miragemj_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M68000, 28000000/2)
|
||||
MCFG_CPU_PROGRAM_MAP(mirage_map)
|
||||
MCFG_CPU_VBLANK_INT_DRIVER("screen", miragemi_state, irq6_line_hold)
|
||||
MCFG_CPU_VBLANK_INT_DRIVER("screen", miragemj_state, irq6_line_hold)
|
||||
|
||||
MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") // 93C45
|
||||
|
||||
/* video hardware */
|
||||
MCFG_BUFFERED_SPRITERAM16_ADD("spriteram")
|
||||
@ -320,7 +299,7 @@ static MACHINE_CONFIG_START( mirage, miragemi_state )
|
||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
|
||||
MCFG_SCREEN_SIZE(40*8, 32*8)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(miragemi_state, screen_update_mirage)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(miragemj_state, screen_update_mirage)
|
||||
MCFG_SCREEN_VBLANK_DEVICE("spriteram", buffered_spriteram16_device, vblank_copy_rising)
|
||||
|
||||
|
||||
@ -337,8 +316,8 @@ static MACHINE_CONFIG_START( mirage, miragemi_state )
|
||||
MCFG_DECO16IC_PF2_COL_BANK(0x10)
|
||||
MCFG_DECO16IC_PF1_COL_MASK(0x0f)
|
||||
MCFG_DECO16IC_PF2_COL_MASK(0x0f)
|
||||
MCFG_DECO16IC_BANK1_CB(miragemi_state, bank_callback)
|
||||
MCFG_DECO16IC_BANK2_CB(miragemi_state, bank_callback)
|
||||
MCFG_DECO16IC_BANK1_CB(miragemj_state, bank_callback)
|
||||
MCFG_DECO16IC_BANK2_CB(miragemj_state, bank_callback)
|
||||
MCFG_DECO16IC_PF12_8X8_BANK(0)
|
||||
MCFG_DECO16IC_PF12_16X16_BANK(1)
|
||||
MCFG_DECO16IC_GFXDECODE("gfxdecode")
|
||||
@ -383,9 +362,9 @@ ROM_START( mirage )
|
||||
ROM_LOAD( "mbl-04.12k", 0x000000, 0x100000, CRC(b533123d) SHA1(2cb2f11331d00c2d282113932ed2836805f4fc6e) )
|
||||
ROM_END
|
||||
|
||||
DRIVER_INIT_MEMBER(miragemi_state,mirage)
|
||||
DRIVER_INIT_MEMBER(miragemj_state,mirage)
|
||||
{
|
||||
deco56_decrypt_gfx(machine(), "gfx1");
|
||||
}
|
||||
|
||||
GAME( 1994, mirage, 0, mirage, mirage, miragemi_state, mirage, ROT0, "Mitchell", "Mirage Youjuu Mahjongden (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1994, mirage, 0, mirage, mirage, miragemj_state, mirage, ROT0, "Mitchell", "Mirage Youjuu Mahjongden (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
|
Loading…
Reference in New Issue
Block a user