Zakończyłem, po wielu potknięciach, budowę karty graficznej PAL. Jest ona oparta luźno o ten pomysł:
https://www.waveguide.se/?article=bitma ... -interface
z m.in. następującymi zmianami:
- posiada generator znaków (jest wyłącznie znakowa)
- używa 2KB dwuportowej pamięci RAM jako pamięci obrazu
- znaczna część logiki jest skondensowana w układzie ATF16V8
- inny generator sygnału ładowania rejestru przesuwnego
Co do zasady działania, idea jest podobna jak przypadku mojej karty VGA, jednak diabeł tkwi w szczegółach. W obu kartach linia zawiera 64 bajty pamięci obrazu, mimo że nie wszystkie te bajty są wyświetlane jako znaki. Część znaków jest "przykryta" wygaszaniem poziomym. To rozwiązanie "marnuje" część pamięci obrazu, ale umożliwia użycie tego samego zestawu liczników i do adresowania tej pamięci, i do sterowania generatorem synchronizacji. Jednak rejestr pszesuwny nie jest wyłączany na czas wygaszania, i nadal emituje piksele odpowiadające tym niewidocznym znakom. W standardzie VGA, gdzie jest osobny sygnał obrazu i osobny dla synchronizacji nie ma to znaczenia. W przypadku monitora CRT co prawda może to powodować odwrócone i roziągnięte przypadkowe znaki rysowane przez cofającą się wiązkę elektronów, ale przynajmniej nie wpływa to na synchronizację. Przy monitorze LCD można sobie emitować cokolwiek w czasie wygaszania bez żadnych negatywnych następstw.
Karta PAL nie jest taka prosta, gdyż piksele i sygnał wygaszania są transmitowane jedną i tą samą linią. Emitowanie jakichkolwiek zapalonych pikseli w czasie wygaszania powoduje zatem problemy z synchronizacją. Co więcej, piksele te zakłócają ustalenie przez telewizor poziomu czerni, i tym samym uniemożliwiają uzyskanie poprawnego kontrastu (nawet na telewizorach LCD!).
Karta nie ma żadnego wbudowanego mechanizmu sprzętowego zapewniającego że żadne zapalone piksele nie będą emitowane w czasie wygaszania. Dlatego karta ta, w przeciwieństwie do karty VGA, nie działa poprawnie samodzielnie - nie podłączona do komputera. Komputer musi zainicjalizować pamięć obrazu i upewnić się że pod adresami znajdujacymi się poza obszarem widocznym są jedynie puste znaki (spacje lub zera). Jeden z widocznych na zdjęciach potencjometrów służył do ustalenia stosunku sygnału pikseli i sygnału synchronizacji. W przypadku pracy bez podłączonego komputera potencjometr ten umożliwiał uzyskanie albo zadowalającej geometrii obrazu, albo właściwego kontrastu, ale nie obu jednocześnie.
O ile wyzerowanie wszystkich bajtów pamięci obrazu odpowiadających obszarom wygaszania poziomego pozwala uzyskać prawidłowy obraz, o tyle w przypadku wygaszania pionowego nie mamy tego luksusu. Obraz łącznie zawiera 64 znaki (w tym 50 widocznych) w każdej z 32 linii, łącznie wymaga więc 2KB pamięci obrazu, czyli innymi słowy całej dostępnej pamięci. Nie zostaje już żaden obszar który można by wyzerować i emitować z niego same czarne piksele w okresie wygaszania pionowego. Ponieważ mój telewizor potrafi wyświetlić o kilka linii więcej niż 32, 33. linia była po prostu powtórką pierwszej itd. Aby to naprawić, użyłem pewnej sztuczki. Jako że używam jedynie połowy generatora znaków, drugą (górną) połowę całkowicie wyzerowałem, następnie linię N17 (na schemacie) podłączyłem do najwyższej linii adresowej generatora znaków. Wysoki stan tej linii (czyli numer linii ekranu powyżej 256, czyli numer linii znaków powyżej 32) powoduje że generator znaków "przełącza się" na swoją pustą połowę, i '165 emituje jedynie czarne piksele.
Ostatnią różnicą względem schematu jest inny generator sygnału ładowania rejestru przesuwnego. Na schemacie jest to generator impulsu wyzwalany dowolnym zboczem zbudowany na bramce XOR (IC8B) i linii opóźniającej złożonej z trzech bramek NOT (IC3D, IC3E, IC3F). Taki układ nie zachowywał się poprawnie w moim przypadku, generował wielokrotne impulsy gdzie powinny być pojedyncze. Po sprawdzeniu oscyloskopem okazało się, że wejście tego generatora jest poprawne, a wyjście zawiera nadprogramowe impulsy rozmaitej amplitudy. Zdecydowałem się zamiast tego na rozwiązanie sprawdzone w karcie VGA: inwerter z wejściem Schmitta, a wejście to połączone z linią N3 przez filtr górnoprzepustowy RC o stałej czasowej rzędu kilkudziesięciu ns. To rozwiązanie pozwoliło wreszcie uzyskać całkowicie stabilny i kontrastowy obraz. Załączone zdjęcie jest przepalone, w rzeczywistości wyświetlane znaki są idealnie ostre i czytelne, przynajmniej na telewizorze. Przy wyświetlaniu na czteroipółcalowym monitorze cofania znaki są zbyt małe aby można je wygodnie odczytać z rozsądnej odległości. Na zdjęciu widać też jak działa napisany przeze mnie wierszowy edytor tekstu.
Na koniec jeszcze jedna ciekawostka(?): karta VGA wyświetla znaki od pierwszego bajtu każdej linii, natomiast karta PAL wyświetla dopiero od siódmego bajtu. Wymaga to programowego przesunięcia każdego znaku w pamięci obrazu o siedem bajtów w stosunku do początku linii (np. pierwszy wyświetlany znak pierwszej linii ma adres VIDEO_RAM + 07h).