Programowanie operacji dyskowych. ++++++++++ + MS-DOS + ++++++++++ =============================================================================== przerwanie INT 25h DOS - czytaj sektor logiczny rejestr parametr wartosc zwracana AL numer dysku - AX - kod bledu CX liczba sektorow - DX pierwszy sektor - BX:DS adres bufora odczytu - Carry - ustawiany gdy blad =============================================================================== przerwanie INT 26h DOS - pisz sektor logiczny rejestr parametr wartosc zwracana AL numer dysku - AX - kod bledu CX liczba sektorow - DX pierwszy sektor - BX:DS adres bufora odczytu - Carry - ustawiany gdy blad W rejestrze AL przekazywany jest numer dysku: A: numer "0" B: numer "1" C: numer "2" D: numer "3" itd. Jezeli ustawiona jest flaga Carry, obie funkcje zwracaja w rejestrze AL nastepujace kody: kod bledu znaczenie 01h nieprawidlowy rozkaz 02h niewlasciwa metryka ID 04h nie znaleziono sektora 08h przepelnienie DMA 10h blad CRC lub ECC 20h blad kontrolera 40h blad pozycjonowania 80h brak reakcji dysku (napedu) =============================================================================== przerwanie INT 25h DOS - czytaj sektor logiczny, tryb poszerzony rejestr parametr wartosc zwracana AL numer dysku - AX - kod bledu CX ffffh - BX:DS adres tablicy dodatkowej - Carry - ustawiany gdy blad =============================================================================== przerwanie INT 25h DOS - czytaj sektor logiczny, tryb poszerzony rejestr parametr wartosc zwracana AL numer dysku - AX - kod bledu CX ffffh - BX:DS adres tablicy dodatkowej - Carry - ustawiany gdy blad Tablica dodatkowych parametrow przekazywanych trybie poszerzonym funkcjom 25h i 26h sklada sie z 10 bajtow. bajty tablicy znaczenie 0-3 numer pierwszego sektora (4 bajty) 4-5 ilosc sektorow objetych dzialaniem funkcji 6-9 adres bufora (zapisu 26h ew. odczytu 25h) =============================================================================== przerwanie INT 21h niektore funkcje: funkcja dzialanie 3ch utworzyc plik 3dh otworzyc plik 3eh zamknac plik 41h usunac plik 39h utworzyc katalog 3ah usunac katalog 3bh przejsc do innego katalogu 57h odczytac/zmienic informacje data/czas pliku =============================================================================== =============================================================================== ++++++++++++++++ + Funkcje BIOS + Przerwanie 13h ++++++++++++++++ =============================================================================== Numeracja cylindrow: CL: bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 CH: bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 bity 7-6 rejestru CL tworza wraz z rejestrem CH 10-bitowy numer cylindra. Pozostale pozycje bitowe rejestru CL adresuja zwykle sektor na sciezce. Numeracja dyskow: BIOS identyfikuje dyski poprzez kolejne numery zaczynajac od 80h. Tak wiec 80h - C:, 81h - D:, itd. (DOS oznacza napedy poczawszy od 0) Kody bledow: wszystkie podane funkcje zwracaja w rejestrze AH kod bledu, kotry jest umieszczany jednoczesnie w obszarze danych BIOS pod adresem 040h:074h. kod bledu znaczenie 00h bezblednie 01h zly numer funkcji 02h nie znaleziono znacznika adresu 04h nie znaleziono sektora 05h nieudany Reset 07h bledna inicjalizacja 09h przepelnienie strony DMA 10h blad odczytu 11h dane mimo bledu odczytywane z pomoca kodu ECC 20h blad kontrolera 40h nie znaleziono sciezki 80h brak reakcji napedu bbh blad BIOS'u ffh inny nieznany blad --- funkcja 00h --------------------------------------------------------------- Funkcja sprowadza wewnetrzne rejestry kontrolera do scisle okreslonego stanu poczatkowego. Aktualnie wykonywana operacja zostanie przerwana. rejestr parametr wartosc zwracana AH 00h kod bledu DL numer dysku - Carry - ustawiany gdy blad mov ah,00h ;funkcja 0 mov dl,81h ;dysk D: int 13h ;inicjalizacja kontrolera --- funkcja 01h --------------------------------------------------------------- Funkcja odczytuje status ostatniej operacji. Odtwarza w rejsetrze AH bajt statusu taki sam jak po ostatnio przeprowadzonej operacji bez wzgledu na to jak dawno sie zakonczyla. rejestr parametr wartosc zwracana AH 01h kod bledu DL numer dysku - Carry - ustawiany gdy blad --- funkcja 02h --------------------------------------------------------------- Funkcja czyta jeden lub kilka sektorow z dysku do bufora w pamieci operacyjnej. Wszystkie przeczytane sektory lokowane sa w pamieci poczawszy od adresu podanego w ES:BX, zamazuje ewentualnie ine dane. Do obowiazkow programisty nalezy zarezerwowanie odpowiedniej ilosci wolnego obszaru. rejestr parametr wartosc zwracana AH 02h kod bledu AL liczba sektorow do przeczytania CH numer sciezki CL numer sektora DH numer glowicy DL numer dysku ES:BX adres w pamieci, gdzie maja byc umieszczone przeczytane sektory Carry - ustawiany gdy blad --- funkcja 03h --------------------------------------------------------------- Funkcja jest komplementarnym odpowiednikiem funkcji 02h. Nalezy tylko zwrocic uwage, ze jako sektor zapisywane sa zawsze pelne 512-bajtowe bloki pamieci (poczawszy od adresu ES:BX) nawet wtedy gdynie zawieraja one wylacznie danych umieszczonych tam przez programiste. rejestr parametr wartosc zwracana AH 03h kod bledu AL liczba sektorow do przeczytania CH numer sciezki CL numer sektora DH numer glowicy DL numer dysku ES:BX adres w pamieci, gdzie maja byc umieszczone przeczytane sektory Carry - ustawiany gdy blad --- funkcja 04h --------------------------------------------------------------- Funkcja sprawdza poprawnosc kodow ECC sektora przeprowadzajac czytanie probne. rejestr parametr wartosc zwracana AH 04h kod bledu AL liczba sektorow do przeczytania CH numer sciezki CL numer sektora DH numer glowicy DL numer dysku Carry - ustawiany gdy blad --- funkcja 05h --------------------------------------------------------------- Funkcja formatuje sektor sciezki lub cylindra. W pamieci nalezy przygotowac odpowiednie bloki danych, dla kazdego sektora oddzielnie. Blok taki sklada sie z czterech bajtow, ktore oznaczaja kolejno: bajt 0 numer sciezki bajt 1 numer glowicy bajt 2 numer sektora bajt 3 liczba bajtow w sektorze 0 = 128 1 = 256 2 = 512 3 = 1024 UWAGA: Nie wolno stosowac tej funkcji w odniesieniu do dyskow poslugujacych sie tlumaczeniem (translating) lub posiadajacych wlasny zintegrowany kontroler (np. IDE). rejestr parametr wartosc zwracana AH 05h kod bledu AL liczba sektorow do przeczytania CH numer sciezki CL numer sektora DH numer glowicy DL numer dysku ES:BX adres w pamieci, gdzie maja byc umieszczone przeczytane sektory Carry - ustawiany gdy blad --- funkcja 06h --------------------------------------------------------------- Sciezka zawierajaca wiecej niz jeden uszkodzony sektor jest znakowana jako zla, co uniemozliwia zapis na niej danych. Funkcja obsluguje poprawnie wylacznie kontroler dysku twardego modelu XT. UWAGA: Nie wolno stosowac tej funkcji w odniesieniu do dyskow poslugujacych sie tlumaczeniem (translating) lub posiadajacych wlasny zintegrowany kontroler (np. IDE). rejestr parametr wartosc zwracana AH 06h kod bledu AL liczba sektorow do przeczytania - CH numer sciezki - CL numer sektora - DH numer glowicy - DL numer dysku - Carry - ustawiany gdy blad --- funkcja 07h --------------------------------------------------------------- Funkcja formatuje caly dysk poczawszy od podanego cylindra. Poprawnie obslugiwany jest wylacznie kontroler dysku twardego modelu XT. UWAGA: Nie wolno stosowac tej funkcji w odniesieniu do dyskow poslugujacych sie tlumaczeniem (translating) lub posiadajacych wlasny zintegrowany kontroler (np. IDE). rejestr parametr wartosc zwracana AH 07h kod bledu AL liczba sektorow do przeczytania - CH numer sciezki - CL numer sektora - DH numer glowicy - DL numer dysku - Carry - ustawiany gdy blad --- funkcja 08h --------------------------------------------------------------- Funkcja dostarcza informacji o parametrach geometrycznych napedu. rejestr parametr wartosc zwracana AH 08h kod bledu AL - - CH - liczba cylindrow -1 CL - liczba sektorow/sciezke -1 DH - liczba glowic -1 DL numer dysku - DH numer glowicy - ES:SI - adres tablicy parametrow Carry - ustawiany gdy blad Budowa tablicy parametrow (system XT): adres tablicy znaczenie rozmiar parametru 00h-01h liczba cylindrow slowo 02h liczba glowic bajt 03h-04h cylinder poczatkowy slowo zmniejszonego pradu zapisu 05h-06h cylinder poczatkowy slowo prekompensacji 07h maksymalna liczba bledow bajt korygowanych przez ECC (zwykle 11) 08h bajt sterujacy (*) bajt 09h wartosc standardowa czasu bajt oczekiwania (**) 0ah czas oczekiwania przy bajt formatowaniu (**) 0bh czas oczekiwania na wynik bajt samokontroli (**) 0ch-0fh zarezerwowane 2 slowa (*) bajt sterujacy bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 bit 7 deaktywacja powtornych prob dostepu bit 6 deaktywacja systemu powtornych prob ECC bity 5-3 zarezerwowane bity 2-0 opcje napedu (**) czas mierzony w jednostkach Timer'a Budowa tablicy parametrow (system AT): adres tablicy znaczenie rozmiar parametru 00h-01h liczba cylindrow slowo 02h liczba glowic bajt 03h-04h zarezerwowane slowo 05h-06h cylinder poczatkowy slowo prekompensacji 07h zarezerwowany bajt 08h bajt sterujacy (*) bajt 09h-0bh zarezerwowane 3 bajty 0ch-0dh strefa parkowania slowo 0eh liczba sektorow na sciezke bajt 0fh zarezerwowane bajt (*) bajt sterujacy bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 bit 7 deaktywacja powtornych prob dostepu bit 6 deaktywacja systemu powtornych prob ECC bit 5 1 = lista defektow zapisana na cylindrze o numerze [liczba_cylindrow -1] bit 4 zarezerwowany bit 3 1 = dysk posiada wiecej niz 8 glowic bity 2-0 zarezerwowane --- funkcja 09h --------------------------------------------------------------- Funkcja dopasowuje parametry geometryczne napedu. rejestr parametr zwaracana wartosc AH 09h kod bledu DL numer dysku ilosc dyskow Carry - ustawiany gdy blad --- funkcja 0ah --------------------------------------------------------------- Funkcja czyta od 1 do 127 sektorow (wraz z towarzyszacymi bajtami ECC) i umieszcza je w okreslonym buforze w pamieci oeracyjnej. Nie jest przeprowadza- na zadna korekcjaprzez system ECC kontrolera, tzn. wszystkie dane z kazdego sektora transmitowane sa w niezmienionym stanie. rejestr parametr wartosc zwracana AH 0ah kod bledu AL liczba sektorow do odczytania - CH numer cylindra - CL sektor poczatkowy - DL numer dysku - DH numer glowicy - ES:BX adres bufora odczytu w pamieci - operacyjnej Carry - ustawiany gdy blad --- funkcja 0bh --------------------------------------------------------------- Funkcja zapisuje od 1 do 127 sektorow (wraz z towarzyszacymi bajtami ECC) i umieszcza je w okreslonym buforze w pamieci oeracyjnej. Nie jest przeprowadza- na zadna korekcjaprzez system ECC kontrolera, tzn. wszystkie dane z kazdego sektora transmitowane sa w niezmienionym stanie. rejestr parametr wartosc zwracana AH 0bh kod bledu AL liczba sektorow do zapisania - CH numer cylindra - CL sektor poczatkowy - DL numer dysku - DH numer glowicy - ES:BX adres bufora odczytu w pamieci - operacyjnej Carry - ustawiany gdy blad UWAGA: W buforze zapisu nalezy przygotowac 516 bajtow/sektor (512 bajtow danych + 4 bajty ECC) --- funkcja 0ch --------------------------------------------------------------- Funkcja aktywuje okreslana glowice i ustawia ja nad zadanym cylindrem. rejestr parametr wartosc zwracana AH 0ch kod bledu CX cylinder - DH glowica - DL numer dusku - Carry - ustawiany gdy blad --- funkcja 0dh --------------------------------------------------------------- Reset napedu. rejestr parametr wartosc zwracana AH 0dh kod bledu DL numer dusku - Carry - ustawiany gdy blad --- funkcja 0eh --------------------------------------------------------------- Funkcja transmituje aktualna zawartosc 512-bajtowego bufora kontrolera (bufor sektora) do wskazanego obszaru w pamieci operacyjnej. Z dysku nie sa czytane zadne dane, a funkcja sluzy w pierwszej linii kontroli przeplywu informacji miedzy kontrolerem a pamiecia. rejestr parametr wartosc zwracana AH 0eh kod bledu DL numer dysku - ES:BX adres obszaru pamieci - Carry - ustawiany gdy blad --- funkcja 0fh --------------------------------------------------------------- Funkcja transmituje 512 bajtow ze wskazanego obszarupamieci do bufora kontrolera (bufora sektora). Na dysk nie sa zapisywane zadne dane, a funkcja sluzy w pierwszej linii kontroli przeplywu informacji miedzy kontrolerem a pamiecia. rejestr parametr wartosc zwracana AH 0fh kod bledu DL numer dysku - ES:BX adres obszaru pamieci - Carry - ustawiany gdy blad --- funkcja 10h --------------------------------------------------------------- Funkcja sprzwdza gotowosc dysku do wykonania polecen. rejestr parametr wartosc zwracana AH 10h kod bledu DL numer dysku - Carry - ustawiany gdy blad --- funkcja 11h --------------------------------------------------------------- Funkcja ustawia glowice nad sciezka 0 (kalibracja). rejestr parametr wartosc zwracana AH 11h kod bledu DL numer dysku - Carry - ustawiany gdy blad --- funkcja 12h --------------------------------------------------------------- Funkcja sprawdza pamiec RAM kontrolera dysku twardego. UWAGA: Nie kazdy wariant biosu ma zaimplementowana te funkcje rejestr parametr wartosc zwracana AH 12h kod bledu DL numer dysku - Carry - ustawiany gdy blad --- funkcja 13h --------------------------------------------------------------- Kontroler przeprowadza obszerny test napedu i zwraca kod ewentualnego bledu. Ustawiona flaga Carry i kod bledu 00h oznacza rowniez pomuslne zakonczenie. UWAGA: Nie kazdy wariant biosu ma zaimplementowana te funkcje rejestr parametr wartosc zwracana AH 13h kod bledu DL numer dysku - Carry - ustawiany gdy blad --- funkcja 19h --------------------------------------------------------------- Funkcja przesuwa lowice dysku twardego nad cylinder okreslony jako pozycja bezpieczna, co ma zarowno glowice jak i powierzchnie magnetyczna przed uszkodzeniami spowodowanymi wstrzasami. Funkcja jest szczegolnie uzyteczna w razie koniecznosci transportu napedu, ktory nie jest wyposarzony w mechnizm samoczynnego parkowania glowic po wylaczeniu napiecia zasilajacego. rejestr parametr wartosc zwracana AH 13h kod bledu DL numer dysku - Carry - ustawiany gdy blad ===============================================================================