Myšlienka bitbangingu rozhodne nie je žiadna novinka, napriek tomu na Spectre máme pomerne málo reálnych implementácií jeho využitia.
Z princípu tento prístup kráča v stopách strýčka Clivea – dosiahnuť za málo peňazí veľa muziky. Bit banging používa silu a čas procesora na to, čo vo svete bohatých vykonávajú rôzne koprocesory a prevodníky. V samotnom Spectre 128k je takto “za babku” realizovaný sériový port. Na voľné vstupno/výstupné piny zákazníckeho čipu AY sú zapojené predovníky na úroveň RS-232 (+/-12V), ktoré sú následne vyvedené na telefónny konektor britského typu – obdoba RJ-xx v našich končinách. Všetka obsluha sériového protokolu – prevod bajtu na jednotlivé bity a naopak – je realizovaná programovo v rozšírenej ROM 128 a Z80 sa vcelku zapotí pri presne načasovanom vykonávaní tejto rutiny, aby sme do alebo zo Spectra dostali nejaké zmysluplné serializované dáta.
Ďalší projekt, ktorý ťaží z dostupnosti zaujímavej súčiastkovej základne ovládanej nejakým druhom sériového protokolu je SpeccyBoot. Tu je na bežný vstupno/výstupný port (napr. brána 8255 v Didaktiku Gama) pripojený ethernetový kontrolér ENC28J60. S ním počítač dokáže načítať zo siete snapshoty uložené na TFTP serveri. Obslužný program obsahuje bit bangingové rutiny pre protokol Serial Peripheral Interconnect (SPI).
Tým by som výpočet mne známych implementácií bit bangingu na Spectre skončil.
Ale výpočet zariadení podporujúcich protokol SPI sa zďaleka nekončí. Žiaľ pre Spectrum je to takmer neprebádaná oblasť a nikto akosi nerieši, že naša platforma tu bola skôr ako Arduino alebo Raspberry Pi. Dnes už asi nenájdeme medzi spektristami toľko bastličov ako v radoch zástancov práve spomenutých platforiem, ale nižšie popísané rozhranie si naozaj dokáže za jedno poobedie zbúchať každý kto niekedy držal v ruke letovačku.
Pred pár rokmi som si na kus univerzálneho plošného spoja zapojil 6 odporov, 3V3 stabilizátor, zopár diód (naozaj stačia 2, ale môžete nejaké pridať pre radosť bôžika), 2 pätice – na SD kartu a 8 pinovú DIL – a dosku nechal riadne odležať. Medzitým som pridal nejaké LEDky (Ub880d: modrú nie, viem, že máš na ňu slabosť) a samozrejme konektor na vstupno-výstupné rozhranie – v mojom prípade na Centronics port v +3. Ale to môžete kľudne zameniť za bránu AY, UR-4 (8255) a podobne.
Schéma je nasledovná:
Určite sa pýtate na čo to celé malo slúžiť? Samozrejme primárne na pokusy a nejaké voľné nevyužité chvíľky počas našich stretnutí. Vždy som tajne dúfal, že sa k tomu niekedy dostanem. Ale počas stretiek máme toľko roboty, že som to ani poriadne nevytiahol.
Nakoniec ma to počkalo až do obdobia májových nocí, kedy som začal na PiKone (čo je výjazdový SinDiKat u mňa na záhradke v Pezinku) otravovať Ub880d s pomocou a podporou k tomuto pokusu.
Tu začal vznikať projektík +3MMC, ktorý si kladie za cieľ načítať nejaké zmysluplné dáta z FAT umiestnené na MMC alebo SD karte pripojenej ku spektru cez nejaký paralelný interfejs. Nástrojov na čítanie FAT je určite k dispozícii množstvo, ale už z predchádzajúcich skúseností som si preveril FatFS od Chana. Pre +3MMC sa naskytla možnosť otestovať PetitFatFS, čo je okresanejšia verzia FatFS. Zápis je obmedzený iba na existujúce súbory, pričom nie je možné zvačšovať ich veľkosť počas zápisu. Znamená to, že ak by sme chceli zapísať štandardnú ZX obrazovku, potrebujeme mať vopred na MMC/SD karte vyrobený súbor napr. s názvom OBR00001.SCR s veľkosťou 6912 bajtov. Na úvod mi išlo hlavne o čítanie dát, takže toto obmedzenie pre mňa zatiaľ nepredstavuje prekážku. PetitFatFS som skompiloval nakoniec iba na čítanie, lebo zrejme nepozornosťou sa mi podarilo jednu kartu počas pokusov o zápis nadobro odpísať.
Keďže oba spomínané Chanove ovládače su napísané v C, bol tento projekt pre mňa aj lekciou ako skompilovať moderný C projekt na staručké spektrum. Našťastie máme už zopár rokov k dispozícii niečo viac ako HiSoft C priamo na ZX – a to hneď nástroje dva: Z88DK a SDCC. Po malých úpravách v zdrojovom kóde – vzhľadom na veľkosť dátových typov a niektoré špecifické obmedzenia kompilátorov – sa mi podarilo projekt skompilovať aj so ZCC (z balíka nástrojov Z88DK) aj s SDCC. Väčšinu pokusov o speccyfickú optimalizáciu som už robil na vyladenejšom systéme s najnovším SDCC 3.4.
Výsledky testov binárnych súborov vyvtorených jednotlivými kompilátmi a porovnanie s nahrávaním z pásky sú v tabuľke:
Kompilátor | Nastavenia/Verzia | Čas | Veľkosť buffera |
Z88DK | -O0 | 53.7s | 64 |
Z88DK | -O3 | 46.3s | 64 |
SDCC | 2.9 | 1:02m | 64 |
SDCC | 3.4 | 39.3s | 64 |
SDCC + ASM | 3.4 | 32.2s | 64 |
SDCC + ASM + ASM skip | 3.4 | 7.4s | 64 |
SDCC + ASM + ASM skip | 3.4 | 5.6s | 128 |
SDCC + ASM + ASM skip | 3.4 | 3.0s | 512 |
SDCC + ASM + ASM skip | 3.4 | 2.9s | 768 |
Médium | Čas | ||
Štandardná páska | 47.8s | ||
Turbo (O.T.L.A. projekt) | 9.2s |
Aktuálna verzia programu demonštruje možnosti načítania súborov s dĺžkou 6912 bajtov (bez rozlíšenia prípony – môžu byť teda aj .BIN aj .SCR) z koreňového aresára FAT16/32 na karte a ich následného zobrazenia do videopamäte Spektra. Pre plynulosť zobrazenia sa súbory najprv nakešujú do pamäte a následne presunú do obrazovky.
SDCC projekt pre +3/+3e (skompiluje sa spustením skriptu bscr34)
Výsledný kód v TAP
Podľa tabuľky je vidieť ako veľmi vplýva prepísanie časovo kritických operácií do asembleru, hoci zvyšok kódu je stále ľahko prenositeľný pretože sa používa vyšší programovací jazyk. Po tomto teste sa asi začnem pokladať za prívrženca C a dostupných vývojových nástrojov pre Spektrum 🙂
Príjemné bitbangovanie.
/ikon
Určite prepísanie do asembleru zvýši rýchlosť niekoľkonásobne. A samozrejme veľmi záleží o spôsobe pripojenia na porty. Už len výber výber bitu 0 alebo 7 odstráni zbytočné rotácie. Ešte väčšia rýchlosť sa dá dosiahnuť pripojením na port mapovaný na pamäťový priestor (IO operácie majú navyše jeden wait state). Správna optimalizácia hardvéru a SPI emulačných rutín dáva základy na vyššie rýchlosti. Maximálna rýchlosť sa dá docieliť niekde nad 7kB/s (dosiahnuté na Z88 pri 3.27MHz), samozrejme to záleží od veľkosti sektorov na karte, teda od jej formátovania.
M1
Spätné upozornenie: Úlet do sveta PeCe | SinDiKat