Format AtariDOS XE

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 11:38, 29 wrz 2006
KMK (Dyskusja | wkład)

← Previous diff
Wersja z dnia 12:39, 29 wrz 2006
KMK (Dyskusja | wkład)

Next diff →
Linia 4: Linia 4:
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 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.
 +
 +== 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.
== VTOC == == VTOC ==
Linia 15: Linia 19:
<tr><td>$04-$05</td><td>Aktualna liczba wolnych jednostek alokacji na dysku.</td></tr> <tr><td>$04-$05</td><td>Aktualna liczba wolnych jednostek alokacji na 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).</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>$0A-$0B</td><td> </td></tr>+<tr><td>$0A-$0B</td><td>Numer losowy dysku.</td></tr>
</table> </table>
-W [[SD]] i [[DD]] VTOC znajduje się w 58 i 59 jednostce alokacji, czyli zajmuje sektory o numerach od 349 do 360 ($015D-$168). Z tego jedenaście pierwszych sektorów (349-359) zajmuje katalog dyskietki, ostatni zaś sektor przeznaczony jest na mapę alokacji plików.+Numer sekwencyjny i losowy w połączeniu z innymi danymi pozwala DOS-owi stwierdzić, kiedy dyskietka w stacji została wymieniona.
-W [[ED]] VTOC także zajmuje 2 jednostki alokacji, ale jest zorganizowany nieco inaczej oraz, przede wszystkim, umieszczony jest gdzie indziej, mianowicie w jednostkach alokacji 84 i 85 (sektory 504-515); z tego katalog zajmuje '''dziesięć''' pierwszych sektorów, natomiast mapa plików - dwa ostatnie.+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. Pierwsze dwie jednostki alokacji (nr 0 i 1) są w mapie pominięte, a zatem bit 7 pierwszego bajtu mapy bitowej (bajtu nr $0A VTOC) ma przyporządkowaną jednostkę alokacji nr 2, bit 6 - nr 3, bit 5 nr 4 itd.
-Ogólnie struktura VTOC jest bardzo podobna do tej, jaką widzimy w [[Format AtariDOS 3|formacie DOS 3.0]], podobna jest też zasada działania filesystemu, tylko realizacja jest inna.+Początkowo pierwszą wolną jednostką alokacji dysku jest jednostka nr 6 - pierwszy bajt mapy bitowej ma wartość $07.
=== Katalog === === Katalog ===
-Pojedyńczy wpis katalogowy zajmuje 16 bajtów. Ponieważ katalog zajmuje 10 lub 11 sektorów, na dyskietce można umieścić do 88 plików w [[SD]], 80 w [[ED]] lub 176 w [[DD]]. Strukturę wpisu katalogowego przedstawia tabelka:+Katalog główny zaczyna się bezpośrednio za VTOC i początkowo zajmuje tylko jedną jednostkę alokacji (nr 5).
 + 
 +Pojedyńczy 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 32: Linia 38:
<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 skasowany;
* bit 6 = 1 - plik istnieje; stany bitów 6 i 7 sa zawsze przeciwne * bit 6 = 1 - plik istnieje; stany bitów 6 i 7 sa zawsze przeciwne
-* bit 5 = 1 - plik jest zabezpieczony przed zapisem lub skasowaniem+* bit 5 - niewykorzystany
* bit 4 - niewykorzystany * bit 4 - niewykorzystany
* bit 3 - niewykorzystany * bit 3 - niewykorzystany
-* bit 2 - niewykorzystany+* bit 2 = 1 - plik jest otwarty do zapisu
-* bit 1 - niewykorzystany+* bit 1 = 1 - plik jest zabezpieczony
-* bit 0 = 1 - plik jest otwarty do zapisu+* bit 0 = 1 - plik jest podkatalogiem
</td></tr> </td></tr>
-<tr><td>$01</td><td>+<tr><td>$01-$08</td><td><p>Nazwa pliku dopełniona spacjami.</p>
-<p>Liczba jednostek alokacji, jaką zajmuje plik (max. 255, czyli 382,5k).</p>+
</td></tr> </td></tr>
-<tr><td>$02</td><td><p>Offset ostatniego bajtu danych znajdujących się w ostatnim sektorze ('''nie''' jednostce alokacji!) pliku.</p></td></tr>+<tr><td>$09-$0B</td><td><p>Rozszerzenie nazwy pliku dopełnione spacjami.</p></td></tr>
-<tr><td>$03</td><td>+<tr><td>$0C-$0E</td><td><p>Wielkość pliku w bajtach.</p>
-<p>Numer bajtu w mapie alokacji plików, od którego zaczyna się informacja o rozmieszczeniu pliku na dyskietce. Inaczej mówiąc, jest to numer pierwszej jednostki alokacji zajętej przez plik, zwiększony o siedem.</p>+
</td></tr> </td></tr>
-<tr><td>$04</td><td><p>Funkcja nieznana, być może bajt zarezerwowany na przyszłość.</p></td></tr>+<tr><td>$0F-$10</td><td><p>Numer piku.</p></td></tr>
-<tr><td>$05-$0C</td><td><p>Nazwa pliku dopełniona spacjami.</p></td></tr>+<tr><td>$11-$12</td><td><p>Numer losowy dysku (ten sam, co we VTOC).</p></td></tr>
-<tr><td>$0D-$0F</td><td><p>Rozszerzenie nazwy pliku dopełnione spacjami.</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>$15-$2A</td><td><p>22 bajty o nieustalonym znaczeniu (same zera), być może rezerwa na przyszłość.</p></td></tr>
 +<tr><td>$2B-$2C</td><td><p>Data utworzenia pliku. Zapisane są kolejno rok, miesiąc i dzień niezgodnie z granicami bajtów:</p>
 +* bity 0-4 - dzień miesiąca
 +* bity 5-8 - miesiąc ($01 - styczeń itd.)
 +* bity 9-15 - rok odjąć 1900.
 +</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>
