Skip to content

Firmware Version History

visrealm edited this page Sep 6, 2026 · 4 revisions

Every published PICO9918 firmware release, newest first, plus the version in development, and a table of which release each setting first appeared in. This is the firmware counterpart to Hardware > Revision History - board revisions and firmware versions advance independently and share no numbering.

All releases and their .uf2 and configurator ROM downloads live on the Releases page. See Firmware for how to install one.

Which version am I running?

Four ways, in order of convenience:

  • The boot splash. The logo that slides into the lower border at power-on has the version baked into it - PICO9918 v1.2.0. It holds for about three seconds. Builds made with PICO9918_NO_SPLASH have no splash at all.
  • The performance diagnostic overlay, FWVER row - see Diagnostic Overlays > Performance Overlay. That row exists from v1.0.3 onwards.
  • The native configurator's info screen, which prints Firmware version alongside the hardware and F18A versions. Present since the configurator itself, v1.0.1. See Configurator > Native Configurator.
  • Config bytes 2 and 3 if you are reading the device from host software: byte 2 packs major and minor as one nibble each, byte 3 holds the patch number. See Configuration Byte Map.

The web configurator is not one of them. It always targets the newest firmware and displays that version, regardless of what the connected device is running.

Important

"v2.0" is a board revision, not a firmware version. The PICO9918 PRO is hardware v2.0; the newest firmware release is v1.2.0. There is no v2.0 firmware, and one universal .uf2 covers every board from v0.3 to PRO v2.0.

Release History

v1.3.0 (unreleased)

Not released. This work lives on a branch and none of it is downloadable. It is listed because the settings table below stamps a config byte with it; every other entry on this page describes shipped firmware.

The largest F18A release since F18A support arrived. Every display mode now runs through one shared tile pipeline instead of carrying its own special case, so features that existed in only some modes exist in all of them, and the shared path is faster than the per-mode code it replaced.

  • Tile layer 2, horizontal and vertical scrolling, Enhanced Color Mode and position-based attributes in every display mode: Graphics II, Multicolor and 40-column text included, where before they reached only Graphics I and 80-column text
  • 80-column text at eight bits a pixel on the PICO9918 PRO, which brings the tile palette select, ECM and the bitmap layer to TEXT80. Four bits a pixel cannot carry those, so it is a PRO capability; the RP2040 board keeps the packed 80-column line
  • Scanline interrupts become an interrupt source of their own, enabled by R0 bit 4 and latched in status register 1 until the host reads it, instead of borrowing the frame flag and R1's interrupt enable
  • Faster per-scanline rendering in every mode, faster GPU execution on the PRO, and GPU block copies that no longer move a byte at a time
  • A RENDER row on the performance overlay, giving the average per-scanline render time in microseconds beside the frame time, and a redrawn overlay font
  • F18A behaviour fixes: the backdrop and 40-column text take the tile palette select; a text cell above an ECM0 layer draws as the ECM tile it is; text takes no vertical page swap; the bitmap layer's row stride rounds up, so a layer whose width is not a multiple of four pixels stops reading each row from the wrong address; a locked device masks a register write above R7 to three bits and aliases it onto R0-R7 rather than ignoring it; SR0 reports a fifth-sprite number of 0 where there is no fifth sprite
  • GPU fixes: PIX addresses the bitmap layer the way the F18A does, SLC executes with an immediate shift count above 3, DMA reads a width or height of 0 as 256 and wraps a transfer that runs past the end of the 64 KB map, and a palette write from a GPU program now reaches the picture
  • The resident GPU program image is dropped. It is an SPI flash command server, and there is no SPI flash here to serve, so four of its five handlers could never do anything and the fifth duplicated the DMA engine. No configurator ROM or released software used it
  • The TMS9918A and F18A emulation is published as pico9918-core, a library in its own right for emulator authors. The firmware builds the same code, so this changes nothing about the device
  • The host bus PIO programs are byte for byte v1.2.0's, so nothing here changes bus timing. The host interface work is v1.2.1's, on a separate branch

v1.2.0 (2026-07-12)

The first release with SCART RGB support out of the box.

  • Correct SCART interlaced timing, and boot-time auto-detection of the SCART AV Dongle
  • Output driver selection - Auto (default), VGA/HDMI or SCART - and a SCART display mode switch between PAL RGBs 576i @ 50 Hz and NTSC RGBs 480i @ 60 Hz
  • Display and clock changes now go through a confirm-or-roll-back flow - the setting is applied on the next boot and reverts unless you re-open the configurator and confirm it
  • Configurator refuses to run against firmware older than it supports, and offers the upgrade instead
  • Minor GPU performance improvements, and build configuration moved to an optional local pico9918_config.cmake

v1.1.1 (2026-04-18)

  • Added device mode - matches the GROMCLK and CPUCLK pin behaviour to the specific TMS9918 family part being replaced, without cutting a jumper. Web configurator only. See Device Mode Configuration
  • Fixed visual glitches on some machines in 48- and 60-row modes
  • Added the EGA palette preset; fixed the web configurator's .uf2 block count and TI-99 bank count rounding

v1.1.0 (2026-04-03)

First release supporting the RP2350-based PICO9918 PRO.

  • PICO9918 PRO (RP2350) support, with hardware detection and device info in the configurator
  • One combined .uf2 for both RP2040 and RP2350 boards - filenames lose the per-output suffix here (pico9918-v1-1-0.uf2)
  • Configurator ROMs likewise carry firmware for both, so a single ROM updates either board
  • First "lite" (settings-only) configurator ROMs, for the TI-99/4A, MSX and ColecoVision
  • Interrupt timing fixed for better compatibility on some systems; diagnostics screen timeout extended to 15 seconds
  • Fixed sprite collision firing when sprites moved off the right edge, and a multi-page glitch with the colour table at 0xX800

