Při postupném rozšiřování firmwaru pro Cyberdeck mikro jsem narazil na nepříjemnou, ale vlastně očekávatelnou věc – začala docházet programová paměť. Firmware stále uměl jen několik základních funkcí, přesto už zabíral velkou část omezené flash paměti ESP32-S3. Bylo jasné, že pokud do něj budu dál přidávat všechny programy napevno, brzy nebude kam pokračovat.
Proto jsem se nakonec rozhodl vytvořit vlastní jednoduchý operační systém ve stylu klasického DOSu, doplněný o vlastní interpreter BASICu. Samotný systém a interpreter zůstanou ve flash, zatímco jednotlivé programy budou napsané v BASICu a uložené na SD kartě. Cyberdeck si je pak může načíst a spustit pouze tehdy, když jsou potřeba.
Interpretovaný BASIC je samozřejmě mnohem pomalejší než program přeložený přímo z C++, ale pro moje použití to stačí. Důležitější je, že mohu přidávat nové aplikace bez změny firmwaru a dokonce je psát přímo na Cyberdecku. Tak vznikl CyberDOS s vlastním interpretem CyberBASICu. Verze 0.2 je už dostatečně použitelná na to, aby si zasloužila samostatný článek.

Původní stavbu, mechanické provedení a zapojení najdeš v článku Cyberdeck mikro. Do hardwaru jsem nijak nezasahoval. Všechno nové vzniklo pouze v softwaru.
Proč programy přesunout na SD kartu
Původní firmware se po zapnutí spustil do grafického menu. Jednotlivé položky, jako byl sériový terminál, Wi-Fi scanner, poznámky nebo Mandelbrotova množina, byly napsané přímo v C++ a tvořily jednu velkou aplikaci.
To fungovalo dobře, dokud byl program malý. S každou další funkcí ale rostla obsazená flash a zdrojový kód se stával méně přehledný. Přidání nové aplikace navíc vždy znamenalo otevřít Arduino IDE, znovu přeložit celý firmware a přehrát ho do ESP.
CyberDOS tento princip obrací:
| Flash paměť ESP32-S3 | SD karta |
|---|---|
| CyberDOS a příkazová řádka | BASIC programy .BAS |
| Interpreter CyberBASICu | Poznámky a další textové soubory |
| Ovladače displeje, klávesnice a SD | Uložená skóre her |
| Obecné funkce pro grafiku, UART a Wi-Fi | Libovolné další aplikace |
Do flash se tedy nahrají funkce, které musí poskytovat systém. Konkrétní programy zůstávají jako obyčejné textové soubory na kartě. Novou aplikaci pak stačí zkopírovat na SD a není kvůli ní nutné znovu překládat firmware.
Je CyberDOS skutečný operační systém?
Přesně vzato nejde o plnohodnotný operační systém, jaký známe z počítače. CyberDOS nemá multitasking, ochranu paměti, samostatné procesy ani ovladače načítané za běhu. Je to firmware složený z příkazové řádky, souborových funkcí, interpreteru BASICu a rozhraní k hardwaru.
Z pohledu používání se ale jako malý retro systém chová. Po zapnutí se objeví příkazová řádka, lze pracovat se soubory, psát programy přímo na klávesnici, ukládat je, načítat a spouštět z SD karty. Cyberdeck tak může fungovat samostatně bez připojeného počítače, což byl hlavní cíl.
Start CyberDOSu
Po zapnutí se místo původního menu zobrazí kontrola základního hardwaru. Startovací obrazovka může vypadat například takto:

