ESP8266 brána pro ZX Spectrum

Tu kaBel nebo taky když už je USB USBC tak co třeba USA

ZX Spectrum se dostane na internet jen po dvou drátech: místo kazetového magnetofonu je do konektoru MIC připojený modul ESP8266. Po stejné lince, po které se kdysi nahrávaly hry z kazety a na kazety, teď běží obousměrný terminál se 40 znaky na řádek, rychlostí asi 120 bajtů za sekundu tam i zpět a bez chyb.

Princip: dva vodiče místo kazety

Spectrum má pro magnetofon zvlášť zvukový vstup a výstup a obojí kupodivu vede na konektor MIC (v některých verzích ZX je to jinak, nutno vyzkoušet). ESP8266 se na něj připojí jedním signálovým vodičem a zemí. Na straně ESP stačí jeden pin (GPIO13 – zase nutno zkoušet), který se přepíná mezi vstupem a výstupem podle toho, kdo zrovna vysílá.

  • ESP → ZX: ESP nastaví pin jako výstup a vysílá pulzy. Spectrum je čte stejně, jako by hrála kazeta: bit 6 portu $FE.
  • ZX → ESP: ESP pin přepne na vstup a v přerušení si zapisuje čas každé hrany. Spectrum vysílá bitem 4 portu $FE, který na modelu 48K vede na stejný konektor MIC.
  • Mluví vždy jen jeden. ESP řídí linku: pošle paket a čeká na odpověď. Spectrum samo nikdy nezačne, takže se signály nikdy nesrazí.

ESP8266 je jediný prostředník: se Spectrem mluví po dvou drátech konektoru MIC, s internetem přes WiFi. PC přes USB/Serial je potřeba jen pro nahrání programu a ladění.

Jak se terminál dostane do ZX

Terminál se nahraje úplně obyčejně, příkazem LOAD "". ESP se tváří jako magnetofon a přehraje nahrávku ve standardním formátu ROM: piloty 2168 T, synchronizační pulzy 667 a 735 T, bity 855 a 1710 T.

  1. Na Spectru se napíše LOAD "" a Enter.
  2. ESP pošle BASIC zavaděč s názvem ESPtermT11 a za ním strojový kód terminálu (asi 3 KB).
  3. Kód běží od adresy $E000 se zakázaným přerušením. Písmo široké 6 bodů pro 40 znaků na řádek si vyrobí z ROM fontu a uloží na $F000.
  4. ESP se zeptá na verzi. Když na ZX běží starší terminál, pošle mu příkaz k návratu do BASICu a nahraje nový.

BASIC zavaděč má na konci řádek s LOAD "". Když terminál skončí nebo se po hře Spectrum resetuje, stačí znovu LOAD "" a ESP terminál nahraje samo.

Hranový protokol: měří se jen čas mezi hranami

Vstup MIC je střídavě vázaný, takže ustálená úroveň se ztrácí a spolehlivě projdou jen změny. Proto obě strany přenášejí informaci délkou intervalu mezi dvěma hranami, ne úrovní signálu. Krátký interval je bit 0, dlouhý bit 1.

Jeden bajt je jeden rámec:

  1. Piloty: několik stejně dlouhých intervalů, podle kterých se přijímač zachytí.
  2. SYNC: jeden výrazně delší interval, který označí začátek dat.
  3. 8 datových bitů, nejvyšší bit první.
  4. Sudá parita: devátý bit, který odhalí jednu chybu v rámci.

Oba směry mají jiné časy, protože každá strana měří jinak. Spectrum počítá smyčkou o 45 T-stavech, tedy po 12,9 µs. ESP má přesný čítač mikrosekund.

Směr a nastaveníPilot (µs)SYNC (µs)Bit 0 (µs)Bit 1 (µs)
ESP → ZX (E3, vždy)16045080200
ZX → ESP výchozí (P4)–38199173
ZX → ESP rychlé (P5)–2036199

Spectrum vysílá časovací smyčkou: jeden interval trvá 26 × DE + 85 T-stavů.

Naměřená rychlost a spolehlivost

S rychlým nastavením (ZX → ESP P5, ESP → ZX E3) linka přenese asi 120 bajtů za sekundu tam i zpět a při dlouhých testech nevznikla žádná chyba. To je zhruba 3 řádky po 40 znacích za sekundu.

TestDobaVýsledek
Seznam WiFi sítí tam a zpět, WiFi zapnutá30 min214 500 B, 0 chyb, 0 opakování
ČT teletext stránku po stránce183 stránek0 neshod
ESP → ZX rychlejší E4 (bit 0 60 µs), WiFi připojená–1,8 % opakování, proto zůstává E3
ESP → ZX E3, WiFi připojená–0,4 % opakování

WiFi běžící na pozadí příjem v ESP trošku ruší. Rychlost omezuje také měření na Spectru: smyčka o 12,9 µs potřebuje intervaly aspoň kolem 60 µs, aby bezpečně rozlišila bit 0 a 1. ZX vysílá ještě rychleji, protože ESP měří s přesností na mikrosekundy.

Používání

Po zapnutí se ESP připojí k uložené WiFi a čeká, až na Spectru poběží LOAD „“. Terminál se nahraje za několik sekund a ukáže výzvu >> . Každý napsaný znak se hned vrací z ESP jako ozvěna, takže na obrazovce je vidět, co opravdu dorazilo.

Stavová lišta v horním řádku má 32 znaků:

ESPterm3.02 CAPS 40 VIDEO 123k/99
  • CAPS svítí, když je zapnutý CAPS LOCK.
  • 40 nebo 32 je počet znaků na řádek.
  • 123k/99 je počet přenesených bajtů a za lomítkem počet chyb, které bylo nutné opakovat.
