Format CP/M 2.2

From Atariki

Jump to: navigation, search

Format dyskietki zastosowany w Indus CP/M 2.2 i przeznaczony do użycia ze stacjami Indus GT, LDW Super 2000 i CA-2001. Format dyskietki CP/M 2.2 ma to do siebie, że część parametrów dysku jest z góry narzucona przez BIOS właściwy dla danej implementacji systemu. Utrudnia to wymianę danych tą drogą pomiędzy poszczególnymi implementacjami CP/M.

Spis treści

Cechy ogólne

  • Dopuszczalne wielkości sektorów fizycznych: 128, 256, 512 bajtów
  • Wielkość sektora logicznego (bloku): 1024, 2048, 4096, 8192 i 16384 bajty
  • Maksymalna pojemność filesystemu: 65536 bloków (1 GB)
  • Maksymalna wielkość pliku: nieograniczona
  • Maksymalna liczba plików na dysku (przy bloku 16k): 8192
  • Struktura katalogowa: jednopoziomowa
  • Maksymalna liczba plików w katalogu (przy bloku 16k): 8192
  • Wielkość wpisu w katalogu: 32 bajty
  • Nazwa pliku: 8+3
  • Metoda linkowania plików: indywidualne mapy plików
  • Metoda alokacji sektorów: zależna od BIOS-u

Pierwsze dwie ścieżki typowej dyskietki (w Atari: sektory 1-36) zajmuje kod CP/M (na dyskietce nietypowej - tzw. data disk - może go nie być). Reszta sektorów zawiera katalog i dane. Ogólnie dyskietka preformatowana do użycia z CP/M charakteryzuje się tym, że może być zupełnie pusta: nie muszą być na niej zapisane żadne szczególne struktury danych (jak to ma miejsce w innych systemach plików), wystarczy, jeśli sektory na kilku pierwszych ścieżkach (albo po prostu na całym dysku) zostaną wypełnione wartością $E5.

