research projectoriginal firmware, unmodified

Real TV firmware,
drawing its own menus
on your PC.

This emulator runs the original, unmodified firmware of two Manta televisions, an MStar MSD309 set and a Sunplus SPHE8600 set. Every menu below was drawn by that firmware. Nothing is recreated in host code and nothing is patched.

Sunplus LED4202: main menu
2SoC families: MStar MSD309 and Sunplus SPHE8600
855 Moriginal MIPS instructions in the strict MStar connected boot
50distinct Sunplus menu screens reached by key presses
0bytes of firmware patched

Try it

Press keys on the remote

The Sunplus tab replays a recorded session. Each key moves along a transition the emulator actually made, from the frame on screen to the frame the firmware drew next. Keys that were never pressed from the current screen are dimmed. The MStar tab is a browser of captured screens.

This page does not run firmware. It plays back frames saved from real emulator runs. To run the firmware yourself, use the emulator from Get it.
Captured firmware frame
 

Boot walkthrough

From reset vector to menu

Step through each platform's boot stage by stage. Plain lines are the firmware's own UART output. Lines in [brackets] are emulator annotations. Timing is compressed.

screen off
press play

How it works

The firmware does the drawing. The emulator stays honest.

The emulator runs the firmware's own instructions and models the hardware those instructions talk to. A pixel can only reach the screen if the firmware asked the graphics hardware to put it there.

01 · INPUTFlash dumpThe SPI-flash image read from the TV board. It is used byte for byte and never patched.
02 · CPUMIPS coresMIPS32 (24KEc with DSP on Sunplus) plus the side cores: the PM51 and AVD 8051s and the TSP OpenRISC.
03 · HARDWAREPeripheral modelsTimers, interrupts, UART, SPI flash, I²C and the IR FIFO. Each model covers only what the code polls, with evidence behind it.
04 · GRAPHICSGE / GPU commandsFills, BitBlts and stretches decoded from the firmware's command streams into guest RAM.
05 · OUTPUTScan-outGOP windows (MStar) or OSD regions (Sunplus) are read back from emulated RAM and shown.

strict

Hardware behaviour that is not known stays unknown. The emulator returns no made-up register values, and the strict replay of 6,592,741 events must stay identical across changes.

exploratory

To get past a gap, a hypothesis can be switched on as an opt-in flag. It is labelled in the output and kept apart from verified results.

evidence

Each finding is written up in docs/ and evidence/, with checksums and save states that can be reproduced.

Platforms

Two very different TVs

Both sets are sold under the Manta brand, but inside they share almost nothing.

MStar MSD309 (Titania4)Sunplus SPHE8600
SetsManta LCD4214Manta LED4202, Shivaki STV-24LED14 (CV9202 boards)
Main CPUMIPS, plus 8051 PM and AVD MCUs and an OpenRISC TSP coreMIPS32 24KEc with the DSP ASE, single core
SoftwareMStar bare-metal runtime with the ZUI window/message toolkiteCos with DirectFB 1.1.0 and the "SUNPLUS GPU 1.0" driver
GraphicsGE (fill, BitBlt, stretch, keyed blend) into GOP windowsGPU command FIFO (fill, blit, stretch, colour key) into 8-bpp CLUT OSD regions
Furthest pointNO SIGNAL dialog, all main menus, factory, hotel and lock menus, USB playerFull main menu with all tabs, lists, value changes, languages and the source list

Sunplus SPHE8600

The second platform

The Sunplus image is an eCos kernel and a compressed application. Getting its menu on screen took a model of the GPU command FIFO, which is a 0x8000-byte ring with a lap bit, and the 8-bit CLUT palette in RAM. Keys go in through the firmware's own UI event queue.

A navigation session: menu, picture tab, picture-mode dropdown, selecting Standard
One navigation session, step by stepfirmware-drawn
Sound, Feature, Setup and Picture tabs
Sound, Feature, Setup and Picture tabsfirmware-drawn

Key events

These event IDs were found by probing the LED4202 image and are posted to the firmware's UI queue. The hardware IR path is not modelled yet.

MENU 0x1021
UP 0x1018
DOWN 0x1019
LEFT 0x101a
RIGHT 0x101b
OK 0x101c
EXIT 0x1043
SOURCE 0x1047
VOL+ 0x101f
VOL− 0x1020
POWER 0x1017
Why was the menu in Russian at first?

The language comes from the country stored in the flash dump's saved settings. That dump came from a set configured for Russia. Pointing a settings-only copy of the flash at another country gives the English menu, and the firmware's own language setting switches it live, to Polish for example.

Boot logos and the OSD bitmap atlas
Manta LED4202 boot logo
Manta LED4202 boot logo
Shivaki boot logo
Shivaki STV-24LED14 boot logo

The application image holds a table of 632 24-byte descriptors (data pointer, palette pointer, size, 8 bpp). This is the decoded contact sheet. A few entries still decode as noise because they use a different stride or format.

OSD bitmap atlas

Status

What works and what doesn't

PlatformWorksNot yet
MStar MSD309
  • Original firmware boots, and the real ZUI draws the OSD through GOP scan-out
  • MENU, SOURCE and INFO, plus factory, hotel and lock menus
  • USB player with an emulated stick
  • Virtual remote, Qt control centre and save states
  • Some GE blend, filter and dither details are labelled hypotheses
  • The live TV picture is synthetic
  • Peripheral coverage is partial
Sunplus SPHE8600
  • eCos kernel boots, with SPI flash and controller models
  • DirectFB 1.1.0 starts
  • GPU FIFO and palette decoded
  • Full menu navigation, language switch, source list and firmware dialogs
  • Display scan-out placement is guessed, and there is no video plane
  • The IR hardware path and settings persistence are not modelled
  • The "No signal" message has not been reproduced yet

Get it

Run it yourself

Windows builds are on the Releases page. The repository includes the firmware images used for testing, with hashes and a rights notice in firmware/README.md.

Download

Prebuilt emulator and the Qt control centre.

Releases

Clone

Source, docs, evidence and regression suites.

git clone https://github.com/vthreex/manta-emulator

Sunplus menu viewer

Opens a window and drives the menu from your keyboard.

python tools/sunplus/menu_viewer.py --runner sunplus_run.exe --kernel KERNEL --flash FLASH

FAQ

Is this a full TV emulator? Can I watch TV with it?

No. It runs the TV's software far enough that the menus and dialogs work. There is no tuner or video decoder model, so there is no broadcast picture.

Why not just recreate the menus in code?

That would be a mockup, not an emulator. The point is to show what the original firmware does. Any frame here is the firmware's own output, or it is clearly labelled when a hypothesis was needed to get there.

Why does the Sunplus TV boot so much faster?

It has a single MIPS core, and its boot polls far less unmodelled hardware. The MStar boot also runs the PM51, AVD and TSP side cores next to the MIPS core, and it polls many more peripherals on the way to its UI.

Who built it?

The project was directed, tested and published by v3x, and built together with AI coding assistants. OpenAI Codex did the first reverse-engineering phase. Claude (Anthropic, through Claude Code) did the work after that, and those commits carry a Co-Authored-By trailer.