Laboratorium Aparatury Informatycznej
Centrum Obliczeniowe Politechniki Wrocławskiej
Ćwiczenie nr 1
DYSK TWARDY
&
DYSKIETKA
DYSK TWARDY
1. Wstęp
Dyski twarde są obecnie najatrakcyjniejszym, łatwo dostępnym rodzajem pamięci masowej. Umożliwiają one gromadzenie olbrzymiej ilości danych, oferując jednocześnie szybki do nich dostęp.
Twardy dysk jest jednym z głównych elementów całego systemu komputerowego, a jego najważniejszymi cechami powinny być niezawodność i szybkość pracy. Niezawodność zapewnia nabycie dysku dobrego producenta.
Pracę twardego dysku nadzoruje kontroler. Dysk wraz z kontrolerem charakteryzują trzy niezależne parametry jakości. Czas dostępu (access time) wskazuje średni czas potrzebny głowicy na przesunięcie się do wymaganej ścieżki (od 10 do 90 ms). Wskaźnik opóźnienia (latency) jest czasem wymaganym, aby żądana informacja znalazła się pod głowicą, w większości przypadków jest to 8,3 ms. Wskaźnik prędkości transmisji (transfer rate) informuje o prędkości przesyłania danych, gdy głowica już je odnalazła. Wskaźnik ten wynosi zazwyczaj 174000 do 525000 bitów/s.
Gdy głowica znajduje się już we właściwym miejscu za szybkość odczytu odpowiada kontroler. Gorsze kontrolery nie są w stanie jednocześnie odczytywać oraz przekazywać informacji. Odczytują one jeden sektor i opuszczają następny aby w tym czasie przekazać odczytaną informację. Aby odczytać dane w prawidłowym porządku, kontroler zapisuje sektory nie sekwencyjnie. Taki zapis nazywa się przeplotem (interleave). Obecnie najczęściej można spotkać kontrolery z przeplotem 1:1 lub 2:1. Od właściwie dobranego przeplotu zależy prędkość transmisji danych.
Obecnie najpopularniejsze są kontrolery: RLL (Run Length Limited), ESDI (Enhanced Small Devices Interface), SCSI (Small Computer Systems Interface), IDE (Integrated Drive Electronics).
2. Organizacja dysków twardych
Przyjętą w systemie DOS wielkością sektora dla wszystkich typów pamięci dyskowych jest 512 bajtów. Część sektorów każdego dysku zajmują informacje systemowe, konieczne do zarządzania systemem plików, pozostałe sektory są przeznaczone dla plików użytkowych.
Pierwszą operacją wykonywaną na nowym dysku twardym jest preformatowanie - jest to utworzenie właściwej struktury fizycznej na nośniku magnetycznym.
Dyski stałe przed formatowaniem dzieli się (poleceniem FDISK) na części (tzw.partycje).
W wersjach systemu poprzedzających 3.30 zakładano, że dysk stały można podzielić na 1 do 4 partycji, z których jedna może być przeznaczona dla systemu DOS, a pozostałe dla innych systemów operacyjnych.
W miarę pojawiania się dysków stałych o coraz większej pojemności, z uwagi na wbudowane w system (do wersji 3.30 włącznie) ograniczenie do 32MB rozmiaru pojedynczej partycji, zaistniała potrzeba organizowania więcej niż jednej partycji (kilka dysków logicznych) na jednym dysku fizycznym, przeznaczonych do użytku systemu DOS. W tym celu w wersji 3.30 systemu wprowadzono tzw. partycje rozszerzone systemu DOS.
Typ dysku Seagate ST225 Fuji FK309-39R Seagate ST251
Pojemność 20MB 30MB 32MB
Ilość głowic 4 4 6
Ilość sektorów
na ścieżce 17 17 17
Ilość cylindrów 615 940 642
Rekord ładujący 1 1 1
FAT-liczba sekt. 41*2 63*2 64*2
Katalog - ilość
sektorów 32 32 32
Suma sektorów
systemowych 115 159 161
Ilość sektorów
na blok 4 4 4
Ilość bloków 10354 15919 16326
Pojemność katal. 512 512 512
Tab. 2-1. Podstawowe parametry przykładowych dysków twardych
System odwołując się do sektorów na dyskach logicznych posługuje się numerami logicznymi sektorów. Pierwszy sektor na dysku logicznym ma numer 0. W ogólnym przypadku jest to sektor pierwszy na stronie o najmniejszym numerze na początkowym cylindrze dysku logicznego.
Dalsze numery nadaje się sektorom przebiegając kolejne strony (głowice) cylindra 0, następnie cylindra 1 itd.
Podczas formatowania w określonych sektorach partycji dysku stałego są umieszczane następujące informacje:
1. Rekord:
- ładujący (dla partycji aktywnej DOS).
- wprowadzający (dla partycji nieaktywnej DOS).
2. Tablica alokacji plików (FAT).
3. Kopia tablicy alokacji plików.
4. Katalogi plików.
2.1. Podział dysku stałego na partycje
Podstawową strukturą danych umieszczoną na dysku stałym jest tzw. główny rekord ładujący dysku stałego (Master Boot Record).
Główny rekord ładujący zajmuje pierwszy sektor dysku (głowica 0, cylinder 0, sektor 1).
Adres Zawartość
0H Program odszukujący i ładujący zawartość pierwszego sektora aktywnej partycji
1BEH Opis partycji nr 1 (początek tablicy partycji)
1CEH Opis partycji nr 2
1DEH Opis partycji nr 3
1EEH Opis partycji nr 4
1FEH Wartość 55AAH (znacznik końca tablicy partycji)
Tab. 2.1-1. Format MASTER BOOT RECORD
Końcową część Master Boot Record zajmuje czteroelementowa tablica partycji opisująca podział dysku. Każdy element tablicy jest rekordem opisu partycji i ma rozmiar 16 bajtów.
Bajty rekordu Zawartość
0H Znacznik aktywności partycji (0H-nieaktywna 80H-aktywna)
1H Początek partycji: numer głowicy
2H-3H Początek partycji: numer cylindra i sektora (patrz Rys 2.1-1)
4H Rodzaj partycji: 0-nie używana przez DOS; 1-DOS, 12 bitowy FAT;
4-DOS, 16 bitowy FAT; 5-DOS, partycja rozszerzona
5H Koniec partycji: numer głowicy
6H-7H Koniec partycji: numer cylindra i sektora (patrz Rys 2.1-1)
8H-0BH Początek partycji: względny numer pierwszego sektora
0CH-0FH Rozmiar partycji: liczba sektorów
Tab. 2.1-2. Format rekordu opisu partycji
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
c |
c |
c |
c |
c |
c |
c |
c |
C |
c |
s |
s |
s |
s |
s |
s |
Bajt bardziej znaczący Bajt mniej znaczący
Rys. 2.1-1. Format numeru cylindra i sektora zapisanego na 16 bitach
Numer początkowego i końcowego cylindra partycji jest zapisany na 10 bitach (bardziej znaczącymi bitami liczby określającej numer cylindra są bity 7 i 6 mniej znaczącego bajtu), zatem przedstawiona tablica partycji prawidłowo opisuje dyski stałe o nie więcej niż 1024 cylindrach. Położenie każdej partycji jest opisane za pomocą bezwzględnych wartości cylindra, głowicy i sektora oraz za pomocą czterobajtowego numeru sektora początkowego partycji w stosunku do sektora zawierającego tablicę partycji.
W czasie ładowania systemu z dysku twardego najpierw ładowany jest i wykonywany program zawarty w początkowej części głównego rekordu ładującego. Interpretuje on zawartość tablicy partycji w celu znalezienia partycji aktywnej, tzn. takiej, z której będzie ładowany system.
W przypadku systemu DOS pierwszy sektor tej partycji zawiera program ładujący.
2.1.1. Partycje rozszerzone
Partycja z oznaczeniem rodzaju równym 5 jest partycją rozszerzoną. Traktowana jest ona tak, jakby stanowiła odrębny dysk, tzn. zawiera w swoim pierwszym sektorze własną tablicę partycji zwaną tablicą partycji rozszerzenia.
Jeżeli pole (w tej tablicy) decydujące o rodzaju partycji jest równe zero, to oznacza to element pusty (nie dopuszcza się innych systemów operacyjnych w partycji rozszerzonej).
W tablicy partycji rozszerzenia mogą być zdefiniowane następujące elementy:
1. Partycja (nieaktywna) systemu DOS - rodzaj 1.
2. Partycja (nieaktywna) systemu DOS - rodzaj 2.
3. Partycja rozszerzenia - rodzaj 5.
2.2. Rekord ładujący
Rekord ładujący zajmuje pierwszy sektor części dysku stałego przeznaczonej dla systemu DOS. Oprócz programu ładującego system, rekord ten zawiera w pierwszych 30 bajtach informacje podane poniżej. Informacje zapisane w bajtach od 0BH do 17H stanowią jednocześnie tzw. blok parametrów BIOS-u (BPB).
Bajty Zawartość
0H-2H Instrukcja skoku do początku programu ładującego
3H-0AH Nazwa wersji systemu (w kodach ASCII)
0BH-0CH Wielkość sektorów w bajtach
0DH Wielkość bloku
0EH-0FH Ilość sektorów zarezerwowanych na początku dysku
10H Ilość kopii tablicy alokacji plików (FAT)
11H-12H Maksymalna ilość plików w katalogu głównym
13H-14H Całkowita ilość sektorów na dysku
15H Bajt identyfikacji nośnika (F8H-dla dysku twardego)
16H-17H Ilość sektorów zajętych przez tablicę FAT
18H-19H Ilość sektorów na ścieżce
1AH-1BH Ilość głowic
1CH-1DH Ilość sektorów ukrytych
Tab. 2.2-1. Format rekordu ładującego (do adresu 1DH)
W wersji 4.00 systemu DOS zwiększono ilość informacji zawartych w rekordzie ładującym, uwzględniając jednocześnie istnienie partycji o pojemności przekraczającej 32MB.
Jeżeli pojemność dysku przekracza 32MB, w pole 13H-14H wpisuje się 0, natomiast całkowita liczba sektorów jest umieszczona w dodatkowym 4-bajtowym polu 20H-23H.
W wersji 4.00 format rekordu ładującego od bajtu 0H do bajtu 1DH jest identyczny jak w wersjach wcześniejszych. Format od bajtu 20H do 3DH przedstawiono poniżej.
Bajty Zawartość
20H-23H Całkowita liczba sektorów na dysku (ponad 32MB)
24H Numer mechanizmu dyskowego
25H Zarezerwowane
26H Znacznik (bajt 29H)
27H-2AH Numer seryjny dysku
2BH-35H Etykieta
36H-3DH Zarezerwowane
Tab. 2.2-2. Format rekordu ładującego (od adresu 20H-3DH)
2.3. Tablica alokacji plików - FAT
Miejsce na dysku jest przydzielane plikom w jednostkach nazywanych jednostkami alokacji dyskowej.
W katalogu jest wpisany początkowy numer klastra, określający logiczny numer sektora, w którym znajduje się początek pliku i równocześnie miejsce w tablicy alokacji plików, w którym jest wpisany numer kolejnego klastra. Numer wpisany we wskazanym miejscu tablicy alokacji plików wskazuje pierwszy sektor następnej części pliku i równocześnie położenie w FAT numeru następnego klastra. W ten sposób tworzy się łańcuch, określający położenie całego pliku.
W wersjach 2.XX systemu DOS do opisu bloków w tablicy alokacji plików są stosowane liczby 12-bitowe.
W wersjach 3.XX systemu wprowadzono dla dysków stałych o pojemnościach większych niż 10MB tablice FAT z liczbami 16-bitowymi. Umożliwia to efektywną obsługę dysków stałych.
12-bitowy numer jednostki alokacji dyskowej zajmuje 1,5 bajta w tablicy, co powoduje, że określenie liczb jest nieco skomplikowane.
Można je otrzymać stosując poniższy algorytm:
1. Należy pomnożyć numer jednostki alokacji dyskowej przez 3/2;
2. Część całkowita otrzymanej liczby określa kolejny numer bajtu od początku tablicy alokacji plików, zawierającego następny numer jednostki alokacji dyskowej;
3. Odczytać wskazany i następny bajt z FAT;
4. Zamienić bajty miejscami;
5. Jeżeli ostatni numer jednostki alokacji dyskowej był parzysty, to wziąć 12 mniej znaczących bitów słowa, jeżeli nieparzysty to 12 bardziej znaczących bitów.
Otrzymana liczba wskazuje miejsce umieszczenia następnego numeru jednostki alokacji dyskowej.
Określenie numeru jednostki alokacji dyskowej przy formacie FAT 16-bitowym jest prostsze: należy ten numer pomnożyć przez 2, a otrzymana liczba wskaże pierwszy bajt słowa w tablicy FAT, w którym jest zapisany następny numer jednostki alokacji dyskowej.
Trzy pierwsze bajty tablicy FAT dla formatu 12-bitowego, a cztery dla formatu 16-bitowego zawierają następujące dane:
bajt nr 1 - bajt identyfikujący nośnik (F8H)
bajty nr 2, 3 (4) - zawierają wartość FFFF(FF)H
W polach tablicy FAT podane wartości mają następujące znaczenie:
(F)FF8H - (F)FFFH - ostatni blok w pliku
(0)000H - blok wolny
(F)FF7H - blok uszkodzony (o ile nie występuje w łańcuchu)
2.4. Katalogi plików
Rekord opisujący plik lub podkatalog zajmuje w katalogach 32 bajty.
Format rekordu podano poniżej.
Bajty Zawartość
0H-7H Nazwa pliku w kodach ASCII
8H-0AH Rozszerzenie nazwy pliku
0BH Atrybuty pliku
0CH-15H Zarezerwowane
16H-17H Czas utworzenia lub aktualizacji pliku
18H-19H Data utworzenia lub aktualizacji pliku
1AH-1BH Numer pierwszego bloku w tablicy FAT
1CH-1DH Mniej znaczące słowo rozmiaru pliku
1EH-1FH Bardziej znaczące słowo rozmiaru pliku
Tab. 2.4-1. Format rekordu opisującego plik
Na katalog główny dysku jest przeznaczona określona dla danego typu dysku liczba sektorów (bezpośrednio za kopią tablicy FAT), a zatem katalog główny ma określoną, ograniczoną pojemność.
Podkatalogi nie są ograniczone co do wielkości i są zapisywane na dysku w sposób identyczny jak pliki użytkowe.
Format bajtu określającego atrybut pliku przedstawiono poniżej.
Bit Znaczenie
0 Plik z protekcją zapisu
1 Plik ukryty
2 Plik systemowy
3 Etykieta dysku
4 Podkatalog
5 Atrybut archiwalności pliku
6,7 Niewykorzystane
Tab. 2.4-2. Opis bitów bajtu atrybutu pliku
3. Przykład: program szukający aktywnej partycji
PROGRAM Part;
TYPE tab = ARRAY [1..512] OF Byte;
VAR rejestry: Registers;
ref: Pointer;
i,j: Integer;
kon: Boolean;
BEGIN
GetMem(ref, 512); {rezerwacja pamięci}
{o wielkości jednego sektora}
WITH rejestry DO
BEGIN
AH:=2; {zainicjowanie rejestrów dla}
AL:=1; {przerwania $13}
CL:=1;
CH:=0;
DL:=$80;
DH:=0;
ES:=Seg(tab(ref^)[0]);
BX:=Ofs(tab(ref^)[0]);
END;
Intr($13, rejestry); {odczyt sektora z dysku)
kon := True;
i := $1BE; {$1BE-adres początku opisu}
{partycji nr1}
j := 0;
WHILE kon DO
BEGIN
IF tab(ref^)[i] = $80
THEN kon := False; {sprawdzenie czy}
{partycja jest aktywna}
i := i + $10; {poczatek opisu następnej} {partycji}
Inc(j);
END;
WriteLn('Aktywna jest partycja o numerze: ', j);
END;
4. Literatura
[1]. TECH HELP
[2]. Komputer #(49) 1990
[3]. L. Bułchak, R. Goczyński, M. Tuszyński: „DOS od środka”, Komputerowa Oficyna Wydawnicza „HELP” Warszawa 1990
DYSKIETKA
Opracowanie :
mgr inż. Arkadiusz Liber
- Wrocław 1990 -
Spis treści :
1.Wstęp.
2.Organizacja dyskietki w systemie PC-DOS.
2.1.Rekord wprowadzający.
2.2.Katalog.
2.3.Tablica rozmieszczenia zbiorów FAT.
3.Wybrane przerwania BIOS obsługi dyskietki.
4.Wybrane przerwania DOS obsługi dyskietki.
5.Przebieg ćwiczenia.
6.Przykładowe zadania do wykonania.
7.Literatura.
1.Wstęp.
Dyskietka jest podstawowym nośnikiem informacji w wielu systemach komputerowych. Zbudowana jest ona z pokrytego warstwą materiału magnetycznego (ok. 2.5mm) cienkiego (ok. 0.1mm) krążka z tworzywa sztucznego. Zasada zapisu informacji na dyskietce polega na magnesowaniu mikroskopijnych obszarów tlenków magnetycznych naniesionych na krążek. Ze względu na łatwość zabrudzenia i zniszczenia warstwy magnetycznej dyskietki zamykane są w kopertach ochronnych. W kopercie ochronnej znajdują się wycięcia na głowicę, mechanizm obrotowy oraz otwór indeksowy. Dodatkowo na krawędzi koperty ochronnej często znajdują się otwory pozwalające na zabezpieczenie dyskietki przed zapisem. Zapis na na dyskietce ma postać koncentrycznych śladów ( ścieżek ). W zależności od typu dyskietki i jej pojemności ilość ścieżek może być równa np.: 35, 40, 80. Każda ścieżka dzieli się na obszary zwane sektorami. W typowych dyskietkach lokalizacja każdej ścieżki i ilość używanych stron zależą od budowy napędu i sterownika dyskietki. Początek każdej ścieżki jest rozpoznawany fotoelektrycznie przez otwór indeksowy. Obecnie stosowane dyskietki mają średnice 3, 3.5, 5.25, 8 cali.
W ostatnich latach powszechnie stosuje się dwie metody zapisu danych na dyskietce : a) metoda częstotliwościowa FM, b) metoda częstotliwościowa MFM.
Metoda modulacji częstotliwości FM polega na zapisywaniu jednego impulsu w jednostce czasu dla bitu 0 i dwu impulsów w jednostce czasu dla bitu 1.
Zmodyfikowana metoda modulacji MFM polega na tym ,że bit o wartości 1 ustawia impuls w środku zegarowego interwału czasowego, natomiast bit o wartości 0 ustawia impuls na początku interwału lecz tylko wtedy gdy następny bit nie jest równy 1. W praktyce można również spotkać inne sposoby zapisu np.: M2FM czy GCR.
2.Organizacja dyskietki w systemie PC-DOS.
W systemie PC-DOS możliwych jest sześć typowych formatów dyskietek :
S8 - 1 strona , 8 sektorów , 40 ścieżek ( 160K ),
D8 - 2 strony , 8 sektorów , 40 ścieżek ( 320K ),
S9 - 1 strona , 9 sektorów , 40 ścieżek ( 180K ),
D9 - 2 strony , 9 sektorów , 40 ścieżek ( 360K ),
QD9 - 2 strony , 9 sektorów , 80 ścieżek ( 720K ),
QD15- 2 strony , 9 sektorów , 80 ścieżek ( 1.2M ).
Najpopularniejszym obecnie formatem dyskietki w systemie PC-DOS jest format D9. Podczas formatowania ( D9 ) DOS dzieli każdą z czterdziestu ścieżek na 9 sektorów 512 bajtowych co daje 368640 bajtów. Część tej pojemności wykorzystywana jest przez system do przechowywania informacji i indeksów sterujących.
Przestrzeń dyskietki podzielona jest na cztery części :
1).Rekord wprowadzający - pojedyńczy sektor znajdujący się w 1-wszym sektorze, ścieżki 0 na stronie 0, zawierający między innymi krótki program rozpoczynający ładowanie systemu operacyjnego z dyskietki. Znajduje się on na wszystkich sformatowanych dyskietkach.
2).Tablica rozmieszczenia zbiorów ( FAT ) - zawiera oficjalny zapis formatu dysku, plan rozmieszczenia zbiorów na dysku. Następuje on po rekordzie wprowadzającym i zwykle zaczyna się od 2-go sektora, 0-wej ścieżki, 0-wej strony. Na dyskietce znajdują się dwie identyczne kopie FAT-u.
3).Katalog - zawiera informacje o nazwach zbiorów, ich wielkości i położeniu pierwszej grupy sektorów używanych przez zbiór.
4).Przestrzeń danych - zajmuje pozostałą przestrzeń dysku i służy do przechowywania danych.
Przydział sektorów dla poszczególnych formatów :
S8 - 320 sektorów, 1 wprowadzający, 2 FAT, 4 katalog, 323 danych.
D8 - 640 sektorów, 1 wprowadzający, 2 FAT, 7 katalog, 630 danych.
S9 - 360 sektorów, 1 wprowadzający, 4 FAT, 4 katalog, 351 danych.
D9 - 720 sektorów, 1 wprowadzający, 4 FAT, 7 katalog, 708 danych.
QD9 - 1440 sektorów, 1 wprowadzający, 10 FAT, 7 katalog, 1422 danych.
QD15- 2400 sektorów, 1 wprowadzający, 14 FAT, 14 katalog, 2371 danych.
2.1.Rekord wprowadzający.
Rekord wprowadzający zawiera krótki program w języku maszynowym sprawdzający czy dysk zawiera zbiory IBMBIO.COM i IBMDOS.COM oraz rozpoczynający proces ładowania systemu DOS do pamięci.
Rekord wprowadzający ma następującą postać :
Adres względny Zawartość
0-1 Kod rozkazu skoku.
2 Adres początkowy programu ładującego ( dla typowego IBM PC pole ma wartość 2E ).
3-10 Systemowy ID np. IBM 2.1.
11-12 Liczba bajtów w sektorze ( np. 0200H ).
13 Liczba sektorów w wiązce ( np. 01 lub 02 ).
14-15 Liczba zastrzeżonych sektorów na początku ( 01 dla dyskietek ).
16 Liczba kopii FAT ( 02 dla dyskietek ).
17-18 Liczba pozycji katalogów źródłowych ( np. 64 lub 112).
19-20 Całkowita liczba sektorów na dysku ( np. 720 ).
21 ID ( FFH, FEH, FDH, FCH ).
22-23 Liczba sektorów na FAT ( np. 1 lub 2 ).
24-25 Liczba sektorów na ścieżkę.
26-27 Liczba stron ( np. 1 lub 2 ).
28-29 Liczba specjalnie zarezerwowanych sektorów.
2.2.Katalog.
W katalogach dysku znajduje się większość podstawowych informacji o zbiorach przechowywanych na dysku. Każdemu zbiorowi na dysku odpowiada tylko jedna pozycja katalogu, włącznie ze zbiorami należącymi do podkatalogów i pozycjami ID wolumenu dysku. Długość każdej pozycji katalogu wynosi 32 bajty a każda pozycja ma 8 pól.
Opis pozycji katalogu :
Pole Adres Opis
1 0-7 Nazwa zbioru ( ciąg znaków ASCII ).
2 8-10 Rozszerzenie ( 3 znaki ASCII ).
3 11 Atrybut : 1 - tylko do czytania
2 - ukryty
4 - systemowy
8 - etykieta wolumenu
16 - podkatalog
32 - archiwalny
64 - nie używany
128 - nie używany.
4 12-21 Obszar nie używany ( wypełniony zerami ).
5 22-23 Czas ( dane zakodowane ).
CZAS = GODZINA*2048 + MINUTY*32 + SEKUNDY/2
6 24-25 Data ( dane zakodowane ).
DATA = ( ROK - 1980 )*512 + MIESIĄC*64 + DZIEŃ
7 26-27 Początkowa pozycja zbioru w FAT.
8 28-31 Rozmiar zbioru.
2.3.Tablica rozmieszczenia zbiorów FAT.
Zawiera ona rekord opisujący użytkowanie dysku. Istnieją dwa formaty FAT-u : 12-bitowy i 16-bitowy. Dyskietki posiadają FAT 12-bitowy. FAT ma budowę tablicy z pozycjami dla każdej wiązki w przestrzeni danych. Numer na każdej pozycji FAT-u określa status i zastosowanie wiązki.
Pierwszym bajtem FAT-u jest bajt ID określający format dyskietki :
FFH - format D8,
FEH - format S8,
FDH - format D9,
FCH - format S9,
F9H - format QD9,
F9H - format QD15.
Pozostałe pozycje FAT-u tworzą łańcuchy przydziałów zbioru. Każda pozycja FAT-u odpowiada jednej wiązce. Jedną wiązkę tworzy jeden lub więcej sektorów.
Zależności pomiędzy poszczególnymi formatami, ilością sektorów na wiązkę i ilością wiązek :
S8 - 313 sektorów, 313 wiązek, 1 sektor na wiązkę, numeracja 2-314,
D8 - 630 sektorów, 315 wiązek, 2 sektory na wiązkę, numeracja 2-316,
S9 - 351 sektorów, 351 wiązek, 1 sektor na wiązkę, numeracja 2-352,
D9 - 708 sektorów, 354 wiązki, 2 sektory na wiązkę, numeracja 2-355,
QD9 - 1422 sektory, 711 wiązek, 2 sektory na wiązkę, numeracja 2-712,
QD15- 2371 sektorów, 2371 wiązek, 1 sektor na wiązkę, numeracja 2-2372.
Na każdej pozycji tablicy FAT mogą być umieszczone następujące wartości:
(0)000H - dla wiązki wolnej ( możliwy zapis ),
(F)FF8H-(F)FFFH - dla ostatniej wiązki zbioru ( sygnalizacja końca ),
(F)FF0H-(F)FF6H - dla wiązek zarezerwowanych,
(F)FF7 - dla wiązek uszkodzonych.
Jeśli chcemy wyznaczyć wartość FAT-u w formacie 12-bitowym dla zadanej wiązki należy pomnożyć numer wiązki przez 3 i podzielić przez 2. Jeśli numer wiązki jest parzysty odrzucamy cyfrę bardziej znaczącą, jeśli nieparzysty cyfrę mniej znaczącą. Odczytana z tej pozycji FAT-u liczba jeśli jest mniejsza od FF0H to jest ona adresem następnej wiązki.
3.Wybrane przerwania BIOS obsługi dyskietek.
Wszystkie programy obsługi dyskietek ROM BIOS-u wywoływane są przez przerwanie INT 13H. Rodzaj programu obsługi wybierany jest przez przekazywanie parametru w rejestrze AH procesora.
Programy obsługi dyskietek INT 13H.
Nr. Zawartość rejestrów Opis
0 AH=0 Zerowanie systemu dyskietek.
1 AH=1 Pobranie do rejestru AL statusu dyskietki.
80H - brak odpowiedzi napędu,
40H - złe przeszukiwanie,
20H - sterownik źle funkcjonuje,
10H - błąd kontroli parzystości danych,
08H - niepowodzenie transmisji DMA,
04H - brak szukanego sektora na dyskietce,
02H - nie znaleziony lub źle zaznaczony
sektor ID.
2 AH=2 Odczyt sektorów dyskietki.
DL=numer napędu Jeśli CF=0 to nie ma błędu,
dyskowego jeśli CF=1 wtedy w AH zawarty jest kod błędu
DH=numer strony ( patrz opis programu obsługi nr 1 ).
lub głowicy
CH=numer ścieżki
CL=numer sektora
AL=liczba czytanych
sektorów
ES:BX=adres bufora
3 AH=3 Zapis sektorów dyskietki.
DL=numer napędu Jeśli CF=0 to nie ma błędu,
dyskowego jeśli CF=1 wtedy w AH zawarty jest kod błędu
DH=numer strony ( patrz opis programu obsługi nr 1 ).
lub głowicy
CH=numer ścieżki
CL=numer sektora
AL=liczba czytanych
sektorów
ES:BX=adres bufora
4 AH=4 Weryfikacja sektorów dyskietki.
DL=numer napędu Jeśli CF=0 to nie ma błędu,
dyskowego jeśli CF=1 wtedy w AH zawarty jest kod błędu
DH=numer strony ( patrz opis programu obsługi nr 1 ).
lub głowicy
CH=numer ścieżki
CL=numer sektora
AL=liczba czytanych
sektorów
ES:BX=adres bufora
5 AH=5 Formatowanie ścieżki.
DL=numer napędu
dyskowego
DH=numer strony
lub głowicy
CH=numer ścieżki
AL=liczba czytanych
sektorów
ES:BX=adres
początku 4-bitowych
znaczników sektorów
4.Wybrane przerwania DOS-u obsługi dyskietek.
Programy obsługi dyskietek DOS-u wywoływane są przez przerwania INT 25H, INT 26H oraz INT 21H. Poniżej przedstawiony został skrócony opis tych przerwań.
Przerwanie INT 25H.
Funkcja : bezwzględny odczyt określonych sektorów na dysku.
Parametry wejściowe :
AL=numer napędu,
CX=ilość sektorów,
DX=numer początkowego sektora,
DS:BX=adres miejsca przeniesień danych w pamięci.
Parametry wyjściowe :
CF=0 - brak błędów.
CF=1 - wystąpił błąd.
AL=kod błędu
0CH - błąd nieokreślony,
0BH - błąd odczytu,
0AH - błąd zapisu,
08h - sektor nie został odnaleziony,
07H - nie rozpoznany format dysku,
06H - błąd szukania,
04H - błąd CRC,
02H - napęd nie jest gotowy do pracy,
01H - niewłaściwy numer napędu,
00H - próba zapisu na zabezpieczonej dyskietce.
AH=kod błędu
80H - przekroczenie czasu,
40H - błąd szukania,
20H - niesprawny kontroler,
10H - błąd CRC,
08H - błąd DMA,
04H - brak zadanego sektora na dyskietce,
03H - próba zapisu na zabezpieczonej dyskietce,
02H - błędne oznakowanie ID,
00H - pozostałe błędy.
Przerwanie INT 26H.
Funkcja : bezwzględny zapis określonych sektorów na dysku.
Parametry wejściowe :
AL=numer napędu,
CX=ilość sektorów,
DX=numer początkowego sektora,
DS:BX=adres miejsca przeniesień danych w pamięci.
Parametry wyjściowe :
CF=0 - brak błędów.
CF=1 - wystąpił błąd.
AL=kod błędu
0CH - błąd nieokreślony,
0BH - błąd odczytu,
0AH - błąd zapisu,
08h - sektor nie został odnaleziony,
07H - nie rozpoznany format dysku,
06H - błąd szukania,
04H - błąd CRC,
02H - napęd nie jest gotowy do pracy,
01H - niewłaściwy numer napędu,
00H - próba zapisu na zabezpieczonej dyskietce.
AH=kod błędu
80H - przekroczenie czasu,
40H - błąd szukania,
20H - niesprawny kontroler,
10H - błąd CRC,
08H - błąd DMA,
04H - brak zadanego sektora na dyskietce,
03H - próba zapisu na zabezpieczonej dyskietce,
02H - błędne oznakowanie ID,
00H - pozostałe błędy.
Ze względu na różny system numeracji przyjmowany przez BIOS i DOS poniżej podane zostały wzory umożliwiające wzajemne przeliczenia.
NUMER_SEKTORA.DOS=(SEKTOR.BIOS-1)+STRONA.BIOS*ILOŚĆ_SEKTOR'W_NA_STRONĘ
+ŚCIEŻKA.BIOS*ILOŚĆ_SEKTOR'W_NA_STRONĘ*ILOŚĆ_STRON_
NA_DYSKU
SEKTOR.BIOS=1+(SEKTOR.DOS)MOD(ILOŚĆ_SEKTOR'W_NA_STRONĘ)
STRONA.BIOS=((SEKTOR.DOS)/(ILOŚĆ_SEKTOR'W_NA_STRONĘ))MOD(ILOŚĆ_STRON_
NA-DYSKU)
ŚCIEŻKA.BIOS=SEKTOR.DOS/(ILOŚĆ_SEKTOR'W_NA_STRONĘ*ILOŚĆ_STRON_NA_
DYSKU)
Przerwanie INT 21H.
Przerwanie to zawiera wywołania wszystkich funkcji DOS-u. Wybraną funcję DOS-u wywołuje się przez przerwanie INT 21H z podaniem numeru funkcji w rejestrze procesora AH.
Programy obsługi dyskietek INT 21H.
Nr. Zawartość rejestrów Opis
0DH AH=0DH Reset dysku
0EH AH=0EH Wybór bieżącego napędu
DL=ID_napędu AL=ilość napędów 19H AH=19H Zgłaszanie bieżącego napędu
AL=kod domyślnego napędu
1AH AH=1AH Ustalenie obszaru przeniesień dyskowych
DS:DX=wskaźnik DTA
1BH AH=1BH Uzyskanie danych z tablicy rozmieszczenia
zbiorów ( bieżący napęd )
AL=ilość sektorów na jednostkę alokacji
CX=ilość bajtów w sektorze
DX=ilość jednostek alokacji
DS:DX=wskaźnik bajtu ID FAT
1CH AH=1CH Uzyskanie danych z tablicy rozmieszczenia DL=ID-napędu zbiorów ( dowolny napęd )
AL=ilość sektorów na jednostkę alokacji
CX=ilość bajtów w sektorze
DX=ilość jednostek alokacji
DS:DX=wskaźnik bajtu ID FAT
2EH AH=2EH Ustalenie weryfikacji zapisu na dysku
AL=00 tak
AL=01 nie
DL=00
2FH AH=2FH Uzyskanie adresu DTA
AX=kod powrotu
ES:BS=wskaźnik DTA
36H AH=36H Odczytanie ilości wolnego miejsca na dysku
DL=kod napędu AX=ilość sektorów w wiązce
BX=ilość dostępnych wiązek
CX=ilość bajtów w sektorze
DX=ogólna ilość wiązek
0FH AH=0FH Otwarcie zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
10H AH=10H Zamknięcie zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
11H AH=11H Poszukiwanie pierwszego zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
12H AH=12H Poszukiwanie następnego zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
13H AH=13H Usuwanie zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
14H AH=14H Odczyt rekordu zbioru sekwencyjnego
DS:DX=wskaźnik FCB AL=kod powrotu
15H AH=15H Zapis rekordu zbioru sekwencyjnego
DS:DX=wskaźnik FCB AL=kod powrotu
16H AH=16H Tworzenie zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
17H AH=17H Przemianowanie zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
21H AH=21H Odczyt rekordu zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
22H AH=22H Zapis rekordu zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
23H AH=23H Uzyskanie wymiaru zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
24H AH=24H Ustalanie miejsca rekordu
DS:DX=wskaźnik FCB AL=kod powrotu
27H AH=27H Odczyt rekordów zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
CX=liczba rekordów CX=aktualna liczba rekordów
28H AH=28H Zapis rekordów zbioru
DS:DX=wskaźnik FCB AL=kod powrotu
CX=liczba rekordów CX=aktualna liczba rekordów
29H AH=29H Analiza nazwy zbioru
DS:SI=wskaźnik ES:DI=wskaźnik FCB
linii rozkazu DS:SI=wskaźnik następnego miejsca w linii
ES:DI=wskaźnik FCB rozkazu
AL=bity sterujące
3CH AH=3CH Tworzenie zbioru
CX=atrybut zbioru AX=identyfikator lub kod powrotu
DS:DX=wskaźnik
łańcucha ASCIIZ
3DH AH=3DH Otwarcie zbioru
AL=kod dostępu AX=identyfikator lub kod powrotu
DS:DX=wskaźnik łańcucha ASCIIZ
3EH AH=3EH Obsługa zamknięcia zbioru
BX=identyfikator AX=kod powrotu
3FH AH=3FH Czytanie ze zbioru lub urządzenia
BX=identyfikator AX=ilość wczytanych bajtów lub kod powrotu
CX=ilość bajtów
do odczytania DS:DX=wskaźnik
bufora DTA 40H AH=40H Zapisnie do zbioru lub urządzenia
BX=identyfikator AX=ilość wczytanych bajtów lub kod powrotu
CX=ilość bajtów
do odczytania DS:DX=wskaźnik
bufora DTA
41H AH=41H Usunięcie zbioru
DS:DX=wskaźnik AX=kod powrotu
łańcucha ASCIIZ
42H AH=42H Przesunięcie wskaźnika zbioru
AL=kod AX=kod powrotu
CX:DX=adres DX:AX=nowy wskaźnik lokalizacji
względny
43H AH=43H Uzyskiwanie i ustalanie atrybutów zbioru
AL=kod AX=kod powrotu
00-uzyskiwanie CX=atrybut
01-ustalanie
DS:DX=wskaźnik
łańcucha ASCIIZ
4EH AH=4EH Rozpoczęcie poszukiwania zbioru
CX=atrybut poszuk. AX=kod powrotu
DS:DX=wskaźnik
łańcucha ASCIIZ
4FH AH=4FH Kontynuacja poszukiwania zbioru
DS:DX=informacja AX=kod powrotu
z wołania 4EH
56H AH=56H Zmiana nazwy zbioru
DS:DX=wskaźnik AX=kod powrotu
łańcucha ASCIIZ
ES:DI=wskaźnik
łańcucha ASCIIZ
( nowa nazwa )
5AH AH=5AH Tworzenie zbioru tymczasowego
DS:DX=adres opisu AX=kod błędu ( CF=1 )
ścieżki katalogu DS:DX=opis ścieżki ( CF=0 )
CX=atrybut zbioru
39H AH=39H Tworzenie katalogu
DS:DX=wskaźnik AX=kod powrotu
łańcucha ASCIIZ
3AH AH=3AH Usunięcie katalogu
DS:DX=wskaźnik AX=kod powrotu
łańcucha ASCIIZ
3BH AH=3BH Zmiana bieżącego katalogu
DS:DX=wskaźnik AX=kod powrotu
łańcucha ASCIIZ
47H AH=47H Uzyskanie bieżącego katalogu
DL=ID napędu AX=kod powrotu ( CF=1 )
DS:SI=wskaźnik DS:SI=opis ścieżki ( CF=0)
obszaru danych
5.Przebieg ćwiczenia.
1).Zapoznać się ze strukturą i organizacją dyskietki.
2).Wczytać rekord wprowadzający dyskietki.
3).Zapoznać się ze strukturą i zawartością wczytanego rekordu wprowadzającego.
4).Wczytać katalog dyskietki.
5).Zapoznać się ze strukturą i zawartością poszczególnych pozycji katalogu.
6).Wczytać FAT dyskietki.
7).Zapoznać się ze strukturą i zawartością wczytanej tablicy rozmieszczenia zbiorów.
8).Napisać prosty program wyświetlający na ekranie monitora zawartość poszczególnych pól rekordu wprowadzającego, katalogu oraz FAT-u.
9).Po uzgodnieniu z prowadzącym zrealizować wybrane zagadnienia z rozdziału 6.
UWAGA !
Jeżeli prowadzący nie wskaże innej metody wszelkie operacje na dyskietce należy przeprowadzać używając zintegrowanego systemu TURBO PASCAL z wykożystaniem przerwań DOS i BIOS.
6.Przykładowe zadania do wykonania.
1).Zaprojektować i wykonać program sprawdzający czy rekord wprowadzający nie uległ zmianie .
2).Zaprojektować i wykonać program prostego edytora pozwalającego na oglądanie i zmianę zawartości poszczególnych pozycji rekordu wprowadzającego.
3).Zaprojektować i wykonać program prostego edytora pozwalającego na oglądanie i zmianę zawartości poszczególnych pozycji katalogu.4).Zaprojektować i wykonać program prostego edytora pozwalającego na oglądanie i zmianę zawartości poszczególnych pozycji tablicy rozmieszczenia zbiorów.
7.Literatura.
[1].Peter Norton, Przewodnik programisty komputerów osobistych IBM PC.
[2].DOS Technical reference.
[3].TECH HELP.
[4].NORTON GUIDE.
[5].Jan Bielecki, Rozszerzony Turbo Pascal 4.0, WKiŁ Warszawa 1988.
[6].Jerzy Szczepkiewicz, Turbo Pascal 4.0 z dodatkiem do wersji 5.0, WNT Warszawa 1989.
[7].Andrzej Marciniak, Turbo Pascal 5.0 suplement do wersji 4.0, PWN Warszawa-Poznań 1989.
19