v1.0.3 (2026-02-15)

  • 48- and 60-row modes (R0 bit 0x08)
  • Opaque sprites (SAT entry bit 0x10, when global 16px sprites are enabled)
  • Optional palette reset on the register reset command (write 0xC0 to VR(0x32))
  • Firmware and hardware versions added to the performance diagnostic overlay, and automatic overlays now disappear once the host enables the display
  • TEXT80 rendering performance improvements; palette presets added to the configurator
  • Fixes: T1-layer position-based attributes with multiple pages, v0.3 hardware detection, sprite Y-flip off-by-one, ECM sprites using base palette 0, and a debounced host bus interface

v1.0.2 (2025-10-06)

  • Fixed VRAM read/write 16 KB rollover (ColecoVision Konami Ping Pong), and improved host read performance (ColecoVision Buck Rogers Super Game corruption)
  • SG-1000/SC-3000 configurator builds; macOS builds; CI builds for firmware and configurators

v1.0.1 (2025-05-04)

The first unified firmware-plus-configurator release, tagged v1.0.1a and labelled beta at the time. This is where software configuration begins.

  • Firmware updates and settings changes from the retro machine itself, via the native configurator
  • Configurable scanlines, maximum sprites per scanline, clock speed, diagnostic overlays and default palette
  • Auto-detects v0.3 / v0.4 / v1.0+ hardware and adapts, so one image fits all boards
  • F18A compatibility mode enabled by default; configurator ROMs for TI-99/4A, ColecoVision and MSX, settings-only for NABU and SG-1000

There is no published v1.0.0. The settings table below stamps the first configurable settings as 1.0.0 because that was the in-development version they were written under; v1.0.1 is the first release anyone received them in.

v0.4.x (2024-08 to 2025-03)

Pre-configurator firmware. These builds had no persistent settings, so options such as scanlines, SCART output and PCB revision were separate .uf2 files chosen at download time. Upgrading from any v0.4.x build to 1.x requires flashing over USB - the configurator's own updater needs 1.0.0 or newer already on the device.

Release Date Notes
v0.4.4 2025-03-30 Fixed write-PIO timing on the CreatiVision and potentially other machines
v0.4.3 2024-10-19 SCART RGBs NTSC 480i and PAL 576i builds; reverted the faster read PIO after MSX problems
v0.4.2 2024-10-09 80-column fixes; Pico SDK 2.0.0; more than 4 sprites per scanline by default
v0.4.1-f18a-preview1 2024-10-09 Pre-release. First public F18A support: ECM tiles and sprites, second tile layer, bitmap layer, position-based attributes, TMS9900 GPU core
v0.4.1 2024-08-21 Status register responsiveness; VGA scale multiplier fix
v0.4.0 2024-08-04 First release for the integrated v0.4 board

v0.3.x (2024-06 to 2024-07)

The original piggy-backed Pi Pico releases, for the v0.3 board only. v0.3.1 (2024-07-12) moved the host bus interface from GPIO interrupts to PIO - the change the whole design still rests on - and cut the binary to about 26 KB. v0.3.0 (2024-06-25) was the first public firmware.

Other unreleased work

Neither v1.3.0 above nor anything here has shipped, and none of it is downloadable yet.

  • v1.2.1 is a maintenance release for the host bus interface, addressing intermittent failures on specific machines. A lite (settings-only) configurator ROM for the CreatiVision is planned with it; no CreatiVision ROM has appeared in any release so far.
  • Separately, and not a branch matter: the cycle tables on Host Bus Timing were derived from a development state that predates v1.2.0, and do not describe any release. That page says so at the top.

Settings by First Version

Each configurable byte carries the version it was introduced in: configFields[] in src/config.c, and pico9918_config_fields[] in core/src/pico9918_config.c from v1.3.0, where the table moves into the emulation core. This is what the firmware uses to decide what to migrate, so it is the authoritative answer to "can my firmware do this?".

Setting Config byte First version
CRT scanline effect 8 1.0.0
Sprites per scanline (4 / 8 / 16 / 32) 9 1.0.0
Clock preset 10 1.0.0
Register diagnostic overlay 17 1.0.0
Performance diagnostic overlay 18 1.0.0
Palette diagnostic overlay 19 1.0.0
Address diagnostic overlay 20 1.0.0
Device mode (GROMCLK / CPUCLK behaviour) 12 1.1.1
SCART display mode (PAL 576i / NTSC 480i) 11 1.2.0
Output driver preference (Auto / VGA / SCART) 13 1.2.0
VGA mode 14 1.2.0
Render base (TMS9918A / V9938) 15 1.3.0

The 16 custom palette entries (bytes 128-159) are not version-stamped - they are validated on their own terms and carry across every upgrade.

Byte 15 is the one entry above that nothing can set. v1.3.0 claims it and stamps it, so a unit upgrading from any older release has it written fresh at the TMS9918A base rather than inheriting whatever was there, and reserves it for the V9938 render base planned for v2.0.0. No configurator exposes it and no firmware acts on its value yet.

Note

A setting newer than the firmware you upgraded from is written fresh at its default, not carried over. Coming from pre-v1.2.0, expect SCART mode, output driver preference and VGA mode to be at defaults; coming from pre-v1.1.1, device mode resets too. Everything older survives. See Firmware Architecture > Configuration Storage.

Related

Clone this wiki locally