Racja, trzeba popróbować z prostszymi portami. Choć na razie nie wiem jak ;)
epi napisał/a:Możesz dokładniej opisać "kompilację na kolanie"?
Jasne.
Z góry przepraszam przy tym starych linuxowców, ale ja dopiero zaczynam z linuxem, więc mogę pisać głupoty.
Po pierwsze, aby kompilować cokolwiek na inny CPU, należy przygotować środowisko cross-compilera (w ogólności, bo metod jest kilka, ale ja wybrałem taką). Ten proces jest opisany na stronach forum SamyGO (setting up cross-compilation toolchain). Ja postawiłem to na Fedorze i przy tej okazji zrobiłem sobie dokładniejszy opis jak to zrobić. Jak ktoś potrzebuje, to podam ten przepis.
Po zainstalowaniu cross-compilation toolchain dysponujemy linuxem na PC (i686) pozwalającym kompilować programy zarówno na x86 (przy użyciu gcc), jak i na ARM (przy użyciu arm-SamyGO-linux-gnueabi-gcc).
Do tego doinstalowałem biblioteki ZLIB, SDL, PNG w wersji dla SamyGO. Nie zaszkodzi zainstalować pozostałych.
Co dalej? Pobrałem kod źródłowy Atari800, rozpakowałem do jakiegoś katalogu, po czym trochę pobawiłem się w edycję pliku src/configure. Wykonałem zmiany w stylu:
sdl-config -> arm-SamyGO-linux-gnueabi-sdl-config
gcc -> arm-SamyGO-linux-gnueabi-gcc
cross_compiling=no -> cross_compiling=yes
(byćmoże bez sensu, bo może wystarczyłoby zrobić jakieś linki symboliczne czy coś)
Następnie utworzyłem nową funkcję Game_Main() w pliku src/atari_sdl.c i skopiowałem do niej zawartość funkcji main(), przy czym zmienne argc i argv trzeba zdefiniować "ręcznie", bo w Game_Main() ich nie ma.
W kolejnym kroku wywołałem (jednorazowo):
Potem wyedytowałem makefile i dodałem opcje "-shared -fPIC" do polecenia gcc (kompilacja i konsolidacja).
Pamiętajmy, że nie kompilujemy zwykłego pliku wykonywalnego, a bibliotekę dynamiczną!
poleceniem make wykonujemy (re)kompilację. Powstaje plik atari800.so, który to umieszczamy wraz z pozostałymi plikami na pendrive. Ten pendrive nadaje się do użycia w TV.
Zawartość pendrive: podkatalog Atari800 z następującymi plikami:
- clmeta.dat: plik tekstowy (XML) o zawartości:
<?xml version="1.0" encoding="utf-8"?>
<contentlibrary>
<contentpack id="Atari800">
<category>Game</category>
<title language_id="English">Atari800</title>
<startpoint language_id="English">./atari800.so</startpoint>
<thumbnailpath>./Atari800.png</thumbnailpath>
<totalsize>1</totalsize>
</contentpack>
</contentlibrary>
- atari800.png: niewielka grafika z logo Atari
- ATARIBAS.ROM: nie muszę wyjaśniać
- ATARIXL.ROM: nie muszę wyjaśniać
- atari800.so: ten główny skompilowany plik binarny
Pliku konfiguracyjnego dla emulatora nie robiłem. Założyłem domyślne ustawienia.
Później dodałem trochę wstawek logujących wywoływanie niektórych funkcji i okazało się, że podczas uruchamiania telewizor restartuje się gdzieś w okolicy ładowania plików ROM. Musiałem także dodać wskazanie ścieżki do plików ROM, bo domyślnie ich nie znajdował (katalog bieżący nie jest tym gdzie leży główny program).
Sorry za chaos, ale już parę dni nie miałem czasu wrócić do tematu i piszę trochę z pamięci. Szczegóły mogę sprawdzić, ale byćmoże należałoby zacząć eksperymenty od nowa, aby moje błędy nie były powielane.