🎮 PicoPad Arcade UF2 Patcher

Co to dělá

Vezme UF2 soubor s hrou z MakeCode Arcade (Raspberry Pi Pico target) a aplikuje binární patche které ho zprovozní na Pájeníčko PicoPad s ST7789 320×240 displejem.

Vstupní soubor stáhneš z MakeCode Arcade — vyber Raspberry Pi Pico jako target. Output (~2 MB) flashneš na PicoPad přes BOOTSEL drive.

📁 Přetáhni UF2 soubor sem nebo klikni pro výběr

arcade-*.uf2 z arcade.makecode.com (Raspberry Pi Pico target)

📋 Postup — jak flashnout output
  1. Drž tlačítko BOOTSEL na PicoPadu
  2. Připoj USB → na PC se objeví drive RPI-RP2
  3. Pusť BOOTSEL
  4. Zkopíruj patched UF2 na ten drive (přetažením v Průzkumníku, Finderu, atd.)
  5. Drive se odpojí, PicoPad se restartuje s patchovanou hrou

Pokud něco nefunguje: drž BOOTSEL znovu, flashni jiný UF2 (např. originální MakeCode UF2 nebo CircuitPython). Recovery jde vždy.

⚠️ Známá omezení
  • Hardcoded palette LUT — náš patcher zaměňuje grayscale init paletu za hardcoded MakeCode Arcade default paletu. Pokud hra mění barvy přes setPalette() (custom themed games, visual effects), uvidíš rozbité barvy. Většina běžných MakeCode demo her používá default paletu a funguje OK.
  • Konkrétní MakeCode Arcade verze — patcher hledá signatury runtime kódu na fixních adresách (0x10017190, 0x10013018). Pokud Microsoft vydá novou verzi runtime s posunutými symboly, signature check selže — patcher to nahlásí, ale UF2 z té verze nezpracuje.
  • Pouze 320×240 ST7789 displaye s PicoPad pin layoutem — CFG hodnoty (piny, MADCTL=0x40, MV=0) jsou specifické pro Pajenicko PicoPad. Pro jiný hardware s ST7789 by potřeba jiný setup.
  • Jen RP2040 — RP2350 by potřeboval jiné family ID a možná posunuté offsety.
🔧 Co patcher dělá technicky (4 binární patche)
  1. ST7789 init sekvence na flash 0x10017190 — Originální MakeCode firmware tam má 114-bytovou ILI9341 init sekvenci. Některé příkazy v ní (C0, C5, C7, B1, B6) ale na ST7789 znamenají jiné registry, takže panel skončí v divném stavu. Patcher tu sekvenci nahradí 23-bytovou minimální ST7789-friendly sekvencí: SWRESET → SLPOUT → COLMOD=0x55 → MADCTL → INVON → NORON → DISPON.
  2. Palette workaround na flash 0x10013018 — V CODAL ST7735.cpp je bug: v double16 módu se expPalette[16] inicializuje grayscale hodnotami přes ENC16(i,i,i) a nikdy se neaktualizuje ze skutečné palety hry → vše se renderuje fialově. Patcher přepíše 30-bytový init loop ARM Thumb kódem co zkopíruje hardcoded Arcade default paletu (LUT na 0x10080000) místo grayscale počítání.
  3. CF2 hardware konfigurace na flash 0x100FF000 — Zapíše 4 KB sektor s pin assignments PicoPad (BL=GPIO16, CS=21, atd.), DISPLAY_TYPE=9341 (ILI9341 path = aktivuje doubleSize=true scaling), MADCTL=0x40 (empiricky zvolená orientace), SPI 40 MHz, rozlišení 320×240, a sentinel CFG1=0xFFFFFF co řekne firmwaru aby přeskočil odeslání RGBCTRL příkazu.
  4. Monolithic UF2 layout — Výsledek je 2 MB UF2 s kontinuální flash adresací 0x10000000..0x100FFFFF. Mezery (~750 KB mezi firmwarem a CF2) vyplněné 0xFF. Tohle obchází RP2040-E14 — dokumentovaný silikonový bug RP2040 ROM (datasheet 2.8.4.2): "partially-filled sectors other than at the end may not be written correctly". Pico-sdk elf2uf2 v 1.3.1+ to dělá identicky.
🔒 Bezpečnost a privacy

Vše proběhne v prohlížeči. Vstupní soubor se nikam neuploaduje — patcher ho zpracuje lokálně v paměti a vrátí výstup k stažení.

Funguje offline — uložením stránky (Save Page As) vznikne self-contained HTML co spustíš bez internetu.

Open source — JavaScript kód patcheru je celý viditelný v page source. Zkopírujte si ho a auditujte sami.

No external dependencies — žádné knihovny, žádné fonty z CDN, žádný tracking.

⚠️ No warranty — patcher může v některých případech vyrobit nefunkční UF2 (zejména pro novější verze MakeCode Arcade runtime). Pokud by se PicoPad zasekl po flashe, drž BOOTSEL a flashni jiný UF2.

📚 Související dokumenty a reference

PicoPad Arcade Launcher

Experimentálně jsem také připravil launcher, který umožňuje patchovat a flashovat originální MakeCode UF2 soubory přímo z SD karty v PicoPadu.
Ukázka, jak Launcher funguje na X @MakerClassCZ