An emulator for the VTech MobiGo (2010), a handheld learning console built around a GeneralPlus u'nSP system-on-chip.
MobiGoEmu is not affiliated with VTech. "MobiGo" is VTech's trademark and is used here only to say which console this emulates.
Early work in progress: a window with sound, the touch screen, the keyboard and the pad.
- The u'nSP CPU core is checked against MAME on about 30,000 single-instruction tests (docs/CPU.md).
- The system ROM boots through the VTech and MobiGo logos to "Please insert a cartridge".
- The slide-out keyboard, the touch screen, the pad and the Enter, Exit and Help buttons work. All six cartridges tried so far take a name and reach their title screens and main menus, some of them their games: Chuggington (GER), Disney Planes (GER), Ben 10 Ultimate Alien (GER), Disney Mickey Mouse, Disney Jake and the Neverland Pirates (English), The Penguins of Madagascar - Mission Madness (English).
- The save EEPROM sits in the console and is shared by every cartridge; the window keeps it in a file.
- Sound: the 32-voice wavetable SPU, with the ADPCM36 format worked out from the cartridges' samples. A third of its 30 prediction filters are measured exactly; the others are estimates, so some sounds may come out slightly off until they can be checked against a real console.
- Still to come: the Spanish system ROM (it waits on a device not emulated yet).
See docs/RECON.md for what is known about the hardware and TODO.md for the plan.
This repository contains no BIOS, game code or cartridge data, and never will. You need dumps of a console and cartridges you own.
| File | Size | CRC32 | SHA-1 | Notes |
|---|---|---|---|---|
| MobiGo system ROM | 8 MiB | 49479bad |
4ee82c7ba13072cf25a34893cf6272f2da5d8928 |
firmware with built-in content |
| MobiGo system ROM (Spanish) | 2 MiB | 462b4f9d |
1541152f1a359bc18de4d4f3d5038a954c9a3ad4 |
smaller firmware revision |
Cartridges are 16 MiB images and are identified by the CRC32 values in MAME's
mobigo_cart software list.
MSYS2 MinGW 64-bit with mingw-w64-x86_64-gcc, mingw-w64-x86_64-cmake and
mingw-w64-x86_64-ninja:
cmake -S . -B build -G Ninja
cmake --build build
With mingw-w64-x86_64-SDL2 installed the build has a window; without it, only the headless
runner.
build/mobigoemu opens a window: drop a cartridge on it (.bin, or a .zip with one), or
click to choose one. The system ROM is looked for as mobigo.bin or MAME's mobigo.zip beside
the program, beside the cartridge or in its parent folder, else the program asks for it once
and remembers it in mobigoemu.ini. The console's save EEPROM is kept in saves/mobigo.eep
(one for all cartridges, as on the console).
| MobiGo | PC |
|---|---|
| Touch screen | the mouse (left button is the pen) |
| Pad | arrow keys, or a game controller's pad or stick |
| Enter button | Right Ctrl, keypad Enter or keypad 0; controller A or Start |
| Exit button | Esc; controller B or Back |
| Help button | F1; controller X or Y |
| Keyboard | the letters, Enter, Backspace, Space, Caps Lock; Tab is the symbol key, Num Lock the number lock, Home and End the cursor keys, / the Help key; the digit keys play Num Lock and the key of the top row |
Since the mouse is the pen and every part of the screen takes touches, the toolbar stays out of the way. It shows for a few seconds at startup and whenever the console is paused. Otherwise it comes up when the pointer reaches the top edge of the picture, and goes away shortly after the pointer leaves it. Only its buttons take clicks; the rest of the bar still works as the pen.
| Button | Key | |
|---|---|---|
| cartridge | Ctrl+O | open a cartridge (or drop it on the window) |
| pause | F8, Pause | pause and resume |
| reset | F5 | restart the console (the cartridge stays) |
| camera | F12 | screenshot, in screenshots/ |
| 1x / 2x ... | Ctrl+plus, Ctrl+minus | window size |
| full screen | F11, Alt+Enter | full screen and back |
| speaker, slider | mute, volume (the mouse wheel works on them too) |
Ctrl+Q quits. The volume and the window size are remembered in mobigoemu.ini.
For reverse engineering, --frames runs without a window and reports where the CPU spends its
time:
build/mobigoemu mobigo.bin --frames 600 -v
build/mobigoemu mobigo.bin cartridge.bin --frames 1200 --screenshot shot.png
Input for the headless runner is scripted by frame number: --type samu@420 types a name,
--tap 160,190@620 touches the screen (--tap X0,Y0-X1,Y1@F+N drags), --key enter@700
presses a key (up, down, left, right, ok, exit, help, the letters, enter,
space...; all names in src/mobigo.c), --shot 900 menu.png saves a frame,
--wav sound.wav records the sound and --eeprom console.eep keeps the saves between runs.
tools/unsp_dis.py is a small u'nSP disassembler used for the reverse engineering work:
python tools/unsp_dis.py mobigo.bin 0xF000 64
Addresses are in 16-bit words; word N is at byte 2*N in the image.
To AustinRichardson29, who preserved MobiGo cartridges on the Internet Archive, including the German titles this work was tested with.
MIT. See LICENSE.
