summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/zaurus.cpp
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2020-06-23 19:48:01 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2020-06-23 19:48:01 +1000
commit60761a0d8171ce971e62566a7ffe9f77c200881f (patch)
tree3db2436ce33bdd8373c3c6b489e8042d4a1b2ec8 /src/mame/drivers/zaurus.cpp
parentfeda349b3eea19d4fd0010a74e2dd6ff30f26b16 (diff)
parentd1362259ee3a0791689ef2a754f5b730a9afcd6e (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/mame/drivers/zaurus.cpp')
-rw-r--r--src/mame/drivers/zaurus.cpp157
1 files changed, 88 insertions, 69 deletions
diff --git a/src/mame/drivers/zaurus.cpp b/src/mame/drivers/zaurus.cpp
index 4a1cac86b38..b8d80ce1aeb 100644
--- a/src/mame/drivers/zaurus.cpp
+++ b/src/mame/drivers/zaurus.cpp
@@ -5,10 +5,7 @@
Sharp Zaurus PDA skeleton driver (SL, ARM/Linux based, 4th generation)
TODO:
- - PXA-255 ID opcode fails on this
- ARM TLB look-up errors?
- - RTC IRQ doesn't fire?
- - For whatever reason, after RTC check ARM executes invalid code at 0-0x200
- Dumps are questionable
=========================================================================================================================================
@@ -1407,6 +1404,7 @@ Note:
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
#include "machine/pxa255.h"
+#include "machine/sa1110.h"
#include "machine/timer.h"
#include "emupal.h"
#include "screen.h"
@@ -1423,121 +1421,133 @@ class zaurus_state : public driver_device
public:
zaurus_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- , m_pxa_periphs(*this, "pxa_periphs")
, m_maincpu(*this, "maincpu")
, m_ram(*this, "ram")
{ }
- void zaurus_base(machine_config &config);
- void zaurus_sa1110(machine_config &config);
- void zaurus_pxa250(machine_config &config);
- void zaurus_pxa255(machine_config &config);
- void zaurus_pxa270(machine_config &config);
-
-private:
+protected:
// driver_device overrides
virtual void machine_start() override;
virtual void machine_reset() override;
- void zaurus_map(address_map &map);
-
// devices
- required_device<pxa255_periphs_device> m_pxa_periphs;
required_device<cpu_device> m_maincpu;
required_shared_ptr<uint32_t> m_ram;
-
- uint8_t m_rtc_tick;
- uint32_t rtc_r(offs_t offset);
- void rtc_w(offs_t offset, uint32_t data);
- TIMER_DEVICE_CALLBACK_MEMBER(rtc_irq_callback);
};
+class zaurus_sa_state : public zaurus_state
+{
+public:
+ zaurus_sa_state(const machine_config &mconfig, device_type type, const char *tag)
+ : zaurus_state(mconfig, type, tag)
+ , m_sa_periphs(*this, "sa_periphs")
+ { }
-uint32_t zaurus_state::rtc_r(offs_t offset)
+ void zaurus_sa1110(machine_config &config);
+
+private:
+ void main_map(address_map &map);
+
+ required_device<sa1110_periphs_device> m_sa_periphs;
+};
+
+class zaurus_pxa_state : public zaurus_state
{
- osd_printf_debug("%08x\n", offset << 2);
+public:
+ zaurus_pxa_state(const machine_config &mconfig, device_type type, const char *tag)
+ : zaurus_state(mconfig, type, tag)
+ , m_pxa_periphs(*this, "pxa_periphs")
+ , m_power(*this, "PWR")
+ { }
- return 0;
-}
+ void zaurus_pxa_base(machine_config &config);
+ void zaurus_pxa250(machine_config &config);
+ void zaurus_pxa255(machine_config &config);
+ void zaurus_pxa270(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER( system_start );
+
+private:
+ void main_map(address_map &map);
+
+ required_device<pxa255_periphs_device> m_pxa_periphs;
+ required_ioport m_power;
+};
-void zaurus_state::rtc_w(offs_t offset, uint32_t data)
+void zaurus_sa_state::main_map(address_map &map)
{
- osd_printf_debug("%08x %08x\n", offset << 2, data);
+ map(0x00000000, 0x00ffffff).ram().region("firmware", 0);
+ map(0x90020000, 0x9002001f).rw(m_sa_periphs, FUNC(sa1110_periphs_device::power_r), FUNC(sa1110_periphs_device::power_w));
+ map(0x90050000, 0x90050023).rw(m_sa_periphs, FUNC(sa1110_periphs_device::intc_r), FUNC(sa1110_periphs_device::intc_w));
+ map(0xc0000000, 0xc07fffff).ram().share("ram");
}
-void zaurus_state::zaurus_map(address_map &map)
+void zaurus_pxa_state::main_map(address_map &map)
{
map(0x00000000, 0x001fffff).ram().region("firmware", 0);
- map(0x40900000, 0x4090000f).rw(FUNC(zaurus_state::rtc_r), FUNC(zaurus_state::rtc_w));
map(0x40000000, 0x400002ff).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::dma_r), FUNC(pxa255_periphs_device::dma_w));
map(0x40400000, 0x40400083).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::i2s_r), FUNC(pxa255_periphs_device::i2s_w));
+ map(0x40900000, 0x4090000f).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::rtc_r), FUNC(pxa255_periphs_device::rtc_w));
map(0x40a00000, 0x40a0001f).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::ostimer_r), FUNC(pxa255_periphs_device::ostimer_w));
map(0x40d00000, 0x40d00017).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::intc_r), FUNC(pxa255_periphs_device::intc_w));
map(0x40e00000, 0x40e0006b).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::gpio_r), FUNC(pxa255_periphs_device::gpio_w));
+ map(0x40f00000, 0x40f00037).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::power_r), FUNC(pxa255_periphs_device::power_w));
+ map(0x41300000, 0x4130000b).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::clocks_r), FUNC(pxa255_periphs_device::clocks_w));
map(0x44000000, 0x4400021f).rw(m_pxa_periphs, FUNC(pxa255_periphs_device::lcd_r), FUNC(pxa255_periphs_device::lcd_w));
map(0xa0000000, 0xa07fffff).ram().share("ram");
}
-static INPUT_PORTS_START( zaurus )
-INPUT_PORTS_END
-
-void zaurus_state::machine_start()
+INPUT_CHANGED_MEMBER( zaurus_pxa_state::system_start )
{
+ m_pxa_periphs->gpio_bit_w(10, m_power->read());
}
-void zaurus_state::machine_reset()
-{
-}
+static INPUT_PORTS_START( zaurus_sa )
+INPUT_PORTS_END
+static INPUT_PORTS_START( zaurus_pxa )
+ PORT_START("PWR")
+ PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Start System") PORT_CHANGED_MEMBER(DEVICE_SELF, zaurus_pxa_state, system_start, 0)
+INPUT_PORTS_END
-/* TODO: Hack */
-TIMER_DEVICE_CALLBACK_MEMBER(zaurus_state::rtc_irq_callback)
+void zaurus_state::machine_start()
{
-#if 1
- m_rtc_tick++;
- m_rtc_tick &= 1;
-
- if(m_rtc_tick & 1)
- m_pxa_periphs->set_irq_line(PXA255_INT_RTC_HZ, 1);
- else
- m_pxa_periphs->set_irq_line(PXA255_INT_RTC_HZ, 0);
-#else
- (void)m_rtc_tick;
-#endif
}
-void zaurus_state::zaurus_base(machine_config &config)
+void zaurus_state::machine_reset()
{
- m_maincpu->set_addrmap(AS_PROGRAM, &zaurus_state::zaurus_map);
- TIMER(config, "rtc_timer").configure_periodic(FUNC(zaurus_state::rtc_irq_callback), attotime::from_hz(XTAL(32'768)));
}
-void zaurus_state::zaurus_sa1110(machine_config &config)
+void zaurus_sa_state::zaurus_sa1110(machine_config &config)
{
SA1110(config, m_maincpu, SA1110_CLOCK);
- PXA255_PERIPHERALS(config, m_pxa_periphs, SA1110_CLOCK, m_maincpu); // TODO: Correct peripherals
- zaurus_base(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaurus_sa_state::main_map);
+
+ SA1110_PERIPHERALS(config, m_sa_periphs, SA1110_CLOCK, m_maincpu);
}
-void zaurus_state::zaurus_pxa250(machine_config &config)
+void zaurus_pxa_state::zaurus_pxa250(machine_config &config)
{
- PXA255(config, m_maincpu, PXA250_CLOCK); // TODO: Correct CPU type
- PXA255_PERIPHERALS(config, m_pxa_periphs, PXA250_CLOCK, m_maincpu); // TODO: Correct peripherals
- zaurus_base(config);
+ PXA250(config, m_maincpu, PXA250_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaurus_pxa_state::main_map);
+
+ PXA255_PERIPHERALS(config, m_pxa_periphs, PXA250_CLOCK, m_maincpu);
}
-void zaurus_state::zaurus_pxa255(machine_config &config)
+void zaurus_pxa_state::zaurus_pxa255(machine_config &config)
{
PXA255(config, m_maincpu, PXA255_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaurus_pxa_state::main_map);
+
PXA255_PERIPHERALS(config, m_pxa_periphs, PXA255_CLOCK, m_maincpu);
- zaurus_base(config);
}
-void zaurus_state::zaurus_pxa270(machine_config &config)
+void zaurus_pxa_state::zaurus_pxa270(machine_config &config)
{
- PXA255(config, m_maincpu, PXA270_CLOCK); // TODO: Correct CPU type
+ PXA270(config, m_maincpu, PXA270_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zaurus_pxa_state::main_map);
+
PXA255_PERIPHERALS(config, m_pxa_periphs, PXA270_CLOCK, m_maincpu); // TODO: Correct peripherals
- zaurus_base(config);
}
/***************************************************************************
@@ -1546,8 +1556,16 @@ void zaurus_state::zaurus_pxa270(machine_config &config)
***************************************************************************/
-/* was labeled SL-C500 */
ROM_START( zsl5500 )
+ ROM_REGION32_LE( 0x1000000, "firmware", ROMREGION_ERASE00 )
+ ROM_SYSTEM_BIOS( 0, "2.58", "OS Pack 2.58" ) \
+ ROMX_LOAD( "ospack-2.58", 0x0000000, 0x1000000, CRC(31c4d3ef) SHA1(a3b67fb45160bdb990e34dca5c389ed345c000c6), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "3.10", "OS Pack 3.10" ) \
+ ROMX_LOAD( "ospack-3.10", 0x0000000, 0x1000000, CRC(12345678) SHA1(1234567812345678123456781234567812345678), ROM_BIOS(1) )
+ROM_END
+
+/* was labeled SL-C500 */
+ROM_START( zslc500 )
ROM_REGION32_LE( 0x200000, "firmware", ROMREGION_ERASE00 )
ROM_LOAD( "sl-c500 v1.20,zimage.bin", 0x000000, 0x13c000, BAD_DUMP CRC(dc1c259f) SHA1(8150744196a72821ae792462d0381182274c2ce0) )
ROM_END
@@ -1577,9 +1595,10 @@ ROM_START( zslc1000 )
ROM_LOAD( "openzaurus 3.5.3 - zimage-sharp sl-c1000-20050427214434.bin", 0x000000, 0x128980, BAD_DUMP CRC(1e1a9279) SHA1(909ac3f00385eced55822d6a155b79d9d25f43b3) )
ROM_END
-COMP( 2002, zsl5500, 0, 0, zaurus_sa1110, zaurus, zaurus_state, empty_init, "Sharp", "Zaurus SL-5500 \"Collie\"", MACHINE_IS_SKELETON )
-COMP( 2002, zsl5600, 0, 0, zaurus_pxa250, zaurus, zaurus_state, empty_init, "Sharp", "Zaurus SL-5600 / SL-B500 \"Poodle\"", MACHINE_IS_SKELETON )
-COMP( 2003, zslc750, 0, 0, zaurus_pxa255, zaurus, zaurus_state, empty_init, "Sharp", "Zaurus SL-C750 \"Shepherd\" (Japan)", MACHINE_IS_SKELETON )
-COMP( 2004, zslc760, 0, 0, zaurus_pxa255, zaurus, zaurus_state, empty_init, "Sharp", "Zaurus SL-C760 \"Husky\" (Japan)", MACHINE_IS_SKELETON )
-COMP( 200?, zslc3000, 0, 0, zaurus_pxa270, zaurus, zaurus_state, empty_init, "Sharp", "Zaurus SL-C3000 \"Spitz\" (Japan)", MACHINE_IS_SKELETON )
-COMP( 200?, zslc1000, 0, 0, zaurus_pxa270, zaurus, zaurus_state, empty_init, "Sharp", "Zaurus SL-C3000 \"Akita\" (Japan)", MACHINE_IS_SKELETON )
+COMP( 2002, zsl5500, 0, 0, zaurus_sa1110, zaurus_sa, zaurus_sa_state, empty_init, "Sharp", "Zaurus SL-5500 \"Collie\"", MACHINE_IS_SKELETON )
+COMP( 2002, zslc500, 0, 0, zaurus_pxa250, zaurus_pxa, zaurus_pxa_state, empty_init, "Sharp", "Zaurus SL-C500", MACHINE_IS_SKELETON )
+COMP( 2002, zsl5600, 0, 0, zaurus_pxa250, zaurus_pxa, zaurus_pxa_state, empty_init, "Sharp", "Zaurus SL-5600 / SL-B500 \"Poodle\"", MACHINE_IS_SKELETON )
+COMP( 2003, zslc750, 0, 0, zaurus_pxa255, zaurus_pxa, zaurus_pxa_state, empty_init, "Sharp", "Zaurus SL-C750 \"Shepherd\" (Japan)", MACHINE_IS_SKELETON )
+COMP( 2004, zslc760, 0, 0, zaurus_pxa255, zaurus_pxa, zaurus_pxa_state, empty_init, "Sharp", "Zaurus SL-C760 \"Husky\" (Japan)", MACHINE_IS_SKELETON )
+COMP( 200?, zslc3000, 0, 0, zaurus_pxa270, zaurus_pxa, zaurus_pxa_state, empty_init, "Sharp", "Zaurus SL-C3000 \"Spitz\" (Japan)", MACHINE_IS_SKELETON )
+COMP( 200?, zslc1000, 0, 0, zaurus_pxa270, zaurus_pxa, zaurus_pxa_state, empty_init, "Sharp", "Zaurus SL-C3000 \"Akita\" (Japan)", MACHINE_IS_SKELETON )