Format MyDOS
From Atariki
Wersja z dnia 23:06, 3 lip 2011 KMK (Dyskusja | wkład) (→Mapowanie plików) ← Previous diff |
Aktualna wersja Epi (Dyskusja | wkład) (→Mapowanie plików - prawda o linkach.) |
||
Linia 16: | Linia 16: | ||
== Struktura ogólna == | == Struktura ogólna == | ||
- | Obsługiwana jest gęstość pojedyncza, rozszerzona i podwójna ([[SD]], [[ED]] i [[DD]]). Jednostką alokacji jest pojedynczy sektor fizyczny o wielkości 128 lub 256 bajtów. W sektorze nr 360 ($168) zaczyna się [[VTOC]], w sektorach 361-368 ($0169-$0170) znajduje się katalog główny dyskietki. W sektorach 1-3 jest program ładujący DOS. Początkowa pojemność dyskietki DD to 708 wolnych sektorów z ogólnej liczby 720. | + | Obsługiwana jest gęstość pojedyncza, rozszerzona i podwójna ([[SD]], [[ED]] i [[DD]]). Jednostką alokacji jest pojedynczy sektor fizyczny o wielkości 128 lub 256 bajtów. W sektorze nr 360 ($168) zaczyna się [[VTOC]], w sektorach 361-368 ($0169-$0170) znajduje się katalog główny dyskietki. W sektorach 1-3 jest program ładujący DOS. Dyski zainicjalizowane przez MyDOS mają w bajcie 0 sektora nr 1 kod ASCII litery M. |
+ | Początkowa pojemność dyskietki DD to 708 wolnych sektorów z ogólnej liczby 720. | ||
== VTOC == | == VTOC == | ||
- | W przeciwieństwie do sytuacji, jaką mamy w DOS 2.0, VTOC może zajmować ponad jeden sektor. Dodatkowe sektory VTOC zajmowane są licząc wstecz od sektora 360. Jeśli VTOC nie mieści się w pierwszym sektorze, to jako następny zostanie wykorzystany sektor nr 359 w DD, a w SD - sektory nr 359 i 358 (gdyż alokacja VTOC odbywa się w "stronach", czyli porcjach po 256 bajtów, a więc w pojedynczej gęstości po dwa sektory). | + | W przeciwieństwie do sytuacji, jaką mamy w DOS 2.0, VTOC może zajmować ponad jeden sektor. Dodatkowe sektory VTOC zajmowane są licząc wstecz od sektora 360, przy czym na dyskach w SD, gdy liczba sektorów VTOC jest większa od 1, jest ona zawsze parzysta. Zatem, jeśli VTOC nie mieści się w pierwszym sektorze, to jako następny zostanie wykorzystany sektor nr 359. Dla jeszcze większych dysków w DD kolejnym zajętym sektorem będzie sektor nr 358, natomiast w SD będą to sektory nr 358 i 357. |
- | Wielkość VTOC zapisana jest w pierwszym bajcie sektora nr 360. Dla "standardowych" gęstości SD i DD (90 i 180k) liczba ta wynosi $02, co oznacza jeden sektor VTOC. Każda inna wartość (w praktyce jest to przedział $03-$23) oznacza liczbę "stron" VTOC, dodać 2. | + | Bajt 0 sektora nr 360 definiuje zarówno sposób organizacji VTOC, jak i format trzybajtowego [[#Mapowanie plików|odnośnika]], znajdującego się na końcu każdego sektora danych. Wartość 2 oznacza, że cały VTOC mieści się w jednym sektorze i format odnośnika jest zgodny z DOS 2.0. Wartość większa od 2 oznacza liczbę 256-bajtowych bloków zajętych przez VTOC, dodać 2. Oznacza ona również, że odnośniki pozbawione są 6-bitowego pola z numerem pliku, a pole zawierające numer kolejnego sektora zostało rozszerzone do 16-bitów. |
Dwa dalsze bajty VTOC 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 (np. $02C4 = 708). Dwa kolejne bajty to bieżąca liczba wolnych sektorów. | Dwa dalsze bajty VTOC 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 (np. $02C4 = 708). Dwa kolejne bajty to bieżąca liczba wolnych sektorów. | ||
Linia 28: | Linia 29: | ||
Bajty 5-9 VTOC są nieużywane. Od bajtu 10 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. | Bajty 5-9 VTOC są nieużywane. Od bajtu 10 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 $0F, co oznacza, że z grupy sektorów 0-7 cztery pierwsze (0-3) są zajęte, a reszta (4-7) wolna. Ostatni sektor dyskietki ma przypisany bit 7 bajtu nr 100 VTOC i jest oznaczony jako zajęty. | + | 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 $0F, co oznacza, że z grupy sektorów 0-7 cztery pierwsze (0-3) są zajęte, a reszta (4-7) wolna. Ostatni sektor dyskietki DD ma przypisany bit 7 bajtu nr 100 VTOC i jest oznaczony jako wolny. |
== Katalog == | == Katalog == | ||
Linia 38: | Linia 39: | ||
<tr><td>$00</td><td> | <tr><td>$00</td><td> | ||
<p>Bajt statusu:</p> | <p>Bajt statusu:</p> | ||
- | * bit 7 = 1 - plik skasowany; pozostałe bity mają wtedy wartość 0 | + | * bit 7 = 1 - plik lub katalog skasowany (pozostałe bity mają wtedy wartość 0), |
- | * bit 6 = 1 - plik istnieje; stany bitów 6 i 7 są zawsze przeciwne | + | * bit 6 = 1 - plik istniejący (bit 4 ma wtedy wartość 0), |
- | * bit 5 = 1 - plik/katalog jest zabezpieczony przed zapisem lub skasowaniem | + | * bit 5 = 1 - plik lub katalog zabezpieczony przed zapisem lub skasowaniem, |
- | * bit 4 = 1 - plik jest podkatalogiem (stany bitów 4 i 6 są zawsze przeciwne) | + | * bit 4 = 1 - katalog istniejący (bity 6, 2 i 1 mają wtedy wartość 0), |
- | * bit 3 - niewykorzystany | + | * bit 3 - niewykorzystany, MyDOS wpisuje tu 0, |
- | * bit 2 = 1 - znaczenie nieustalone, dla plików ustawiany na 1 | + | * bit 2 = 1 - sektory danych pliku zawierają 16-bitowe dowiązania do następnego sektora, |
* bit 1 = 1 - znaczenie nieustalone, dla plików ustawiany na 1 | * bit 1 = 1 - znaczenie nieustalone, dla plików ustawiany na 1 | ||
* bit 0 = 1 - plik jest otwarty do zapisu | * bit 0 = 1 - plik jest otwarty do zapisu | ||
- | <p>Ogólnie status $46 oznacza plik istniejący, $66 plik zabezpieczony przed zapisem, $80 plik skasowany, $10 katalog itp.</p> | + | <p>Ogólnie status $42 lub $46 oznacza plik istniejący, $62 lub $66 - plik tylko do odczytu, $10 - katalog, $80 - plik lub katalog skasowany itd.</p> |
</td></tr> | </td></tr> | ||
<tr><td>$01-$02</td><td> | <tr><td>$01-$02</td><td> | ||
- | <p>Wielkość pliku w sektorach.</p> | + | <p>Liczba sektorów danych zajętych przez plik.</p> |
</td></tr> | </td></tr> | ||
- | <tr><td>$03-$04</td><td><p>Numer pierwszego sektora zajętego przez plik.</p></td></tr> | + | <tr><td>$03-$04</td><td><p>Numer pierwszego sektora danych zajętego przez plik.</p></td></tr> |
<tr><td>$05-$0C</td><td><p>Nazwa pliku dopełniona spacjami.</p></td></tr> | <tr><td>$05-$0C</td><td><p>Nazwa pliku dopełniona spacjami.</p></td></tr> | ||
<tr><td>$0D-$0F</td><td><p>Rozszerzenie nazwy pliku dopełnione spacjami.</p></td></tr> | <tr><td>$0D-$0F</td><td><p>Rozszerzenie nazwy pliku dopełnione spacjami.</p></td></tr> | ||
</table> | </table> | ||
+ | |||
+ | Nazwa i rozszerzenie nazwy pliku mogą zawierać wielkie litery, cyfry, oraz znaki "@" i "_", przy czym pierwszy znak nazwy nie może być cyfrą. | ||
Struktura katalogu jest bardzo podobna do tej, którą mamy w [[Format AtariDOS 2|DOS 2.0]]. Jedyną liczącą się różnicą jest to, że MyDOS ustawia zakładanym przez siebie plikom bit 2 statusu. | Struktura katalogu jest bardzo podobna do tej, którą mamy w [[Format AtariDOS 2|DOS 2.0]]. Jedyną liczącą się różnicą jest to, że MyDOS ustawia zakładanym przez siebie plikom bit 2 statusu. | ||
Linia 66: | Linia 69: | ||
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 (w [[SD]]) lub 253 (w [[DD]]) bajty na dane pliku, trzy pozostałe natomiast zajmuje DOS. | 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 (w [[SD]]) lub 253 (w [[DD]]) bajty na dane pliku, trzy pozostałe natomiast zajmuje DOS. | ||
- | W przypadku formatów zgodnych z DOS 2.0 (90 i 180k, pierwszy bajt VTOC = $02) struktura link jest identyczna jak w [[Format AtariDOS 2#Mapowanie plików|DOS-ie 2.0]]. Dla formatów specyficznych dla MyDOS-a (360k i więcej) link wygląda następująco: | + | Format linku zależy od wartości pierwszego bajtu [[#VTOC|VTOC]]. Gdy jest on równy $02, struktura link jest identyczna jak w [[Format AtariDOS 2#Mapowanie plików|DOS-ie 2.0]]. Dla wartości większych od $02, format linku wygląda następująco: |
+---------------+---------------+---------------+ | +---------------+---------------+---------------+ |
Aktualna wersja
Format dyskietki używany przez MyDOS jest rozwinięciem wcześniejszego formatu DOS-u 2.0. Modyfikacje mają na celu zwiększenie maksymalnej pojemności dysku oraz wprowadzenie podkatalogów.
Spis treści |
Cechy ogólne
- Dopuszczalne wielkości sektorów: 128 i 256 bajtów
- Maksymalna pojemność filesystemu: 65535 sektorów (16 MB)
- Maksymalna wielkość pliku: 15,81 MB
- Maksymalna liczba plików na dysku: nieograniczona
- Struktura katalogowa: hierarchiczna
- 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 gęstość pojedyncza, rozszerzona i podwójna (SD, ED i DD). Jednostką alokacji jest pojedynczy sektor fizyczny o wielkości 128 lub 256 bajtów. W sektorze nr 360 ($168) zaczyna się VTOC, w sektorach 361-368 ($0169-$0170) znajduje się katalog główny dyskietki. W sektorach 1-3 jest program ładujący DOS. Dyski zainicjalizowane przez MyDOS mają w bajcie 0 sektora nr 1 kod ASCII litery M. Początkowa pojemność dyskietki DD to 708 wolnych sektorów z ogólnej liczby 720.
VTOC
W przeciwieństwie do sytuacji, jaką mamy w DOS 2.0, VTOC może zajmować ponad jeden sektor. Dodatkowe sektory VTOC zajmowane są licząc wstecz od sektora 360, przy czym na dyskach w SD, gdy liczba sektorów VTOC jest większa od 1, jest ona zawsze parzysta. Zatem, jeśli VTOC nie mieści się w pierwszym sektorze, to jako następny zostanie wykorzystany sektor nr 359. Dla jeszcze większych dysków w DD kolejnym zajętym sektorem będzie sektor nr 358, natomiast w SD będą to sektory nr 358 i 357.
Bajt 0 sektora nr 360 definiuje zarówno sposób organizacji VTOC, jak i format trzybajtowego odnośnika, znajdującego się na końcu każdego sektora danych. Wartość 2 oznacza, że cały VTOC mieści się w jednym sektorze i format odnośnika jest zgodny z DOS 2.0. Wartość większa od 2 oznacza liczbę 256-bajtowych bloków zajętych przez VTOC, dodać 2. Oznacza ona również, że odnośniki pozbawione są 6-bitowego pola z numerem pliku, a pole zawierające numer kolejnego sektora zostało rozszerzone do 16-bitów.
Dwa dalsze bajty VTOC 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 (np. $02C4 = 708). Dwa kolejne bajty to bieżąca liczba wolnych sektorów.
Bajty 5-9 VTOC są nieużywane. Od bajtu 10 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 $0F, co oznacza, że z grupy sektorów 0-7 cztery pierwsze (0-3) są zajęte, a reszta (4-7) wolna. Ostatni sektor dyskietki DD ma przypisany bit 7 bajtu nr 100 VTOC i jest oznaczony jako wolny.
Katalog
Katalog główny 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 $42 lub $46 oznacza plik istniejący, $62 lub $66 - plik tylko do odczytu, $10 - katalog, $80 - plik lub katalog skasowany itd. |
$01-$02 |
Liczba sektorów danych zajętych przez plik. |
$03-$04 | Numer pierwszego sektora danych zajętego przez plik. |
$05-$0C | Nazwa pliku dopełniona spacjami. |
$0D-$0F | Rozszerzenie nazwy pliku dopełnione spacjami. |
Nazwa i rozszerzenie nazwy pliku mogą zawierać wielkie litery, cyfry, oraz znaki "@" i "_", przy czym pierwszy znak nazwy nie może być cyfrą.
Struktura katalogu jest bardzo podobna do tej, którą mamy w DOS 2.0. Jedyną liczącą się różnicą jest to, że MyDOS ustawia zakładanym przez siebie plikom bit 2 statusu.
W podwójnej gęstości wpisy katalogowe zajmują tylko pierwszą połówkę każdego sektora katalogu, reszta natomiast pozostaje pusta.
Struktura podkatalogu jest identyczna jak struktura katalogu głównego.
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 (w SD) lub 253 (w DD) bajty na dane pliku, trzy pozostałe natomiast zajmuje DOS.
Format linku zależy od wartości pierwszego bajtu VTOC. Gdy jest on równy $02, struktura link jest identyczna jak w DOS-ie 2.0. Dla wartości większych od $02, format linku wygląda następująco:
+---------------+---------------+---------------+ | 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| +---------------+---------------+---------------+ | następny sektor | wypełnienie | +-------------------------------+---------------+
- 16 pierwszych 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 jest "starszy").
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ć
- Wypełnienie: ilość bajtów danych w sektorze. Pełny sektor danych ma tu wartość $7D (125) w SD i $FD (253) w DD. Liczba ta ma znaczenie tylko w ostatnim sektorze pliku, gdzie pozwala znaleźć koniec danych.