Sunday, November 23, 2014

NCB85 12. 2x360Kb

Dostal som sa o krok ďalej. Pripojil som k NCB85V2 dve disketové mechaniky. Najskôr 2x 1,44MB 3,5". Tie vďaka tomu aké sú miniatúrne som mal na stole viac menej len tak. Bez krabičky. Ale chcel som autentický zážitok, ako kedysi. S "veľkými" disketovkami. Síce CP/M začínalo na 8" mechanikách, ale 5,25" sa asi tiež ráta. Tiež majú značnú veľkosť. Len tak pohodiť na stôl sa nedajú. Zlepil som z plexiskla krabičku na dve 5,25" mechaniky. Osadil som 2x TEAC FD-55BR. Jedná sa o 360kB mechaniky, 40 stôp. BIOS som musel rozšíriť o podporu druhej mechaniky, logiku roztáčania a oneskoreného zastavovania dvoch motorov nezávisle na sebe. A šlape to :-)




Je to krása. Jeden sen splnený. 8-bitové CPU 8085 si obsluhuje dve veľké mechaniky. Takto som o tom sníval v časoch PMD85. Lenže vtedy sme mali iba kazeťáky :-( Je to krásne divadlo pre oči aj uši, keď napríklad pri kompilácii tri minútky hlavičky behajú hore-dole.

A čo taký Manic Miner? Ten by sa nahral odhadom za 10 sekúnd. Z kazeťáčiku to trvalo 5 minút. A ako sme sa nedočkavo tešili:-)

Aby to bolo dokonalé, urobil som ešte jednu vec. Vyhádzal som z BIOSu čo sa dalo, aby som sa dostal na čo najmenšiu veľkosť. Dostal som sa na 980H. To už umožnilo umiestniť v jednej 8kB ROM nielen BIOS ale aj CP/M. Tým pádom nie je potrebná systémová stopa. A to celé má za následok príjemnú skutočnosť a síce, že CP/M má k dispozícii plnú kapacitu diskety.



V riadku s kapacitou svieti pekných 360kB a v poslednom riadku "RESERVED TRACKS" sympatická nula.

Nechcem sa chváliť. Ale na eBay sa objavili za slušnú cenu 8" mechaniky. A nie hocijaké. Úplne "novo staré" ešte nevybalené. Typ double sided a double density. To znamená, že sa vééééľmi podobajú na dobre známe 5,25" 1,2MB mechaniky na HD diskety. 15x 512 sektorov na stopu, 360 otáčok a 500kBps. Jediný rozdiel je, že nemajú 80 ale iba 77 stôp a teda nepatrne nižšiu kapacitu. (Ono to vlastne je naopak. 5,25" HD sú PC kompatibilná zmenšenina starých 8" DS/DD mechaník) A samozrejme papajú gigantické 8" DS/DD diskety. Jedna mechanika už je moja :-) BTW len tak sa po nich zaprášilo.

Sunday, November 2, 2014

NCB85 11. CP/M bootstrapping

Po zapnutí napájania je obsah RAM nedefinovaný a procesor začne vykonávať inštrukcie od adresy 0000. Na konci vidíme prompt A> a CP/M čaká na príkazy. Pokúsim sa popísať ako sa od zapnutia dostaneme až k vytúženému cieľu.

Tradičné systémy fungovali tak, že v ROM bol len kratučký program, ktorý nahral z diskety obsah jedného alebo viac sektorov do RAM a ten spustil. Dokonca sa vyrábali radiče diskiet, ktoré nepotrebovali ani tú ROM. Po resete sami nahrali obsah prvého sektora na pevne danú adresu. Do jedného sektoru sa toho moc nevošlo, tak tam bol zase len kód ktorý nahral tých sektorov viac. Cieľom je aby boli v pamäti tieto časti. Vypísané od FFFF smerom nadol:

         _________________________  _
        |                         |  \
        |           BIOS          |  |
        |_________________________|  |
        |                         |  |
        |           BDOS          |  | cca 8kB
        |_________________________|  |
        |                         |  |
        |           CCP           |  |
        |_________________________| _/
        |                         |
        |           TPA           |
        |_________________________|

        |                         | <- 0100H
        |      System params      |
        |_________________________|
 


Typický BIOS mal okolo 1-4kB, BDOS má 3,5kB a CCP má 2kB. DRI dal k dispozícii vzorový BIOS vo forme zdrojových kódov. Každý si musí napasovať svoj BIOS podľa toho na akom hardware bude bežať. BIOS kompilujem na PC programom AS.

BDOS a CCP dával DRI k dispozícii len v binárnej forme. Adresované boli pre veľkosť RAM 20kB. Preadresovanie na cieľové miesto sa vykonalo utilitkou MOVCPM. Dnes už máme k dispozícii aj zdrojový kód. Preto som sa na starý spôsob s MOVCPM vypr... :-) Stiahol som cpm22.asm, upravil v hlavičke konštantu pre ORG a skompiloval programom ASM od DRI. Výsledkom je HEX obsahujúci CCP+BDOS skompilovaný presne na požadovanú adresu.

Takto som vytvoril komplet (BIOS+BDOS+CCP) runtime obraz CP/M. Další krok je voľba spôsobu ako dostať pri štarte do RAM potrebný kód. Prečo práve do RAM? Do EPROM sa uložiť nedá, pretože BIOS potrebuje zapisovať do svojich premenných. Navyše NCB85 má EPROM iba od 0000 do 2000H.

CPU začína beh od adresy 0000. Na tejto adrese má NCB85 po štarte pripojenú EPROM. Historicky sa BIOS+BDOS+CCP natiahli z rezervovaných stôp na diskete do RAM. RomBor vymyslel fintu, že BIOS umiestni nie na disk, ale priamo do EPROM. Na adrese 0000 je potom kratučký loader a za ním obraz BIOS. Loader prekopíruje obraz BIOS na určené miesto. Výhodu to má v tom, že je to rýchle pre vývoj. Mám emulátor EPROM. Na PC si skompilujem BIOS, pár kliknutiami ho nahrám do emulátora a stlačím reset na NCB85. A mám nový BIOS.

Kým som nemal EPROM emulátor Simulator-EPROM-64kByte ani ma takéto riešenie nenapadlo. Plánoval som mať v EPROM len loader, ktorý by ťahal aj BIOS z diskety. Každá zmena BIOS by znamenala kompiláciu a následný prenos na disketu.

Po tom čo loader presunie BIOS na cieľové miesto sa zavolá CBOOT vstupný bod BIOSu. BIOS inicializuje periférie a zavolá WBOOT. WBOOT natiahne do RAM zvyšok CP/M teda BDOS+CCP. Tieto som si vopred uložil do prvej stopy floppy diskety. Napísal som na to jednoúčelový programík. Kedže BDOS+CCP sa nemenia potrebujem ich ukladať len zriedkakedy :-) Po natiahnutí do RAM už nasleduje len skok na začiatok CCP. A CP/M sa ohlási promptom. Sme v cieľi.

Postup tu popísaný je len jedna z možností, každý si môže vymyslieť niečo iné. Niekto má na diskete uložený aj BIOS. Niekto pri volaní WBOOT nahráva len CCP. Keby sa dala použiť väčšia EPROM ako 8KB mohlo by byť všetko v EPROM a štart CP/M sakra rýchly. Fantázii sa medze nekladú ;-)

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.