Binarny plik DOS-u

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 18:03, 11 gru 2020
Mono (Dyskusja | wkład)
(COS + NCOPY - pierwszy blok w pliku i potencjalne problemy z uruchamieniem)
← Previous diff
Aktualna wersja
Krótki (Dyskusja | wkład)
(Wycofuję - DOS II pozwala na nadmiarowe nagłówki pliku także w pierwszym bloku.)
Linia 1: Linia 1:
-Plik powstający po wydaniu polecenia "BINARY SAVE" z poziomu [[DOS]]-ów Atari w wersjach 1.0, 2.0, 2.5, 4.0, jak i MyDOSu.+Najpopularniejszy format [https://pl.wikipedia.org/wiki/Plik_obiektowy pliku obiektowego], wprowadzony przez [[Atari, Inc.]] jako format wynikowy funkcji "BINARY SAVE" [[DOS 1.0|DOS-u 1.0]] i programu [[Assembler Editor]]. Format został zmodyfikowany w [[DOS 2.0|DOS-ie 2.0]], i w tej nowszej wersji wszedł do powszechnego użycia - wersja 2.0 jest obsługiwana przez wszystkie kolejne DOS-y firmy Atari oraz przez systemy innych firm, np. [[MyDOS]].
-== Format standardowy ==+Plik ma strukturę blokową - składa się z jednego lub więcej bloków, czy też segmentów, z których każdy dosłownie wskazuje adresy, pod które należy wczytać dane zawarte w bloku. Ten format pliku zatem nie przewiduje automatycznej relokacji danych - relokowalne binaria ma tylko [[SpartaDOS X]].
-Plik binarny, zwykle zawierający program wykonywalny dla ośmiobitowego Atari i przeznaczony do wczytania pod kontrolą DOS-u lub [[inicjalizer]]a. Plik taki ma strukturę blokową, tzn. składa się z jednego, bądź więcej bloków, czy też segmentów, przy czym pierwszy z nich musi zaczynać się sygnaturą w postaci słowa $FFFF. Pozostałe bloki mogą zawierać tę sygnaturę, ale nie jest to warunek konieczny - wszystkie natomiast muszą zawierać nagłówek.+
-Standardowy format nie przewiduje automatycznej relokacji danych, nagłówek dosłownie wskazuje adresy, pod które należy wczytać dane zawarte w bloku (segmencie). Relokowalne binaria ma tylko [[SpartaDOS X]].+Specjalne bloki pozwalają też na uruchamianie kodu inicjującego w trakcie ładowania pliku, oraz uruchomienie programu po jego załadowaniu. Pliki w tym formacie są więc zazwyczaj programami wykonywalnymi dla ośmiobitowego Atari, przeznaczonymi do wczytania pod kontrolą DOS-u lub [[inicjalizer]]a.
-=== Nagłówek ===+== Format pliku ==
-Każdy blok zawiera nagłówek w postaci dwóch bądź trzech słów:+ 
-# sygnatura $FFFF (niezbędna przy pierwszym bloku, opcjonalna przy pozostałych),+=== Sygnatura pliku ===
 +Plik musi zaczynać się sygnaturą w postaci 2 bajtów:
 +* $84 $09 w przypadku DOS-u 1.0,
 +* $FF $FF w przypadku DOS-u 2.0 i późniejszych.
 + 
 +Po sygnaturze następuje jeden lub więcej bloków, czy też segmentów.
 + 
 +=== Struktura bloku ===
 +Każdy blok poprzedzony jest 4-bajtowym nagłówkiem w postaci dwóch słów (w kolejności LSB):
# adres początku danych, # adres początku danych,
# adres końca. # adres końca.
-=== Dane ===+Po nagłówku następują bajty danych, w liczbie równej dokładnie <adres końca> - <adres początku> + 1. Dane te wczytywane są w obszar pamięci wyznaczony przez adresy z nagłówka.
-Dane znajdują się bezpośrednio za nagłówkiem i wczytywane są w obszar pamięci wyznaczony przez adresy z nagłówka. Wyznaczają one również objętość ładowanych danych.+ 
 +Począwszy od DOS-u 2.0 dopuszczalne jest wystąpienie nadmiarowej sygnatury ($FF $FF) przed każdym blokiem (włącznie z pierwszym) - podczas odczytu jest ona ignorowana. Pozwala to na scalenie (np. komendą COPY FILE z parametrem /A) wielu plików binarnych DOS-u w jeden, bez konieczności usuwania 2 bajtów sygnatury z każdego pliku poza pierwszym.
=== Obszary specjalne === === Obszary specjalne ===
-W trakcie ładowania pliku binarnego słowa spod dwóch adresów w pamięci mają szczególne znaczenie:+W trakcie ładowania pliku binarnego zapisanie danych do określonych obszarów pamięci ma szczególne znaczenie:
-* INITAD $02E2 - jeśli zostało zmienione poprzez ostatnio wczytywany blok, traktowane jest jako adres procedury do wykonania bezpośrednio po wczytaniu tego bloku (powrót przez RTS),+
-* RUNAD $02E0 - jeśli zostało zmienione przez którykolwiek z wczytywanych bloków, traktowane jest jako adres startowy od którego wykonywany zostanie program, po załadowaniu wszystkich bloków.+
-Jeśli słowo pod adresem $02E0 nie zostanie zmienione przez żaden z ładowanych bloków (bądź przez procedurę wykonywaną w wypadku stwierdzenia zmiany słowa $02E2), to nie ma ustalonego adresu, od którego należy wystartować załadowany plik binarny. Niektóre DOS-y - jak [[DOS XL]] i [[SpartaDOS]] - w takim wypadku, uruchamiają program od początku pierwszego bloku.+==== RUNAD - automatyczne uruchomienie po załadowaniu ====
 +Załadowanie adresu pod wektor RUNAD = $02E0-$02E1 spowoduje, że gdy ładowanie osiągnie koniec pliku, tj. po zakończeniu ładowania wszystkich bloków, system wykona skok pod ten adres. Pozwala to stworzyć plik programu samouruchamiający się po załadowaniu.
-=== COS + NCOPY ===+Program może zakończyć działanie i powrócić do DOS-u wykonując skok pośredni poprzez wektor DOSVEC = $0A-$0B. W DOS-ie 1.0 była to jedyna możliwość powrotu, natomiast począwszy od DOS-u 2.0 możliwe jest też zakończenie programu rozkazem RTS.
 + 
 +Niektóre DOS-y, np. [[DOS XL]] i [[SpartaDOS]], nie pozwalają załadować pliku obiektowego bez uruchomienia. Brak wpisania adresu pod RUNAD powoduje, że owe DOS-y wykonują skok pod adres początkowy pierwszego załadowanego bloku.
 + 
 +==== INITAD - automatyczna inicjalizacja podczas ładowania ====
 + 
 +W DOS-ie 2.0 wprowadzono możliwość wykonania programu po załadowaniu każdego bloku. Załadowanie adresu pod wektor INITAD = $20E2-$20E3 powoduje skok pod ów adres natychmiast po załadowaniu bieżącego bloku. Wczytywany plik pozostaje otwarty. Powrót z programu rozkazem RTS powoduje kontynuację ładowania pliku.
 + 
 +==== COS + NCOPY - wyświetlanie nazwy ładowanego pliku ====
[[COS]] w trakcie ładowania programu z taśmy pozwala na wyświetlenie jego nazwy nadanej podczas kopiowania przy pomocy programu [[Name Copy]]. Blok nazwy jest zwykłym blokiem binarnym ładowanym w obszar $1C0-$1CE: [[COS]] w trakcie ładowania programu z taśmy pozwala na wyświetlenie jego nazwy nadanej podczas kopiowania przy pomocy programu [[Name Copy]]. Blok nazwy jest zwykłym blokiem binarnym ładowanym w obszar $1C0-$1CE:
Linia 31: Linia 46:
* $0C-$0E: długość pliku wyrażona w 128-bajtowych blokach również zapisana kodami ATASCII. * $0C-$0E: długość pliku wyrażona w 128-bajtowych blokach również zapisana kodami ATASCII.
-Jest on zapisywany przez [[Name Copy]] jako pierwszy blok pliku, co może powodować problemy z uruchomieniem programu w niektórych [[DOS]]-ach w sytuacji gdy w pliku nie zdefiniowano adresu uruchomienia programu.+'''UWAGA!''' Jest on zapisywany przez [[Name Copy]] jako pierwszy blok pliku, co może powodować problemy z uruchomieniem programu w niektórych [[DOS]]-ach w sytuacji gdy w pliku nie zdefiniowano adresu uruchomienia programu.
 + 
 +Przykładowa treść bloku:
 + 
 + QA COM 100
== Przykłady == == Przykłady ==

Aktualna wersja

Najpopularniejszy format pliku obiektowego, wprowadzony przez Atari, Inc. jako format wynikowy funkcji "BINARY SAVE" DOS-u 1.0 i programu Assembler Editor. Format został zmodyfikowany w DOS-ie 2.0, i w tej nowszej wersji wszedł do powszechnego użycia - wersja 2.0 jest obsługiwana przez wszystkie kolejne DOS-y firmy Atari oraz przez systemy innych firm, np. MyDOS.

Plik ma strukturę blokową - składa się z jednego lub więcej bloków, czy też segmentów, z których każdy dosłownie wskazuje adresy, pod które należy wczytać dane zawarte w bloku. Ten format pliku zatem nie przewiduje automatycznej relokacji danych - relokowalne binaria ma tylko SpartaDOS X.

Specjalne bloki pozwalają też na uruchamianie kodu inicjującego w trakcie ładowania pliku, oraz uruchomienie programu po jego załadowaniu. Pliki w tym formacie są więc zazwyczaj programami wykonywalnymi dla ośmiobitowego Atari, przeznaczonymi do wczytania pod kontrolą DOS-u lub inicjalizera.

Spis treści

Format pliku

Sygnatura pliku

Plik musi zaczynać się sygnaturą w postaci 2 bajtów:

  • $84 $09 w przypadku DOS-u 1.0,
  • $FF $FF w przypadku DOS-u 2.0 i późniejszych.

Po sygnaturze następuje jeden lub więcej bloków, czy też segmentów.

Struktura bloku

Każdy blok poprzedzony jest 4-bajtowym nagłówkiem w postaci dwóch słów (w kolejności LSB):

  1. adres początku danych,
  2. adres końca.

Po nagłówku następują bajty danych, w liczbie równej dokładnie <adres końca> - <adres początku> + 1. Dane te wczytywane są w obszar pamięci wyznaczony przez adresy z nagłówka.

Począwszy od DOS-u 2.0 dopuszczalne jest wystąpienie nadmiarowej sygnatury ($FF $FF) przed każdym blokiem (włącznie z pierwszym) - podczas odczytu jest ona ignorowana. Pozwala to na scalenie (np. komendą COPY FILE z parametrem /A) wielu plików binarnych DOS-u w jeden, bez konieczności usuwania 2 bajtów sygnatury z każdego pliku poza pierwszym.

Obszary specjalne

W trakcie ładowania pliku binarnego zapisanie danych do określonych obszarów pamięci ma szczególne znaczenie:

RUNAD - automatyczne uruchomienie po załadowaniu

Załadowanie adresu pod wektor RUNAD = $02E0-$02E1 spowoduje, że gdy ładowanie osiągnie koniec pliku, tj. po zakończeniu ładowania wszystkich bloków, system wykona skok pod ten adres. Pozwala to stworzyć plik programu samouruchamiający się po załadowaniu.

Program może zakończyć działanie i powrócić do DOS-u wykonując skok pośredni poprzez wektor DOSVEC = $0A-$0B. W DOS-ie 1.0 była to jedyna możliwość powrotu, natomiast począwszy od DOS-u 2.0 możliwe jest też zakończenie programu rozkazem RTS.

Niektóre DOS-y, np. DOS XL i SpartaDOS, nie pozwalają załadować pliku obiektowego bez uruchomienia. Brak wpisania adresu pod RUNAD powoduje, że owe DOS-y wykonują skok pod adres początkowy pierwszego załadowanego bloku.

INITAD - automatyczna inicjalizacja podczas ładowania

W DOS-ie 2.0 wprowadzono możliwość wykonania programu po załadowaniu każdego bloku. Załadowanie adresu pod wektor INITAD = $20E2-$20E3 powoduje skok pod ów adres natychmiast po załadowaniu bieżącego bloku. Wczytywany plik pozostaje otwarty. Powrót z programu rozkazem RTS powoduje kontynuację ładowania pliku.

COS + NCOPY - wyświetlanie nazwy ładowanego pliku

COS w trakcie ładowania programu z taśmy pozwala na wyświetlenie jego nazwy nadanej podczas kopiowania przy pomocy programu Name Copy. Blok nazwy jest zwykłym blokiem binarnym ładowanym w obszar $1C0-$1CE:

  • $00-$07: nazwa pliku w kodach ATASCII,
  • $08-$0A: rozszerzenie pliku w kodach ATASCII,
  • $0B: spacja ($20)
  • $0C-$0E: długość pliku wyrażona w 128-bajtowych blokach również zapisana kodami ATASCII.

UWAGA! Jest on zapisywany przez Name Copy jako pierwszy blok pliku, co może powodować problemy z uruchomieniem programu w niektórych DOS-ach w sytuacji gdy w pliku nie zdefiniowano adresu uruchomienia programu.

Przykładowa treść bloku:

QA      COM 100

Przykłady

Format ten stosowany jest zarówno do wczytywania kodu programu (np. zewnętrzne polecenia DOS-u w postaci plików COM, EXE, XEX), jak i pozbawionych kodu programu czystych danych (np. CMC, TMC).

Personal tools