summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/hapyfish.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/hapyfish.cpp')
-rw-r--r--src/mame/drivers/hapyfish.cpp618
1 files changed, 0 insertions, 618 deletions
diff --git a/src/mame/drivers/hapyfish.cpp b/src/mame/drivers/hapyfish.cpp
deleted file mode 100644
index c4f5683523f..00000000000
--- a/src/mame/drivers/hapyfish.cpp
+++ /dev/null
@@ -1,618 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Tim Schuerewegen, R. Belmont, David Haywood
-/*******************************************************************************
-
- Happy Fish 2 302-in-1
-
- Skeleton driver adapted from mini2440.cpp
-
- TODO: Linux kernel + initrd loads now but not much happens afterwards.
-
- To see bootloader messages, uncomment the UART_PRINTF define in s3c24xx.hxx.
-
- The primary blocker at this point is a lack of a viable workaround for the
- FameG FS8806 I2C/SPI authentication key chip.
-
- The FS8806 provides 96 bytes of on-board EEPROM as well as a 24-byte key,
- with which it can perform either hashing or Triple DES. The expected
- response bytes are not yet known, and the key-check routine is hundreds
- of instructions' worth of assorted bitwise operations.
-
- To work around the FS8806 initialization and initial challenge/response
- tests, run MAME with its debugger enabled, and do the following:
-
- 1. bp C002D788 [Enter]
- 2. bp C002D84C [Enter]
- 3. Close the debugger window.
- 4. The debugger will reappear when the first breakpoint is hit.
- 5a. R0=1 [Enter]
- 5b. This will force the FS8806 init function to report success.
- 6. Close the debugger window.
- 7. The debugger will reappear when the second breakpoint is hit.
- 8a. R4=1 [Enter]
- 8b. This will force the first challenge/response test to report success.
-
- The system will begin its startup sequence, displaying a red fish logo.
-
- After some time checking the filesystem, it will then boot into the main
- menu. Currently, inputs are not hooked up.
-
- It will then watchdog at around 52 seconds remaining on the timer, for
- reasons not yet known, though the following kernel messages might provide
- a clue:
-
- <3>dma2: IRQ with no loaded buffer?
- <3>dma2: IRQ with no loaded buffer?
- <0>Restarting system.
- .
- arch_reset: attempting watchdog reset
-
-*******************************************************************************/
-
-#include "emu.h"
-#include "cpu/arm7/arm7.h"
-#include "machine/s3c2440.h"
-#include "machine/smartmed.h"
-#include "sound/dac.h"
-#include "sound/volt_reg.h"
-#include "screen.h"
-#include "speaker.h"
-
-#include <algorithm>
-
-#define LOG_GPIO (1 << 0)
-#define LOG_ADC (1 << 1)
-#define LOG_I2C (1 << 2)
-#define LOG_INPUTS (1 << 3)
-
-#define VERBOSE (LOG_GPIO | LOG_ADC | LOG_I2C | LOG_INPUTS)
-#include "logmacro.h"
-
-class hapyfish_state : public driver_device
-{
-public:
- hapyfish_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_s3c2440(*this, "s3c2440"),
- m_nand(*this, "nand"),
- m_nand2(*this, "nand2"),
- m_ldac(*this, "ldac"),
- m_rdac(*this, "rdac"),
- m_inputs(*this, "INPUT%u", 0U)
- { }
-
- void hapyfish(machine_config &config);
-
- void init_mini2440();
-
-private:
- required_device<cpu_device> m_maincpu;
- required_device<s3c2440_device> m_s3c2440;
- required_device<nand_device> m_nand, m_nand2;
- required_device<dac_word_interface> m_ldac;
- required_device<dac_word_interface> m_rdac;
- required_ioport_array<6> m_inputs;
-
- void i2c_scl_write(bool clk);
- void i2c_sda_write(int data);
-
- uint32_t m_port[9];
-
- enum i2c_mode
- {
- I2C_IDLE,
- I2C_ADDR,
- I2C_TYPE,
- I2C_READ_ACK,
- I2C_READ,
- I2C_WRITE_ACK,
- I2C_WRITE
- };
-
- int m_i2c_sda_in;
- int m_i2c_sda_out;
- bool m_i2c_scl;
- bool m_i2c_scl_pulse_started;
- bool m_i2c_started;
- i2c_mode m_i2c_mode;
- uint8_t m_i2c_addr;
- uint8_t m_i2c_addr_bits;
- uint8_t m_i2c_data;
- uint8_t m_i2c_data_bits;
-
- bool m_nand_select;
-
- uint8_t m_input_select;
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
- DECLARE_READ32_MEMBER(s3c2440_gpio_port_r);
- DECLARE_WRITE32_MEMBER(s3c2440_gpio_port_w);
- DECLARE_READ32_MEMBER(s3c2440_core_pin_r);
- DECLARE_WRITE8_MEMBER(s3c2440_nand_command_w );
- DECLARE_WRITE8_MEMBER(s3c2440_nand_address_w );
- DECLARE_READ8_MEMBER(s3c2440_nand_data_r );
- DECLARE_WRITE8_MEMBER(s3c2440_nand_data_w );
- DECLARE_WRITE16_MEMBER(s3c2440_i2s_data_w );
- DECLARE_READ32_MEMBER(s3c2440_adc_data_r );
-
- void hapyfish_map(address_map &map);
-};
-
-/***************************************************************************
- MACHINE HARDWARE
-***************************************************************************/
-
-// I2C bus on GPIO port E bits 15 (SDA) and 14 (SCL)
-
-void hapyfish_state::i2c_sda_write(int sda)
-{
- int old_sda = m_i2c_sda_out;
- m_i2c_sda_out = sda;
- if (old_sda && !m_i2c_sda_out && m_i2c_scl)
- {
- if (!m_i2c_started)
- {
- LOGMASKED(LOG_I2C, "%s: I2C Starting\n", machine().describe_context());
- }
- else
- {
- LOGMASKED(LOG_I2C, "%s: I2C Repeat-starting\n", machine().describe_context());
- }
- m_i2c_started = true;
- m_i2c_mode = I2C_ADDR;
- m_i2c_addr_bits = 0;
- m_i2c_addr = 0x00;
- m_i2c_scl_pulse_started = false;
- }
- else if (!old_sda && m_i2c_sda_out && m_i2c_scl && m_i2c_started)
- {
- LOGMASKED(LOG_I2C, "%s: I2C Stopping\n", machine().describe_context());
- m_i2c_started = false;
- m_i2c_scl_pulse_started = false;
- m_i2c_mode = I2C_IDLE;
- }
-}
-
-void hapyfish_state::i2c_scl_write(bool scl)
-{
- bool old_scl = m_i2c_scl;
- m_i2c_scl = scl;
- if (!old_scl && m_i2c_scl)
- {
- LOGMASKED(LOG_I2C, "%s: Received low-high SCL transition\n", machine().describe_context());
- m_i2c_scl_pulse_started = true;
- if (m_i2c_mode == I2C_READ_ACK)
- {
- LOGMASKED(LOG_I2C, "%s: Sending read acknowledge bit, entering read mode\n", machine().describe_context());
- m_i2c_sda_in = 0; // ACK
- m_i2c_mode = I2C_READ;
- }
- else if (m_i2c_mode == I2C_READ)
- {
- m_i2c_data_bits--;
- m_i2c_sda_in = BIT(m_i2c_data, m_i2c_data_bits);
- LOGMASKED(LOG_I2C, "%s: Sending read data bit %d: %d\n", machine().describe_context(), m_i2c_data_bits, m_i2c_sda_in);
- if (m_i2c_data_bits == 0)
- {
- LOGMASKED(LOG_I2C, "%s: Sent I2C data to host, entering read-acknowledge mode: %02x\n", machine().describe_context(), m_i2c_data);
- m_i2c_mode = I2C_READ_ACK;
- m_i2c_data_bits = 8;
- m_i2c_data = 0xff;
- }
- }
- }
- else if (old_scl && !m_i2c_scl && m_i2c_scl_pulse_started && m_i2c_started)
- {
- m_i2c_scl_pulse_started = false;
- if (m_i2c_mode == I2C_ADDR)
- {
- LOGMASKED(LOG_I2C, "%s: Received address bit %d: %d\n", machine().describe_context(), 7 - m_i2c_addr_bits, m_i2c_sda_out);
- m_i2c_addr <<= 1;
- m_i2c_addr |= m_i2c_sda_out;
- m_i2c_addr_bits++;
- if (m_i2c_addr_bits == 7)
- {
- LOGMASKED(LOG_I2C, "%s: Received I2C address: %02x\n", machine().describe_context(), m_i2c_addr);
- m_i2c_mode = I2C_TYPE;
- }
- }
- else if (m_i2c_mode == I2C_TYPE)
- {
- LOGMASKED(LOG_I2C, "%s: Received access type bit: %d\n", machine().describe_context(), m_i2c_sda_out);
- if (m_i2c_sda_out)
- {
- LOGMASKED(LOG_I2C, "%s: Received I2C read request, acknowledging\n", machine().describe_context());
- m_i2c_sda_in = 0; // ACK
- m_i2c_mode = I2C_READ_ACK;
- m_i2c_data_bits = 8;
- m_i2c_data = 0xff;
- }
- else
- {
- LOGMASKED(LOG_I2C, "%s: Received I2C write request, acknowledging\n", machine().describe_context());
- m_i2c_sda_in = 0; // ACK
- m_i2c_mode = I2C_WRITE;
- m_i2c_data_bits = 0;
- m_i2c_data = 0x00;
- }
- }
- else if (m_i2c_mode == I2C_READ_ACK)
- {
- // TODO: Actual response from actual device
- LOGMASKED(LOG_I2C, "%s: Acknowledging I2C read request\n", machine().describe_context());
- }
- else if (m_i2c_mode == I2C_WRITE_ACK)
- {
- LOGMASKED(LOG_I2C, "%s: Acknowledging I2C write request\n", machine().describe_context());
- }
- else if (m_i2c_mode == I2C_WRITE)
- {
- LOGMASKED(LOG_I2C, "%s: Received write data bit %d: %d\n", machine().describe_context(), 7 - m_i2c_data_bits, m_i2c_sda_out);
- m_i2c_data <<= 1;
- m_i2c_data |= m_i2c_sda_out;
- m_i2c_data_bits++;
- if (m_i2c_data_bits == 8)
- {
- LOGMASKED(LOG_I2C, "%s: Received I2C data from host, acknowledging: %02x\n", machine().describe_context(), m_i2c_data);
- m_i2c_sda_in = 0; // ACK
- m_i2c_data_bits = 0;
- m_i2c_data = 0x00;
- }
- }
- }
-}
-
-// GPIO
-
-READ32_MEMBER(hapyfish_state::s3c2440_gpio_port_r)
-{
- uint32_t data = m_port[offset];
- switch (offset)
- {
- case S3C2440_GPIO_PORT_A:
- LOGMASKED(LOG_GPIO, "%s: Read GPIO A: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_B:
- LOGMASKED(LOG_GPIO, "%s: Read GPIO B: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_C:
- LOGMASKED(LOG_GPIO, "%s: Read GPIO C: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_D:
- LOGMASKED(LOG_GPIO, "%s: Read GPIO D: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_E:
- data = m_i2c_sda_in << 15;
- m_i2c_scl_pulse_started = false;
- LOGMASKED(LOG_GPIO, "%s: Read GPIO E: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_F:
- data = 0xff;
- if (m_input_select < 6)
- {
- data = m_inputs[m_input_select]->read();
- }
- LOGMASKED(LOG_GPIO, "%s: Read GPIO F: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_G:
- data = (data & ~(1 << 13)) | (1 << 13); // [nand] 1 = 2048 byte page (if ncon = 1)
- data = (data & ~(1 << 14)) | (1 << 14); // [nand] 1 = 5 address cycle (if ncon = 1)
- data = (data & ~(1 << 15)) | (0 << 15); // [nand] 0 = 8-bit bus width (if ncon = 1)
- data = data | 0x8E9; // for "load Image of Linux..."
- LOGMASKED(LOG_GPIO, "%s: Read GPIO G: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_H:
- LOGMASKED(LOG_GPIO, "%s: Read GPIO H: %08x\n", machine().describe_context(), data);
- break;
-
- case S3C2440_GPIO_PORT_J:
- LOGMASKED(LOG_GPIO, "%s: Read GPIO J: %08x\n", machine().describe_context(), data);
- break;
- }
- return data;
-}
-
-WRITE32_MEMBER(hapyfish_state::s3c2440_gpio_port_w)
-{
- // tout2/gb2 -> uda1341ts l3mode
- // tout3/gb3 -> uda1341ts l3data
- // tclk0/gb4 -> uda1341ts l3clock
-
- //printf("%08x to GPIO @ %x\n", data, offset);
-
- m_port[offset] = data;
- switch (offset)
- {
- case S3C2440_GPIO_PORT_A:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO A: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- break;
-
- case S3C2440_GPIO_PORT_B:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO B: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- break;
-
- case S3C2440_GPIO_PORT_C:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO C: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- break;
-
- case S3C2440_GPIO_PORT_D:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO D: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- break;
-
- case S3C2440_GPIO_PORT_E:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO E: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- LOGMASKED(LOG_I2C, "%s: I2C SDA/SCL: %d/%d (&%d/&%d)\n", machine().describe_context(), BIT(data, 15), BIT(data, 14), BIT(mem_mask, 15), BIT(mem_mask, 14));
- if (BIT(mem_mask, 14))
- {
- i2c_scl_write(BIT(data, 14));
- }
- if (BIT(mem_mask, 15))
- {
- i2c_sda_write(BIT(data, 15));
- }
- if (mem_mask & 0x7e0)
- {
- uint8_t input_row_mask = ~(((data & mem_mask) >> 5) & 0x7f);
- for (m_input_select = 0; m_input_select < 8 && !BIT(input_row_mask, m_input_select); m_input_select++);
- LOGMASKED(LOG_INPUTS, "%s: Input select: Port %d\n", machine().describe_context(), m_input_select);
- }
- break;
-
- case S3C2440_GPIO_PORT_F:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO F: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- break;
-
- case S3C2440_GPIO_PORT_G:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO G: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- break;
-
- case S3C2440_GPIO_PORT_H:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO H: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- break;
-
- case S3C2440_GPIO_PORT_J:
- LOGMASKED(LOG_GPIO, "%s: Write GPIO J: %08x & %08x\n", machine().describe_context(), data, mem_mask);
- if (BIT(mem_mask, 11))
- {
- m_nand_select = BIT(data, 11);
- }
- break;
- }
-}
-
-// CORE
-
-/*
-
-OM[1:0] = 00: Enable NAND flash memory boot
-
-NCON: NAND flash memory selection (Normal / Advance)
-0: Normal NAND flash (256Words/512Bytes page size, 3/4 address cycle)
-1: Advance NAND flash (1KWords/2KBytes page size, 4/5 address cycle)
-
-*/
-
-READ32_MEMBER(hapyfish_state::s3c2440_core_pin_r)
-{
- int data = 0;
- switch (offset)
- {
- case S3C2440_CORE_PIN_NCON : data = 1; break;
- case S3C2440_CORE_PIN_OM0 : data = 0; break;
- case S3C2440_CORE_PIN_OM1 : data = 0; break;
- }
- return data;
-}
-
-// NAND
-
-WRITE8_MEMBER(hapyfish_state::s3c2440_nand_command_w )
-{
- if (m_nand_select)
- m_nand->command_w(data);
- else
- m_nand2->command_w(data);
-}
-
-WRITE8_MEMBER(hapyfish_state::s3c2440_nand_address_w )
-{
- if (m_nand_select)
- m_nand->address_w(data);
- else
- m_nand2->address_w(data);
-}
-
-READ8_MEMBER(hapyfish_state::s3c2440_nand_data_r )
-{
- if (m_nand_select)
- return m_nand->data_r();
- else
- return m_nand2->data_r();
-}
-
-WRITE8_MEMBER(hapyfish_state::s3c2440_nand_data_w )
-{
- if (m_nand_select)
- m_nand->data_w(data);
- else
- m_nand2->data_w(data);
-}
-
-// I2S
-
-WRITE16_MEMBER(hapyfish_state::s3c2440_i2s_data_w )
-{
- if (offset)
- m_ldac->write(data);
- else
- m_rdac->write(data);
-}
-
-// ADC
-
-READ32_MEMBER(hapyfish_state::s3c2440_adc_data_r )
-{
- uint32_t data = 0;
- LOGMASKED(LOG_ADC, "%s: ADC data read: %08x\n", machine().describe_context(), data);
- return data;
-}
-
-// ...
-
-void hapyfish_state::machine_start()
-{
- m_nand->set_data_ptr(memregion("nand")->base());
- m_nand2->set_data_ptr(memregion("nand2")->base());
- m_nand_select = true; // select NAND #1 (S3C2440 bootloader will happen before machine_reset())
- m_input_select = 7;
-}
-
-void hapyfish_state::machine_reset()
-{
- m_maincpu->reset();
- std::fill(std::begin(m_port), std::end(m_port), 0);
- m_nand_select = true; // select NAND #1
- m_i2c_sda_in = 1;
- m_i2c_sda_out = 1;
- m_i2c_scl = true;
- m_i2c_scl_pulse_started = false;
- m_i2c_started = false;
- m_i2c_mode = I2C_IDLE;
- m_i2c_addr = 0x00;
- m_i2c_addr_bits = 0;
- m_i2c_data = 0x00;
- m_i2c_data_bits = 0;
- m_input_select = 7;
-}
-
-/***************************************************************************
- ADDRESS MAPS
-***************************************************************************/
-
-void hapyfish_state::hapyfish_map(address_map &map)
-{
- map(0x30000000, 0x37ffffff).ram();
-}
-
-/***************************************************************************
- MACHINE DRIVERS
-***************************************************************************/
-
-void hapyfish_state::init_mini2440()
-{
- // do nothing
-}
-
-void hapyfish_state::hapyfish(machine_config &config)
-{
- ARM920T(config, m_maincpu, 100000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &hapyfish_state::hapyfish_map);
-
- PALETTE(config, "palette").set_entries(32768);
-
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_size(1024, 768);
- screen.set_visarea(0, 639, 0, 479);
- screen.set_screen_update("s3c2440", FUNC(s3c2440_device::screen_update));
-
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
- UDA1341TS(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 1.0); // uda1341ts.u12
- UDA1341TS(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 1.0); // uda1341ts.u12
- voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref"));
- vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
- vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT); vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
-
- S3C2440(config, m_s3c2440, 12000000);
- m_s3c2440->set_palette_tag("palette");
- m_s3c2440->set_screen_tag("screen");
- m_s3c2440->core_pin_r_callback().set(FUNC(hapyfish_state::s3c2440_core_pin_r));
- m_s3c2440->gpio_port_r_callback().set(FUNC(hapyfish_state::s3c2440_gpio_port_r));
- m_s3c2440->gpio_port_w_callback().set(FUNC(hapyfish_state::s3c2440_gpio_port_w));
- m_s3c2440->adc_data_r_callback().set(FUNC(hapyfish_state::s3c2440_adc_data_r));
- m_s3c2440->i2s_data_w_callback().set(FUNC(hapyfish_state::s3c2440_i2s_data_w));
- m_s3c2440->nand_command_w_callback().set(FUNC(hapyfish_state::s3c2440_nand_command_w));
- m_s3c2440->nand_address_w_callback().set(FUNC(hapyfish_state::s3c2440_nand_address_w));
- m_s3c2440->nand_data_r_callback().set(FUNC(hapyfish_state::s3c2440_nand_data_r));
- m_s3c2440->nand_data_w_callback().set(FUNC(hapyfish_state::s3c2440_nand_data_w));
-
- NAND(config, m_nand, 0);
- m_nand->set_nand_type(nand_device::chip::K9LAG08U0M);
- m_nand->rnb_wr_callback().set(m_s3c2440, FUNC(s3c2440_device::frnb_w));
-
- NAND(config, m_nand2, 0);
- m_nand2->set_nand_type(nand_device::chip::K9LAG08U0M);
- m_nand2->rnb_wr_callback().set(m_s3c2440, FUNC(s3c2440_device::frnb_w));
-}
-
-static INPUT_PORTS_START( hapyfish )
- PORT_START("INPUT0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(1)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_PLAYER(1)
-
- PORT_START("INPUT1")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(2)
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_PLAYER(2)
-
- PORT_START("INPUT2")
- PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("INPUT3")
- PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("INPUT4")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_COIN1)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_START1)
- PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("INPUT5")
- PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Language ) ) PORT_DIPLOCATION("S2:1")
- PORT_DIPSETTING( 0x0000, DEF_STR( English ) )
- PORT_DIPSETTING( 0x0001, DEF_STR( Chinese ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("S2:2")
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPNAME( 0x000c, 0x000c, DEF_STR( Coinage ) ) PORT_DIPLOCATION("S2:3,4")
- PORT_DIPSETTING( 0x000c, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( 3C_1C ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( 4C_1C ) )
- PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
-INPUT_PORTS_END
-
-/***************************************************************************
- GAME DRIVERS
-***************************************************************************/
-
-ROM_START( hapyfsh2 )
- ROM_REGION( 0x84000000, "nand", 0 )
- ROM_LOAD( "flash.u6", 0x00000000, 0x84000000, CRC(3aa364a2) SHA1(fe09f549a937ecaf8f7a859522a6635e272fe714) )
-
- ROM_REGION( 0x84000000, "nand2", 0 )
- ROM_LOAD( "flash.u28", 0x00000000, 0x84000000, CRC(f00a25cd) SHA1(9c33f8e26b84cea957d9c37fb83a686b948c6834) )
-ROM_END
-
-GAME( 201?, hapyfsh2, 0, hapyfish, hapyfish, hapyfish_state, empty_init, ROT0, "bootleg", "Happy Fish (V2 PCB, 302-in-1)", MACHINE_IS_SKELETON )