call it harmony/melody, that more accurately represents what we're emulating, dpc+ seems to be a software implementation on the ARM of the Harmony (nw)

This commit is contained in:
David Haywood 2015-10-29 17:10:14 +00:00
parent 87b633a97c
commit 7793b9af43
7 changed files with 109 additions and 43 deletions

View File

@ -17955,14 +17955,14 @@ Info from Atariage and Atarimania
</part>
</software>
<!-- This was released by the author, also available via Atariage, are both versions the same? needs DPC+ emulation -->
<!-- This was released by the author, also available via Atariage, are both versions the same? needs HARMONY/MELODY emulation -->
<software name="stayfr2" supported="no">
<description>Stay Frosty 2 (NTSC)</description>
<year>2013</year>
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_20131217_RC8_NTSC.bin" size="0x8000" crc="4eb739ab" sha1="5eceaf8e90bd9a002f4935f082df7b25716dceb0" offset="0" />
</dataarea>
@ -17975,7 +17975,7 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_demo_NTSC.bin" size="0x8000" crc="fd850bd6" sha1="bd8166da7777c66e6bb3ab0c77563193d8289f5f" offset="0" />
</dataarea>
@ -17989,7 +17989,7 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_20131217_RC8_PAL.bin" size="0x8000" crc="7b495dc3" sha1="1625ef74b0a48c2968fad832ab8e2edc8187a53f" offset="0" />
</dataarea>
@ -18002,7 +18002,7 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="SF2_demo_PAL.bin" size="0x8000" crc="b47582f3" sha1="73625429e73f1b354e0cbe6a360d79590032de2b" offset="0" />
</dataarea>
@ -18015,7 +18015,7 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="spacerocks20121129_NTSC.bin" size="0x8000" crc="c5d8eb83" sha1="bf3af5c76bb4dded5cb9c9b232c369250ad20ac4" offset="0" />
</dataarea>
@ -18028,12 +18028,53 @@ Info from Atariage and Atarimania
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="PAL" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_dpcplus" />
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="spacerocks20121129_PAL.bin" size="0x8000" crc="133cb923" sha1="0511a35ee435227fbb5665e8488590eb993256f7" offset="0" />
</dataarea>
</part>
</software>
</software>
<software name="frantic" supported="no">
<description>Frantic (20140305, NTSC)</description>
<year>2014</year>
<publisher>Spiceware</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="frantic20140305.bin" size="0x8000" crc="04d0f558" sha1="ee2a004a50861c5fdfbdabfa5ed4bf825333ec43" offset="0" />
</dataarea>
</part>
</software>
<software name="harmbios" supported="no"> <!-- I think these are the bios roms if you're using it as a multi-game cart? -->
<description>Harmony Bios Updater</description>
<year>2014</year>
<publisher>Harmony</publisher>
<sharedfeat name="compatibility" value="NTSC" />
<part name="cart" interface="a2600_cart">
<feature name="slot" value="a26_harmony" />
<dataarea name="rom" size="0x8000">
<rom name="bios_updater_NTSC.cu" size="0x8000" crc="03153eb2" sha1="cd9ee1d820737b3887ebe5fc6fe96a2a043ab009" offset="0" />
</dataarea>
<dataarea name="bios" size="0x21400">
<rom name="hbios_106_NTSC_official_beta.bin" size="0x21400" crc="1e1d237b" sha1="8fd74e0119bce43a89bcc4998b750bc6884971da" offset="0" />
<rom name="hbios_106_NTSC_beta_2.bin" size="0x21400" crc="807b86bd" sha1="633960295c30e7430b3ce58f6244495f4b708e9d" offset="0" />
<rom name="hbios_106_NTSC.bin" size="0x21400" crc="48664301" sha1="aaa5e839f307734306c2a9ccbe38482579c70391" offset="0" />
<rom name="hbios_105_NTSC.bin" size="0x19400" crc="c0b8aae9" sha1="68b10153695da505756eb7dc7cc4a7e93fe68860" offset="0" />
<rom name="hbios_105_PAL50.bin" size="0x19400" crc="fb942c80" sha1="81bba9d9c245d23cc4b9503180ebe2d67bf1e117" offset="0" />
<rom name="hbios_105_PAL60.bin" size="0x19400" crc="b59ebe6d" sha1="873830286c66935fd23e3ea7c192e6573e056cbd" offset="0" />
<rom name="eeloader_104e_NTSC.bin" size="0x36f8" crc="ad04a8d9" sha1="c83d724299875cd5ea8d6be05db12d688ce8eff1" offset="0" />
<rom name="eeloader_104e_PAL50.bin" size="0x36f8" crc="4868ba51" sha1="e6a65523824ecf4f2a5145e2c5118cfb4bee059d" offset="0" />
<rom name="eeloader_104e_PAL60.bin" size="0x36f8" crc="58845532" sha1="255b5c9f4f2f7322c20d2619126cd150a1b8f71c" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -1161,8 +1161,8 @@ if (BUSES["VCS"]~=null) then
MAME_DIR .. "src/devices/bus/vcs/compumat.h",
MAME_DIR .. "src/devices/bus/vcs/dpc.c",
MAME_DIR .. "src/devices/bus/vcs/dpc.h",
MAME_DIR .. "src/devices/bus/vcs/dpcplus.c",
MAME_DIR .. "src/devices/bus/vcs/dpcplus.h",
MAME_DIR .. "src/devices/bus/vcs/harmony_melody.c",
MAME_DIR .. "src/devices/bus/vcs/harmony_melody.h",
MAME_DIR .. "src/devices/bus/vcs/scharger.c",
MAME_DIR .. "src/devices/bus/vcs/scharger.h",
}

