CyberDOS 0.2 – vlastní DOS a BASIC pro Cyberdeck mikro

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.

Cyberdeck mikro po spuštění vlastního systému CyberDOS 0.2

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-S3SD karta
CyberDOS a příkazová řádkaBASIC programy .BAS
Interpreter CyberBASICuPoznámky a další textové soubory
Ovladače displeje, klávesnice a SDUložená skóre her
Obecné funkce pro grafiku, UART a Wi-FiLibovolné 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:

Při startu CyberDOS zkontroluje klávesnici, SD kartu a vyhradí paměť pro BASIC

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říkazFunkce
APPSVypíše napětí baterie a BASIC programy na SD
DIRVypíše soubory a adresáře v kořenu karty
TYPE SOUBOR.TXTZobrazí obsah textového souboru
DEL SOUBOR.TXTSmaže soubor
CLSVymaže obrazovku
MEMUkáže volnou RAM a velikost BASIC programu
VERZobrazí verzi systému
HELPVypíše dostupné příkazy
BASICOtevře CyberBASIC
RUN PROGRAM.BASNačte a spustí BASIC program
REBOOTRestartuje 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.

OblastPříklady možností
Řízení programuIF…THEN, GOTO, GOSUB, RETURN, FOR…NEXT, DELAY
TextŘetězcové proměnné s $, spojování textu, LEN, LEFT$, RIGHT$, MID$, CHR$, STR$
MatematikaMIN, MAX, INT, ABS, SIN, COS, SQRT, MOD
GrafikaSCREEN, PSET, LINE, BOX, TEXT, SHOW
KlávesniceOkamž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í
UARTOtevření portu, čtení, zápis a zavření
Wi-FiAsynchronní vyhledání sítí, SSID, RSSI, kanál a zabezpečení
SystémNapě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ě.

ProgramSpuštěníCo dělá
TERMINAL.BASTERMINALUART terminál s místním echem a podporou šipek
POZNAMKY.BASPOZNAMKYVytváření, prohlížení, úprava a mazání poznámek
WIFI.BASWIFIVyhledání okolních Wi-Fi sítí a zobrazení síly signálu
TESTKEY.BASTESTKEYZobrazení desetinného a hexadecimálního kódu klávesy
MANDEL.BASMANDELVýpočet a vykreslení Mandelbrotovy množiny
SDINFO.BASSDINFOKapacita karty, velikost souborového systému, volné místo a seznam souborů
SETUP.BASSETUPKontrast, 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++CyberBASICBASIC byl oproti C++ pomalejší
103,621 s27,396 s7,6×
1004,265 s137,979 s32,4×
9997,642 s1 183,77 s154,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í:

  1. Rozbalit celý balíček CyberDOSu
  2. Otevřít soubor CyberDOS/CyberDOS.ino
  3. Vybrat desku ESP32S3 Dev Module
  4. Přeložit a nahrát firmware
  5. Obsah složky SD_CARD zkopírovat do kořene FAT32 karty
  6. Kartu vložit do vypnutého Cyberdecku a zařízení zapnout
Nastavení desky v Arduino IDE

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 DEL maže soubor bez dalšího potvrzení a během SAVE nebo WRITEFILE zaří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ě.

Související články

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *