Technika mikroprocesorowa - laboratorium Ćwiczenie 8: Dyskietki

Transkrypt

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