Jdi na obsah Jdi na menu
 


20. 1. 2019

BasicEngine - pidistroj s BASICem

BasicEngine - Marty

Začalo to tak, že jsem na říjnovém pražském Bytefestu 2018 seděl vedle Martina 'Martyho' Dejmala a zaujalo mě, s čím si to tam hraje. Byla to malá destička s kompozitním videovýstupem připojeným na TV, ke které měl připojenou PC klávesnici. Na tomto malém počítači běžel interpretr BASICu a Marty na něm předváděl i několik her s grafikou ve stylu SNES konzolí (Sokoban, Tetris a jakousi SHMUP střílečku). Tak jsem se seznámil s projektem BasicEngine. Nejprve jsem myslel, že jde o minikonzoli EUzebox, čili evropskou verzi Uzeboxu, na kterou jsem kdysi náhodou na internetu narazil. Ale bylo to nakonec úplně něco jiného. A myslím i lepšího :)

Martin na akci nabízel i několik barevných verzí plošáku pro stavbu této minikonzole. Tak jsem si od něj nakonec koupil jednu destičku, spolu s videoobvodem VS23S010D-L, který bývá hůře sehnatelný.

BasicEngine at Bytefest 2018

Destičku si od Martyho koupili také Zdeněk a Krupkaj z Atariklubu. Tak jsme se domluvili, že Zdeněk koupí součástky a nějak to společně dáme dohromady. Nakonec se mi to povedlo spájet během zbytku dovolené těsně po novém roce. A v prvních víkendech roku 2019 už jsem testoval první programy v BASICu. Což je u mě skoro zázrak. Jelikož často své projekty buď nedokončím nebo se realizace táhne celé roky. Děkuji Zdeňkovi, že mi píchl s nákupem těch součástek. Jinak by to nebylo hotové dodnes.

Pozadí projektu BasicEngine

Autorem projektu je Ulrich 'Uli' Hecht z MIT, který zde využil svých zkušeností se stavbou rozšiřujících kartridží pro systémy Famicom. Hledal nějaké optimální řešení malého a levného počítače s dostatečně velkou pamětí na programy a vestavěným interpretrem BASICu a tak vznikl tento projekt. Vestavěný Basic je kompilací projektu Tiny BASIC od Japonce, který si říká Tamakichi-san. Tento šikovný kutil implementoval původní Tiny Basic pro Arduino Uno od Japonce Tetsuya Suzuki na rozšířenou verzi původní desky Blue Pill s procesorem STM32 (Arduino s STM32). Celou historii svých dřívějších projektů popisuje Ulrich zde. Přehled autorů jednotlivých subsystémů BE lze vyvolat v BASICu příkazem CREDITS.

BasicEngine - Credits

Specifikace BasicEngine

Technické parametry zařízení jsou uvedeny na webu Ulricha Hechta a také na Martyho blogu.

Minipočítač je řízený procesorovým wifi modulem ESP-12, který obsahuje procesor ESP8266 se 4 MB flash paměti. Původní firmware v procesoru je kompletně nahrazený opensource firmwarem s interpretrem BASICu.

Obraz je generován videoobvodem VS23S010D-L, což je v podstatě SPI SRAM paměť s kapacitou 128 kB (1 Megabit) se sériovým a paralelním interfacem a integrovaným videořadičem displeje s kompozitním výstupem. Tento videoobvod je využitý např. i u projektu video shieldu pro Arduino.

Grafickou paměť kompletně zajišťuje videoobvod, takže pro uživatelský program v BASICu zůstává téměř celá paměť v procesoru ESP (asi 63 kB).

Součástky

Seznam potřebných i volitelných součástek je na stránce projektu spolu s odkazy na AliExpress a Marty vytvořil na svém blogu i vlastní seznam s objednacími čísly a přibližnými cenami pro objednávku u TME.

Zdeňkovi děkuji za přínosné postřehy a odkazy ohledně součástek, které zde nechám i pro ostatní:

Dnes večer, či začátkem noci jsem se poměrně krátce podíval na projekty využívající integrovaný generátor video signálu. Ve skutečnosti tato problematika asi potřebuje několik dní na prostudování, letmý pohled jeden den určitě nestačí.

Originální zdroj projektu má odkazy na součástky u prodejců, všechno kromě video obvodu na AliExpress tržiště, aby to bylo laciné. Ten VS23S010 asi číňané nezkopírovali, takže to ani nenabízí, jak jsem si sám vyzkoušel.

