Terminal w stylu Commodore 64 na Linuksie — i polskie znaki, których nie było

*** 8 na 8 pikseli, ogonki i licencja z 2019 roku ***

Terminal w stylu Commodore 64 na współczesnym Linuksie to pomysł, który przychodzi do głowy każdemu, kto kiedykolwiek widział niebieski ekran z napisem READY. Pikselowy font, paleta VIC-II, migający kursor-blok. Wszystko to da się dziś zrobić w kilkanaście minut — do momentu, w którym napiszesz pierwsze polskie słowo z ogonkiem.

Ten wpis jest o tym, co się wtedy dzieje, i jak to naprawiliśmy. Efekt oddajemy do używania: c64-terminal-pl jest publiczny i darmowy.

Dlaczego terminal w stylu Commodore 64 nie mówi po polsku

Najwierniejszą rekonstrukcją charsetu z ROM-u C64 jest font C64 Pro Mono autorstwa Style — ten sam, którego używamy zresztą na tej stronie. Jest znakomity i ma jedną wadę, o której dowiadujesz się dopiero w praktyce: nie zawiera ani jednego polskiego znaku. Żadnego ą, ę, ł, ń, ó, ś, ź, ż.

System nie zgłasza wtedy błędu. Po prostu podstawia za brakujące litery pierwszy lepszy font systemowy — i w środku pikselowego napisu ląduje gładkie, wygładzone „ą" z kroju zaprojektowanego w XXI wieku. Wygląda to dokładnie tak źle, jak brzmi. Napis ZAŻÓŁĆ GĘŚLĄ JAŹŃ zamienia się w zbieraninę dwóch epok typografii naraz.

Osiem na osiem, czyli gdzie zmieścić ogonek

Rozwiązanie okazało się siedzieć w samej konstrukcji fontu. C64 Pro Mono jest w stu procentach pikselowy — każdy znak to prostokąty ułożone na siatce ośmiu na osiem pikseli, dokładnie tak jak w oryginalnym układzie znaków Commodore. Można więc zrobić rzecz, która w zwykłym foncie byłaby wandalizmem: zamienić literę z powrotem w bitmapę, dorysować akcent jako piksele, i złożyć znak od nowa.

Kluczowe było odkrycie, że w tym foncie wiersz nad wielką literą i wiersz pod linią bazową są puste. Wielkie litery zajmują wiersze od pierwszego do siódmego, małe od trzeciego do siódmego. Zostaje dokładnie tyle miejsca, ile trzeba na kreskę nad Ó i na ogonek pod Ą — bez skracania samych liter, bez rozpychania wierszy:

      Ó              Ż              Ł              Ą
   ....##..       ...#....       ........       ........
   ..####..       .######.       .##.....       ...##...
   .##..##.       .....##.       .##.....       ..####..
   .##..##.       ....##..       .##.....       .##..##.
   .##..##.       ...##...       ####....       .######.
   .##..##.       ..##....       .##.....       .##..##.
   .##..##.       .##.....       .##.....       .##..##.
   ..####..       .######.       .######.       .##..##.
   ........       ........       ........       ....##..

Dzięki temu cały znak mieści się w komórce terminala. To nie jest kosmetyka: gdyby akcent wystawał choć o piksel, terminal ucinałby mu górę albo trzeba by rozsuwać wiersze, a wtedy ekran przestaje wyglądać jak ekran C64.

Ź kontra Ż, czyli lekcja o różnicy, którą widać

Pierwsza wersja miała wadę, którą widać było dopiero na renderze. Ź i Ż różniły się wyłącznie przesunięciem akcentu o jeden piksel w bok — kreska stała w czwartej kolumnie, kropka w trzeciej. Na papierze różnica jest. Na ekranie nie ma żadnej.

Poprawka polegała na tym, żeby rozróżniać je grubością, a nie położeniem: kreska ma dwa piksele i idzie w prawo, kropka ma jeden i stoi na środku. Małe litery mają zapas dwóch wierszy, więc dostały ładniejszy, ukośny akcent. Wniosek wart zapamiętania przy każdym projektowaniu w małej rozdzielczości: różnicę trzeba projektować tak, żeby ją było widać, a nie tak, żeby dała się policzyć.

Polskie znaki dorysowane w siatce 8x8 fontu C64 — porównanie wariantów akcentów

Dlaczego instalator pobiera font, zamiast go rozdawać

Tu dochodzimy do części, która wymagała więcej namysłu niż sam kod. Licencja fontu C64 Pro Mono zabrania dwóch rzeczy naraz: rozpowszechniania pliku i jakiejkolwiek jego modyfikacji. Każde dozwolone użycie ma w niej dopisek „without any modification". Gotowy font z dorysowanymi polskimi znakami wypada więc poza wszystko, na co autor się zgodził.

Dlatego w repozytorium nie ma pliku fontu i nigdy nie będzie. Instalator pobiera oryginał prosto ze strony autora, a polskie znaki dorysowuje już na komputerze użytkownika, do jego własnego użytku. Rozdajemy generator, nie font. To rozróżnienie brzmi drobiazgowo, ale jest różnicą między „szanujemy pracę autora" a „bierzemy sobie cudze i zmieniamy nazwę".

Jak to zainstalować

Trzy polecenia. Instalator sam rozpoznaje dystrybucję, sprawdza czego brakuje i robi kopię zapasową plików, które zmienia:

git clone https://github.com/arekbr/c64-terminal-pl.git
cd c64-terminal-pl
./install.sh

Nie chcesz nic zmieniać w ciemno? ./install.sh --dry-run pokaże, co by się stało, i nie tknie niczego. Rozmyślisz się? ./uninstall.sh cofa wszystko, a Twój plik startowy powłoki wraca do stanu sprzed instalacji — sprawdzaliśmy to trzema pełnymi cyklami instalacji i deinstalacji.

Powstało i było testowane na Debianie, z gnome-terminalem. Konfiguracje dla kitty, alacritty, foot, Konsole, xfce4-terminala i wezterma są napisane według dokumentacji każdego z nich, ale nie mieliśmy ich na czym przeklikać — i tak jest to napisane wprost w dokumentacji projektu. Wolimy powiedzieć „nie sprawdziliśmy", niż udawać, że sprawdziliśmy.

Po co komu terminal w stylu Commodore 64

Bo praca może wyglądać jak zabawa. Bo READY. zamiast zachęty basha to drobiazg, który poprawia humor o siódmej rano. I dlatego, że retro to nie tylko sprzęt na półce — to również przenoszenie tamtej estetyki tam, gdzie realnie spędzamy dziś czas.

Jeśli lubisz takie rzeczy, zajrzyj do tego, czym się zajmujemy, albo sprawdź, jak działa wynajem sprzętu retro na eventy — prawdziwe maszyny, nie tylko ich fonty.

Projekty takie jak ten robimy po godzinach i udostępniamy za darmo. Jeśli chcesz, żeby powstawało ich więcej, najskuteczniej wesprzesz nas przez Patronite — regularne wsparcie pozwala nam planować dłużej niż na miesiąc do przodu. Każda inna forma pomocy też się liczy: tutaj zebraliśmy wszystkie sposoby.

Kod, dokumentacja i zrzuty ekranu: github.com/arekbr/c64-terminal-pl. Zgłoszenia błędów i poprawki mile widziane — zwłaszcza od użytkowników terminali, których nie mieliśmy jak przetestować.