Na obrazovce tedy rovnou vidím napětí akumulátoru, stav klávesnice, dostupnost SD karty a velikost paměti vyhrazené pro BASIC program. Pokud karta chybí, shell i BASIC dál fungují v RAM, ale pochopitelně není možné program uložit ani načíst.
OLED v textovém režimu zobrazuje 21 znaků na osmi řádcích. Po zaplnění obrazovky se text posouvá vzhůru. Dlouhý vstupní řádek se posouvá vodorovně a šipkami vlevo a vpravo lze opravovat již napsaný text. Šipka nahoru vrátí poslední příkaz a klávesa Esc přeruší běžící program, čekání i nekonečnou smyčku.
Příkazová řádka
Prompt A:\> je záměrně inspirovaný starým DOSem. V aktuální verzi jsou k dispozici tyto základní příkazy:
| Příkaz | Funkce |
|---|---|
APPS | Vypíše napětí baterie a BASIC programy na SD |
DIR | Vypíše soubory a adresáře v kořenu karty |
TYPE SOUBOR.TXT | Zobrazí obsah textového souboru |
DEL SOUBOR.TXT | Smaže soubor |
CLS | Vymaže obrazovku |
MEM | Ukáže volnou RAM a velikost BASIC programu |
VER | Zobrazí verzi systému |
HELP | Vypíše dostupné příkazy |
BASIC | Otevře CyberBASIC |
RUN PROGRAM.BAS | Načte a spustí BASIC program |
REBOOT | Restartuje Cyberdeck |
Program lze spustit také pouze jeho názvem. Místo RUN MANDEL.BAS tedy stačí zadat:
A:\>MANDEL
CyberDOS zkontroluje, zda na kartě existuje soubor MANDEL.BAS, načte ho do interpreteru a spustí. Po ukončení se vrátí zpět do příkazové řádky.
CyberBASIC
Základem celého systému je vlastní jednoduchý interpreter BASICu. Do něj se vstupuje příkazem BASIC:

Program se zapisuje klasicky pomocí čísel řádků. Opětovným zadáním stejného čísla se řádek nahradí a zadáním samotného čísla se smaže.
10 PRINT "AHOJ Z CYBERDECKU"
20 FOR I=1 TO 5
30 PRINT I*I
40 NEXT I
50 END
Příkaz LIST program vypíše, RUN ho spustí a SAVE uloží na kartu:
>LIST
>RUN
>SAVE "MOJE.BAS"
SAVED.
>EXIT
Po restartu ho lze spustit přímo z DOSu:
A:\>MOJE
Příkazy bez čísla řádku se provedou okamžitě. CyberBASIC lze proto použít i jako jednoduchou kalkulačku:

Co umí verze 0.2
První verze CyberBASICu uměla hlavně numerické proměnné, výpočty, podmínky, smyčky a práci s číslovaným programem. Aby v něm šlo znovu vytvořit aplikace ze starého firmwaru, musela verze 0.2 dostat podstatně širší výbavu.
| Oblast | Příklady možností |
|---|---|
| Řízení programu | IF…THEN, GOTO, GOSUB, RETURN, FOR…NEXT, DELAY |
| Text | Řetězcové proměnné s $, spojování textu, LEN, LEFT$, RIGHT$, MID$, CHR$, STR$ |
| Matematika | MIN, MAX, INT, ABS, SIN, COS, SQRT, MOD |
| Grafika | SCREEN, PSET, LINE, BOX, TEXT, SHOW |
| Klávesnice | Okamžité čtení přes KEY() a režim KEYMODE |
| Soubory | Čtení a zápis textu, seznam adresáře, vytvoření složky a mazání |
| UART | Otevření portu, čtení, zápis a zavření |
| Wi-Fi | Asynchronní vyhledání sítí, SSID, RSSI, kanál a zabezpečení |
| Systém | Napětí baterie, čas od startu a práce s uloženým nastavením |
Grafický program může vypadat třeba takto:
10 KEYMODE 1
20 SCREEN 1
30 FOR X=0 TO 127
40 Y=31+INT(SIN(X/10)*20)
50 PSET X,Y
60 NEXT X
70 SHOW
80 K=KEY()
90 IF K<>0 THEN 120
100 DELAY 10
110 GOTO 80
120 END
Program nakreslí na OLED sinusovku a počká na stisk klávesy. Lze ho napsat přímo na klávesnici Cyberdecku, spustit a uložit bez počítače. Stejný soubor je ale možné vytvořit i v běžném textovém editoru na PC, protože .BAS nepoužívá žádný zvláštní binární formát.

