ATR
From Atariki
Wersja z dnia 18:57, 3 paź 2011 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 13:05, 4 paź 2011 Mono (Dyskusja | wkład) (zabezpieczenia atr sio2pc) Next diff → |
||
Linia 241: | Linia 241: | ||
Ten drugi format uchodzi za prawidłowy, w tej sytuacji sektor nr 4 zapisywany jest w pliku o 384 bajty wcześniej niż wynikałoby to z prostego obliczenia wzoru: | Ten drugi format uchodzi za prawidłowy, w tej sytuacji sektor nr 4 zapisywany jest w pliku o 384 bajty wcześniej niż wynikałoby to z prostego obliczenia wzoru: | ||
- | <code>((nr_sektora-1)*wielkość_sektora)+wielkość_nagłówka</code> | + | ((nr_sektora-1) * wielkość_sektora) + wielkość_nagłówka |
Z kolei obrazy dla rozmiaru sektora równego 512 bajtów ([[Formaty_dyskietek#DD_512|DD 512]]) mają, podobnie jak te z sektorami 128-bajtowymi, wszystkie sektory tej samej wielkości - nie ma wyróżnionego obszaru odczytu wstępnego (zajmuje on zresztą tylko jeden sektor, pierwszy). | Z kolei obrazy dla rozmiaru sektora równego 512 bajtów ([[Formaty_dyskietek#DD_512|DD 512]]) mają, podobnie jak te z sektorami 128-bajtowymi, wszystkie sektory tej samej wielkości - nie ma wyróżnionego obszaru odczytu wstępnego (zajmuje on zresztą tylko jeden sektor, pierwszy). | ||
Linia 247: | Linia 247: | ||
== Weryfikacja poprawności == | == Weryfikacja poprawności == | ||
- | Od wersji 1.10 w APE wprowadzono mechanizm określania poprawności obrazu ATR (może on służyć np. do weryfikowania błędów powstałych przy ściąganiu obrazu z sieci). Mechanizm ten bazuje na algorytmie obliczania 32-bitowego [http://en.wikipedia.org/wiki/Cyclic_redundancy_check CRC] stosowanego np. z [http://pl.wikipedia.org/wiki/PKZIP PKZIP]. | + | Od wersji 1.10 w APE wprowadzono mechanizm określania poprawności obrazu ATR (może on służyć np. do weryfikowania błędów powstałych przy ściąganiu obrazu z sieci). Mechanizm ten bazuje na algorytmie obliczania 32-bitowego [http://en.wikipedia.org/wiki/Cyclic_redundancy_check CRC] stosowanego np. w [http://pl.wikipedia.org/wiki/PKZIP PKZIP]. |
- | Jeśli obraz jest "opieczętowany" (bit 1 btFlags jest ustawiony) wtedy dla określenia poprawności obrazu należy obliczyć 32-bitową wartość CRC z każdego jego bajtu łącznie z nagłówkiem (zakłada się, że bajty 7..14 są wyzerowane). Jeśli obliczony kod jest identyczny z wartością zapisaną w polu dwCRC można założyć, że obraz jest nieuszkodzony. | + | Jeśli obraz jest "opieczętowany" (bit 1 btFlags jest ustawiony) wtedy dla określenia poprawności obrazu należy obliczyć 32-bitową wartość CRC z każdego jego bajtu łącznie z nagłówkiem (zakłada się, że bajty o offsetach 7..14 są wyzerowane). Jeśli obliczony kod jest identyczny z wartością zapisaną w polu dwCRC można założyć, że obraz jest nieuszkodzony. |
CRC32 dany jest wielomianem: | CRC32 dany jest wielomianem: | ||
- | CRC32 = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1 | + | x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1 |
czyli $04C11DB7 w notacji "najpierw MSB". | czyli $04C11DB7 w notacji "najpierw MSB". | ||
+ | |||
+ | == Zabezpieczenia == | ||
+ | |||
+ | W wersji 4.05 SIO2PC wprowadzono możliwość symulowania zabezpieczeń dla sektorów na dysku. | ||
+ | |||
+ | Jeśli bit 4 btFlags jest ustawiony, wtedy począwszy od sektora podanego w wBad występują sektory z zabezpieczeniami. | ||
+ | |||
+ | Sektor zamiast danych zawiera wtedy informacje o użytych zabezpieczeniach: | ||
+ | |||
+ | <table BORDER="1" cellpadding="5" WIDTH="100%" cellspacing="0"> | ||
+ | <tr> | ||
+ | <th>Offset</th> | ||
+ | <TH>Typ</TH> | ||
+ | <TH>Nazwa</TH> | ||
+ | <TH>Opis</TH> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$00</td> | ||
+ | <td width="10%" align="center"> | ||
+ | DWORD | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | dwSign | ||
+ | </td> | ||
+ | <td> | ||
+ | Kolejno wartości: $C2, $1C, $3D i $1E (sygnatura sektora z zabezpieczeniami). | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$04</td> | ||
+ | <td width="10%" align="center"> | ||
+ | BYTE[4] | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | btaErrStatus | ||
+ | </td> | ||
+ | <td> | ||
+ | 4 bajty zwracane przez komendę STATUS ("S" = $53) SIO (podane w odwrotnej kolejności), po próbie odczytu <b>BŁĘDNEGO</b> sektora. | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$08</td> | ||
+ | <td width="10%" align="center"> | ||
+ | BYTE | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | btCmdResp | ||
+ | </td> | ||
+ | <td> | ||
+ | Status zwracany po otrzymaniu komendy ("A" lub "N").[1] | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$09</td> | ||
+ | <td width="10%" align="center"> | ||
+ | BYTE | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | btDataResp | ||
+ | </td> | ||
+ | <td> | ||
+ | Status zwracany po otrzymaniu bloku danych ("C" lub "A"/"E").[1] | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$0A</td> | ||
+ | <td width="10%" align="center"> | ||
+ | BYTE | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | btChksumInfo | ||
+ | </td> | ||
+ | <td> | ||
+ | Informacja o sumie kontrolnej ("G" - poprawna, lub "B" - błędna).[1] | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$0B</td> | ||
+ | <td width="10%" align="center"> | ||
+ | BYTE | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | btResDelay | ||
+ | </td> | ||
+ | <td> | ||
+ | Czas, po którym ma zostać wysłana odpowiedź na odczyt ("R") bądź zapis ("P"/"W") <b>POPRAWNEGO</b> sektora.[2] | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$0C</td> | ||
+ | <td width="10%" align="center"> | ||
+ | BYTE | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | btErrResDelay | ||
+ | </td> | ||
+ | <td> | ||
+ | Czas, po którym ma zostać wysłana odpowiedź na odczyt ("R") <b>BŁĘDNEGO</b> sektora.[2] | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | <tr> | ||
+ | <td>$0D</td> | ||
+ | <td width="10%" align="center"> | ||
+ | BYTE[4] | ||
+ | </td> | ||
+ | <td width="10%" align="center"> | ||
+ | btaStatus | ||
+ | </td> | ||
+ | <td> | ||
+ | 4 bajty zwracane przez komendę STATUS ("S" = $53) SIO (podane w odwrotnej kolejności), po próbie odczytu <b>POPRAWNEGO</b> sektora. | ||
+ | </td> | ||
+ | </tr> | ||
+ | |||
+ | </table> | ||
+ | |||
+ | # "_" oznacza, że zawartość bajtu nie ma znaczenia, "T" oznacza brak odpowiedzi (TIMEOUT u odbiorcy). | ||
+ | # Czas mierzony jest w 55 ms jednostkach (ang. "jiffy" - odwrotność 18.2 Hz). | ||
== Narzędzia == | == Narzędzia == |
Wersja z dnia 13:05, 4 paź 2011
Obraz dyskietki 8-bitowego Atari używany w emulatorach, APE itp. opracowany przez Nicka Kennedy'ego.
Istnieje też odmiana ATZ, jest to obraz dyskietki w formacie ATR skompresowany przy pomocy programu gzip. Format ATZ (i ATR też) jest obsługiwany przez emulatory Atari800 oraz Atari800Win PLus.
Spis treści |
Nagłówek
16 bajtów zgodnie z poniższą tabelką. Istnieją dwie wersje, pierwsze siedem bajtów ma takie samo znaczenie w obu:
Nagłówek SIO2PC
Offset | Typ | Nazwa | Opis |
---|---|---|---|
$00 |
WORD |
wMagic |
Kolejno wartości: $96 i $02 ($0296, suma 'NICKATARI') |
$02 |
WORD |
wPars |
Rozmiar obrazu (bez nagłówka), liczony w paragrafach: innymi słowy rozmiar w bajtach podzielić przez 16. |
$04 |
WORD |
wSecSize |
Rozmiar sektora w bajtach: $80, $0100 lub $0200. |
$06 |
WORD |
wParsHigh |
Najstarsze słowo rozmiaru w paragrafach (wprowadzono w REV 3.00). |
$08 |
BYTE |
btFlags |
|
$09 |
WORD |
wBad |
Numer pierwszego sektora z zabezpieczeniami (jeśli bit 4 btFlags jest ustawiony). |
$0B |
DWORD |
dwUnused |
Cztery bajty nieużywane, równe $00. |
$0F |
BYTE |
btUnused |
Bajt nieużywany, równy $00. |
Nagłówek APE
Offset | Typ | Nazwa | Opis |
---|---|---|---|
$00 |
WORD |
wMagic |
Kolejno wartości: $96 i $02 ($0296, suma 'NICKATARI') |
$02 |
WORD |
wPars |
Rozmiar obrazu (bez nagłówka), liczony w paragrafach: innymi słowy rozmiar w bajtach podzielić przez 16. |
$04 |
WORD |
wSecSize |
Rozmiar sektora w bajtach: $80, $0100 lub $0200. |
$06 |
BYTE |
btParsHigh |
Najstarszy bajt rozmiaru w paragrafach. |
$07 |
DWORD |
dwCRC |
32-bit CRC pliku. Wartość ta jest ważna jeśli bit 1 bajtu nr 15 (btFlags) jest ustawiony. Występuje od wersji APE 1.10. |
$0B |
DWORD |
dwUnused |
Niewykorzystane. |
$0F |
BYTE |
btFlags |
Pozostałe bity są niewykorzystane i powinny być równe zero. Występuje od wersji APE 1.10. |
Najczęściej się spotyka pliki z nagłówkiem podstawowym, w którym w bajtach 7-16 nagłówka są same zera. Pozostałe na ogół mają nagłówek w formacie APE z ustawionym znacznikiem zabezpieczenia przed zapisem. Plików w pierwszym z wymienionych formatów w zasadzie nie spotyka się.
Treść
Po nagłówku występują po kolei sektory danych.
Dla wielkości sektora równej 256 bajtów występują dwa sposoby zapisania pierwszych trzech sektorów obrazu dysku:
- jako obszaru 768 bajtów, w których "rzeczywiste" dane sektorów zajmują pierwsze 384 bajty, a druga połówka jest niewykorzystana
- jako trzech porcji danych po 128 bajtów
Ten drugi format uchodzi za prawidłowy, w tej sytuacji sektor nr 4 zapisywany jest w pliku o 384 bajty wcześniej niż wynikałoby to z prostego obliczenia wzoru:
((nr_sektora-1) * wielkość_sektora) + wielkość_nagłówka
Z kolei obrazy dla rozmiaru sektora równego 512 bajtów (DD 512) mają, podobnie jak te z sektorami 128-bajtowymi, wszystkie sektory tej samej wielkości - nie ma wyróżnionego obszaru odczytu wstępnego (zajmuje on zresztą tylko jeden sektor, pierwszy).
Weryfikacja poprawności
Od wersji 1.10 w APE wprowadzono mechanizm określania poprawności obrazu ATR (może on służyć np. do weryfikowania błędów powstałych przy ściąganiu obrazu z sieci). Mechanizm ten bazuje na algorytmie obliczania 32-bitowego CRC stosowanego np. w PKZIP.
Jeśli obraz jest "opieczętowany" (bit 1 btFlags jest ustawiony) wtedy dla określenia poprawności obrazu należy obliczyć 32-bitową wartość CRC z każdego jego bajtu łącznie z nagłówkiem (zakłada się, że bajty o offsetach 7..14 są wyzerowane). Jeśli obliczony kod jest identyczny z wartością zapisaną w polu dwCRC można założyć, że obraz jest nieuszkodzony.
CRC32 dany jest wielomianem:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1
czyli $04C11DB7 w notacji "najpierw MSB".
Zabezpieczenia
W wersji 4.05 SIO2PC wprowadzono możliwość symulowania zabezpieczeń dla sektorów na dysku.
Jeśli bit 4 btFlags jest ustawiony, wtedy począwszy od sektora podanego w wBad występują sektory z zabezpieczeniami.
Sektor zamiast danych zawiera wtedy informacje o użytych zabezpieczeniach:
Offset | Typ | Nazwa | Opis |
---|---|---|---|
$00 |
DWORD |
dwSign |
Kolejno wartości: $C2, $1C, $3D i $1E (sygnatura sektora z zabezpieczeniami). |
$04 |
BYTE[4] |
btaErrStatus |
4 bajty zwracane przez komendę STATUS ("S" = $53) SIO (podane w odwrotnej kolejności), po próbie odczytu BŁĘDNEGO sektora. |
$08 |
BYTE |
btCmdResp |
Status zwracany po otrzymaniu komendy ("A" lub "N").[1] |
$09 |
BYTE |
btDataResp |
Status zwracany po otrzymaniu bloku danych ("C" lub "A"/"E").[1] |
$0A |
BYTE |
btChksumInfo |
Informacja o sumie kontrolnej ("G" - poprawna, lub "B" - błędna).[1] |
$0B |
BYTE |
btResDelay |
Czas, po którym ma zostać wysłana odpowiedź na odczyt ("R") bądź zapis ("P"/"W") POPRAWNEGO sektora.[2] |
$0C |
BYTE |
btErrResDelay |
Czas, po którym ma zostać wysłana odpowiedź na odczyt ("R") BŁĘDNEGO sektora.[2] |
$0D |
BYTE[4] |
btaStatus |
4 bajty zwracane przez komendę STATUS ("S" = $53) SIO (podane w odwrotnej kolejności), po próbie odczytu POPRAWNEGO sektora. |
- "_" oznacza, że zawartość bajtu nie ma znaczenia, "T" oznacza brak odpowiedzi (TIMEOUT u odbiorcy).
- Czas mierzony jest w 55 ms jednostkach (ang. "jiffy" - odwrotność 18.2 Hz).
Narzędzia
- Do przygotowania pliku ATR na komputerze PC można użyć programu makeATR autorstwa Soudiego.
- Wtyczka dla programu Total Commander umożliwiająca operowanie na plikach ATR autorstwa Pajero Total Commander ATR Plugin
Zobacz też
Ten artykuł to tylko zalążek. Możesz pomóc rozwojowi Atariki poprzez rozszerzenie go o więcej informacji.