View File

@ -2,11 +2,34 @@
// copyright-holders:David Haywood
/***************************************************************************
Atari 2600 cart with DPC+
Harmony / Melody cart for the A2600
the DPC+ adds an ARM CPU, including video improvements plus an extra synthesizer.
The Harmony cart is a 'modern' A2600 cartridge, used for homebrew etc. It has
an SD slot and can be connected to a PC, roms can be transfered to it with
software on the PC side. It uses an ARM7TDMI-S LPC2103 @ 70 Mhz to emulate
the mapper behavior of other cartridges. It has an SD card slot for storing
game data.
Some info on the DPC+ hardware can be found on Darrell Spice Jr's guides:
The Melody version of the cartridge has been used for several recent A2600
commercial releases as well as some reproductions due to it's ability to be
programmed as any other cartridge type. This lacks the SD slot?
The 'DPC+' games by SpiceWare run on a Harmony / Melody cart, DPC+ seems to
be a virtual 'software mapper' programmed on the ARM rather than a real mapper.
There is also a 'Harmony Encore' cartridge which adds support for some of the
games the original couldn't handle due to them having larger ROMs and more
complex banking schemes (Stella's Stocking etc.)
some Harmony cart details can be found at
http://atariage.com/forums/topic/156500-latest-harmony-cart-software/
DPC+ notes
----------
Some info on the Harmony / Melody when configured as DPC+ hardware can be found on Darrell Spice Jr's guides:
http://atariage.com/forums/blog/148/entry-11811-dpcarm-part-6-dpc-cartridge-layout/
http://atariage.com/forums/blog/148/entry-11883-dpcarm-part-7-6507arm-exchange-of-information/
http://atariage.com/forums/blog/148/entry-11903-dpcarm-part-8-multiple-functions/
@ -18,7 +41,7 @@ map:
Bankswitching uses addresses $FFF6-$FFFB
* ARM RAM mapped at $40000000 in this area
$0000-$0BFF: DPC+ driver (not accessible by 2600 itself) (copied to $40000000 - $40000bff on startup by ARM)
$0000-$0BFF: HARMONY/MELODY driver (not accessible by 2600 itself) (copied to $40000000 - $40000bff on startup by ARM)
$0C00-$1BFF: Bank 0 (each bank can map to 0x1000 - 0x1fff in 6507 space, like other carts)
$1C00-$2BFF: Bank 1
$2C00-$3BFF: Bank 2
@ -32,7 +55,7 @@ map:
#include "emu.h"
#include "dpcplus.h"
#include "harmony_melody.h"
@ -40,11 +63,11 @@ map:
// cart device
const device_type A26_ROM_DPCPLUS = &device_creator<a26_rom_dpcplus_device>;
const device_type A26_ROM_HARMONY = &device_creator<a26_rom_harmony_device>;
a26_rom_dpcplus_device::a26_rom_dpcplus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: a26_rom_f8_device(mconfig, A26_ROM_DPCPLUS, "Atari 2600 ROM Cart DPC+", tag, owner, clock, "a2600_dpcplus", __FILE__)
a26_rom_harmony_device::a26_rom_harmony_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: a26_rom_f8_device(mconfig, A26_ROM_HARMONY, "Atari 2600 ROM Cart HARMONY/MELODY", tag, owner, clock, "a2600_harmony", __FILE__)
{
}
@ -52,24 +75,24 @@ a26_rom_dpcplus_device::a26_rom_dpcplus_device(const machine_config &mconfig, co
// mapper specific start/reset
//-------------------------------------------------
void a26_rom_dpcplus_device::device_start()
void a26_rom_harmony_device::device_start()
{
save_item(NAME(m_base_bank));
}
void a26_rom_dpcplus_device::device_reset()
void a26_rom_harmony_device::device_reset()
{
m_base_bank = 5;
}
READ8_MEMBER(a26_rom_dpcplus_device::read8_r)
READ8_MEMBER(a26_rom_harmony_device::read8_r)
{
return m_rom[offset + (m_base_bank * 0x1000)];
}
READ32_MEMBER(a26_rom_dpcplus_device::armrom_r)
READ32_MEMBER(a26_rom_harmony_device::armrom_r)
{
UINT32 ret = (m_rom[offset * 4 + 3] << 24) |
(m_rom[offset * 4 + 2] << 16) |
@ -78,17 +101,17 @@ READ32_MEMBER(a26_rom_dpcplus_device::armrom_r)
return ret;
}
WRITE32_MEMBER(a26_rom_dpcplus_device::armrom_w)
WRITE32_MEMBER(a26_rom_harmony_device::armrom_w)
{
}
READ32_MEMBER(a26_rom_dpcplus_device::arm_E01FC088_r)
READ32_MEMBER(a26_rom_harmony_device::arm_E01FC088_r)
{
return 0xffffffff;
}
static ADDRESS_MAP_START( dpcplus_arm7_map, AS_PROGRAM, 32, a26_rom_dpcplus_device )
static ADDRESS_MAP_START( harmony_arm7_map, AS_PROGRAM, 32, a26_rom_harmony_device )
// todo: implement all this correctly
AM_RANGE(0x00000000, 0x00007fff) AM_READWRITE(armrom_r,armrom_w) // flash, 32k
AM_RANGE(0x40000000, 0x40001fff) AM_RAM // sram, 8k
@ -96,17 +119,19 @@ static ADDRESS_MAP_START( dpcplus_arm7_map, AS_PROGRAM, 32, a26_rom_dpcplus_devi
AM_RANGE(0xE01FC088, 0xE01FC08b) AM_READ(arm_E01FC088_r)
ADDRESS_MAP_END
static MACHINE_CONFIG_FRAGMENT( a26_dpcplus )
static MACHINE_CONFIG_FRAGMENT( a26_harmony )
MCFG_CPU_ADD("arm", ARM7, 70000000)
MCFG_CPU_PROGRAM_MAP(dpcplus_arm7_map)
MCFG_CPU_PROGRAM_MAP(harmony_arm7_map)
MACHINE_CONFIG_END
machine_config_constructor a26_rom_dpcplus_device::device_mconfig_additions() const
machine_config_constructor a26_rom_harmony_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( a26_dpcplus );
return MACHINE_CONFIG_NAME( a26_harmony );
}
void a26_rom_dpcplus_device::check_bankswitch(offs_t offset)
// actually if the ARM code is doing this and providing every opcode to the main CPU based
// on bus activity then we shouldn't be doing this here.
void a26_rom_harmony_device::check_bankswitch(offs_t offset)
{
switch (offset)
{
@ -120,7 +145,7 @@ void a26_rom_dpcplus_device::check_bankswitch(offs_t offset)
}
}
READ8_MEMBER(a26_rom_dpcplus_device::read_rom)
READ8_MEMBER(a26_rom_harmony_device::read_rom)
{
UINT8 retvalue = read8_r(space, offset + 0xc00); // banks start at 0xc00
@ -129,7 +154,7 @@ READ8_MEMBER(a26_rom_dpcplus_device::read_rom)
return retvalue;
}
WRITE8_MEMBER(a26_rom_dpcplus_device::write_bank)
WRITE8_MEMBER(a26_rom_harmony_device::write_bank)
{
check_bankswitch(offset);
// a26_rom_f8_device::write_bank(space, offset, data);

View File

@ -1,19 +1,19 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
#ifndef __VCS_DPCPLUS_H
#define __VCS_DPCPLUS_H
#ifndef __VCS_HARMONY_H
#define __VCS_HARMONY_H
#include "rom.h"
#include "cpu/arm7/arm7.h"
// ======================> a26_rom_dpcplus_device
// ======================> a26_rom_harmony_device
class a26_rom_dpcplus_device : public a26_rom_f8_device
class a26_rom_harmony_device : public a26_rom_f8_device
{
public:
// construction/destruction
a26_rom_dpcplus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
a26_rom_harmony_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device-level overrides
virtual void device_start();
@ -38,6 +38,6 @@ protected:
// device type definition
extern const device_type A26_ROM_DPCPLUS;
extern const device_type A26_ROM_HARMONY;
#endif

View File

@ -157,7 +157,7 @@ static const vcs_slot slot_list[] =
{ A26_8IN1, "a26_8in1" },
{ A26_32IN1, "a26_32in1" },
{ A26_X07, "a26_x07" },
{ A26_DPCPLUS, "a26_dpcplus" },
{ A26_HARMONY, "a26_harmony" },
};
static int vcs_get_pcb_id(const char *slot)

View File

@ -36,7 +36,7 @@ enum
A26_SS,
A26_CM,
A26_X07,
A26_DPCPLUS,
A26_HARMONY,
};

View File

@ -18,7 +18,7 @@ TODO:
#include "bus/vcs/vcs_slot.h"
#include "bus/vcs/rom.h"
#include "bus/vcs/dpc.h"
#include "bus/vcs/dpcplus.h"
#include "bus/vcs/harmony_melody.h"
#include "bus/vcs/scharger.h"
#include "bus/vcs/compumat.h"
#include "bus/vcs_ctrl/ctrl.h"
@ -391,7 +391,7 @@ MACHINE_START_MEMBER(a2600_state,a2600)
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x0fff, read8_delegate(FUNC(a2600_state::cart_over_all_r), this), write8_delegate(FUNC(a2600_state::cart_over_all_w), this));
break;
case A26_DPCPLUS:
case A26_HARMONY:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
}
@ -528,7 +528,7 @@ static SLOT_INTERFACE_START(a2600_cart)
SLOT_INTERFACE_INTERNAL("a26_8in1", A26_ROM_8IN1)
SLOT_INTERFACE_INTERNAL("a26_32in1", A26_ROM_32IN1)
SLOT_INTERFACE_INTERNAL("a26_x07", A26_ROM_X07)
SLOT_INTERFACE_INTERNAL("a26_dpcplus", A26_ROM_DPCPLUS)
SLOT_INTERFACE_INTERNAL("a26_harmony", A26_ROM_HARMONY)
SLOT_INTERFACE_END
static MACHINE_CONFIG_FRAGMENT(a2600_cartslot)