ACX
From Atariki
| Wersja z dnia 17:23, 22 mar 2007 Trub (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 18:54, 22 mar 2007 Trub (Dyskusja | wkład) (Rekord informacyjny) Next diff → |
||
| Linia 13: | Linia 13: | ||
| == Rekord kodu == | == Rekord kodu == | ||
| Rekordy takie przechowują kod ładowanego programu. W zależności od typu określają sposób umieszczenia go w pamięci: | 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) | + | * $00 - relokacja poza stroną zerową |
| - | * relokacja na stronie zerowej (typ $0A) | + | * $0A - relokacja na stronie zerowej |
| - | * bez relokacji (typ $01). | + | * $01 - bez relokacji. |
| '''Format rekordu kodu''' | '''Format rekordu kodu''' | ||
| Linia 32: | Linia 32: | ||
| </tr> | </tr> | ||
| </table> | </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 programu, który powinien wynosić $0000. | + | 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 programu, który powinien wynosić $0000. |
| + | |||
| + | == Rekord informacyjny == | ||
| + | Rekordy takie zawierają informacje konieczne do relokowania fragmentu programu zawartego w poprzedzającym rekordzie kodu. Zawierają indeksy (offsety) elementów w kodzie, które ulegają zmianie przy jego przemieszczaniu. W zależności od rodzaju wskazywanych elementów stosuje się następujące typy rekordów informacyjnych: | ||
| + | |||
| + | Dla kodu ładowanego poza stronę zerową: | ||
| + | |||
| + | * $06 - indeksy 2-bajtowych adresów (przy relokacji aktualizowane zostaną oba bajty) | ||
| + | * $02 - indeksy młodszych bajtów (LSB) 2-bajtowych adresów | ||
| + | * $08 - indeksy starszych bajtów (MSB) 2-bajtowych adresów | ||
| + | * $04 - indeksy 1-bajtowych adresów komórek na stronie zerowej | ||
| + | |||
| + | Dla kodu ładowanego na stronę zerową: | ||
| + | |||
| + | * $07 - indeksy 2-bajtowych adresów (przy relokacji aktualizowane zostaną oba bajty) | ||
| + | * $03 - indeksy młodszych bajtów 2-bajtowych adresów | ||
| + | * $09 - indeksy starszych bajtów 2-bajtowych adresów | ||
| + | * $05 - indeksy 1-bajtowych adresów komórek na stronie zerowej. | ||
| + | |||
| + | Struktura rekordu informacyjnego jest inna dla typów relokujących adresy i młodsze bajty niż dla typów relokujących starsze bajty. Dla pierwszego przypadku podaje się odpowiednie indeksy (offsety) elementów w poprzedzającym rekordzie kodu, które podlegają relokacji. | ||
| + | |||
| + | '''Format rekordu informacyjnego dla typów $02,$03,$04,$05,$06,$07''' | ||
| + | <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: 60px;">Indeks 1<br> | ||
| + | (1B)</td> | ||
| + | <td style="width: 60px;">Indeks 2<br> | ||
| + | (1B)</td> | ||
| + | <td style="width: 60px;">Indeks 3<br> | ||
| + | (1B)</td> | ||
| + | <td style="width: 60px;"> ... </td> | ||
| + | </tr> | ||
| + | </table> | ||
| + | Długość powinna mieścić się w zakresie 1-253. | ||
| + | |||
| + | W przypadku relokowania starszych bajtów adresów, do właściwej ich aktualizacji potrzebne jest dodatkowo uwzględnienie wartości młodszych bajtów. Ponieważ w kodzie ich nie musi być, umieszcza się je w rekordzie informacyjnym. | ||
| + | |||
| + | '''Format rekordu informacyjnego dla typów $08,$09 (relokacja starszych bajtów)''' | ||
| + | <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: 60px;">Indeks 1<br> | ||
| + | (1B)</td> | ||
| + | <td style="width: 60px;">LSB 1<br> | ||
| + | (1B)</td> | ||
| + | <td style="width: 60px;">Indeks 2<br> | ||
| + | (1B)</td> | ||
| + | <td style="width: 60px;">LSB 2<br> | ||
| + | (1B)</td> | ||
| + | <td style="width: 60px;"> ... </td> | ||
| + | </tr> | ||
| + | </table> | ||
| + | Długość powinna mieścić się w zakresie 0-255. | ||
| + | |||
| + | Uwzględnienie przy relokacji części adresów (osobno starszy, młodszy bajt) umożliwia m.in. stosowanie w programie konstrukcji typu ''lda #<adres, ldx #>adres'', co nie jest typowe dla innych formatów relokowalnych stosowanych w Atari. Interesujące jest również specjalne potraktowanie strony zerowej, np. typ $04 pozwala poprawnie relokować następujący program: | ||
| + | <pre> | ||
| + | org $600 ;kod poza stroną zerową | ||
| + | lda zvar ;adresowanie strony zerowej | ||
| + | ... | ||
| + | |||
| + | org $80 ;kod na stronie zerowej | ||
| + | zvar .byte 0 | ||
| + | </pre> | ||
| {{stub}} | {{stub}} | ||
Wersja z dnia 18:54, 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). W typowej sytuacji program musi zostać podzielony na porcje po maksymalnie 253 bajty, ponieważ segment nie może opisywać większych fragmentów. Ostatnim rekordem w pliku jest rekord końcowy (End record).
Rekord kodu
Rekordy takie przechowują kod ładowanego programu. W zależności od typu określają sposób umieszczenia go w pamięci:
- $00 - relokacja poza stroną zerową
- $0A - relokacja na stronie zerowej
- $01 - bez relokacji.
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 programu, który powinien wynosić $0000.
Rekord informacyjny
Rekordy takie zawierają informacje konieczne do relokowania fragmentu programu zawartego w poprzedzającym rekordzie kodu. Zawierają indeksy (offsety) elementów w kodzie, które ulegają zmianie przy jego przemieszczaniu. W zależności od rodzaju wskazywanych elementów stosuje się następujące typy rekordów informacyjnych:
Dla kodu ładowanego poza stronę zerową:
- $06 - indeksy 2-bajtowych adresów (przy relokacji aktualizowane zostaną oba bajty)
- $02 - indeksy młodszych bajtów (LSB) 2-bajtowych adresów
- $08 - indeksy starszych bajtów (MSB) 2-bajtowych adresów
- $04 - indeksy 1-bajtowych adresów komórek na stronie zerowej
Dla kodu ładowanego na stronę zerową:
- $07 - indeksy 2-bajtowych adresów (przy relokacji aktualizowane zostaną oba bajty)
- $03 - indeksy młodszych bajtów 2-bajtowych adresów
- $09 - indeksy starszych bajtów 2-bajtowych adresów
- $05 - indeksy 1-bajtowych adresów komórek na stronie zerowej.
Struktura rekordu informacyjnego jest inna dla typów relokujących adresy i młodsze bajty niż dla typów relokujących starsze bajty. Dla pierwszego przypadku podaje się odpowiednie indeksy (offsety) elementów w poprzedzającym rekordzie kodu, które podlegają relokacji.
Format rekordu informacyjnego dla typów $02,$03,$04,$05,$06,$07
| Typ (1B) |
Długość (1B) |
Indeks 1 (1B) |
Indeks 2 (1B) |
Indeks 3 (1B) |
... |
Długość powinna mieścić się w zakresie 1-253.
W przypadku relokowania starszych bajtów adresów, do właściwej ich aktualizacji potrzebne jest dodatkowo uwzględnienie wartości młodszych bajtów. Ponieważ w kodzie ich nie musi być, umieszcza się je w rekordzie informacyjnym.
Format rekordu informacyjnego dla typów $08,$09 (relokacja starszych bajtów)
| Typ (1B) |
Długość (1B) |
Indeks 1 (1B) |
LSB 1 (1B) |
Indeks 2 (1B) |
LSB 2 (1B) |
... |
Długość powinna mieścić się w zakresie 0-255.
Uwzględnienie przy relokacji części adresów (osobno starszy, młodszy bajt) umożliwia m.in. stosowanie w programie konstrukcji typu lda #<adres, ldx #>adres, co nie jest typowe dla innych formatów relokowalnych stosowanych w Atari. Interesujące jest również specjalne potraktowanie strony zerowej, np. typ $04 pozwala poprawnie relokować następujący program:
org $600 ;kod poza stroną zerową
lda zvar ;adresowanie strony zerowej
...
org $80 ;kod na stronie zerowej
zvar .byte 0
Ten artykuł to tylko zalążek. Możesz pomóc rozwojowi Atariki poprzez rozszerzenie go o więcej informacji.
