Sunday, December 30, 2018

Jára Cimrman programující

Významný český vynálezca Jára Cimrman vynaliezol ako prvý plnovodiče. Tým predbehol o nejakých 100 rokov známeho súdruha, ktorý navrhoval nevyrábať polovodičové obvody, ale počkať si až na plnovodiče. Jára vypracoval grafický symbolický jazyk na kreslenie vývojových diagramov pre vojnové hry. Okrem symbolov pre začiatok, koniec, vstup, výstup, operáciu, tajnú operáciu, vetvenie, obkľúčenie, prielom, mal značky aj pre zákopy a lietadlá. Obrazce mohli byť pospájané buďto šípkami alebo kopijami. Po platformových hrách to je druhá oblasť, kde sa mu zaslúžene pripisuje prvenstvo. Galaga je jedna z vydarenejších realizácii jeho myšlienok.

Jára viedol živú korešpondenciu o programovaní s britskou konkurentkou Adou Lovelace. Ada potom s Járovým požehnaním použila jeho myšlienky pri popise fungovania Analytical machine Charlesa Babbageho. Jára jej poštou poslal na diernom štítku program na geometrické riešenie kvadratúry kruhu, ale cestou sa štítok stratil. Járov práve vynalezený a hneď aj stratený štítok mal kapacitu takmer 4867 byte. Americké ministerstvo chcelo pôvodne nazvať programovací jazyk Ada ako Jára, ale to sa stretlo so silným antilobbingom u vedúceho sekcie zemana Buresha. Najviac Járu ale zamestnávala vášnivá korešpondencia v esperante s istou Lindou Lovelace. Nezištne vymysleli Lindu(coordination_language) na efektívne koordinovanie spoločných oddychovo relaxačných aktivít. O podrobnostiach sa v denníku bližšie nešíril.

Thursday, December 27, 2018

NCB85 16. BIOS V3

BIOS pre dosky NCB85V2 a V3 som zase trošku sprehľadnil, rozdelil do viacerých file. Pridal som druhú funkčnú implementáciu blocking algoritmu. A tiež pridal podporu pre tri disketové mechaniky. Do zoznamu zmien patrí aj oprava jednoho bugu, zmena v buildovaní a presunutie kódu pre obojstranné média do drivera pre floppy controller. V predchádzajucich verziách bol tento kód súčasťou blocking algoritmu. Ale teraz je na výber z dvoch algoritmov takže aj preto išiel do drivera.

Pridám ešte krátky pokec o BIOSe pre CP/M a disketových mechanikách. CP/M nepodporuje obojstranné média, takže druhá strana diskety je vec implementátora. Pre CP/M druhá strana diskety neexistuje. Najjednoduchšie preto je zadefinovať stopy dvojnásobne dlhé a v polovici stopy sa prepnúť na druhú stranu - samozrejme bez toho aby CP/M o niečom tušilo. Takto je to aj v BIOSe pre NCB85 implementované. Dala by sa použiť aj schéma, že stopy sú dlhé ako počet sektorov na jednej strane, a CP/M by sa pri definovanej kapacite média a zaplnenosti disku nad 50%, snažilo ísť na stopy 80-159, ktoré na diskete nie sú - vtedy by sa zase preplo na druhú stranu diskety. Táto schéma by riešila aj problém súčasného pripojenia 5.25" a 3.5" obojstranných médií. Ale je tu problém, že v polovici kapacity sa vraciame na začiatok diskety na druhú stranu.

Pre podporu rôznych typov mechaník sú určité prekážky. Ak diskety používajú rovnakú bitrate, tak rôzne geometrie(kapacity) sa dajú zadefinovať priamo v DPB blokoch pre každú mechaniku. V takomto prípade treba prepísať tabuľky DPH, DPB0 s parametrami v drive_params.asm a pridať ďalšiu tabuľku DPB1. Pre väčšie rozdiely medzi mechanikami vznikajú dalšie prekážky, ktoré by bolo treba vyriešiť a ktoré nie sú v BIOSe pre NCB85 vyriešené. Obojstranné média s rozdielnym počtom sektorov na stopu by museli správne prepínať na druhú stranu pre každú mechaniku zvlášť, alebo použiť schému s prepnutím na druhú stranu od stopy 80. Ak by mali mať mechaniky aj rôznu bitrate, tak je treba pri každej zmene mechaniky poslať do floppy kontroléra nové informácie o bitrate a steppingu.

BIOS pre NCB85 podporuje 2 disketové mechaniky rovnakého typu. Tretia mechanika je teraz povolená, ale asi málokto to využije. Pre tretiu mechaniku platia určité obmedzenia. Musí byť rovnakého typu ako prvé dve, alebo musí byť jednostranná, mať rovnakú bitrate a mať menší, alebo rovnaký počet sektorov ako prvé dve mechaniky. To preto, aby správne fungoval kód pre druhú stranu diskety.

Z toho vyplýva, že kombinácie 2x1.44MB 3.5" DS/HD + 1x500kB 8" SS/DD, alebo 2x1.2MB 5.25" DS/HD + 1x 500kB 8" SS/DD sú prípustné. Pretože na SS/DD 8" médiách sú bitrate dvojnásobné a sektorov majú 26 jednostranne. Kombinácia 1.44MB 3.5" a 1.2MB 5.25" mechaník prípustná nie je, pretože na disketách 3.5" je 32 sektorov na stopu obojstranne, ale na disketách 5.25" je iba 26" sektorov obojstranne.

