SIF - sériový interface pro ZX Spectrum

Co je SIF?

Na úvod zopakuji to, co jsem psal u programu SIFTerm.

SIF je unikátní sériový interface se dvěma skutečnými hardwarovými UARTy 16C650 pro klasické ZX Spectrum. Navrhl a vyrobil ho Pavel Urbančík možná počátkem roku 2009, dokumentace je z 7.3.2009. Já se k němu dostal pravděpodobně v dubnu 2009 soudě dle nejstarších softwarových pokusů v mém archivu, první pokusy s terminálem jsou z května 2009. A jako se vším i SIF mě na čas zaujal, než jsem se začal zabývat něčím jiným. A to v průběhu mnoha let opakovaně, podle toho, co jsem zrovna měl chuť řešit, nebo potřeboval přidat.

foto foto

SIF je pravděpodobně nejlepší sériové rozhraní, co kdy pro ZX Spectrum vzniklo. Nejenom, že obsahuje skutečný a velmi dobrý UART NXP 16C650, ale obsahuje rovnou dva. První UART je vyvedený na standardní 9 pin DSUB skrz konvertor úrovní MAX3243, druhý UART je k dispozici pro připojení síťového modulu přímo na 3.3V logiku a zároveň skrz multiplexor na infraport. (na fotce je špatně zapojený, první verzi SIFu má být TFDU4301 otočený o 180°, 2. verze desky už byla navržená správně)

foto

Problém je, že SIF už dávno není k sehnání a ani v dobách své největší slávy dobře dostupný nebyl. Pavel Urbančík vyrobil jen několik malých sérií, interface byl relativně drahý, protože jsou na něm relativně drahé a nyní už i špatně sehnatelné čipy. Navíc můj originální SIF je pravděpodobně nejstarší verzí a jeho plošný spoj obsahuje několik chyb, které sice byly v pozdějších verzích opravené, ale zároveň mi na opravené verzi nevyhovovaly jiné detaily. Navrhnout si vlastní verzi prostě bylo nevyhnutelné, jen to ve mě hlodalo příliš dlouho, než jsem se k tomu odhodlal.

Cygnusova replika SIFu (2021)

Vyšel jsem z návrhu verze 1, kterou mám, protože se mi v archivu podařilo objevit projekt pro KiCAD přímo od Pavla Urbančíka shodující se s plošným spojem mého SIFu. Projekt byl pro 10 let starou verzi KiCADu a nebyl přímo použitelný, ale podařilo se mi ho postupně přepracovat a modernizovat. Musel jsem vyměnit všechna pouzdra součástek, musel jsem přeroutovat všechny spoje, nastudovat si datasheety, najít náhradní verze součástek, přepracovat schéma atd... v podstatě celý projekt navrhnout znovu, ale měl jsem alespoň něco pro začátek.

Dopadlo to takto:

foto foto

Levý horní roh je opět vyhrazený k osazení síťového modulu. Ponechal jsem si možnost tam přemístit Connect One modul, ale zároveň počítám i s něčím modernějším, např. ESP8266-01, nebo třeba některým z ESP32 modulů (těch je mnoho a bude asi potřeba vytvořit mezikus).

Přestože si myslím, že je deska navržená lépe, s lépe rozlitou zemí, lepší blokací napájení, bez chyb okolo infraportu, tak tam přesto pár detailů k dořešení zůstalo, např. rezistory mezi vývody krystalů, které u původních UARTů být nemusely, ale UARTy Exar se bez nich nerozeběhnou. A právě s UARTy Exar souvisí další odlišnost - je potřeba UARTy konfigurovat důsledně správně podle datasheetu. Původní UARTy NXP byly mnohem tolerantnější, nebylo nutné nastavovat bit 4 v registru EFR, dokonce Pavel Urbančík v ukázce na straně 13 ve svém PDF nastavuje bit 4 do nuly. Ale aby program byl dostatečně unniverzální a pracoval se všemi UARTy 16C650 od pokud možno všech výrobců, je nutné EFR [4] zapínat a nejenom to - viz ukázkové programy.