Aplikace převedené ze starého firmwaru
Cílem verze 0.2 bylo dostat zpět všechny hlavní funkce původního Cyberdecku, tentokrát už jako samostatné BASIC programy na SD kartě.
| Program | Spuštění | Co dělá |
|---|---|---|
TERMINAL.BAS | TERMINAL | UART terminál s místním echem a podporou šipek |
POZNAMKY.BAS | POZNAMKY | Vytváření, prohlížení, úprava a mazání poznámek |
WIFI.BAS | WIFI | Vyhledání okolních Wi-Fi sítí a zobrazení síly signálu |
TESTKEY.BAS | TESTKEY | Zobrazení desetinného a hexadecimálního kódu klávesy |
MANDEL.BAS | MANDEL | Výpočet a vykreslení Mandelbrotovy množiny |
SDINFO.BAS | SDINFO | Kapacita karty, velikost souborového systému, volné místo a seznam souborů |
SETUP.BAS | SETUP | Kontrast, rychlost UARTu a časy ztlumení či vypnutí OLED |
Všech sedm aplikací dohromady zabírá pouze 8 024 bajtů zdrojového textu. Na kartě kvůli velikosti alokačních bloků fyzicky obsadí o něco více, ale z pohledu programu jde přibližně o 8 kB.



Původní funkce Cyberdecku jsou ve verzi 0.2 uložené jako samostatné BASIC programy.
Poznámky
Program vytváří složku /POZNAMKY, ve které ukládá běžné soubory .TXT. Umí založit novou poznámku, otevřít ji, posouvat text, upravit ji a smazat. Současný editor je záměrně jednoduchý a jedna poznámka může mít nejvýše 1 023 bajtů, což odpovídá maximální délce jednoho řetězce v CyberBASICu.

Wi-Fi scanner
Scanner pouze vyhledává okolní sítě. K žádné z nich se nepřipojuje a neukládá hesla. Na displeji ukáže SSID, sílu signálu v dBm a hvězdičkou označí zabezpečené sítě. Delším seznamem lze procházet šipkami.

UART terminál
Terminál používá piny TX 17 a RX 18 vyvedené na DA-15. Pracuje v režimu 8N1, podporuje rychlosti od 300 do 115 200 baudů a používá místní echo. Šipky odesílá jako běžné ANSI sekvence, takže se hodí například pro komunikaci s dalším mikrokontrolérem nebo sériovou konzolí zařízení s 3,3V logikou.

Mandelbrotova množina
U Mandelbrotu mě zajímalo, zda lze v BASICu udělat i něco výpočetně náročnějšího. Celý výpočet komplexních souřadnic i rozhodování o jednotlivých pixelech opravdu probíhá v interpretu, nejde o skrytou hotovou funkci napsanou v C++.
Program si vyžádá 10 až 999 iterací, průběžně zobrazuje stav výpočtu a po dokončení změří čas. Proti původní nativní verzi je pochopitelně pomalejší, ale jako zkouška funkčnosti interpreteru je mnohem zajímavější.

