ATR

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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

  • bit 4 = 1 - obraz z zabezpieczeniami
  • bit 5 = 1 - ochrona przed zapisem
$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

  • bit 0 = 1 - obraz tylko do odczytu.
  • bit 1 = 1 - pole dwCRC zawiera ważną sumę kontrolną

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.

  1. "_" oznacza, że zawartość bajtu nie ma znaczenia, "T" oznacza brak odpowiedzi (TIMEOUT u odbiorcy).
  2. Czas mierzony jest w 55 ms jednostkach (ang. "jiffy" - odwrotność 18.2 Hz).

Narzędzia

Zobacz też


Ten artykuł to tylko zalążek. Możesz pomóc rozwojowi Atariki poprzez rozszerzenie go o więcej informacji.

Personal tools