MDOS3 s HDD

Jak všichni víte, IDE Face už máme nějaký ten rok, ale jak je to s používáním HDD na Speccy? Jediné, co je zatím takové použitelné je HDD Patch pro MB02+ co spáchal Dr0n. Matrix? Zatím jsem ho viděl jen jednou. Divide? Baze se snaží, snad bude něco nového, ale přenášet data z jednoho HDD na druhý budeme muset asi s kazeťákem.

Tak mě tam napadlo, že kdyby se trošilinku upravil MDOS, tak místo z disket by to mohlo tahat z HDD. Ovšem s velkými omezeními, která jsem si uvědomil hned na začátku a se kterými jsem souhlasil: Data na HDD jsou řazena za sebou, tedy nebude možnost řadit je do adresářů (i když adresáře by se "simulovat" mohly), Stejná velikost jako disketa, jen 4 mechaniky, ruční výběr určité oblasti disku tlačítkem SNAP a disk nesmí mít vadné sektory. Když taková mínus, tak snad by to mohlo mít nějaké plus: celý systém chci udělat tak, aby na něm běžely i starší a staré programy pro D40/80, včetně toho, že by se HDD dal namapovat i jako mechanika A: nebo B:. Pokud s tímto nesouhlasíte, raději nečtěte dále, mohlo by vám být nevolno.

HW úpravy D80

Nejříve ze všeho musíme upravit D80 tak, aby se dal MDOS nahrát do vlastní SRAM paměti. Ovšem ale nestačí jen jedna stránka, ale několik (v této chvíli už tři). Úprava je popsána v ZXM v čísle 4/98-1/99.

Popis úpravy (doslovný přepis článku ze ZXM, autor: Pavel Říha):

Něco málo rad a poznámek k úpravě

Nehrňte se do toho po hlavě, pečlivě si projděte schéma i článek, nezačínejte, pokud něčemu ještě nerozumíte. Já osobně jsem vše promýšlel asi dva měsíce. Protože se mi nechtělo dělat oboustrannou desku (protože bych nezvládl ani jednostarnnou), nasázel jsem součástky na univerzální desku 5x5 cm a pospojoval drátky z rozřezané kšandy od HDD. Na desce zbylo ještě malé místečko, kde jsem si potřebné signály vyvedl (na kraji) a pak celou kšandou připojil k D40. Nezapomeňte taky zapojit napájení pro všechny obvody (na to já jsem prvně zapomněl), pak se chybky nedohledáte. K tomu ještě velice doporučuji nějaké LEDky na sledování, jak je nastaven registr. Celá destička s úpravou se v pohodě vejde pod mechaniku. Ukázka je na fotce. Až to budete mít, zkuste nějakou bezva ROMku od PVL (Thanx to PVL). Ta je určena pro D40/80 s MDOS 1.0, tam kde máte MDOS 2 vám tato ROM nepoběží, jelikož je tam jiný řadič mechaniky.

Jak komunikuje Speccy s HDD

Jak zařízení IDE Face tak i DIVIDE (dále jen budeme mluvit o DIVIDE s otevřeným JP2) rozšíří ZX o 8 portů, registrů IDE disku (popis: Zilog):

Název registru čtecí/zápis hodnota dek. hodnota hex.
data reg. R/W 163 A3
error/status reg. error=R, status=W 167 A7
count sec reg. R/W 171 AB
sector reg. (LBA 0-7) R/W 175 AF
cylinder low reg. (LBA 8-15) R/W 179 B3
cylinder high reg. (LBA 16-23) R/W 183 B7
device/head reg. R/W 187 BB
status/command reg. status=R, command=W 191 BF
Toto jsou registry tak, jak je navrhli PVl a Tritol. Takto jsou i v DIVIDE. Dron a jiní uživatelé výrobků 8BC mají porty o 32 výše. Dronovi totiž tyto porty kolidovaly s General Soundem, proto si je posunul. A po něm to převzali i 8BC (kteří vyrábějí i MBface), protože chtějí navrhnout General Sound český, kompatibilní s ruským. Jen nechápu, proč musí posouvat 8 portů IDEface než posunout 2 porty GSka. Nyní si ukážeme, jak je možné načíst sektor z HDD do paměti (Thanx to Hood & Dr0n). Protože LBA adresace je daleko jednodušší (a navíc mám jen tyto disky), budeme dále pracovat s LBA adresací disku:

         ld   hl,DATA		;nastav kde maji byt data
	 ld   bc,LBASEC1	;nastav vyssi bajty LBA sektoru na disku
	 ld   de,LBASEC2	;nastav nizsi bajty LBA sektoru na disku
	 call READ		;precti
	 ret			;a tahni domu