Odstránil som aj jeden bug. Na stope 0 sa občas nezistila chyba pri čítaní sektora. Nová verzia V3 je na GitHube tu:
https://github.com/ncb85/NCB85V2-BIOS/tree/master/bios_fdc_30

Ten istý bug som odstránil aj vo verzii V2.2 (viď GitHub). Vo verzii V3 som odstránil aj podporu PMD32SD, takže kto ju potrebuje, siahne po V2.2.

No a už som to vykecal, mám aj NCB85 V3. Je to zase jednodoskáč s podporou floppy mechaník na jedinej doske. Plne kompatibilný s V1 a V2. Popis asi nikdy nebude, pretože platí všetko to čo pre predchádzajúce verzie. Ostala mi jediná doska.

Tuesday, December 25, 2018

NCD85 6. Interleave

Pri pohľade na disketu je interleave abstraktný pojem, ktorý nie je každému jasný a nevie ho pochopiť. Ja som sa s interleave stretol prvý krát na PP-06, kde som mal MFM harddisk. Program z Norton Utilities otestoval disk a zistil aký interleave je pre danú kombináciu CPU, radič a HDD najvýhodnejší. Rozdiel vo výkonnosti disku mohol byť obrovský.

Na floppy disketách na CP/M tomu nie je inak. Nevhodný interleave spôsobí, že práca s disketami sa stane utrpením a všetko bude neskutočne dlho trvať. Pri vhodnom interleave sa diskety podstatne zrýchlia, aj keď rýchlosť PC s interleave 1 nedosiahnu. PC používali DMA a boli schopné prečítať celú stopu na jednu otáčku.



https://en.wikipedia.org/wiki/Interleaving_(disk_storage)

Interleave je optimalizácia rozloženia sektorov na stope. Pri interleave 1 idú sektory hneď za sebou 1,2,3,.. Lenže ak computer načíta sektor 1, musí hneď pokračovať v čítaní sektoru 2, pretože ten sa práve nachádza pod hlavičkou mechaniky. Ak to nestihne, pretože má ešte niečo iné na práci, sektor 2 mu ujde a musí čakat kompletnú otáčku diskety (napr. 32 sektorov) než sa zase objaví sektor 2 pod hlavičkou. CP/M potrebuje na spracovanie a deblocking načítaného sektoru troška viac času, ale interleave 1 mu žiadny nedáva. Pri interleave 1 je práca s disketami na NCB85 neznesiteľne pomalá. Ak je na stope 32 sektorov, tak na načítanie celej stopy sa disketa musí otočiť 32 krát, pričom väčšinu času sa čaká na dootáčanie hľadaného sektoru ku hlavičke. Iba malá čast času sa strávi čítaním z diskety. Pri interleave 2 je situácia podobná, len ešte o kúsoček horšia. Sektory idú v poradí: 1,iný,2,iný,3,.... Computer pri objavení sektoru 2 žiaľ stále ešte spracováva sektor 1. Takže dvojka mu zase ujde a musí čakať celú ďalšiu otáčku plus jeden sektor (ktorý už práve čakal) kým sa znovu objaví očakávaný sektor 2.

Interleave 3 je vhodný pre NCB85 na disketách 1.44MB. Po sektore 1 na diskete nenasleduje hneď sektor 2, ale nejaké dva iné sektory a až potom ide sektor 2. To dáva computeru dosť času na spracovanie načítaného sektoru 1, a hneď ako skončí može pokračovat v čítaní sektoru 2 a nemusí čakať kým sa disketa otočí o celú otáčku.

To aký je rozdiel pri rôznych interleave si je možné ľahko odskúšať. Je treba naformátovať disketu s interleave 1,2,3,4,5 .. a následne s každou zmerať čas kým sa prekopčí napr. 20 file na takúto disketu. Treba postupovať od interleave 1. Prvý interleave, pri ktorom odozva výrazne ožije a zrýchli je ten pravý. Pri interleave 3 dokáže computer prečítať celú stopu za 3 otáčky diskety. To je podstatne lepšie ako povedzme 33 (interleave 2, počet sektorov 32, spomalenie 11x). Zbytočne vyšší interleave tiež nemá zmysel, pretože computer potom nečinne čaká a pritom by už mohol čítať. V našom prípade pri interleave 4 by čakal 1 sektor. Pri interleave 4 by sa jedna stopa načítala za 4 otáčky diskety. To je oproti interleave 3 spomalenie o celú tretinu.

CP/M poskytuje možnosť realizácie interleave v BIOSe. To malo zmysel pri hard sectored disketách, kde dierky v diskete určovali začiatok každého sektora. Ale pri soft sektored disketách (bez dierok pre každý sektor) je to radič, kto rozdeľuje stopu na sektory a adresu sektoru zapisuje už pri formátovaní. Tým umožňuje naformátovať stopu s ľubovoľnou sekvenciou čísiel sektorov. Interleave na NCB85 je teda realizovaný pri formátovaní diskety. Utilita FDC.COM generuje čísla sektorov podľa zvoleného interleave.

Konkrétne v metóde generate_sec_numbers v:
https://github.com/ncb85/utilis-and-examples/blob/master/cpm_fdc/main.c riadok 83