Format AtariDOS XE
From Atariki
Wersja z dnia 12:44, 29 wrz 2006 KMK (Dyskusja | wkład) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) (→Informacja o dysku) |
||
Linia 1: | Linia 1: | ||
- | [[Formaty systemów plików|Format dyskietki]] zastosowany w [[DOS XE|AtariDOS XE]], przeznaczony głównie dla stacji dysków [[XF551]], ale też [[810]] i [[1050]]. | + | [[Formaty systemów plików|Format dyskietki]] zastosowany w [[DOS XE]], przeznaczony głównie dla stacji dysków [[XF551]], ale też [[810]] i [[1050]]. |
+ | |||
+ | == Cechy ogólne == | ||
+ | |||
+ | * Dopuszczalne wielkości sektorów: 128 i 256 bajtów | ||
+ | * Maksymalna pojemność filesystemu: 65535 klastrów (15,62 MB) | ||
+ | * Maksymalna wielkość pliku: 375000 bajtów (366,21 kB) | ||
+ | * Maksymalna liczba plików na dysku: 65536 | ||
+ | * Struktura katalogowa: hierarchiczna | ||
+ | * Maksymalna liczba plików w katalogu: 1280 | ||
+ | * Wielkość wpisu w katalogu: 49 bajtów | ||
+ | * Nazwa pliku: 8+3 | ||
+ | * Metoda linkowania plików: indywidualne mapy plików | ||
+ | * Metoda alokacji sektorów: mapa bitowa | ||
== Jednostka alokacji == | == Jednostka alokacji == | ||
- | Jednostkę alokacji stanowi 256 bajtów, czyli dwa sektory fizyczne w [[SD]] i [[ED]], a jeden w [[DD]]. Przełożenie sektorów fizycznych na jednostki alokacji jest dość osobliwe, liczy się bowiem w nim nieistniejący sektor nr 0. I tak, w [[DD]] sektor nr 0 stanowi jednostkę alokacji nr 0, sektor nr 1 - jednostkę alokacji nr 1 itd. W [[SD]] i [[DD]] jednostkę alokacji nr 0 stanowią sektory 0 i 1, jednostkę alokacji nr 2 - sektory 2 i 3, jednostkę alokacji nr 3 - sektory 4 i 5, i tak dalej. | + | Jednostkę alokacji stanowi "klaster" o wielkości 256 bajtów, czyli dwa sektory fizyczne w [[SD]] i [[ED]], a jeden w [[DD]]. Przełożenie sektorów fizycznych na klastry jest dość osobliwe, liczy się bowiem w nim nieistniejący sektor nr 0. I tak, w [[DD]] sektor nr 0 stanowi klaster nr 0, sektor nr 1 - klaster nr 1 itd. W [[SD]] i [[ED]] klaster nr 0 stanowią sektory 0 i 1, klaster nr 1 - sektory 2 i 3, klaster nr 2 - sektory 4 i 5, i tak dalej. |
== Boot == | == Boot == | ||
- | Pierwsze trzy sektory (fizyczne) dysku zajmuje program ładujący DOS. Oprócz tego w bajtach $09-$2F sektora nr 1 zapisane są informacje o dyskietce i konfiguracja DOS-u. | + | Pierwsze trzy sektory (fizyczne) dysku zajmuje program ładujący DOS. Oprócz tego w bajtach $09-$0F sektora ('''nie''' klastra) nr 1 zapisana jest konfiguracja DOS-u, a w bajtach $10-$2F - informacje o dysku. |
+ | |||
+ | === Konfiguracja DOS === | ||
+ | |||
+ | <table border = 1 cellpadding = 5> | ||
+ | <tr><td><b>Offset</b></td><td><b>Opis</b></td></tr> | ||
+ | <tr><td>$09</td><td><p>Liczba określająca, ile plików można otworzyć jednocześnie. Standardowo 3, maksymalnie 7.</p></td></tr> | ||
+ | <tr><td>$0A</td><td><p>Mapa bitowa aktywnych napędów:</p> | ||
+ | <pre> | ||
+ | Nr bitu: 7 6 5 4 3 2 1 0 | ||
+ | Nr dysku: 8 7 6 5 4 3 2 1 | ||
+ | </pre> | ||
+ | <p>Bit ustawiony oznacza napęd aktywny.</p> | ||
+ | </td></tr> | ||
+ | <tr><td>$0B</td><td><p>Znaczenie nieznane, wartość $00.</p></td></tr> | ||
+ | <tr><td>$0C-$0D</td><td><p>Adres bazowy buforów DOS-u.</p></td></tr> | ||
+ | <tr><td>$0E-$0F</td><td><p>Data zapisu DOS-u na dysk, format taki sam jak w katalogu (patrz niżej).</p></td></tr> | ||
+ | </table> | ||
+ | |||
+ | === Informacja o dysku === | ||
+ | |||
+ | <table border = 1 cellpadding = 5> | ||
+ | <tr><td><b>Offset</b></td><td><b>Opis</b></td></tr> | ||
+ | <tr><td>$10-$15</td><td> | ||
+ | <p>Kod zastosowanej gęstości (czy też typu dysku) w postaci ciągu ASCII. Ciąg ten ma do sześciu znaków, jeśli jest ich mniej, dopełniony jest zerami. Dla kopii DOS-u rozdystrybuowanych przez Atari kody te są następujące:</p> | ||
+ | * AT810 - gęstość pojedyńcza ([[SD]]) | ||
+ | * AT1050 - gęstość średnia ([[ED]]) | ||
+ | * XF551 - gęstość podwójna dwustronna ([[DSDD]]) | ||
+ | * 130RAM - ramdysk | ||
+ | * SSDD - gęstość podwójna ([[DD]]) | ||
+ | <p>DOS XE może obsłużyć do ośmiu takich typów dysków. Tablice z danymi dla poszczególnych typów znajdują się w obszarze $D800-$D8FF, na każdy typ przypadają po 32 bajty. Przy dodawaniu nowego typu, dane o nim należy wpisać pod odpowiedni adres (tzn. w pierwsze wolne miejsce), a następnie zapisać DOS XE na dysk. Tablica danych o danym typie dysku kopiowana jest do bajtów $10-$2F bootsektora podczas zapisu katalogu na nowo sformatowanym nośniku danego typu. Jeśli typ dysku nie odpowiada żadnemu z typów znanych przez DOS XE, próba dostępu powoduje błąd.</p> | ||
+ | </td></tr> | ||
+ | <tr><td>$16</td><td><p>Liczba stron pamięci przeznaczonych na bufor [[VTOC]].</p></td></tr> | ||
+ | <tr><td>$17</td><td><p>Znaczenie bajtu nieznane, wartość $01. Być może jest to liczba klastrów przypadających na jeden bit VTOC. Zwiększenie wartości powoduje zmniejszenie wielkości VTOC, ale zapis na tak sformatowany dysk się nie udaje.</p></td></tr> | ||
+ | <tr><td>$18-$19</td><td><p>Całkowita liczba klastrów na dyskietce.</p></td></tr> | ||
+ | <tr><td>$1A-$1B</td><td><p>Maksymalna (początkowa) liczba wolnych klastrów na dyskietce.</p></td></tr> | ||
+ | <tr><td>$1C</td><td><p>Wartość pierwszego bajtu mapy bitowej VTOC, używana przy tworzeniu VTOC po sformatowaniu dysku.</p></td></tr> | ||
+ | <tr><td>$1D</td><td><p>Numer pierwszego klastra katalogu głównego.</p></td></tr> | ||
+ | <tr><td>$1E-$1F</td><td><p>Adres procedury SIO obsługującej transmisję sektorów dla danego dysku:</p> | ||
+ | * $0D5D - standardowa procedura OS-u (ta z ROM-u). Używają jej urządzenia [[PBI]]. | ||
+ | * $0FE5 - szybkie SIO DOS-u XE. | ||
+ | * $DF32 - SIO dla sektorów 128-bajtowych (używa tylko procedur SIO znajdujących się w ROM-ie). | ||
+ | * $13F7 - SIO dla ramdysków. | ||
+ | </td></tr> | ||
+ | <tr><td>$20-$21</td><td><p>Adres procedury SIO obsługującej transmisję wszystkiego poza transmisją sektorów dla danego dysku:</p> | ||
+ | * $0D5D - procedura dla wszystkich urządzeń poza ramdyskami. | ||
+ | * $1445 - procedura dla ramdysków. | ||
+ | </td></tr> | ||
+ | <tr><td>$22</td><td><p>Komenda SIO odczytu sektora, $52 ("R") dla standardu, lub $D2 ("R" w [[inverse video|inwersji]]) dla trybu przyspieszonej transmisji [[XF551]].</p></td></tr> | ||
+ | <tr><td>$23</td><td><p>Komenda SIO zapisu sektora, $57 ("W") dla standardu, lub $D7 ("W" w inwersji) dla trybu przyspieszonej transmisji [[XF551]]. Można zmienić na "P" (albo "P" w inwersji).</p></td></tr> | ||
+ | <tr><td>$24</td><td><p>Wartość rejestru AUDF3/4 układu [[Pokey]] wybierająca szybkość przesyłania komend. Dla transmisji standardowej jest tu zero, dla przyspieszonej $28 (= 19200 bps).</p></td></tr> | ||
+ | <tr><td>$25</td><td><p>Wartość rejestru AUDF3/4 układu [[Pokey]] wybierająca szybkość przesyłania danych. Dla transmisji standardowej jest tu zero, dla przyspieszonej $10 (= 38400 bps).</p></td></tr> | ||
+ | <tr><td>$26</td><td><p>Komenda SIO formatowania w gęstości, w jakiej aktualnie jest dyskietka: $21 ("!") dla przeplotu standardowego, $A1 ("!" w inwersji) dla przeplotu turbo [[XF551]]. Odpowiednio $22 dla gęstości [[ED]]. Jeśli dysk nie wymaga fizycznego formatowania (bo jest np. ramdyskiem), jest tu $00.</p></td></tr> | ||
+ | <tr><td>$27</td><td><p>Wartość timeout dla formatowania.</p></td></tr> | ||
+ | <tr><td>$28-$2F</td><td><p>[[SIO#Blok_PERCOM|Blok PERCOM]] dla tej gęstości, pierwsze 8 bajtów.</p></td></tr> | ||
+ | </table> | ||
+ | |||
+ | Ważne jest, że - inaczej niż np. w [[format SpartaDOS|formacie SpartaDOS-u]] - zawartość bootsektora nie jest zmieniana przy normalnej pracy z filesystemem, wszystkie tego typu zmienne przechowuje VTOC. | ||
== VTOC == | == VTOC == | ||
- | VTOC znajduje się w jednostce alokacji nr 4 (sektor fizyczny nr 4 w [[DD]], albo sektory 8-9 w [[SD]] i [[ED]]). Pierwsze 10 bajtów zajmuje informacja o dysku zorganizowana następująco: | + | [[VTOC]] zaczyna się w klastrze nr 4 (sektor fizyczny nr 4 w [[DD]], albo sektory 8-9 w [[SD]] i [[ED]]) i zajmuje tyle miejsca ile potrzeba dla zmapowania całego dysku. Pierwsze 10 bajtów zajmuje informacja o dysku zorganizowana następująco: |
<table border = 1 cellpadding = 5> | <table border = 1 cellpadding = 5> | ||
<tr><td><b>Offset</b></td><td><b>Opis</b></td></tr> | <tr><td><b>Offset</b></td><td><b>Opis</b></td></tr> | ||
- | <tr><td>$00-$01</td><td>Wartość $0101. Prawdopodobnie znacznik formatu.</td></tr> | + | <tr><td>$00</td><td>Liczba klastrów zajmowanych przez VTOC.</td></tr> |
- | <tr><td>$02-$03</td><td>Całkowita liczba jednostek alokacji na dysku, zwiększona o 1.</td></tr> | + | <tr><td>$01</td><td>To samo, co w bajcie $17 bootsektora (początkowo $01)</td></tr> |
- | <tr><td>$04-$05</td><td>Aktualna liczba wolnych jednostek alokacji na dysku.</td></tr> | + | <tr><td>$02-$03</td><td>Całkowita liczba klastrów na dysku, zwiększona o 1.</td></tr> |
- | <tr><td>$06-$07</td><td>Liczba plików i podkatalogów na dysku (czyli numer sekwencyjny dysku, zwiększany o 1 za kazdym razem, gdy tworzony jest plik lub katalog).</td></tr> | + | <tr><td>$04-$05</td><td>Aktualna liczba wolnych klastrów na dysku.</td></tr> |
- | <tr><td>$0A-$0B</td><td>Numer losowy dysku.</td></tr> | + | <tr><td>$06-$07</td><td>Liczba plików i podkatalogów na dysku (czyli numer sekwencyjny dysku, zwiększany o 1 za kazdym razem, gdy tworzony jest plik lub katalog). Początkowo $0000.</td></tr> |
+ | <tr><td>$08-$09</td><td>Numer losowy dysku.</td></tr> | ||
</table> | </table> | ||
Numer sekwencyjny i losowy w połączeniu z innymi danymi pozwala DOS-owi stwierdzić, kiedy dyskietka w stacji została wymieniona. | Numer sekwencyjny i losowy w połączeniu z innymi danymi pozwala DOS-owi stwierdzić, kiedy dyskietka w stacji została wymieniona. | ||
- | Dalszą część VTOC zajmuje mapa bitowa całego dysku, w której bit ustawiony oznacza jednostkę alokacji wolną, a bit skasowany - zajętą. Bit 7 każdego bajtu mapy oznacza jednostkę o niższym numerze, kolejne bity przyporządkowane sa do jednostek alokacji o kolejno rosnących numerach. Zerowa jednostka alokacji jest w mapie pominięta, a zatem bit 7 pierwszego bajtu mapy bitowej (bajtu nr $0A VTOC) ma przyporządkowaną jednostkę alokacji nr 1, bit 6 - nr 2, bit 5 nr 3 itd. | + | === Mapa bitowa === |
- | Początkowo pierwszą wolną jednostką alokacji dysku jest jednostka nr 6 - pierwszy bajt mapy bitowej ma wartość %00000111 (jednostki 1-5 zajęte, 6-8 wolne). | + | Dalszą część VTOC zajmuje mapa bitowa całego dysku, w której bit ustawiony oznacza klaster wolny, a bit skasowany - zajęty. Bit 7 każdego bajtu mapy oznacza klaster o niższym numerze, kolejne bity przyporządkowane sa do klastrów o kolejno rosnących numerach. Zerowy klaster jest w mapie pominięty, a zatem bit 7 pierwszego bajtu mapy bitowej (bajtu nr $0A VTOC) ma przyporządkowany klaster nr 1, bit 6 - nr 2, bit 5 nr 3 itd. |
- | === Katalog === | + | Początkowo pierwszym wolnym klastrem dysku jest klaster nr 6 - pierwszy bajt mapy bitowej ma wartość %00000111 (jednostki 1-5 zajęte, 6-8 wolne). DOS XE kopiuje tę wartość z bajtu $1C bootsektora. |
- | Katalog główny zaczyna się bezpośrednio za VTOC i początkowo zajmuje tylko jedną jednostkę alokacji (nr 5). | + | ''DOS XE nie jest w stanie utworzyć VTOC, jeśli dysk zawiera ponad 8112 sektorów: w tej sytuacji pierwszy bajt VTOC będzie miał wartość $00 (4 pełne sektory VTOC), a następny powinien być różny od $FF. Wewnętrzne procedury DOS-u XE nie są w stanie sprostać tej sytuacji.'' |
- | Pojedyńczy wpis katalogowy ma długość 49 bajtów (!) i jest zorganizowany jak następuje: | + | == Katalogi == |
+ | |||
+ | Katalog główny zaczyna się bezpośrednio za VTOC i początkowo zajmuje tylko jeden klaster, którego numer jest w bajcie $1D bootsektora. | ||
+ | |||
+ | Pojedynczy wpis katalogowy ma długość 49 bajtów (!) i jest zorganizowany jak następuje: | ||
<table border = 1 cellpadding = 5> | <table border = 1 cellpadding = 5> | ||
Linia 39: | Linia 114: | ||
<p>Bajt statusu:</p> | <p>Bajt statusu:</p> | ||
* bit 7 = 1 - plik skasowany; | * bit 7 = 1 - plik skasowany; | ||
- | * bit 6 = 1 - plik istnieje; stany bitów 6 i 7 sa zawsze przeciwne | + | * bit 6 = 1 - plik istnieje; w plikach zamkniętych bity 6 i 7 mają zawsze przeciwne stany |
* bit 5 - niewykorzystany | * bit 5 - niewykorzystany | ||
* bit 4 - niewykorzystany | * bit 4 - niewykorzystany | ||
* bit 3 - niewykorzystany | * bit 3 - niewykorzystany | ||
- | * bit 2 = 1 - plik jest otwarty do zapisu | + | * bit 2 = 1 - plik jest otwarty do zapisu; jednocześnie ustawiane są na 1 bity 7 i 6 |
* bit 1 = 1 - plik jest zabezpieczony | * bit 1 = 1 - plik jest zabezpieczony | ||
* bit 0 = 1 - plik jest podkatalogiem | * bit 0 = 1 - plik jest podkatalogiem | ||
Linia 50: | Linia 125: | ||
</td></tr> | </td></tr> | ||
<tr><td>$09-$0B</td><td><p>Rozszerzenie nazwy pliku dopełnione spacjami.</p></td></tr> | <tr><td>$09-$0B</td><td><p>Rozszerzenie nazwy pliku dopełnione spacjami.</p></td></tr> | ||
- | <tr><td>$0C-$0E</td><td><p>Wielkość pliku w bajtach.</p> | + | <tr><td>$0C-$0D</td><td><p>Liczba klastrów danych zajmowanych przez plik. Dla katalogu zawsze $0000.</p> |
</td></tr> | </td></tr> | ||
- | <tr><td>$0F-$10</td><td><p>Numer piku.</p></td></tr> | + | <tr><td>$0E</td><td><p>Liczba bajtów danych w ostatnim klastrze pliku. Dla katalogu zawsze $00.</p></td></tr> |
+ | <tr><td>$0F-$10</td><td><p>Numer pliku lub katalogu. Jest to numer kolejny pliku (lub katalogu) zakładanego w ogóle na dysku, a nie tylko w konkretnym katalogu.</p></td></tr> | ||
<tr><td>$11-$12</td><td><p>Numer losowy dysku (ten sam, co we VTOC).</p></td></tr> | <tr><td>$11-$12</td><td><p>Numer losowy dysku (ten sam, co we VTOC).</p></td></tr> | ||
- | <tr><td>$13-$14</td><td><p>Numer jednostki alokacji, od której zaczyna się mapa pliku.</p></td></tr> | + | <tr><td>$13-$14</td><td> |
- | <tr><td>$15-$2A</td><td><p>22 bajty o nieustalonym znaczeniu (same zera), być może rezerwa na przyszłość.</p></td></tr> | + | * Katalog: numer pierwszego klastra danych katalogu; |
- | <tr><td>$2B-$2C</td><td><p>Data utworzenia pliku. Zapisane są kolejno rok, miesiąc i dzień niezgodnie z granicami bajtów:</p> | + | * Plik: numer pierwszego klastra mapy pliku. |
+ | </td></tr> | ||
+ | <tr><td>$15-$2A</td><td> | ||
+ | * Katalog: 22 zera. | ||
+ | * Plik: numery kolejnych jedenastu klastrów mapy pliku, po dwa bajty na numer. | ||
+ | </td></tr> | ||
+ | <tr><td>$2B-$2C</td><td><p>Data utworzenia pliku. Zapisane są kolejno dzień, miesiąc i rok niezgodnie z granicami bajtów:</p> | ||
* bity 0-4 - dzień miesiąca | * bity 0-4 - dzień miesiąca | ||
* bity 5-8 - miesiąc ($01 - styczeń itd.) | * bity 5-8 - miesiąc ($01 - styczeń itd.) | ||
* bity 9-15 - rok odjąć 1900. | * bity 9-15 - rok odjąć 1900. | ||
+ | <pre> | ||
+ | +---------------+---------------+ | ||
+ | | Bajt $2B | Bajt $2C | | ||
+ | +---------------+---------------+ | ||
+ | |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0| | ||
+ | +-------------+-+-----+---------+ | ||
+ | | rok - 1900 |miesiąc| dzień | | ||
+ | +-------------+-------+---------+ | ||
+ | </pre> | ||
+ | <p>Np. $C13D = 1100-0001-0011-1101 = 1100000|1001|11101 = $60|$09|$1D = 96-09-29 (29 września 1996)</p> | ||
</td></tr> | </td></tr> | ||
<tr><td>$2D-$2E</td><td><p>Data modyfikacji pliku, w takim samym formacie jak powyżej.</p></td></tr> | <tr><td>$2D-$2E</td><td><p>Data modyfikacji pliku, w takim samym formacie jak powyżej.</p></td></tr> | ||
- | <tr><td>$2F-$30</td><td><p>Dwa bajty o nieznanym znaczeniu (oba wyzerowane).</p></td></tr> | + | <tr><td>$2F-$30</td><td><p>Dwa bajty zarezerwowane (oba wyzerowane).</p></td></tr> |
</table> | </table> | ||
- | W jednej jednostce alokacji znajduje się zawsze ich całkowita liczba, czyli maximum pięć. | + | Każdy nowo założony plik dostaje status $C4. Po zamknięciu pliku DOS kasuje bity 7 i 2. |
- | DOS 4.0 nie pozwala założyć na dyskietce pliku o zerowej długości. Każdy nowo założony plik dostaje status $81. Po zamknięciu pliku DOS kasuje bit 0, jednak jeśli do pliku nie wpisano żadnych danych, status będzie miał wartość $80, co oznacza plik skasowany. Dopiero wpisanie co najmniej jednego bajtu powoduje, że funkcja CLOSE zmienia status zbioru na $40 (plik istnieje). | + | === Klastry katalogu === |
- | === Mapa alokacji plików === | + | W jednym klastrze znajduje się zawsze całkowita liczba wpisów katalogu, czyli maximum pięć. Jeśli katalog ma więcej wpisów, szósty wpis w całości jest w następnym klastrze tego katalogu itd. |
- | Mapa alokacji plików zajmuje, jako się rzekło, ostatni sektor 59 jednostki alokacji, o znajomym skądinąd numerze 360, czyli $0168. Pierwsze osiem bajtów tego sektora zajęte jest przez system: | + | Bajty $F5-$F7 klastra katalogu są nieużywane, a ostatnie 8 bajtów ($F8-$FF) zawiera informacje o katalogu: |
<table border = 1 cellpadding = 5> | <table border = 1 cellpadding = 5> | ||
- | <tr><td><b>Offset</b></td><td><b>Znaczenie</b></td></tr> | + | <tr><td><b>Offset</b></td><td><b>Opis</b></td></tr> |
- | <tr><td>$00</td><td><p>Znacznik formatu:</p> | + | <tr><td>$F8-$F9</td><td> |
- | * $52 ("R") dla dyskietek jednostronnych | + | <p>Numer następnego klastra zajętego przez ten katalog ($0000 w ostatnim).</p></td></tr> |
- | * $43 ("C") dla dyskietek dwustronnych | + | <tr><td>$FA-$FB</td><td><p>Numer pliku - $0000 dla katalogu głównego.</p></td></tr> |
- | </td></tr> | + | <tr><td>$FC-$FD</td><td><p>Numer losowy dysku (ten sam co we VTOC).</p></td></tr> |
- | <tr><td>$01</td><td>Offset wewnątrz mapy alokacji plików wskazujący pierwszą pozycję, gdzie zaczyna się wolny obszar. Jeśli na dyskietce nie ma wolnych jednostek alokacji, oba te bajty są wyzerowane.</td></tr> | + | <tr><td>$FE</td><td><p>Numer kolejny klastra katalogu (począwszy od $00).</p></td></tr> |
- | <tr><td>$02</td><td>Znaczenie nieustalone, być może rezerwa na przyszłość.</td></tr> | + | <tr><td>$FF</td><td><p>Typ klastra ($FF - katalog).</p></td></tr> |
- | <tr><td>$03</td><td>Liczba wolnych jednostek alokacji na dyskietce.</td></tr> | + | |
- | <tr><td>$04-$07</td><td>Znaczenie nieustalone, być może rezerwa na przyszłość.</td></tr> | + | |
</table> | </table> | ||
- | Pozostałą część mapy alokacji plików zajmuje właściwa mapa dyskietki. Pierwszy jej wpis to bajt nr 8 (licząc od zera) sektora 360, oznacza on jednostkę alokacji nr 1, czyli sektory 1-6. Następny bajt symbolizuje jednostkę alokacji nr 2 (sektory 7-12), kolejny jednostkę alokacji nr 3 (sektory 13-18) itd. aż do bajtu 127, do którego przypisana jest jednostka alokacji nr 120, czyli sektory 714-720. | + | == Pliki == |
- | Wartości poszczególnych bajtów mogą być następujące: | + | === Mapa pliku === |
- | * $00-$05: koniec pliku | + | Mapa pliku składa się z klastrów, których lista znajduje się w bajtach $13-$2A wpisu w katalogu. Pierwszych 250 bajtów przeznaczonych jest na 125 numerów klastrów, w których znajdują się dane pliku. Ostatnie sześć bajtów zawiera dodatkowe informacje: |
- | * każdy inny: numer następnej jednostki alokacji zwiększony o 7 | + | |
- | Jeśli bajt 3 wpisu pliku w katalogu ma wartość 8, to znaczy, że wskazuje on tym samym, iż informacji o początku pliku trzeba szukać w ósmym bajcie mapy alokacji plików. Jak objaśniono powyżej, bajt ten oznacza jednostkę alokacji nr 1, a więc jest to pierwsza jednostka alokacji wypełniona danymi tego pliku. | + | <table border = 1 cellpadding = 5> |
+ | <tr><td><b>Offset</b></td><td><b>Opis</b></td></tr> | ||
+ | <tr><td>$FA-$FB</td><td><p>Numer pliku.</p></td></tr> | ||
+ | <tr><td>$FC-$FD</td><td><p>Numer losowy dysku (ten sam co we VTOC).</p></td></tr> | ||
+ | <tr><td>$FE</td><td><p>Numer kolejny klastra mapy (począwszy od $00).</p></td></tr> | ||
+ | <tr><td>$FF</td><td><p>Typ klastra (od $80 do $FE - mapa pliku).</p></td></tr> | ||
+ | </table> | ||
- | Jeśli plik zajmuje ponad jedną jednostkę alokacji, to odpowiedni bajt mapy zawiera numer bajtu w tejże mapie, który symbolizuje następną jednostkę alokacji zajętą przez plik. Inaczej mówiąc, jeśli plik zajmuje jednostki alokacji 1, 2, 3 (i dalsze), to wartości bajtów 8 i 9 mapy alokacji plików będą wynosić odpowiednio 9 i 10, a jeśli czwartą zajętą jednostką alokacji jest jednostka nr 50, to bajt 10 mapy będzie zawierał wartość 57 (numer następnej jednostki alokacji plus 7). Krótko mówiąc, każdy wpis mapy dotyczący danego pliku wskazuje na kolejny wpis mapy dotyczący tego samego pliku. | + | Na listę klastrów mapy przeznaczono w katalogu 24 bajty miejsca. Ponieważ numer klastra ma 16 bitów, zatem mapa pliku może zająć maksymalnie 12 klastrów. 12 klastrów mapy po 125 wpisów klastrów danych po 250 bajtów daje nam w efekcie ograniczenie maksymalnej wielkości pliku na dysku do 1500 klastrów, czyli 375000 bajtów (366,2k). |
- | Koniec pliku jest w mapie alokacji plików zaznaczony wartością od $00 do $05. Liczba ta oznacza, który sektor danej jednostki alokacji jest jako ostatni wypełniony danymi. W połączeniu z informacją z katalogu, która mówi, ile bajtów zawiera ostatni sektor pliku, pozwala to na dokładne określenie długości pliku. | + | === Klastry danych === |
- | Wolny obszar dyskietki jest w mapie reprezentowany tak samo jak pliki: wskaźnikiem do niego są bajty 1 i 2 mapy alokacji plików, a tam każdy kolejny wpis w mapie wskazuje na następny wpis mapy oznaczający wolną jednostkę alokacji. Dzięki temu DOS nie musi przeznaczać specjalnego kodu do wpisania do mapy, jeśli któraś jednostka alokacji jest zarezerwowana i nie powinna być zajęta przez pliki (np. VTOC), wystarczy, że takowa jest pominięta na liście wolnych jednostek. | + | W każdym klastrze danych najwyżej 250 bajtów jest wypełnione danymi. Końcówka, podobnie jak w przypadku katalogów i map, zawiera informacje: |
- | == Przykład == | + | <table border = 1 cellpadding = 5> |
- | + | <tr><td><b>Offset</b></td><td><b>Opis</b></td></tr> | |
- | * wpis katalogowy pliku QDOS.SYS jest natępujący: | + | <tr><td>$FA-$FB</td><td><p>Numer pliku.</p></td></tr> |
- | + | <tr><td>$FC-$FD</td><td><p>Numer losowy dysku (ten sam co we VTOC).</p></td></tr> | |
- | $40 $06 $7A $08 $00 QDOS____SYS | + | <tr><td>$FE-$FF</td><td><p>Numer kolejny klastra pliku (począwszy od $0000).</p></td></tr> |
- | + | </table> | |
- | Status $40 oznacza, że plik istnieje; zajmuje 6 jednostek alokacji, czyli 36 sektorów (i taką własnie długość ujrzymy w katalogu, bo DOS przelicza wszystko na sektory 128-bajtowe). Ostatni sektor zawiera 123 bajty danych (offset ostatniego bajtu $7A, czyli 122), a dane o rozmieszczeniu pliku zaczynają się w bajcie ósmym ($08) mapy alokacji plików. | + | |
- | + | ||
- | * mapa od bajtu nr 8 zawiera co następuje: | + | |
- | Offsety: $08 $09 $0A $0B $0C $0D | + | Maksymalny ''numer kolejny klastra pliku'' to 32767 ($7FFF), a więc starszy bajt tej liczby jest zawsze dodatni, przez co jednocześnie stanowi znacznik typu klastra (<= $7F - klaster danych). |
- | Wartości: $09 $0A $0B $0C $0D $03 | + | |
- | Offset bajtu to numer jednostki alokacji zwiększony o 7, a więc plik zajmuje jednostki alokacji od 1 do 6, czyli sektory od 1 do 36. Jednostka alokacji nr 6 jest niepełna, zajęte są w niej tylko 4 sektory, a w ostatnim z nich, co wiemy z katalogu, są 123 bajty danych. | + | == Uwagi == |
- | Struktura mapy alokacji plików w DOS 4.0, jak widać, przypomina nieco pecetowy FAT. | + | Osobliwością filesystemu są dwie różne metody zapewnienia ciągłości danych w zależności od tego, czy zbiór jest plikiem, czy podkatalogiem: w przypadku pliku używa się map klastrów, natomiast klastry katalogu wskazują na siebie bezpośrednio, bez użycia map. Ta dwoistość jest być może reliktem [[Format_OS/A_Plus_4|filesystemu OS/A+ v.4.1]] i wskazywać na to, że system plików [[OS/A Plus|OS/A+ v.4.1]] może być dalekim praszczurem systemu plików [[DOS XE]]. |
== Zobacz też == | == Zobacz też == |
Aktualna wersja
Format dyskietki zastosowany w DOS XE, przeznaczony głównie dla stacji dysków XF551, ale też 810 i 1050.
Spis treści |
Cechy ogólne
- Dopuszczalne wielkości sektorów: 128 i 256 bajtów
- Maksymalna pojemność filesystemu: 65535 klastrów (15,62 MB)
- Maksymalna wielkość pliku: 375000 bajtów (366,21 kB)
- Maksymalna liczba plików na dysku: 65536
- Struktura katalogowa: hierarchiczna
- Maksymalna liczba plików w katalogu: 1280
- Wielkość wpisu w katalogu: 49 bajtów
- Nazwa pliku: 8+3
- Metoda linkowania plików: indywidualne mapy plików
- Metoda alokacji sektorów: mapa bitowa
Jednostka alokacji
Jednostkę alokacji stanowi "klaster" o wielkości 256 bajtów, czyli dwa sektory fizyczne w SD i ED, a jeden w DD. Przełożenie sektorów fizycznych na klastry jest dość osobliwe, liczy się bowiem w nim nieistniejący sektor nr 0. I tak, w DD sektor nr 0 stanowi klaster nr 0, sektor nr 1 - klaster nr 1 itd. W SD i ED klaster nr 0 stanowią sektory 0 i 1, klaster nr 1 - sektory 2 i 3, klaster nr 2 - sektory 4 i 5, i tak dalej.
Boot
Pierwsze trzy sektory (fizyczne) dysku zajmuje program ładujący DOS. Oprócz tego w bajtach $09-$0F sektora (nie klastra) nr 1 zapisana jest konfiguracja DOS-u, a w bajtach $10-$2F - informacje o dysku.
Konfiguracja DOS
Offset | Opis |
$09 | Liczba określająca, ile plików można otworzyć jednocześnie. Standardowo 3, maksymalnie 7. |
$0A | Mapa bitowa aktywnych napędów: Nr bitu: 7 6 5 4 3 2 1 0 Nr dysku: 8 7 6 5 4 3 2 1 Bit ustawiony oznacza napęd aktywny. |
$0B | Znaczenie nieznane, wartość $00. |
$0C-$0D | Adres bazowy buforów DOS-u. |
$0E-$0F | Data zapisu DOS-u na dysk, format taki sam jak w katalogu (patrz niżej). |
Informacja o dysku
Offset | Opis |
$10-$15 |
Kod zastosowanej gęstości (czy też typu dysku) w postaci ciągu ASCII. Ciąg ten ma do sześciu znaków, jeśli jest ich mniej, dopełniony jest zerami. Dla kopii DOS-u rozdystrybuowanych przez Atari kody te są następujące:
DOS XE może obsłużyć do ośmiu takich typów dysków. Tablice z danymi dla poszczególnych typów znajdują się w obszarze $D800-$D8FF, na każdy typ przypadają po 32 bajty. Przy dodawaniu nowego typu, dane o nim należy wpisać pod odpowiedni adres (tzn. w pierwsze wolne miejsce), a następnie zapisać DOS XE na dysk. Tablica danych o danym typie dysku kopiowana jest do bajtów $10-$2F bootsektora podczas zapisu katalogu na nowo sformatowanym nośniku danego typu. Jeśli typ dysku nie odpowiada żadnemu z typów znanych przez DOS XE, próba dostępu powoduje błąd. |
$16 | Liczba stron pamięci przeznaczonych na bufor VTOC. |
$17 | Znaczenie bajtu nieznane, wartość $01. Być może jest to liczba klastrów przypadających na jeden bit VTOC. Zwiększenie wartości powoduje zmniejszenie wielkości VTOC, ale zapis na tak sformatowany dysk się nie udaje. |
$18-$19 | Całkowita liczba klastrów na dyskietce. |
$1A-$1B | Maksymalna (początkowa) liczba wolnych klastrów na dyskietce. |
$1C | Wartość pierwszego bajtu mapy bitowej VTOC, używana przy tworzeniu VTOC po sformatowaniu dysku. |
$1D | Numer pierwszego klastra katalogu głównego. |
$1E-$1F | Adres procedury SIO obsługującej transmisję sektorów dla danego dysku:
|
$20-$21 | Adres procedury SIO obsługującej transmisję wszystkiego poza transmisją sektorów dla danego dysku:
|
$22 | Komenda SIO odczytu sektora, $52 ("R") dla standardu, lub $D2 ("R" w inwersji) dla trybu przyspieszonej transmisji XF551. |
$23 | Komenda SIO zapisu sektora, $57 ("W") dla standardu, lub $D7 ("W" w inwersji) dla trybu przyspieszonej transmisji XF551. Można zmienić na "P" (albo "P" w inwersji). |
$24 | Wartość rejestru AUDF3/4 układu Pokey wybierająca szybkość przesyłania komend. Dla transmisji standardowej jest tu zero, dla przyspieszonej $28 (= 19200 bps). |
$25 | Wartość rejestru AUDF3/4 układu Pokey wybierająca szybkość przesyłania danych. Dla transmisji standardowej jest tu zero, dla przyspieszonej $10 (= 38400 bps). |
$26 | Komenda SIO formatowania w gęstości, w jakiej aktualnie jest dyskietka: $21 ("!") dla przeplotu standardowego, $A1 ("!" w inwersji) dla przeplotu turbo XF551. Odpowiednio $22 dla gęstości ED. Jeśli dysk nie wymaga fizycznego formatowania (bo jest np. ramdyskiem), jest tu $00. |
$27 | Wartość timeout dla formatowania. |
$28-$2F | Blok PERCOM dla tej gęstości, pierwsze 8 bajtów. |
Ważne jest, że - inaczej niż np. w formacie SpartaDOS-u - zawartość bootsektora nie jest zmieniana przy normalnej pracy z filesystemem, wszystkie tego typu zmienne przechowuje VTOC.
VTOC
VTOC zaczyna się w klastrze nr 4 (sektor fizyczny nr 4 w DD, albo sektory 8-9 w SD i ED) i zajmuje tyle miejsca ile potrzeba dla zmapowania całego dysku. Pierwsze 10 bajtów zajmuje informacja o dysku zorganizowana następująco:
Offset | Opis |
$00 | Liczba klastrów zajmowanych przez VTOC. |
$01 | To samo, co w bajcie $17 bootsektora (początkowo $01) |
$02-$03 | Całkowita liczba klastrów na dysku, zwiększona o 1. |
$04-$05 | Aktualna liczba wolnych klastrów na dysku. |
$06-$07 | Liczba plików i podkatalogów na dysku (czyli numer sekwencyjny dysku, zwiększany o 1 za kazdym razem, gdy tworzony jest plik lub katalog). Początkowo $0000. |
$08-$09 | Numer losowy dysku. |
Numer sekwencyjny i losowy w połączeniu z innymi danymi pozwala DOS-owi stwierdzić, kiedy dyskietka w stacji została wymieniona.
Mapa bitowa
Dalszą część VTOC zajmuje mapa bitowa całego dysku, w której bit ustawiony oznacza klaster wolny, a bit skasowany - zajęty. Bit 7 każdego bajtu mapy oznacza klaster o niższym numerze, kolejne bity przyporządkowane sa do klastrów o kolejno rosnących numerach. Zerowy klaster jest w mapie pominięty, a zatem bit 7 pierwszego bajtu mapy bitowej (bajtu nr $0A VTOC) ma przyporządkowany klaster nr 1, bit 6 - nr 2, bit 5 nr 3 itd.
Początkowo pierwszym wolnym klastrem dysku jest klaster nr 6 - pierwszy bajt mapy bitowej ma wartość %00000111 (jednostki 1-5 zajęte, 6-8 wolne). DOS XE kopiuje tę wartość z bajtu $1C bootsektora.
DOS XE nie jest w stanie utworzyć VTOC, jeśli dysk zawiera ponad 8112 sektorów: w tej sytuacji pierwszy bajt VTOC będzie miał wartość $00 (4 pełne sektory VTOC), a następny powinien być różny od $FF. Wewnętrzne procedury DOS-u XE nie są w stanie sprostać tej sytuacji.
Katalogi
Katalog główny zaczyna się bezpośrednio za VTOC i początkowo zajmuje tylko jeden klaster, którego numer jest w bajcie $1D bootsektora.
Pojedynczy wpis katalogowy ma długość 49 bajtów (!) i jest zorganizowany jak następuje:
Offset | Opis |
$00 |
Bajt statusu:
|
$01-$08 | Nazwa pliku dopełniona spacjami. |
$09-$0B | Rozszerzenie nazwy pliku dopełnione spacjami. |
$0C-$0D | Liczba klastrów danych zajmowanych przez plik. Dla katalogu zawsze $0000. |
$0E | Liczba bajtów danych w ostatnim klastrze pliku. Dla katalogu zawsze $00. |
$0F-$10 | Numer pliku lub katalogu. Jest to numer kolejny pliku (lub katalogu) zakładanego w ogóle na dysku, a nie tylko w konkretnym katalogu. |
$11-$12 | Numer losowy dysku (ten sam, co we VTOC). |
$13-$14 |
|
$15-$2A |
|
$2B-$2C | Data utworzenia pliku. Zapisane są kolejno dzień, miesiąc i rok niezgodnie z granicami bajtów:
+---------------+---------------+ | Bajt $2B | Bajt $2C | +---------------+---------------+ |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0| +-------------+-+-----+---------+ | rok - 1900 |miesiąc| dzień | +-------------+-------+---------+ Np. $C13D = 1100-0001-0011-1101 = 1100000|1001|11101 = $60|$09|$1D = 96-09-29 (29 września 1996) |
$2D-$2E | Data modyfikacji pliku, w takim samym formacie jak powyżej. |
$2F-$30 | Dwa bajty zarezerwowane (oba wyzerowane). |
Każdy nowo założony plik dostaje status $C4. Po zamknięciu pliku DOS kasuje bity 7 i 2.
Klastry katalogu
W jednym klastrze znajduje się zawsze całkowita liczba wpisów katalogu, czyli maximum pięć. Jeśli katalog ma więcej wpisów, szósty wpis w całości jest w następnym klastrze tego katalogu itd.
Bajty $F5-$F7 klastra katalogu są nieużywane, a ostatnie 8 bajtów ($F8-$FF) zawiera informacje o katalogu:
Offset | Opis |
$F8-$F9 |
Numer następnego klastra zajętego przez ten katalog ($0000 w ostatnim). |
$FA-$FB | Numer pliku - $0000 dla katalogu głównego. |
$FC-$FD | Numer losowy dysku (ten sam co we VTOC). |
$FE | Numer kolejny klastra katalogu (począwszy od $00). |
$FF | Typ klastra ($FF - katalog). |
Pliki
Mapa pliku
Mapa pliku składa się z klastrów, których lista znajduje się w bajtach $13-$2A wpisu w katalogu. Pierwszych 250 bajtów przeznaczonych jest na 125 numerów klastrów, w których znajdują się dane pliku. Ostatnie sześć bajtów zawiera dodatkowe informacje:
Offset | Opis |
$FA-$FB | Numer pliku. |
$FC-$FD | Numer losowy dysku (ten sam co we VTOC). |
$FE | Numer kolejny klastra mapy (począwszy od $00). |
$FF | Typ klastra (od $80 do $FE - mapa pliku). |
Na listę klastrów mapy przeznaczono w katalogu 24 bajty miejsca. Ponieważ numer klastra ma 16 bitów, zatem mapa pliku może zająć maksymalnie 12 klastrów. 12 klastrów mapy po 125 wpisów klastrów danych po 250 bajtów daje nam w efekcie ograniczenie maksymalnej wielkości pliku na dysku do 1500 klastrów, czyli 375000 bajtów (366,2k).
Klastry danych
W każdym klastrze danych najwyżej 250 bajtów jest wypełnione danymi. Końcówka, podobnie jak w przypadku katalogów i map, zawiera informacje:
Offset | Opis |
$FA-$FB | Numer pliku. |
$FC-$FD | Numer losowy dysku (ten sam co we VTOC). |
$FE-$FF | Numer kolejny klastra pliku (począwszy od $0000). |
Maksymalny numer kolejny klastra pliku to 32767 ($7FFF), a więc starszy bajt tej liczby jest zawsze dodatni, przez co jednocześnie stanowi znacznik typu klastra (<= $7F - klaster danych).
Uwagi
Osobliwością filesystemu są dwie różne metody zapewnienia ciągłości danych w zależności od tego, czy zbiór jest plikiem, czy podkatalogiem: w przypadku pliku używa się map klastrów, natomiast klastry katalogu wskazują na siebie bezpośrednio, bez użycia map. Ta dwoistość jest być może reliktem filesystemu OS/A+ v.4.1 i wskazywać na to, że system plików OS/A+ v.4.1 może być dalekim praszczurem systemu plików DOS XE.