Může se stát, že špatně nastavený UART sice komunikuje, ale neprovádí automatické řízení toku dat, protože registr EFR a další nebyly nastavené ve správném pořadí. Naopak, co funguje s UARTem Exar, to mi dosud na NXP a Phillipsech fungovalo vždy.

Co to umí?

Je to sériový port, takže umí přenášet data po sériové lince. Umí vysílat data skoro libolným baudrate od 50bps až do 230400bps včetně automatického řízení toku dat pomocí signálů CTS a RTS při 5 drátovém zapojení vč. GND, nebo pomocí bytů Xon a Xoff při třídrátovém zapojení, opět vč. GND.

Přenosová rychlost je omezena na 230400bps volbou krystalu, rychleji UART data s použitými krystaly serializovat nebude. použitý MAX3243 zvládá přenos až do 250kbit, tj. 230400bps se těsně vejde. Své omezení přinášejí PC a USB sériáky, které mají omezení na 115200bps (alespoň v Linuxu nelze nastavit víc) a v neposlední řadě i samotná Z80, která nemusí stíhat data zpracovávat. Čistě prakticky bývá pro ZX Spectrum 115200bps dostačující přenosová rychlost.

Nejzásadnější a nejdůležitější výhodou oproti původnímu softwarovému sériáku, jako je ten v ZX Spectrum 128k je to, že serializaci dat provádí UART a zároveň UART vysílá/přijímá i když mezitím ZX Spectrum dělá něco jiného. V případě příjmu je přímo v UARTu buffer veliký 32 bytů do kterého UART může přijímat data zcela nezávisle na CPU počítače. CPU si přijatá data může vyzvednout později.

Případný síťový modul je v tuto chvíli spíš bonus pro další experimentování. Síťových možností pro ZX Spectrum existuje několik, ale připadá mi, že se žádná neujala natolik, aby se stala majoritní.

Alternativu ESP8266-01 k původnímu nesehnatelnému ConnectOne jsem zvolil ze dvou důvodů. Jednak je to WiFi modul velice levný a populární a druhak je stejný typ osazený i v ZX Spectrum Next. Tj. potenciálně se nabízí možnost alespoň částečné konverze již existujícího softwaru. Technicky nic nebrání v připojení v podstatě čehokoli, co má TTL UART v 3.3V logice.

Kolik to stojí?

Hardware k prodeji nenabízím. Tu a tam se mohu podělit o nějaký kousek s kamarády, protože spolu s hardwarem pro sebe vyrobím i jeden/dva navíc, ale to bývá jen velmi vzácně, neživím se tím, výroba bývá pracná, časově náročná.

Pro zajímavost - poslední exempláře vyšly v roce 2022 velmi zhruba mezi 1000Kč až 1500Kč za kus, protože samotné UARTy se těžko dají sehnat pod 250Kč kus (dle poslední objednávky z Číny, za dlouho s nejistým dodáním...), lokálně je nikdo neprodává, jsou na desce dva, plus další součásti (MAX3243, CPLD, TFDU4300...).

Jak mám zapojit RS232 kabel?

Pro propojení dvou počítačů je potřeba tzv. nullmodem kabel (Full handshaking), někdy označený jako DTE-DTE. Tj. překřížený kabel pro propojení dvou rovnocenných datových terminálů. Minimálně pětivodičový, signály DCD, DSR a DTR mohou být zapojené taky, ale u ZX Spectra a SIFu se obvykle nepoužívají.

pin RS232 signál směr RS232 signál pin
2 RxD < TxD 3
3 TxD > RxD 2
7 RTS > CTS 8
8 CTS < RTS 7
5 GND - GND 5

Pro připojení periferií budete potřebovat standardní nepřekřížený DTE-DCE kabel. Kabelům třívodičovým bez řídících signálů bych se vyhnul, je to zbytečné omezení.

