1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
|
// license:BSD-3-Clause
// copyright-holders:David Haywood
/******************************************************************************
LEAPPAD:
Example-Video: https://www.youtube.com/watch?v=LtUhENu5TKc
The LEAPPAD is basically compareable to the SEGA PICO, but without
Screen-Output! Each "Game" consists of two parts (Book + Cartridge).
Insert the cartridge into the system and add the Book on the Top of the
"console" and you can click on each pages and hear sounds or
learning-stuff on each page...
MY FIRST LEAPPAD:
Basically the same as the LEAPPAD, but for even younger kids! (Cartridge
internal PCB's are identical to LEAPPAD).
Example Video: https://www.youtube.com/watch?v=gsf8XYV1Tpg
LITTLE TOUCH LEAPPAD:
Same as the other LEAPPAD models, but aimed at babies.
Don't get confused by the name "LEAPPAD", as it looks like Leapfrog
also released some kind of Tablet with this name, and they even released
a new "LEAPPAD" in around 2016:
https://www.youtube.com/watch?v=MXFSgj6xLTU , which nearly looks like the
same, but is most likely techically completely different...
The cartridges pinout is the same on the three systems:
A1 N/C (A21?)
A2 A20
A3 A19
A4 A8
A5 A9
A6 A6
A7 A5
A8 A4
A9 A3
A10 A2
A11 A1
A12 A0
A13 N/C (R/W? /CE2?)
A14 /CE
A15 /OE
A16 D0
A17 D1
A18 D2
A19 D3
A20 VCC
B1 N/C (A22?)
B2 N/C (A23?)
B3 A18
B4 A17
B5 A7
B6 GND
B7 A10
B8 A11
B9 A12
B10 A13
B11 A14
B12 A15
B13 A16
B14 GND
B15 A-1
B16 D7
B17 D6
B18 D5
B19 D4
B20 GND
*******************************************************************************/
#include "emu.h"
#include "cpu/mcs51/mcs51.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
#include "screen.h"
#include "softlist_dev.h"
#include "speaker.h"
class leapfrog_leappad_state : public driver_device
{
public:
leapfrog_leappad_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_cart(*this, "cartslot")
, m_cart_region(nullptr)
{ }
void leapfrog_leappad(machine_config &config);
void leapfrog_mfleappad(machine_config &config);
void leapfrog_ltleappad(machine_config &config);
private:
virtual void machine_start() override;
virtual void machine_reset() override;
void prog_map(address_map &map);
void ext_map(address_map &map);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
required_device<mcs51_cpu_device> m_maincpu;
required_device<generic_slot_device> m_cart;
memory_region *m_cart_region;
};
void leapfrog_leappad_state::machine_start()
{
// if there's a cart, override the standard mapping
if (m_cart && m_cart->exists())
{
m_cart_region = memregion(std::string(m_cart->tag()) + GENERIC_ROM_REGION_TAG);
}
}
void leapfrog_leappad_state::machine_reset()
{
}
void leapfrog_leappad_state::prog_map(address_map &map)
{
map(0x0000, 0xffff).rom().region("maincpu", 0x10000); // TODO: banking
}
void leapfrog_leappad_state::ext_map(address_map &map)
{
}
DEVICE_IMAGE_LOAD_MEMBER(leapfrog_leappad_state::cart_load)
{
uint32_t size = m_cart->common_get_size("rom");
m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
return image_init_result::PASS;
}
static INPUT_PORTS_START( leapfrog_leappad )
INPUT_PORTS_END
void leapfrog_leappad_state::leapfrog_leappad(machine_config &config)
{
I8032(config, m_maincpu, XTAL::u(96000000)/10); // LeapPad Leapfrog 05-9-01 FS80A363 (which exact type is it?)
m_maincpu->set_addrmap(AS_PROGRAM, &leapfrog_leappad_state::prog_map);
m_maincpu->set_addrmap(AS_IO, &leapfrog_leappad_state::ext_map);
// screenless
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "leapfrog_leappad_cart");
m_cart->set_width(GENERIC_ROM16_WIDTH);
m_cart->set_device_load(FUNC(leapfrog_leappad_state::cart_load));
SOFTWARE_LIST(config, "cart_list").set_original("leapfrog_leappad_cart");
}
void leapfrog_leappad_state::leapfrog_mfleappad(machine_config &config)
{
I8032(config, m_maincpu, XTAL::u(96000000)/10); // LeapPad Leapfrog 05-9-01 FS80A363 (which exact type is it?)
m_maincpu->set_addrmap(AS_PROGRAM, &leapfrog_leappad_state::prog_map);
m_maincpu->set_addrmap(AS_IO, &leapfrog_leappad_state::ext_map);
// screenless
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "leapfrog_mfleappad_cart");
m_cart->set_width(GENERIC_ROM16_WIDTH);
m_cart->set_device_load(FUNC(leapfrog_leappad_state::cart_load));
SOFTWARE_LIST(config, "cart_list").set_original("leapfrog_mfleappad_cart");
}
void leapfrog_leappad_state::leapfrog_ltleappad(machine_config &config)
{
I8032(config, m_maincpu, XTAL::u(96000000)/10); // (which exact type is it?)
m_maincpu->set_addrmap(AS_PROGRAM, &leapfrog_leappad_state::prog_map);
m_maincpu->set_addrmap(AS_IO, &leapfrog_leappad_state::ext_map);
// screenless
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "leapfrog_ltleappad_cart");
m_cart->set_width(GENERIC_ROM16_WIDTH);
m_cart->set_device_load(FUNC(leapfrog_leappad_state::cart_load));
SOFTWARE_LIST(config, "cart_list").set_original("leapfrog_ltleappad_cart");
}
// All of these contain the string "Have you copied our ROM?" near the date codes
ROM_START( leappad )
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_DEFAULT_BIOS("ila2_universal")
ROM_SYSTEM_BIOS( 0, "ila2_universal", "Universal" )
ROMX_LOAD( "leappadbios.bin", 0x000000, 0x100000, CRC(c886cddc) SHA1(f8a83b156feb28315d2321758678e141600a0d4e), ROM_BIOS(0) ) // contains "Aug 06 2001.16:33:16.155-00450.LeapPad ILA2 Universal Base ROM" and "Copyright (c) 1998-2001 Knowledge Kids Enterprises, Inc."
ROM_SYSTEM_BIOS( 1, "2mb_canada_full", "Canada" )
ROMX_LOAD( "leappadbioscanada.bin", 0x000000, 0x200000, CRC(cc12e3db) SHA1(adf52232adcfd4de5d8e31c0e0c09be61718a9d4), ROM_BIOS(1) ) // contains "Jan 23 2004 11:28:40 152-10620 2MB Canada Full Base ROM" and "Copyright (c) 2000-2004 LeapFrog Enterprises, Inc."
ROM_END
ROM_START( mfleappad )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF )
ROM_DEFAULT_BIOS("internat_v1.3")
ROM_SYSTEM_BIOS( 0, "internat_v1.3", "International V1.3" )
ROMX_LOAD( "myfirstleappadinternational.bin", 0x000000, 0x100000, CRC(4dc0c4d5) SHA1(573ecf2efaccf70e619cf54d63be9169e469ee6f), ROM_BIOS(0) ) // contains "May 07 2002 10:53:14 152-00932 MFLP International base ROM V1.3" and "Copyright (c) 2002 LeapFrog Enterprises, Inc."
ROM_SYSTEM_BIOS( 1, "us_2004", "US" )
ROMX_LOAD( "myfirstleappadbios.bin", 0x000000, 0x400000, CRC(19174c16) SHA1(e0ba644fdf38fd5f91ab8c4b673c4a658cc3e612), ROM_BIOS(1) ) // contains "Feb 13 2004.10:58:53.152-10573.MFLP US Base ROM - 2004" and "Copyright (c) 2004 LeapFrog Enterprises, Inc."
ROM_END
ROM_START( ltleappad )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF )
ROM_DEFAULT_BIOS("mar_10_2005")
ROM_SYSTEM_BIOS( 0, "mar_10_2005", "Mar 10 2005" )
ROMX_LOAD( "littletouchleappadbios.bin", 0x000000, 0x400000, CRC(13687b26) SHA1(6ec1a47aaef9c9ed134bb143c2631f4d89d7c236), ROM_BIOS(0) ) // contains "Mar 10 2005 07:01:53 152-11244" and "Copyright (c) 2002-2005 LeapFrog Enterprises, Inc."
ROM_SYSTEM_BIOS( 1, "germany", "Germany, Jan 11 2005" )
ROMX_LOAD( "leappad_little_touch_german.bin", 0x000000, 0x400000, CRC(39ee76a2) SHA1(34f1b6e075e10e14380d925944f4c84d068ec58e), ROM_BIOS(1) ) // contains "Jan 11 2005 10:45:42 152-11010 Full Base ROM: V1.0 - Germany"
ROM_END
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
CONS( 2001, leappad, 0, 0, leapfrog_leappad, leapfrog_leappad, leapfrog_leappad_state, empty_init, "LeapFrog", "LeapPad", MACHINE_IS_SKELETON )
CONS( 2002, mfleappad, 0, 0, leapfrog_mfleappad, leapfrog_leappad, leapfrog_leappad_state, empty_init, "LeapFrog", "My First LeapPad", MACHINE_IS_SKELETON )
CONS( 2005, ltleappad, 0, 0, leapfrog_ltleappad, leapfrog_leappad, leapfrog_leappad_state, empty_init, "LeapFrog", "Little Touch LeapPad", MACHINE_IS_SKELETON )
|