Čo je Loader38?
Nie je to žiadne záhadné miesto v púšti, na ktorom pristáli mimozemšťania. Je to krátky kus kódu, ktorý rieši príjem dát rýchlosťou 38 400 Bd a je alternatívou k obdobnej rutine vo ViLi ROM. Umiestňuje sa do časti pamäte TAPE BUFFER, ktorú využívajú knižnice pre príjem a odosielanie dát z/na magnetofón. Toto miesto v pamäti by malo byť teda vždy nedotknuteľné ostatnými programami. Jadro, prevzaté z ViLi ROM, bolo podrobené prísnej redukčnej diéte, aby sa spracovanie prijatého bajtu zmestilo do času, ktorý trvá počas vysielania dvoch stop-bitov. Po zavedení do pamäte štandardnou procedúrou z ViLi ROM preberá na seba všetku ďalšiu komunikáciu. Program OndraLink ho v režime Turbo zavádza na začiatku každého prenosu.
Trochu teórie
Keďže je príjem bitov riešený čiste softvérovo, na jednotlivé úkony zostáva príliš málo času. Ako je už uvedené v kapitole 2.3. Zrýchlujeme, pri rýchlosti 38 400 Bd zodpovedá jeden bit 52 cyklom procesora, stop-bit trvá 104 cyklov. A aj keď sa to na prvý pohľad zdá byť dosť, v skutočnosti sa do tohto času zmestí len pár inštrukcií. Vzhľadom na to hardvérovú konštrukciu počítača, kde je vstupný port riešený ako pamäťové miesto, je potrebná aj zmena mapovania pamäte (vstupný port koliduje s video RAM). Pri vývoji Loader-u teda boli limitujúce časy a podľa toho boli vyberané vhodné inštrukcie. Žiadne odhady časovacích konštánt, vloženiu každej inštrukcie vždy predchádzala analýza jej dopadu na počet cyklov.
Ako to funguje
V kritických častiach kódu boli vynechané všetky inštrukcie CALL, ktoré sú príliš dlhé, a boli nahradené inštrukciou JP. Časť kódu sa líši podľa toho, či sa jedná o príjem záhlavia bloku, alebo len dát. Väčšina časovo náročných činností sa vykoná pri čakaní na 0. bit, kedy je trochu času nazvyš. Vtedy dochádza k zmene čítačov adresy a dĺžky, ako aj vloženiu návratovej adresy, ktorú inak zabezpečuje inštrukcia CALL. Pri čítaní hlavičky zostalo trochu času aj na ovládanie LED diódy.
Najkritickejšia časť algoritmu je zápis do RAM, ktorá začína hneď po načítaní 7. bitu. Nečaká sa na začatie stop-bitu, bolo by to mrhanie času.
LD A, 010b ; 7T
OUT (LS174), A ; 11T
LD A, L ; 4T
LD (DE), A ; 7T
LD A, B ; 4T
OR C ; 4T
JP NZ, RDBYTE ; 10T
Načítaný bajt je v registri L. Hoci sa register HL používa pri čítaní z portu ako ukazateľ adresy, dôležitý je len register H a tak L môže byť využitý na iný účel. Navyše, už žiadny iný register (okrem tieňových) nezostal voľný, tak nič iné nezostávalo. V registri DE je adresa, v BC dĺžka dát daného bloku. Registre IX a IY držia návratové adresy.
Upozornenie: Loader38 aj Loader58 využíva v ROM rutiny pre zvukový výstup na adrese 19B0h. Je možné, že v odlišných verziách ViLi ROM budú tieto rutiny umiestnené v inej časti ROM a preto Loader nebude korektne fungovať. V takom prípade kontaktuje autora na e-mailovej adrese v záhlaví tohto blogu.