W Indus CP/M zawartość sektorów począwszy od nr 37, oglądana pod typowym edytorem dyskowym dla Atari, ma odwrócone wszystkie bity (EOR #$FF). Ma to na celu, przy odpowiedniej konfiguracji, udostępnienie danych innym implementacjom CP/M.

Jednostka alokacji

Jednostkę alokacji stanowi blok liczący minimum (i na ogół) 1k, ale mogący osiągać do 16k. W Indus CP/M blok stanowi osiem sektorów w SD i cztery w DD, całkowita pojemność dyskietki w SD i DD wynosi odpowiednio 85 i 171 bloków.

Jedną ze stosowanych jednostek miar jest "rekord". Jest to umowna wielkość wynosząca 128 bajtów (historycznie: wielkość sektora na dyskietce ośmiocalowej).

DPB

Parametry dysku przechowywane są w tzw. DPB (ang. disk parameter block). DPB nie jest zapisany nigdzie na dysku - BIOS tworzy go sobie w pamięci po zalogowaniu dyskietki. Tak samo tworzona jest mapa alokacji dysku pozwalająca na przypisywanie wolnych bloków do nowo tworzonych plików.

Struktura DPB jest następująca:

OffsetEtykietaOpis
$00-$01 spt

Liczba 128-bajtowych rekordów na ścieżkę. W Indus CP/M: 18 w SD i 36 w DD.

$02 bsh

Tzw. block shift. Jest to wartość określająca, ile razy należy 128 pomnożyć przez 2, żeby uzyskać wielkość bloku:

  • $03 dla bloku 1k
  • $04 dla 2k
  • $05 dla 4k
  • $06 dla 8k
  • $07 dla 16k

W Indus CP/M: $03.

$03 blm

Tzw. block mask. Jest to liczba 128-bajtowych rekordów w bloku, odjąć 1:

  • $07 dla bloku 1k
  • $0F dla 2k
  • $1F dla 4k
  • $3F dla 8k
  • $7F dla 16k

W Indus CP/M: $07

$04 exm

Tzw. extent mask. Jest to zmniejszona o jeden liczba 16-kilobajtowych "porcji" pliku, jaką może obejmować jeden wpis katalogowy należący do tego pliku. Wielkość ta zależy od wielkości bloku oraz łącznej liczby bloków na dysku. Przy liczbie bloków nie większej niż 255, wartości extent mask kształtują się jak następuje:

  • $00 dla bloku 1k
  • $01 dla 2k
  • $03 dla 4k
  • $07 dla 8k
  • $0f dla 16k

Gdy łączna liczba bloków na dysku przekracza 255, numery bloków stają się dwubajtowe, a co za tym idzie, jeden wpis katalogowy obejmuje ich dwakroć mniej. W związku z tym, żeby wpis katalogowy nadal obejmował minimum 16k danych pliku, zwiększeniu musi też ulec minimalna wielkość bloku. Wartości extent mask są wtedy następujące:

  • $00 dla bloku 2k
  • $01 dla 4k
  • $03 dla 8k
  • $07 dla 16k

W Indus CP/M extent mask ma wartość $00.

$05-$06 dsm

Liczba bloków na dysku, odjąć 1. W Indus CP/M: 84 w SD i 170 w DD.

$07-$08 drm

Liczba wpisów w katalogu, odjąć 1. W Indus CP/M: 31 dla SD, 63 dla DD.

$09-$0A al0-al1

Mapa alokacji katalogu. Interpretowana jest jako seria bitów (mł. bajt w kolejności 7-0, potem starszy bajt tak samo) reprezentująca 16 kolejnych bloków znajdujących się za ścieżkami zarezerwowanymi (patrz niżej). Bit ustawiony oznacza, że odpowiadający mu blok zajęty jest na katalog.

W Indus CP/M wartości bajtów kolejno: $80,$00 dla SD i $C0,$00 dla DD.

$0B-$0C cks

Check area size: liczba wpisów w katalogu, podzielona przez 4 i zaokrąglona w górę. Jest to minimalna liczba wpisów katalogowych, jakie należy sprawdzić, żeby (z jakimś prawdopodobieństwem) wykryć zmianę dyskietki. Dla twardych dysków ma wynosić 0.

W Indus CP/M: 8 dla SD i 16 dla DD.

$0D-$0E off

Liczba ścieżek zarezerwowanych. Na ogół 2, minimum 1.

Katalog

Katalog zaczyna się za ścieżkami zarezerwowanymi i może zajmować od 1 do 16 kolejnych bloków, wg informacji zapisanej w DPB. Jeden wpis katalogowy liczy 32 bajty. Jego struktura jest następująca:

OffsetEtykietaOpis
$00 UU

Liczba z zakresu 0-15: kod użytkownika (ang. user number). Pozwala to na istnienie wielu plików o tej samej nazwie na jednej dyskietce. Poszczególni użytkownicy nie "widzą" plików tworzonych przez innych.

Gdy kod użytkownika jest równy $E5, oznacza to plik skasowany.

$01-$08 F1-F7

Nazwa pliku. Musi się składać z 7-bitowych znaków ASCII. W nazwie pliku (oraz rozszerzeniu) nie należy używać następujących znaków: _ < > . , ; : = ? * [ ] % | ( ) / \ oraz spacji.

$09-$0B T1-T3

Rozszerzenie nazwy pliku. Dozwolony jest ten sam zestaw znaków co w nazwie pliku (powyżej).

Gdy pierwszy bajt rozszerzenia ma ustawiony bit 7, oznacza to, że plik jest zabezpieczony przed zapisem. To samo w drugim bajcie oznacza "plik systemowy" (czyli ukryty), a w trzecim "plik zarchiwizowany" (czyli nie ruszany od czasu zrobienia ostatniej kopii zapasowej).

$0C EX

Młodszy bajt tzw. extent counter (patrz niżej). Bity 0-4 zawierają pięć młodszych bitów extent counter, bity 5-7 są niewykorzystane.

$0D S1

Bajt zarezerwowany, równy $00. Późniejsze wersje CP/M przechowują tu liczbę bajtów w ostatnim rekordzie obejmowanym przez bieżący wpis katalogowy, przy czym, dla zgodności z CP/M 2.x, wartość $00 oznacza 128 bajtów. Pozwala to na zapisanie na dysku wielkości pliku z dokładnością do 1 bajtu (a nie do 1 rekordu, jak w CP/M 1.x i 2.x).

$0E S2

Starszy bajt extent counter: bity 0-5 zawierają bity 6-11 tej wartości, bity 6-7 są niewykorzystane.

Gdy długość pliku jest większa niż to być może wykazane w pojedycznym wpisie katalogowym (czyli, na dyskietce, ponad 16k), tworzone są następne wpisy dotyczące tego samego pliku. Do ich odróżniania służy extent counter, według wzoru:

entry_number = ((32 * S2) + EX) / (extent_mask + 1)

Maksymalna wartość extent counter w CP/M 2.2 wynosi 511.

$0F RC

Record count. Młodszy bajt liczby rekordów pliku obejmowanej przez ten wpis katalogowy. Liczbę rekordów w danym wpisie oblicza się wg. wzoru:

num_records = extent_mask * 128 + RC

Gdy record count ma wartość $80, oznacza to, że bieżący wpis katalogowy jest całkowicie wypełniony, a dalsza część pliku, o ile w ogóle istnieje, jest opisana przez następny wpis opiewający na ten sam plik. Wpisy rozróżniane są na podstawie wartości extent counter (patrz wyżej).

$10-$1F AL

Numery kolejnych bloków zajętych przez plik. Gdy całkowita liczba bloków na dysku jest mniejsza niż 256, numery bloków są jednobajtowe, w przeciwnym razie dwubajtowe (młodszy/starszy). Wartość $00 oznacza blok nieprzypisany. Numery bloków liczone są od początku katalogu, np. w Indus CP/M, na dyskietce w podwójnej gęstości, blok 0 stanowią sektory 37-40, blok 1 - sektory 41-44 (oba bloki zajmuje katalog), a dopiero od bloku nr 2 zapisuje się dane.

Przeplot

Jednym z istotnych parametrów, które nie są zapisane nigdzie na dysku, ale mogą być narzucone przez BIOS, jest przeplot. Inaczej niż w przypadku przeplotów zwykle stosowanych na Atari, nie chodzi tu o fizyczną kolejność sektorów na ścieżce, ustalaną podczas formatowania (ang. hardware skew), lecz o przeplot logiczny, uzyskiwany metodą translacji numerów sektorów wewnątrz systemu operacyjnego (ang. software skew). O ile skutkiem zastosowania złego przeplotu fizycznego jest tylko to, że dane odczytują się (bądź zapisują) wolniej, o tyle źle ustawiony przeplot logiczny powoduje, że dyskietka w ogóle nie da się odczytać prawidłowo. Innymi słowy, dostęp do dyskietki zapisanej na innej implementacji CP/M może wymagać wiedzy na temat używanego tam przeplotu (doświadczony użytkownik może to od biedy ustalić metodą prób i błędów).

Indus CP/M używa przeplotu software'owego dla dyskietek sformatowanych w pojedynczej gęstości. Wartość przeplotu jest ustalona na 5, co daje następującą kolejność sektorów na ścieżce: 1, 6, 11, 16, 3, 8, 13, 18, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14. W gęstości podwójnej przeplot ma wartość 1 (co oznacza jego brak).

Zobacz też

Personal tools