Porovnání rychlosti s původním firmwarem
Abych nezůstal jen u tvrzení, že je BASIC pomalejší, porovnal jsem obě verze přímo na Cyberdecku. Původní Mandelbrot byl součástí firmwaru a běžel jako přeložený program v C++. Nová varianta provádí stejný výpočet jako program MANDEL.BAS načtený z SD karty. V obou případech jsem postupně nastavil limit 10, 100 a 999 iterací.
| Maximální počet iterací | Původní firmware v C++ | CyberBASIC | BASIC byl oproti C++ pomalejší |
|---|---|---|---|
| 10 | 3,621 s | 27,396 s | 7,6× |
| 100 | 4,265 s | 137,979 s | 32,4× |
| 999 | 7,642 s | 1 183,77 s | 154,9× |
Při deseti iteracích trval výpočet v BASICu přibližně 27 sekund, tedy asi osmkrát déle než původnímu programu. Při 100 iteracích se rozdíl zvětšil na více než dvě minuty proti čtyřem sekundám. Nejvyšší nastavení 999 iterací pak CyberBASIC počítal 19 minut a 43,77 sekundy, zatímco verze v C++ byla hotová za 7,642 sekundy.
Rozdíl přitom neroste rovnoměrně. Zadaný počet je maximální limit pro jeden bod, ale body ležící mimo množinu výpočet často opustí dříve. Přeložený C++ kód běží na procesoru nativně, zatímco CyberBASIC musí stále dokola zpracovávat příkazy, výrazy, proměnné a smyčky. Čím více iterací obraz vyžaduje, tím výrazněji se režie interpreteru projeví.
Na malém černobílém displeji je navíc mezi 100 a 999 iteracemi na první pohled jen malý rozdíl. Nejvyšší hodnota proto slouží spíše jako zátěžová zkouška než jako praktické nastavení. Měření jsem pokaždé provedl jednou a beru ho jako praktické orientační porovnání, nikoli jako přesný laboratorní benchmark. Přesto dobře ukazuje cenu za možnost ukládat programy na SD kartu a upravovat je bez nového překladu firmwaru.



Mandelbrot v původním firmwaru při 10, 100 a 999 iteracích



Stejný test v CyberBASICu
První hra: Had
Jakmile fungovala verze 0.2, přidal jsem jako první úplně nový program klasického hada. Právě na něm se ukázala hlavní výhoda celé koncepce: firmware nebylo nutné vůbec měnit. Na kartu jsem pouze přidal soubor HAD.BAS a spustil ho příkazem HAD.
Herní plocha má 30 × 12 buněk. Had začíná se třemi články, za každou potravu získá jeden bod a po každých pěti bodech se trochu zrychlí. Ovládá se šipkami nebo pomocí WASD, klávesa P či mezerník zapíná pauzu.

Po skončení lze klávesou S uložit poslední skóre a rekord do textového souboru HAD.SCO. Klávesa V zobrazí hodnoty skutečně uložené na kartě. Bez potvrzení se výsledek nezapisuje, omezí se tím zbytečné zápisy na SD kartu.
Samotný had má 6 587 bajtů a obsahuje kompletní herní logiku, vykreslování, ovládání i práci se skóre. Do flash paměti ESP32-S3 přitom nepřidal ani bajt.
Instalace CyberDOSu 0.2
K překladu jsem použil Arduino IDE s balíčkem esp32 by Espressif Systems 3.3.10 a knihovnou U8g2 2.36.19. Knihovny Wire, SPI, SD a WiFi jsou součástí balíčku ESP32. Pro CardKB není potřeba další knihovna.
Postup nahrání:
- Rozbalit celý balíček CyberDOSu
- Otevřít soubor
CyberDOS/CyberDOS.ino - Vybrat desku
ESP32S3 Dev Module - Přeložit a nahrát firmware
- Obsah složky
SD_CARDzkopírovat do kořene FAT32 karty - Kartu vložit do vypnutého Cyberdecku a zařízení zapnout