READ                      	;in=bcde LBA sektor
                          	;  =hl adresa dat
         call TST_BSY     	;pockame az bude HDD ready
         jr   nz,ERROR		;pokud vyskoci s timeoutem nastav chybu s skonci
	 ld   a,b         	;nejvyssi bajt LBA sektoru
         or   %11100000   	;bit 7 a 5 nastavit vzdy
				;bit 6 nastaven=LBA
				;bit 4 urcuje zarizeni master/slave
COMMAND  out  (187),a		;posli do registru
         ld   a,1		;pocet sektoru jen jeden
         out  (171),a		;opet posli
         ld   a,e		;nejnizsi bajt LBA sektoru
         out  (175),a
         ld   a,d		;nizsi bajt LBA sektoru
         out  (179),a
         ld   a,c		;vyssi bajt LBA sektoru
         out  (183),a
         ld   a,#21		;prikaz READ
         out  (191),a		;opet posli do registru
         call TST_DRQ		;cekame az bude HDD schopen posilat/prijimat data
         jr   nz,ERROR		;pokud vyskoci s timeoutem nastav chybu a skonci
         ld   bc,163		;registr dat c=163 b=256
         inir			;prenes 256 bajtu
         inir			;prenes dalsich 256 bajtu
         call TST_ERR		;preneslo se bez chyby?
         jr   nz,ERROR		;ne=nastav chybovy kod
         xor  a			;ano=nastav OK
         ret

WRITE				;write funguje stejne az na rozdil v prikazu
;in=bcde LBA sektor		;a smeru toku dat
;  =hl adresa dat
         call TST_BSY
	 jr   nz,ERROR
         ld   a,b
         or   %11100000
         out  (187),a
         ld   a,1
         out  (171),a
         ld   a,e
         out  (175),a
         ld   a,d
         out  (179),a
         ld   a,c
         out  (183),a
         ld   a,#31		;prikaz pro zapis
         out  (191),a
         call TST_DRQ
         jr   nz,ERROR
         ld   bc,163
         otir			;zapisujeme do HDD
         otir
         call TST_ERR
         jr   nz,ERROR
         xor  a
         ret

ERROR
         cp   255		;zarizeni neexistuje
         jr   nz,ERR1
         ld   a,1		;nastav 1
         ret
ERR1
         and  %01010011		;uz ani nevim
         jr   z,ERR2		;hlavni je bit 0
         ld   a,8		;ten totiz indikuje error
         ret
ERR2
         ld   a,128
         ret
TST_BSY
         push hl		;cekaci smycka na shozeni
         push bc		;signalu DEVICE BUSY
         ld   hl,0		;pocet pruchodu
TST1
         dec  hl
         ld   a,l
         or   h			;sniz pocitadlo
         jr   z,TOUT1		;konec timeoutu?
         in   a,(191)		;cti status registr
         ld   b,a		;kopiruj jeho stav do B
         and  %10000000		;vyber jen bit BSY
         jr   nz,TST1		;stale BUSY?
         ld   a,b
         pop  bc
         pop  hl
         ret
TOUT1
         ld   a,255		;nastav:skoncilo v timeoutu
         or   a
         pop  bc
         pop  hl
         ret

TST_DRQ				;test, zda je HDD pripraven na DATA
         push hl		;opet s pocitadlem timeoutu
         ld   hl,0
TSTDRQ1
         dec  hl		;sniz pocitadlo
         ld   a,l
         or   h
         jr   z,TDRQ1		;konec timeoutu
         in   a,(191)		;cti status registr
         bit  3,a		;testuj DRQ
         jr   z,TSTDRQ1		;stale neni?
         xor  a			;normalni navrat
         pop  hl
         ret
TDRQ1				;opet nastav ze HDD neni pripraven
         ld   a,255
         or   a
         pop  hl
         ret

TST_ERR
         in   a,(191)		;byla chyba?
         and  1
         ret  z			;navrat pokud ne
         in   a,(167)		;cti error registr
         ret
Více informací o registrech, příkazech a jejich parametrech najdete třeba na www.t13.org, nebo v tomto PDF (Thanx to Tritol).

Příprava HDD

Kvůli jednoduchosti jsem si definoval, že MDOS3 bude umět procházet jen v oddílech primárních a pro ně jsem určil ID 49h. Takový oddíl snadno vytvoříte i na PC s Linuxem, nebo s fdiskem, který napsali PVL a Tritol (Thanx). Pak je třeba takový oddíl naformátovat. To můžete udělat s mým MAKEFS (není nic moc, ale snad funguje).

