Zrýchlujme pomaly
Podľa paramtrov prenosu udávaných príručkou, má seriový prenos rýchlosť 9 600 Bd a prenos dát z magnetofónovej pásky 3 800 Bd. Čiže prenosom po sériovej linke sa dáta načítajú za menej ako polovičnú dobu.
Nasledujúca otázka teda napadne každého: je možné prenos ešte zrýchliť?
Výpis ViLi ROM uvádza ďalšie potenciálne možné prenosové rýchlosti 19 200 Bd a neštandardných 27 400 Bd.
Trochu teórie
Jedná sa o dva systémy, nadradený (vysielajúci dáta) a podriadený (príjmajúci dáta). Každý z nich je riadený vlastným oscilátorom, ktorého presnú frekvenciu nie je možné garantovať a pohybuje sa v určitej odchýlke od stanovenej hodnoty. Táto odchýlka je daná nielen výrobou, ale aj prevádzkovými podmienkami (teda hlavne teplotou). Podriadený systém sa teda bude musieť vyrovnať s odchýlkou z toho vyplývajúcou.
Sériová komunikácia je daná postupným vysielaním po bitoch. Prvý je start-bit, nasleduje 8 bitov (0..7) a jeden až dva stop bity. Prenos je synchronizovaný začiatkom start-bitu, teda zmenou úrovne z H na L. Dĺžka trvania každého bitu je nepriamo úmerná prenosovej rýchlosti.
Pri procesore riadeného frekvenciou 2MHz trvá jeden cyklus 0,5us
Úskalia vyšších rýchlostí
Príjem bitu rieši ViLi ROM v nasledovnom cykle:
LD A, (HL) 7T
RLCA 4T
RLCA 4T
RR C 8T
RET C 11T/5T
JR .. 12T
Výsledný bajt sa buduje v registri C, ktorý zároveň slúži ako čítač bitov. Dva posuny sú potrebné, aby načítaný bit (D6) zmenil príznak C. Spolu teda príjem jedného bitu zaberie 40T. Zámenou podmienky sa dá skrátiť o 5T, alebo použitím inštrukcie JP o (ďalšie) 2T.
Kontrola start-bitu sa rieši trochu inak:
BIT 6, (HL) 12T
JR NZ, ... 12T/7T
Medzi jednotlivými kontrolami stavu linky je 24T, čo je príliš veľa, hlavne pri vyšších rýchlostiach.
Trochu to vieme zrýchliť na úkor použitia ďalšieho registra a použitia o trochu rýchlejšej inštrukcie skoku:
LD B, %01000000b
...
LD A, (HL) 7T
AND B 4T
JP NZ, ... 10T
Výsledkom je 21T a obsadený register B (alebo hociktorý iný)
A čo sa stane, keď start-bit príde tesne po načítaní portu? Ďalšie čítanie nastane najskôr o 21T-24T, to je pri rýchlosti 57 600 Bd viac ako polovica dĺžky trvania jedného bitu. Pri nesprávnom načasovaní môže byť posun v jednotlivých bitoch a celý prenos chybný.
Pri zlom načasovaní môže byť miesto posledného bitu načítaný stop-bit,
ako v tomto prípade, čo vidieť na chybe grafiky.
Zisťovať stav portu je potrebné približne v polovici prenosu každého bitu. Tým je zaručené korektné načítanie aj pri odchýlkach vo frekvencii. Tie sa štandardne tolerujú v rozmedzí asi 3%. Ale čím je rýchlosť vyššia, tým je väčší problém sa do tohto stredu trafiť.
Pokusy pri rýchlosti 38 600 Bd vyzerajú nádejne. Na priebehoch vidieť, že väčšinou na stop-bit pripadajú dva skeny portu, ale občas iba jeden.
Inštrukcia BIT 6,(HL) v praxi. Hore priebeh signálu M1, pod ním hodinový signál, červeným je 12 cyklov
tejto inštrukcie. Čítanie portu je v predposlednom cykle a tentokrát pripadlo už na start-bit.
Ďalším problémom je uloženie prijatého bajtu. Na tento úkon je k dispozícii čas, ktorý uplynie od načítania 7. bitu plus dĺžka max. dvoch stop-bitov. Keďže ViLi ROM využíva väčšinu rutín totožných z MGF, vplyvom ich následných volaní ubehne príliš veľa času a aj dva stop-bity rýchlosti 9 600 Bd sú na tento účel prikrátke (pozri analýzu priebehov). V skratke to prebieha nasledovne:načítanie bajtu, premapovanie RAM, uloženie bajtu, zmena čítačov adries a dĺžky bloku, premapovanie pamäte. Optimalizáciou a použitím neštandardných programovacích praktík sa podarilo túto činnosť znížiť na 104T - čo sú presne dva bity pri rýchlosti 38 400 Bd.
Ideálne časovanie pri rýchlosti 38 600 Bd.
Záver
Keby boli dva systémy dokonale synchronizované, maximálna prenosová rýchlosť by bola 57 600 Bd. Vzhľadom na skutočné podmienky je toto však nemožné dosiahnuť. Prakticky by toto riešenie bolo plné kompromisov a vzhľadom na veľkosť prenášaných súborov max. 64kB je úspora času minimálna. Prakticky využiteľná je prenosová rýchlosť 38 400 Bd, ktorú podporuje aj OndraLink vo verzii 3.
Doplnené
Špeciálne pre ROM Card a neskôr pre OndraSD bola vyvinutá podpora pre rýchlosť 57 600 Bd. Aby bolo možné pri tejto rýchlosti zapísať načítanú hodnotu aj do premapovanej časti pamäte, musí mať prenos tri stop bity (len samotné premapovanie tam a späť zaberá takmer jeden celý stop-bit). Doplnenie do OndraLinku je iba v experimentálnej verzii.