Jako první zkoušku doporučuji zadat:
DIR
APPS
RUN TEST.BAS
Testovací program provede odpočet od deseti do jedné. Potom lze spustit některou z aplikací nebo přejít příkazem BASIC rovnou k vlastnímu programu.
Pozor: Příkaz
DELmaže soubor bez dalšího potvrzení a běhemSAVEneboWRITEFILEzařízení nevypínej.
Kolik paměti systém zabírá
Původní FW v.2.0 zabíral 970 kB flash paměti. První CyberDOS 0.1 bez rozšířených funkcí měl přibližně 413 kB a verze 0.2 po přidání řetězců, grafiky, souborových funkcí, nastavení, UARTu a hlavně knihoven pro Wi-Fi narostla na téměř 1 MB.
Na první pohled to může vypadat, že se problém s obsazenou flash vůbec nevyřešil. Rozdíl je v tom, co ten 1 MB obsahuje. Nyní je ve firmwaru obecný základ, který mohou používat libovolné programy na SD. Přidání hada, další hry nebo nové aplikace využívající stávající příkazy už velikost firmwaru nezmění.
Flash tedy stále není bezedná a každá úplně nová nativní funkce ji může zvětšit. Programy samotné se ale konečně oddělily od systému. Právě to byl hlavní smysl celé změny.
CyberBASIC si při startu vyhradí pro načtený program až 32 768 bajtů interní RAM. Druhý stejně velký blok slouží pro bezpečné načítání nového programu. Pokud je soubor chybný nebo příliš velký, zůstane dosavadní program v paměti nedotčený.
Bezpečnější ukládání na SD
Při ukládání se soubor nepřepisuje rovnou. CyberDOS nejprve vytvoří pomocný soubor s koncovkou .~new, znovu ho přečte a porovná délku i kontrolní součet. Teprve potom přejmenuje původní soubor na zálohu .~bak a nový přesune pod správné jméno.
Ani tento postup nedokáže z obyčejné FAT karty udělat dokonale odolné úložiště. Výrazně ale snižuje riziko, že chyba při zápisu zničí jedinou kopii programu. Pokud by po výpadku zůstal soubor .~new nebo .~bak, je nejlepší kartu otevřít na počítači, všechny varianty nejprve zkopírovat a až potom rozhodnout, která je správná.
Současná omezení
CyberDOS 0.2 je stále malý experimentální systém. Je dobré počítat hlavně s následujícími omezeními:
- Vždy běží pouze jeden BASIC program
- Konzole používá ASCII a nezobrazuje českou diakritiku
- Interpretovaný BASIC je pomalejší než stejný program napsaný v C++
- Jeden řetězec může mít nejvýše 1 023 bajtů a všechny řetězce dohromady 16 kB
- BASIC program může mít nejvýše 32 kB
- Wi-Fi umí zatím pouze hledat sítě, nikoli se k nim připojit
- Obecné příkazy pro externí I²C, SPI, GPIO a ADC zatím chybějí
- Neexistuje multitasking, podpora nativních programů ani automatický
AUTOEXEC.BAS
Pro malý displej a CardKB jsou některé limity spíše praktické než nepříjemné. Například 32 kB dlouhý BASIC program by se přímo na této klávesnici psal opravdu hodně dlouho.
Co bude dál
Nejzajímavější další krok bude zpřístupnit z BASICu rozšiřující port DA-15. Jakmile přibudou obecné příkazy pro GPIO, ADC, I²C a SPI, půjde Cyberdeck používat jako přenosný programovatelný nástroj pro testování modulů a hledání závad.
Hodit by se mohl také lepší textový editor, práce s adresáři přímo v DOSu, možnost automatického spuštění programu po startu a další hry. Zajímavé by bylo i připojení Bluetooth klávesnice nebo tiskárny.
Závěr
Původní Cyberdeck mikro byl hotové zařízení s několika zabudovanými funkcemi. S CyberDOSem se z něj stal malý programovatelný počítač. Nejdůležitější pro mě není samotný vzhled příkazové řádky, ale možnost napsat program přímo na jeho klávesnici, uložit ho na SD a později znovu spustit bez Arduino IDE.
Verze 0.2 už umí text, grafiku, soubory, UART, Wi-Fi scanner, nastavení i několik samostatných aplikací. Had navíc ukázal, že nový program lze opravdu přidat pouhým zkopírováním jednoho souboru na kartu.
CyberDOS zatím není hotový a 1MB obsazené aplikační oblasti připomíná, že i nový základ má své limity. Tentokrát ale další vývoj nemusí znamenat stále větší monolitický firmware. Pokud si vystačím s funkcemi, které už CyberBASIC nabízí, může počet programů růst prakticky jen podle místa na SD kartě.