KlávesyCo udělají
CAPS SHIFT + 2 CAPSCAPS LOCK zapnout / vypnout
CAPS SHIFT + 3 TRUEpřepnout 32 / 40 znaků na řádek (obrazovka se nemaže, jen se odřádkuje)
CAPS SHIFT + 4 INVbarvy: bílá obrazovka s černým písmem, nebo obráceně
CAPS SHIFT + 1 EDITanalýza spojení: statistiky obou směrů
CAPS SHIFT + SPACE (BREAK)zrušit rozepsaný řádek, ukončit telnet

Do úvodního nastavení se terminál vrací resetem Spectra a LOAD "".

Příkazy terminálu

Příkazy se píší za výzvu >> a vyřizuje je ESP. Velikost písmen nehraje roli.

PříkazCo dělá
HELPseznam příkazů a kláves (anglicky)
CLSsmaže obrazovku, stavová lišta zůstane
WIFIvypíše okolní sítě, číslem se vybere síť a zadá heslo; heslo se uloží do paměti ESP
TELETEXT [stránka]ČT teletext, výchozí stránka 100; potom stačí psát čísla stránek, prázdný Enter režim ukončí
TELNET [server port]připojení k telnetovému serveru; bez adresy nabídne 8 BBS k výběru číslem
GAMES17 her v TAP, nahrají se běžnou rychlostí ROM
OTLAhry v rychlém formátu OTLA (nahrání za několik sekund)
GETTAP [adresa]stáhne TAP z webu a nahraje ho do Spectra; bez adresy vypíše soubory z sindik.at/data
DEMOdokola vypisuje okolní WiFi sítě, a když se může připojit, promítá všechny stránky teletextu
TIMEvelké hodiny HH:MM z internetu, každou minutu nové
SERIAL [1|2|3]režim sériové linky ESP (viz další oddíl)

U DEMO a TIME režim ukončí libovolná klávesa. Hodiny mají 31 znaků na šířku, takže se vejdou do 32 i 40 sloupců.

Ovládání z PC přes sériovou linku

ESP je s PC propojené přes USB (sériový port 115200 Bd). Příkaz SERIAL určí, k čemu port slouží:

RežimNázevCo jde do PC a z PC
SERIAL 1 (výchozí)monitor DEBUG záznam o činnosti ESP; text z PC se vypíše na Spectru
SERIAL 2sertermSpectrum a PC si píšou jako dva terminály; BREAK na Spectru vrátí režim 1
SERIAL 3mirrordo PC jde kopie textu, který se vypisuje na Spectru, bez stavové lišty

V každém režimu fungují řádky začínající vykřičníkem:

PříkazCo dělá
!cmd <příkaz>spustí příkaz terminálu, jako by se napsal na Spectru, např. !cmd TIME
!serial <n>přepne režim sériové linky
!statstatistika linky (pakety, opakování, chyby, volná paměť)
!zxstatistika ze strany Spectra
!wifiset <síť> <heslo>uloží WiFi a připojí se
!loadznovu nahraje terminál do Spectra
!clssmaže obrazovku Spectra
!quitukončí terminál, Spectrum se vrátí do BASICu
!test, !wifi, !ttxautomatické testy linky (seznam WiFi, teletext)

Na PC stačí jakýkoli sériový terminál, například Serial monitor v Arduino IDE. Když je otevřený, nejde do ESP nahrát nový program, takže ho před nahráváním zavřete.

Hry: GAMES, OTLA a GETTAP

Všechny tři příkazy fungují stejně: ESP vrátí Spectrum do BASICu, kde už čeká LOAD "", a přehraje hru jako magnetofon. Hry jsou uložené v balíčku v nevyužité části 4MB flash paměti ESP, mimo samotný program.

  • GAMES: běžné soubory TAP, přehrávané standardní rychlostí ROM, takže je načte každé Spectrum.
  • OTLA: nahrávky ve formátu TZX s přímým záznamem signálu (blok 0x15), které si s sebou nesou vlastní rychlý zavaděč. Vzorek trvá jen asi 21–23 µs, proto ESP při přehrávání vypne WiFi i přerušení. Každou hranu časuje podle čítače taktů procesoru, takže se chyby nesčítají. Data z flash dočítá jen ve chvílích, kdy do další hrany zbývá dost času. Teď jsou v nabídce Manic Miner a atic_k7zx.
  • GETTAP: bez adresy vypíše soubory TAP ze stránky sindik.at/data, dva na řádek s číslem. S adresou adresáře vypíše TAP z něj, s adresou souboru ho rovnou stáhne. Funguje http:// i https://. Stažený soubor se uloží do vyhrazených 236 KB flash a odtud se přehraje.

Novou hru přidáte na PC: TAP do složky games/ (a její jméno do seznamu v tools/make_games.py), TZX do složky otla/. Pak sestavíte a nahrajete balíček:

py tools/make_pack.py
py tools/upload_pack.py COM21

Program v ESP zůstává, do FLASH se nahraje jen balíček her. Balíček má teď 739 KB z 2 816 KB volného místa. Jméno hry v nabídce se bere z názvu souboru. 

Pro vývojáře

Projekt má dvě části: strojový kód pro Z80 a program pro ESP8266 v Arduinu.

Program pro ESP se překládá pro desku Generic ESP8266 s rozložením flash 4MB (FS:none OTA:~1019KB). Jiné rozložení by překrývalo balíček her. V Arduino CLI je to esp8266:esp8266:generic:eesz=4M.

Autor: OK1VHB aka mATARIn, 23.10.2026

Pridaj komentár