Snažil jsem se zjistil jaký je rozdíl u modulů ESP-12F a ESP-12, snad, ale nedal bych na to život, se liší jen tvarem antény na plošáku. Na schůzce jsem rozkládal rozumy, že je ESP zbytečné objednávat jinde než přímo v Číně, no ale z hlediska rychlé a jednotné objednávky jsem se přece podíval u TME. Tam vedou samotné IO a pak některé destičky s nimi, ale nikoliv požadované moduly. Zvažování nákupu tudíž nebylo nutné.

USB konektor pro připojení klávesnice není zrovna skladem. Není tak nutný, neb pro klávesnici je tam ještě PS/2, ale bude trochu pracnější asi dopájet jej později. Leč prostě není. Jestli se dá šikovně koupit někde jinde, mi známo v tuto chvíli není.

Krystaly koupil již Petr, dobrá práce, toto bych zrovna u EZK já třeba ani v jejich katalogu nenašel a přitom se zdá, že je to sedmina ceny (mají tam doprodej - velké slevy).

SMD odpory a kondenzátory jsou u EZK asi o třetinu levnější. Tudíž je objednám tam. Doposud jsem tak ale neučinil, já ještě nemám úplně jasno, co tam všechno budu chtít pro sebe dalšího.

! Bolavé místo - RCA konektory. Takové, co pasují do našich destiček, u TME nemají. Což bude důvod, proč nejsou uvedeny v seznamu u Martyho.

Se Zdeňkem a Honzou jsme také diskutovali o barvě RCA zásuvky pro audio výstup. Původní BasicEngine má tuto zásuvku zelenou. Což je barva používaná na zásuvkách pro stereojack u zvukových karet na PC. Ale v audio technice se používají barvy bílá pro levý kanál nebo mono (L/MONO) a červená pro pravý kanál (R). Alespoň to tak mám uvedeno u vstupů na mé herní TV. A jelikož má BasicEngine mono výstup zvuku, měla by být zásuvka pro zvuk bílá. V principu je to ale jedno. Šlo mi jen o dodržení barevného standardu.

Audio výstup je u BasicEngine realizován jednoduše pomocí PWM signálu (pulzně šířková modulace), který je generován na výstupu I2S obvodu ESP. Na desce je jen jednoduchý RC filtr, který výstupní obdélníkový signál převádí na odpovídající úrovně napětí pro reproduktor. Aneb jak sám autor uvádí v popisu historie vývoje projektu:

Boom, two capacitors and a resistor later we have sound! Total cost: three cents.

PS/2 zásuvku pro klávesnici jsem nakonec nesháněl, ale vyrobil si ji sám. Odpájel jsem dvojitou zásuvku (zelenou a fialovou) ze základní desky PC. Jsou bohužel obě v jednom plechu nad sebou. Takže jsem odstranil plech, vyjmul jen tu spodní fialovou, ostříhal nadbytečné plastové výstupky a krycí plech na zásuvku jsem sehnal ze staré grafické karty. Snad to bude držet pohromadě.

Making of PS/2 keyboard socketPS/2 Keyboard Socket Battle

Pájení součástek

Postup pájení je pěkně zobrazen na videu na stránce o hardwaru BasicEnginu. Z KiCadu jsem navíc vyexportoval do PDF rozmístění součástek na horní a spodní straně destičky. I když to není úplně nutné. Vše je pěkně předtištěné přímo na desce. Hlavně je nutné dodržet správnou orientaci integrovaných obvodů. Také jsem udělal nějaké náhledy ve 3D (níže).

BasicEngine PCB - top

BasicEngine PCB - bottom

Martyho poznámky k orientaci brouků a k pájení:

Orientace brouků je trochu zákeřná - nevím, kde to autor viděl, ale pin 1 patří tam, kde je označení součástky (tj. např. U5). Kupodivu je součástka jednou orientována popisem výrobce souhlasně s typem součástky na PCB a podruhé jinak. Takže doporučuju dávat bacha :D trochu mohou napovědět fotky mých kousků na webu: https://www.myslenka.net/projekty/basicengine-single-board-computer/

Držím palce s osazením, je to celkem snadné - pěkné cvičení na SMD pájení. Tady jedno moje video, sice z jiného projektu, ale stejná technika jde použít i na BE.

