Binarny plik DOS-u
From Atariki
Wersja z dnia 12:47, 13 mar 2024 Mono (Dyskusja | wkład) (→COS + NCOPY - przykład) ← Previous diff |
Wersja z dnia 09:09, 30 lip 2025 Krótki (Dyskusja | wkład) (Przeredagowuję, poprawiam informacje o DOS-ie 1.0.) Next diff → |
||
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. | + | 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. 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]]. |
- | == Format standardowy == | + | 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. |
- | 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]]. | + | == Format pliku == |
- | === Nagłówek === | + | === Sygnatura pliku === |
- | Każdy blok zawiera nagłówek w postaci dwóch bądź trzech słów: | + | Plik musi zaczynać się sygnaturą w postaci 2 bajtów: |
- | # sygnatura $FFFF (niezbędna przy pierwszym bloku, opcjonalna przy pozostałych), | + | * $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 a 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 słowa spod dwóch adresów w pamięci mają 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), | + | * INITAD $02E2-$02E3 - 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. | + | * RUNAD $02E0-$02E1 - 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. | 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. |
Wersja z dnia 09:09, 30 lip 2025
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. 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):
- adres początku danych,
- 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 a 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 słowa spod dwóch adresów w pamięci mają szczególne znaczenie:
- INITAD $02E2-$02E3 - 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-$02E1 - 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.
COS + NCOPY
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).