summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/leapster.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/leapster.cpp')
-rw-r--r--src/mame/drivers/leapster.cpp340
1 files changed, 340 insertions, 0 deletions
diff --git a/src/mame/drivers/leapster.cpp b/src/mame/drivers/leapster.cpp
new file mode 100644
index 00000000000..13d35656db3
--- /dev/null
+++ b/src/mame/drivers/leapster.cpp
@@ -0,0 +1,340 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/*
+ LeapFrog - Leapster
+
+ educational system from 2003, software is all developed in MXFlash
+
+ hwspecs
+
+
+ CPU:
+ Custom ASIC (ARCTangent 5.1 CPU @ 96MHz)
+
+ Memory:
+ Leapster: 2MB onboard RAM, 256 bytes NVRAM.
+ Leapster2: 16MB RAM, 128kbytes NVRAM
+
+ Media type:
+ Cartridges of 4-16MB with between 2 and 512kb NVRAM
+
+ Graphics:
+ 4Mb ATI chip.
+
+ Audio:
+ Custom
+
+ Screen:
+ 160x160 CSTN with touchscreen.
+
+
+ The Leapster 2 also has
+ USB 1.1 (client only) + full-sized SD slot.
+
+*/
+
+/* Cartridge pinout - for games list see hash/leapster.xml
+
+CARTRIDGE-PINOUT:
+-----------------
+Look at the Cartridge-Slot:
+
+ B A
+ ------------
+ VCC |01| VCC
+ NC |02| VSS
+ D11 |03| D04
+ D03 |04| D12
+ D10 |05| D05
+ VSS |06| D02
+ D13 |07| D09
+ NC |08| NC
+ D06 |09| D01
+ D14 |10| D08
+ ----|--|----
+ D07 |11| VSS
+ D00 |12| D15
+ Byte |13| OE
+ NC |14| A22
+ NC |15| A23
+ CE |16| A16
+ A00 |17| A15
+ A01 |18| A14
+ A02 |19| A13
+ VSS |20| A03
+ A12 |21| A04
+ A11 |22| A05
+ A10 |23| A06
+ A09 |24| A07
+ A08 |25| A17
+ A19 |26| A18
+ A20 |27| A21
+ WE |28| VSS
+PIN7 of 24LC02B <---| |29| |---> PIN7 of 24LC02B
+ NC |30| |---> PIN6 of 24LC02B
+ ----------
+
+
+
+
+PCB - Handheld-Console:
+
+ +-----------------------------+
+ | |
+ +------------| |------------+
+ | | C A R T R I D G E - S L O T | |
+ | | | |
+ | +-----------------------------+ |
+ | |
+ |ASY 310-10069 +-------------------+ |
+ | | | |
+ | | | |
+ |LEAPSTER MAIN | | |
+ |Leap Frog | U3| |
+ |(c) 2004 +-------------------+ +-----+ |
+ | |ISSI | |
+ | | | |
+ | +---------+ |IS42S| |
+ | | | |16100| |
+ \ +-+ | EPOXY | |AT-7T| /
+ \ |A| | BLOCK | | | /
+ \ +-+ | | | U2| /
+ \ | U1| +-----+ /
+ \ +---------+ /
+ \ /
+ \ /
+ \ /
+ \ /
+ \ /
+ \ /
+ \ /
+ \ /
+ \ /
+ \-------------------------/
+
+
+A = 24LC02B / SN0429
+
+
+
+
+ETCHES ON THE BACK OF THE PCB:
+
+"FAB-300-10069-C"
+
+"702800254.01A"
+"SW1208 Rev.5"
+
+
+
+
+
+
+
+
+PCB - Cartridge:
+FRONT:
+
++-------------------------------------+
+| LEAPSTER ROM CARTRIDGE |
+| +--+ +---------+ Leap Frog |
+| |B1|U2 | | (c) 2003 |
++-+ +--+ |E P O X Y| +-+
+ | | U3| |
++-+ +---------+ +-+
+| 20232-003-1020|
+| ASY 310-10028 REV:00 |
++-+ +-+ +-+
+ |||||||||||||||||||||| ||||||||||||
+ +--------------------+ +----------+
+ A30 A01
+
+B1: 24L002B
+
+
+
+
+24L002B:
+
+ +-----+
+ (GND)<- A0-| |-VCC
+ (GND)<- A1-| |-WP
+ (GND)<- A2-| |-SCL
+ VSS-| |-SDA
+ +-----+
+
+
+
+
+
+PCB - LEAPSTER-TV:
+
+
+
++-----------------------------------------------------------------------+
+| |
+| |
+| 20300+003+0015 |
+ \ REV:06 /
+ | |
+ | |
+ | +----+ +-------+ |
+ \ | | | EPOXY | /
+ | +----+ | | | | |
+ | |EPOX| | | | | |
+ | |Y | | | | U1| +-+ |
+ \ +----+ | | +-------+ | | /
+ | | U2| +-+U4 |
+ | +----+ |
+ | +--------------+ ROADRUNNER CONSOLE |
+ \ | AM29PL160CB | Leap Frog (c) 2006/
+ | | -90SF | Asy 310-10378 |
+ | | U6| |
+ | +--------------+ |
+ \ /
+ | +-----------------------------+ |
+ | | C A R T R I D G E - S L O T | |
+ | +-----------------------------+ |
+ \ /
+ +-----------------------------------------------+
+
+
+
+
+
+
+
+*/
+
+#include "emu.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "cpu/arcompact/arcompact.h"
+#include "softlist.h"
+
+class leapster_state : public driver_device
+{
+public:
+ leapster_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_cart(*this, "cartslot")
+ { }
+
+
+ virtual void machine_start();
+ virtual void machine_reset();
+
+ UINT32 screen_update_leapster(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(leapster_cart);
+ DECLARE_DRIVER_INIT(leapster);
+
+ DECLARE_READ32_MEMBER(leapster_random_r)
+ {
+ return rand() | (rand()<<16); // there is a loop checking that this is above a certain value
+ }
+
+ DECLARE_WRITE32_MEMBER(leapster_aux004b_w)
+ {
+ printf("leapster_aux004b_w %04x\n", data);
+ }
+
+protected:
+ required_device<cpu_device> m_maincpu;
+ required_device<generic_slot_device> m_cart;
+
+ memory_region *m_cart_rom;
+};
+
+
+
+
+static INPUT_PORTS_START( leapster )
+INPUT_PORTS_END
+
+
+
+UINT32 leapster_state::screen_update_leapster(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+DEVICE_IMAGE_LOAD_MEMBER( leapster_state, leapster_cart )
+{
+ UINT32 size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM32_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return IMAGE_INIT_PASS;
+}
+
+void leapster_state::machine_start()
+{
+ std::string region_tag;
+ m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+
+ if (m_cart_rom)
+ {
+ address_space &space = m_maincpu->space(AS_PROGRAM);
+
+ space.install_readwrite_bank(0x80000000, 0x807fffff, "cartrom");
+ membank("cartrom")->set_base(m_cart_rom->base());
+ }
+}
+
+void leapster_state::machine_reset()
+{
+}
+
+static ADDRESS_MAP_START( leapster_map, AS_PROGRAM, 32, leapster_state )
+ AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_MIRROR(0x40000000) // pointers in the bios region seem to be to the 40xxxxxx region, either we mirror there or something (real bios?) is acutally missing
+ AM_RANGE(0x0180D800, 0x0180D803) AM_READ(leapster_random_r)
+ AM_RANGE(0x03000000, 0x030007ff) AM_RAM // puts stack here, writes a pointer @ 0x03000000 on startup
+ AM_RANGE(0x3c000000, 0x3c1fffff) AM_RAM // really ram, or has our code execution gone wrong?
+// AM_RANGE(0x80000000, 0x807fffff) AM_ROMBANK("cartrom") // game ROM pointers are all to the 80xxxxxx region, so I assume it maps here - installed if a cart is present
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( leapster_aux, AS_IO, 32, leapster_state )
+ AM_RANGE(0x00000012c, 0x00000012f) AM_WRITE(leapster_aux004b_w) // this address isn't used by ARC internal stuff afaik, so probably leapster specific
+ADDRESS_MAP_END
+
+static MACHINE_CONFIG_START( leapster, leapster_state )
+ /* basic machine hardware */
+ // CPU is ArcTangent-A5 '5.1' (ARCompact core)
+ MCFG_CPU_ADD("maincpu", ARCA5, 96000000/10)
+ MCFG_CPU_PROGRAM_MAP(leapster_map)
+ MCFG_CPU_IO_MAP(leapster_aux)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", LCD)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_SIZE(160, 160)
+ MCFG_SCREEN_VISIBLE_AREA(0, 160-1, 0, 160-1)
+ MCFG_SCREEN_UPDATE_DRIVER(leapster_state, screen_update_leapster)
+
+ /* cartridge */
+ MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "leapster_cart")
+ MCFG_GENERIC_EXTENSIONS("bin")
+ MCFG_GENERIC_LOAD(leapster_state, leapster_cart)
+
+ /* Software lists */
+ MCFG_SOFTWARE_LIST_ADD("cart_list", "leapster")
+MACHINE_CONFIG_END
+
+ROM_START(leapster)
+ ROM_REGION(0x200000, "maincpu", ROMREGION_ERASE00)
+ ROM_LOAD( "155-10072-a.bin", 0x00000, 0x200000, CRC(af05e5a0) SHA1(d4468d060543ba7e44785041093bc98bcd9afa07) )
+ROM_END
+
+ROM_START(leapstertv)
+ ROM_REGION(0x200000, "maincpu", ROMREGION_ERASE00)
+ ROM_LOAD( "am29pl160cb-90sf.bin", 0x00000, 0x200000, BAD_DUMP CRC(dc281f1f) SHA1(17588de54ab3bb82801bd5062f3e6aa687412178) )
+ROM_END
+
+DRIVER_INIT_MEMBER(leapster_state,leapster)
+{
+}
+
+CONS(2003, leapster, 0, 0, leapster, leapster, leapster_state, leapster, "LeapFrog", "Leapster (Germany)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IS_SKELETON )
+CONS(2005, leapstertv, leapster, 0, leapster, leapster, leapster_state, leapster, "LeapFrog", "Leapster TV (Germany)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IS_SKELETON )