Během pájení jsem využil pájecí držák, se kterým jsem měl dobré zkušenosti během stavby rozbočovače sběrnice pro ZXS. Nepájel jsem obvody horkým vzduchem jako ve videu, ale pouze mikropájkou s regulací teploty (teplota kolem 230 stupňů). Měl jsem totiž obavy o zdraví obvodů při tak dlouhém nahřívání vysokou teplotou. Jediným problémem byl videoobvod, kde se mi udělalo několik cínových propojek mezi hustými vývody a musel jsem použít odsávací knot na jejich odstranění. Krycí plechy všech konektorů jsem připájel větším množstvím cínu, aby vydržely mechanické namáhání.

BasicEngine soldering

Oživení

Pro oživení je nutné nahrát do ESP firmware s BASICem. Je k tomu potřeba převodník USB-RS232 a alespoň 4-žilový propojovací kabel s dutinkami na koncích. Značení na pinech headeru J3 u BasicEnginu odpovídá značení na USB-RS232 převodníku. Takže je potřeba propojit odpovídající piny se shodným značením na obou stranách - TX s TX, RX s RX, DTR s DTR, GND s GND a případně i RTS s RTS, pokud jej má převodník vyvedený. Bez připojeného RTS jsem musel hledat "vhodný okamžik" pro reset BasicEnginu, aby se zahájila komunikace - viz dále. S RTS už si to hlídá samo a funguje to skvěle.

USB-RS232 converter

To značení pinů u J3 mě ze začátku zmátlo. Měl jsem původně dráty RX a TX prohozené, jelikož jsem se řídil tím, že signály mají být překřížené. Ale nefungovalo mi to. Nepočítal jsem totiž s tím, že značení signálů na desce už je přehozené. Jelikož signál DBG_RX z ESP jde na pin s označením TX, CTS jde na pin RTS, atd. Je to kvůli zjednodušení propojení BE s převodníkem. Aby to mohli snadno zapojit i lidé bez vyššího vzdělání :)

BasicEngine with USB-RS232 converter

Flešování jsem prováděl v Linux Mintu nástrojem esptool.py. Instaloval jsem to takhle:

sudo apt-get install pip
sudo python -m pip install esptool

Esptool se dá jinak nalézt na GitHubu. V README.md je podrobný popis použití i s příklady.

Takže jsem nejprve zkoušel nedestruktivní příkazy pro zjištění MAC adresy a informací o paměti flash:

esptool.py read_mac
esptool.py flash_id

Port "ttyUSB0" ani baudrate se uvádět nemusejí. Program si vše detekuje. Pokud tedy má PC jen ten jeden virtuální COM, tvořený převodníkem USB-RS232.

Pak jsem si stáhnul pro jistotu z ESP původní obsah celé flash paměti (4 MB) do souboru:

esptool.py read_flash 0x000000 0x400000 ESPflash-ori.bin

A nakonec jsem to riskl a zapsal ten FW s Basicem:

esptool.py write_flash 0x000000 ttbasic-0.88-alpha.bin

A BasicEngine žije a funguje na první zapojení. Jupííí! :) Dál už to bude jen samá zábava (snad).

Flashing with Esptool.py

BASIC

A nyní již k samotnému programování. Jak již bylo výše uvedeno, BASICový interpretr v BasicEnginu vychází z japonského projektu Tiny BASIC. Používá celoobrazovkový editor s odsazováním logických struktur a barevným zvýrazněním syntaxe. Je zde rozšíření o příkazy pro práci se souborovým systémem na SD kartě nebo ve flash paměti, jsou zde příkazy pro čtení a nastavování vstupů a výstupů z PSX ovladače a z univerzálního rozhraní J12 (viz schéma pinů headeru J12 níže). Což je hardwarově realizováno pomocí I/O extenderu PCF8575TS přes I2C komunikaci.

J12 Expansion Connector Pinouts

BASIC je díky videoobvodu VS23S010D-L dále rozšířen o příkaz pro nastavení jednoho z deseti grafických režimů (SCREEN) a příkazy pro práci s barvami. Původní Tiny BASIC na procesoru STM32F byl jen černobílý.