formát uložení dat

Je možno číst a zapisovat do primárních oddílů. Je třeba podotknout, že primární oddíly mohou být na disku jen čtyři. Další dělení oddílu na virtuální diskety je velice jednoduché. Virtuální diskety jdou za sebou, v oddíle není žádná jiná tabulka (například tabulka adresářů nebo FAT). Protože jsem určil rozměry diskety na 94 stop/9 sektorů na stopu/2 strany, vychází to na 1692 sektorů pro jednu virtuální disketu. Protože je ale nutné mít ještě nějaké další informace o disketě, před každou disketou se nachází infosektor. Takže na jednu virtuální disketu připadá 1693 sektorů, což je 866816 Bytes. Jednoduchým výpočtem lze dospět k tomu, že na Compakt Flash kartu o velikosti 128 MB se vejde 154 virtuálních disket (pozor, viruální disketa má o 120 KB více místa než fyzická disketa). Takže složení v oddíle: 512 B je infosektor + 1692*512 bytů diskety (512 B BOOT,2560 B FAT, 4096 B DIR, 859136 B volné místo) a za ním hned další virtuální disketa.

Popis infosektoru:

OFFSET (dekadicky) popis obsahu
0-3 značka DOSu (text: SDOS)
4-35 32 znaků popisu diskety
36 WriteProtect ("0"=R/W, "1"=read only)
37-511 volné
Vysvětlivky:
1/značka DOSu má jen kontrolní charakter, ale být tam musí. Jsou to 4 velká písmena "SDOS", stejně jako je v BOOTu MDOS diskety.
2/popis diskety: 10-ti znakový název diskety je mnohdy nedostačující. Většinou mám normální diskety popsány na štítku. 32 znaků bylo zvoleno tak, aby se mi to vešlo na jeden řádek na obrazovce (a k tomu ještě informaci o WriteProtectu).
3/Informace o WriteProtectu (ochrana proti zápisu) je uložena na disku, protože to tak bude lepší. Prostě je to uloženo i pro příště. Pozor, tento bajt nemá hodnotu 0 nebo 1, ale je tam uložen znak "0" (0x30H) nebo znak "1" (0x31H).

Patchujeme, bootujeme

Protože úpravy do MDOSu dělal PVL a které jsou velice cool, posadil jsem úpravy do tohoto MDOSu. Nejprve je nutno "nabootovat" do SRAM tuto jeho ROMku. To uděláme v pohodě tímto prográmkem. Pak je třeba nahrát Promethea a do něj nahrát tento zdroják a z Promethea spustit. Tímto se patchne PVL romka. Protože by celý tento proces celkem nepohodlný, připravil jsem dva prográmečky, jedním (LOAD *"SAVe") si patchnutý MDOS uložíte na disketu (musíte opravdu na disketu, na HDD je vám na houby) a druhým (jmenuje se BOOT2) to pak celé po zapnutí (nebo při poškození MDOSu) nahrajete do SRAMek. Nebo můžete stahnout všechno najednou v jednom D80 image (tedy kromě zdrojáku, ten se bude ještě měnit, kdežto tyto programy tak často ne).

Možnosti systému

Do MDOS3 menu se vleze stiskem NMI (tlačítko SNAP) a stiskem klávesy M (nejprve NMI a pak M). Další navigace v menu se snadná, na obrazovce jsou vypsány možné klávesy. Integrovaný CD player (vývojová verze - 2001 - DTP) spustíte NMI a C. Jeho ovládání je taktéž snadné. Po resetu se zinicializují i drajvy C a D. Po seek resetu (CAPS+reset) se nastavuje na drive A zařízení fd0 a na drive B pak zařízení fd1 (pokud existuje). Máte možnost si ale toto pak změnit. Například do A vložit virtuální disketu (nejprve přemapovat na HDD a pak vybrat) a do B pak zařízení fd0 původně mechanika A:), nebo Áčku dát normálně fd0 a Béčku pak virtuální disketu a Céčku zase fd0, prostě jak je libo. Po návratu z NMI menu se provádí návrat hlav disketových mechanik na začátek disku (kdyby se to nedělalo, čekala by nás hláška Sector not found) a ještě nějaká nastavení, kdy se drajvům, které jsou mapované na HDD, nastavují parametry mechaniky na 94 stop.

