Paweł "QTZ" napisał:
Prezentowałem niedawno
"Atari Font Mover", który między innymi umożliwia dopasowanie
znaków własnej czcionki do standardowej czcionki Atari lub do
dowolnej innej, którą użytkownik umieści w pliku "Custom.set".
Atari Font Mover
W związku z tym postanowiłem sprawdzić, jakie zestawy znaków można
znaleźć w 8-bitowych komputerach Atari i podzielić się tą wiedzą.
Ostatecznie artykuł rozrósł się do postaci czterech miniporadników
- jak sprawdzić wersję systemu, jak rozpoznać wersję arabskiego
Atari, jak skompilować źródła oraz jak zgrać ROM'y. Zapraszam do
lektury.
Standardowe zestawy znaków
Najbardziej popularne modele Atari posiadają wbudowane dwa zestawy
znaków. Standardowy, zawierający znaki graficzne "pisane" z
klawiszem Control i międzynarodowy, który w miejscu znaków
graficznych ma umieszczone dodatkowe litery, wśród których niestety
brakuje charakterystycznych dla języka polskiego. Ten zestaw znaków
nie występuje w modelach - 5200, 400/800 - OSA, OSB (w
zbiorach
AtariOnline.pl pliki odpowiadające tym modelom mają następujące
nazwy: "Atari 5200.rom", "Atari OS vA.rom", "Atari OS vB.rom"),
został dodany w systemie dla Atari z pamięcią ROM 16KB (+8KB Basic)
- seria XL/XE - REV10, REV11, REV1, REV2, REV3, REV4 ("Atari OS v10
82.10.26.rom", "Atari OS v11 82.12.23.rom", "Atari OS v1
83.11.03.rom", "Atari OS v2 83.10.05.rom", "Atari OS v3
85.01.03.rom", "Atari OS v4 87.07.05.rom").
standardowy zestaw znaków
(graficzny)
międzynarodowy zestaw znaków
(wyróżnione znaki międzynarodowe)
Aby przełączyć się na niego wykonujemy POKE 756,204, a aby powrócić
do standardowego - POKE 756,224. Podobno w modelu 1200XL można się
przełączać również kombinacją klawiszy Control+F4, ale nie miałem
okazji tego sprawdzić. Jako uzupełnienie dodam, że system w wersji
OSB zawiera fragmenty znaków w nietypowym miejscu pamięci ROM:
OSB - fragmenty liter w kodzie systemu
(w zbiorach AOL: "Atari OS vB.rom")
Nieoficjalne modyfikacje
Pierwszy zestaw firmowo występuje w niezmienionej postaci we
wszystkich 8-bitowych komputerach Atari, jak również w systemach
pisanych przez niezależnych od Atari programistów. Wśród tych
systemów wyjątkiem jest Happy Warp, gdzie nieznacznie zmieniono
apostrof i cudzysłów:
Happy Warp
(w zbiorach AOL: "Atari OS (Happy Warp).rom")
Międzynarodowy zestaw znaków w nieoficjalnych systemach z powodu
małej pojemności ROM często jest pominięty, a jego miejsce zajmuje
rozbudowany kod systemu - przykładem są QMEG ("Atari OS (Qmeg
3).rom") i wspomniany Happy Warp ("Atari OS (Happy Warp).rom"). W
kilku innych występuje w zmodyfikowanej postaci:
XL OS dla procesora 65C816 (tutaj)
OS++ w emulatorze "Atari++"
(u nas: "Atari OS (emulator Atari++).rom")
Jako ciekawostkę dodam, że OS++ z emulatora "Atari++" działa
również na emulatorach - "Altirra" od wersji 1.5, gdzie kopiujemy
go jako "otheros.rom" i na "Atari800" z wyłączonymi patch'ami. Nie
działa na "Atari800Win PLus", gdzie po wyłączeniu patch'y pojawia
się tylko kursor i na "EmuAPC", gdzie widzimy całkowicie czarny
ekran.
działający OS++ w emulatorze "Altirra 1.6
prerelease"
Istnieje też modyfikacja systemu w wersji REV2 polegająca wyłącznie
na zmianie zestawu znaków międzynarodowych na polskie:
polskie znaki ("Atari OS (polish
charset).rom")
Ten zestaw znaków użyty jest również w Turbo ROM ("Atari OS (Turbo
2001).rom").
Arabskie zestawy znaków
Twórcy modyfikacji słusznie biorąc pod uwagę zgodność znaków użyli
standardowej czcionki bez jakichkolwiek modyfikacji i zostawili ją
w standardowym obszarze pamięci. Inaczej jest w sygnowanej znakiem
Atari wersji arabskiej - domyślny zestaw znaków jest umieszczony w
miejscu międzynarodowego, a w miejscu standardowego znajdują się
znaki arabskie. Istnieją co najmniej dwie wersje arabskiego Atari,
różnią się one funkcjonalnością oraz wbudowaną czcionką. W
pierwszej wersji powtarzają się znaki oznaczające cyfry:
0,2,3,4,8,9,6,7 i spacja, co jest mylące:
Arabic v.1 (opisany jako REV 3B)
W drugiej wersji zostało to poprawione - powtarza się już tylko
spacja, w miejscu backslasha wstawiony został dodatkowy znak
arabski, a zamiast powtarzających się zostały przywrócone znaki
standardowe i dodatkowo doszedł odwrócony znak zapytania, pozostałe
znaki zostały pogrubione, przez co stały się bardziej czytelne:
Arabic v.2 (opisany jako REV59)
Zastosowanie zmodyfikowanego zestawu znaków jako domyślnego (224)
nie jest dobrym rozwiązaniem, powoduje, że większość programów nie
przeznaczonych specjalnie dla tej wersji Atari wyświetla
niewłaściwe znaki. Program uruchomiony na tak zmodyfikowanym
systemie "nie spodziewa się" niestandardowych znaków w tym obszarze
pamięci i używa ich tak samo, jak standardowo dostępnych w innych
modelach. Więc w tym przypadku cyfry, małe litery i znaki graficzne
zostaną zastąpione arabskimi. Program używający znaków graficznych,
zamiast oczekiwanych kształtów będzie wyświetlał znaki im
przypisane.
"Zaskakujące" efekty występują w programach, które kopiują domyślną
czcionkę i modyfikują tylko część znaków. W polskich programach
najczęściej tą metodą dodawane są znaki diakrytyczne, które w tym
przypadku zostaną "przemieszane" z arabskimi, lub zależnie od
użytej metody, arabskie znaki zyskają "ogonki".
Podobnie prezentuje się dodatkowa grafika umieszczona na znakach,
czego przykładem jest logo podczas wczytywania programu "Kasprzak
Demo":
"Kasprzak Demo" bezpośrednio po uruchomieniu
(kopia czcionki arabskiej z logo), po przełączeniu zestawu znaków
(czcionka graficzna) i dla porównania na standardowym Atari (kopia
czcionki graficznej z logo)
W nowszej wersji systemu można się przełączyć pomiędzy aktualnym i
alternatywnym zestawem znaków poprzez naciśnięcie kombinacji
klawiszy Shift+Help, która działa nawet podczas Self-Test'u. Jednak
jak widać, przywrócenie czcionki graficznej nie zawsze daje
pożądany efekt - tu "usuwa" logo, które zostało "nieświadomie"
dodane do czcionki arabskiej, zamiast według założenia do
graficznej, gdzie go nie ma. Również efekt kursywy lub pogrubienia
zostanie "zaaplikowany" do czcionki arabskiej:
"Super Czołówka" - pogrubione znaki, także
arabskie
Manualna zmiana zestawu znaków zanim program zmieni używany zestaw
na "swój" umieszczony w przestrzeni programu może z kolei
spowodować, że obydwa dostępne w ten sposób zestawy będą zupełnie
nieodpowiednie w danym przypadku. W programie "Super Czołówka",
jeżeli na ekranie tytułowym (podczas tworzenia zestawu znaków)
naciśniemy Shift+Help - później w menu ta kombinacja zamiast
przełączyć nas na czcionkę graficzną, przełączy nas na standardową
arabską:
Z tego wniosek, że programy wymagające "tradycyjnych" liter, aby
poprawnie wyświetlać tekst na takim systemie, powinny być
"spatch'owane" tak, aby pobierały czcionkę z alternatywnego zestawu
znaków - 204 (w tym przypadku standardowy), a do programów
korzystających z domyślnego zestawu znaków należałoby dodać POKE
756,204. Ciekawe, czy istnieją tak zmodyfikowane programy?
Najlepiej byłoby sprawdzić wersję ROM - jeżeli jest to REV59 ($3B)
- wtedy ustawić zestaw znaków na 204 - wszędzie tam gdzie jest on
używany i po każdorazowej zmianie trybu graficznego:
IF
PEEK(65527) = 59 THEN POKE 756,204
. Co polecam testom i
uwadze piszących oprogramowanie dla Atari.
Również emulator "Atari800Win PLus" używa czcionki Atari z
załadowanego ROM'u - do wyświetlenia komunikatu "pauzy":
"standardowy" Self-Test i komunikat
pauzy
Doskonale to widać, kiedy użyjemy ROM'u ze zmodyfikowaną domyślną
czcionką i zatrzymamy emulator klawiszem F9:
Arabic v.1 (znany jako REV3B) i zatrzymany
Self-Test
Jak widać idealnie by było, gdyby czcionka standardowa (graficzna)
zawsze znajdowała się w spodziewanym miejscu w pamięci w
niezmienionej postaci, zaś czcionka specyficzna dla danego języka
umieszczana była w miejscu międzynarodowej, która to z kolei
mogłaby być ustawiona jako domyślna (204 zamiast 224), a system
miałby unikatowy numer oznaczający wersję językową (tutaj można to
zauważyć po numerze "revision" = 59) - wtedy nie powodowałoby to
konfliktu.
Dwie wersje, a jakby jedna - przypuszczenia
W internecie można znaleźć informacje o wersjach REV3B i REV59,
jednak źródła podają błędnie, że jest to dokładnie ta sama wersja,
gdyż $3B = 59. Co prawda zapis ten zależy od interpretacji, jednak
pod tymi pozornie jednoznacznymi oznaczeniami kryją się dość
znacząco różniące się wersje, które łatwo pomylić, gdyż oprócz
jednakowego numeru wersji (59) mają również taką samą datę
(21/07/1987). Być może twórcy nie zmienili tych wartości celowo,
aby istniejące już oprogramowanie nie miało problemu z rozpoznaniem
wersji językowej systemu, a być może zapomnieli. Ponieważ
poprzednie wersje odczytujemy jako numery dziesiętne - 10 = REV10
(nie A od $A), 11 = REV11 (nie B od $B), można przypuszczać, że
oznaczenie REV59 jest tym prawidłowym, co również może być błędne,
bo jeżeli zostanie ono tak zinterpretowane, to sposób zapisu jest
inny niż w przypadku daty. Na dodatek nie wiadomo, na której wersji
systemu te wersje są oparte - prawdopodobnie na REV4 lub REV3,
jednak, aby być całkowicie pewnym należałoby się pokusić o analizę
kodu. Wszystko wskazuje na to, że system opisany jako REV3B jest
starszą wersją, gdyż jest mniej funkcjonalny, a REV59 wygląda na
nowszą bardziej przemyślaną, więc można przyjąć, że są to Arabic
v.1 i v.2. Nie wykluczone, że jedna wersja jest oparta na REV3, a
druga na REV4. Wersja opisana jako REV59 może być więc najnowszą
istniejącą wersją systemu operacyjnego, jaka została firmowo
zamontowana w Atari.
Co do istnienia innej wersji systemu podejrzenia miał już Nosty
(patrz
artykuł o arabskiej wersji Atari). Wszystko wskazuje na to, że
posiada on starszą wersję, gdyż jak napisał - nie działa w niej
kombinacja Shift+Help, ostatni znak słowa po naciśnięciu spacji nie
jest automatycznie zamieniany, pisanie jest niewygodne (zarówno z
Caps jak i z Control zawsze w przeciwnym kierunku), również można
to wywnioskować patrząc na załączone zdjęcie.
Jak rozpoznać, która to wersja?
Bardzo łatwo jest rozróżnić wersje arabskiego Atari patrząc na
ekran Self-Test'u (często pokazywanego na
zdjęciach), gdyż
jako "Esc" w starszej wersji (opisanej jako REV3B) wyświetlany jest
znak, który odpowiada cyfrze zero - "duża kropka" (podobna do
"karo"), a w nowszej wersji (opisanej jako REV59) jest to "Ę".
Arabic v.2 (znany jako REV59) - wyraźnie
widoczny symbol "Ę" ("Esc"), odwrócone znaki zapytania i inne
charakterystyczne znaki
Uszkodzony Arabic OS - początek poszukiwań
Na
stronie Kevina
Savetz'a można znaleźć pliki ROM arabskiej wersji Atari, które
nie działają z żadnym emulatorem. Ponieważ jest tam również
informacja o możliwej modyfikacji sprzętowej, można uznać, że nie
działają one właśnie z tego powodu... Jednak pliki te nie działają,
ponieważ są uszkodzone, o czym świadczą czcionki zawarte w jednym z
nich - zarówno standardowa, jak i arabska są pełne przekłamań,
również data ROM'u jest nieprawidłowa (21/07/E1).
Arabic (zaznaczone uszkodzone
znaki)
Arabic (zaznaczone uszkodzone znaki - w
porównaniu z poprawnymi)
Źródła - kompilacja - poprawne Arabic OS'y
Poprawną czcionkę wraz z źródłami arabskiego OS'a znalazłem w
pakiecie źródeł różnych wersji systemu Atari w inkarnacji trzeciej
- do ściągnięcia
tutaj. Aby je skompilować
pod Windows'em potrzebne są:
- cc65 (www.cc65.org), który
najlepiej ściągnąć w postaci samo-instalującego się pliku exe
(obecnie cc65-2.13.1-1.exe, o którym była wzmianka również
tutaj)
- odpowiedniki narzędzi linux'owych (pliki tutaj): make.exe, mv.exe, rm.exe,
md5sum.exe i biblioteki: cygintl-3.dll, cygiconv-2.dll,
cygwin1.dll, które dla wygody można umieścić w podkatalogu "bin"
cc65.
W podkatalogu "asminc" na czas kompilacji zmieniamy nazwę pliku
"atari.inc" (jeżeli istnieje) przykładowo na "_atari.inc", gdyż
koliduje on z odpowiednikiem z źródeł. Windows'owa wersja md5sum
nie do końca jest zgodna z oryginałem, więc dodatkowo zamieniamy
"-cv" na "-c" w czterech plikach "MakeFile" w podkatalogach
"Basic", "OS-10K", "OS-16K", "OS-5200" źródeł systemu. Następnie
według instrukcji w każdym z czterech podkatalogów wykonujemy "make
check" (wpisujemy z linii poleceń), gdzie zostaną utworzone pliki
ROM. Skompilowany plik "atarixl-rev59.rom" znajdzie się w
podkatalogu "OS-16K".
Bez problemu działa on z emulatorem, co więcej, "Atari800Win PLus"
rozpoznaje ten plik, więc musiał być on znany co najmniej jednemu
autorowi emulatora już w 2005 roku lub wcześniej. A tu fragment
kodu z emulatora "Atari800Win PLus 4.0" odpowiedzialny za
rozpoznanie wersji ROM'u:
struct RomTypeInfo_t g_aRomTypeInfo[] =
{
{ RTI_OSA, 2370568491L, "Rev.A | 4/800 | PAL" },
{ RTI_OSB, 3252116993L, "Rev.B | 4/800 | PAL" },
{ RTI_OSB, 4051249634L, "Rev.B | 4/800 | NTSC" },
{ RTI_XLE, 2613326695L, "Rev.1 | 600XL | 03/11/1983" },
{ RTI_XLE, 3764596111L, "Rev.2 | XL/XE | 05/10/1983" },
{ RTI_XLE, 3591293960L, "Rev.3 | 800XE | 03/01/1985" },
{ RTI_XLE, 3780165629L, "Rev.4 | XEGS | 05/07/1987" },
{ RTI_XLE, 257804588L, "Arabic | 65XE | 07/21/1987" },
{ RTI_XLE, 2766230028L, "Rev.3 | ARGS | ---" },
{ RTI_XLE, 1577346053L, "Rev.2.3 | QMEG | ---" },
{ RTI_XLE, 1932228838L, "Rev.3.2 | QMEG | ---" },
{ RTI_XLE, 2265792253L, "Rev.3.8 | QMEG | ---" },
{ RTI_XLE, 2603811756L, "Rev.4.2 | QMEG | ---" },
{ RTI_XLE, 1105050917L, "Rev.4.3 | QMEG | ---" },
{ RTI_XLE, 2258206520L, "--- | TOMS | ---" },
{ RTI_A52, 3182898204L, "--- | 5200 | ---" },
// { RTI_A52, 2155009960L, "FoxOS | 5200 | ---" },
{ RTI_BAS, 3021189661L, "Rev.A | --- | ---" },
{ RTI_BAS, 266326092L, "Rev.B | --- | ---" },
{ RTI_BAS, 2190982779L, "Rev.C | --- | ---" }
};
Z kolei starszą wersję tego systemu można znaleźć tutaj,
obecnie w pliku "osromv36.zip", gdzie została oznaczona jako REV3B.
Wersja ta nie jest rozpoznawana przez emulator, ale również
działa.
Jak sprawdzić wersję systemu?
Pod powyższym linkiem można również znaleźć źródła programu
"rominfo", który na pececie wyświetla informacje o systemowych
plikach ROM Atari. Rozpoznaje on następujące wersje:
/* all known OS revs */
#define OS_REVS (sizeof crc_os / sizeof(struct crc_info))
static crc_table crc_os = {
{ 0xc1b3bb02L, "Atari 400/800 rev.A NTSC" },
{ 0x72b3fed4L, "Atari 400/800 rev.A PAL" },
{ 0x0e86d61dL, "Atari 400/800 rev.B NTSC" },
{ 0xc5c11546L, "Atari 1200XL OS rev.10" },
{ 0x1a1d7b1bL, "Atari 1200XL OS rev.11" },
{ 0x643bcc98L, "Atari 600XL OS rev.1" },
{ 0x1f9cd270L, "Atari XL/XE OS rev.2" },
{ 0x29f133f7L, "Atari 800XE OS rev.3" },
{ 0x45f47988L, "Atari 65XE OS rev.3B (Arabic)" },
{ 0x1eaf4002L, "Atari XEGS OS rev.4" }
};
Jak widać, ma w swojej bazie REV3B, brakuje z kolei wersji
oznaczonej jako REV59, którą akceptuje "Atari800Win PLus", w
związku z czym do powyższej listy dodałem:
{ 0x3e28a1feL, "Atari 400/800 rev.B PAL v.1" },
{ 0x1f150032L, "Atari 400/800 rev.B PAL v.2" },
{ 0xf0a236d3L, "Atari 65XE OS rev.59 Arabic v.2 known as 59"
},
...i zmieniłem opis wersji 3B na 59 zgodnie z regułą, według której
są odczytywane numery pozostałych wersji, czyli jako wartość
dziesiętna:
{ 0x45f47988L, "Atari 65XE OS rev.59 Arabic v.1 known as
3B" },
Dodałem też "plus" do numeru wersji - skompilowany program
"rominfo" tutaj.
Tak wyglądają informacje uzyskane tym programem:
Get ROM info for file: REV3B.ROM
ROM file CRC: 0x45f47988, Atari 65XE OS rev.59 Arabic v.1 known as
3B
Atari System: 65XE Arabic, OS: rev.59
FCD8 : 4C (400/800 = A2)
FFF8 : B1 (400/800 Rev.A/NTSC = DD, Rev.A/PAL = D6, Rev.B/NTSC =
F3, Rev.B/PAL = 22?)
FFF9 : 3C (400/800 Rev.A = 57, Rev.B = E6 or 58)
FFF1 : 02 (1200XL = 01)
FFF7 : 3B (Revision number for XL/XE)
OS Date: 21/07/87 (DD/MM/YY)
Get ROM info for file: REV59.ROM
ROM file CRC: 0xf0a236d3, Atari 65XE OS rev.59 Arabic v.2 known as
59
Atari System: 65XE Arabic, OS: rev.59
FCD8 : 4C (400/800 = A2)
FFF8 : DD (400/800 Rev.A/NTSC = DD, Rev.A/PAL = D6, Rev.B/NTSC =
F3, Rev.B/PAL = 22?)
FFF9 : 71 (400/800 Rev.A = 57, Rev.B = E6 or 58)
FFF1 : 02 (1200XL = 01)
FFF7 : 3B (Revision number for XL/XE)
OS Date: 21/07/87 (DD/MM/YY)
Dla uszkodzonego:
Get ROM info for file: ARABICROM
ROM file CRC: 0x7f9a76c8, Unknown CRC!
Atari System: 65XE Arabic, OS: rev.59
FCD8 : 4C (400/800 = A2)
FFF8 : F0 (400/800 Rev.A/NTSC = DD, Rev.A/PAL = D6, Rev.B/NTSC =
F3, Rev.B/PAL = 22?)
FFF9 : 71 (400/800 Rev.A = 57, Rev.B = E6 or 58)
FFF1 : 02 (1200XL = 01)
FFF7 : 3B (Revision number for XL/XE)
OS Date: 21/07/E1 (DD/MM/YY)
Bezpośrednio na badanym Atari dane o systemie można odczytać
programem "SysInfo" lub z Basic'a przez sprawdzenie odpowiednich
bajtów jak wyżej, przykładowo ? PEEK(65527)
-
aby odczytać numer "revision".
wynik w "SysInfo 2.20"
Zgrywanie ROM z Atari
16-to kilobajtowy ROM Atari można zgrać programem
"COPYOS", który
uruchamiamy na Atari. Ostatnie 16384 bajty utworzonego pliku
(należy usunąć pierwsze 6 bajtów nagłówka) to ROM, który możemy
użyć jako system dla emulatora. Z kolei po podziale tego pliku na
bloki po 1024 bajty - czwarty i dziewiąty (licząc od 1) będą
zawierały zestawy znaków, które można odczytać dowolnym programem
odczytującym pliki FNT.
Basic nie zawiera fontów, jednak, gdy chcemy go zgrać na przykład
do użycia z emulatorem, można to zrobić programem
"ROMCOPY". Podobnie jak poprzedni, uruchamiamy go na Atari, z
tym, że z włączonym Basic'iem (bez klawisza Option na starcie).
Ostatnie 8192 bajty utworzonego pliku to ROM Basic'a.
Do wyodrębnienia potrzebnych fragmentów plików zgranych z Atari, po
przeniesieniu ich na peceta, można użyć programu
"TinyHexer" (bardzo funkcjonalny edytor). W tym celu tworzymy
pusty plik (opcja File->New), wybieramy jeden z plików
utworzonych na Atari, aby wstawić jego część (File->Insert
Partial File...), podajemy adres, rozmiar i zapisujemy plik pod
odpowiednią nazwą (File->Save as...), następnie, aby się nie
pomylić, zamykamy go i powtarzamy całą procedurę dla kolejnego/-ych
plików.
Dla pliku zgranego programem "COPYOS", należy wpisać 6 i +0x4000,
plik zapisać jak "ATARIXL.ROM". Dla zgranego "ROMCOPY": 0x207D i
+0x2000 - nazwa pliku to "ATARIBAS.ROM". Aby wyciągnąć czcionki
postępujemy podobnie z utworzonym plikiem "ATARIXL.ROM". Wartości
0xC00 i +0x400 - plik "ATARI2.FNT" (zestaw alternatywny), 0x2000 i
+0x400 - plik "ATARI1.FNT" (standardowy).
Program "ROMCOPY" służy do zgrywania cartridge'y, więc gdyby ktoś
chciał go użyć w tym celu oczywiście należy go uruchomić bez
Basic'a (z Option). Ostrzegam: wkładanie lub wyjmowanie cartridge'a
przy włączonym komputerze może spowodować uszkodzenia!
Pliki FNT z czcionkami z różnych systemów (także te uszkodzone - do
podejrzenia) do ściągnięcia
tutaj.
=====
Uzupełnienie z 19 lutego: QTZ podesłał dla wygodnickich dyskietkę,
na której nagrane są programy "COPYOS" oraz "ROM COPY", o których
mowa w artykule. Pliczek
tutaj.