Zde je seznam dalších nadstandardních příkazů:

  • PROC - možnost tvorby procedur a funkcí s parametry, které lze poté volat příkazy CALL (procedury) nebo FN (funkce)
  • cykly DO-LOOP a WHILE, které jsou známé z vyšších programovacích jazyků
  • ošetření runtime chyb pomocí ERROR, ON ERROR GOTO a obnovení běhu programu pomocí RESUME
  • ON GOTO, ON GOSUB - vícenásobné větvení programu na základě hodnoty číselného výrazu za příkazem
  • EXEC - spustí program v BASICu jako child proces, který se po ukončení vrátí do parent procesu - možnost volání samostatných programů z jiných programů
  • GPRINT - výpis textu na pozici s přesností na pixely (lze psát mimo standardní znakové pozice)
  • BLOAD a BSAVE - nahrátí nebo uložení binárních dat do nebo z adresy paměti
  • OPEN, CLOSE, INPUT$, SEEK, LOC(), LOF() - práce se soubory (otevření, zavření, načtení řetězce, nastavení pozice, velikost souboru)
  • BG, MOVE BG, SAVE BG - práce s dlaždicovým grafickým pozadím (až 4 nezávislá pozadí)
  • SPRITE, MOVE SPRITE, ON SPRITE - práce se sprity, pohyb a detekce kolizí spritů
  • BLITE - blitter, čili kopírování obdélníkových částí obrazu v paměti, bez spolupráce procesoru (rychlé)
  • BORDER - možnost obarvit celý okraj obrazovky nebo jen jeho část (vertikální pruh)
  • PLAY - přehrátí skladby zapsané v MML formátu (Music Macro Language), podobně jako u TRS-80 "Coco"
  • SOUND - přehrátí tónu zvoleným nástrojem z tabulky nástrojů (wavetable synthesizer) - viz níže
  • SAY - přečte text (pouze anglicky a bez možnosti nastavení parametrů)
  • BOOT - možnost bootu systému z určené paměťové stránky ve flash paměti
  • CONFIG COLOR - možnost nastavit barvy u zvýrazňování syntaxe v listingu zdrojových kódů
  • CREDITS - zobrazí informaci o autorech jednotlivých subsystémů BasicEnginu
  • DATE, SET DATE, GET DATE, GET TIME - možnost nastavit a číst datum a čas za běhu programu
  • POKE, POKEW, POKED - uložení 8, 16 nebo 32-bitové hodnoty na zvolenou adresu paměti
  • PEEK(), PEEKW(), PEEKD() - obdoba výše uvedeného pro čtení hodnot z paměti
  • PROFILE - možnost zapnutí profileru pro zjištění zatížení procesoru u jednotlivých procedur a možnost optimalizace kódu
  • XYZZY - spustí program v Z-kódu (Z-machine, virtuální stroj) - většinou se používá pro textové adventury
  • EDIT - možnost editace souboru v ASCII editoru (je použit zkompilovaný linuxový editor "e")

Klávesové zkratky editoru "e" (stříška je klávesa CTRL):

^X    Konec
^S    Uložit jako
^T    Na začátek textu (obdoba CTRL+Home)
^O    Na konec textu (obdoba CTRL+End)
^Y    Smaže aktuální řádek
^Q    'kvótuje' následující znak (umožní do textu vkládat netisknutelné znaky)
^A    Jdi na řádek s číslem (nebo na začátek výběru, pokud není uvedené číslo)
^F    Najdi řetězec (case sensitive - rozlišuje malé a velké znaky)
^R    Nahraď řetězec jiným řetězcem
^N    Zopakuj poslední operaci hledání a nahrazení
^B    Označ začátek bloku
^E    Označ konec bloku
^C    Kopíruj označený blok na aktuální pozici
^V    Přesuň označený blok na aktuální pozici
^D    Smaž označený blok
^P    Ulož (zapiš) blok do souboru
^G    Vezmi (nahrej) blok ze souboru
^J     Stejné jako PgUp
^K    Stejné jako PgDn

- pro zrušení označení bloku vložte značku konce bloku na jeho začátek (^B^E) nebo před něj
- pokud držíte CTRL, tak dávejte pozor na kombinace jako 'tboed', apod. Mohlo by se vám něco nenávratně smazat...

Editor "e" je inspirovaný Norton Editorem ze systému DOS. Úplný manuál k editoru je v archívu s firmwarem ve složce "doc" (soubor e.README).

Při seznamování s BASICem jsem napsal pár programů, které testují grafické a zvukové možnosti BE. Jsou tam také nějaké předělávky původních programů. Vše je ke stažení v sekci Download níže.

První test je příklad použití příkazu BORDER pro efektní obarvování okrajů obrazovky. Držte klávesu šipka doleva. Část borderu se bude zprava zužovat a v pravé části zůstanou zachovány svislé pruhy aktuálních barev. Později lze použít šipku doprava pro opětovné rozšíření proměnné části borderu.

BasicEngine BORDER Test

