mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
dphh8213: Improve inputs; work around unemulated SPI device
This commit is contained in:
parent
91c0991e55
commit
caf1e140ba
@ -14,21 +14,36 @@ public:
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_screen(*this, "screen")
|
||||
, m_lcdc(*this, "lcdc")
|
||||
, m_input_matrix(*this, "IN%u", 1U)
|
||||
, m_portb(0xff)
|
||||
{
|
||||
}
|
||||
|
||||
void st22xx_bbl338(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
u8 porta_r();
|
||||
void portb_w(u8 data);
|
||||
|
||||
void st22xx_bbl338_map(address_map &map);
|
||||
|
||||
required_device<st2xxx_device> m_maincpu;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<bl_handhelds_lcdc_device> m_lcdc;
|
||||
required_ioport_array<4> m_input_matrix;
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
u8 m_portb;
|
||||
};
|
||||
|
||||
void st22xx_bbl338_state::machine_start()
|
||||
{
|
||||
save_item(NAME(m_portb));
|
||||
}
|
||||
|
||||
void st22xx_bbl338_state::st22xx_bbl338_map(address_map &map)
|
||||
{
|
||||
@ -43,39 +58,71 @@ u32 st22xx_bbl338_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
|
||||
return m_lcdc->render_to_bitmap(screen, bitmap, cliprect);
|
||||
}
|
||||
|
||||
u8 st22xx_bbl338_state::porta_r()
|
||||
{
|
||||
u8 input = 0x3f;
|
||||
|
||||
// irregular port configuration
|
||||
if (!BIT(m_portb, 0))
|
||||
input &= m_input_matrix[0]->read();
|
||||
for (int i = 1; i < 4; i++)
|
||||
if (!BIT(m_portb, i * 2 - 1))
|
||||
input &= m_input_matrix[i]->read();
|
||||
|
||||
// TODO: bit 7 is I/O for some bitbanged SPI device (used for the menu)
|
||||
input |= 0xc0;
|
||||
return input;
|
||||
}
|
||||
|
||||
void st22xx_bbl338_state::portb_w(u8 data)
|
||||
{
|
||||
m_portb = data;
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START(st22xx_bbl338)
|
||||
PORT_START("IN0") // not confirmed, but probably similar to other units
|
||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // maybe ON/OFF
|
||||
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)
|
||||
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT)
|
||||
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)
|
||||
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_START1)
|
||||
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("SOUND")
|
||||
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("B")
|
||||
|
||||
PORT_START("IN1") // not confirmed, but probably similar to other units
|
||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("A")
|
||||
PORT_BIT(0x06, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_START("IN1")
|
||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_START1)
|
||||
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0x30, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
|
||||
PORT_START("IN2")
|
||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT)
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)
|
||||
PORT_BIT(0x30, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
|
||||
PORT_START("IN3")
|
||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("A")
|
||||
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("B")
|
||||
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)
|
||||
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)
|
||||
|
||||
PORT_START("IN4")
|
||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0x0e, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
|
||||
PORT_START("PORTC")
|
||||
PORT_CONFNAME( 0x01, 0x01, DEF_STR( Language ) )
|
||||
PORT_CONFSETTING( 0x00, "Chinese" )
|
||||
PORT_CONFSETTING( 0x01, "English" )
|
||||
PORT_BIT(0xfe, IP_ACTIVE_LOW, IPT_UNUSED) // probably unused
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
|
||||
PORT_BIT(0xf6, IP_ACTIVE_LOW, IPT_UNUSED) // probably unused
|
||||
INPUT_PORTS_END
|
||||
|
||||
void st22xx_bbl338_state::st22xx_bbl338(machine_config &config)
|
||||
{
|
||||
ST2302U(config, m_maincpu, 12000000); // likely higher clock
|
||||
ST2302U(config, m_maincpu, 24000000);
|
||||
m_maincpu->set_addrmap(AS_DATA, &st22xx_bbl338_state::st22xx_bbl338_map);
|
||||
m_maincpu->in_pa_callback().set_ioport("IN0");
|
||||
m_maincpu->in_pb_callback().set_ioport("IN1");
|
||||
m_maincpu->in_pc_callback().set_ioport("IN2");
|
||||
m_maincpu->in_pa_callback().set(FUNC(st22xx_bbl338_state::porta_r));
|
||||
m_maincpu->out_pb_callback().set(FUNC(st22xx_bbl338_state::portb_w));
|
||||
m_maincpu->in_pc_callback().set_ioport("PORTC");
|
||||
|
||||
// incorrect for bbl338
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_LCD);
|
||||
@ -101,6 +148,7 @@ ROM_END
|
||||
ROM_START( dphh8213 )
|
||||
ROM_REGION( 0x200000, "maincpu", 0 )
|
||||
ROM_LOAD( "mx29lv160cb.u1", 0x000000, 0x200000, CRC(c8e7e355) SHA1(726f28c2c9ab012a6842f9f30a0a71538741ba14) )
|
||||
ROM_FILL( 0x00009f, 2, 0xea ) // NOP out SPI check
|
||||
ROM_END
|
||||
|
||||
// this is uses a higher resolution display than the common units, but not as high as the SunPlus based ones
|
||||
|
Loading…
Reference in New Issue
Block a user