</table> </table>
 +
 +W jednej jednostce alokacji znajduje się zawsze ich całkowita liczba, czyli maximum pięć.
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). 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).

Wersja z dnia 12:39, 29 wrz 2006

Format dyskietki zastosowany w AtariDOS XE, przeznaczony głównie dla stacji dysków XF551, ale też 810 i 1050.

Spis treści

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.

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.

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:

OffsetOpis
$00-$01Wartość $0101. Prawdopodobnie znacznik formatu.
$02-$03Całkowita liczba jednostek alokacji na dysku, zwiększona o 1.
$04-$05Aktualna liczba wolnych jednostek alokacji na dysku.
$06-$07Liczba plików i podkatalogów na dysku (czyli numer sekwencyjny dysku, zwiększany o 1 za kazdym razem, gdy tworzony jest plik lub katalog).
$0A-$0BNumer losowy dysku.

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. Pierwsze dwie jednostki alokacji (nr 0 i 1) są w mapie pominięte, a zatem bit 7 pierwszego bajtu mapy bitowej (bajtu nr $0A VTOC) ma przyporządkowaną jednostkę alokacji nr 2, bit 6 - nr 3, bit 5 nr 4 itd.

Początkowo pierwszą wolną jednostką alokacji dysku jest jednostka nr 6 - pierwszy bajt mapy bitowej ma wartość $07.

Katalog

Katalog główny zaczyna się bezpośrednio za VTOC i początkowo zajmuje tylko jedną jednostkę alokacji (nr 5).

Pojedyńczy wpis katalogowy ma długość 49 bajtów (!) i jest zorganizowany jak następuje:

OffsetOpis
$00

Bajt statusu:

  • bit 7 = 1 - plik skasowany;
  • bit 6 = 1 - plik istnieje; stany bitów 6 i 7 sa zawsze przeciwne
  • bit 5 - niewykorzystany
  • bit 4 - niewykorzystany
  • bit 3 - niewykorzystany
  • bit 2 = 1 - plik jest otwarty do zapisu
  • bit 1 = 1 - plik jest zabezpieczony
  • bit 0 = 1 - plik jest podkatalogiem
$01-$08

Nazwa pliku dopełniona spacjami.

$09-$0B

Rozszerzenie nazwy pliku dopełnione spacjami.

$0C-$0E

Wielkość pliku w bajtach.

$0F-$10

Numer piku.

$11-$12

Numer losowy dysku (ten sam, co we VTOC).

$13-$14

Numer jednostki alokacji, od której zaczyna się mapa pliku.

$15-$2A

22 bajty o nieustalonym znaczeniu (same zera), być może rezerwa na przyszłość.

$2B-$2C

Data utworzenia pliku. Zapisane są kolejno rok, miesiąc i dzień niezgodnie z granicami bajtów:

  • bity 0-4 - dzień miesiąca
  • bity 5-8 - miesiąc ($01 - styczeń itd.)
  • bity 9-15 - rok odjąć 1900.
$2D-$2E

Data modyfikacji pliku, w takim samym formacie jak powyżej.

$2F-$30

Dwa bajty o nieznanym znaczeniu (oba wyzerowane).

W jednej jednostce alokacji znajduje się zawsze ich całkowita liczba, czyli maximum pięć.

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).

Mapa alokacji plików

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:

OffsetZnaczenie
$00

Znacznik formatu:

  • $52 ("R") dla dyskietek jednostronnych
  • $43 ("C") dla dyskietek dwustronnych
$01Offset 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.
$02Znaczenie nieustalone, być może rezerwa na przyszłość.
$03Liczba wolnych jednostek alokacji na dyskietce.
$04-$07Znaczenie nieustalone, być może rezerwa na przyszłość.

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.

Wartości poszczególnych bajtów mogą być następujące:

  • $00-$05: koniec pliku
  • 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.

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.

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.

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.

Przykład

  • wpis katalogowy pliku QDOS.SYS jest natępujący:
$40 $06 $7A $08 $00 QDOS____SYS

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
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.

Struktura mapy alokacji plików w DOS 4.0, jak widać, przypomina nieco pecetowy FAT.

Zobacz też

Personal tools