Postavil jsem si to, jak to mám vyzkoušet?

Pro vyzkoušení jsem připravil několik základních jednoduchých programů. Viz testovací balíček ke stažení - obsahuje program v BASICu pro obousměrný přenos dat, dvě varianty programu, které přijímají data do obrazovky. Jedna varianta s hardwarovým řízením toku pomocí CTS RTS a druhou variantu s řízením toku pomocí bytů Xon a Xoff a nakonec program, který vysílá pár náhodně se měnících znaků po infraportu. A k testování lze samozřejmě použít i SIF Term, pokud ten funguje, mělo by fungovat i vše ostatní.

Abyste mohli programy použít, je třeba správně nastavit sériový port i na druhé straně. Já obvykle používal linuxové PC a nastavení pak vypadá takto pro řízení toku dat pomocí CRT a RTS:

stty -F /dev/ttyS0 115200 cs8 clocal cread cstopb -parenb parodd crtscts -echo raw -drain

Pro softwarové řízení toku pomocí znaků Xon a Xof je nutné vynechat parametr raw a naopak povolit příjem a vysílání řídících znaků.

stty -F /dev/ttyS0 115200 cs8 clocal cread cstopb -parenb parodd -crtscts ixon ixoff -echo -drain

Dále si dle potřeby v příkladu pozměnit zařízení skrz které se komunikuje (např. na ttyUSB0), baudrate a příp. generování a druh parity, pokud ji používáte. Volitelný je parametr -drain, kterým lze vynutit okamžité nastavení parametrů bez čekání na vyprázdnění výstupního bufferu.

Programy pro přenos obrázků reagují na klávesu P (pauza). Po dobu stisknutí se pozastaví přenos (příjem dat), ale nesmí se tím rozbít obrázek. Pokud se data pokazí, tak to ukazuje na nefunkční řízení toku dat. Může být problém zvláště u řízení pomocí Xon Xoff s USB-RS232 převodníkem. Mezerníkem se program ukončí, vrátí se do BASIcu, pomocí GO TO 60 (RANDOMIZE USR 32768) lze program znovu spustit.

Nejasnosti - přerušení

Deska SIFu původně byla navržená tak, aby UART mohl vyvolávat přerušení při nastavených událostech, jako je např. zaplnění bufferu příchozími daty. Ale v CPLD není logika správně, zjevně nepočítá s kolizí s 1/50 a nastavuje vždy datovou sběrnici na 0xff. Není jasné, jestli je vůbec přerušení vyvolávané externím interface možné / použitelné / praktické. Dosavadní software, pokud vím, s přerušením nepočítá a nevyužívá ho.

Software

V tuto chvíli vím o těchto programech:

  • SIF Term - jednoduchý terminál
  • SIF TRD - kopírovadlo TRDOS imagů
  • SIF ROM patch - patch umožňující ukládat a načítat TAPky přes RS232 pomocí příkazů LOAD a SAVE
  • Bitch ZX - IRC klient od UB880 - vyžaduje Connect One
  • ztracený a dosud nenalezený FTP klient - spouštěč TAP z FTP od Pavla Urbančíka - vyžaduje Connect One Existuje pouze video.

Download

  • **placeholder** - kompletní projekt mé repliky SIFu zveřejnění čeká na doladění firmwaru CPLD
  • sif test package.tar.bz2 - testovací ukázkové programy
  • SIF.pdf - lokální kopie originální dokumentace od Pavla Urbančíka (verze 0.1 7.3.2009)
  • SC16C650B-03.pdf - lokální kopie datasheetu k použitým čipům

Související odkazy

Historie změn článku

  • 2023-01-01 - Zveřejněno.

[ Zpět na hlavní stránku ]

Tento web je převážně o ZX Spectru, kompatibilních počítačích a jiném zajímavém hardwaru. Naleznete-li chybu, nebo byste rádi cokoliv co s tímto souvisí, můžete mi napsat email. Stručně o mém webu zde.