Format CP/M 2.2

From Atariki

Revision as of 15:56, 5 paź 2009; 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 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: 63
  • Struktura katalogowa: jednopoziomowa
  • Maksymalna liczba plików w katalogu: 63
  • 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 (patrz niżej). W Indus CP/M 2.2 wynosi $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ę. 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