Format CP/M 2.2

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 16:50, 20 wrz 2012
KMK (Dyskusja | wkład)
(DPB)
← Previous diff
Wersja z dnia 17:02, 20 wrz 2012
KMK (Dyskusja | wkład)
(DPB)
Next diff →
Linia 36: Linia 36:
<tr><td>$02</td><td><p>Tzw. ''block shift'': $03 dla bloku 1k, $04 dla 2k, $05 dla 4k itd.</p></td></tr> <tr><td>$02</td><td><p>Tzw. ''block shift'': $03 dla bloku 1k, $04 dla 2k, $05 dla 4k itd.</p></td></tr>
<tr><td>$03</td><td><p>Tzw. ''block mask'': $07 dla bloku 1k, $0F dla bloku 2k, $1F dla bloku 4k itd. Ogólnie jest to liczba 128-bajtowych rekordów w bloku, odjąć 1.</p></td></tr> <tr><td>$03</td><td><p>Tzw. ''block mask'': $07 dla bloku 1k, $0F dla bloku 2k, $1F dla bloku 4k itd. Ogólnie jest to liczba 128-bajtowych rekordów w bloku, odjąć 1.</p></td></tr>
-<tr><td>$04</td><td><p>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. W Indus CP/M 2.2 ''extent mask'' ma wartość $00.</p></td></tr>+<tr><td>$04</td><td><p>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:</p>
 +* $00 dla 1k
 +* $01 dla 2k
 +* $03 dla 4k
 +* $07 dla 8k
 +* $0f dla 16k
 +<p>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. Wartości ''extent mask'' są wtedy następujące:</p>
 +* $00 dla 2k
 +* $01 dla 4k
 +* $03 dla 8k
 +* $07 dla 16k
 +<p>W Indus CP/M 2.2 ''extent mask'' ma wartość $00.</p></td></tr>
<tr><td>$05-$06</td><td><p>Liczba bloków na dysku, odjąć 1: 84 w [[SD]] i 170 w [[DD]].</p></td></tr> <tr><td>$05-$06</td><td><p>Liczba bloków na dysku, odjąć 1: 84 w [[SD]] i 170 w [[DD]].</p></td></tr>
-<tr><td>$07-$08</td><td><p>Liczba wpisów w katalogu, odjąć 1. W Indus CP/M: 31 dla SD, 63 dla DD</p></td></tr>+<tr><td>$07-$08</td><td><p>Liczba wpisów w katalogu, odjąć 1. W Indus CP/M: 31 dla SD, 63 dla DD.</p></td></tr>
<tr><td>$09-$0A</td><td><p>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. Wartość $0080 dla SD i $00C0 dla DD.</p></td></tr> <tr><td>$09-$0A</td><td><p>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. Wartość $0080 dla SD i $00C0 dla DD.</p></td></tr>
<tr><td>$0B-$0C</td><td><p>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 2.2: 8 dla SD i 16 dla DD.</p></td></tr> <tr><td>$0B-$0C</td><td><p>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 2.2: 8 dla SD i 16 dla DD.</p></td></tr>

Wersja z dnia 17:02, 20 wrz 2012

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 i 256 bajtów
  • Wielkość sektora logicznego (bloku): 1024 bajty
  • Maksymalna pojemność filesystemu: 65536 bloków (64 MB)
  • Maksymalna wielkość pliku: nieograniczona
  • Maksymalna liczba plików na dysku (przy bloku 1k): 512
  • Struktura katalogowa: jednopoziomowa
  • Maksymalna liczba plików w katalogu (przy bloku 1k): 512
  • 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 dyskietki (sektory 1-36 na typowej dyskietce DD) zajmuje kod CP/M. Reszta sektorów zawiera katalog i dane. 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 osiem sektorów w SD i cztery w DD (czyli 1k). Całkowita pojemność dyskietki w SD i DD wynosi odpowiednio 85 i 171 jednostek alokacji.

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:

OffsetOpis
$00-$01

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

$02

Tzw. block shift: $03 dla bloku 1k, $04 dla 2k, $05 dla 4k itd.

$03

Tzw. block mask: $07 dla bloku 1k, $0F dla bloku 2k, $1F dla bloku 4k itd. Ogólnie jest to liczba 128-bajtowych rekordów w bloku, odjąć 1.

$04

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 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. Wartości extent mask są wtedy następujące:

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

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

$05-$06

Liczba bloków na dysku, odjąć 1: 84 w SD i 170 w DD.

$07-$08

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

$09-$0A

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. Wartość $0080 dla SD i $00C0 dla DD.

$0B-$0C

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 2.2: 8 dla SD i 16 dla DD.

$0D-$0E

Liczba ścieżek zarezerwowanych. W Indus CP/M 2.2: 2.

Katalog

Katalog zajmuje osiem sektorów o numerach od 37 do 44 ($0025-$002C). Jeden wpis katalogowy liczy 32 bajty. Jego struktura jest następująca:

OffsetOpis
$00

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

Nazwa pliku.

$09-$0B

Rozszerzenie nazwy pliku. Musi się składać z 7-bitowych znaków ASCII. 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).

$0C

Młodszy bajt tzw. extent counter (patrz niżej).

$0D

Bajt zarezerwowany, równy $00.

$0E

Starszy bajt extent counter. 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 * extent_counter_hi) + extent_counter_lo) / (extent_mask + 1).

$0F

Record count. Liczba rekordów pliku obejmowana przez ten wpis katalogowy, wg. wzoru: (extent_counter & extent_mask) * 128 + record_count. Gdy record count ma wartość $80, oznacza to, że bieżący wpis katalogowy jest całkowicie wypełniony, a dalsza część pliku 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

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, tzn. w Indus CP/M blok 0 stanowią sektory 37-40, blok 1 - sektory 41-44 (oba bloki zajmuje katalog), a dopiero od bloku nr 2 zapisuje się dane.

Zobacz też

Personal tools