<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Format_CP%2FM_2.2</id>
	<title>Format CP/M 2.2 - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Format_CP%2FM_2.2"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Format_CP/M_2.2&amp;action=history"/>
	<updated>2026-10-02T16:57:21Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=Format_CP/M_2.2&amp;diff=1428&amp;oldid=prev</id>
		<title>imported&gt;Atariki recovery: Reconstructed from archived HTML; see provenance manifest</title>
		<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Format_CP/M_2.2&amp;diff=1428&amp;oldid=prev"/>
		<updated>2026-10-01T08:51:48Z</updated>

		<summary type="html">&lt;p&gt;Reconstructed from archived HTML; see provenance manifest&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Formaty systemów plików|Format dyskietki]] zastosowany w [[CP/M|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.&lt;br /&gt;
&lt;br /&gt;
== Cechy ogólne ==&lt;br /&gt;
&lt;br /&gt;
* Dopuszczalne wielkości sektorów fizycznych: 128, 256, 512 bajtów&lt;br /&gt;
* Wielkość sektora logicznego (bloku): 1024, 2048, 4096, 8192 i 16384 bajty&lt;br /&gt;
* Maksymalna pojemność filesystemu: 65536 bloków (1 GB)&lt;br /&gt;
* Maksymalna wielkość pliku: nieograniczona&lt;br /&gt;
* Maksymalna liczba plików na dysku (przy bloku 16k): 8192&lt;br /&gt;
* Struktura katalogowa: jednopoziomowa&lt;br /&gt;
* Maksymalna liczba plików w katalogu (przy bloku 16k): 8192&lt;br /&gt;
* Wielkość wpisu w katalogu: 32 bajty&lt;br /&gt;
* Nazwa pliku: 8+3&lt;br /&gt;
* Metoda linkowania plików: indywidualne mapy plików&lt;br /&gt;
* Metoda alokacji sektorów: zależna od BIOS-u&lt;br /&gt;
&lt;br /&gt;
Pierwsze dwie ścieżki typowej dyskietki (w Atari: sektory 1-36) zajmuje kod CP/M (na dyskietce nietypowej - tzw. &amp;#039;&amp;#039;data disk&amp;#039;&amp;#039; - 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.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;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).&amp;#039;&amp;#039;&amp;#039; Ma to na celu, przy odpowiedniej konfiguracji, udostępnienie danych innym implementacjom CP/M.&lt;br /&gt;
&lt;br /&gt;
== Jednostka alokacji ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Jedną ze stosowanych jednostek miar jest &amp;quot;rekord&amp;quot;. Jest to umowna wielkość wynosząca 128 bajtów (historycznie: wielkość sektora na dyskietce ośmiocalowej).&lt;br /&gt;
&lt;br /&gt;
== DPB ==&lt;br /&gt;
&lt;br /&gt;
Parametry dysku przechowywane są w tzw. DPB (ang. &amp;#039;&amp;#039;disk parameter block&amp;#039;&amp;#039;). 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.&lt;br /&gt;
&lt;br /&gt;
Struktura DPB jest następująca:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Offset&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Etykieta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Opis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| $00-$01&lt;br /&gt;
| spt&lt;br /&gt;
| Liczba 128-bajtowych rekordów na ścieżkę. W Indus CP/M: 18 w SD i 36 w DD.&lt;br /&gt;
|-&lt;br /&gt;
| $02&lt;br /&gt;
| bsh&lt;br /&gt;
| Tzw. &amp;#039;&amp;#039;block shift&amp;#039;&amp;#039;. Jest to wartość określająca, ile razy należy 128 pomnożyć przez 2, żeby uzyskać wielkość bloku:&lt;br /&gt;
&lt;br /&gt;
* $03 dla bloku 1k&lt;br /&gt;
* $04 dla 2k&lt;br /&gt;
* $05 dla 4k&lt;br /&gt;
* $06 dla 8k&lt;br /&gt;
* $07 dla 16k&lt;br /&gt;
&lt;br /&gt;
W Indus CP/M: $03.&lt;br /&gt;
|-&lt;br /&gt;
| $03&lt;br /&gt;
| blm&lt;br /&gt;
| Tzw. &amp;#039;&amp;#039;block mask&amp;#039;&amp;#039;. Jest to liczba 128-bajtowych rekordów w bloku, odjąć 1:&lt;br /&gt;
&lt;br /&gt;
* $07 dla bloku 1k&lt;br /&gt;
* $0F dla 2k&lt;br /&gt;
* $1F dla 4k&lt;br /&gt;
* $3F dla 8k&lt;br /&gt;
* $7F dla 16k&lt;br /&gt;
&lt;br /&gt;
W Indus CP/M: $07&lt;br /&gt;
|-&lt;br /&gt;
| $04&lt;br /&gt;
| exm&lt;br /&gt;
| Tzw. &amp;#039;&amp;#039;extent mask&amp;#039;&amp;#039;. Jest to zmniejszona o jeden liczba 16-kilobajtowych &amp;quot;porcji&amp;quot; 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 &amp;#039;&amp;#039;extent mask&amp;#039;&amp;#039; kształtują się jak następuje:&lt;br /&gt;
&lt;br /&gt;
* $00 dla bloku 1k&lt;br /&gt;
* $01 dla 2k&lt;br /&gt;
* $03 dla 4k&lt;br /&gt;
* $07 dla 8k&lt;br /&gt;
* $0f dla 16k&lt;br /&gt;
&lt;br /&gt;
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 &amp;#039;&amp;#039;extent mask&amp;#039;&amp;#039; są wtedy następujące:&lt;br /&gt;
&lt;br /&gt;
* $00 dla bloku 2k&lt;br /&gt;
* $01 dla 4k&lt;br /&gt;
* $03 dla 8k&lt;br /&gt;
* $07 dla 16k&lt;br /&gt;
&lt;br /&gt;
W Indus CP/M &amp;#039;&amp;#039;extent mask&amp;#039;&amp;#039; ma wartość $00.&lt;br /&gt;
|-&lt;br /&gt;
| $05-$06&lt;br /&gt;
| dsm&lt;br /&gt;
| Liczba bloków na dysku, odjąć 1. W Indus CP/M: 84 w SD i 170 w DD.&lt;br /&gt;
|-&lt;br /&gt;
| $07-$08&lt;br /&gt;
| drm&lt;br /&gt;
| Liczba wpisów w katalogu, odjąć 1. W Indus CP/M: 31 dla SD, 63 dla DD.&lt;br /&gt;
|-&lt;br /&gt;
| $09-$0A&lt;br /&gt;
| al0-al1&lt;br /&gt;
| 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.&lt;br /&gt;
&lt;br /&gt;
W Indus CP/M wartości bajtów kolejno: $80,$00 dla SD i $C0,$00 dla DD.&lt;br /&gt;
|-&lt;br /&gt;
| $0B-$0C&lt;br /&gt;
| cks&lt;br /&gt;
| &amp;#039;&amp;#039;Check area size&amp;#039;&amp;#039;: 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.&lt;br /&gt;
&lt;br /&gt;
W Indus CP/M: 8 dla SD i 16 dla DD.&lt;br /&gt;
|-&lt;br /&gt;
| $0D-$0E&lt;br /&gt;
| off&lt;br /&gt;
| Liczba ścieżek zarezerwowanych. Na ogół 2, minimum 1.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Katalog ==&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Offset&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Etykieta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Opis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| $00&lt;br /&gt;
| UU&lt;br /&gt;
| Liczba z zakresu 0-15: kod użytkownika (ang. &amp;#039;&amp;#039;user number&amp;#039;&amp;#039;). Pozwala to na istnienie wielu plików o tej samej nazwie na jednej dyskietce. Poszczególni użytkownicy nie &amp;quot;widzą&amp;quot; plików tworzonych przez innych.&lt;br /&gt;
&lt;br /&gt;
Gdy kod użytkownika jest równy $E5, oznacza to plik skasowany.&lt;br /&gt;
|-&lt;br /&gt;
| $01-$08&lt;br /&gt;
| F1-F7&lt;br /&gt;
| Nazwa pliku. Musi się składać z 7-bitowych znaków ASCII. W nazwie pliku (oraz rozszerzeniu) &amp;#039;&amp;#039;nie należy&amp;#039;&amp;#039; używać następujących znaków: _ &amp;lt; &amp;gt; . , ; : = ? * [ ] % | ( ) / \ oraz spacji.&lt;br /&gt;
|-&lt;br /&gt;
| $09-$0B&lt;br /&gt;
| T1-T3&lt;br /&gt;
| Rozszerzenie nazwy pliku. Dozwolony jest ten sam zestaw znaków co w nazwie pliku (powyżej).&lt;br /&gt;
&lt;br /&gt;
Gdy pierwszy bajt rozszerzenia ma ustawiony bit 7, oznacza to, że plik jest zabezpieczony przed zapisem. To samo w drugim bajcie oznacza &amp;quot;plik systemowy&amp;quot; (czyli ukryty), a w trzecim &amp;quot;plik zarchiwizowany&amp;quot; (czyli nie ruszany od czasu zrobienia ostatniej kopii zapasowej).&lt;br /&gt;
|-&lt;br /&gt;
| $0C&lt;br /&gt;
| EX&lt;br /&gt;
| Młodszy bajt tzw. &amp;#039;&amp;#039;extent counter&amp;#039;&amp;#039; (patrz niżej). Bity 0-4 zawierają pięć młodszych bitów &amp;#039;&amp;#039;extent counter&amp;#039;&amp;#039;, bity 5-7 są niewykorzystane.&lt;br /&gt;
|-&lt;br /&gt;
| $0D&lt;br /&gt;
| S1&lt;br /&gt;
| 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).&lt;br /&gt;
|-&lt;br /&gt;
| $0E&lt;br /&gt;
| S2&lt;br /&gt;
| Starszy bajt &amp;#039;&amp;#039;extent counter&amp;#039;&amp;#039;: bity 0-5 zawierają bity 6-11 tej wartości, bity 6-7 są niewykorzystane.&lt;br /&gt;
&lt;br /&gt;
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 &amp;#039;&amp;#039;extent counter&amp;#039;&amp;#039;, według wzoru:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;entry_number = ((32 * S2) + EX) / (extent_mask + 1)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Maksymalna wartość &amp;#039;&amp;#039;extent counter&amp;#039;&amp;#039; w CP/M 2.2 wynosi 511.&lt;br /&gt;
|-&lt;br /&gt;
| $0F&lt;br /&gt;
| RC&lt;br /&gt;
| &amp;#039;&amp;#039;Record count&amp;#039;&amp;#039;. Młodszy bajt liczby rekordów pliku obejmowanej przez ten wpis katalogowy. Liczbę rekordów w danym wpisie oblicza się wg. wzoru:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;num_records = extent_mask * 128 + RC&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Gdy &amp;#039;&amp;#039;record count&amp;#039;&amp;#039; 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 &amp;#039;&amp;#039;extent counter&amp;#039;&amp;#039; (patrz wyżej).&lt;br /&gt;
|-&lt;br /&gt;
| $10-$1F&lt;br /&gt;
| AL&lt;br /&gt;
| 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.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Przeplot ==&lt;br /&gt;
&lt;br /&gt;
Jednym z istotnych parametrów, które nie są zapisane nigdzie na dysku, ale mogą być narzucone przez BIOS, jest [[Przeplot|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. &amp;#039;&amp;#039;hardware skew&amp;#039;&amp;#039;), lecz o przeplot logiczny, uzyskiwany metodą translacji numerów sektorów wewnątrz systemu operacyjnego (ang. &amp;#039;&amp;#039;software skew&amp;#039;&amp;#039;). 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).&lt;br /&gt;
&lt;br /&gt;
Indus CP/M używa przeplotu software&amp;#039;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).&lt;br /&gt;
&lt;br /&gt;
== Zobacz też ==&lt;br /&gt;
&lt;br /&gt;
* [[CP/M]]&lt;br /&gt;
* [[Formaty systemów plików]]&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Atari 8-bit]]&lt;br /&gt;
[[Kategoria:CP/M]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>