Format CP/M 2.2

From Atariki

Revision as of 09:35, 23 wrz 2012; view current revision
←Older revision | Newer revision→
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 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. Jest to zmniejszona o 1 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
$03

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

  • $07 dla bloku 1k
  • $0F dla bloku 2k
  • $1F dla bloku 4k
  • $3F dla bloku 8k
  • $7F dla bloku 16k
$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. Musi się składać z 7-bitowych znaków ASCII.

$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), a w trzecim "plik zarchiwizowany" (czyli nie ruszany od czasu zrobienia ostatniej kopii zapasowej).

$0C

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

Bajt zarezerwowany, równy $00.

$0E

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

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

$0F

Record count. Liczba rekordów pliku obejmowana przez ten wpis katalogowy, wg. wzoru: (extent_counter & extent_mask) * 128 + record_count, przy czym wartość $00 oznacza 128 rekordów. 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, 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.

Zobacz też

Personal tools