famibox.cpp: Various improvements and a new working clone. (#9299)

* famibox.cpp: Added NES controller slots.
- Added r/w of zapper enable bit through appropriate ports. Controllers and zapper now pass the internal self-test.
- Shrunk nametable RAM down to correct 2K (mirroring still not correctly implemented).

* New working clones
------------------
FamicomStation [Patnukem]
This commit is contained in:
0kmg 2022-02-15 04:32:25 -09:00 committed by GitHub
parent 25c99d9450
commit 08b49f7d48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 179 additions and 146 deletions

View File

@ -234,3 +234,14 @@ void fc_expansion_devices(device_slot_interface &device)
device.option_add("taptapmat", NES_TAPTAPMAT);
device.option_add("turbofile", NES_TURBOFILE);
}
void famibox_control_port12_devices(device_slot_interface &device)
{
device.option_add("joypad", NES_JOYPAD);
device.option_add("zapper", NES_ZAPPER);
}
void famibox_control_port3_devices(device_slot_interface &device)
{
device.option_add("zapper", NES_ZAPPER);
}

View File

@ -97,6 +97,8 @@ void nes_control_port2_devices(device_slot_interface &device);
void fc_control_port1_devices(device_slot_interface &device);
void fc_control_port2_devices(device_slot_interface &device);
void fc_expansion_devices(device_slot_interface &device);
void famibox_control_port12_devices(device_slot_interface &device);
void famibox_control_port3_devices(device_slot_interface &device);
#endif // MAME_BUS_NES_CTRL_CTRL_H

View File

