ACX
From Atariki
Wersja z dnia 13:10, 22 mar 2007 Trub (Dyskusja | wkład) (Ogólna struktura pliku) ← Previous diff |
Wersja z dnia 13:48, 22 mar 2007 Trub (Dyskusja | wkład) (Rekordy kodu) Next diff → |
||
Linia 9: | Linia 9: | ||
== Ogólna struktura pliku == | == Ogólna struktura pliku == | ||
- | Właściwą strukturę pliku stanowią segmenty, z których każdy dotyczy pewnego fragmentu ładowanego programu. Segment jest podzielony na rekordy, z których pierwszy zawiera kod lub dane programu (''Text record''), zaś dalej następują rekordy informacyjne, określające parametry dla relokatora (''Information records''). Segmentów w pliku jest zazwyczaj wiele, ponieważ każdy z nich umożliwia załadowanie co najwyżej 255 bajtów programu. Ostatnim rekordem w pliku jest rekord końcowy (''End record''). | + | Właściwą strukturę pliku stanowią segmenty, z których każdy dotyczy pewnego fragmentu ładowanego programu. Segment jest podzielony na rekordy, z których pierwszy zawiera kod lub dane programu (''Text record'', zwany dalej ''rekordem kodu''), zaś dalej następują rekordy informacyjne, określające parametry dla relokatora (''Information records''). Segmentów w pliku jest zazwyczaj wiele, ponieważ każdy z nich umożliwia załadowanie co najwyżej 253 bajtów programu. Ostatnim rekordem w pliku jest rekord końcowy (''End record''). |
+ | |||
+ | == Rekordy kodu == | ||
+ | Rekordy takie przechowują kod ładowanego programu. W zależności od typu określają sposób umieszczenia go w pamięci: | ||
+ | * relokacja poza stroną zerową (typ $00) | ||
+ | * relokacja na stronie zerowej (typ $0A) | ||
+ | * bez relokacji (typ $01). | ||
+ | |||
+ | '''Format rekordu kodu''' | ||
+ | <table | ||
+ | style="text-align: left; width: 573px;" border="1" | ||
+ | cellpadding="2" cellspacing="2"> | ||
+ | <tr> | ||
+ | <td style="width: 60px;">Typ<br> | ||
+ | (1B)</td> | ||
+ | <td style="width: 60px;">Długość<br> | ||
+ | (1B)</td> | ||
+ | <td style="width: 120px;">Adres | ||
+ | względny lub bezwzględny (2B)</td> | ||
+ | <td style="width: 300px;">Kod | ||
+ | programu (max. 253B)</td> | ||
+ | </tr> | ||
+ | </table> | ||
+ | Na długość składają się, oprócz kodu programu także 2 bajty adresu, stąd powinna się mieścić w zakresie 2-255. Adres bezwględny dotyczy miejsca umieszczenia w pamięci kodu nierelokowanego (typ $01). Dla kodu relokowalnego adres względny określa jego przemieszczenie względem adresu bazowego $0000. | ||
{{stub}} | {{stub}} |
Wersja z dnia 13:48, 22 mar 2007
ACX - od ang. Amy Chen Executable - jest formatem pliku przeznaczonym do przechowywania relokowalnych binariów. Format ten został stworzony dla doładowywanych z zewnątrz handlerów urządzeń podłączonych do łącza szeregowego (SIO) oraz szyny równoległej (PBI), zwłaszcza ekspandera 1090.
Procedury obsługujące ten format znajdują się w XL OS, w każdym seryjnym egzemplarzu 1200XL, 600XL, 800XL, 65XE i 130XE. System korzysta z nich podczas ładowania sterowników (handlerów) z podłączonych urządzeń, np. z modułu 1090. Objawem tego jest znane wszystkim posiadaczom Atari "pierdzenie" wydobywające się z głośnika monitora przy starcie systemu oraz przy odwołaniu do urządzenia niezarejestrowanego w CIO. Jest to próba skomunikowania się z urządzeniami peryferyjnymi w celu ściągnięcia odpowiednich sterowników.
Zamierzeniem twórców była dostępność procedury relokującej dla programistów. Planowane było umieszczenie legalnego skoku pod adresem $E486, umożliwiającego relokowanie "zwykłych" programów. Niestety, z niewiadomych przyczyn zrezygnowano z tego rozwiązania. W systemie operacyjnym DracOS od wersji 2.22 przywrócono w tablicy skoków legalne odwołanie do procedury relokatora. Skok do niej umieszczono jednak pod adresem $E483, ze względu na zajęcie pierwotnego adresu przez inną procedurę.
Loader i związany z nim format binarny zostały przeanalizowane przez Truba w 2006 roku na podstawie dokumentacji pochodzącej z Atari, pod którą podpisana jest niejaka Amy Chen. Stąd pochodzi nadana formatowi nieoficjalna nazwa.
Ogólna struktura pliku
Właściwą strukturę pliku stanowią segmenty, z których każdy dotyczy pewnego fragmentu ładowanego programu. Segment jest podzielony na rekordy, z których pierwszy zawiera kod lub dane programu (Text record, zwany dalej rekordem kodu), zaś dalej następują rekordy informacyjne, określające parametry dla relokatora (Information records). Segmentów w pliku jest zazwyczaj wiele, ponieważ każdy z nich umożliwia załadowanie co najwyżej 253 bajtów programu. Ostatnim rekordem w pliku jest rekord końcowy (End record).
Rekordy kodu
Rekordy takie przechowują kod ładowanego programu. W zależności od typu określają sposób umieszczenia go w pamięci:
- relokacja poza stroną zerową (typ $00)
- relokacja na stronie zerowej (typ $0A)
- bez relokacji (typ $01).
Format rekordu kodu
Typ (1B) |
Długość (1B) |
Adres względny lub bezwzględny (2B) | Kod programu (max. 253B) |
Na długość składają się, oprócz kodu programu także 2 bajty adresu, stąd powinna się mieścić w zakresie 2-255. Adres bezwględny dotyczy miejsca umieszczenia w pamięci kodu nierelokowanego (typ $01). Dla kodu relokowalnego adres względny określa jego przemieszczenie względem adresu bazowego $0000.
Ten artykuł to tylko zalążek. Możesz pomóc rozwojowi Atariki poprzez rozszerzenie go o więcej informacji.