mirror of
https://github.com/holub/mame
synced 2025-04-20 15:32:45 +03:00
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:
parent
25c99d9450
commit
08b49f7d48
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -13824,6 +13824,7 @@ cbully // (c) 1991 Falgas
|
||||
|
||||
@source:famibox.cpp
|
||||
famibox // 1986
|
||||
famistat // 1986
|
||||
|
||||
@source:fantland.cpp
|
||||
borntofi // (c) International Games?
|
||||
|
Loading…
Reference in New Issue
Block a user