Rozdział 6.
Kontroler napędu dysków elastycznych
Zapis informacji na dyskietce
Modele IBM PC posługiwały się systemem zapisu magnetycznego określanym mianem FM (ang. Freąuency Moditlation). Jest to bardzo prosty i zarazem mało wydajny sposób kodowania informacji na nośniku magnetycznym. Najstarsze modele jako pamięć zewnętrzną wykorzystywały magnetofon, ale ma to znaczenie wyłącznie historyczne, dlatego też nie będzie tutaj omawiane.
Pamiętajmy, że tylko zmiana namagnesowania podłoża magnetycznego dyskietki niesie z sobą informację. Stałe namagnesowanie nośnika nie wywołuje impulsów w głowicy napędu. Źródłem impulsów jest zmiana namagnesowania nośnika, przy czym stan początkowy namagnesowania nie ma absolutnie znaczenia (tzn. symboliczna zmiana N->S i S->N niesie tę samą informację).
Idee zapisu magnetycznego FM można wyrazić następującymi regułami:
Na ciąg danych przeznaczonych do zapisywania nakładany jest prostokątny przebieg zegarowy, którego okres "pokrywa" jeden bit informacji wejściowej.
Każdy impuls zegara powoduje zmianę namagnesowania podłoża (Z).
Jeżeli w danym cyklu zegara ciąg danych wejściowych reprezentuje jedynkę, pomiędzy impulsami pochodzącymi od zegara wprowadzany jest dodatkowy impuls (D).
Pokazano to na rysunku 6. l.
Obecnie powszechnie stosowaną metodą zapisu danych na dyskietkach stał się konkurencyjny do systemu FM system MFM (ang. Modified Freąuency Moditlation). Rysunek 6. l. przedstawia schematycznie różnicę między tymi dwoma systemami.
Zapis MFM rządzi się następującymi regułami:
Na ciąg danych przeznaczonych do zapisywania nakładany jest prostokątny przebieg zegarowy, którego okres "pokrywa" jeden bit informacji wejściowej. Impuls przemagnesowania dla jednego bitu (impulsu zegara) może pojawić się tylko raz;
Impuls zegara powoduje zmianę namagnesowania podłoża tylko wtedy, gdy stowarzyszony z nim bit danych i poprzedni bit danych mają wartość zero (Z);
Jeżeli w danym cyklu zegara ciąg danych wejściowych reprezentuje jedynkę, to generowany jest impuls do przemagnesowania nośnika (D).
Można to przedstawić następująco:
Ciąg danych; Impuls przemagnesowujący
00; tak
01; tak
10; nie
11; tak
W obydwu metodach kodowania na ciąg impulsów wyjściowych będących źródłem przemagnesowywania podłoża składają się impulsy pochodzące od zegara (Z) i odkodo-wanych danych (D).
Widać wyraźnie, że liczba zmian namagnesowania nośnika przypadających na jeden bit informacji jest większa (teoretycznie dwukrotnie) dla zapisu FM. Materiał magnetyczny, którym pokryta jest dyskietka, wykazuje ziarnistość; istnieje ściśle określona dolna granica wielkości obszaru, który można indywidualnie przemagnesować. W przypadku dyskietek HD ta granica to około 2 mikrometra. Na tej samej długości ścieżki można więc w for-macie MFM zmieścić dwukrotnie więcej informacji.
Do dekodowania impulsów MFM używa się dwóch bramek sterowanych przesuniętymi o pół okresu przebiegami o częstotliwości zegara. Obie bramki otrzymują też dekodo-wany sygnał MFM. Jedna z bramek odfiltrowuje składowe Z i kieruje je do układu synchronizowania zegara, a druga wydziela dekodowane dane. Należy podkreślić, że przebieg MFM niesie w sobie informację o fazie i częstotliwości sygnału zegarowego tylko w ograniczonym stopniu. Aby zagwarantować właściwą pracę dekodera, co pewien czas należy wymuszać obecność sygnałów synchronizacyjnych. Dokonuje się tego wprowadzając pola zawierające same zera - ciąg taki, jak wiemy, powoduje generację sygnału zegarowego. Szczególnie narażone na rozsynchronizowanie są sektory zawierające tylko bajty o wartości FFh.
Fizyczna organizacja danych na dyskietce
Informacja nie jest zapisywana na dyskietce w postaci jednolitego ciągu bajtów, lecz zorganizowana jest w tzw. sektory. Każdy sektor zawiera 512 bajtów, co jest jednocześnie najmniejszą porcją informacji, jaka może być z dyskietki odczytana. Z punktu widzenia systemu operacyjnego logiczną strukturę dyskietki tworzą pliki i katalogi, zaś niektóre informacje (zapisane w ściśle określonym miejscu na dysku) mają specjalne znaczenie, np. sektor ładujący (ang. boot sector), katalog (ang. directory). Każdy sektor należy ponadto do tzw. jednostki alokacji (ang. cluster) o kolejnym numerze logicznym, a jednocześnie, z fizycznego punktu widzenia, wchodzi w skład ścieżki (ang. track). Na szczególną uwagę zasługuje tzw. tablica alokacji (ang. FAT - File Allocation Table), będąca specjalną "łańcuchową" strukturą informującą system, które jednostki alokacji (i w jakiej kolejności) składają się na dany plik.
System operacyjny korzysta bardzo intensywnie ze wsparcia kontrolera napędu dysków elastycznych, któremu powierza się zadanie administrowania fizyczną powierzchnią dyskietki. To kontroler musi wiedzieć, gdzie odszukać żądany sektor oraz jak radzić sobie z uszkodzonymi sektorami.
Operacja formatowania dyskietki nanosi na nią określoną fizyczną strukturę ścieżek i ich sektorów. Oprócz znanych nam 512-bajtowych sektorów logicznych, dyskietka zawiera wiele dodatkowych pól służących kontrolerowi do administracji sektorami (odnajdywania sektorów i przechowywania informacji o ich stanie) oraz pomagających korygować niedokładności mechanicznego wykonania napędu i dyskietki, jak również wahania
prędkości obrotowej dysku. Dodatkowe pola na ścieżce pomagają w uzyskaniu stabilnego ciągu impulsów synchronizacyjnych potrzebnych w obróbce danych (szczególnie MFM).
W pierwszym przybliżeniu fizyczna organizacja powierzchni dyskietki składa się z jednakowych, koncentrycznych ścieżek. Każda z nich zawiera znacznik początku ścieżki (ang. BOT- Beginning of Trach], sektory w liczbie zależnej od rodzaju dyskietki oraz znacznik końca ścieżki (ang. EOT- End of TracK). Budowę jednej ścieżki dyskietki obrazuje rysunek 6.2.
Kontrolery starszej generacji, wyposażone w mikrokontroler "NEC mPD765 lub jego odpowiednik funkcjonalny Intel 8272, mają zaimpleinentowaną możliwość przełączenia w tryb pracy FM (format używany na dyskietkach komputerów IBM PC). Organizacja zapisu na dyskietce, tj. układ pól dodatkowych i ich znaczenie są takie same dla formatów FM i MFM. Inne są tylko długości i zawartości pewnych znaczników. Przykładowo: znacznik synchronizacyjny S (ciąg zer) jest w przypadku formatu FM skrócony do połowy, bowiem -jak wiemy z poprzedniego podrozdziału - ten rodzaj zapisu niesie w sobie bezpośrednio impulsy synchronizacji niezależnie od składu strumienia danych i łatwiej jest utrzymywać generator w stanie zgodności fazowej. Format FM nie ma w obecnych czasach praktycznego znaczenia i nie będziemy się nim dalej zajmować.
Poszczególne pola ścieżki formatu MFM maj ą następującą za wartość:
Pole; Zawartość;
Z1; 80 bajtów o wartości 4Eh
S; 12 bajtów o wartości OOh
Z2; 4 bajty o wartościach: C2h C2h C2h FCh
Z3; 50 bajtów o wartości 4Eh
Dl; 4 bajty o wartościach: Alh Alh Alh FEh
Pole; Zawartość
ID; metryka adresowa sektora - 4 bajty o następującym
znaczeniu:
bajt 1 - numer ścieżki,
bajt 2 - numer głowicy,
bajt 3 - numer sektora,
bajt 4 - rozmiar sektora kodowany wg klucza:
000- 128 bajtów,
001 -256 bajtów,
010 - 512 bajtów,
011 - 1 kB,
111 - 16 kB
CRC-1; 16-bitowy kod CRC* zabezpieczający pola Dl oraz ID
CRC-2; 16-bitowy kod CRC* zabezpieczający pole danych
sektora
Z4; 22 bajty o wartości 4Eh
D3; 4 bajty o wartości: Alh Alh Alh FBh
Z5; 80 bajtów o wartości 4Eh
Z6; bajty o wartości 4Eh - znacznik końca ścieżki (EOT)
* pojęcie kodu CRC wyjaśnione jest na stronie 358
System operacyjny może mieć wpływ jedynie na zawartość pola ID. Wszystkie funkcje formatujące ścieżkę muszą przekazać kontrolerowi napędu dysków adres w pamięci, pod którym znajduje się odpowiednio przygotowana 4-bajtowa struktura opisująca każdy sektor formatowanej ścieżki oddzielnie. W następnym podrozdziale podam przykład formatowania ścieżki za pomocą funkcji 05h przerwania 13h BIOS-u.
Każda dyskietka posiada w pobliżu swego środka mały otwór, który odsłania przy każdym obrocie fotokomórkę zainstalowaną w napędzie. W ten sposób wytwarzany jest przebieg prostokątny, który podawany jest linią IDX przewodu połączeniowego do kontrolera. Stanowi on przybliżoną informację o początku ścieżki. Jeden bajt danych w przypadku dyskietki HD zajmuje około 16 mikrometra na powierzchni nośnika, tak więc dokładne zlokalizowanie początku ścieżki za pomocą otworu o średnicy 2 mm nie jest oczywiście możliwe.
Dla kontrolera sygnałem początku ścieżki jest napotkanie znacznika Z1 W następnej kolejności odczytywany jest blok impulsów synchronizacyjnych S, które dopasowują dokładnie częstotliwość i fazę drgań generatorów potrzebnych do zdekodowania sygnału MFM. Znacznik S zawiera same zera i powoduje generację czystego sygnału synchro-nizacyjnego. Zmniejszany jest tym samym do minimum szkodliwy wpływ chwilowych zmian prędkości obrotowej dysku. Sygnatura Z2 informuje kontroler, że po niej następować będą sektory ścieżki. Resztę znacznika początku ścieżki wypełnia "szczelina" Z3.
Każdy z następujących teraz sektorów ścieżki ma jednakową budowę i zawiera 10 pól. Pierwsze z nich to pakiet sygnałów synchronizacyjnych S o budowie i znaczeniu takim, jak w znaczniku początku ścieżki. Następnym jest 4-bitowa sygnatura Dl, informująca kontroler, że nastąpi metryka adresowa sektora ID. Pole to jest 4-bajtowym (ścieżka-głowica-sektor-rozmiar) adresem sektora na dysku i stanowi zawartość bloku formatującego, który należy przygotować w pamięci przed wywołaniem funkcji 05h przerwania 13h BIOS-u. Metryka adresowa ID i jej sygnatura Dl zabezpieczone są 16-bitowym kodem CRC umieszczonym w polu CRC-1.
Następuje teraz ponowne zsynchronizowanie generatora MFM z aktualną prędkością obrotową dysku (pole S) i pod głowicami pojawia się znacznik początku danych sektora D3. Pole danych sektora nie musi mieć standardowej długości 512 bajtów, choć jest to wartość powszechnie używana. Długość sektora określona jest w czwartym bajcie pola ID. Może ona sięgać teoretycznie nawet 16 kB, jednak w polach danych o długości większej od 2 kB mogą występować częste przekłamania spowodowane rozsynchroni-zowywaniem się generatorów MFM. Pole danych zabezpieczane jest własną sumą kontrolną w kodzie CRC umieszczaną w polu CRC-2. Szczelina Z5 daje kontrolerowi czas na obliczenie tej sumy i weryfikację wyniku. Pamiętajmy, że kontroler napędu dysków elastycznych nie posiada bufora ścieżki i wszystkie informacje opracowywane są w czasie rzeczywistym, tj. w miarę pojawiania się danych pod głowicami napędu. Szczelina Z5 ma jeszcze dodatkowe znaczenie: jest ona elastycznym buforem między sektorami. Rzeczywiste długości pola danych sektorów mogą się zmieniać, bowiem minimalna zmiana tarcia głowicy o powierzchnię dyskietki (i tym samym zmiana prędkości obrotowej) podczas zapisywania danych nie może być kompensowana zmianą częstotliwości zegara, który jest synchronizowany jedynie polem S. Mogą zatem powstawać lokalne wahania gęstości zapisu, co prowadzi do zmian długości pól danych w sektorach. Pole Z5 zmniejsza zatem szansę na nałożenie się danych sektora na następujące po nich pola.
Całkowita długość sektora, po uwzględnieniu wszystkich pól dodatkowych, wynosi więc 654 bajty. Ten fakt, a także istnienie znaczników BOT i EOT, stanowi o różnicy między pojemnością dysku sformatowanego i niesformatowanego.
Koniec ścieżki (brak dalszych danych) sygnalizowany jest znacznikiem Z6.
Programowanie operacji dyskowych z poziomu systemu MS-DOS
System operacyjny składa się z podprogramów obsługujących różne funkcje komputera, m.in. czytanie i zapis na dyskietkę. Dla uproszczenia (skrócenia) wywołania tych programów korzysta się ze specyficznych dla procesorów serii 80x86 rozkazów zwanych przerwaniami programowymi (instrukcja int n). DOS udostępnia trzy przerwania programowe (21 h, 25h i 26h), które tworzą zestaw elementarnych funkcji obsługujących operacje na dyskach. W tym rozdziale zajmować się będziemy tylko dyskietkami.
Przerwania 25h i 26h są funkcjami niskiego poziomu, tzn. umożliwiają dostęp do logicznych sektorów DOS. Należy zachować szczególną ostrożność w stosowaniu tych funkcji, bowiem system nie sprawdza, gdzie i co piszemy na dysk, toteż niezmiernie łatwo jest uszkodzić logicznie dyskietkę, zamazując np. sektor ładujący. Natomiast przerwanie 21h jest specyficznym podprogramem, udostępniającym wszystkie funkcje systemu operacyjnego MS-DOS (PC-DOS) (tzw. function dispatcher). System "wie", co ma robić dzięki odpowiedniemu mechanizmowi przekazywania parametrów. W pierwszej kolejności do akumulatora ładuje się numer funkcji, a do pozostałych rejestrów jej parametry, następnie wykonuje się przerwanie 21h (rozkazem int 21 h). Po wykonaniu danej funkcji w akumulatorze zwracany jest symboliczny kod błędu lub poprawnie zakończonej operacji.
Wszystkie funkcje usługowe DOS posługują się tym samym mechanizmem przekazywania parametrów i wyników przez rejestry procesora. Numer wykonywanej funkcji przekazywany jest w rejestrze AH. Ustawienie bitu CF (ang. Carry Flag - przeniesienie) rejestru stanu CPU informuje w poniższych funkcjach o wystąpieniu błędu. Symboliczny kod błędu zwracany jest w rejestrze AX. Znaczenie tych kodów podano poniżej.
Zawartość rejestru AX; Przyczyna błędu
00h; operacja wykonana poprawnie
01h; nieznany kod rozkazu
02h; zły adres
04h; nie znaleziono sektora
08h; przepełnienie strony DMA
10h; błąd kodu CRC lub ECC
20h; błąd kontrolera napędu
40h; błąd pozycjonowania głowicy
80h; brak gotowości napędu (np. otwarte drzwiczki)
Przerwanie 25h
Przerwanie 25h umożliwia wczytanie jednego lub większej liczby sektorów logicznych.
Parametry wejściowe:
AL numer napędu (0 = A, l = B, 2 = C itd.);
CX liczba czytanych sektorów;
DX numer pierwszego sektora;
DS:BX adres bufora w pamięci, w którym mają być umieszczone odczytane dane.
Wartości zwracane:
(po powrocie z przerwania 25h i 26h zawartość rejestru stanu procesora umieszczana jest również na stosie, skąd należy ją usunąć):
AX kod błędu;
CF l w przypadku wystąpienia błędu.
Przykład:
Przytoczony fragment kodu w języku Turbo C obrazuje wykorzystanie funkcji INT 25h do odczytania sektora 13 dyskietki umieszczonej w napędzie A: i umieszczenia go w tablicy Sektor. (Odczyt sektorów za pomocą przerwania 25h realizuje funkcja biblioteczna absread Turbo C).
/* Funkcja czyta sektor logiczny 13 dyskietki w stacji A: używając przerwania 25h DOS i umieszcza go w tablicy Sektor */
#include
#include unsigned char far Sektor[512]; union REGS RejWej, RejWyj; struct SREGS RejSeg; void CzytajSektorInt_25(void) {
RejSeg.ds=FP_SEG(Sektor) ; /* adres bufora */
RejWej.x.bx=FP_OFF{Sektor) ;
RejWej.h.al=OxOO; /* napęd A: */
RejWej.x.cx=0x01; /* jeden sektor */
RejWej.x.dx=0x0d; /* pierwszy sektor nr 13 */
int86x(0x25,SRejWej,SRejWyj,&RejSeg);
asm pop ax; /* usuń zbędne słowo ze stosu */
if((RejWyj.K.cflag & 0x01) == 0x01) printf ("\n Wystąpił błąd nr: %x\n",RejWyj.x.ax);
Przerwanie 26h
Przerwanie 26h umożliwia zapisanie jednego lub większej liczby sektorów logicznych.
Parametry wejściowe:
AL numer napędu (0 = A, l = B, 2 = C itd.);
CX liczba czytanych sektorów;
DX numer pierwszego sektora;
DS:BX adres bufora w pamięci, zawierającego zapisywane dane.
Wartości zwracane:
AX kod błędu;
1 w przypadku wystąpienia błędu.
Przerwanie 21h
Zmiana 1565 bajtu w pliku dos5net.txt zapisanym w katalogu c:\bin\dos5\doc za pomocą funkcji INT 25h i INT 26h może przyprawić o frustrację. Aby to uczynić, należy wykonać przedstawione poniżej kroki:
Wczytać funkcją INT 25h sektor zawierający katalog główny.
Odszukać numer jednostki alokacji dla katalogu \bin. Przy obszernych katalogach może okazać się konieczne wczytanie sektora tablicy alokacji.
W sektorze zawierającym katalog \bin odszukać informację o podkatalogu \dos5, wczytać odpowiedni sektor i postępować dalej w analogiczny sposób aż do odnalezienia katalogu \doc.
Po określeniu pierwszej jednostki alokacji dla pliku dos5net.txt należy, podążając łańcuchem jednostek alokacji zapisanych w FAT, określić numer czwartej jednostki alokacj i (1565 = 3 x 512 + 29).
Wczytać odnaleziony sektor funkcją INT 25h i zmodyfikować jego 29 bajt.
Zapisać zmodyfikowany sektor funkcją INT 26h.
Zmodyfikować (ewentualnie) datę i czas utworzenia pliku w zawierającym go katalogu.
Gdyby zaszła konieczność przedłużenia pliku, dodatkowo odnaleźć wolne jednostki alokacji w FAT i dowiązać je do opisującego plik łańcucha.
Na szczęście, oprócz wyżej opisanych funkcji, które ukierunkowane są na logiczne sektory dysku, możliwe jest wykorzystanie funkcji przerwania 21h, dzięki którym można przekazywać nazwy plików w tradycyjnie przyjętej formie:
napęd:\sciezka\nazwa.rozszerzenie
Operacje zapisu bądź odczytu pojedynczych bajtów definiuje się w odniesieniu do początku pliku lub miejsca ostatniej operacji.
Przytaczam tu tylko przykładowe funkcje przerwania 21h obsługujące dyski, gdyż nie jest to książka poświęcona programowaniu jako takiemu, a raczej technicznej stronie budowy komputera. Oto niektóre funkcje przerwania 21h
Funkcja; Działanie;
3Ch; utworzenie pliku
3Dh; otwarcie pliku
3Eh; zamknięcie pliku
41h; usunięcie pliku
39h; utworzenie katalogu
3Ah; usunięcie katalogu
3Bh; przejście do innego katalogu
57h; odczyt lub zmiana informacji o dacie i czasie modyfikacji pliku:
Obsługa dysków
za pomocą funkcji BIOS
Piętro niżej w hierarchii wewnętrznych procedur komputera leżą zawarte w pamięci stałej podprogramy BIOS-u. Jakkolwiek prawie każdy model płyty głównej komputera posługuje się inną wersją tych procedur, musi być zagwarantowana zgodność punktów wejścia, realizowana przez wypełnienie obszaru wektorów przerwań odpowiednimi adresami procedur oraz zgodność realizowanych funkcji. Właśnie z tych procedur korzysta system operacyjny.
Napędy dysków elastycznych obsługiwane są przez funkcje OOh - 05h, 08h i 15h przerwania 13h BIOS. Model AT wyposażony został w dwie dodatkowe funkcje, poświęcone kontroli "tożsamości" dyskietki w napędzie.
Procedura obsługi przerwania 13h sprawdza poprawność przekazywanych w rejestrach parametrów (np. czy następuje odwołanie do istniejącego napędu) i ostatecznie wywołuje żądaną funkcję. BIOS numeruje napędy dysków elastycznych następująco:
A = 0, B - l itd. Numery dysków twardych rozpoczynają się od 80h, tj. C = 80h, D = 81h itd.
Po powrocie z przerwania należy sprawdzić bit przeniesienia (CF) rejestru stanu procesora. Ustawienie tego bitu świadczy o nieprawidłowym wykonaniu operacji. Symboliczny numer błędu umieszcza BIOS w rejestrze AH oraz w obszarze danych BIOS-u pod adresem 0040:0041 h.
Kody błędów zwracane przez przerwanie 13h podano niżej.
Wartość; Znaczenie
00h; operacja wykonana bezbłędnie
0lh; zły numer funkcji
02h; nie znaleziono znacznika adresu
03h; dyskietka zabezpieczona przed zapisem
04h; nie znaleziono sektora
08h; błąd DMA
09h; przepełnienie strony DMA
l0h; błąd odczytu
20h; błąd kontrolera
40h; nie znaleziono ścieżki
80h; brak reakcji napędu
Poniżej opisano funkcje przerwania 13h obsługujące napędy dysków elastycznych.
Funkcja 00h
Działanie:
Funkcja wykonuje inicjalizację kontrolera, tj. sprowadza wewnętrzne rejestry kontrolera i napędu do ściśle określonego stanu początkowego. Aktualnie wykonywana operacja zostaje przerwana. Działanie funkcji nie dotyczy konkretnego napędu, ale kontrolera i wszystkich do niego przyłączonych napędów.
Parametry wejściowe:
AH 00h;
DL 00h (dla kontrolera napędu dysków elastycznych).
Wartości zwracane:
AH kod błędu;
CF l w przypadku wystąpienia błędu.
Przykład:
mov ah,OOh ; funkcja O
mov dl,OOh ; zawsze dla kontrolera napędu dyskietek
int 13h ; inicjalizacja kontrolera
Funkcja 01h
Działanie:
Funkcja odczytuje status ostatniej operacji. Odtwarza w rejestrze AH bajt statusu opisujący ostatnio przeprowadzoną operację bez względu na to, jak dawno się ona zakończyła. Znaczenie kodów statusu podano na str. 346.
Parametry wejściowe:
AH 0lh;
DL 00h (dla kontrolera napędu dysków elastycznych).
Wartości zwracane:
AH kod statusu;
CF l w przypadku wystąpienia błędu.
Funkcja 02h
Działanie:
Odczytuje jeden lub kilka sektorów z dyskietki do bufora w pamięci. Zawartość wszystkich odczytanych sektorów zapisywana jest do pamięci począwszy od podanego w rejestrach ES:BX adresu, zamazując ewentualnie inne dane. Do obowiązków programisty należy zarezerwowanie odpowiedniej ilości wolnego obszaru pamięci.
Parametry wejściowe:
AH - 02h;
AL - liczba sektorów do przeczytania;
CH - numer ścieżki;
CL - numer sektora;
DH - numer głowicy;
DL - numer napędu (0 = A, l = B itd.);
ES:BX - adres bufora na zawartość przeczytanych sektorów.
Wartości zwracane:
AH - kod błędu;
CF - l w przypadku wystąpienia błędu.
Przykład:
/* Funkcja czyta sektor 5 ścieżki O dyskietki w stacji A:
używając funkcji 2 przerwania 13h BIOS i umieszcza go w tablicy Sektor */
#include ttinclude
unsigned char far Sektor[512];
union REGS RejWej, RejWyj;
struct SREGS RejSeg;
void CzytajSektorInt_13 (void)
{
RejSeg.es=FP_SEG(Sektor);
RejWej.x.bx=FP_OFF(Sektor); /* adres bufora */
RejWej.h.ah=0x02; /* funkcja nr 2 INT 13h */
RejWej.h.dl=OxOO; /* napęd A: */
RejWej.h.dh=OxOO; /* ścieżka O */
RejWej.h.cl=0x05; /* sektor 5 */
int86x(0x13,SRejWej,SRejWyj,SRejSeg);
if((RejWyj.x.cflag & 0x01) == 0x01)
printf("\n Wystąpił błąd nr: %x\n",RejWyj.h.ah);
}
Funkcja 03h
Działanie:
Funkcja ta jest dopełnieniem funkcji 02h, zapisującym dane do podanych sektorów dysku. Należ)' zwrócić uwagę na to, że jako sektor zapisywane są zawsze pełne 512-bajtowe bloki pamięci (począwszy od adresu podanego w rejestrach ES:BX) - także wtedy, gdy nie zawierają one wyłącznie danych umieszczonych tam przez programistę.
Parametry wejściowe:
AH - 03h;
AL -liczba sektorów do zapisu;
CH - numer ścieżki;
CL - numer sektora;
DH - numer głowicy;
DL - numer napędu (O = A, l = B itd.);
ES:BX - adres bufora zawierającego zapisywane dane.
Wartości zwracane:
AH - kod błędu;
CF - 1 w przypadku wystąpienia błędu.
Funkcja 04h
Działanie:
Funkcja ta sprawdza poprawność kodów CRC sektora, przeprowadzając czytanie próbne. Druga część działania funkcji, polegająca na odczytaniu sektora i porównaniu go z zawartością obszaru wskazywanego przez ES:BX, jest dziedzictwem z czasów IBM PC i nie jest obecnie implementowana.
Parametry wejściowe:
AH - 04h;
AL - liczba sektorów do weryfikacji;
CH - numer ścieżki;
CL - numer sektora;
DH - numer głowicy;
DL - numer napędu (O = A, l = B itd.);
ES:BX - adres obszaru pamięci zawierającego dane do porównania.
Wartości zwracane:
AH - kod błędu;
CF - l w przypadku wystąpienia błędu.
Funkcja 05h
Działanie:
Funkcja ta służy do formatowania ścieżki. W pamięci należy przygotować odpowiednie bloki danych, opisujące
oddzielnie każdy sektor. Funkcja umieszcza je w polu identyfikatora (ID) danego sektora. Stanowią one metrykę
adresową, umożliwiającą późniejsze odnalezienie właściwego sektora. Blok danych składa się z czterech bajtów,
które oznaczają kolejno:
bajt 0-numer ścieżki,
bajt l-numer głowicy,
bajt 2-numer sektora,
bajt 3-liczbę bajtów w sektorze: 0 - 12, 1 - 256, 2 - 512; 3 - 1024.
Parametry wejściowe:
AH-05h;
AL-liczba sektorów na ścieżce;
CH-liczba ścieżek w cylindrze (dotyczy dysku twardego);
CL-numer sektora;
DH-numer głowicy;
DL-numer napędu (0 = A, l = B itd.);
ES:BX adres 512-bąjtowego bufora zawierającego identyfikatory
kolejnych sektorów (część bufora pozostaje nie wykorzystana).
Wartości zwracane:
AH-kod błędu;
CF-1 w przypadku wystąpienia błędu.
Przykład:
/* Funkcja formatuje ścieżkę "Sc" na stronie "Str" formatem
256 bajtów na sektor, 10 sektorów na ścieżkę */
#include
#include
#include
#define dens_256 1
struct BlokForm
{
unsigned char sc; /* ścieżka */
unsigned char st; /* strona */
unsigned char se; /* sektor */
unsigned char dl; /* liczba bajtów/sektor */
};
struct BlokForm far * WskBlokForm;
union REGS RejWej, RejWyj;
struct SREGS RejSeg;
void FormatSc (int Sc, int Str)
{
int i ;
WskBlokForm=(struct BlokForm far * ) malloc (10*4 ) ;
for(i = 0;i<10; i + +) /* przygotowanie bloku identyfikatorów */
{
WskBlokForm[i].sc=Sc;
WskBlokForm[i].st=Str;
WskBlokForm[i].se=i;
WskBlokFormfi].dl=dens_256;
}
RejSeg.es=FP_SEG(WskBlokForm); /* adres bloku identyfikatorów */
RejWej.x.bx=FP OFF(WskBlokForm};
RejWej.h.ah=0x05; /* funkcja nr 5 INT 13h */
RejWej.h.dl=0x01; /* napęd B: */
RejWej.h.dh=Str; /* parametr "strona" */
RejWej.h.ch=Sc; /*parametr "ścieżka" */
RejWej.h.al=0x0a; /* 10 sektorów na ścieżkę */
int86x(0x13,SRejWej,SRejWyj,&RejSeg); /* przerwanie 13h */
if((RejWyj.x.cflag & 0x01) == 0x01)
printf("\n Wystąpił błąd nr: %x\n",Rej Wyj.h.ah);
free (WskBlokForm);
Funkcja 08h
Działanie:
Funkcja zwraca informację o zainstalowanym napędzie, ale zupełnie lekceważy aktualnie stosowany nośnik.
Oznacza to na przykład, że napęd HD (1.2 MB) z umieszczoną w nim dyskietką 360 kB melduje się jako
typ 2 (tak samo identyfikowany jest napęd pusty). Elementarne wiadomości o napędzie można odczytać wprost
z rejestrów CX i DX. Dokładne dane znajdują się w obszarze danych DOS począwszy od adresu 0050:0022h.
Na pełną tablicę danych wskazuje też po powrocie z funkcji 08h para rejestrów ES:DI.
Parametry wejściowe:
AH - 08h;
BH - 0
Wartości zwracane:
BL-typ napędu: 0 - dysk twardy, 1- 360 kB, 2-1,2 MB, 3 - 720 kB, 4-l,44 MB;
CH-liczba ścieżek pomniejszona o l;
CL-liczba sektorów na ścieżkę pomniejszona o 1;
DH-liczba głowic napędu pomniejszona o l;
DL-numer napędu (0 = A, l = B itd.);
ES:DI-wskaźnik do tablicy informacyjnej;
CF-1 w przypadku wystąpienia błędu.
Budowa tablicy informacyjnej:
Bajt 0:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;
bity 7-4 - Czas pozycjonowania głowicy.
bity 3-0 - Opóźnienie podnoszenia głowic (T2). Kontroler napędu wprowadza to opóźnienie, wykonawszy bieżący rozkaz i oczekując na następny.
Bajt l:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-l - Opóźnienie opuszczania głowic (Tl).
bit 0 - 0 - transmisja kanałem DMA, l - transmisja bez udziału DMA.
Bajt 2:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-0 - Opóźnienie wyłączenia silnika napędu.
Bajt 3:
x; x; x; x; x; x; x; bit l; bit 0;
bity 7-2 - Nie używane.
Liczba bajtów w sektorze: 00 - 128, 01 - 256, 10 - 512, 11 - l 024
Bajt 4:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0
bity 7 - O - Liczba sektorów na ścieżce: 00001000 - 8; 00001001 - 9; 00001111 - 15; 00010010- 18;
Bajt 5:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0
bity 7 - O - Rozmiar szczeliny (GAP) w bajtach:
1Bh dla napędów HD (l ,2 MB),
2Ah dla napędów DD (360/720 kB).
Bajt 6:
x; x; x; x; x; x; x; x;
bity 7-0 - Nie używane.
Bajt 7:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-O - Rozmiar szczeliny przy formatowaniu:
50h dla napędów DD 360/720 kB,
54h dla napędu HD l,2 MB,
6Ch dla napędu HD 1,44 MB.
Bajt 8:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-O - Wartość bajtu wypełniającego formatowany sektor, zwykle F6h.
Bajt 9:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-O - Czas uspokojenia głowic po pozycjonowaniu, w milisekundach.
Bajt 10:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-0 - Czas rozbiegu silnika w jednostkach równych 0,125 s.
Funkcja 15h
Działanie:
Model AT wyposażono w dwie dodatkowe funkcje, robiące użytek z końcówki 34-tej przewodu łączącego kontroler z napędem. Można na tej podstawie ustalić, czy od czasu poprzedniej operacji dyskowej otwierane były drzwiczki napędu. Jeżeli w komputerze AT wydamy dwa razy pod rząd polecenie dir a: pozostawiając dyskietkę w napędzie, drugie polecenie odczyta zawartość katalogu z wewnętrznego bufora DOS. Otwarcie i zamknięcie drzwiczek wymusi powtórne przeczytanie dyskietki - system zakłada, że nośnik został wymieniony. Nie wszystkie modele napędów wystawiają odpowiedni sygnał, ponadto nie każdy BIOS obsługuje tę funkcję.
Funkcja 15h zwraca rodzaj nośnika (rzeczywistą pojemność dyskietki umieszczonej w danym napędzie). Funkcja sprawdza też, czy napęd posiada funkcję kontroli zmiany nośnika.
Parametry wejściowe:
AH-15h;
DL-numer napędu (O = A, l = B itd.).
Wartości zwracane:
AH-numer błędu lub następująca informacja:
00h - brak napędu,
01 h - napęd nie korzysta z linii 34,
02h - napęd korzysta z linii 34,
03h - dysk twardy;
CF-l w przypadku wystąpienia błędu (AH zawiera numer błędu).
Funkcja 16h
Działanie:
Funkcja informuje, czy od czasu ostatniej operacji dyskowej nastąpiło otwarcie i zamknięcie drzwiczek napędu. Jeśli tak, to należy zakładać, że wymieniono dyskietkę w napędzie.
Parametry wejściowe:
AH-16h;
DL-numer napędu (0 = A, l = B itd.).
Wartości zwracane:
AH - numer błędu lub następująca informacja:
00h - nie wymieniono dyskietki,
0l h - nieprawidłowy numer napędu,
06h - wymieniono dyskietkę;
CF - 1w przypadku wystąpienia błędu (AH zawiera numer błędu).
Bezpośredni dostęp do kontrolera napędu dysków elastycznych
Opisane w poprzednich rozdziałach funkcje nie stanowią najniższego piętra w hierarchii procedur wewnętrznych
komputera. Wcześniej czy później muszą się one odwołać bezpośrednio do kontrolera napędu dysków elastycznych.
Nazwa "kontroler" jest w tym wypadku w pełni uzasadniona, gdyż układ ten jest małym komputerem (mikrokontrolerem)
wyposażonym we własny procesor (zwykle mPD765 w PC/XT lub 82072 w PC/AT) i wykonującym własny program.
Kontroler napędu dysków elastycznych pośredniczy między magistralami systemowymi a maksymalnie czterema
napędami dysków elastycznych. Jest on zwykle montowany na karcie umieszczanej w jednym z gniazd rozszerzenia i
tym samym ma dostęp do magistral systemowych. Istnieją również rozwiązania płyt głównych ze zintegrowanym na
nich kontrolerem.
Połączenie kontroler-napęd realizowane jest za pomocą wielożyłowego przewodu płaskiego, którego wtyki są różne
dla różnych typów napędów, ale sygnały i ich poziomy ściśle trzymają się do dziś standardu SA-450 opracowanego
dla potrzeb modelu IBM PC przez firmę Shugart Associates.
Powszechnie stosowana jest metoda zapisu MFM, która, upraszczając zagadnienie, daje podwój na gęstość zapisu w
porównaniu do systemu FM i praktycznie go wyparła.
Skupmy przez chwilę naszą uwagę na operacji zapisu (odczyt wymaga wykonania czynności odwrotnych). Do zadań
kontrolera należy:
Nadzorowanie sygnałów na magistralach systemowych i dekodowanie adresów własnych portów.
Transformacja równoległego formatu danych na szynie danych na postać szeregową.
Wyposażenie uformowanych bloków danych w sumy kontrolne CRC.
Wytwarzanie wszystkich fizycznych elementów sektora zapisywanego na dysk, tj. znaczników adresowych,
synchronizacyjnych, sygnatur itp.
Generowanie sygnału synchronizującego dla potrzeb formatu MFM.
Nadzorowanie stanu elementów mechanicznych napędu i sterowanie ich położeniem.
Rejestry kontrolera napędu dysków elastycznych.
Rozkazy i dane przekazywane są do rejestrów kontrolera, widzianych w przestrzeni adresowej komputera jako porty (tabela 6.1).
Tabela 6.1.
Porty udostępniające rejestry kontrolera napadu dysków elastycznych
Rejestr; Kontroler nadrzędny; Kontroler podrzędny; Kierunek
adres bazowy; 3Foh; 370h; -
rejestr wyjściowy; 3F2h; 372h; tylko zapis
rejestr stanu; 3F4h; 374h; tylko odczyt
rejestr danych; 3F5h; 375h; dwukierunkowy
dodatkowe porty dostępne w modelu AT
rejestr wejściowy; 3F7h; 377h; tylko odczyt
rejestr konfiguracji; 3F7h; 377h; tylko zapis
Modele PS/2 mają poszerzoną listę rejestrów i rozkazów. Pomiędzy poszczególnymi modelami tej serii występują istotne różnice; ich opis zostanie pominięty, aby nie zaciemniać tematu.
Kontroler może być uznany przez system za nadrzędny lub podrzędny. Jeden kontroler w systemie jest zawsze nadrzędny. Standardowo do przesyłania danych między pamięcią i kontrolerem wykorzystywany jest kanał 2 DMA (dla obydwu typów konfiguracji). Kontroler sygnalizuje zakończenie transmisji przerwaniem sprzętowym IRQ6. Przerwanie to obsługiwane jest standardowo przez procedurę obsługi przerwania OEh BIOS-u.
Poniżej podano znaczenie poszczególnych bitów rejestrów.
Rejestr wyjściowy
bit 7; bit 6; bit 5; bit 4; bit 2; bit1; bit 0;
bit 7-Wartość l powoduje włączenie silnika napędu D.
bit 6-Wartość l powoduje włączenie silnika napędu C.
bit 5-Wartość l powoduje włączenie silnika napędu B.
bit 4-Wartość l powoduje włączenie silnika napędu A.
bit 3-Wartość l włącza mechanizm obsługi kanału 2 DMA i IRQ6.
bit 2=Wartość 0 powoduje wyzerowanie (resef) kontrolera.
bity l - 0 - Wybór napędu: 00- A 01 - B 10- C 11 - D
Rejestr stanu
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l ; bit 0;
bit 7=Rejestr danych (port3F5h/375h):
l - gotowy,
0 - niegotowy.
bit 6-Kierunek transmisji:
l - kontroler -> CPU,
0 - CPU -> kontroler.
bit 5-0 - tryb pracy z wykorzystaniem DMA,
l - bezpośredni zapis/odczyt do portu danych.
bit 4-l - kontroler jest w trakcie wykonywania rozkazu,
0 - kontroler w stanie oczekiwania.
bit 3-l - napęd D w trakcie pozycjonowania głowic,
bit 2-l - napęd C w trakcie pozycjonowania głowic,
bit 1-l - napęd B w trakcie pozycjonowania głowic,
bit 0-l - napęd A w trakcie pozycjonowania głowic.
Rejestr wejściowy (występuje od modelu AT)
bit 7; x; x; x; x; x; x; x;
bit 7-informacja o zmianie dysku od czasu ostatniej operacji:
1 - l = dysk wymieniony,
O - dysk nie wymieniony
bity 6-0 - Nie używane.
Rejestr konfiguracji (występuje od modelu AT)
X; x; x; x; x; x; bit 1; bit O;
bity 7-2 -Nie używane.
bity l-0 -Prędkość transmisji kontroler-napęd:
00- 500kbit/s
01- 300 kbit/s,
10- 250 kbit/s,
11- 1 Mbit/s.
Napędy dysków o wysokiej gęstości (HD - High Density) 1,2 MB i 1,44 MB mają podwyższoną do 360 obr/min
prędkość obrotową. Zwykła dyskietka 360 kB w swoim rodzimym napędzie obraca się z prędkością 300 obr/min.
Przy efektywnej długości sektora i szczeliny między sektorowej wynoszącej około 800 bajtów daje to prędkość
transmisji 250 kbit/s. Ta sama dyskietka umieszczona w napędzie 1,2 MB jest odczytywana z prędkością 300 kbit/s.
Podobne zjawiska występują w napędach 3,5-calowych (1,44 MB). Dla prawidłowej pracy kontrolera należy zawsze,
testując rodzaj napędu i aktualnego w nim nośnika, zapisywać właściwe wartości w rejestrze konfiguracyjnym.
Cykl rozkazowy kontrolera
Faza przygotowawcza
W skład tej fazy wchodzą następujące czynności:
Przygotowanie oprogramowania DMA tak, by po zgłoszeniu przez kontrolera żądania DRQ2 adres bazowy DMA
wskazywał na początek bufora, a licznik adresowy był inkrementowany.
Zapisanie do rejestru wyjściowego (port 3F2h/372h) następujących danych:
numeru napędu (bity l - 0),
aktywacji kontrolera (bit 2),
typu transmisji = DMA (bit 3),
rozkazu uruchomienia silnika stosownego napędu (jeden z bitów 7 - 4).
Kontroler oczekuje teraz rozkazu podawanego przez rejestr danych (port3F5h/375h).
Faza przekazywania rozkazu
Na każdy z rozkazów może składać się wiele bajtów.
Na podstawie pierwszego bajtu rozkazu (zawartej w nim sygnatury) kontroler rozpoznaje, z ilu bajtów składa się rozkaz.
Poszczególne bajty rozkazu są akceptowane tylko wtedy, gdy bit 7 rejestru stanu jest ustawiony (należy to sprawdzić przed przesłaniem każdego bajtu).
Budowa przykładowego rozkazu - rozkaz RS (Read Sector)
Zajmijmy się przykładową funkcją odczytu sektora. Ponieważ napędy dysków elastycznych mają dwie głowice położone naprzeciw siebie po obu stronach dyskietki, możliwe jest jednoczesne czytanie naprzeciwległych (leżących po przeciwległych stronach dyskietki) sektorów.
Faza przekazywania rozkazu
Długość: 9 bajtów.
Bajt l:
bit 7; bit 6; bit 5; t; 0; 1; 1; 0;
bit 7-Wartość l oznacza czytanie obustronne.
bit 6- Format zapisu sektora: l - MFM, O- FM.
bit 5-Wartość l oznacza brak reakcji na napotkanie skasowanego znacznika adresu, wartość O powoduje w takiej sytuacji wystąpienie błędu.
bit 4-0 - 00110 - sygnatura rozkazu (opcode).
bit 2:
x; x; x; x; x; bit 2; bit 1, bit 0;
bity 7-3 -Nie używane.
bit 2 -Numer głowicy.
bity l-0 -Numer napędu: 00- A, 01 - B, 10- C, 11 - D.
Bajt 3:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bit 7-0-Numer ścieżki.
Bajt 4:
x; x; x; x; x; x; x; bit O;
bity 7-1-Nie używane.
bit O-Numer głowicy.
Bajt 5:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-0- Numer sektora.
Bajt 6:
x; x; x; x; x; bit 2; bit l; bit 0;
bity 7-3-Nie używane.
bity 2-0-
Wielkość sektora:
000 - 128 B,
001 - 256 B,
010 - 512B,
011 - l kB,
111 - 16 kB.
Bajt 7:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-0-Numer ostatniego sektora do przeczytania. Uwaga: gdy czytany jest tylko jeden sektor, równe wartości
z bajtu 5. Inną możliwością zaprogramowania liczby sektorów do przeczytania jest ustawienie licznika transmisji
kanału DMA; sygnał TC (Terminal Counf] z kanału DMA przerywa wówczas transmisję po przeczytaniu zadanej
liczby sektorów.
Bajt 8:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-0- Długość szczeliny Z5. Zwykle bajt zawiera sygnaturę 01000110, oznaczającą szczelinę 80-bajtową.
Bajt 9:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bity 7-0- WPC zwykle zawierają sygnaturę FFh, co
oznacza sektor 512-bajtowy.
Po odebraniu właściwej liczby anonsowanych w pierwszym słowie rozkazu bajtów kontroler przechodzi do fazy przekazywania danych.
Faza przekazywania danych
W podanym przykładzie kontroler ustawia głowice nad adresowaną ścieżką i od-czekuje czas T1 (por. opis funkcji 08h przerwania 13h BIOS-u).
Głowice opuszczane są na powierzchnię dyskietki i rozpoczyna się czytanie metryk adresowych sektorów ścieżki aż do napotkania sektora określonego w bajcie 5 rozkazu (większość nowoczesnych napędów dyskietek ma głowice cały czas opuszczone, co przyspiesza operacje dyskowe).
Odczytywany jest blok danych sektora wraz z polem CRC-2, po czym sprawdzana jest ich suma kontrolna.
Sygnałem DRQ2 uruchamiany jest mechanizm DMA i blok danych przekazywany jest do pamięci (kontroler napędu dysków elastycznych nie posiada żadnego mechanizmu buforowania danych!).
Następne sektory odczytywane są do momentu, gdy:
nadejdzie sygnał TC z kanału DMA lub
napotkany zostanie koniec ścieżki lub
odczytany zostanie ostatni sektor podany w bajcie 7 rozkazu RS.
Głowice pozostają jeszcze na powierzchni dyskietki przez czas T2, oczekując na mogący nadejść kolejny rozkaz (przyspiesza to dostęp do danych).
Głowice są podnoszone.
Wykonanie fazy przekazywania danych kończy się wygenerowaniem przez kontroler napędu dysków przerwania IRQ6.
Kontroler ma w swoim repertuarze również rozkazy pozbawione fazy przekazywania danych (np. odpytywanie stanu napędu). Po odebraniu rozkazu przechodzi on wtedy do fazy końcowej, jednak i w tym przypadku generowane jest przerwanie 1RQ6.
Faza końcowa
Kontroler dysponuje czterema rejestrami statusowymi STATUS-0 - STATUS-3 (nie mylić z rejestrem stanu dostępnym
przez port 3F4h/374h), które dostępne są do wglądu dla procesora w fazie końcowej. Zależnie od rodzaju zrealizowanego
rozkazu niosą one też inne informacje.
Bajt l; STATUS-0
Bajt 2; STATUS-1
Bajt 3; STATUS-2
Bajt 4; ŚCIEŻKA
Bajt 5; GŁOWICA
Bajt 6; SEKTOR
Bajt 7; ROZMIAR
W naszym przykładzie przez port danych zwracany jest ciąg siedmiu bajtów niosących informacje o zakończonej operacji.
Bez względu na ich ewentualne wykorzystanie do obsługi mogących wystąpić sytuacji wyjątkowych, należy odebrać
z portu danych wszystkie 7 bajtów. Standardowa procedura obsługi przerwania IRQ6 po każdej operacji dyskowej odbiera
automatycznie z portu danych do siedmiu bajtów i umieszcza je w obszarze informacyjnym BIOS-u począwszy od
adresu 0040:0042h.
W poniższym opisie objaśnienie znaczenia danej pozycji bitowej rejestrów odnosi się do stanu, w którym jest ona
ustawiona (ma wartość logicznej jedynki). Zero logiczne na danej pozycji oznacza sytuację odwrotną, chyba że podano
inne wyjaśnienie.
Bajt l: STATUS-0
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;
Kod zwracany po wykonaniu rozkazu:
00 - normalne zakończenie rozkazu,
0l - rozpoczęto wykonanie rozkazu ale go nie dokończono,
10 - nie podjęto wykonania rozkazu (zły kod),
11 - przerwano wykonywanie rozkazu poprzez polling.
bit 5 - 1 - poszukiwanie ścieżki zakończone prawidłowym
pozycjonowaniem głowic,
0 - poszukiwanie ścieżki trwa.
bit 4 - Sygnał błędu pozycjonowania. Mimo wysłania 79 impulsów do mechanizmu silnika krokowego napędzającego ramiona głowic nie osiągnięto ścieżki zerowej.
bit 3 - Brak sygnału gotowości napędu.
bit 2 - Aktualnie pracująca głowica:
I - głowica nr 1, 0 - głowica nr 0.
bity l-O - Aktualnie wybrany napęd: 00 - A, 01 - B, 10- C, 11 - D.
Bajt 2: STATUS-1
bit 7; x; bit 5; bit 4; x; bit 2; bit l; bit 0;
bit 7-Osiągnięto koniec ścieżki.
bit 6-Nie używany.
bit 5-Błąd sumy kontrolnej CRC-1 lub CRC-2.
bit 4-Przekroczenie limitu czasu w oczekiwaniu na reakcję ze strony procesora lub układu DMA (overrun).
bit 3-Nie używany.
bit 2-Nie znaleziono sektora.
bit 1-Dyskietka zabezpieczona przed zapisem.
bit 0-Mimo wykonania pełnego obrotu dyskietki (dwa impulsy IDX z zespołu fotokomórki) nie znaleziono metryki adresowej sektora.
Bajt 3: STATUS-2
x; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit 0;
bit 7-Nie używany.
bit 6-Podczas odczytu napotkano sektor z metryką adresową usuniętych danych.
bit 5-Błąd sumy kontrolnej CRC-2.
bit 4-Niewłaściwy numer ścieżki.
bit 3-Dane odczytane z sektora w tiybie porównania są identyczne z danymi przesłanymi przez CPU lub kanał DMA.
bit 2-Nie znaleziono ścieżki zawierającej dane identyczne z przesłanymi przez CPU lub kanał DMA.
bit 1-Niewłaściwy numer ścieżki.
bit 0-Nie znaleziono metryki adresowej sektora.
Bajt STATUS-3, nieobecny w fazie końcowej rozkazu RS, występuje w fazach końcowych innych rozkazów.
Odzwierciedla on stan niektórych linii przewodu połączeniowego napęd-kontroler.
Bajt STATUS-3
bit 7; bit 6; bit 5; bit 4; bit 3; bit2; bit l; bit 0;
bit 7-Linia FSIG (Faulf), istotna tylko dla kontrolera mPD765, poza tym stale 0.
bit 6-Linia WP (Write Protected) - dyskietka zabezpieczona przed zapisem.
bit 5-Linia RDY (Ready) - gotowość napędu, istotna tylko dla kontrolera mPD765, poza tym stale l.
bit 4-Linia TRKO (Track 0), l = osiągnięto ścieżkę zerową.
bit 3-Linia DSLW (Double Side), l = napęd jest dwustronny.
bit 2-Linia HDSEL (HeadSelecf):
I - wybrano głowicę nr l,
O - wybrano głowicę nr 0.
bity l-O-Linie DS l i DSO (Drive Selecf) - wybór napędu:
00 - A,
01 - B,
10 - C,
11 - D.
Bajt 4: Ścieżka
bit 7; bit 6; bit 5; bit 4; bit 3; bit2; bit l; bit 0;
bity 7-0-Podają numer ścieżki, na której znajdował się ostatni z przeczytanych przez kontroler sektorów.
bit 7; bit 6; bit 5; bit 4; bit 3; bit2; bit l; bit 0;
Bajt 5: Głowica
x; x; x; x; x; x; x; bit 0;
bity 7-l-Nie używane.
bit 0=Numer głowicy, która była aktywna jako ostatnia:
0 - głowica 0,
l - głowica 1.
Bajt 6: Sektor
bit 7; bit 6; bit 5; bit 4; bit 3; bit2; bit l; bit 0;
bity 7-0-Numer ostatniego z przeczytanych sektorów.
Bajt 7: Rozmiar sektora
x; x; x; x; x; bit2; bit l; bit 0;
bity 7-3-Nie używane.
bity 2-0-Rozmiar ostatnio przeczytanego sektora, kodowany następująco:
000 - 128 bajtów,
001 - 256 bajtów,
010 - 512 bajtów,
011 - l kB,
...
111 - 16kB.
Alternatywne metody transmisji danych
Transmisja poprzez kanał DMA nie jest oczywiście jedyną możliwością przekazywania danych między pamięcią a kontrolerem. Ustawienie bitu 3 w rejestrze wyjściowym kontrolera oraz wyzerowanie bitu O w drugim bajcie rozkazu STOD (inne rozkazy kontrolera nie są tu omawiane) wprowadza kontroler w tryb pracy bez udziału DMA.
Obecność bajtu w porcie danych (przy odczycie danych z dysku) lub żądanie umieszczenia tam bajtu (przy zapisie danych na dysk) wyzwala przerwanie sprzętowe IRQ6, nie pobudzając jednocześnie linii DREQ2 kontrolera DMA. Procedura obsługi przerwania IRQ6 musi umieć obsłużyć żądanie kontrolera (przesłać bajt danych z portu do pamięci lub odwrotnie). Zakończenie tak zmodyfikowanej fazy przekazywania danych również powoduje wygenerowanie przerwania IRQ6, sygnalizującego obecność w porcie danych ciągu rejestrów statusowych (oraz innych) i kończącego rozkaz.
Wyzerowanie bitu 3 w rejestrze wyjściowym i ustawienie bitu O w drugim bajcie rozkazu STOD prowadzi do wyłączenia przez kontroler generacji zarówno impulsów DREQ2 jak i IRQ6. Jest to tak zwany tryb pracy polling. Kontroler nie sygnalizuje w żaden sposób konieczności obsługi, a jedynym sposobem stwierdzenia tej konieczności jest stałe sprawdzanie stanu bitu 7 rejestru stanu kontrolera. Ustawienie tego bitu świadczy o konieczności ingerencji w rejestr danych, czyli:
Odczytania bajtu, gdy bit 6 rejestru stanu jest ustawiony (żądany kierunek transmisji kontroler -> CPU).
Zapisania bajtu, gdy bit 6 rejestru stanu jest wyzerowany (żądany kierunek transmisji CPU -> kontroler).
W takiej sytuacji należy programowo rozstrzygnąć, czego oczekuje od nas kontroler i co czeka na nas w rejestrze: dane, rozkaz czy bajty statusu.
Ta forma obsługi kontrolera nie ma znaczenia praktycznego ze względu na zależności czasowe. Port danych kontrolera nie może bowiem przetrzymywać w nieskończoność jakiegoś bajtu i tym samym nie reagować na żadne inne rozkazy.
Uwzględnianie mechanicznych własności napędu
Jak wiadomo, głowice zapisująco-odczytujące napędu dysków elastycznych muszą mieć możliwość osiągnięcia każdej ze ścieżek, tj. przemieszczać się nad powierzchnią dyskietki. Głowice umieszczone są na wózku napędzanym silnikiem krokowym. Oś tego silnika nawija taśmę przymocowaną do wózka (stosowane są również inne mechanizmy np. przekładnia ślimakowa). Cały ten układ ma pewną bezwładność, częstotliwość rezonansu mechanicznego i inne rzeczywiste właściwości mechaniczne. Każdy rozkaz dostępu do napędu wymaga wcześniejszego określenia podstawowej charakterystyki dynamicznej zespołu napędowego głowic.
Możliwości korekcji błędu położenia głowic napędu dyskietek są bardzo ograniczone. Układ sterowania położeniem wózka z głowicami pracuje w otwartej pętli sprzężenia zwrotnego, tzn. kontroler wydaje polecenie umieszczenia ustawienia głowic nad żądaną ścieżką, ale nie otrzymuje informacji o faktycznym położeniu głowic. Jedynym punktem orientacyjnym jest ścieżka zerowa dysku.
Algorytm działania układu pozycjonowania jest następujący:
Wydawane jest polecenie ustawienia głowic nad ścieżką zerową. Silnik krokowy otrzymuje impulsy w liczbie równej maksymalnej liczbie ścieżek dla danego typu nośnika. Osiągnięcie tej pozycji przez głowicę potwierdzane jest sygnałem z czujnika położenia (najczęściej fotokomórki). Jeżeli sygnał ten nie nadchodzi, sygnalizowany jest błąd.
Silnik krokowy otrzymuje impulsy w liczbie żądanego numeru ścieżki.
Jeżeli kontroler rozpoznaje inną ścieżkę, mamy do czynienia z błędem pozycjonowania (kalibracji).
BIOS inicjuje kilkakrotną próbę zapisu/odczytu. Brak sukcesu oznacza konieczność powtórnej kalibracji (rozpoczynającej się od najazdu na ścieżkę zerową; standardowo próba taka wykonywana jest 8 razy).
Szczególnie podatne na błędy są oczywiście operacje, podczas których głowice przemierzają duże odległości np. ze ścieżki O na 79. Wszystkie niedokładności mechanizmu mogą się wtedy nawarstwiać.
Aby zmniejszyć ryzyko błędów pozycjonowania, wprowadzono trzy parametry, które w pewnym stopniu odzwierciedlają rzeczywiste właściwości mechaniczne napędu. Kontroler uwzględnia te dane wprowadzając do pracy swoich układów wykonawczych trzy opóźnienia:
T1 - Czas opóźnienia opuszczenia głowic - uwzględnia czas wygaśnięcia drgań głowic po zakończeniu procesu pozycjonowania, a przed opuszczeniem ich na powierzchnię dyskietki.
T2 - 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.
T3 - Okres impulsów silnika krokowego - uwzględnia bezwładność i czas martwy zespołu silnik-wózek głowic. Zmniejszenie tej wartości powoduje wprawdzie szybszy dostęp do danych, ale niesie w sobie niebezpieczeństwo "połykania" impulsów przez silnik i błędów pozycjonowania.
Powyższe parametry czasowe oraz informacje o wykorzystaniu kanału DMA przekazywane są kontrolerowi rozkazem STOD (Set Type of Disk}. Na rozkaz ten składają się trzy bajty, przesyłane, tak jak przy wszystkich innych rozkazach, przez port danych (3F7h ewentualnie 377h), naturalnie z zachowaniem każdorazowej kontroli bitu 7 rejestru stanu (ustawienie tego bitu przez kontroler świadczy o gotowości portu danych).
Rozkaz STOD
Bajt l:
0; 0; 0; 0; 0; 0; 1; 1;
bity 7-O-Liczba 03h - sygnatura rozkazu.
Bajt 2:
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit l; bit O
bity 7-4-Czas T3 [ms], kodowany w zależności od prędkości transmisji:
KOD; 1 Mbit/s; 500 kbit/s; 300 kbit/s; 250 kbit/s
OOh; 8,0; 16; 26,7; 32
Olh; 7,5; 15; 25,0; 30
...; ...; ...; ...; ...
OFh; 0,5; 1; 1,7; 2
bity 3-0-czas T2 [ms], kodowany w zależności od prędkości transmisji:
KOD; 1 Mbit/s; 500 kbit/s; 300 kbit/s; 250 kbit/s
OOh; 128; 256; 426; 512
Olh; 8; 16; 26,7; 32
02h; 16; 32; 53,5; 64
...; ...; ...; ...; ...
OFh; 120; 240; 400; 480
Bajt 3:
hit 7; hit 6; hit 5; hit 4; hit 3; hit 2; hit l; hit 0;
bity 7-4-Czas T1 [ms], kodowany w zależności od prędkości transmisji:
KOD; 1 Mbit/s; 500 kbit/s; 300 kbit/s; 250 kbit/s
00h; 128; 256; 426; 512;
0lh; 1; 2; 3,3 4;
02h; 2; 4; 6,7; 8;
...; ...; ...; ...; ...
0Eh; 126; 252; 420; 504;
0Fh; 127; 254; 423; 508;
bit 0-l - transmisja kanałem DMA,
0 - transmisja bez udziału kanału DMA
Zastosowanie kodów CRC
Nieuniknione niedoskonałości wykonania elementów mechanicznych napędu oraz wady nośnika magnetycznego mogą, mimo prób ich wyeliminowania, powodować przekłamania utrwalanej informacji. Przyjrzyjmy się więc przez chwilę kontroli poprawności zapisanych danych.
Najprostszą, ale i najmniej efektywną metodą kontroli jest tzw. kontrola parzystości. Każdy bajt danych otrzymuje dodatkowy, dziewiąty bit informujący o tym, czy liczba jedynek w bajcie jest parzysta lub nieparzysta (w zależności od umowy). Łatwo zauważyć, że w najbardziej niesprzyjających warunkach można, bazując jedynie na informacji o parzystości, cały zanegowany bajt (przekłamanie na wszystkich pozycjach) uznać za poprawny. Podobnie ma się sprawa z przekłamaniem każdej parzystej liczby jedynek. W związku z tym opracowano wiele innych, bardziej efektywnych sposobów rozwiązania tego problemu.
Magnetyczne systemy cyfrowego zapisu informacji posługują się generalnie tzw. kodami CRC (ang. Cyclic Redimdancy Check).
Budowa kodu CRC
Rozpatrzmy klasyczne dzielenie dwóch liczb całkowitych. Bez względu na podstawę systemu (dziesiętny, binarny czy inny) obowiązuje zasada:
dzielna : dzielnik = iloraz + reszta
Przypomnijmy sobie znany ze szkoły podstawowej algorytm wykonywania takiego dzielenia. Należy ustalić, ile razy mieści się dzielnik w lewostronnej części dzielnej. Wynik ten jest pierwszą cyfrą ilorazu. Cyfrę tę mnożymy przez dzielnik i uzyskaną sumę częściową odejmujemy od wspomnianego lewostronnego fragmentu dzielnej. Do wyniku odejmowania dopisywana jest kolejna cyfra dzielnej i proces powtarza się.
Tak samo można postępować z liczbami w systemie binarnym. Nie musimy tu obliczać częściowych ilorazów - wyniki mogą być tylko dwa: dzielna jest większa od dzielnika i częściowy iloraz równa się l, lub też dzielnik jest większy od dzielnej, a iloraz wynosi zero (dzielenie jest tu zastąpione przez porównywanie).
Przykład:
324#d : 19#d - 101000100#b : 10011#b = 17#d = 10001#b, reszta l
Wykonujemy dzielenie:
101000100 : 10011 = 10001
10011
--------
000010
00000
-------
00101
00000
-------
01010
00000
-------
10100
10011
------
00001 - reszta
Do realizacji powtarzających się w tym algorytmie operacji odejmowania używamy zwykłej arytmetyki binarnej, tj. uwzględniamy przeniesienia na sąsiednie pozycje podczas odejmowania liczby większej od mniejszej. Komplikuje to w istotny sposób obliczenia, gdyż wynik na danej pozycji bitowej zależy również od pozycji poprzedniej. Nie jest tak natomiast w tzw. arytmetyce modulo 2. Zastosujmy operację bitowej różnicy symetrycznej (XOR). Oto tablica prawdy dla tej operacji.
X; y; xXORy;
0; 0; 0;
0; 1; 1;
1; 0; 1;
1; 1; 0;
Tak zdefiniowane dodawanie i odejmowanie daje te same wyniki.
Wróćmy do naszego przykładu, zastępując klasyczne odejmowanie nowo zdefiniowanym działaniem.
101000100 : 10011 = 10111
10011
-------
001110
000000
-------
11101
10011
-------
011100
10011
-------
011110
10011
-------
01101 - reszta
Otrzymane wyniki będą się różnić, ale nie należy zapominać, że operujemy inną arytmetyką. Kody kontrolne CRC wykorzystują właśnie reszty z takiego dzielenia. Ilorazy nadają się do tego celu gorzej, gdyż ich długość jest zmienna i silnie zależy od długości dzielnej. Reszta musi krótsza od dzielnika - gdyby była większa, można byłoby przecież podzielić jeszcze raz i zwiększyć iloraz.
Pod pojęciem sumy kontrolnej danego ciągu danych w kodzie CRC rozumiemy resztę z dzielenia tego ciągu przez pewien określony dzielnik. Oczywiste jest, że układy wytwarzające sumę kontrolną CRC podczas zapisu posługują się takim dzielnikiem, jaki będzie później użyty przez układy odczytujące do kontroli poprawności danych.
Dowolnie długi ciąg danych zabezpieczanych przy użyciu kodu CRC traktuje się jako dzielną. Ustalony z góry dzielnik binarny nazywany jest też generatorem kodu. Reszta z powyższego dzielenia (iloraz jest ignorowany) jest właśnie poszukiwanym kodem CRC, a dokładniej mówiąc - sumą kontrolną w kodzie CRC.
Intuicyjnie można przewidzieć, że zdolność do wykrywania błędów przez kod CRC zależy od długości generatora. Dokładna analiza matematyczna, która traktuje powyższe zagadnienia jako element algebry wielomianów, pozwala wyznaczyć szczególnie optymalne generatory. Dla celów zabezpieczenia informacji na nośniku magnetycznym stosuje się 17-bitowy generator 10001000000100001, który produkuje 16-bitową resztę. Taki kod CRC (nazywany kodem CCITT) pozwala rozpoznać pojedynczy błędny bit w ciągach dowolnej długości. Można w tym momencie powiedzieć, że to samo potrafi bit kontroli parzystości. Kod CRC może jednak dużo więcej. Rozpoznaje on w 100 % błędy dowolnej pary sąsiadujących bitów. Przekłamania w szeregu bitów o długości do 16 pozycji wykrywane są w 100 %, a przekłamania w ciągu o dowolnej długości w 99,9984 %.
512-bajtowy blok danych sektora dyskietki zabezpieczany jest przez dopisanie w polu CRC-2 dwóch bajtów zawierających 16-bitowy kod CRC tego bloku. Kontroler odczytując tak zapisaną informację korzysta z właściwości arytmetyki modulo 2 - zamiast obliczać sumę kontrolną dla bloku danych i porównywać ją z zawartością pola CRC-2, oblicza sumę kontrolną dla całych 514 bajtów (dane + CRC). Jeżeli nie nastąpiło przekłamanie w polu danych, spodziewany jest wynik równy zero. Metoda ta jest szybsza i technicznie łatwiejsza w realizacji.
Wyszukiwarka
Podobne podstrony:
07 Rozdział 06
06 Kontrola urzędów, instytucji …
kopczewska (pliki z kodami) Rozdział 06 Modelowanie przestrzenne
07 rozdział 06 vbzf2orsahfg3w2z4onqm45vhwirhgi3xpmrhdy
08 Rozdział 06
Szacka ROZDZIAŁ VII Kontrola społeczna
MLP FIM Fanfic Wojna o Equestrię Rozdział 06
Rozdział 05 Kontroler DMA
ROZDZIAŁ 06 Genetyka kliniczna raka trzustki
więcej podobnych podstron