<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=ACX</id>
	<title>ACX - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=ACX"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=ACX&amp;action=history"/>
	<updated>2026-10-02T01:50:13Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=ACX&amp;diff=126&amp;oldid=prev</id>
		<title>imported&gt;Atariki recovery: Reconstructed from archived HTML; see provenance manifest</title>
		<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=ACX&amp;diff=126&amp;oldid=prev"/>
		<updated>2026-10-01T08:51:48Z</updated>

		<summary type="html">&lt;p&gt;Reconstructed from archived HTML; see provenance manifest&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;ACX - od ang. &amp;#039;&amp;#039;Amy Chen eXecutable&amp;#039;&amp;#039; - 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]].&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;pierdzenie&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Zamierzeniem twórców była dostępność procedury relokującej dla programistów. Planowane było umieszczenie oficjalnego skoku pod adresem $E486, umożliwiającego relokowanie &amp;quot;zwykłych&amp;quot; programów. Niestety, z niewiadomych przyczyn zrezygnowano z tego rozwiązania.&lt;br /&gt;
W systemie operacyjnym [[DracOS]] od wersji 2.22 przywrócono w [[Tablica skokó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ę.&lt;br /&gt;
&lt;br /&gt;
Loader i związany z nim format binarny zostały przeanalizowane przez [[Trub|Truba]] w 2006 roku na podstawie dokumentacji pochodzącej z Atari. Według kodu źródłowego autorem procedur obsługi jest Y.M. &amp;quot;Amy&amp;quot; Chen; stąd pochodzi nadana formatowi nieoficjalna nazwa.&lt;br /&gt;
&lt;br /&gt;
== Ogólna struktura pliku ==&lt;br /&gt;
&lt;br /&gt;
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 (&amp;#039;&amp;#039;Text record&amp;#039;&amp;#039;, zwany dalej &amp;#039;&amp;#039;rekordem kodu&amp;#039;&amp;#039;), zaś dalej następują rekordy informacyjne, określające parametry dla relokatora (&amp;#039;&amp;#039;Information records&amp;#039;&amp;#039;). 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 (&amp;#039;&amp;#039;End record&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
Już poza oficjalną specyfikacją przyjęto, że plik dyskowy w formacie ACX zawiera dodatkowo nagłówek (sygnaturę) w dwóch pierwszych bajtach; ich wartości wynoszą kolejno $F0,$FF (nie dotyczy sterowników ładowanych z urządzeń peryferyjnych).&lt;br /&gt;
&lt;br /&gt;
== Rekord kodu ==&lt;br /&gt;
&lt;br /&gt;
Rekordy takie przechowują kod ładowanego programu. W zależności od typu określają sposób umieszczenia go w pamięci:&lt;br /&gt;
&lt;br /&gt;
* $00 - relokacja poza stroną zerową&lt;br /&gt;
* $01 - relokacja na stronie zerowej&lt;br /&gt;
* $0A - bez relokacji.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Format rekordu kodu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: left; &amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Typ&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Długość&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 120px;&amp;quot; | Adres&lt;br /&gt;
względny lub bezwzględny (2 bajty)&lt;br /&gt;
|style=&amp;quot;width: 300px;&amp;quot; | Kod&lt;br /&gt;
programu (max. 253 bajty)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 $0A). Dla kodu relokowalnego adres względny określa jego przemieszczenie względem adresu bazowego programu, który powinien wynosić $0000 (ew. $00 dla kodu na stronie zerowej).&lt;br /&gt;
&lt;br /&gt;
== Rekord informacyjny ==&lt;br /&gt;
&lt;br /&gt;
Rekordy takie zawierają tzw. fixupy, czyli informacje konieczne do relokowania fragmentu programu zawartego w poprzedzającym rekordzie kodu. Są to 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:&lt;br /&gt;
&lt;br /&gt;
Dla kodu ładowanego poza stronę zerową:&lt;br /&gt;
&lt;br /&gt;
* $06 - indeksy 2-bajtowych adresów (przy relokacji aktualizowane zostaną oba bajty)&lt;br /&gt;
* $02 - indeksy młodszych bajtów 2-bajtowych adresów&lt;br /&gt;
* $08 - indeksy starszych bajtów 2-bajtowych adresów&lt;br /&gt;
* $04 - indeksy 1-bajtowych adresów komórek na stronie zerowej&lt;br /&gt;
&lt;br /&gt;
Dla kodu ładowanego na stronę zerową:&lt;br /&gt;
&lt;br /&gt;
* $07 - indeksy 2-bajtowych adresów (przy relokacji aktualizowane zostaną oba bajty)&lt;br /&gt;
* $03 - indeksy młodszych bajtów 2-bajtowych adresów&lt;br /&gt;
* $09 - indeksy starszych bajtów 2-bajtowych adresów&lt;br /&gt;
* $05 - indeksy 1-bajtowych adresów komórek na stronie zerowej.&lt;br /&gt;
&lt;br /&gt;
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 (pierwszy bajt porcji kodu ma indeks 0).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Format rekordu informacyjnego dla typów $02,$03,$04,$05,$06,$07 (relokacja adresów lub młodszych bajtów)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: left; &amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Typ&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Długość&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Indeks 1&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Indeks 2&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Indeks 3&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Długość powinna mieścić się w zakresie 1-253.&lt;br /&gt;
&lt;br /&gt;
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 (LSB). Ponieważ w kodzie może ich nie być, umieszcza się je w rekordzie informacyjnym.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Format rekordu informacyjnego dla typów $08,$09 (relokacja starszych bajtów)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: left; &amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Typ&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Długość&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Indeks 1&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | LSB 1&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Indeks 2&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | LSB 2&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Długość powinna mieścić się w zakresie 0-255.&lt;br /&gt;
&lt;br /&gt;
Uwzględnienie przy relokacji części adresów (osobno starszy, młodszy bajt) umożliwia m.in. stosowanie w programie konstrukcji typu &amp;#039;&amp;#039;lda #&amp;lt;adres / ldx #&amp;gt;adres&amp;#039;&amp;#039;, 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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     org $600     ;kod poza stroną zerową&lt;br /&gt;
     lda zvar     ;adresowanie strony zerowej&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
     org $80      ;kod na stronie zerowej&lt;br /&gt;
zvar .byte 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rekord końcowy ==&lt;br /&gt;
&lt;br /&gt;
Rekord końcowy oznacza koniec pliku (brak dalszych segmentów). Dodatkowo określa sposób uruchomienia załadowanego kodu.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Format rekordu końcowego&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: left; &amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | $0B (Typ)&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 60px;&amp;quot; | Flaga startu&amp;lt;br /&amp;gt;&lt;br /&gt;
(1 bajt)&lt;br /&gt;
|style=&amp;quot;width: 120px;&amp;quot; | Adres startu&amp;lt;br /&amp;gt;&lt;br /&gt;
(2 bajty)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wartości pola &amp;#039;&amp;#039;Flaga startu&amp;#039;&amp;#039; oznaczają:&lt;br /&gt;
&lt;br /&gt;
* $00 - brak uruchomienia programu, zawartość pola &amp;#039;&amp;#039;Adres startu&amp;#039;&amp;#039; jest ignorowana&lt;br /&gt;
* $01 - uruchomienie programu od adresu bezwzględnego podanego w polu &amp;#039;&amp;#039;Adres startu&amp;#039;&amp;#039;&lt;br /&gt;
* $02 - uruchomienie programu od adresu relokowanego podanego w polu &amp;#039;&amp;#039;Adres startu&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Atari 8-bit]]&lt;br /&gt;
[[Kategoria:Programowanie Atari 8-bit]]&lt;br /&gt;
[[Kategoria:Formaty plików]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>