Trochę się zeszło, ale w końcu przerobiłem temat. Musiałem samemu oprogramować obsługę formatu WFM.
Tematem było obliczenie przesunięć fazowych na nóżce COL względem podnośnej koloru doprowadzonej na nóżkę PAL. Podnośna ma częstotliwość 4433618,75 Hz (ok. 4,43 MHz). Do analizy wykorzystałem pliki:
5v-pal-2.wfm - zrzut sygnałów PAL i COL z linii 32
5v-pal-1.wfm - zrzut sygnałów PAL i COL z linii 33
7v-pal-1.wfm - zrzut sygnałów PAL i COL z linii 32
7v-pal-2.wfm - zrzut sygnałów PAL i COL z linii 33
9v-osc-1.wfm - zrzut sygnałów OSC i COL z linii 32
9v-pal-2.wfm - zrzut sygnałów PAL i COL z linii 33
Po pierwsze, nazwy plików 5v-* były zamienione. Po drugie, brakowało prawidłowego pliku 9v-pal-1.wfm. Na szczęście plik 9v-osc-1.wfm na końcu zawiera zrzut colorbursta z następnej linii - pozwoliło mi to odtworzyć brakujące przesunięcia fazowe.
Oto poglądowy wykres obrazujący jak PAL GTIA opóźnia sygnał PAL:
Oś pozioma to poszczególne chrominancje: e1, e2, ..., eF - chrominancje $1..$f w linii parzystej; o1, o2, ..., oF - chrominancje w linii nieparzystej. Oś pionowa to opóźnienie; jednostką jest tutaj długość pełnego cyklu podnośnej koloru, czyli 1/(4,43 MHz) = ok. 255,55 ns.
Np. wartość 0,6 w kolumnie e7 oznacza, że sygnał na nóżce COL dla chrominancji $7 w liniach parzystych przy napięciu 7V na nóżce DEL jest opóźniony w stosunku do sygnału na nóżce PAL o 0,6/(4,43 MHz) = ok. 135,77 ns.
Na wykresie nie widać, ale opóźnienie sygnału colorbursta jest równe opóźnieniu chrominancji $1: e1 w liniach parzystych, o1 w nieparzystych.
Od razu widać, że GTIA różnie opóźnia sygnały dla tej samej chrominancji w liniach parzystych i nieparzystych. Nie dziwota, tak ma być w systemie PAL.
Ogólny wzór na opóźnienie jest następujący:
PAL_DELAY(hue) = 95,2 ns + ADD(hue)*100,7 ns + MULT(hue)*X
gdzie
ADD(hue) może być 0 lub 1,
MULT(hue) może być 0, 1, 2, ..., 7,
X zależy od napięcia na nóżce DEL.
Przyporządkowanie parametrów ADD i MULT jest z grubsza dowolne - inaczej niż w NTSC, gdzie wzór na opóźnienie wygląda mniej więcej tak:
NTSC_DELAY(hue) = 150 ns + hue*X
Zależność między napięciem na nóżce DEL a opóźnieniem X jest nieliniowa - dla danych punktów pomiarowych wynosi ok.:
17.37 ns dla 5V,
10.60 ns dla 7V,
7.44 ns dla 9V.
Może jest to zależność logarytmiczna, może kwadratowa - nie wiem, elektronikiem nie jestem, nie znam się. Może ktoś z Was kto się zna na tranzystorach, wie, jak takie opóźnienie jest fizycznie zrealizowane, i mi podpowie.
Wygląda to tak, jakby układ miał 7-elementową linię opóźniającą (regulowaną napięciem na DEL) i jeszcze dodatkowy element, który opóźnia sygnał o 100,7 ns (albo o 1/(4,43 MHz) - 100,7 ns; trudno powiedzieć które opóźnienie jest bazowe względem którego). Ciekawostka - na oscylogramach widać, że kształt fali dla chrominancji, które "przechodzą" przez ten dodatkowy element opóźniający, jest inny niż dla pozostałych chrominancji - wygląda jakby był odwrócony w pionie.
Widać że w implementacji kodowania PAL panowie poszli na łatwiznę. Według standardu przesunięcie fazowe między colorburstami w liniach parzystych i nieparzystych powinno być dokładnie 90°. W GTIA zależy ono od napięcia na nóżce DEL. Niesie to za sobą interesujące konsekwencje:
1. Telewizor w każdej linii odtwarza oryginalną podnośną koloru poprzez zsumowanie colorburstów z ostatnich dwóch linii (parzystej i nieparzystej). Jak pamiętamy z matematyki ;-) sumowanie dwóch sinusoid o tej samej częstotliwości i amplitudzie lecz o różnych fazach daje w wyniku sinusoidę, której amplituda jest zależna od przesunięcia fazowego między składowymi sinusoidami. Ponieważ amplituda podnośnej jest używana jako punkt odniesienia dla nasycenia kolorów, efekt jest taki że regulując napięcie na nóżce DEL zmieniamy nie tylko wewnętrzne opóźnienia, ale też nasycenie kolorów.
2. Dając odpowiednio niskie napięcie na DEL (niższe niż 5V) możemy doprowadzić do tego, że przesunięcie fazowe między colorburstami "parzystymi" i "nieparzystymi" wyniesie nawet 180°. W takiej sytuacji telewizor nie potrafi już odróżnić linii parzystych od nieparzystych - mój odbiornik wtedy przestaje w ogóle interpretować sygnał koloru i wyświetla obraz czarno-biały.
3. Dając jeszcze niższe napięcie możemy doprowadzić do przesunięcia między colorburstami większego niż 180°. Wtedy telewizor zaczyna interpretować kolory "odwrotnie" - linie nieparzyste traktuje jak parzyste i na odwrót.
W każdym razie - analiza pozwoliła dokładnie odtworzyć sposób generowania koloru przez PAL-owski GTIA. Implementacja trafiła właśnie do Atari800. Wyżej wymienione 3 "interesujące konsekwencje" zostały zaimplementowane, ale jednej rzeczy wciąż brakuje - paleta emulatora ma nadal tylko 256 kolorów, uśrednionych na podstawie wyliczeń dla linii parzystych i nieparzystych. Nie da się wyświetlić więcej niż 256 kolorów tak jak potrafi to prawdziwe GTIA. Taka zmiana wymagać będzie poważniejszego przeorania emulatora - nie wiadomo ile to zajmie.
Wielkie dzięki dla Willy'ego!