Format AtariDOS 1
From Atariki
←Older revision | Newer revision→
Format dyskietki używany przez DOS 1.0 przeznaczony dla stacji 810. Format ten jest bardzo podobny do późniejszego formatu DOS-u 2.0.
Spis treści |
Cechy ogólne
- Dopuszczalne wielkości sektorów: 128 bajtów
- Maksymalna pojemność filesystemu: 944 sektory (115,23 kB)
- Maksymalna wielkość pliku: 125 kB
- Maksymalna liczba plików na dysku: 64
- Struktura katalogowa: jednopoziomowa
- Maksymalna liczba plików w katalogu: 64
- Wielkość wpisu w katalogu: 16 bajtów
- Nazwa pliku: 8+3
- Metoda linkowania plików: 3-bajtowy link w sektorze danych
- Metoda alokacji sektorów: mapa bitowa
Struktura ogólna
Obsługiwana jest wyłącznie gęstość pojedyncza (SD), jednostką alokacji jest pojedynczy sektor fizyczny o wielkości 128 bajtów. Sektor nr 360 ($168) jest zajęty na VTOC, w sektorach 361-368 ($0169-$0170) znajduje się katalog dyskietki. W sektorze nr 1 jest program ładujący DOS, a sektor ostatni jest niewykorzystany. Początkowa pojemność dyskietki to 709 wolnych sektorów z ogólnej liczby 720.
VTOC
Pierwszy bajt VTOC zajmuje numer wersji formatu dyskietki, jest to $01. Dwa dalsze bajty to zapisana w konwencji młodszy/starszy początkowa liczba wolnych sektorów dyskietki, czyli maksymalna liczba sektorów możliwych do wykorzystania na pliki ($02C5 = 709). Dwa kolejne bajty to bieżąca liczba wolnych sektorów.
Bajty 5-9 VTOC są nieużywane. Od bajtu 10 do 99 rozciąga się mapa bitowa dyskietki. Każdy bajt opisuje stan ośmiu kolejnych sektorów, przy czym bit ustawiony oznacza sektor wolny, a bit skasowany - sektor zajęty. Bity przypisywane są od lewej do prawej sektorom o rosnących numerach, a więc jeśli bit 7 bajtu opisuje stan sektora numer 'n', to bit 6 odpowiada za sektor 'n+1', bit 5 za 'n+2' itd.
Pierwszy bajt mapy opisuje stan sektorów o numerach od 0 do 7 (pomimo że sektor 0 nie istnieje). Na pustej dyskietce jego wartość to $3F, co oznacza, że z grupy sektorów 0-7 dwa pierwsze (0 i 1) są zajęte, a reszta (2-7) wolna. Ostatni sektor dyskietki ma przypisany bit 7 bajtu nr 100 VTOC i jest oznaczony jako zajęty.
Struktura VTOC, wyjąwszy znacznik formatu w pierwszym bajcie, jest identyczna jak w DOS 2.0.
Katalog
Katalog zajmuje osiem sektorów o numerach od 361 do 368 ($0169-$0170). Pojedynczy wpis ma 16 bajtów długości, jego strukturę przedstawia tabelka:
Offset | Opis |
$00 |
Bajt statusu:
Ogólnie status $40 oznacza plik istniejący, $60 plik zabezpieczony przed zapisem, a $80 plik skasowany. |
$01-$02 |
Wielkość pliku w sektorach. Co ciekawe, DOS 1.0 bierze pod uwagę tylko młodszy bajt tej liczby przy wyświetlaniu katalogu, a więc plik o wielkości 256 sektorów będzie miał w katalogu wielkość "000". Jest to zapewne błąd w kodzie DOS-u. |
$03-$04 | Numer pierwszego sektora zajętego przez plik. |
$05-$0C | Nazwa pliku dopełniona spacjami. |
$0D-$0F | Rozszerzenie nazwy pliku dopełnione spacjami. |
Struktura katalogu jest bardzo podobna do tej, którą mamy w DOS 2.0. Jedyną liczącą się różnicą jest to, że DOS 2.0 ustawia zakładanym przez siebie plikom bit 1 statusu, co oznacza "plik założony przez DOS 2.0". Ma to znaczenie przy wymianie plików pomiędzy DOS 1.0 a DOS 2.0 - od biedy mogą one współistnieć na jednej dyskietce, aczkolwiek dostęp do plików DOS 2.0 spod DOS 1.0 jest dość kłopotliwy (patrz niżej).
Mapowanie plików
Ciągłość plików oraz dokładne dane o ich długości (katalog zawiera tylko wielkość pliku w sektorach) zapewnia "link" umieszczony w trzech ostatnich bajtach każdego sektora danych. Wynika z tego, że w każdym sektorze dostępne jest tylko 125 bajtów na dane pliku, trzy pozostałe natomiast zajmuje DOS. Informacja w nich zawarta rozmieszczona jest niezgodnie z granicami bajtów:
+---------------+---------------+---------------+ | 0 | 1 | 2 | +---------------+---------------+---------------+ |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0| +-----------+---+---------------+-+-------------+ | nr pliku | następny sektor |Z| nr kolejny | +-----------+-------------------+-+-------------+
- Numer pliku to numer wpisu w katalogu dyskietki, który należy do pliku. Jest nań przeznaczone sześć bitów, czyli na dyskietce mogą być nie więcej niż 64 pliki. Pole to służy do kontrolowania, czy ciągłość plików na dyskietce nie uległa zakłóceniu - jeśli ten numer się nie zgadza z numerem bieżąco odczytywanego pliku, DOS zgłasza błąd nr 164.
- Dziesięć następnych bitów to numer następnego sektora pliku; w ostatnim sektorze pliku jest on równy zero. Kolejność bajtów jest odwrotna od ogólnie przyjętej (tj. bajt nr 0 zawiera "najstarsze" bity tej wartości).
Wielkość tego pola ogranicza system plików do 1024 sektorów. Co więcej, ponieważ jedyna informacja na temat rozmieszczenia pliku znajduje się w przypisanych doń sektorach, rozmieszczenie sektorów pliku na dyskietce nigdy nie jest znane bez odczytania całości pliku aż do końca - co jest konieczne nawet przy jego kasowaniu. Z kolei fakt, że wskaźnik jest skierowany tylko w jedną stronę, tj. na następny sektor, powoduje, iż znalezienie sektora poprzedniego również wymaga odczytania pliku od początku; o funkcji seek() i swobodnym dostępie do danych pliku można więc przy takim filesystemie od razu zapomnieć
- Bit Z to wskaźnik zapełnienia sektora. Jest on ustawiony w ostatnim sektorze pliku i decyduje o znaczeniu dalszych siedmiu bitów linku.
- Nr kolejny: jeśli bit "Z" jest skasowany, pole "nr kolejny" zawiera siedem najmłodszych bitów numeru sektora względem początku pliku, przy czym pierwszy sektor każdego pliku ma tu numer 0, następny 1 itd. W ostatnim sektorze pliku, gdy bit "Z" jest ustawiony, w bitach tych zapisana jest liczba bajtów danych znajdująca się w sektorze.
Znaczenie bitów ostatniego bajtu linku zostało zmienione w DOS 2.0 - DOS ten nie ustawia bitu "Z", a co za tym idzie DOS 1.0 nie jest w stanie znaleźć końca pliku zapisanego przez DOS 2.0. Próba odczytu takiego pliku do końca powoduje błąd nr 139.
Uwagi
Opisany system był z niewielkimi zmianami kontynuowany przez DOS 2.0 i DOS 2.5 oraz ich klony (np. MyDOS).