Oscar64 w praktyce. Język C na Commodore 64, 128,+4, bez kompromisów

Od jakiegoś czasu w świecie Commodore 64 coraz częściej wraca temat pisania kodu w języku C. Dla jednych to herezja, dla innych naturalny etap rozwoju narzędzi. Sam przez lata pisałem głównie w assemblerze, ale z czystej ciekawości postanowiłem sprawdzić, jak w praktyce wygląda praca z kompilatorem Oscar64 i czy faktycznie nadaje się on do czegoś więcej niż prostych przykładów.

Tekst powstał na podstawie filmów na kanale Youtube C64portal.pl a dotyczących programowania w C z użyciem kompilatora Oscar64. Pierwszy z filmów omawia jak zacząć pracę z kompilatorem i edytorem VSCode.

Oscar64 od razu wyróżnia się na tle innych kompilatorów C dostępnych dla C64. Najważniejsza różnica nie tkwi w składni ani w wygodzie edytora, ale w tym, co interesuje każdego, kto kiedykolwiek zaglądał w listing assemblera – w kodzie wynikowym. Oscar generuje kod, który jest nie tylko szybki i mały, ale również zaskakująco czytelny. Po kompilacji można bez problemu przejrzeć wygenerowany assembler i zrozumieć, co dokładnie dzieje się pod spodem. Dla kogoś, kto zna 6502, to ogromna zaleta.

Podczas pracy z kompilatorem wykorzystuję go w dość specyficzny sposób. Nie jest to klasyczne, „czyste” C znane z PC. Na C64 ważna jest kontrola nad pamięcią, dlatego korzystam z segmentów, ręcznie decyduję, gdzie trafia kod, a zmienne globalne są używane świadomie, zamiast przekazywania wszystkiego przez parametry funkcji. W kluczowych miejscach lądują one na stronie zerowej, dokładnie tam, gdzie chcę. Dzięki temu kod w C nadal przypomina niskopoziomowe programowanie, tylko zapisane w wygodniejszej formie. Omówione to w poniższym filmie:

Kompilator C Oscar64. Część #2: Czy jest wydajny?


Projekt, nad którym aktualnie pracuję, jest raczej luźnym eksperymentem niż pełnoprawną grą. Program wczytuje grafikę znakową przygotowaną w Harpadzie, działa w trybie ECM, używa sprite’ów i opiera się w dużej mierze na przerwaniach rasterowych. Cała logika wykonywana jest właśnie w przerwaniach – główna pętla programu w zasadzie tylko czeka. To podejście bardzo dobrze pasuje do C64 i sprawdza się również przy użyciu Oscara.

W trakcie pracy natrafiłem jednak na problem związany z optymalizacją. Kod skompilowany bez optymalizacji działał poprawnie, natomiast przy poziomach O2, O3 oraz optymalizacji pod rozmiar program potrafił się wysypać. Problem dotyczył obsługi dwóch przerwań rasterowych, które skakały jedno do drugiego z niewielkim przesunięciem w pionie. Po krótkiej analizie było jasne, że to nie błąd w moim kodzie, lecz coś, co optymalizator robił nie do końca poprawnie.

Zgłosiłem problem autorowi kompilatora i ku mojemu zaskoczeniu poprawka pojawiła się bardzo szybko. Błąd został naprawiony, zakomitowany na GitHubie i niemal od razu pojawiła się nowa wersja Oscara. To pokazuje, że projekt jest aktywnie rozwijany, a autor faktycznie reaguje na realne przypadki użycia, a nie tylko na syntetyczne testy.

Po włączeniu najwyższego poziomu optymalizacji widać wyraźnie, jak dużo pracy wykonuje kompilator. Funkcje są wciągane inline, znikają zbędne wywołania, a operacje takie jak przesunięcia sprite’ów czy obsługa dziewiątego bitu pozycji X są realizowane w możliwie najprostszy sposób. W wielu miejscach ręcznie napisany assembler wyglądałby bardzo podobnie, a czasem nawet gorzej.

Oscar64 daje więc coś, czego często brakuje w narzędziach wysokopoziomowych na stare platformy: kompromis pomiędzy wygodą a kontrolą. Można pisać kod szybciej niż w czystym assemblerze, a jednocześnie zachować pełną świadomość tego, co trafia do pamięci i jak jest wykonywane przez procesor 6510.

Nie jest to kompilator dla każdego. Jeśli ktoś chce pisać „przenośne” C albo uczyć się programowania od zera, to być może nie jest najlepszy wybór. Natomiast dla osób wracających do C64 po latach, znających trochę assembler, dla scenowców, czy programistów, którzy chcą szybko coś zbudować, a jednocześnie mieć kontrolę nad sprzętem, Oscar64 jest narzędziem naprawdę wartym uwagi.

W kolejnmy materiale wróciłem do niedokończonego projektu gry na C Plus/4, i omawiam wnioski jakie wyciągnąłem z pracy nad nim.

Oscar64 na pewno jeszcze się u nas pojawi – nie jako ciekawostka, ale jako pełnoprawne narzędzie do tworzenia oprogramowania na klasyczne ośmiobitowe maszyny. Na zakończenie tego krótkiego wprowadzenia film w którym zacząłem zgłębianie tematu języka C na Commodore. Rzecz nieco bardziej zaawansowana bo chodzi o nowego Commodore’a czyli C64 Ultimate. Ale do niego wrócę w specjalnych artykułach.

Zobacz także