Format SpartaDOS
From Atariki
Wersja z dnia 08:41, 6 maj 2006 Pecus (Dyskusja | wkład) (Przerzucenia z linku do opisu, zmiana na HEXy itp...) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) (→Sektory odczytu wstępnego - BW-DOS) |
||
Linia 1: | Linia 1: | ||
- | [[Formaty systemów plików|Format dyskietki]] używany przez [[SpartaDOS]] oraz wzorowany na nim [[BW-DOS]]. | + | [[Formaty systemów plików|Format dyskietki]] używany przez [[SpartaDOS]] oraz jego klony ([[BW-DOS]]) i pochodne ([[Real.DOS]]). Występuje w trzech odmianach: v.1.1, v.2.0 i v.2.1. Pierwsza z wersji jest właściwa dla SpartaDOS 1.1, druga dla SpartaDOS 2.x, 3.x, oraz [[SpartaDOS X]] od wersji 4.0 do 4.22; trzecia dla SpartaDOS X od wersji 4.39 wzwyż. |
- | Istnieją cztery wyróżniające się rodzaje sektorów na dyskietce w formacie [[SpartaDOS]]. Są to sektory odczytu wstępnego, mapy bitowe, mapy sektorów i danych. Sektory danych mogą zawierać zarówno dane katalogów, jaki dane plików. Poniżej znajduje się szczegółowy opis sektorów każdego rodzaju. | + | == Cechy ogólne == |
- | == Sektory odczytu wstępnego. == | + | * Dopuszczalne wielkości sektorów fizycznych: 128 i 256 bajtów (a od wersji 2.1 dodatkowo: 512, 1024, 2048, 4096, 8192, 16384, 32768 i 65536 bajtów) |
+ | * Maksymalna pojemność filesystemu: 65535 sektorów logicznych (wersja 2.0: 16 MB, od wersji 2.1: 4 GB) | ||
+ | * Maksymalna wielkość pliku: 16 MB | ||
+ | * Maksymalna liczba plików na dysku: nieograniczona | ||
+ | * Struktura katalogowa: hierarchiczna | ||
+ | * Maksymalna liczba plików w katalogu: nieograniczona | ||
+ | * Wielkość wpisu w katalogu: 23 bajty | ||
+ | * Nazwa pliku: 8+3 | ||
+ | * Metoda linkowania plików: indywidualne mapy plików | ||
+ | * Metoda alokacji sektorów: mapa bitowa | ||
- | Jak w większości innych DOS-ów dla 8-bitowych komputerów Atari, pierwsze trzy sektory dyskietki są sektorami odczytu wstępnego. Zawierają one program odczytujący wskazany plik przy uruchomieniu systemu oraz inne informacje konieczne do zapisu i odczytu danych z dyskietki. Sektory odczytu wstępnego są zawsze w pojedynczej gęstości, niezależnie od gęstości pozostałej części dyskietki. | + | == Struktura == |
+ | Istnieją cztery wyróżniające się rodzaje sektorów na dyskietce w formacie [[SpartaDOS]]. Są to sektory odczytu wstępnego, mapy bitowej, mapy sektorów i danych. Sektory danych mogą zawierać zarówno dane katalogów, jak i dane plików. Poniżej znajduje się szczegółowy opis sektorów każdego rodzaju. | ||
- | Sektor 1 od bajtu $30 do $7F i całe sektory 2 i 3 zawierają program, który odczytuje plik SpartaDOS 2.x i 3.x, jeśli został określony (przez polecenie BOOT). Program ten nie jest wykorzystywany przez [[SpartaDOS X]]. Pierwszą częścią sektora 1 jest tablica danych zawierająca wartości opisane poniżej. Dyskietka może być dyskietką elastyczną, ramdyskiem lub partycją twardego dysku, chyba że w opisie zostało podane inaczej. Wszystkie liczby dwu- i trzybajtowe są zapisywane w standardowym formacie młodszy/starszy bajt. | + | == Sektory odczytu wstępnego == |
+ | |||
+ | Przy gęstości pojedynczej i podwójnej, tak samo jak w większości innych DOS-ów dla 8-bitowych komputerów Atari, pierwsze trzy sektory dyskietki są sektorami odczytu wstępnego. Zawierają one program odczytujący wskazany plik przy uruchomieniu systemu oraz inne informacje konieczne do zapisu i odczytu danych z dyskietki. Sektory odczytu wstępnego mają po 128 bajtów, również na dyskach, gdzie sektory danych mają po 256 bajtów. | ||
+ | |||
+ | Sektor 1 od bajtu $30 do $7F i całe sektory 2 i 3 zawierają program, który odczytuje plik zawierający SpartaDOS 2.x lub 3.x, wskazany poleceniem BOOT ([[SpartaDOS X]] nie ładuje się z dyskietki, więc program ten nie jest w zasadzie konieczny do zainicjowania tej wersji DOS-u). | ||
+ | |||
+ | Nieco inaczej jest w przypadku dysków z sektorami 512-bajtowymi: obszar odczytu wstępnego ogranicza się w nich do sektora nr 1 o wielkości 512 bajtów. Program ładujący wypełnia ten sektor od bajtu $0030 do $01FF. | ||
+ | |||
+ | Pierwszą częścią sektora 1 jest tablica danych zawierająca wartości opisane poniżej. ''Dyskietka'' może być dyskietką elastyczną, ramdyskiem lub partycją twardego dysku, chyba że w opisie zostało podane inaczej. Wszystkie liczby dwu- i trzybajtowe są zapisywane w standardowej kolejności od bajtu najmłodszego do najstarszego. | ||
Oto wartości sektora 1, podane według położenia w sektorze (pierwszy bajt sektora ma numer 0): | Oto wartości sektora 1, podane według położenia w sektorze (pierwszy bajt sektora ma numer 0): | ||
<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>$09</td><td>Numer pierwszego sektora mapy sektorów katalogu głównego (2 bajty)</td></tr> | + | <tr><td>$00-$05</td><td>[[BOOT (format pliku)|Standardowy nagłówek]] bootsektora [[Atari OS]] (6 bajtów)</td></tr> |
- | <tr><td>$0B</td><td>całkowita liczba sektorów na dyskietce (2 bajty)</td></tr> | + | <tr><td>$06-$08</td><td><p>Skok JMP do właściwej części programu ładującego. Ten skok stanowi zarazem "wartość magiczną", po jakiej DOS i programy narzędziowe dokonują wstępnego rozpoznania formatu SpartaDOS.</p> |
- | <tr><td>$0D</td><td>Liczba wolnych sektorów na dyskietce (2 bajty)</td></tr> | + | |
- | <tr><td>$0F</td><td>Liczba sektorów mapy bitowej na dyskietce</td></tr> | + | <p>Standardowo ("stary" filesystem v.2.0, zgodny ze SpartaDOS 3) wartość ta to kolejno $4C, $80, $30 (JMP $3080).</p> |
- | <tr><td>$10</td><td>Numer pierwszego sektora mapy bitowej (2 bajty)</td></tr> | + | <p>W [[BW-DOS]] jest to $4C, $80, $08 (JMP $0880).</p> |
- | <tr><td>$12</td><td>Numer sektora rozpoczynającego poszukiwanie przypisania sektorów pliku (2 bajty). Jest to pierwszy sektor sprawdzany, gdy konieczny jest sektor nieprzypisany. Służy to do dwóch celów: uwalnia od konieczności przeszukiwania mapy bitowej od początku za każdym razem, gdy na dyskietce umieszczony jest plik oraz pozwala na rezerwację sektorów za głównym katalogiem dla rozszerzenia katalogu.</td></tr> | + | <p>W "nowym" filesystemie v.2.1, jeśli sektory danych mają 128 albo 256 bajtów, wartość magiczna w SpartaDOS X jest taka sama, jak w SpartaDOS 3 ($4C, $80, $30). Natomiast gdy sektory danych mają po 512 bajtów, jest to $4C, $40, $04 (JMP $0440). Zmiana ta została wprowadzona po to, żeby zablokować starym programom narzędziowym i starym wersjom SpartaDOS dostęp do dysków z nowym filesystemem - stare oprogramowanie mogłoby go bowiem uszkodzić.</p> |
- | <tr><td>$14</td><td>Numer sektora rozpoczynającego poszukiwanie przypisania sektorów katalogu (2 bajty). Jest to pierwszy sektor sprawdzany, gdy rozszerzany jest katalog lub dodawany jest podkatalog. Oddzielenie tej wartości od wyżej podanej umożliwia przyśpieszenie przeszukiwania katalogu.</td></tr> | + | </td></tr> |
- | <tr><td>$16</td><td>Nazwa dyskietki (8 bajtów). [[SpartaDOS]] wykorzystuje to jako część procedury rozpoznającej zmianę dyskietki.</td></tr> | + | <tr><td>$09-$0A</td><td>Numer pierwszego sektora logicznego (klastra) mapy sektorów katalogu głównego (2 bajty)</td></tr> |
- | <tr><td>$1E</td><td>Liczba ścieżek na dyskietce. Jeżeli stacja dysków jest dwustronna, to bit 7 jest ustawiony. Jeżeli nie jest to dyskietka elastyczna (np. ramdysk lub partycja dysku twardego), to rejestr ten zawiera wartość 1.</td></tr> | + | <tr><td>$0B-$0C</td><td>Całkowita liczba sektorów logicznych na dyskietce (2 bajty)</td></tr> |
- | <tr><td>$1F</td><td>Rozmiar sektorów na dyskietce z (poza wektorami wstępnego odczytu). Zero wskazuje 256 bajtów w sektorze, a 128 oznacza 128 bajtów w sektorze.</td></tr> | + | <tr><td>$0D-$0E</td><td>Liczba wolnych sektorów logicznych na dyskietce (2 bajty)</td></tr> |
- | <tr><td>$20</td><td>Podstawowy numer wersji formatu dyskietki. Dyskietki w formacie SpartaDOS 1.1 mają tu $11. Dyskietki sformatowane przez SpartaDOS 2.x, 3.x i SpartaDOS X mają tu $20, ponieważ wszystkie one używają identycznego formatu dyskietek.</td></tr> | + | <tr><td>$0F</td><td>Liczba sektorów logicznych mapy bitowej na dyskietce (1 bajt)</td></tr> |
- | <tr><td>$26</td><td>Sekwencyjny numer dyskietki. Liczba ta jest zwiększana przez [[SpartaDOS]] po każdym otwarciu pliku na dyskietce do zapisu. Jest on wykorzystywany do identyfikacji dyskietki.</td></tr> | + | <tr><td>$10-$11</td><td>Numer pierwszego sektora logicznego mapy bitowej (2 bajty)</td></tr> |
- | <tr><td>$27</td><td>Losowy numer dyskietki. Jest to losowa liczba tworzona, gdy dyskietka jest formatowana. Wraz z nazwą dyskietki i jej numerem sekwencyjnym jest wykorzystywany do identyfikacji dyskietki w celu określenia, czy dane zawarte w buforze dyskowym są poprawne.</td></tr> | + | <tr><td>$12-$13</td><td>Numer sektora logicznego rozpoczynającego poszukiwanie sektorów do przypisania do pliku (2 bajty). Jest to pierwszy sektor sprawdzany, gdy konieczne jest znalezienie sektora nieprzypisanego. Służy to do dwóch celów: uwalnia od konieczności przeszukiwania mapy bitowej od początku za każdym razem, gdy na dyskietce umieszczany jest nowy plik, oraz pozwala na rezerwację wolnych sektorów za głównym katalogiem, dla rozszerzania katalogu.</td></tr> |
- | <tr><td>$28</td><td>Numer sektora, który jest pierwszym sektorem zajmowanym przez program odczytywany podczas odczytu wstępnego. Zwykle jest to plik "DOS". Wartość ta jest ustalana przez program XINIT.COM ze SpartaDOS Construction Set i przez polecenie BOOT.</td></tr> | + | <tr><td>$14-$15</td><td>Numer sektora logicznego rozpoczynającego poszukiwanie sektorów do przypisania do katalogu (2 bajty). Jest to pierwszy sektor sprawdzany, gdy rozszerzany jest katalog lub dodawany jest podkatalog. Oddzielenie tej wartości od wyżej podanej umożliwia przyśpieszenie tworzenia wpisów katalogowych.</td></tr> |
+ | <tr><td>$16-$1D</td><td>Nazwa dyskietki (8 bajtów). [[SpartaDOS]] wykorzystuje to jako część procedury rozpoznającej zmianę dyskietki.</td></tr> | ||
+ | <tr><td>$1E</td><td>Liczba ścieżek na dyskietce. Jeżeli dyskietka jest dwustronna, to bit 7 jest ustawiony. Jeżeli nie jest to dyskietka elastyczna (np. ramdysk lub partycja dysku twardego), to rejestr ten zawiera wartość 1. Zero oznacza wartość niezdefiniowaną. [[SpartaDOS]] wykorzystuje to w procedurze rozpoznającej zmianę dyskietki.</td></tr> | ||
+ | <tr><td>$1F</td><td><p>Rozmiar sektorów logicznych na dyskietce (poza sektorami wstępnego odczytu). Zero wskazuje 256 bajtów w sektorze, a 128 oznacza 128 bajtów w sektorze. W filesystemie 2.1 (SpartaDOS X >= 4.39) każda wartość oprócz $80 oznacza starszy bajt wielkości sektora odjąć 1, a zatem:</p> | ||
+ | * $80 = 128 bajtów w sektorze | ||
+ | * $00 = 256 bajtów w sektorze | ||
+ | * $01 = 512 bajtów w sektorze | ||
+ | <p>Inne wartości są zarezerwowane do przyszłych rozszerzeń.</p> | ||
+ | </td></tr> | ||
+ | <tr><td>$20</td><td><p>Podstawowy numer wersji formatu dyskietki. Dyskietki w formacie SpartaDOS 1.1 mają tu $11. Dyskietki sformatowane przez SpartaDOS 2.x, 3.x i SpartaDOS X 4.1x/4.2x mają tu $20, ponieważ wszystkie one używają identycznego formatu dyskietek. SpartaDOS X >= 4.39 daje tu $21 (wersja 2.1 filesystemu).</p> | ||
+ | <p>Filesystem w wersji 1.x i 2.x ma zawsze 16-bitowe adresowanie sektorów, może obejmować nie więcej niż 65535 sektorów logicznych.</p> | ||
+ | </td></tr> | ||
+ | <tr><td>$21</td><td> | ||
+ | * W SpartaDOS 1.1: domyślna liczba buforów dla DOS-u zabootowanego z tej dyskietki ($06). | ||
+ | * W SpartaDOS v. 2.x/3.x/4.1x/4.2x wartość bez znaczenia. | ||
+ | * W SpartaDOS X >= 4.39 (filesystem 2.1) młodszy bajt wielkości sektora fizycznego.</td></tr> | ||
+ | <tr><td>$22</td><td> | ||
+ | * W SpartaDOS 1.1: domyślny numer stacji dysków command processora dla DOS-u zabootowanego z tej dyskietki ($01). | ||
+ | * W SpartaDOS v. 2.x/3.x/4.1x/4.2x wartość bez znaczenia. | ||
+ | * W SpartaDOS X >= 4.39 (filesystem 2.1) starszy bajt wielkości sektora fizycznego.</td></tr> | ||
+ | <tr><td>$23-$24</td><td> | ||
+ | * W SpartaDOS 2.x/3.x/4.2x (filesystem 2.0) bajty zarezerwowane. | ||
+ | * W SpartaDOS 4.4x (filesystem 2.1): liczba wpisów klastrów danych mieszcząca się w jednym sektorze logicznym mapy pliku. | ||
+ | </td></tr> | ||
+ | <tr><td>$25</td><td> | ||
+ | * W SpartaDOS 1.1: wielkość bootowalnego pliku DOS-u w sektorach. | ||
+ | * W SpartaDOS 2.x/3.x/4.2x (filesystem 2.0) wartość zarezerwowana. | ||
+ | * W SpartaDOS 4.4x (filesystem 2.1): liczba sektorów fizycznych przypadająca na sektor logiczny (klaster). Bieżąca implementacja przewiduje tylko jedną wartość: $01. | ||
+ | </td></tr> | ||
+ | <tr><td>$26</td><td> | ||
+ | * W SpartaDOS 1.1: wartość bez znaczenia. | ||
+ | * W SpartaDOS 2.x/3.x/4.x: sekwencyjny numer dyskietki. Liczba ta jest zwiększana przez [[SpartaDOS]] po każdym otwarciu pliku na dyskietce do zapisu. Jest on wykorzystywany do identyfikacji dyskietki.</td></tr> | ||
+ | <tr><td>$27</td><td> | ||
+ | * W SpartaDOS 1.1 wartość bez znaczenia. | ||
+ | * W SpartaDOS 2.x/3.x/4.x: losowy numer dyskietki. Jest to losowa liczba tworzona, gdy dyskietka jest formatowana. Wraz z nazwą dyskietki i jej numerem sekwencyjnym jest wykorzystywany do identyfikacji dyskietki w celu określenia, czy dane zawarte w buforze dyskowym są poprawne. | ||
+ | </td></tr> | ||
+ | <tr><td>$28-$29</td><td>Numer sektora logicznego, który jest pierwszym sektorem zajmowanym przez program odczytywany podczas odczytu wstępnego. Zwykle jest to plik "DOS". Wartość ta jest ustalana przez program XINIT.COM ze SpartaDOS Construction Set i przez polecenie BOOT.</td></tr> | ||
+ | <tr><td>$2a</td><td> | ||
+ | * W SpartaDOS 2.x i 3.x: wskaźnik zabezpieczenia dyskietki przed zapisem ($00 - odbezpieczona, $FF - zabezpieczona). | ||
+ | * W SpartaDOS 1.1 i SpartaDOS X wartość bez znaczenia (powinno tu być $00 dla zgodności wstecz z SpartaDOS 2 i 3).</td></tr> | ||
</table> | </table> | ||
- | == Mapa bitowa. == | + | ===Program ładujący SpartaDOS=== |
+ | |||
+ | Pozostałą część obszaru odczytu wstępnego zajmuje loader binarny. W odróżnieniu od loaderów innych [[DOS]]-ów, loader SpartaDOS jest w stanie wczytywać standardowe pliki binarne ([[COM]]). Takim plikiem jest też plik *.DOS zawierający SpartaDOS. | ||
+ | |||
+ | Loader SpartaDOS, głównie z powodu konieczności zmieszczenia się w przestrzeni niewiele większej niż 256 bajtów, ma następujące ograniczenia: | ||
+ | |||
+ | * plik binarny może składać się z wielu segmentów, ale nie mogą się one zaczynać pełnym nagłówkiem ze znacznikiem $FFFF na początku; taki nagłówek może mieć tylko pierwszy segment pliku, dalsze muszą mieć nagłówki skrócone. | ||
+ | * plik binarny nie może naruszać pamięci w obszarach $90-$97 oraz $2E00-$3180. | ||
+ | * plik binarny musi zawierać segment RUN. | ||
+ | * po ostatnim segmencie muszą następować dwa bajty o wartości zero; ten dziwaczny na pierwszy rzut oka wymóg spowodowany jest faktem, że loader nie czyta katalogu dysku, nie zna więc długości pliku, który ma załadować, a co za tym idzie - nie jest w stanie stwierdzić wystąpienia końca tego pliku, jeśli nie jest to jakoś zaznaczone w samych danych. Znacznikiem takim jest nagłówek segmentu zaczynający się od dwóch zer. | ||
+ | * długość żadnego z segmentów nie może być całkowitą wielokrotnością wielkości sektora; plik zawierający taki segment zostanie załadowany nieprawidłowo - jest to więc raczej błąd w programie loadera, niż ograniczenie. | ||
+ | |||
+ | == Mapa bitowa == | ||
Mapa bitowa jest stosowana do określenia przypisania każdego sektora dyskietki. Każdy bit w każdym bajcie mapy bitowej pokazuje, czy odpowiadający mu sektor jest zajęty, więc każdy bajt zawiera informacje o stanie ośmiu sektorów. Bit 7 reprezentuje pierwszy sektor każdej grupy, a bit 0 ósmy sektor grupy. Bajt 0 pierwszego sektora mapy bitowej reprezentuje sektory od 0 do 7 (pomimo, że sektor 0 nie istnieje), bajt 1 reprezentuje sektory od 8 do 15 itd. Jeśli bit reprezentujący sektor jest '''USTAWIONY (1)''', to sektor nie jest wykorzystany. Jeżeli bit jest '''SKASOWANY (0)''', to sektor jest zajęty (przypisany do pliku). Jeżeli potrzeba więcej niż jeden sektor mapy bitowej, to mapa zajmuje kolejno następujące sektory. | Mapa bitowa jest stosowana do określenia przypisania każdego sektora dyskietki. Każdy bit w każdym bajcie mapy bitowej pokazuje, czy odpowiadający mu sektor jest zajęty, więc każdy bajt zawiera informacje o stanie ośmiu sektorów. Bit 7 reprezentuje pierwszy sektor każdej grupy, a bit 0 ósmy sektor grupy. Bajt 0 pierwszego sektora mapy bitowej reprezentuje sektory od 0 do 7 (pomimo, że sektor 0 nie istnieje), bajt 1 reprezentuje sektory od 8 do 15 itd. Jeśli bit reprezentujący sektor jest '''USTAWIONY (1)''', to sektor nie jest wykorzystany. Jeżeli bit jest '''SKASOWANY (0)''', to sektor jest zajęty (przypisany do pliku). Jeżeli potrzeba więcej niż jeden sektor mapy bitowej, to mapa zajmuje kolejno następujące sektory. | ||
- | == Mapa sektorów. == | + | == Mapa sektorów == |
Mapa sektorów jest wykazem wszystkich sektorów zajętych przez plik. Pierwsze dwa wpisy są numerami następnego i poprzedniego sektora mapy sektorów pliku. Reszta sektora zawiera listę numerów sektorów z danymi pliku lub katalogu. Są one opisane poniżej według położenia w sektorze: | Mapa sektorów jest wykazem wszystkich sektorów zajętych przez plik. Pierwsze dwa wpisy są numerami następnego i poprzedniego sektora mapy sektorów pliku. Reszta sektora zawiera listę numerów sektorów z danymi pliku lub katalogu. Są one opisane poniżej według położenia w sektorze: | ||
Linia 39: | Linia 108: | ||
<tr><td>$00</td><td>Numer następnego sektora zawierającego mapę sektorów pliku lub katalogu (2 bajty). Znajduje się zero, jeżeli jest to ostatni sektor mapy.</td></tr> | <tr><td>$00</td><td>Numer następnego sektora zawierającego mapę sektorów pliku lub katalogu (2 bajty). Znajduje się zero, jeżeli jest to ostatni sektor mapy.</td></tr> | ||
<tr><td>$02</td><td>Numer poprzedniego sektora zawierającego mapę sektorów, pliku lub katalogu (2 bajty). Znajduje się tu zero, jeżeli jest to pierwszy sektor mapy.</td></tr> | <tr><td>$02</td><td>Numer poprzedniego sektora zawierającego mapę sektorów, pliku lub katalogu (2 bajty). Znajduje się tu zero, jeżeli jest to pierwszy sektor mapy.</td></tr> | ||
- | <tr><td>$04</td><td>Numery sektorów zawierających dane pliku lub katalogu w poprawnej kolejności. Wszystkie numery sektorów są dwubajtowe. Jeżeli numer sektora jest zerem, to ta część pliku nie ma przypisanego sektora. Pliki takie są opisane razem z instrukcją POINT w rozdziale "Programowanie ze SpartaDOS X".</td></tr> | + | <tr><td>$04</td><td>Numery sektorów zawierających dane pliku lub katalogu w poprawnej kolejności. Wszystkie numery sektorów są dwubajtowe. Jeżeli numer sektora jest zerem, to ta część pliku nie ma przypisanego sektora.<br>''Na dyskietkach SpartaDOS możliwe jest ustalenie pozycji poza końcem pliku otwartego w trybie dopisywania. Gdy dane są umieszczane w pliku poza końcem, to plik otrzymuje nową długość, lecz żaden fizyczny sektor nie zostaje wykorzystany na odstęp pomiędzy starymi i nowymi danymi. W mapie sektorów plików taki sektor otrzymuje numer 0. Dopiero po zapisaniu czegoś w tym odstępie sektor jest ustalony. Taki odstęp nie może być odczytywany, a plik który go zawiera, nie może być kopiowany. Próba wykonania takiej czynności spowoduje błąd.''</td></tr> |
</table> | </table> | ||
- | == Struktura katalogu. == | + | == Struktura katalogu == |
- | Katalog jest specjalnym plikiem, który zawiera informację o grupie plików i podkatalogów. Każdy wpis katalogu ma długość 23 bajtów i zawiera nazwę pliku, czas i datę, długość, numer pierwszego sektora mapy i status wpisu. Pierwszy wpis jest inny niż pozostałe, gdyż znajdują się w nim informacje o samym katalogu. Poniżej podane są informacje zawarte w pierwszym wpisie (licząc od jego początku): | + | Katalog jest specjalnym plikiem, który zawiera informację o grupie plików i podkatalogów. Każdy wpis katalogu ma długość 23 bajtów i zawiera nazwę pliku, czas i datę, długość, numer pierwszego sektora mapy i status wpisu. Pierwszy wpis jest nieco inny niż pozostałe, gdyż znajdują się w nim informacje o samym katalogu. Poniżej podane są informacje zawarte w pierwszym wpisie (licząc od jego początku): |
<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</td><td>Numer pierwszego sektora mapy sektorów katalogu nadrzędnego (2 bajty). Zero wskazuje, że jest to główny katalog dyskietki (MAIN).</td></tr> | + | <tr><td>$00</td><td>"Pusty" bajt statusu, powinien zostać zignorowany. ''Ten bajt ma wartość $00 w SpartaDOS 3 i BW DOS, $A8 w SpartaDOS X 4.2x i $28 w SpartaDOS X 4.4x.''</td></tr> |
- | <tr><td>$02</td><td>Długość katalogu w bajtach (3 bajty). Jest to wielkość pliku katalogu, a nie liczba wpisów.</td></tr> | + | <tr><td>$01-$02</td><td>Numer pierwszego sektora mapy sektorów katalogu nadrzędnego (2 bajty). Zero wskazuje, że jest to główny katalog dyskietki (MAIN).</td></tr> |
- | <tr><td>$05</td><td>Nazwa katalogu (8 bajtów). Puste miejsca są wypełnione spacjami.</td></tr> | + | <tr><td>$03-$05</td><td>Długość katalogu w bajtach (3 bajty). Jest to wielkość pliku katalogu, a nie liczba wpisów.</td></tr> |
+ | <tr><td>$06-$0D</td><td>Nazwa katalogu (8 bajtów). Puste miejsca są wypełnione spacjami.</td></tr> | ||
+ | <tr><td>$0E-$10</td><td>Rozszerzenie nazwy (3 bajty). Puste miejsca są wypełniane spacjami.</td></tr> | ||
+ | <tr><td>$11-$16</td><td>Czas i data utworzenia katalogu w formacie opisanym poniżej. ''SpartaDOS X >= 4.39: w katalogu głównym jest tu czas i data ostatniego formatowania dysku''.</td></tr> | ||
</table> | </table> | ||
+ | |||
Gdy katalog jest otwarty w trybie bezpośrednim (jak każdy inny plik), to jego plik jest odczytywany od drugiego wpisu (tzn. od pierwszego wpisu pliku lub podkatalogu). Aby odczytać pierwszy wpis, należy instrukcją POINT wskazać początek pliku po jego otwarciu. | Gdy katalog jest otwarty w trybie bezpośrednim (jak każdy inny plik), to jego plik jest odczytywany od drugiego wpisu (tzn. od pierwszego wpisu pliku lub podkatalogu). Aby odczytać pierwszy wpis, należy instrukcją POINT wskazać początek pliku po jego otwarciu. | ||
Linia 58: | Linia 131: | ||
<tr><td>$00</td><td>Bajt statusu. Bity tego bajtu, jeśli są USTAWIONE (1), określają status wpisu katalogu następująco: | <tr><td>$00</td><td>Bajt statusu. Bity tego bajtu, jeśli są USTAWIONE (1), określają status wpisu katalogu następująco: | ||
- | *B0 - wpis jest zabezpieczony | + | * bit 7 = 1 - wpis jest otwarty do zapisu |
- | *B1 - wpis jest ukryty | + | * bit 6 = 1 - wpis jest [https://pl.wikipedia.org/wiki/Dowi%C4%85zanie_symboliczne dowiązaniem symbolicznym] (od SpartaDOS X 4.49e) |
- | *B2 - wpis jest archiwalny | + | * bit 5 = 1 - wpis jest podkatalogiem |
- | *B3 - wpis jest w użyciu | + | * bit 4 = 1 - wpis jest skasowany |
- | *B4 - wpis jest skasowany | + | * bit 3 = 1 - wpis jest w użyciu |
- | *B5 - wpis jest podkatalogiem | + | * bit 2 = 1 - wpis jest archiwalny |
- | *B7 - wpis jest otwarty do zapisu | + | * bit 1 = 1 - wpis jest ukryty |
+ | * bit 0 = 1 - wpis jest zabezpieczony | ||
- | '''UWAGI''': Bity 1 i 2 nie są rozpoznawalne przez wcześniejsze wersje [[SpartaDOS]]. Bity 3 i 4 mają zawsze przeciwne stany. Bit 5 nie powinien być zmieniany! Bit 6 nie jest używany i nie może być, gdyż jest kasowany przy wykonywaniu innych operacji. Bajt statusu równy 0 oznacza koniec katalogu.</td></tr> | + | '''UWAGI''': Bity 1 i 2 nie są rozpoznawalne przez wersje [[SpartaDOS]] wcześniejsze niż 4.0. Bity 3 i 4 mają zawsze przeciwne stany. Bity 5 i 6 nie powinny być zmieniane. Bajt statusu równy 0 oznacza koniec katalogu.</td></tr> |
- | <tr><td>$01</td><td>Numer pierwszego sektora mapy sektorów podkatalogu lub pliku (2 bajty)</td></tr> | + | <tr><td>$01-$02</td><td>Numer pierwszego sektora mapy sektorów podkatalogu lub pliku (2 bajty)</td></tr> |
- | <tr><td>$03</td><td>Długość pliku w bajtach (3 bajty)</td></tr> | + | <tr><td>$03-$05</td><td>Długość pliku w bajtach (3 bajty)</td></tr> |
- | <tr><td>$06</td><td>Nazwa pliku lub podkatalogu (8 bajtów). Puste miejsca są wypełniane spacjami.</td></tr> | + | <tr><td>$06-$0D</td><td>Nazwa pliku lub podkatalogu (8 bajtów). Puste miejsca są wypełniane spacjami.</td></tr> |
- | <tr><td>$0E</td><td>Rozszerzenie nazwy pliku lub podkatalogu (3 bajty). Puste miejsca są wypełniane spacjami.</td></tr> | + | <tr><td>$0E-$10</td><td>Rozszerzenie nazwy pliku lub podkatalogu (3 bajty). Puste miejsca są wypełniane spacjami.</td></tr> |
- | <tr><td>$11</td><td>Data utworzenia pliku lub katalogu w formacie DD/MM/YY (3 bajty).</td></tr> | + | <tr><td>$11-$13</td><td>Data utworzenia pliku lub katalogu w formacie DD/MM/YY (3 bajty). "YY" tutaj to dwie ostatnie cyfry roku (w zakresie od 0 do 99).</td></tr> |
- | <tr><td>$14</td><td>Czas utworzenia pliku lub katalogu w formacie HH/MM/SS w systemie 24 godzinnym (3 bajty).</td></tr> | + | <tr><td>$14-$16</td><td>Czas utworzenia pliku lub katalogu w formacie HH/MM/SS w systemie 24 godzinnym (3 bajty).</td></tr> |
</table> | </table> | ||
Aktualna wersja
Format dyskietki używany przez SpartaDOS oraz jego klony (BW-DOS) i pochodne (Real.DOS). Występuje w trzech odmianach: v.1.1, v.2.0 i v.2.1. Pierwsza z wersji jest właściwa dla SpartaDOS 1.1, druga dla SpartaDOS 2.x, 3.x, oraz SpartaDOS X od wersji 4.0 do 4.22; trzecia dla SpartaDOS X od wersji 4.39 wzwyż.
Spis treści |
Cechy ogólne
- Dopuszczalne wielkości sektorów fizycznych: 128 i 256 bajtów (a od wersji 2.1 dodatkowo: 512, 1024, 2048, 4096, 8192, 16384, 32768 i 65536 bajtów)
- Maksymalna pojemność filesystemu: 65535 sektorów logicznych (wersja 2.0: 16 MB, od wersji 2.1: 4 GB)
- Maksymalna wielkość pliku: 16 MB
- Maksymalna liczba plików na dysku: nieograniczona
- Struktura katalogowa: hierarchiczna
- Maksymalna liczba plików w katalogu: nieograniczona
- Wielkość wpisu w katalogu: 23 bajty
- Nazwa pliku: 8+3
- Metoda linkowania plików: indywidualne mapy plików
- Metoda alokacji sektorów: mapa bitowa
Struktura
Istnieją cztery wyróżniające się rodzaje sektorów na dyskietce w formacie SpartaDOS. Są to sektory odczytu wstępnego, mapy bitowej, mapy sektorów i danych. Sektory danych mogą zawierać zarówno dane katalogów, jak i dane plików. Poniżej znajduje się szczegółowy opis sektorów każdego rodzaju.
Sektory odczytu wstępnego
Przy gęstości pojedynczej i podwójnej, tak samo jak w większości innych DOS-ów dla 8-bitowych komputerów Atari, pierwsze trzy sektory dyskietki są sektorami odczytu wstępnego. Zawierają one program odczytujący wskazany plik przy uruchomieniu systemu oraz inne informacje konieczne do zapisu i odczytu danych z dyskietki. Sektory odczytu wstępnego mają po 128 bajtów, również na dyskach, gdzie sektory danych mają po 256 bajtów.
Sektor 1 od bajtu $30 do $7F i całe sektory 2 i 3 zawierają program, który odczytuje plik zawierający SpartaDOS 2.x lub 3.x, wskazany poleceniem BOOT (SpartaDOS X nie ładuje się z dyskietki, więc program ten nie jest w zasadzie konieczny do zainicjowania tej wersji DOS-u).
Nieco inaczej jest w przypadku dysków z sektorami 512-bajtowymi: obszar odczytu wstępnego ogranicza się w nich do sektora nr 1 o wielkości 512 bajtów. Program ładujący wypełnia ten sektor od bajtu $0030 do $01FF.
Pierwszą częścią sektora 1 jest tablica danych zawierająca wartości opisane poniżej. Dyskietka może być dyskietką elastyczną, ramdyskiem lub partycją twardego dysku, chyba że w opisie zostało podane inaczej. Wszystkie liczby dwu- i trzybajtowe są zapisywane w standardowej kolejności od bajtu najmłodszego do najstarszego.
Oto wartości sektora 1, podane według położenia w sektorze (pierwszy bajt sektora ma numer 0):
Offset | Opis |
$00-$05 | Standardowy nagłówek bootsektora Atari OS (6 bajtów) |
$06-$08 | Skok JMP do właściwej części programu ładującego. Ten skok stanowi zarazem "wartość magiczną", po jakiej DOS i programy narzędziowe dokonują wstępnego rozpoznania formatu SpartaDOS. Standardowo ("stary" filesystem v.2.0, zgodny ze SpartaDOS 3) wartość ta to kolejno $4C, $80, $30 (JMP $3080). W BW-DOS jest to $4C, $80, $08 (JMP $0880). W "nowym" filesystemie v.2.1, jeśli sektory danych mają 128 albo 256 bajtów, wartość magiczna w SpartaDOS X jest taka sama, jak w SpartaDOS 3 ($4C, $80, $30). Natomiast gdy sektory danych mają po 512 bajtów, jest to $4C, $40, $04 (JMP $0440). Zmiana ta została wprowadzona po to, żeby zablokować starym programom narzędziowym i starym wersjom SpartaDOS dostęp do dysków z nowym filesystemem - stare oprogramowanie mogłoby go bowiem uszkodzić. |
$09-$0A | Numer pierwszego sektora logicznego (klastra) mapy sektorów katalogu głównego (2 bajty) |
$0B-$0C | Całkowita liczba sektorów logicznych na dyskietce (2 bajty) |
$0D-$0E | Liczba wolnych sektorów logicznych na dyskietce (2 bajty) |
$0F | Liczba sektorów logicznych mapy bitowej na dyskietce (1 bajt) |
$10-$11 | Numer pierwszego sektora logicznego mapy bitowej (2 bajty) |
$12-$13 | Numer sektora logicznego rozpoczynającego poszukiwanie sektorów do przypisania do pliku (2 bajty). Jest to pierwszy sektor sprawdzany, gdy konieczne jest znalezienie sektora nieprzypisanego. Służy to do dwóch celów: uwalnia od konieczności przeszukiwania mapy bitowej od początku za każdym razem, gdy na dyskietce umieszczany jest nowy plik, oraz pozwala na rezerwację wolnych sektorów za głównym katalogiem, dla rozszerzania katalogu. |
$14-$15 | Numer sektora logicznego rozpoczynającego poszukiwanie sektorów do przypisania do katalogu (2 bajty). Jest to pierwszy sektor sprawdzany, gdy rozszerzany jest katalog lub dodawany jest podkatalog. Oddzielenie tej wartości od wyżej podanej umożliwia przyśpieszenie tworzenia wpisów katalogowych. |
$16-$1D | Nazwa dyskietki (8 bajtów). SpartaDOS wykorzystuje to jako część procedury rozpoznającej zmianę dyskietki. |
$1E | Liczba ścieżek na dyskietce. Jeżeli dyskietka jest dwustronna, to bit 7 jest ustawiony. Jeżeli nie jest to dyskietka elastyczna (np. ramdysk lub partycja dysku twardego), to rejestr ten zawiera wartość 1. Zero oznacza wartość niezdefiniowaną. SpartaDOS wykorzystuje to w procedurze rozpoznającej zmianę dyskietki. |
$1F | Rozmiar sektorów logicznych na dyskietce (poza sektorami wstępnego odczytu). Zero wskazuje 256 bajtów w sektorze, a 128 oznacza 128 bajtów w sektorze. W filesystemie 2.1 (SpartaDOS X >= 4.39) każda wartość oprócz $80 oznacza starszy bajt wielkości sektora odjąć 1, a zatem:
Inne wartości są zarezerwowane do przyszłych rozszerzeń. |
$20 | Podstawowy numer wersji formatu dyskietki. Dyskietki w formacie SpartaDOS 1.1 mają tu $11. Dyskietki sformatowane przez SpartaDOS 2.x, 3.x i SpartaDOS X 4.1x/4.2x mają tu $20, ponieważ wszystkie one używają identycznego formatu dyskietek. SpartaDOS X >= 4.39 daje tu $21 (wersja 2.1 filesystemu). Filesystem w wersji 1.x i 2.x ma zawsze 16-bitowe adresowanie sektorów, może obejmować nie więcej niż 65535 sektorów logicznych. |
$21 |
|
$22 |
|
$23-$24 |
|
$25 |
|
$26 |
|
$27 |
|
$28-$29 | Numer sektora logicznego, który jest pierwszym sektorem zajmowanym przez program odczytywany podczas odczytu wstępnego. Zwykle jest to plik "DOS". Wartość ta jest ustalana przez program XINIT.COM ze SpartaDOS Construction Set i przez polecenie BOOT. |
$2a |
|
Program ładujący SpartaDOS
Pozostałą część obszaru odczytu wstępnego zajmuje loader binarny. W odróżnieniu od loaderów innych DOS-ów, loader SpartaDOS jest w stanie wczytywać standardowe pliki binarne (COM). Takim plikiem jest też plik *.DOS zawierający SpartaDOS.
Loader SpartaDOS, głównie z powodu konieczności zmieszczenia się w przestrzeni niewiele większej niż 256 bajtów, ma następujące ograniczenia:
- plik binarny może składać się z wielu segmentów, ale nie mogą się one zaczynać pełnym nagłówkiem ze znacznikiem $FFFF na początku; taki nagłówek może mieć tylko pierwszy segment pliku, dalsze muszą mieć nagłówki skrócone.
- plik binarny nie może naruszać pamięci w obszarach $90-$97 oraz $2E00-$3180.
- plik binarny musi zawierać segment RUN.
- po ostatnim segmencie muszą następować dwa bajty o wartości zero; ten dziwaczny na pierwszy rzut oka wymóg spowodowany jest faktem, że loader nie czyta katalogu dysku, nie zna więc długości pliku, który ma załadować, a co za tym idzie - nie jest w stanie stwierdzić wystąpienia końca tego pliku, jeśli nie jest to jakoś zaznaczone w samych danych. Znacznikiem takim jest nagłówek segmentu zaczynający się od dwóch zer.
- długość żadnego z segmentów nie może być całkowitą wielokrotnością wielkości sektora; plik zawierający taki segment zostanie załadowany nieprawidłowo - jest to więc raczej błąd w programie loadera, niż ograniczenie.
Mapa bitowa
Mapa bitowa jest stosowana do określenia przypisania każdego sektora dyskietki. Każdy bit w każdym bajcie mapy bitowej pokazuje, czy odpowiadający mu sektor jest zajęty, więc każdy bajt zawiera informacje o stanie ośmiu sektorów. Bit 7 reprezentuje pierwszy sektor każdej grupy, a bit 0 ósmy sektor grupy. Bajt 0 pierwszego sektora mapy bitowej reprezentuje sektory od 0 do 7 (pomimo, że sektor 0 nie istnieje), bajt 1 reprezentuje sektory od 8 do 15 itd. Jeśli bit reprezentujący sektor jest USTAWIONY (1), to sektor nie jest wykorzystany. Jeżeli bit jest SKASOWANY (0), to sektor jest zajęty (przypisany do pliku). Jeżeli potrzeba więcej niż jeden sektor mapy bitowej, to mapa zajmuje kolejno następujące sektory.
Mapa sektorów
Mapa sektorów jest wykazem wszystkich sektorów zajętych przez plik. Pierwsze dwa wpisy są numerami następnego i poprzedniego sektora mapy sektorów pliku. Reszta sektora zawiera listę numerów sektorów z danymi pliku lub katalogu. Są one opisane poniżej według położenia w sektorze:
Offset | Opis |
$00 | Numer następnego sektora zawierającego mapę sektorów pliku lub katalogu (2 bajty). Znajduje się zero, jeżeli jest to ostatni sektor mapy. |
$02 | Numer poprzedniego sektora zawierającego mapę sektorów, pliku lub katalogu (2 bajty). Znajduje się tu zero, jeżeli jest to pierwszy sektor mapy. |
$04 | Numery sektorów zawierających dane pliku lub katalogu w poprawnej kolejności. Wszystkie numery sektorów są dwubajtowe. Jeżeli numer sektora jest zerem, to ta część pliku nie ma przypisanego sektora. Na dyskietkach SpartaDOS możliwe jest ustalenie pozycji poza końcem pliku otwartego w trybie dopisywania. Gdy dane są umieszczane w pliku poza końcem, to plik otrzymuje nową długość, lecz żaden fizyczny sektor nie zostaje wykorzystany na odstęp pomiędzy starymi i nowymi danymi. W mapie sektorów plików taki sektor otrzymuje numer 0. Dopiero po zapisaniu czegoś w tym odstępie sektor jest ustalony. Taki odstęp nie może być odczytywany, a plik który go zawiera, nie może być kopiowany. Próba wykonania takiej czynności spowoduje błąd. |
Struktura katalogu
Katalog jest specjalnym plikiem, który zawiera informację o grupie plików i podkatalogów. Każdy wpis katalogu ma długość 23 bajtów i zawiera nazwę pliku, czas i datę, długość, numer pierwszego sektora mapy i status wpisu. Pierwszy wpis jest nieco inny niż pozostałe, gdyż znajdują się w nim informacje o samym katalogu. Poniżej podane są informacje zawarte w pierwszym wpisie (licząc od jego początku):
Offset | Opis |
$00 | "Pusty" bajt statusu, powinien zostać zignorowany. Ten bajt ma wartość $00 w SpartaDOS 3 i BW DOS, $A8 w SpartaDOS X 4.2x i $28 w SpartaDOS X 4.4x. |
$01-$02 | Numer pierwszego sektora mapy sektorów katalogu nadrzędnego (2 bajty). Zero wskazuje, że jest to główny katalog dyskietki (MAIN). |
$03-$05 | Długość katalogu w bajtach (3 bajty). Jest to wielkość pliku katalogu, a nie liczba wpisów. |
$06-$0D | Nazwa katalogu (8 bajtów). Puste miejsca są wypełnione spacjami. |
$0E-$10 | Rozszerzenie nazwy (3 bajty). Puste miejsca są wypełniane spacjami. |
$11-$16 | Czas i data utworzenia katalogu w formacie opisanym poniżej. SpartaDOS X >= 4.39: w katalogu głównym jest tu czas i data ostatniego formatowania dysku. |
Gdy katalog jest otwarty w trybie bezpośrednim (jak każdy inny plik), to jego plik jest odczytywany od drugiego wpisu (tzn. od pierwszego wpisu pliku lub podkatalogu). Aby odczytać pierwszy wpis, należy instrukcją POINT wskazać początek pliku po jego otwarciu.
Pozostałe wpisy katalogu są takie same. Mają one długość 23 bajtów i zawierają następujące informacje (licząc od początku wpisu):
Offset | Opis |
$00 | Bajt statusu. Bity tego bajtu, jeśli są USTAWIONE (1), określają status wpisu katalogu następująco:
|
$01-$02 | Numer pierwszego sektora mapy sektorów podkatalogu lub pliku (2 bajty) |
$03-$05 | Długość pliku w bajtach (3 bajty) |
$06-$0D | Nazwa pliku lub podkatalogu (8 bajtów). Puste miejsca są wypełniane spacjami. |
$0E-$10 | Rozszerzenie nazwy pliku lub podkatalogu (3 bajty). Puste miejsca są wypełniane spacjami. |
$11-$13 | Data utworzenia pliku lub katalogu w formacie DD/MM/YY (3 bajty). "YY" tutaj to dwie ostatnie cyfry roku (w zakresie od 0 do 99). |
$14-$16 | Czas utworzenia pliku lub katalogu w formacie HH/MM/SS w systemie 24 godzinnym (3 bajty). |