Změna mapování se provádí klávesami 1 až 4. Klávesa 1 je pro mapování logické mechaniky A:, klávesa 2 je pro mapování logické mechaniky B:, klávesa 3 pak pro C: a klávesa 4 pro D:. Logickou mechanikou se rozumí ta mechaniky, s níž se pak budete pracovat (třeba si představte MOVE "d:". Po stisku klávesy si můžete vybrat mapování na : fd0 (fyzická mechanika A:), fd1 (fyzická mechanika B:) a HDD (virtální image). Výběr harddiskových image se provádí klávesami A,B,C a D. Klávesa A náleží pro image, který bude vložen do logické mechaniky A: a analogicky je to i s ostatními klávesami. Klávesou W si vybíráte aktuální oddíl. Na tomto oddílu budou vyhledávány image. Pokud je již oddíl vybrán a chcete použít jiný oddíl a založit image do mechaniky, musíte změnit aktuální oddíl a image vybrat. Po stisku klávesy A-D, si vyberte vstupní masku pro vyhledání image. Pokud ale ještě není vybrán oddíl, nejprve si jej musíte vybrat a pak zadat masku. V masce je možno použít hvězdičkovou i otazníkouvou konvenci. Na velikost písma se nebere ohled, tedy můžete zadat jak malá písmena, tak velká a bude to jedno. Narozdíl od MDOSu hvězdička značí i žádný znak. Po odENTERování se na konec zapsané masky ještě doplní hvězdička, takže na posledním místě hvězdičku psát nemusíte. Pokud tedy na dotaz Mask: jen odešlete prázdný řetězec, budou se vyhledávat všechny image. Příklad: Mask: s znamená, že se vyhledají všechny image, které začínají písmenem S. Mask: *07 pak znamená, že se vyhledají všechny image, které mají v názvu řetězec 07 (třeba: system07). Nalezené image se vypíší na obrazovku po dvaceti a kurzorovými klávesami (vlevo, pravo = o stránku vpřed, vzad) si vyberte a mačkejte ENTER.

Další fičurka, která není v MDOS NMI MENU dlouho je vyhledávání souborů. Klávesa F slouží k vyhledání souboru nezávisle na velikost písma a kombinace kláves CS+F pak vyhlává porovnáváním i velikosti písmen. I v tomto vyhledávání funguje hvězdičková a otazníková konvence, ale na konec zadaného výrazu se hvězdička nedoplňuje. Řetězec se zadává jako "jméno.přípona", pokud příponu nezadáte bude se hledat soubor s jakoukoliv příponou. Přípona se v zadaném textu vyhledává jako první znak za poslední tečkou, tedy pokud potřebujete vyhledat soubor, který obsahuje tečku, je lepší to zadat asi takto: "jmeno.souboru.?". Prostě aby tam byla druhá tečka a přípona (alespoň otazník). Na obrazovku se opět po dvaceti (tento postup je shodný s výběrem image podle jeho názvu). Po výběru si pak ještě musíte vybrat do jaké mechaniky tento image založíte. Během vyhledávání souborů se na obrazovce objevuje jméno image, ve kterém se momentálně vyhledává.

Průběhy hledání (jak podle jména, tak podle souboru) lze přerušit stiskem BREAK (CS+SPACE) a vstupy od uživatele pak klávesou EDIT (CS+1). Návrat do programu, který byl přerušen klávesou Q. Provede se návrat hlav fyzických mechanik na začátek disku. Border zůstane nastaven černý (bohužel to jinak nejde). Nutno podotknout, že ne vždy může být návrat bezpečný.

Od 23.8.2003 je v MDOS3 Disk Menu i moznost vyjet si katalog diskety. Když si vybíráte mezi nepřeberným množstvím virtálních disket a stisknete C, tak vám na disketě, kde právě stál kuzor vyjede seznam souborů (jako u příkazu CAT). V tomto CATu se dozvíte jméno disku, počet souborů a volné místo. U každého souboru jsou vypsány kompletní informace, tedy: délka, počáteční adresa, délka BASICu bez proměnných a atributy souboru. Skryté soubory se nelogicky vypisují.

Od 26.12.2003 při výběru oddílu se vám nabídne celý disk a po potvrzení výběru se najde první virualní image (hledání je zobrazeno a je možné je BREAKnout) na celém disku bez ohledu na nějaké oddíly a filesystémy. Takto je možné naformátovat disk na FAT32 a vyrobit velký soubor a ten do takového oddílu nakopírovat. Výhodu to může mít v tom, že lze jednoduše zálohovat a to tak, že se zkopíruje na PeCi celý soubor. Jediná podmínka je taková, že soubor nesmí být fragmentován.

Podpůrné programy

Když nebudeme uvažovat od programu MAKEFS, který je vysloveně důležitý, máme první program: DISK2HDD. Tento program zjednodušší kopírování disket na harddisk. Stačí vybrat mechaniku a první image a pak jen vyměňovat diskety. Program kopíruje diskety po sektorech a pak jen změní FATku pro formát 94*2. Prográmek má vlastní ošetření chyb, takže když narazíte na disketu s vadnými sektory, program neskončí, ale přeskočí image a jede na další disketu.

Kompatibilita

Úpravy MDOSu jsem dělal tak, aby co nejvíce programů pro D80 bylo kompatibilních. Něž jste se někdo něco dozvěděli, udělal jsem pár rutinek na čtení a zápis sektoru a vyzkoušel, jak se budou chovat staré a nové programy. Většina programů ani nepoznala, že má tu čest, číst data z hadru. Když jsem viděl, jak je to sqělé a rychlé, byl jsem nadšen. Za dva měsíce jsem k tomu dopsal zbytek a vznikla tak první provozuschopná verze. Několik vad na kráse to však má. Několik programů, které se s tím nevypořádají a taky to, že NMI (původně SNAP) čudlík se taky nedá zmačknout kdykoliv, ale jen když není přistránkovaná ROM D80.

Nekopatibilní programy: EImanager, EIformat, Kmanazer,

Pokud někdo narazíte na nekompatibilní program, dejte mi, prosím, vědět. Zařadít je do tohoto blacklistu

POZOR: formátování virtuálních disket je možné nejen z Basicu (zkoušeno na MFC a TOOLS128), ale přesto doporučuji spíše ten Basic.

FAQ

Můžu si dát do D80 jen 32KB SRAM? Ne. Systém je kvůli dalšímu dopisování funkcí rozdělen do 3 paměťových stránek: 0=MDOS1+nezbytné úpravy a spouštěče, 1=DEVASTACE+ a záloha obrazovky, 2=obsluha MDOS3 DISK MENU. Co stránka to 16KB. Je třeba mít i možnost zákazu zápisu a odpojit 2KB SRAM.

Lze použít MDOS3 pro D80 s MDOSem2? Tam, kde je MDOS2 je i jiný řadič mechaniky a tudíž i jiné rutiny, takže tak, jak je teď napsán ne. Patch si musíte upravit pro tento MDOS. Patrně nejlepší řešení je vzít D40 PLV 21 ROM a v něm předělat rutiny pro váš řadič (použít je z MDOS2). Pokud ale nepotřebujete zapisovat na disketu, můžete si MDOS3 nahrát do SRAM zmíněným programem BOOT2. Pak pojede HDD ale disketa ne. Nemůžete po mě chtít abych dělal podporu i pro MDOS2, protože ho prostě nemám.

Škoda, že úprava nejde udělat na Kompaktu. Kompakt má 32KB EPROM, v jedné polovině je ZX ROM a v druhé pak MDOS. Přestránkováním do MDOSu se poze aktivuje jeho druhá polovina signálem A14. Úpravu musíte ještě vylepšit o to, že když bude nastránkována ZX ROM, musí být EPROM aktivní. Pokud nastránkuje MDOS, musí zafungovat úprava a správně vybrat tu SRAM podle outu. Ale to všechno je jen můj dojem.

DownLoad

MDOS3 Zdroják patche MDOS3 pro PVL ROM D80
BOOT Prográmek pro nahrání PVL ROMky do D80
BOOT2 Prográmek pro nahrátí SRAM v D80 z diskety
SAVE Program pro uložení obsahu SRAM na disketu
DISK2HDD v TAP DISK2HDD v TAP verzi
DISK2HDD v D80 DISK2HDD v D80 verzi
ALL Programy BOOT, BOOT2, SAVE a taky DISK2HDD pohromadě
ATA3.PDF popis specifikace ATA3
FDISK FDISK pro speccy
MAKEFS Program pro formátováni MDOS3 oddílů
D40 PVL 21 MDOS1 upravený v PVL a Tritolem

Poděkování

Dizzy, Tritol, PVL za skvělou úpravu D80,CDPlayer a hlavně za HDD u Speccy, Zilog za divIDE, Baze za pomoc s konverzí LBA na CHS, Dron (aniz bych ho kontaktoval) za ukázky práce s HDD, Hood a Shrek za moral support, TAU za CF, sir Sinclair za skvělý stroj a lidi na které jsem zapoměl.

malá ukázka: snímečky NMI menu v jednom stadiu vývoje.