(Zdroj: Mikrobaze 08/1989, str.14)
(např. IBM PC). Ty totiž nenalézají stranu 1. K tomuto formátovacímu programu se ještě příležitostně vrátím. Je totiž zajímavý tím, že dokáže
nejrůznější formáty záznamu. V jeho menu si můžete vybrat z 22 různých formátů, včetně IBM PC
(1 s boot sektorem), všech formátů Robotronu, Amstrad system i Amstrad data a řady dalších.
Co je však hlavni - popsaná úprava Betadisku otevřela možnost napsat zcela nové rutiny pro celou obsluhu řadiče. Zde opět zapracoval Jirka
Lamač, který upravil své diskové rutiny, které původně napsal do CP/M pro Sharp. V Mikrobázi jsme
o implementaci na Sharp MZ 800 už stručně referovali).
Výsledek je vynikající. Nová verze CP/M pro ZX Spectrum s Betadiskem si v rychlosti a eleganci
obsluhy disketových jednotek nijak nezadá s tou na Sharpu a je určitě jednou z nejrychlejších vůbec.
Formát záznamu na disku byl při té příležitosti
změněn na 9 sektorů po 512 bytech, takže je kompatibilní s CP/M na Sharpu a vlastně i s formátem
IBM PC. Dokonce i CCP a BDOS začínají na stejném místě jako u Sharpu, takže je možný REBOOT ze
stejné diskety na Sharpu í ZX Spectru. Navíc zároveň stoupla kapacita diskety z 320 na 360KB (resp.
z 640 na 720KB při 80 stopách). Je počítáno se současným připojením až čtyř různých mechanik.
Mechanické parametry se však nastavují podle té nejpomalejší z nich.
Také způsob zpracování chyb je oproti původnímu Betadisku vylepšen. Pro ilustraci - když Betadísk
nenalezne sektor, zkouší ho hledat desetkrát, ale vždy předtím provede HOME a SEEK, tedy vrátí se na
stopu 0 a pak znova hledá žádanou stopu. To vše provádí s krokem 30 ms, což trvá dlouho a po tu
dobu mechanika silné připomíná starou telefonní ústřednu. Na obranu TR-DOSu musím podotknout, že
je to naprosto běžný postup i u jiných systémů. Lamačův BIOS zkouší sice hledání také desetkrát,
ale dělá vždy jenom jeden krok stranou a zpět (možná se Jirka v tomhle nechal inspirovat Járou
Cimrmanem). Samozřejmě se přitom hlídá zda nejsou hlavy v krajní stopě a podle toho se určuje směr
onoho kroku. Takových "chytrostí" je zde celá řada. Ale o tom si povíme jindy.
Určitě by stálo zato použít Lamačovy rutiny pro obsluhu řadiče i v systému Betadisku. Již delší
dobu se mi honí hlavou několik námětů na různá vylepšení systému Betadisku, kvůli práci na Mikrobází jsem však neměl zatím čas na jejich realizaci.
Možná by pomohla týmová spolupráce. Ostatné, na podrobností také dojde.
Můžeme jen doufat, že se tato verze CP/M objeví co nejdříve v naši programově nabídce.
Musím ještě podotknout, že jsem se samozřejmě
zabýval také myšlenkou použít k ovládání neupraveného řadiče jednotlivé příkazy, nebo částí rutín
z EPROM. Rozborem obsahu EPROM jsem našel např. kompletní rutiny pro vysláni sektoru do řadiče
i pro jeho načtení, které by bylo možné využít. K dispozici je na několika místech též důležitá
sekvence OUT (C),A a RET. Nenašel jsem však použítelný způsob načtení stavového registru řadiče
a registrů stopy a sektoru. Na druhou stranu z tohoto rozboru vyplývá, že by stačilo do EPROM naprogramovat sekvencí příkazů IN A,(C) a RET, aby
byla možná úplná programová obsluha řadiče bez hardwarových úprav. Místa je v EPROM dost. Popravdě řečeno, po bližším rozboru tohoto, na první
pohled velice elegantního řešení, docházim stále více k názoru, že vlastně nepřináší téměř žádné
výhody proti řešení hardwarovému. Naopak, některé operace s řadíčem se zdají být tímto způsobem
obtížnějí řešitelné. Jediná možnost by byla volat přímo některé rutiny, které jsou už v EPROM hotové. Ostatně, některé rutiny TR-Dosu jsou napsány
i docela vtipně a není tedy nic špatného je využít.
Pro zajímavost, rutiny pro zápis a čtení sektoru v EPROM TR-DOSu vypadají takto:
WRITE LD B,4 ;Časování pro timeout. INFF1 IN A,(#FF) ;Čtení pomocného portu. AND #CO ;Maskování bitů 0-5. JR NZ,OUTDA ;Je-li DRQ, jdi na zapis. INC DE ;Čitač pro timeout. LD A,E OR D JR NZ.INFF1 ;Další pokus, dokud nevyprší DJNZ INFF1 ;tímeout, jinak RET ;návrat bez zápisu. INFF2 IN A,(#FF) ;Nové čtení pomocného portu. AND #C0 ;Maskování bitů 0-5. JR Z,INFF2 ;Není-li DRQ, zpět. RET M ;Návrat při INTRQ. OUTDA OUTI ;Zapiš bajt. JR INFF2 ;Da1ší. ----------------------------------------------- READ LD B,4 ;Časování pro timeout. INFF3 IN A,(#FF) ;Čtení pomocného portu. AND #C0 ;Maskování bitů O-5. JR NZ,INFF3 ;Je-li DRQ, jdi na čtení. INC DE ;Čitač pro timeout. LD A,E OR D JR NZ,INFF3 ;Další pokus, dokud nevýprší DJNZ INFF3 ;timeout, jinak RET ;návrat bez čtení. INFF4 IN A,(#FF) ;Nové čtení pomocného portu. AND #C0 ;Maskování bitů 0-5. JR Z,INFF4 ;Neni-li DRQ, zpět. RET M ;Návrat při INTRQ. INDA INI ;Načti bajt. JR INFF4 ;Další.
Z výpisu je zřejmé, že se nikde nepočítá délka
sektoru. Operace je ukončena řadičem, který výšle
INTRQ na konci sektoru a délku si ohlídá sám. Požadovanou délku sektoru zjistí řadič z takzvané
adresové oblastí. O jejím uspořádáí si povíme až
bude čas. Takto napsané čtecí a záznamové rutiny
umožňují čtení a záznam sektorů různé délky v rozsahu 128 až 1024 bajtů. To funguje í při volání
služeb TR-DOSu. Jenom není možno použít těchto
služeb pro multisektorové operace s jinou délkou
sektoru než 256 bajtů, protože DOS tuto délku
předpokládá a inkrementuje buffer vždy 0 tuto hodnotu.
Upozorňuji, že se jedná jen o hlavní výkonné
rutiny. Před jejich zavoláním musí být již hlava
nastavena na správné stopě, v registru sektoru musi být správná hodnota a do příkazového registru
musí být výslán příkaz ke čtení, či zápisu sektoru. To všechno není zas tak jednoduché, jak by se
na první pohled zdálo. Ale o tom si zase povíme příště.
(Zdroj: Mikrobaze 08/1989, str.14)
Předchozí část | Pokračováni příště |
Stránka byla už zobrazena: 447 ×
Aktualizováno: 6. 4. 2018, 18:05
Stránka načtena za 0.00204 sekund.