@ -20,10 +20,15 @@ case style and cartridge/case color: (FamicomBox = Black, FamicomStation = Gray
Specific Hardware information
-----------------------------
The unit had 3 controllers - 2 standard NES controllers and a NES Zapper light
gun. The cartridges are shaped and appear to be identical to NES 72-pin
cartridges. Unfortunately, it was made to play only the games specifically
released for it. Why?
The unit had 3 NES controller ports - the first 2 identical to the standard NES.
The third, intended to be used with a NES Zapper light gun, has pin 4 (D0) disconnected
(meaning it can't be used with a regular joypad) and shares its D3 and D4 lines with
port 2 (meaning it will appear like a conventional zapper in port 2). What is normally
GND (pin 1) of port 3 is controllable, in order to enable/disable the zapper.
Cartridges are shaped and appear to be similar to NES 72-pin cartridges. They have their
own unique PCBs, use EPROMS, and often (always?) contain the same data as an existing
NES/FC cart. It was made to play only the games specifically released for it.
- The FamicomBox will not run mmc3 games and many other advanced mappers
- There a special lockout chip, but the lockout chip connects to different pins on
@ -55,13 +60,13 @@ Notes/ToDo:
- coin insertion sound is not emulated
- coin beep (before time out) is not emulated
- screen modulation (before time out) is not emulated
- zapper is not emulated
- self test fails on controller and zapper test
- nametable mirroring is incorrectly hardcoded (cart PCBs have H/V solder pads like their NES counterparts)
***************************************************************************/
#include "emu.h"
#include "video/ppu2c0x.h"
#include "cpu/m6502/n2a03.h"
#include "bus/nes_ctrl/ctrl.h"
#include "debugger.h"
#include "screen.h"
#include "speaker.h"
@ -73,12 +78,17 @@ class famibox_state : public driver_device
{
public:
famibox_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ppu(*this, "ppu") { }
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_ppu(*this, "ppu")
, m_screen(*this, "screen")
, m_ctrl(*this, "ctrl%u", 1) { }
void famibox(machine_config &config);
void init_famibox();
void init_famistat();
DECLARE_READ_LINE_MEMBER(coin_r);
DECLARE_INPUT_CHANGED_MEMBER(famibox_keyswitch_changed);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
@ -90,32 +100,32 @@ protected:
private:
required_device<n2a03_device> m_maincpu;
required_device<ppu2c0x_device> m_ppu;
required_device<screen_device> m_screen;
optional_device_array<nes_control_port_device, 3> m_ctrl;
std::unique_ptr<uint8_t[]> m_nt_ram;
uint8_t* m_nt_page[4];
uint32_t m_in_0;
uint32_t m_in_1;
uint32_t m_in_0_shift;
uint32_t m_in_1_shift;
uint8_t m_mirroring;
uint8_t m_exception_mask;
uint8_t m_exception_cause;
emu_timer* m_attract_timer;
emu_timer* m_attract_timer;
uint8_t m_attract_timer_period;
uint32_t m_coins;
uint8_t m_zapper_enable;
emu_timer* m_gameplay_timer;
emu_timer* m_gameplay_timer;
uint8_t m_money_reg;
void famibox_nt_w(offs_t offset, uint8_t data);
uint8_t famibox_nt_r(offs_t offset);
void set_mirroring(int mirroring);
void sprite_dma_w(address_space &space, uint8_t data);
uint8_t famibox_IN0_r();
void famibox_IN0_w(uint8_t data);
uint8_t famibox_IN1_r();
void famibox_IN0_w(uint8_t data);
uint8_t famibox_system_r(offs_t offset);
void famibox_system_w(offs_t offset, uint8_t data);
TIMER_CALLBACK_MEMBER(famicombox_attract_timer_callback);
@ -132,50 +142,41 @@ private:
*******************************************************/
#if 0
void famibox_state::set_mirroring(int mirroring)
{
switch(mirroring)
{
case PPU_MIRROR_LOW:
m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram;
break;
case PPU_MIRROR_HIGH:
m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram + 0x400;
break;
case PPU_MIRROR_HORZ:
m_nt_page[0] = m_nt_ram;
m_nt_page[1] = m_nt_ram;
m_nt_page[2] = m_nt_ram + 0x400;
m_nt_page[3] = m_nt_ram + 0x400;
break;
case PPU_MIRROR_VERT:
m_nt_page[0] = m_nt_ram;
m_nt_page[1] = m_nt_ram + 0x400;
m_nt_page[2] = m_nt_ram;
m_nt_page[3] = m_nt_ram + 0x400;
break;
case PPU_MIRROR_NONE:
default:
m_nt_page[0] = m_nt_ram;
m_nt_page[1] = m_nt_ram + 0x400;
m_nt_page[2] = m_nt_ram + 0x800;
m_nt_page[3] = m_nt_ram + 0xc00;
break;
case PPU_MIRROR_LOW:
m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram.get();
break;
case PPU_MIRROR_HIGH:
m_nt_page[0] = m_nt_page[1] = m_nt_page[2] = m_nt_page[3] = m_nt_ram.get() + 0x400;
break;
case PPU_MIRROR_HORZ:
m_nt_page[0] = m_nt_ram.get();
m_nt_page[1] = m_nt_ram.get();
m_nt_page[2] = m_nt_ram.get() + 0x400;
m_nt_page[3] = m_nt_ram.get() + 0x400;
break;
case PPU_MIRROR_VERT:
m_nt_page[0] = m_nt_ram.get();
m_nt_page[1] = m_nt_ram.get() + 0x400;
m_nt_page[2] = m_nt_ram.get();
m_nt_page[3] = m_nt_ram.get() + 0x400;
break;
}
}
#endif
void famibox_state::famibox_nt_w(offs_t offset, uint8_t data)
{
int page = ((offset & 0xc00) >> 10);
int page = (offset & 0xc00) >> 10;
m_nt_page[page][offset & 0x3ff] = data;
}
uint8_t famibox_state::famibox_nt_r(offs_t offset)
{
int page = ((offset & 0xc00) >> 10);
int page = (offset & 0xc00) >> 10;
return m_nt_page[page][offset & 0x3ff];
}
@ -202,26 +203,31 @@ void famibox_state::sprite_dma_w(address_space &space, uint8_t data)
uint8_t famibox_state::famibox_IN0_r()
{
return ((m_in_0 >> m_in_0_shift++) & 0x01) | 0x40;
}
void famibox_state::famibox_IN0_w(uint8_t data)
{
if (data & 0x01)
{
return;
}
m_in_0_shift = 0;
m_in_1_shift = 0;
m_in_0 = ioport("P1")->read();
m_in_1 = ioport("P2")->read();
uint8_t ret = 0x40;
ret |= m_ctrl[0]->read_bit0();
ret |= m_ctrl[0]->read_bit34();
return ret;
}
uint8_t famibox_state::famibox_IN1_r()
{
return ((m_in_1 >> m_in_1_shift++) & 0x01) | 0x40;
uint8_t ret = 0x40;
ret |= m_ctrl[1]->read_bit0();
ret |= m_ctrl[1]->read_bit34();
// only read port 3 if its pin 1 (normally GND) is held low
if (m_zapper_enable)
// 3rd port is intended for a zapper and its D0 pin is NOT connected
ret |= m_ctrl[2]->read_bit34();
return ret;
}
void famibox_state::famibox_IN0_w(uint8_t data)
{
for (int i = 0; i < 3; i++)
m_ctrl[i]->write(data);
}
/******************************************************
@ -308,7 +314,7 @@ uint8_t famibox_state::famibox_system_r(offs_t offset)
{
switch( offset & 0x07 )
{
case 0: /* device which caused exception */
case 0: // device which caused exception
{
uint8_t ret = m_exception_cause;
m_exception_cause = 0xff;
@ -319,7 +325,8 @@ uint8_t famibox_state::famibox_system_r(offs_t offset)
case 3:
return ioport("KEYSWITCH")->read();
case 7:
return 0x02;
// this assumes zapper is connected? should be high if and only if zapper is connected and disabled?
return 0x02 | (m_zapper_enable ^ 0x04);
default:
logerror("%s: Unhandled famibox_system_r(%x)\n", machine().describe_context(), offset );
return 0;
@ -367,6 +374,10 @@ void famibox_state::famibox_system_w(offs_t offset, uint8_t data)
logerror("%s: bankswitch %x\n", machine().describe_context(), data );
famicombox_bankswitch(data & 0x3f);
break;
case 5:
logerror("%s: misc control register: %02x\n", machine().describe_context(), data);
m_zapper_enable = data & 0x04;
break;
default:
logerror("%s: Unhandled famibox_system_w(%x,%02x)\n", machine().describe_context(), offset, data );
}
@ -384,8 +395,8 @@ void famibox_state::famibox_map(address_map &map)
map(0x0000, 0x1fff).ram();
map(0x2000, 0x3fff).rw(m_ppu, FUNC(ppu2c0x_device::read), FUNC(ppu2c0x_device::write));
map(0x4014, 0x4014).w(FUNC(famibox_state::sprite_dma_w));
map(0x4016, 0x4016).rw(FUNC(famibox_state::famibox_IN0_r), FUNC(famibox_state::famibox_IN0_w)); /* IN0 - input port 1 */
map(0x4017, 0x4017).r(FUNC(famibox_state::famibox_IN1_r)); /* IN1 - input port 2 / PSG second control register */
map(0x4016, 0x4016).rw(FUNC(famibox_state::famibox_IN0_r), FUNC(famibox_state::famibox_IN0_w)); // IN0 - input port 1
map(0x4017, 0x4017).r(FUNC(famibox_state::famibox_IN1_r)); // IN1 - input port 2 / PSG second control register
map(0x5000, 0x5fff).rw(FUNC(famibox_state::famibox_system_r), FUNC(famibox_state::famibox_system_w));
map(0x6000, 0x7fff).ram();
map(0x8000, 0xbfff).bankr("cpubank1");
@ -438,26 +449,6 @@ READ_LINE_MEMBER(famibox_state::coin_r)
}
static INPUT_PORTS_START( famibox )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) /* Select */
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) /* Select */
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
PORT_START("DSW")
PORT_DIPNAME( 0x01, 0x00, "Self Test" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
@ -469,33 +460,31 @@ static INPUT_PORTS_START( famibox )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "Famicombox menu time" )
PORT_DIPSETTING( 0x00, "7 sec" )
PORT_DIPSETTING( 0x08, "12 sec" )
PORT_DIPSETTING( 0x00, "5 sec" )
PORT_DIPSETTING( 0x08, "10 sec" )
PORT_DIPNAME( 0x30, 0x00, "Attract time" )
PORT_DIPSETTING( 0x00, "12 sec" )
PORT_DIPSETTING( 0x10, "23 sec" )
PORT_DIPSETTING( 0x20, "17 sec" )
PORT_DIPSETTING( 0x30, "7 sec" )
PORT_DIPSETTING( 0x30, "5 sec" )
PORT_DIPSETTING( 0x00, "10 sec" )
PORT_DIPSETTING( 0x10, "15 sec" )
PORT_DIPSETTING( 0x20, "20 sec" )
PORT_DIPNAME( 0xc0, 0x80, "Operational mode" )
PORT_DIPSETTING( 0x00, "KEY MODE" )
PORT_DIPSETTING( 0x40, "CATV MODE" )
PORT_DIPSETTING( 0x80, "COIN MODE" )
PORT_DIPSETTING( 0xc0, "FREEPLAY" )
PORT_START("KEYSWITCH")
PORT_DIPNAME( 0x3f, 0x01, "Key switch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, famibox_state,famibox_keyswitch_changed, 0)
PORT_DIPSETTING( 0x01, "Key position 1" )
PORT_DIPSETTING( 0x02, "Key position 2" )
PORT_DIPSETTING( 0x04, "Key position 3" )
PORT_DIPSETTING( 0x08, "Key position 4" )
PORT_DIPSETTING( 0x10, "Key position 5" )
PORT_DIPSETTING( 0x20, "Key position 6" )
PORT_DIPNAME( 0x3f, 0x01, "Key switch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, famibox_state, famibox_keyswitch_changed, 0)
PORT_DIPSETTING( 0x20, "Game Count" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPSETTING( 0x04, DEF_STR( Free_Play ) )
PORT_DIPSETTING( 0x08, "Self Test" )
PORT_DIPSETTING( 0x10, DEF_STR( Unused ) )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(famibox_state, coin_r)
PORT_START("COIN")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, famibox_state,coin_inserted, 0)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, famibox_state, coin_inserted, 0)
INPUT_PORTS_END
/******************************************************
@ -511,11 +500,8 @@ void famibox_state::machine_reset()
void famibox_state::machine_start()
{
m_nt_ram = std::make_unique<uint8_t[]>(0x1000);
m_nt_page[0] = m_nt_ram.get();
m_nt_page[1] = m_nt_ram.get() + 0x400;
m_nt_page[2] = m_nt_ram.get() + 0x800;
m_nt_page[3] = m_nt_ram.get() + 0xc00;
m_nt_ram = std::make_unique<uint8_t[]>(0x800);
set_mirroring(m_mirroring);
famicombox_bankswitch(0);
@ -526,70 +512,103 @@ void famibox_state::machine_start()
m_attract_timer_period = 0;
m_money_reg = 0;
m_coins = 0;
m_zapper_enable = 0;
}
void famibox_state::famibox(machine_config &config)
{
/* basic machine hardware */
// basic machine hardware
N2A03(config, m_maincpu, NTSC_APU_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &famibox_state::famibox_map);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_size(32*8, 262);
screen.set_visarea(0*8, 32*8-1, 0*8, 30*8-1);
screen.set_screen_update("ppu", FUNC(ppu2c0x_device::screen_update));
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60.0988);
m_screen->set_size(32*8, 262);
m_screen->set_visarea(0*8, 32*8-1, 0*8, 30*8-1);
m_screen->set_screen_update("ppu", FUNC(ppu2c0x_device::screen_update));
PPU_2C02(config, m_ppu);
m_ppu->set_addrmap(0, &famibox_state::famibox_ppu_map);
m_ppu->set_cpu_tag(m_maincpu);
m_ppu->int_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
m_maincpu->add_route(ALL_OUTPUTS, "mono", 0.50);
NES_CONTROL_PORT(config, m_ctrl[0], famibox_control_port12_devices, "joypad");
NES_CONTROL_PORT(config, m_ctrl[1], famibox_control_port12_devices, "joypad");
NES_CONTROL_PORT(config, m_ctrl[2], famibox_control_port3_devices, "zapper");
for (int i = 0; i < 3; i++)
m_ctrl[i]->set_screen_tag(m_screen);
}
void famibox_state::init_famibox()
{
m_mirroring = PPU_MIRROR_HORZ;
}
void famibox_state::init_famistat()
{
m_mirroring = PPU_MIRROR_VERT;
}
#define GAME_LIST \
ROM_REGION(0x6000, "donkeykong", 0) \
ROM_LOAD("0.prg", 0x0000, 0x4000, CRC(06d1a012) SHA1(a6f92ae0a991c532e6377db2b3ab7f5c13d27675) ) \
ROM_LOAD("0.chr", 0x4000, 0x2000, CRC(a21d7c2e) SHA1(97c16cd6b1f3656428b682a23e6e4248c1ca3607) ) \
\
ROM_REGION(0x6000, "donkeykongjr", 0) \
ROM_LOAD("hvc-jr-1 prg", 0x0000, 0x4000, CRC(cf6c88b6) SHA1(cefc276e7601d14c6a20e545f334281b7a9fe8db) ) \
ROM_LOAD("hvc-jr-0 chr", 0x4000, 0x2000, CRC(852778ab) SHA1(307f2245cce164491012f75897eb984af0c3f456) ) \
\
ROM_REGION(0x6000, "popeye", 0) \
ROM_LOAD("hvc-pp-1 prg", 0x0000, 0x4000, CRC(0fa63a45) SHA1(50c594a6d8dcbeee2d83bca8c54c42cf57093aba) ) \
ROM_LOAD("hvc-pp-0 chr", 0x4000, 0x2000, CRC(a5fd8d98) SHA1(09d229404babb6c89b417ac541bab80fb06d2ba9) ) \
\
ROM_REGION(0x6000, "eigoasobi", 0) \
ROM_LOAD("hvc-en-0 prg", 0x0000, 0x4000, CRC(2dbfa36a) SHA1(0f4301d78d3dfa163239e7b7b7c4dff8a7e21bac) ) \
ROM_LOAD("hvc-en-0 chr", 0x4000, 0x2000, CRC(fccc0f36) SHA1(3566709c3c74960ce2ee1e60a85d026e70d7fd2c) ) \
\
ROM_REGION(0x6000, "mahjong", 0) \
ROM_LOAD("mahjong.prg", 0x0000, 0x4000, CRC(f86d8d8a) SHA1(2904137a030ae2370a8cd3e068078a1d59a4f229) ) \
ROM_LOAD("mahjong.chr", 0x4000, 0x2000, CRC(6bb45576) SHA1(5974787496dfa27a4b7fe6023473fae930ea41dc) ) \
\
ROM_REGION(0x6000, "gomokunarabe", 0) \
ROM_LOAD("hvc-go-0 prg", 0x0000, 0x4000, CRC(5603f579) SHA1(f2b007e3b13a777f9f88ff58f87ead6ae8f26327) ) \
ROM_LOAD("hvc-go-0 chr", 0x4000, 0x2000, CRC(97ea7144) SHA1(47d354c654285275d0a9420cc6eb3564f0453eb0) ) \
\
ROM_REGION(0x6000, "baseball", 0) \
ROM_LOAD("hvc-ba-0 prg", 0x0000, 0x4000, CRC(d18a3dde) SHA1(91f7d3e4c9d18c1969ca1fffdc811b763508a0a2) ) \
ROM_LOAD("hvc-ba-0 chr", 0x4000, 0x2000, CRC(c27eef20) SHA1(d5bd643b3ba98846e520b4d3f38aae45a29cf250) )
ROM_START(famibox)
ROM_REGION(0xa000, "menu", 0)
ROM_LOAD("sss_menu.prg", 0x0000, 0x8000, CRC(da1eb8d2) SHA1(943e3b0edfbf9bd3ee87dc5f298621b9ddc98db8))
ROM_LOAD("sss_menu.chr", 0x8000, 0x2000, CRC(a43d4435) SHA1(ee56b4d2110aff394bf2c8cd3414ca175ace01bd))
ROM_LOAD("sss-m prg v-3", 0x0000, 0x8000, CRC(da1eb8d2) SHA1(943e3b0edfbf9bd3ee87dc5f298621b9ddc98db8))
ROM_LOAD("sss-m chr v-1", 0x8000, 0x2000, CRC(a43d4435) SHA1(ee56b4d2110aff394bf2c8cd3414ca175ace01bd))
ROM_REGION(0x6000, "donkeykong", 0)
ROM_LOAD("0.prg", 0x0000, 0x4000, CRC(06d1a012) SHA1(a6f92ae0a991c532e6377db2b3ab7f5c13d27675) )
ROM_LOAD("0.chr", 0x4000, 0x2000, CRC(a21d7c2e) SHA1(97c16cd6b1f3656428b682a23e6e4248c1ca3607) )
ROM_REGION(0x6000, "donkeykongjr", 0)
ROM_LOAD("hvc-jr-1 prg", 0x0000, 0x4000, CRC(cf6c88b6) SHA1(cefc276e7601d14c6a20e545f334281b7a9fe8db) )
ROM_LOAD("hvc-jr-0 chr", 0x4000, 0x2000, CRC(852778ab) SHA1(307f2245cce164491012f75897eb984af0c3f456) )
ROM_REGION(0x6000, "popeye", 0)
ROM_LOAD("hvc-pp-1 prg", 0x0000, 0x4000, CRC(0fa63a45) SHA1(50c594a6d8dcbeee2d83bca8c54c42cf57093aba) )
ROM_LOAD("hvc-pp-0 chr", 0x4000, 0x2000, CRC(a5fd8d98) SHA1(09d229404babb6c89b417ac541bab80fb06d2ba9) )
ROM_REGION(0x6000, "eigoasobi", 0)
ROM_LOAD("hvc-en-0 prg", 0x0000, 0x4000, CRC(2dbfa36a) SHA1(0f4301d78d3dfa163239e7b7b7c4dff8a7e21bac) )
ROM_LOAD("hvc-en-0 chr", 0x4000, 0x2000, CRC(fccc0f36) SHA1(3566709c3c74960ce2ee1e60a85d026e70d7fd2c) )
ROM_REGION(0x6000, "mahjong", 0)
ROM_LOAD("mahjong.prg", 0x0000, 0x4000, CRC(f86d8d8a) SHA1(2904137a030ae2370a8cd3e068078a1d59a4f229) )
ROM_LOAD("mahjong.chr", 0x4000, 0x2000, CRC(6bb45576) SHA1(5974787496dfa27a4b7fe6023473fae930ea41dc) )
ROM_REGION(0x6000, "gomokunarabe", 0)
ROM_LOAD("hvc-go-0 prg", 0x0000, 0x4000, CRC(5603f579) SHA1(f2b007e3b13a777f9f88ff58f87ead6ae8f26327) )
ROM_LOAD("hvc-go-0 chr", 0x4000, 0x2000, CRC(97ea7144) SHA1(47d354c654285275d0a9420cc6eb3564f0453eb0) )
ROM_REGION(0x6000, "baseball", 0)
ROM_LOAD("hvc-ba-0 prg", 0x0000, 0x4000, CRC(d18a3dde) SHA1(91f7d3e4c9d18c1969ca1fffdc811b763508a0a2) )
ROM_LOAD("hvc-ba-0 chr", 0x4000, 0x2000, CRC(c27eef20) SHA1(d5bd643b3ba98846e520b4d3f38aae45a29cf250) )
GAME_LIST
ROM_REGION(0x6000, "empty", ROMREGION_ERASEFF)
ROM_END
ROM_START(famistat)
ROM_REGION(0xa000, "menu", 0)
// These should be verified. Dumps come from a board believed to have been damaged by overvoltage.
// In particular PRG has had zeroed bytes at $0000 and $0005 replaced with bytes from the Famicombox
// menu's PRG. Code at this location uses the attract mode DSW which was not looping between game
// and Sharp logo screen. Hardware footage confirms it should work. Furthermore, correcting these
// bytes makes the Self Check PRG checksum pass, further evidence this is correct.
ROM_LOAD("sss-m prg", 0x0000, 0x8000, BAD_DUMP CRC(c637d2fd) SHA1(1acb6a7afb1674fa77a6ebadb21b0a8aa9249001))
ROM_LOAD("sss-m chr", 0x8000, 0x2000, CRC(85561c8a) SHA1(35ab7e72512831a2f4cfaa689551fe7b5fa6d673))
GAME_LIST
ROM_REGION(0x6000, "empty", ROMREGION_ERASEFF)
ROM_END
} // Anonymous namespace
GAME( 1986, famibox, 0, famibox, famibox, famibox_state, empty_init, ROT0, "Nintendo", "FamicomBox", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND)
GAME( 1986, famibox, 0, famibox, famibox, famibox_state, init_famibox, ROT0, "Nintendo", "FamicomBox", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND)
GAME( 1986, famistat, famibox, famibox, famibox, famibox_state, init_famistat, ROT0, "Nintendo", "FamicomStation", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND)

View File

@ -13824,6 +13824,7 @@ cbully // (c) 1991 Falgas
@source:famibox.cpp
famibox // 1986
famistat // 1986
@source:fantland.cpp
borntofi // (c) International Games?