ATR
From Atariki
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, Altirra 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-15 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.
Sektor 128 bajtów
Obrazy dla rozmiaru sektora równego 128 bajtów (SD i ED) mają wszystkie sektory tej samej wielkości. Obliczenia rozmiaru pliku ATR dokonujemy wg następującego wzoru:
rozmiar_pliku_atr = (liczba_sektorów * 128)+16
Dane konkretnego sektora będą się znajdować na pozycji obliczonej wg następującego wzoru:
offset = ((nr_sektora - 1) * 128) + 16
Sektor 256 bajtów
W tym formacie panuje zamieszanie, którego praprzyczyną jest próba zaoszczędzenia 384 bajtów, jakie marnują się w obszarze odczytu wstępnego dyskietek DD.
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órym "rzeczywiste" dane sektorów zajmują pierwsze 384 bajty, a druga jego połówka jest niewykorzystana (ale jest uwzględniona w wykazanej nagłówkiem wielkości obrazu liczonej w paragrafach - dla obrazu 180k będzie ta wielkość wynosiła $2D00).
 - jako trzech porcji danych po 128 bajtów (w tym wypadku wielkość obrazu zapisana w nagłówku będzie o 24 paragrafy mniejsza niż powyżej).
 
Ten drugi format uchodzi za prawidłowy, w tej sytuacji sektor nr 4 (i każdy dalszy) 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
Obliczenia rozmiaru pliku ATR dokonujemy wg następującego wzoru:
rozmiar_pliku_atr = ((liczba_sektorów - 3) * 256) + 384 + 16
Dane konkretnego sektora będą się znajdować na pozycji obliczonej wg następujących wzorów:
- dla sektorów 1-3:
 
offset = ((nr_sektora - 1) * 128) + 16
- dla pozostałych sektorów:
 
offset = ((nr_sektora - 4) * 256) + 384 + 16
Program może łatwo rozróżnić te dwa typy po nagłówku: jeśli wielkość sektora wynosi $0100, trzeba sprawdzić, czy najmłodszy półbajt liczby paragrafów jest równy 0 (typ 1) czy 8 (typ 2).
Istnieje jeszcze trzeci rodzaj plików ATR: mają one rozmiar pliku i wielkość obrazu jak w przypadku typu 1, lecz dane wewnątrz rozmieszczone są jak w typie 2. Ponieważ nie ma dobrej metody na wykrycie tej sytuacji, mając taki plik najlepiej jest go poprawić odejmując 24 od liczby paragrafów zapisanej w nagłówku.
Sektor 512 bajtów
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). Obliczenia rozmiaru pliku ATR dokonujemy wg następującego wzoru:
rozmiar_pliku_atr = (liczba_sektorów * 512) + 16
Dane konkretnego sektora będą się znajdować na pozycji obliczonej wg następującego wzoru:
offset = ((nr_sektora - 1) * 512) + 16
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 jednostkach po 55 ms (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.
 - SIO2BSD umożliwia tworzenie obrazów ATR.
 - IDE Plus pozwala na dostęp do zawartości pliku ATR z poziomu SpartaDOS X.
 - Franny z pakietu Atari8 tools autorstwa Bobera pozwala na manipulacje plikami ATR w obydwu wariantach.
 - xedisk autorstwa Epiego umożliwia manipulacje plikami ATR.
 
Zobacz też
- Dokumentacja Nicka Kennedy'ego
 - Nagłówek ATR w APE
 - Poradnik opisujący w jaki sposób przegrać obraz ATR na dyskietkę
 
Ten artykuł to tylko zalążek. Możesz pomóc rozwojowi Atariki poprzez rozszerzenie go o więcej informacji.