Druhý program ukazuje možnosti příkazu SOUND pro přehrávání hudby pomocí nasamplovaných nástrojů wavetable syntetizéru. Volba 1 zobrazí přehled všech nástrojů ve zvukovém fontu (na SD kartě musí být v rootu soubor 1mgm.sf2). Volba 2 přehraje postupně ukázku zvuku všech nástrojů z tohoto zvukového fontu. Narazil jsem tu bohužel na limit. Asi po 67. nástroji se program zastaví s chybovým hlášením "Out of memory!". Ale do té doby to už stejně každý vypne :) Plánuji ještě dopsat možnost hrát zvoleným nástrojem na klávesnici jako na klávesách.

BasicEngine Wavetable Test Program

BasicEngine Wavetable Instruments List

Přiřazení hodnot note pitch u příkazu SOUND pro jednotlivé oktávy stupnice je na obrázku níže.

SOUND - note pitch values

V již zmíněném archívu s firmwarem ve složce "tests/GAMES" je spousta původních historických programů v BASICu. Jsou to zdrojáky původně napsané někdy v 70. letech v Microsoft Basicu. Jde vesměs o různé hry a programy v textovém režimu (bez grafiky). Po menších úpravách mohou běžet i na BasicEnginu.

Na zkoušku jsem upravil a počeštil program weekday.bas, který vám po zadání data narození zjistí, kdy půjdete do důchodu, sdělí vám který den v týdnu jste se narodili nebo vás upozorní na pátek třináctého, apod. Program jsem nazval kalendar.bas a dal jsem ho ke stažení v zipu zde, spolu s původní anglickou verzí.

Jo důchod, ten je ještě daleko

Další podobné programy lze opsat například z této knihy. Nebo z příruček k vašemu oblíbenému osmibitu, které mnozí máte doma. Hodně pěkných dobových knih a časopisů se dá také stáhnout ze serveru Archive.org.

Computer Spacegames - Monsters of Galacticon

Jakožto skalní Spectrista, jsem si na německém Amazonu pořídil tuto knížku. Tak z ní zkusím asi něco převést na BasicEngine.

ZX Spectrum Games Code Club

Založíme BasicEngine Games Code Club, ne? Dokonalý návrat na začátek programátorské éry :)

Jedna věc, která se může při převodech zdrojáků vyskytnout jako problémová je přítomnost definic funkcí (DEF FN) v původních programech. Ty je potřeba přemístit na konec zdrojáku za výkonnou část programu a místo DEF FN dát příkaz PROC. Jelikož definice funkcí v BasicEnginu nelze provádět přímo za chodu programu, ale procedury nebo funkce lze pouze volat pomocí CALL nebo FN.

Na webu projektu BasicEngine je podrobný manuál k BASICu.

Foto: Marty, Krupkaj, Pedros

Download:

BasicEngineTests.zip
kalendar-weekday_bas.zip

Odkazy:

Web projektu BasicEngine
Stránka o BasicEngine u Martyho, fotky
Historie projektu BasicEngine
Sestavení hardwaru, video pájení součástek
Popis práce s modulem ESP-12
Diskuze na Oldcompu

 

Náhledy fotografií ze složky BasicEngine

Komentáře

Přidat komentář

Přehled komentářů

back to basic

Tomas, 9. 11. 2020 12:08

Dekuji za skvely clanek. Asi to zkusim take sestavit.

Re: back to basic

PedroS, 9. 11. 2020 17:06

Díky, jdi do toho!
Já teď musím doma hlavně už dodělat tu kuchyň, ať mám kde umývat nádobí... :-)

Pěkné

Jirka, 22. 1. 2019 9:09

Dobrý článek. "Palec hore"
Už dlouho mám otevřené záložky v prohlížeči s tímto projektem a mám čím dál větší strach, že se do toho taky pustím :-)
Jenže tím bych si vyrobil další požírač času. A ty mě tady zase pokoušíš :-)
Díky za počtení.

Re: Pěkné

PedroS, 22. 1. 2019 15:49

Díky za koment! :)
Jo, chápu, těch požíračů času je dnes fakt hodně. Člověk neví, čím se bavit dřív. Já využil Vánoc, protože jinak toho času na hraní doma taky moc nemám (hraju si většinou venku...). Ale čím víc si o tom čtu, tím víc mě tento projekt fascinuje. Tak jsem si řekl, že když už jsem to dal dohromady, tak se o ty informace podělím. Aby byli v obraze i ti, kteří nebudou mít na jeho realizaci čas.
Jinak, jdi do toho, je s tím sranda :)