Saturday, November 1, 2014

NCB85 10. Blocking algoritmus

Po dlhej dobe som sa konečne dostal k NCB85 a dorobil jeden rest. Mal som síce napísaný driver ktorý vedel čítať a zapisovať na disketu, ale nemal som prístup na disketu ako filesystem z CP/M. K tomu aby CP/M vedelo pracovať s disketou je potrebné zaradiť do BIOSu patričné volania. A aby to nebolo také jednoduché, tak CP/M 2.2 podporuje iba 128-bytové sektory. Lenže žiadny MFM moderný radič nepodporuje 128-bytové sektory. Najmenší sektor aký PC8477B MFM kódovanie záznamu podporuje má 256-byte. Preto som si aj zvolil túto veľkosť.

Takže čo s tým? Je nevyhnutné použiť medzivrstvu. Každý jeden 256-byte fyzický sektor bude predstavovať dva 128-byte logické sektory. Samozrejme aby to malo aj nejaké výkonnostné parametre, je potrebné pozdržať fyzickú operáciu pri zapisovaní prvej polovice a zápis vykonať na jeden šup pre obidve polovice. Pri zápise iba jednej polovice je treba načítať celý 256-byte sektor, v RAM prepísať patričnú polovicu a celý sektor zapísať späť na disketu. Pri zápise do adresára je treba uskutočniť fyzickú operáciu bez pozdržania. Pri zápise do nealokovaného sektora sa sektor nemusí najskôr načítať do RAM, stačí prepísať starý obsah na diskete. Atď.. kombinácií je dosť.

Jednoduché nie? Našťastie DRI poskytol vzorový algoritmus. Dokonca univerzálny pre rôzne veľkosti sektorov. Jediný problém je, že verzia z knižky obsahuje BUG a verzia pribalená na OEM diskete bola opravená. Kedže som nemal chuť padnúť do pasce a stiahnuť si verziu s bugom, hľadal som na internete iný algoritmus. Našiel som verziu špecificky písanú pre 256-byte sektory. Preštudoval som, pochopil, upravil a .. padol som do pasce. Pretože keď som to konečne spojazdil, tak moja radosť trvala krátko. Začal som to riadne testovať a pri kopírovaní cca desiateho file mi CP/M vždy zahlásilo chybu.

Neostalo mi nič iné (lepšie povedané, zdalo sa mi to rozumné riešenie a rýchlejšie ako hľadať niekde bug), len skúsiť DRI algoritmus. Našiel som opravenú verziu, preštudoval, pochopil, upravil a .. bolo to pomalé. Už to síce nebolo buggy, ale pomalé ako fras. Každý zápis logického sektora vyvolal fyzickú operáciu. Čiže zápis jedného 256-sektora sa vykonal na dva krát. To sú dve otáčky diskety. A to už je dlhá doba. Chybu som našiel a už to fičí. Vážne fičí. Výkon na 3,5" diskete je veľmi slušný. Pri vhodnom interleave faktore sa stihne tých sektorov zapísať hneď niekoľko za jedinú otáčku. A to je teda rozdiel.

No comments:

Post a Comment