**** MDOS 2.2 **** MTs **** 29.3.2024 21:32 ---------------------------------------------------------------------------------------------- Známé chyby: maximální LBA sektor je 268 435 455. Jeho přetečení se však nikde netestuje, řadič vždy dostane 32bit hodnotu po instrukci and % 00001111 11111111 11111111 11111111 POZNÁMKA: 268435455 * 512 = 137438952960 bytes (128 GB) ---------------------------------------------------------------------------------------------- Částečně lze spustit i v emulu Real Spectrum: F3 - ZX Spetrum 48, nyní TAB, šipkou doprava vybereme diskový systém D80 ESC ALT+F2 F3 - nyní TAB, mezerník, vybrat soubor (musí mít příponu ROM) s ROMkou mdosu 2.2 ESC v Basicu napsat "RANDOMIZE USR 0" ---------------------------------------------------------------------------------------------- červený okraj (BORDER 2) - status řádek "ram error" - čeká na stisk SPACE, následně skáče znova na reset = JP 0 - status řádek "rom error" - čeká na stisk SPACE, následně chybu ignoruje a normálně pokračuje dále - při formátování stopy pokud ST0 vrátí nějaký bit 4,6,7 v jedničce - při použití parametru N s hodnotou 1,2,3 nebo 4 v příkazu MOVE přičemž dojde k chybě nebo přerušení uživatelem - když se nepodaří po stisknutí klávesy M v NMI menu najít volné místo pro uložení posledních dvou řádků obrazovky - příkaz MOVE v NMI menu (zadali jste nějakou blbost) žlutý okraj (BORDER 6) - pokaždé když se připravuje sektor pro R/W operaci přičemž je aktivní (=SET) bit 5 na (ix+1). Jde v podstatě o vynucení hlavy "2" pro MDOS1 diskety. MDOS1 číslování hlavy (2) lze i vynutit, pro A: "POKE#0,49" pro B: "POKE#12,49" MDOS2 číslování hlavy (1) lze i vynutit, pro A: "POKE#0,17" pro B: "POKE#12,17" modrý okraj (BORDER 1) - možné pouze v NMI menu po stisknutí klávesy M (signalizuje se tím, že si našel volné místo pro uložení posledních dvou řádků obrazovky) zelený okraj (BORDER 4) - po úspěšném příkazu OUT v NMI menu - po úspěšném příkazu POKE v NMI menu - po úspěšném nalezení infosektoru první virtuální diskety na HDD hledá se v podstatě nejbližší MD3 image (parametr N (1-4) v MOVE příkazu) fialový okraj (BORDER 3) - při verify (po formátování) došlo k chybě "Sector not found" anebo "CRC error" u některého z logických sektorů 0-14. Takovouto disketu dřívější MDOSy mohly úspěšně naformátovat a nezahlásit žádnou chybu (nultá stopa se totiž nikdy neverifikovala). ---------------------------------------------------------------------------------------------- DEBUG proměnná #3E60/15968 (přežívá nonseek reset z NMI menu!) bit7(1) - aktivuje DEBUG mód bit6(1) - pokud je aktivní i bit7, tak tento bit6 testuje formátovací rutina. Bude-li v jedničce a zároveň půjde o formátování s devíti sektory na stopu, tak je uloží rozloženě v tomto pořadí 1-6-2-7-3-8-4-9-5 V aktivním debug módu spuštěným přes příkaz "LIST @" se na obrazovku (atributy v 1/3 obrazovky), vykreslují stopy, ze kterých se načítalo/zapisovalo. Aktivní jas signalizuje, že se minimálně 1x opakovala operace z důvodu CRC chyby. Barva značí kolik pokusů řadič potřeboval než sektor na stopě našel a data přečetl/zapsal. 6 yellow - možné pouze při formátování (signalizuje úspěšně zformátovanou celou stopu) 5 cyan - nejlepší výsledek, data načtena/uložena na první pokus 4 green - řadič potřeboval 2 pokusy 3 magenta - potřeboval 3 pokusy 2 red - potřeboval 4 pokusy (při formátování jde o chybu při formátu celé stopy!!!) 1 blue - potřeboval všech 5 pokusů přičemž sektor nemusel být vůbec nalezen Ideální je tedy bledě modrá barva (cyan) bez jasu :) Při formátování je ideální žlutá barva. Při verify je ideální bledě modrá bez jasu. POZNAMKA: SRAM debug mode (POKE#15968,128 - manuál str. 20) z MDOSu 2.1 byl zrušen (zde v MDOSu 2.2 jej nahrazuje klávesa H v NMI menu) !!! POZNAMKA2: DEBUG režim lze aktivovat příkazem "LIST @" anebo "POKE#15968,128" anebo "POKE#96,128". V případě POKE se však neinicializují atributy na obrazovce (na to je lepší použít ten LIST @) ---------------------------------------------------------------------------------------------- Příkaz "LIST @" Aktivuje DEBUG proměnnou. Po aktivaci je nutné ručně (přes POKE#) nastavit ještě další dvě proměnné: POKE#16125,x nebo POKE#253,x hodnota pro GAP (#270C), která se bude podstrkovat řadiči v aktivním debug módu. Není-li debug aktivní, pak proměnná nemá význam (v DROM natvrdo hodnota 10) POKE#16124,x nebo POKE#252,x hodnota pro GAP3 (mezera mezi jednotlivými sektory), které se použije při formátování stopy v aktivním debug módu. Není-li debug aktivní, proměnná nemá výzanm a v DROM je natvrdo default 80 (<=9sektorů na stopě) a 35 (>=10 sektorů na stopě). Adresy 16124 a 16125 se kryjí s 32 bitovou proměnou SEC1USER (viz. manuál k MDOS 2.1 str. 21)! Pro práci s IDE zařízením si ji tedy musíte znovu nastavit (anebo použijte hodnotu 1-4 v MOVE příkazu...) ---------------------------------------------------------------------------------------------- MOVE "drive:dN,nnnnn[,w]" kde N mohlo být také 1,2,3,4 pro získání startovací LBA adresy oddílu z MBR, bylo "mírně" významově poupraveno. Pokud se nyní dosadí za N 1,2,3 nebo 4, tak se žádný MBR číst nebude. Místo toho se začne číst od LBA sektoru č.3 sektor po sektoru a hledá se sektor, který začíná "SDOS" znaky (tj. snaží se najít MD3 image soubor). Pokud je takovýto sektor nalezen, border zezelená a do systémových proměnných na adresu 16124 se uloží 32bit číslo (tj. 16124-16127) toho LBA sektoru. Následně můžete používat v příkazu MOVE v hodnotě N nulu (0). Její význam je shodný s MDOSem 2.1 - říká, že LBA startovací sektor se má vzít ten uložený v paměti DRAM. Pokud je MD3 soubor umístěn na vzdálenějších sektorech, může hledání probíhat opravdu dlouho, v takovém případě se jeví jako výhodnější jej najít pouze jednou a přes příkazy: PRINT * PEEK # 16124 PRINT * PEEK # 16125 PRINT * PEEK # 16126 PRINT * PEEK # 16127 si zjistit číslo toho LBA sektoru a následně (po resetu mašiny) si ty hodnoty přes POKE# do proměnných uložit vždy ručně. Poté stačí jen MOVE "a:m0,11" (tj. MOVE s parametrem 0) a máte hotovo. Pro jistotu příklad. Máte slave zařízení, kde se MD3 soubor nachází až na LBA č.65537. Buď můžete zadat MOVE "b:s1,0" a čekat cca 6 minut než se MDOS 2.2 na ten správný LBA sektor dostane a SDOS značku identifikuje, anebo zadáte: POKE# 16124,1 POKE# 16125,0 POKE# 16126,1 POKE# 16127,0 MOVE "b:s0,0" a máte to samé, jen bez toho čekání :) Rozklad/složení 32bitového čísla je následující: 0*16777216 + 1*65536 + 0*256 + 1 = 65537 (adresa 16127) + (adresa 16126) + (adresa 16125) + (adresa 16124) Kdybyste např. chtěli začínat na LBA č. 512, musí to být uloženo takto: POKE# 16124,0 POKE# 16125,2 POKE# 16126,0 POKE# 16127,0 MDOS 2.1 i 2.2 tam vždy po resetu nacpe hodnotu LBA č.2, protože já to takto používal. Bylo to čistě médium pro ZXS, nevadilo mi, že v takovém stavu není čitelné na PC. Pokud jsem to chtěl dostat na PC, tak jsem to vyčetl celé sektor po sektoru, LBA č. 0 a 1 vynechal a měl jsem ten MD3 soubor. MD3 soubor na běžném FAT/NTFS/EXT na PC čitelném médiu se objevil až později (MDOS3 původně používal vlastní FDISK a tvorbu speciálních oddílů) a uznávám, že ten MD3 soubor je pro přenos mezi PC a ZX pohodlnější. Pokud začíná dejme tomu do nějakých 1000 sektorů od MBR je jeho vyhledání opravdu rychlé a práce je efektivní. POZNAMKA: Vyhledávání lze přerušit klávesou SPACE. Pokud máte harddisk, na kterém .MD3 není, tak vyhledávání bude probíhat do nekonečna :) Už není místo na test max. LBA sektoru a ani testování chybových stavů. Na druhou stranu, je to možná i výhoda, protože tak automaticky při hledání "přeskáčete" případné vadné sektory na harddisku. POZNAMKA2: hodnota 1,2,3,4 je významově totéž. Je jedno jestli dosadíte 1 nebo 4. Pořád proběhne tatáž operace, tj. hledání prvního SDOS infosektoru na IDE zařízení. POZNAMKA3: Startovací LBA uložený v proměnné na 16124-16127 je bohužel jen jeden a tedy platí jak pro master tak slave. Lepší by samozřejmě bylo mít samostatnou proměnou pro master i pro slave... ---------------------------------------------------------------------------------------------- Oprava mých chyb v MDOSu 2.1: - problémy s formátováním D40 zaznamenal pwramp na adrese #2531 MDOSu 2.1 má být instrukce "set 6,(ix+0)" a nikoliv "set 6,(ix+6)" chyba způsobuje v proměnných mechaniky přičtení čísla 64 k počtu stop, takže u D40 je tam rázem hodnota 104; chyba se projeví jen u D40 při formátování přičemž ale ještě před samotným formátováním musí dojít při práci s disketou k nějaké chybě (CRC error např.) - pojmenování snapshotu po dosažení 99 souborů - nalezl PotPalo na adrese #163E MDOSu 2.1 má být instrukce "inc hl" a nikoliv "dec hl" chyba způsobuje pouze kosmetickou chybu v názvu snapu/fotky po dosažení 99 souborů. Soubor by se měl správně jmenovat SNAPSHOTxx ale bude se chybně jmenovat SNAPSHOxx0 ---------------------------------------------------------------------------------------------- Obrázek při resetu Hezké logo divide bylo odstraněno, protože jsem potřeboval místo na vlastní kód. Nyní jsem však použil hezký status řádek vypisující i verzi MDOSu :) ---------------------------------------------------------------------------------------------- ROM error Jakákoliv změna v ROMce bez změny patřičného XOR byte na adrese 14331, vyvolá "ROM error". Šlo mi o to, aby systém poznal, že je poškozen. Ve zdrojáku je popsáno jak správného XORu při uložení rom souboru dosáhnout. Chyba není kritická, čeká se na stisk SPACE a systém bude normálně pokračovat dále. ---------------------------------------------------------------------------------------------- RAM error Je-li detekována špatná RAM (2048 bytes diskové RAM), je vypsán tento error a po stisknutí SPACE se opět skáče na reset (jp 0). Chyba je kritická, pokud RAMku neopravíte, nepodaří se MDOS zinicializovat. ---------------------------------------------------------------------------------------------- Test 8255 byl z ROM úplně odstraněn. ---------------------------------------------------------------------------------------------- Hlášení, že disk je chráněn proti zápisu již nenabízí retry. Jednak mechanika stejně svítí a také pokud byste náhodou disketu vyměnili za zcela jinou než tam byla, tak se na disketu zapíše FAT a DIR té první čímž by došlo k poškození dat. ---------------------------------------------------------------------------------------------- Příkaz FORMAT má rozšířenou syntaxi FORMAT "drive:stopy x sektory.B|P" např. FORMAT "a:40x09.B" - čísla ve stopě a sektorech musí být dvouciferná! - znak mezi nimi musí být "x" a bez mezer! - .B nebo .P je také povinné ! (.B je oboustranný formát, .P je jednostranný) Pouze .B nebo .P tuto novou fičuru s nastavením stop a sektorů zapne. Jinak se vrátí řízení staré syntaxi a disketa bude naformátována úplně standardně (resp. dle aktuálně uložených hodnot na ix+6 a ix+7) POZOR: Pokud příkaz správně použijete ale nakonec si formátování přeci jen rozmyslíte (nespustíte ho), pak Vámi uvedené stopy i sektory v systémových proměnných (ix+6 a ix+7) zůstanou! NONSEEK reset je také ponechá! Na default hodnoty se lze vrátit jen plnohodnotným resetem mašiny (randomize usr 0) anebo opět použitím příkazu FORMAT s nastavením standardních sektorů a stop (80x09 u 3.5" nebo 40x09 u 5.25") POZOR2: nenastavujte více stop než zvládne mechanika :) nenastavujte více sektorů než 10 :) nenastavujte méně sektorů než 6 (FAT musí být na jedné stopě) opravdu můžete zadat jakékoliv dvouciferné číslo (nekontroluje se to!) Nově se testuje, jestli formát stopy proběhl úspěšně (FDD ST0 registr) a také, jestli při verifikaci je v pořádku i nultá stopa. Všechny MDOSy totiž úspěšnost formátu stopy netestovaly (spoléhaly jen a pouze na pozdější verify), a dále nikdy neverifikovaly nultou stopu (poslední zverifikovaná stopa byla vždy 1 = nultá stopa, druhá hlava). Pokud na konci formátování bude fialový BORDER, tak došlo k chybě při čtení (verifikaci) sektorů 0-14. Pokud během formátování BORDER zčervená, formát stopy neproběhl úspěšně (řadič vrátil error). Lze narazit také na žlutý BORDER, v takovém případě úmyslně (díky POKE#0,49 u mechaniky A:, nebo POKE#12,49 u mechaniky B:) provádíte formátování se špatným číslováním hlav (stran), tedy s hlavami 0 a 2 (jako to dělal MDOS1) namísto 0 a 1 jak je to správné. Narozdíl od MDOSu 2.0 a 2.1 se dole vypisuje aktuální stopa a hlava, na které se operace aktuálně provádí. Předchozí verze MDOSu totiž vypisovaly stopu a hlavu, na které byla operace dokončena (tj. ve skutečnosti už řadič prováděl operaci o stopu dále než jaká byla vypsána uživateli dole na obrazovku) ---------------------------------------------------------------------------------------------- Formátování a rozložení sektorů Standardně má MDOS rozložené sektory na stopě tak, aby je dokázal načíst na jedinou otáčku, konkrétně sudé stopy 1-2-3-4-5-6-7-8-9, liché stopy 5-6-7-8-9-1-2-3-4. Takto to bylo v MDOSu 1 i 2 odjakživa. Řadič na MDOSu 2 má však s načítaním MDOS1 disket problém a často dochází k ujíždění sektorů hlavě a ta je tak načítá s velkým zpožděním. Je do díky GAP3 mezeře mezi sektory. MDOS1 ji při formátování má 40 bajtů, kdežto MDOS2 formátování má 80 bajtů (při deseti sektorech na stopu dokonce jen 35 bajtů). Jinými slovy diskety formátované na MDOS1 (anebo i cokoliv s 10 sektory na stopu formátované na MDOS2) budou působit značně přbržděným dojmem. Řešením je jedině diskety přeformátovat. S formátem 9 sektorů na stopu na MDOS2 žádné problémy nejsou, protože GAP3 je dostatečně velká na to, aby se vše stihlo. U deseti sektorů na stopu se GAP3 musí zmenšit na 35, a tak MDOS 2.2 ukládá při formátu stopy sektory takto 1-6-2-7-3-8-4-9-5-10. Tento fígl způsobí přečtení všech sektorů na stopě na dvě otáčky (namísto deseti otáček, což způsobuje to citelné zpomalení) Je možné aktivovat debug mód, upravit GAP3 mezeru a rovnež formáty s devíti sektory na stopě si poskládat jako 1-6-2-7-3-8-4-9-5 (snadradně to MDOS 2.2 proloží opravdu jen u deseti sektorů na stopu, u devíti ne!). Docílíte toho těmito příkazy: LIST @ POKE#96,128+64 ;musí být aktivní i bit6 na DEBUGu což LIST@ neudělá! POKE#253,10 ;GPL POKE#252,35 ;GAP3 FORMAT "a:80x09.B" Co dělá ono POKE je vysvětleno výše. Klíčové je mít aktivní debug mód a to POKE#252, které říká jak velká ta GAP3 mezera má být. Teoreticky je možné, že s takto naformátovanou disketou bude MDOS2.x pracovat ve standardních BASIC operacích rychleji než s normálně naformátovanou disketou s velkou mezerou a všemi sektory za sebou :) Dokonce bych se nebál GAP3 snížit na nějakých 20 bajtů (POKE#252,20). Chce to ale vyzkoušet... Proto jsem ponechal možnost debug mód s možností měnit GAP3 dle libosti. ---------------------------------------------------------------------------------------------- Příkaz POKE# má možnost absolutních adres a tím pádem pokryje celý DRAM prostor POKE#n kde n=0-511 nebo n=14336-16383. 0-511 je tzv. relativní adresa (připočte se k ní vždy 15872) 14336-16383 je absolutní adresa (nic se k ní nepřipočítává) ---------------------------------------------------------------------------------------------- Nový příkaz PRINT*PEEK#n kde n=0-511 nebo n=14336-16383. Jde o vyčtení hodnoty z DRAM (opak POKE#n) 0-511 je tzv. relativní adresa (připočte se k ní vždy 15872) 14336-16383 je absolutní adresa (nic se k ní nepřipočítává) VŠIMNĚTE SI, ŽE RELATIVNÍ ADRESU LZE POUŽÍT JEN NA POSLEDNÍCH 512 BYTES DRAM KDEŽTO ABSOLUTNÍ ADRESA DOVOLUJE AKCI S LIBOVOLNOU DRAM ADRESOU !!! ---------------------------------------------------------------------------------------------- Oprava EQUIPMENT error (HOME, SHOME) u řadiče GM82c765b a Intel8272 - READ*"",1404,22528 potom CAT (už nebude docházet k SEEK erroru) - READ*"",1438,22528 a potom RANDOMIZE USR 0 a pak CAT (už nedoje k DEVICE UNAVAIABLE) ---------------------------------------------------------------------------------------------- Obrazovková DEVASTACE v paměti divide zrušena. Cílem je nebýt závislý na divide. Proto jsem to vymyslel následovně. Devastace musí mít délku 6912 a být uložená na disketě hned v prvních sektorech (tj. LOG 14 - 27), nefragmentovaně. Ideálně dát ji na čistě naformátovanou disketu, čímž se zajistí, že půjde o první soubor a nebude fragmentovaný. Další podmínka jejího úspěšného spuštění je mít v atributové části obrázku na poslední adrese (23295) XOR hodnotu dat. tj XOR oblasti od 16384 (délka 4096 bajtů) a 22528 (délka 512 bajtů). MDOS 2.2 si to kontroluje a tedy XORuje 16384-20479 a 22528-23040. Je to takto sparťansky řešené, protože jsem musel šetřit místo (není prostor procházet DIR, stezku FAT...). Ta devastace, kterou přikládám tu XOR hodnotu má samozřejmě již obsaženou. Stačí ji skutečně jen uložit na disketu. ---------------------------------------------------------------------------------------------- NMI menu - klávesy: Q - návrat do snapnutého programu SS+Q - hard seek reset CS+SS - non seek reset M - příkazový řádek (MOVE, POKE, OUT) B nebo I - pokus o skok do Basicu F nebo P - uložení obrazovky (6912 bytes) na disketu S - vytvoření SNAPu na disketu D - nahrání a spuštění devastace (musí být jako první soubor na disketě...) G - překopírování VRAM2 do VRAM1 V - out do VRAM1 (out 32765,16) H - kopie DRAM (disková RAM 2048 bytes) do obrazovky ---------------------------------------------------------------------------------------------- Podpora špatného číslování druhé strany diskety z MDOSu1 (stranu 1 čísluje jako 2). Vše řídí 5,(ix+0) 0 = strana 1 bude do řadiče dosazena jako 1 (MDOS2) 1 = strana 1 bude do řadiče dosazena jako 2 (MDOS1) a už se nenuluje (jako v MDOS 2.1 ready testem). Nyní pracuje na kyvadlovém principu, tj. "dokud nemáš problém se čtením/zápisem dat tak se řiď 5,(ix+0)", "pokud máš problém, tak přečti ID pole a nastav 5,(ix+0) dle zjištěné hodnoty a až do vypnutí mechanik na 9526 už to drž a nový test nedělej!) - vyzkoušet CAT s disketou naformátovanou pod MDOS 1 (vytuhnutí u první stopy by mělo být oproti MDOS 2.1 menší, při použítí POKE do 4.bitu by dokonce výtuh neměl být žádný) - vyzkoušet číst data, zapisovat data, BASICem i nějakým kopírovacím programem - bit 4,(ix+0) - UŽIVATELSKÝ - nastavený bit na 1 zakáže přepínat číslování stran, MDOS se bude řídit pouze aktuální hodnotou na bitu 5,(ix+0) a nebude se snažit stranu automaticky detekovat a změnit. Takže nastavením bitu4 na 1 a bitu5 na 1 řeknete, že chcete za každou cenu v čísle strany dávat řadiči vždy hodnotu 2. Nastavený bit4 na 1 bit5 na 0 systému signalizuje, že vždy bude řadič dostávat hodnotu 1. U operace formát (a následného verify) toto nastavení také platí (lze tedy udělat disketu se špatným číslováním jako dělal MDOS1)!!! Nastavení přežije nonseek reset. Klasický reset nepřežije a je nutné napoukovat hodnoty znovu. Toto nastavení na bitu 4 může udělat pouze uživatel přes POKE#, MDOS 2.2 tento bit pouze čte! - bit 3,(ix+0) - obdoba bitu4, ale SYSTÉMOVÝ, protože i systém může dočasně vyhodnotit, že se nesmí strany přepínat - nastaví se pokaždé na 1 když automat změní číslování strany (na 1 či na 2), - vynuluje se po každém volání 9526 (zhasnutí mechanik) - nastavený na 1 rovněž zakáže automatu změnit stranu (podobně jako 4,(ix+0)). Cílem je měnit stranu maximálně 1x od zapnutí LED po vypnutí LED. Více změn je nesmysl, protože strana se změnila automatem za správnou (= úspěšně načtenou z ID pole řadičem) a pokud je stále problém se čtením/zápisem na disketu pak to nemůže být způsobeno špatným číslováním stran a neustále nové načítání ID pole by probíhající LOAD/SAVE operaci jen nehorázně prodlužovalo. Pozn: Toto způsobí také stav, že pokud bude jen nějaká stopa mít jiné číslování, tak se podaří přečíst vždy stopy jen s určitým (jedním) číslováním, protože automat to nevyhodnotí jako že má přepnout. Je však nereálné mít disketu kde jen některé strany budou mít číslování 1 a některé 2 Chceme-li u mechaniky A: natvrdo nastavit špatné číslování dle MDOS1, tak dáme POKE#0,49 Pro mechaniku B: POKE#12,49 Chceme-li u mechaniky A: natvrdo nastavit správné číslování dle MDOS2, tak dáme POKE#0,17 Pro mechaniku B: POKE#12,17 Chceme-li to nechat jen na automatu, pak je nejjednodušší zresetovat mašinu (RANDOMIZE USR 0) POZNAMKA: U disket se špatným číslováním se při R/W operacích vždy aktivuje žlutý BORDER ---------------------------------------------------------------------------------------------- Odstranění detekce 40stopé diskety v 80stopé mechanice (protože jinak způsobuje chybu, že BASICem nelze používat diskety naformátované na poloviční počet stop než má mechanika) MDOS 2.2 nebude nikdy automaticky seekovat po dvou stopách, detekce byla zrušena. Tím pádem nelze číst 5.25" diskety na 80stopé 5,25" mechanice. Můžete si ale seekování po dvou vynutit sami přes POKE # Chcete-li tedy emulaci zapnout musíte provést: PRINT*PEEK#5 (mechanika A) nebo PRINT*PEEK#17 (mechanika B) K číslu, které počítač vypsal na obrazovku musíte přičíst hodnotu 32 a dát POKE#5,X nebo POKE#17,X (kde X je ta původní hodnota zvětšená o 32)!!! POKE přežije i nonseek reset (CS+SS v NMI menu). Klasický reset už samozřejmě ne. TOTO POKE# ZAPNE (VYNUTÍ) EMULACI NA LIBOVOLNÉ VERZI MDOSu (tedy i na 1.0, 2.0, 2.1)! POZNAMKA: Odstranil jsem instrukci set 5,(ix+1) na adrese #1EDB (podpora 80ti stopé mechaniky 5.25" jako D40), takže zde na MDOSu 2.2 lze v pohodě používat 3,5" diskety s formátem 40x09, nebo 5,25" diskety s formátem 20x09. Pod MDOSem 1.0, 2.0, 2.1 by takováto disketa neměla být čitelná (resp. bude stepovat po dvou stopách takže načte nesmysly) a při pokusu o zápis vyvolá internal error nebo jinou chybovou hlášku. Pouze MDOS 2.2 se k ní bude chovat normálně (ovšem pravděpodobně jen z BASICu, protože programy, které si nastavují systémové proměnné samy, jsou mnohdy opsané z DROM a ten emul bit tedy mohou zapnout...) ---------------------------------------------------------------------------------------------- Úprava E registru pro DREAD, DWRITE, DFORMA Všechny MDOSy trpí takovým nešvarem, že mnohokrát volají rutiny pro čtení a zápis dat s E=0. E značí počet pokusů než bude uživateli ohlášena chyba CRC error (nepleťe se sector not found, to je jiná chyba...). No a hodnota 0 značí 255 pokusů. Toto je na mašli, protože než se uživateli tato chyba zahlásí, uplynou minuty (řadič se snaží neustále dokola načítat stejný sektor). Uživatel to samozřejmě nevydrží a zresetuje mašinu natvrdo. Pravděpodobně to bylo přeneseno ze systému, ze kterého MDOS vychází. Záměrem asi bylo načíst sektor za každou cenu a co nejvíce pokusy to jde. Toto se mi opravdu nelíbí a tak jsem přidal na #2377 takový testík, že pokud bude E nula, tak se hodnota přepíše na 3, tj. 3 pokusy načtení sektoru. V MFC jsem také vždy volal všechno s E=3 a tato hodnota se mi osvědčila, takže nevidím opravdu důvod trápit řadič, disketu i uživatele s 255 pokusy! Však si může zmáčknout RETRY po chybě pokud si myslí, že to řadič dá :) Pak MDOS má ještě druhý extrém, kdy se rutiny pro čtení a zápis volají s E=1. Jde vždy o BOOT, FAT a DIR sektory (anebo verifikaci po formátování). Tedy jediný pokus a pak ihned ohlášení chyby CRC error. Zde se mi to zase zdá až příliš optimistické, ale s tím jsem nedělal nic a ponechal to tak. ---------------------------------------------------------------------------------------------- Rychlost krokování mechaniky MDOS 2.0 a 2.1 mají nastaveno 4ms STEP pro mechaniky, které mají na IX+6 nastaveno 80 a více stop. Menší číslo než 80 znamená pomalejší 6ms STEP. MDOS 2.2 na to používá bit 3 na ix+5 (0 pro D80, 1 pro D40) a rychlost stepování nastaví dle tohoto bitu. Bit 3 na ix+5 se nastavuje při každém resetu mašiny u HWINIT, konkrétně při zápisu počtu stop na ix+6. Možnosti jsou pouze dvě, buď 40 nebo 80 (podle toho jak daleko hlava dohrkala. Bude-li tam hodnota 80, bit 3 na ix+5 se resetne (0), v opačném případě se nastaví (1). ---------------------------------------------------------------------------------------------- Mé poznámky ke GAP1 a GAP3: GAP3 (mezisektorová mezera) MDOS1.x GAP3=40 (jak v DROM tak v MFC) MDOS2.x GAP3=80 (<=9sektorů), 35 (>=10 sektorů na stopu) GAP1 (uvodní mezera na stopě): MDOS1.x GAP1=10 MDOS1.x MFC format = GAP1=64 (<=9sektorů), GAP1=10 (>=10 sektorů na stopu) MDOS2.x toto nelze SW ovlivnit, řadič si tam nacpe sám GAP1=50 V MDOSu 1.0 takto (GAP3=40) GAP1 GAP3 10x 12x 3x 1x 1x 1x 1x 1x 1x 22x 12x 3x 1x 512 CRC 40x 4E 00 F5 FE CYL HD SEC NO CRC 4E 00 F5 FB DATA CRC 4E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ toto se opakuje pro kazdy sektor na stope V MDOSu 2.x takto Řadič GM82C765B, Intel8272 (doporučení dle datasheetu pro 9sec/track GPL=27 GAP3=84): GAP4 SYNC IAM GAP1 GAP3 80x 12x 3x 1x 50x 12x 3x 1x 1x 1x 1x 1x 1x 22x 12x 3x 1x 512x 1x 80x nebo 10x FF 00 C2 FC 4E 00 A1 FE CYL HD SEC NO CRC 00 00 A1 F8 DATA CRC ?4E? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ toto se opakuje pro kazdy sektor na stope 572+GAP3 zabírá fyzicky 1 sektor 572+84=656 je jeden sektor s 9 sektory na stopu (656*9 = 5904) - doporučeno dle datasheetu 572+18=590 je jeden sektor s 10 sektory na stopu krát 10, tj. GAP3 by tedy dle doporučení měla být 18 (10sectors/track), (590*10 = 5900) (MDOS2 dává GAP3=35 u deseti sektorů na stopu a funguje to...)