Technika mikroprocesorowa - laboratorium Ćwiczenie 8: Dyskietki
Transkrypt
Technika mikroprocesorowa - laboratorium Ćwiczenie 8: Dyskietki
Technika mikroprocesorowa - laboratorium Informatyka studia dzienne Ćwiczenie 8: Dyskietki, dyski, operacje dyskowe.. 1. Celem ćwiczenia. Celem ćwiczenia jest zapoznanie się ze strukturą dyskietki / dysku, budową fizyczną, organizacją zapisu informacji, podstawowymi operacjami służącymi do posługiwania się tego typu nośnikiem. 2. Wymagane wiadomości. • Podstawowe wiadomości o budowie dysku (ATA) i dyskietki. • Znajomość budowy Boot rekordu, tablicy partycji, tablicy FAT, struktury logicznej dysku i dyskietki. • Znajomość podstawowych operacji, przy pomocy których można posługiwać się dyskiem i dyskietką. 3. Program ćwiczenia. • Odczytać dostępne programowo informacje o dysku twardym. • Odczytać i zinterpretować informacje z BOOT SECTOR’a (tablicy partycji dysku twardego). • Zaznaczyć i odznaczyć wybrane sektory dysku / dyskietki jako BAD. • Tworzenie i odtwarzanie dokładnego obrazu dyskietki (kopia wszystkich kolejnych bajtów) lub tablicy partycji dysku twardego. Odczyt i interpretacja zawartości ścieżki. • Przeprowadzić operację formatowania dyskietki (poeksperymentować, np. spróbować sformatować 81 ścieżek). • Przeprowadzić operacje odczytu sektorów z bezpośrednim użyciem FDC • Przeprowadzić operacje zapisu sektorów z bezpośrednim użyciem FDC • Stworzyć dyskietkę, którą można odczytać w systemie DOS (wypełnić obszar systemowy). Przy pomocy dowolnego edytora należy napisać odpowiednie programy asemblerowe (TASM) realizujące kolejne podpunkty z programu ćwiczenia. Kontrolę poprawności zaznaczania bad sektorów należy przeprowadzić przy pomocy programu c:\norton\speedisk.exe . 4. • • • • Literatura. Stanisław Kruk, “Programowanie w języku assembler” P. Metzger, “Anatomia PC” Materiały dotyczące układów Intel 82078 ze strony www.intel.com Ralph Brown’s Interrupt List (dostępna w archiwach FTP np. Simtel.Net) Uzyskiwanie informacji o podstawowych parametrach pracy dysków twardych IDE. Informację o podstawowych parametrach dysków twardych można uzyskać poprzez bezpośredni dostęp do portów sterujących kontrolerem IDE. Zakresy portów poszczególnych kontrolerów IDE/ATA: • Primary: 1F0h – 1F7h • Secondary: 170h – 177h • Tertiary: 1E8h – 1Efh • Quaternary: 168h – 16Fh Funkcje jakie pełni 8 portów kontrolera na przykładzie IDE Primary: Adres Port do portu Odczytu/ Zapisu 1F0h R/W 1F1h R/1F1h -/W 1F2h R/W 1F3h R/W • • • • • • 1F4h R/W 1F5h R/W 1F6h 1F7h 1F7h R/W R/-/W Funkcja Data register Error register WPC/4 (Write Precompensation Cylinder divided by 4) Sector count Sector number (CHS mode) Logical block address, bits 0-7 (LBA mode) Cylinder low (CHS mode) Logical block address, bits 15-8 (LBA mode) Cylinder high (CHS mode) Logical block address, bits 23-16 (LBA mode) Drive/Head Status register Command register Tab.1. Rejestry kontrolera Aby uzyskać informacje o dysku, na wstępie należy wybrać z którego napędu będziemy korzystać poprzez ustawienie 4 bitu w rejestrze Drive/Head (0 dla napędu MASTER, 1 dla SLAVE). Należy odczekać aż komenda zostanie wykonana (7 bit rejestru statusu zostanie wyzerowany). Do rejestru komend należy wpisać wartość ECh (komenda identify drive). Należy odczekać aż komenda zostanie wykonana (7 bit rejestru statusu zostanie wyzerowany). Należy odczekać aż dane zostaną dostarczone do bufora (3 bit rejestru statusu zostanie ustawiony) Z portu Data register należy odczytać 256 słów informacji do bufora, format tych informacji przedstawia tabela 4. Bit 7 6 5 4 Funkcja Zawsze 1 Włączony tryb: 0 = CHS, 1 = LBA Zawsze 1 Wybór napędu: 0 = drive 0 (master), 1 = drive 1 (slave) Bity wyboru głowicy (CHS) Logiczny adres bloku, bity 27-24 (LBA) 3-0 Tab.2. Rejestr Drive/Head Bit 7 6 5 4 3 2 1 0 Funkcja Kontroler wykonuje komendę Urządzenie jest gotowe Błąd podczas zapisu Przeszukiwanie (seek) skończone Bufor wymaga obsłużenia Odczyt z dysku pomyślnie poprawiony Indeks – ustawiany na 1 przy każdym obrocie dysku Poprzednia komenda została zakończona błędem Tab.3. Rejestr statusu Offset 00h Rozmiar WORD Opis Konfiguracja Bit 15: 0 = napęd ATA; 1 = napęd ATAPI 10 – 8: Prędkość transferu 001 <= 5Mbit/sec, 010 5-10 Mbit/sec, 100 > 10Mbit/sec 7-6: Typ dysku 01 stały, 10 wyjmowalny 02h WORD Liczba cylindrów (logiczna) 06h WORD Liczba głowic (logiczna) 08h WORD Ilość bajtów na ścieżkę (niesformatoaną)(!) 0Ah WORD Ilość bajtów na sektor (niesformatoany)(!) 0Ch WORD Ilość sektorów (logiczna) 14h 10 WORDs Numer seryjny (*) 2Ah WORD Rozmiar bufora kontrolera w 512-bajtowych sektorach (**) 2Eh 4 WORDs Firmware revision (*) 36E 20 WORDs Nazwa/numer modelu dysku 6Ch WORD Logiczna liczba cylindrów w aktualnym trybie translacji 6Eh WORD Logiczna liczba głowic w aktualnym trybie translacji 70h WORD Logiczna liczba sektorów w aktualnym trybie translacji 72h DWORD Objętość dysku w sektorach 78h DWORD Całkowita ilość w adresowalnych przez użytkownika sektorów (tryb LBA) 00000000h jeśli tryb LBA nie jest wspomagany (!) – informacja przestarzała, może nie być ustawiona (*) – jeśli pierwsze słowo jest różne od 0000h to jest to ciąg ASCII dopełniony spacjami w przeciwnym wypadku dana nie jest wyspecyfikowana. Aby otzrymać poprawny ciąg należy w kolejnych słowach zamienić starszy z młodszym bajtem. (**) – jeśli jest to 0000h dana nie jest wyspecyfikowana Tab.4. Format informacji o napędzie IDE/ATA (wybrane pola) Więcej informacji Ralf Brown’s interrupt list (dostępne przez ftp w archiwach Simtel.Net; pliki inter59[a-d].zip) Programowanie kontrolera dysków elastycznych (8272 i pochodnych) z użyciem DMA Fizyczna organizacja danych na dyskietce Informacja na dyskietce nie jest zapisana w postaci jednolitego ciągu bajtów lecz podzielona jest w porcje – sektory. Rozmiar sektora to najczęściej 512 bajtów. Sektor to najmniejsza porcja informacji, jaka może być odczytana z dyskietki. Sektory są ułożone na ścieżkach, których najczęściej obecnie jest po 80 na obu stronach dyskietki. Każdy sektor oprócz danych zawiera wiele pól dodatkowych, których zadanie polega na: • administracja sektorów przez kontroler • korekcja niedokładności mechanicznego wykonania napędu i dyskietki • korekcja prędkości obrotowej dysku • utrzymanie ciągu impulsów synchronizujących pracę kontrolera Dane na dyskietce są zapisane przy użyciu technologii MFM (Modified Frequency Modulation), rzadko przy użyciu FM(Frequency Modulation). Więcej informacji można znaleźć w [1]. Format każdej ścieżki (track, cylinder) przedstawia rysunek poniżej: BOT Sektor 1 Sektor 2 ... Sektor n EOT BOT (Begin of track) – znacznik początku ścieżki: GAP 4a SYNC IAM GAP 1 GAP 4a – 80 bajtów o wartości 4Eh SYNC – 12 bajtów o wartości 00h IAM – 4 bajty: C2h, C2h, C2h, FCh GAP 1 – 50 bajtów o wartości 4Eh Sektor SYNC IDAM ID CRC 1 GAP 2 SYNC DATA AM DATA CRC GAP 3 SYNC – 12 bajtów o wartości 00h IDAM – 4 bajty: A1h, A1h, A1h, FEh ID – metryka adresowa sektora – 4 bajty: numer ścieżki, numer głowicy, numer sektora, rozmiar sektora kodowany wg klucza z tabeli 1. Kod binarnie 000 001 010 ... 111 N Tab.1. Rozmiar sektora 128 bajtów 256 bajtów 512 bajtów ... 16 kB 128*2n CRC 1 – 16 bitowy kod CRC obejmujący pola IDAM i ID GAP 2 – 22 bajty o wartości 4E DATA AM – 4 bajty: A1h, A1h, A1h, FBh lub F8h DATA – dane, rozmiar zależny od rozmiaru sektora (p. pole ID) CRC – 16 bitowy kod CRC obejmujący pole DATA GAP 3 – zazwyczaj 80 bajtów, wszystkie o wartości 4Eh EOT (End Of Track) – Znacznik końca ścieżki – GAP 4b GAP 4b – wypełnienie bajtami o wartości 4Eh Każdy sektor można zaadresować za pomocą trzech liczb: głowicy (head, side), ścieżki (track, cylinder) i sektora(sector). Głowice numerujemy od 0 (0 i 1), ścieżki podobnie od 0 (0..79), sektory od 1 (np. 1..18). Programowanie DMA i PIC Kontroler standardowo korzysta z 2 kanału DMA (Direct Memory Access). Sterowanie DMA obejmuje następujące porty: Numer portu 04h 05h 81h 08h 0Ah 0Bh 0Ch Opis Rejestr adresowy kanału 2 Rejestr licznika kanału 2 Rejestr strony kanału 2 Rejestr stanu (R), Rejestr rozkazowy(W) Rejestr maski kanału Rejestr trybu Przerzutnik Flip-Flop Tab. 2. Aby zaprogramować kanał DMA należy: • Zaalokować odpowiedni bufor w pamięci leżący na jednej stronie fizycznej • Na czas programowania zablokować 2 kanał DMA (out 0Ah,6; 2 bit na 1 – zablokowanie, 1-0 bit numer kanału) • Wyzerować przerzutnik flip-flop przez wpisanie dowolnej wartości do portu 0Ch (out 0Ch,0) • Określić tryb pracy DMA: bity 7-6 tryb pracy (00 – Demand, 01- Single, 10 – Block, 11 – Cascade) - do programowania FDC użyjemy trybu Single bit 5 wartość 1 oznacza dekrementację licznika adresowego podczas każdego cyklu transmisji. 0 oznacza inkrementację. Do programowania użyjemy 0 (?). bity 3-2 oznaczają kierunek transmisji (00 – weryfikacja, porównanie, 01 – zapis do pamięci, 10 – odczyt z pamięci) bity 1-0 określają numer opisywanego kanału Zatem w naszym przypadku użyjemy wartości 46h do odczytu z dyskietki i 4Ah do zapisu i formatowania. (out 0Bh,46h lub out 0Bh,4Ah); • Ustalenie strony i offsetu bufora. Obliczmy adres fizyczny bufora adres_fizyczny = segment_bufora*16 + offset_bufora Ustalamy stronę na której jest bufor strona = starsze słowo adresu_fizycznego Ustalamy offset bufora offset = młodsze słowo adresu_fizycznego Należy pamiętać aby bufor w całości leżał na jednaj stronie fizycznej (obszary co 64kB) jeśli bufor leży na granicy dwóch stron możemy w prosty sposób zaalokować dwukrotnie więcej pamięci a jedna z połówek na pewno będzie leżeć w całości na jednej stronie. Do portu strony wpisujemy numer strony (out 81h,strona) Do portu adresu wpisujemy offset, najpierw młodszy potem starszy bajt (out 04h,offset & 0FFh; out 04h, offset / 256) • Do portu licznika wpisujemy rozmiar bufora pomniejszony o 1, najpierw młodszy potem starszy bajt (out 05h,(rozmiar bufora-1) & 0FFh; out 05h, (rozmiar bufora-1) / 256) • Odblokować 2 kanał DMA (out 02h,2; 2 bit na 0 – odblokowanie, 1-0 bit numer kanału) Korzystanie z DMA jest połączone z obsługą przerwań. Kontroler stacji dysków (FDC) korzysta z 6 linii przerwań (IRQ6). Zgłoszenie przerwania powoduje, że wykonywana jest procedura przerwania określona wektorem 0Eh (INT14). Poniżej przedstawiam porty do obsługi kontrolera przerwań. Numer portu Opis 20h Rejestr rozkazowy 21h Rejestr maskujący Tab. 3. Należy pamiętać, żeby podczas procedury przechwyconego przerwania 0Eh poinformować kontroler przerwań (PIC) o odebraniu przerwania i umożliwić zgłaszanie innych przerwań, przez wysłanie do Rejestru rozkazowego sygnału END_OF_INT (out 20h,20h). Programowanie kontrolera FDC – zarys Kontroler może obsługiwać do 4 napędów dysków elastycznych, jednak w przykładach ograniczę się do napędu 0. Do programowania FDC używane są następujące porty Numer portu 3F2h 3F4h 3F4h 3F5h DOR: • • • • • • Dostęp W R W R/W Opis Digital Output Register (DOR) Main Status Register (MSR) Data Rate Select Register (DSR) Data bit 7 – włączenie silnika napędu 3 bit 6 – włączenie silnika napędu 2 bit 5 – włączenie silnika napędu 1 bit 4 – włączenie silnika napędu 0 bit 2 – 1 oznacza włączenie stacji, RESET bity 1-0 – numer wybranego napędu Zatem jeśli chcemy aktywować stację numer 0 (A:) należy wysłać do portu DOR wartość 1Ch , a żeby wyłączyć tę stację 02h MSR – główny rejestr statusowy: • bit 7 (RQM) – możliwy jest zapis lub odczyt z portu danych • bit 6 (DIO) – pokazuje (gdy RQM jest ustawiony) czy z portu danych dozwolony jest odczyt (1) lub zapis (0) • bit 5 (NON DMA) – Pomaga odróżnić transfery danych od transferów pól statusowych podczas transmisji z portu danych bez DMA • bit 4 (CMD BSY) – oznacza, że kontroler wykonuje komendę. Ustawiany po zaakceptowaniu ostatniego bajtu komendy. • bit 3 – napęd 3 jest zajęty (drive is in seek mode) • bit 2 – napęd 2 jest zajęty • bit 1 – napęd 1 jest zajęty • bit 0 – napęd 0 jest zajęty DSR – rejestr wybory prędkości transmisji: • bity 4-2 – wartość: write precompensation, 000 – oznacza wartość domyślną dla ustawionej prędkości transmisji. • bity 1-0 – wybór prędkości transmisji 11 – 1Mbps 00 – 500 Kbps 01 – 300 Kbps 10 – 250 Kbps • Pozostałe bity powinny mieć wartość 0. Przy standardowych ustawieniach dla dysków 1.44MB stosujemy transfer 500 kbit/s a dla dysków 720 transfer 250 kbit/s. Nie należy zapominać o ustawieniu tych parametrów przed operacjami z dyskiem, gdyż w przypadku niewłaściwego ustawienia transmisji operacje te zawsze będą kończyły się błędem. Komendy kontrolera Pracą kontrolera sterujemy poprzez komendy. Operacje związana z komendami możemy podzielić na trzy fazy: ♦ ♦ ♦ wydanie komendy (Command phase) Po resecie kontrolera, lub po wykonaniu innej komendy kontroler jest w stanie przyjmować komendy od CPU. Komenda polega na wystawieniu odpowiedniej wartości do portu danych a następnie odpowiednich dla danej komendy parametrów. Przed zapisaniem czegokolwiek do portu danych musimy sprawdzić czy bity RQM i DIO w MSR (Main Status Register) mają odpowiednio wartości 1 i 0. Po otrzymaniu ostatniego parametru kontroler automatycznie przechodzi do drugiej fazy. wykonanie (Execution) W tej części następuje wykonanie komendy odebranie wyniku (Result phase) Przy wejściu do tej fazy generowane jest przerwanie i w ten właśnie sposób powinniśmy określać chwilę ukończenia wykonywania komendy. W zależności od rodzaju komendy dostępna jest pewna ilość bajtów wynikowych na porcie danych. Zanim jednak odczytamy cokolwiek z portu danych musimy sprawdzić czy bity RQM i DIO w MSR (Main Status Register) mają wartość 1. Po odebraniu ostatniego bajtu wyniku kontrolera przechodzi do fazy pierwszej. Uwaga: niektóre komendy pozbawione są fazy odebrania wyniku Poniżej przedstawiam wyciąg ze zbioru komend Faza R/W Szyna danych D7 D6 D5 D4 D3 D2 READ DATA Command W W W W W W W W W MT 0 MFM 0 SK 0 0 0 0 0 1 HDS Komentarz D1 D0 1 DS1 0 DS0 C H R N EOT GPL DTL ID sektora do odczytania Execution Result Kod komendy Transfer danych między FDD a systemem R ST0 R R R ST1 ST2 C R R R H R N Informacja statusowa po wykonaniu komendy ID sektora po wykonaniu komendy READ DELETED DATA Command W W W W W W W W W MT 0 MFM 0 SK 0 0 0 1 0 C H R N EOT GPL DTL Execution Result 1 HDS 0 DS1 0 DS0 MFM 0 ID sektora do odczytania Transfer danych między FDD a systemem R ST0 R R R ST1 ST2 C R R R H R N Informacja statusowa po wykonaniu komendy ID sektora po wykonaniu komendy WRITE DATA Command W W W W W W W W W MT 0 MFM 0 0 0 0 0 0 0 1 HDS 0 DS1 1 DS0 C H R N EOT GPL DTL ID sektora do zapisania Execution Result Kod komendy Transfer danych między systemem a FDD R ST0 R R R ST1 ST2 C R R R H R N Informacja statusowa po wykonaniu komendy ID sektora po wykonaniu komendy WRITE DELETED DATA Command W W W W W W W W W MT 0 MFM 0 0 0 0 0 1 0 0 HDS 0 DS1 1 DS0 C H R N EOT GPL DTL ID sektora do zapisania Execution Result Kod komendy Transfer danych między systemem a FDD R ST0 R R R ST1 ST2 C R R R H R N Informacja statusowa po wykonaniu komendy ID sektora po wykonaniu komendy VERIFY Command W W W W W W W W W MT 0 MFM 0 SK 0 1 0 0 0 C H R N EOT GPL DTL/SC Execution Result 1 HDS 1 DS1 0 DS0 Kod komendy ID sektora do zapisania Transfer danych między systemem a FDD R ST0 R R ST1 ST2 Informacja statusowa po wykonaniu komendy R C R R R H R N ID sektora po wykonaniu komendy READ TRACK Command W W W W W W W W W 0 0 MFM 0 0 0 0 0 0 0 0 HDS 1 DS1 0 DS0 C H R N EOT GPL DTL ID sektora do zapisania Execution Result Kod komendy Transfer danych między FDD a systemem R ST0 R R R ST1 ST2 C R R R H R N Informacja statusowa po wykonaniu komendy ID sektora po wykonaniu komendy FORMAT TRACK Command W W W W W W 0 0 MFM 0 0 0 0 0 1 0 1 HDS 0 DS1 1 DS0 N SC GPL D Bajty/sektor Sktory/cylinder GAP 3 Bajt wypełnienia Execution Result Kod komendy Transfer danych między systemem a FDD. Dla każdego formatowanego sektora przekazywane są 4 bajty: C, H, R, N R ST0 Informacja statusowa po wykonaniu komendy R R R R R R ST1 ST2 niezdefiniowane niezdefiniowane niezdefiniowane niezdefiniowane RECALIBRATE Command W W 0 0 0 0 0 0 0 0 1 0 1 0 1 DS1 1 DS0 Execution Kod komendy Przesunięcie głowicy nad ścieżkę 0, a następnie wywołanie przerwania SENSE INTERRUPT STATUS Command W 0 0 0 0 1 Result R ST0 R PCN 0 0 0 Kod komendy Informacja statusowa pod koniec każdej operacji SEEK lub RECALIBRATE SPECIFY Command W W W 0 0 0 0 0 0 SRT 1 1 Kod komendy HUT HLT ND SENSE DRIVE STATUS Command W W Result R 0 0 0 0 0 0 0 0 0 0 1 HDS 0 DS1 0 DS0 ST 3 Kod komendy Informacja statusowa FDD SEEK Command W W W 0 0 0 0 0 0 0 0 1 0 1 HDS 1 DS1 1 DS0 Kod komendy NCN Execution Głowica jest ustawiana nad podanym cylindrem READ ID Command W W 0 0 MFM 0 0 0 0 0 1 0 0 HDS 1 DS1 Execution Result 0 DS0 Kod komendy Pierwszy poprawny ID jest wpisywany do rejestru danych R ST0 Informacja statusowa po wykonaniu komendy R R R ST1 ST2 C R R R H R N Command W Niepoprawny kod komendy Result R ST0 ID sektora po wykonaniu komendy INVALID COMMAND ST0 == 80h Symbole: Symbol C D DS0, DS1 DTL EC EOT GPL H Objaśnienie Numer cylindra (ścieżka, track) Wartość jaką wypełniany jest sektor podczas procesu formatowania Wybór napędu. DS1 DS0 0 0 Drive 0 0 1 Drive 1 1 0 Drive 2 1 1 Drive 3 Specjalny rozmiar sektora. Jeśli ustawimy N na 0 możemy przez DTL kontrolować liczbę bajtów przemieszczanych podczas operacji odczytu/zapisu. Normalnie pole nie wykorzystywane i powinno mieć wartość FFh Enable Count. Jeśli jest ustawiony to parametr DTL w komendzie VERIFY jest interpretowany jako SC Numer ostatniego sektora (na bieżącej ścieżce), który będzie poddawany danej operacji. Jeśli czytamy/zapisujemy jeden sektor to wartość powinna być równa polu R Długość przerwy GAP 3 (przerwa między sektorami) Numer głowicy (strony dysku) HDS HLT HUT MFM MT N NCN ND PCN R SC SK SRT ST0, ST1, ST2, ST3 Wybór głowicy (strony dysku) Head load time. Czas opóźnienia opuszczania głowic; uwzględnia on czas wygaśnięcia drgań głowic po zakończeniu procesu pozycjonowania a przed opuszczeniem ich na powierzchnię dyskietki w celu rozpoczęcia odczytu lub zapisu. Head unload time. Czas opóźnienia podnoszenia głowic; jego wprowadzenie ułatwia czytanie całej ścieżki przy realizacji grup rozkazów odwołujących się do kolejnych sektorów. 1- wybór trybu MFM. 0 jest zarezerwowane Multi-track selector. Jeśli jest ustawiony dostępne są operacje odczytu wielu sektorów na raz Rozmiar sektora kodowany wg tab. 1 New Cylinder Number. Nowy numer cylindra Non-DMA mode flag. Gdy jest wyzerowana określa tryb transferów z użyciem DMA. Present Cylinder Number. Obecny numer sektora Numer sektora. Sektory liczymy od 1. Liczba sektorów jaka jest inicjalizowana podczas komendy FORMAT lub jaka będzie zweryfikowana kiedy EC jest ustawiony Skip flag. Jeśli jest ustawiona to sektory, które są oznaczone jako skasowane (deleted) będą automatycznie opuszczane podczas wykonywania komendy READ DATA, a podczas wykonywania komendy READ DELETED DATA będzie można mieć dostęp tylko do sektorów skasowanych. Jeśli flaga jest wyzerowana to sektory skasowane i normalne są traktowane tak samo. Step rate interval. Okres impulsów silnika krokowego; uwzględnia bezwładność i czas martwy układu silnik-wózek głowic. Zmniejszenie tej wartości powoduje szybszy dostęp do danych, ale niesie w sobie niebezpieczeństwo połykania impulsów przez silnik i błędów pozycjonowania Rejestry statusowe zwracane podczas fazy odczytu wyniku. Omówione poniżej. Zależności wartość-czas dla HLT, HUT i SRT. Wszystkie czasy podany w ms. HLT 00 01 02 03 04 – 7D 7E 7F HUT 1M 500K 300K 250K 128 1 2 3 4 – 125 126 127 256 2 4 6 8 – 250 252 254 426 3.3 6.7 10 13.4 – 417 420 423 512 4 8 12 16 – 500 504 508 0 1 – A B C D E F SRT 1M 500K 300K 250K 1M 128 8 – 80 88 96 104 112 120 256 16 – 160 176 192 208 224 240 8.0 7.5 – 3.0 3.0 2.5 1.5 1.0 0.5 426 26.7 – 267 294 320 346 373 400 512 32 – 320 352 384 416 448 480 500K 300K 250K 16 15 – 6.0 5.0 4.0 3.0 2.0 1.0 26.7 25 – 10.2 8.35 6.68 5.01 3.33 1.67 32 30 – 12 10 8 6 4 2 Wartości zalecane (przez mój BIOS :) – Dla 1.44M: HLT =1, HUT=15, SRT=10 Dla 720K Dla 1.44M: HLT =1, HUT=15, SRT=13 Format rejestru ST0 Numer Symbol Nazwa bitu 7,6 IC Interrupt Code 5 4 3 2 1,0 SE EC – H DS1, DS0 Seek End Equipment Check – Head address Drive select Opis Status zakończenia operacji: 00 – normalne zakończenie operacji. Operacja została wykonana poprawnie i zakończona bez żadnych błędów 01 – niepoprawne zakończenie operacji. Operacja zaczęła się wykonywać ale nie została pomyślnie ukończona 10 – została wydana niepoprawna komenda 11 – niepoprawne zakończenie spowodowane przez Polling Operacja SEEK lub RECALIBRATE została ukończona Nieużywany, zawsze 0 Bieżący adres głowicy Numer bieżącego napędu Format rejestru ST1 Numer Symbol Nazwa bitu 7 EN End of Cylinder 6 5 – DE – Data Error 4 OR Overrun/Underrun 3 2 – ND – No Data 1 0 NW MA Non Writeable Missing Address Mark Format rejestru ST2 Numer Symbol Nazwa bitu 7 – – 6 CM Control Mark 5 DD 4 WC Data Error in Data Field Wrong Cylinder 3 2 1 – – BC – – Bad Cylinder 0 MD Missing Data Address Mark Opis Próbowano uzyskać dostęp do sektora o numerze większym niż jest na cylindrze Nieużywany, zawsze 0 Kontroler wykrył błąd sumy kontrolnej CRC1 lub CRC (dla pola ID lub dla danych) Flaga ustawiana gdy procesor lub DMA nie obsłużyło kontrolera podczas wymaganego przedziału czasowego Nieużywany, zawsze 0 Ustawiany gdy: 1. komenda READ DATA lub READ DELETED DATA nie odnalazła podanego sektora 2. komenda READ ID nie może odczytać poprawnie pola ID 3. komenda READ TRACK nie może znaleźć odpowiedniej sekwencji sektorów Wykryto zabezpieczenie przed zapisem podczas zapisu Nie można znaleźć znacznika adresu pola ID (IDAM), znacznika danych lub znacznika danych skasowanych (DATA AM) na podanej scieżce Opis Nieużywany, zawsze 0 Wystąpiło niedopasowanie: 1. komenda READ DATA napotkała na znacznik danych skasowanych 2. komenda READ DELETED DATA napotkała na znacznik danych normalnych Kontroler wykrył błąd sumy kontrolnej CRC dla danych Numer cylindra z pola ID nie zgadza się z numerem cylindra zawartego w kontrolerze Nieużywany, zawsze 0 Nieużywany, zawsze 0 Numer cylindra z pola ID nie zgadza się z numerem cylindra zawartego w kontrolerze i jest równy FFh oznacza złą lub niesformatowaną ścieżkę Nie można znaleźć znacznika adresu danych lub znacznika adresu danych skasowanych (DATA AM) na podanej ścieżce Format rejestru ST3 Numer Symbol Nazwa bitu 7 – – 6 WP Write Protected 5 – – 4 T0 TRACK 0 3 – – 2 1,0 HD DS1, DS0 Head Address Drive select Opis Nieużywany, zawsze 0 (w niektórych kontrolerach status błedu) Wskazuje czy dysk jest zabezpieczony przed zapisem Nieużywany, zawsze 1 (w niektórych kontrolerach status gotowości) Status ścieżki zerowej Nieużywany, zawsze 1 (w niektórych kontrolerach status dwóch stron dysku) Adres głowicy Wybrany napęd (p. ST0) Inicjalizacja napędu Poniżej przedstawiam kroki jak zainicjalizować napęd FDD 1. Reset 2. Zaprogramować transfer danych (DSR) 3. Wykonać komendę SPECIFY dla transferu z DMA Rekalibracja i pozycjonowanie (seeks) Zanim rozpoczniemy prace z dyskiem należy dokonać rekalibracji, czyli przeniesienia głowicy nad ścieżkę zerową. Niektóre napędy umożliwiają włączenie automatycznego pozycjonowania głowicy podczas odczytów, zapisów i formatowania. Standardowo musimy to jednak zrobić sami przed wyżej wymienionymi operacjami (chyba że jesteśmy pewni, że głowica jest już nad żądaną ścieżką). Po operacji SEEK należy odczekać ok. 15ms w celu ustabilizowania się głowic. Jeżeli nasz napęd obsługuje pozycjonowanie podczas operacji czytania/pisania czas ten można ustawić parametrem HLT (komend SPECIFY). Operacje odczytu i zapisu Aby operacje odczytu były zakończone sukcesem musi być spełnionych kilka warunków: silnik napędu musi być włączony, głowice muszą być ustawione nad poprawnym cylindrem, kontroler DMA musi być poprawnie zainicjalizowany. Schemat odczytu sektora przedstawia schemat poniżej. Część wykonawcza operacji odczytu/zapisu może wystąpić w wyniku: kontroler DMA wysyła sygnał TC (Terminal Count) lub kontroler napotka na koniec ścieżki podczas odczytów (EOT). Po w³¹czeniu silnika naleæy odczekaź zanim talerze si rozkrci. Dla dysków 3½” czas ten zazwyczaj wynosi 300ms a dla dysków 5¼” 500ms. Operacje formatowania Operacje formatowania przeprowadzamy podobnie jak operacje zapisu jednak zamiast danych do zapisu w buforze umieszczamy czwórki bajtów oznaczające kolejno: ścieżkę, głowicę, numer sektora, kod rozmiaru sektora. Przykładowo formatując ścieżkę 7 na drugiej stronie dysku 1.44MB (80C*2H*18S*512B) w buforze o rozmiarze 4*18 powinny znajdować się dane: 7,1,1,2;7,1,2,2;7,1,3,2;...;7,1,18,2. Podobnie jak w przypadku operacji odczytu i zapisu po włączeniu silnika należy odczekać aż talerze dysków się rozkręcą. Przed operacją formatowania powinniśmy odpowiednio ustawić głowice komendą SEEK. Chcąc sformatować całą dyskietkę należy przeprowadzić operację formatowania dla każdej ścieżki i głowicy osobno. Standardowe liczby sektorów i ścieżek na dyskach: Typ dysku Liczba głowic Liczba cylindrów na stronę Liczba sektorów na cylinder Bajty na sektor (kod) 1.44 MB 720 KB 1.2 MB 360 KB 2 2 2 2 80 40 80 40 18 18 15 15 512 (2) 512 (2) 512 (2) 512 (2)