New working driver: Monkey Magic © 1979 Nintendo

This commit is contained in:
Dirk Best 2015-07-24 17:01:47 +02:00
parent ff63d596ce
commit a1157715fe
3 changed files with 331 additions and 0 deletions

View File

@ -2213,6 +2213,7 @@ files {
MAME_DIR .. "src/mame/drivers/mario.c",
MAME_DIR .. "src/mame/audio/mario.c",
MAME_DIR .. "src/mame/video/mario.c",
MAME_DIR .. "src/mame/drivers/mmagic.c",
MAME_DIR .. "src/mame/drivers/multigam.c",
MAME_DIR .. "src/mame/drivers/n8080.c",
MAME_DIR .. "src/mame/audio/n8080.c",

View File

@ -1236,6 +1236,7 @@ marioo // (c) 1983 Nintendo of America
marioj // (c) 1983 Nintendo
masao // bootleg
mariobl // bootleg
mmagic // (c) 1979 Nintendo
dkong3abl //
pestplce // bootleg on donkey kong hw
spclforc // (c) 1985 Senko Industries (Magic Eletronics Inc. license)

329
src/mame/drivers/mmagic.c Normal file
View File

@ -0,0 +1,329 @@
// license:GPL-2.0+
// copyright-holders:Dirk Best
/***************************************************************************
"Monkey Magic" © 1979 Nintendo
Dumping info provided by Andrew Welburn:
TZF-MP - Main Board
TZF-SOU - Sound Board
# device Label PCB filename
-------------------------------------------
4 i2708 1AI* 2A 1AI.2A
5 i2708 2AI* 3A 2AI.3A
6 i2708 3AI* 4A 3AI.4A
7 i2708 4AI* 4/5A 4AI.45A
8 i2708 5AI* 5A 5AI.5A
22 H7641 6H 6HI 6H.6HI
23 ?? ** 7H 7HI 7H.7HI
24 H7641 6J 6JK 6J.6JK
25 H7641 6H*** 7JK
* Note that there is a Kana character 'I' in romaji on the end of the labels, not an I.
** Note this device was plastic and not ceramic, but it was dumped as a Harris 7641 as
it is logical that its compatible with the 7641. I can see the other devices all have
similar/same Harris markings in the bottom left of the IC obscured by the labels.
*** Note that the label for the 7643 PROM at IC25 was almost scraped off, but by its position
in the sequence, it has to be 6H. I removed a little more of the label in order to
work out what the inking was on it below, turned out to be 'D-2'. the prom at IC22 also
looks like it has an inked number under the paper label, just peeking through on one side.
Without removing the paper labels entirely, these markings wont be fully known, but were
covered for some reason.
SPECS:
- CPU is an NEC D8085A
- Crystal is marked 6.1440, but this looks to have been replaced.
- X1/X2 clock frequency measured at pins 1 + 2 is 6.14330 mhz
- Test point with stable readings is :
- TP4 (HS) = 15.9982 khz (Horizontal sync)
- TP5 (VS) = 60.5992 hz (Vertical Sync)
***************************************************************************/
#include "emu.h"
#include "cpu/i8085/i8085.h"
//**************************************************************************
// CONSTANTS / MACROS
//**************************************************************************
#define LOG_AUDIO 1
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class mmagic_state : public driver_device
{
public:
mmagic_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_vram(*this, "vram"),
m_tiles(*this, "tiles"),
m_colors(*this, "colors"),
m_ball_x(0x00),
m_ball_y(0x00),
m_color(0)
{}
DECLARE_READ8_MEMBER(vblank_r);
DECLARE_WRITE8_MEMBER(ball_x_w);
DECLARE_WRITE8_MEMBER(ball_y_w);
DECLARE_WRITE8_MEMBER(color_w);
DECLARE_WRITE8_MEMBER(audio_w);
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
virtual void machine_start();
private:
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
required_shared_ptr<UINT8> m_vram;
required_memory_region m_tiles;
required_memory_region m_colors;
static const int BALL_SIZE = 4;
static const rgb_t m_palette[];
UINT8 m_ball_x;
UINT8 m_ball_y;
int m_color;
};
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
static ADDRESS_MAP_START( mmagic_mem, AS_PROGRAM, 8, mmagic_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x13ff) AM_ROM
AM_RANGE(0x2000, 0x21ff) AM_RAM
AM_RANGE(0x3000, 0x31ff) AM_RAM AM_SHARE("vram")
AM_RANGE(0x8002, 0x8002) AM_WRITE(ball_x_w)
AM_RANGE(0x8003, 0x8003) AM_WRITE(ball_y_w)
AM_RANGE(0x8004, 0x8004) AM_READ(vblank_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( mmagic_io, AS_IO, 8, mmagic_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x80, 0x80) AM_WRITE(color_w)
AM_RANGE(0x81, 0x81) AM_WRITE(audio_w)
AM_RANGE(0x85, 0x85) AM_READ_PORT("paddle")
AM_RANGE(0x86, 0x86) AM_READ_PORT("buttons")
AM_RANGE(0x87, 0x87) AM_READ_PORT("dipswitch")
ADDRESS_MAP_END
//**************************************************************************
// INPUTS
//**************************************************************************
static INPUT_PORTS_START( mmagic )
PORT_START("dipswitch")
PORT_SERVICE_DIPLOC(0x01, IP_ACTIVE_LOW, "DSW:1")
PORT_DIPNAME(0x06, 0x06, DEF_STR(Bonus_Life)) PORT_DIPLOCATION ("DSW:2,3")
PORT_DIPSETTING(0x00, "30000")
PORT_DIPSETTING(0x02, "20000")
PORT_DIPSETTING(0x04, "15000")
PORT_DIPSETTING(0x06, "10000")
PORT_DIPNAME(0x18, 0x18, DEF_STR(Lives)) PORT_DIPLOCATION ("DSW:4,5")
PORT_DIPSETTING(0x00, "6")
PORT_DIPSETTING(0x08, "5")
PORT_DIPSETTING(0x10, "4")
PORT_DIPSETTING(0x18, "3")
PORT_DIPUNUSED_DIPLOC(0x20, IP_ACTIVE_LOW, "DSW:6" )
PORT_DIPUNUSED_DIPLOC(0x40, IP_ACTIVE_LOW, "DSW:7" )
PORT_DIPUNUSED_DIPLOC(0x80, IP_ACTIVE_LOW, "DSW:8" )
PORT_START("buttons")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_START1)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_START2)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_COIN1)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("paddle")
PORT_BIT(0xff, 0x80, IPT_PADDLE) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_CENTERDELTA(0)
INPUT_PORTS_END
//**************************************************************************
// VIDEO EMULATION
//**************************************************************************
READ8_MEMBER( mmagic_state::vblank_r )
{
UINT8 data = 0;
// bit 0 = vblank
data |= m_screen->vblank() << 0;
// other bits unused
data |= 0xfe;
return data;
}
WRITE8_MEMBER( mmagic_state::ball_x_w )
{
m_ball_x = data;
}
WRITE8_MEMBER( mmagic_state::ball_y_w )
{
m_ball_y = data;
}
WRITE8_MEMBER( mmagic_state::color_w )
{
// bit 3 is always set
// bit 6 switches the palette (actually there is only a single differently colored tile)
// other bits are always 0
m_color = data;
}
UINT32 mmagic_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
// draw playfield
for (int y = 0; y < 192 / 12; y++)
{
for (int x = 0; x < 256 / 8; x++)
{
UINT8 code = m_vram[(y * 32) + x];
// normal palette 00..7f, alternate palette 80..ff
UINT8 color = m_colors->base()[code | (BIT(m_color, 6) << 7)];
// draw one tile
for (int tx = 0; tx < 12; tx++)
{
UINT8 gfx = m_tiles->base()[(code << 4) + tx];
bitmap.pix32(y * 12 + tx, x * 8 + 0) = BIT(gfx, 4) ? rgb_t::black : m_palette[color];
bitmap.pix32(y * 12 + tx, x * 8 + 1) = BIT(gfx, 5) ? rgb_t::black : m_palette[color];
bitmap.pix32(y * 12 + tx, x * 8 + 2) = BIT(gfx, 6) ? rgb_t::black : m_palette[color];
bitmap.pix32(y * 12 + tx, x * 8 + 3) = BIT(gfx, 7) ? rgb_t::black : m_palette[color];
bitmap.pix32(y * 12 + tx, x * 8 + 4) = BIT(gfx, 0) ? rgb_t::black : m_palette[color];
bitmap.pix32(y * 12 + tx, x * 8 + 5) = BIT(gfx, 1) ? rgb_t::black : m_palette[color];
bitmap.pix32(y * 12 + tx, x * 8 + 6) = BIT(gfx, 2) ? rgb_t::black : m_palette[color];
bitmap.pix32(y * 12 + tx, x * 8 + 7) = BIT(gfx, 3) ? rgb_t::black : m_palette[color];
}
}
}
// draw ball
int ball_y = (m_ball_y >> 4) * 12 + (m_ball_y & 0x0f);
bitmap.plot_box(m_ball_x - BALL_SIZE, ball_y - BALL_SIZE, BALL_SIZE, BALL_SIZE, rgb_t::white);
return 0;
}
//**************************************************************************
// PALETTE
//**************************************************************************
const rgb_t mmagic_state::m_palette[] =
{
rgb_t::black,
rgb_t(0xff, 0x00, 0x00),
rgb_t(0x00, 0xff, 0x00),
rgb_t(0xff, 0xff, 0x00),
rgb_t(0x00, 0x00, 0xff),
rgb_t(0xff, 0x00, 0xff),
rgb_t(0x00, 0xff, 0xff),
rgb_t::white,
};
//**************************************************************************
// AUDIO EMULATION
//**************************************************************************
WRITE8_MEMBER( mmagic_state::audio_w )
{
if (LOG_AUDIO)
logerror("audio_w: %02x\n", data);
}
//**************************************************************************
// DRIVER INIT
//**************************************************************************
void mmagic_state::machine_start()
{
// register for save states
save_item(NAME(m_ball_x));
save_item(NAME(m_ball_y));
save_item(NAME(m_color));
}
//**************************************************************************
// MACHINE DEFINTIONS
//**************************************************************************
static MACHINE_CONFIG_START( mmagic, mmagic_state )
// basic machine hardware
MCFG_CPU_ADD("maincpu", I8085A, XTAL_6_144MHz) // NEC D8085A
MCFG_CPU_PROGRAM_MAP(mmagic_mem)
MCFG_CPU_IO_MAP(mmagic_io)
// video hardware
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_6_144MHz, 384, 0, 256, 264, 0, 192)
MCFG_SCREEN_UPDATE_DRIVER(mmagic_state, screen_update)
// sound hardware
// TODO: SN76477 + discrete sound
MACHINE_CONFIG_END
//**************************************************************************
// ROM DEFINITIONS
//**************************************************************************
ROM_START( mmagic )
ROM_REGION(0x1400, "maincpu", 0)
ROM_LOAD("1ai.2a", 0x0000, 0x0400, CRC(ec772e2e) SHA1(7efc1bbb24b2ed73c518aea1c4ef4b9a93034e31))
ROM_LOAD("2ai.3a", 0x0400, 0x0400, CRC(e5d482ca) SHA1(208b808e9208bb6f5f5f89ffbeb5a885be33733a))
ROM_LOAD("3ai.4a", 0x0800, 0x0400, CRC(e8d38deb) SHA1(d7384234fb47e4b1d0421f58571fa748662b05f5))
ROM_LOAD("4ai.45a", 0x0c00, 0x0400, CRC(3048bd6c) SHA1(740051589f6ba44b2ee68edf76a3177bb973d78e))
ROM_LOAD("5ai.5a", 0x1000, 0x0400, CRC(2cab8f04) SHA1(203a3c005f18f968cd14c972bbb9fd7e0fc3b670))
ROM_REGION(0x600, "tiles", 0)
ROM_LOAD("6h.6hi", 0x000, 0x200, CRC(b6321b6f) SHA1(06611f7419d2982e006a3e81b79677e59e194f38))
ROM_LOAD("7h.7hi", 0x200, 0x200, CRC(9ec0e82c) SHA1(29983f690a1b6134bb1983921f42c14898788095))
ROM_LOAD("6j.6jk", 0x400, 0x200, CRC(7ce83302) SHA1(1870610ff07ab11622e183e04e3fce29328ff291))
ROM_REGION(0x200, "colors", ROMREGION_INVERT)
ROM_LOAD("7j.7jk", 0x000, 0x200, CRC(b7eb8e1c) SHA1(b65a8efb88668dcf1c1d00e31a9b15a67c2972c8))
ROM_END
//**************************************************************************
// GAME DRIVERS
//**************************************************************************
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS
GAME( 1979, mmagic, 0, mmagic, mmagic, driver_device, 0, ROT270, "Nintendo", "Monkey Magic", GAME_SUPPORTS_SAVE | GAME_NO_SOUND )