speccy.pl
Facebook Like


SPECCY.PL

[SPECCY.PL PARTY 2023.1]

[WIKI SPECCY.PL]
Polecamy

KOMITET SPOŁECZNY KRONIKA POLSKIEJ DEMOSCENY
PIXEL HEAVEN 2023
AYGOR
Forum ZX Spectrum
Zawartość panelu chwilowo niedostępna
Archiwum plików ZX Spectrum
Nawigacja
[Zin80#4] Ilu bitowy jest dźwięk w ZX Spectrum?

Tekst został opublikowany w Zin80 #4

Ilu bitowy jest dźwięk w ZX Spectrum?
by KWF

Postawione w tytule pytanie jest z serii pytań retorycznych, z oczywistą odpowiedzią, którą zna każdy użytkownik Speccy oraz oponent z obozu Atari lub Commodore. Odpowiedź brzmiała i brzmi do dzisiaj „Jednobitowy bzyczek!”, zapewne okraszona kilkoma epitetami albo wywodem o wyższości dźwięków generowanych przez konkurentów z epoki.

Nie ma się co obruszać, ponieważ ZX Spectrum na tle innych konstrukcji wypadał blado. Ośmiobitowa konkurencja wykorzystywała dedykowane układy generującę dźwięki SID (ang. Sound Interface Device) lub dedykowane układy obsługi klawiatury POKEY (ang. Pot Keyboard Integrated Circuit) z rejestrami do generacji dźwięku. Sir Clive Sinclair postawił przed projektantami ZX Spectrum podstawowe wymaganie, aby jego komputer kosztował poniżej 100 funtów brytyjskich w 1982 roku (co odpowiadałoby 360 funtom obecnie). Okrojony budżet produktu finalnego przełożył się na wybrane rozwiązanie techniczne, w którym zastosowano tylko jeden układ dużej skali integracji ULA. ULA robiła wszystko, jeśli chodzi o zarządzanie komputerem, łącznie z obsługą wszystkich wbudowanych urządzeń zewnętrznych w tym wyjścia na wyświetlacz, odczytu klawiatury, wejścia i wyjścia magnetofonowego, i układu generacji dźwięku. Po latach i wygaszonych wojnach klanów można śmiało zapytać, czy taka oczywista odpowiedź na tytułowe pytanie jest prawdziwa.

OBWODY ZEWNĘTRZNE

Na pierwszy rzut należałoby przyjrzeć się obwodom analogowym, które są połączeniem ULA’i ze światem zewnętrznym poza ZX Spectrum. Zaprojektowano je w ciekawy sposób stanowiący zarazem uklad wejscia i wyjscia oraz tak aby dźwięki generowane przy procedurze zapisu na magnetofonie były wyprowadzone na wyjście MIC. Należy także zauważyć, ze wejście i wyjście dźwięku jest współdzielone od strony układu ULA, a jego dokładny opis zamieszczono w dalszej części artykułu.

Na płycie ZX Spectrum znajdują się elementy bierne dopasowujące sygnał analogowy do formy akceptowalnej przez ULA. Zastosowanie elementów biernych wymusza, aby dostarczany sygnał wejściowy do gniazda EAR miał odpowiednią amplitudę. Specyfikacja ZX Spectrum opisuje, że jego wartość międzyszczytowa (ang. Vpp = peak-to-peak voltage) powinna zawierać się w przedziale od 4 do 10 V dla poprawnego działania odczytu z taśmy. Wymagania te nie są przypadkowe i wynikają z budowy wewnętrznej układu ULA, choć jednak sporo zawyżone, o czym za chwilę.

Schemat we/wy magnetofonowego w ZX Spectrum
Schemat we/wy magnetofonowego w ZX Spectrum

Strumień danych z magnetofonu jest w formie „pisków” o ściśle określonym czasie trwania dla pilota, sygnału synchronizacji, zera i jedynki logicznej. Dla uproszczenia można przyjąć, że sygnał wejściowy do ZX Spectrum jest złożony z sygnałów o przebiegu sinusoidalnym o modulowanej częstotliwości. Takie założenie jest prawdziwe dla źródła sygnału jakim jest taśma magnetofonowa i magnetofon, ale nie jest prawdziwe dla urządzeń typu TZXduino. TZXduino generuje sygnał przemienny o modulowanej częstotliwości, ale o przebiegu prostokątnym. Kształt sygnału nie większego znaczenia dla zasady działania całego obwodu wejściowego, jedynie obserwowane przebiegi mają inny charakter. Obwód wejściowy, formujący sygnał dźwiękowy na akceptowalny przez ULA’ę nie zastosowano nawet najprostszego klucza na tranzystorze. Sygnał jest filtrowany ze składowej stałej, a jego dolna połówka jest odcinana (minus spadek napięcia na diodzie D13). W wyniku użyteczna forma sygnału audio zawiera w sobie nieco więcej niż górną połówkę sygnału wejściowego. Wewnątrz ULA’i sygnał ten przechodzi przez dzielnik rezystancyjny wyznaczający punkt pracy wzmacniacza/klucza na jednym tranzystorze. Próg zadziałania klucza został ustalony przez projektantów ULA’i na ok. 0,7 V, przy pominięciu różnić pomiędzy generacjami układów firmy Ferranti. Wyjście z klucza steruje bistabilnym multiwibratorem, którego wyjście podawane jest do wtórnika emiterowego dopasowującego poziom sygnału do poziomu napięć wewnętrznej logiki ULA’i. Dalsza obróbka sygnału i jego interpretacja odbywa się w części cyfrowej ULA’i. Procedura odczytu danych w ROM reaguje nie tyle co na sam poziom napięcia, a na zmianę jego poziomu (tzw. zbocze). Aby detekcja działała prawidłowo, impulsy wejściowe do ULA’i muszą spełniać wymagania do ich amplitudy oraz częstotliwości.

Poziom napięcia wejściowego 0,7 V po wyprostowaniu powoduje zadziałanie klucza wejściowego w ULA’i i zmianę stanu multiwibratora. W dużym uproszczeniu można powiedzieć, że sygnał wejściowy z magnetofonu musi być sygnałem o amplitudzie większej niż 0,7 V (Vpp = 1,4 V), aby ZX Spectrum było w stanie poprawnie zinterpretować taki strumień danych. Konstrukcja obwodu wejściowego sygnału audio, nastręcza wiele problemów ze współczesnymi źródłami dźwięku, np. telefonami komórkowymi, w które wbudowano zabezpieczenia ograniczające poziom sygnału na wyjściu słuchawkowym w celu ochronu słuchu użytkownika. W wielu przypadkach sygnały generowane przez takie źródła są zbyt słabe. Należy także zaznaczyć, iż wszystkie analizy i opisy powinny być przeprowadzane przy założeniu, że źródło dźwięku jest odpasowane impedancyjnie do wejścia w ZX Spectrum. W przeciwnym przypadku taka analiza jest pozbawiona sensu.

Oscylogramy sygnałów wejściowych: 1 - gniazdo EAR ZX Spectrum, 2 - wejście ULA (n.28)
Oscylogramy sygnałów wejściowych: 1 - gniazdo EAR ZX Spectrum, 2 - wejście ULA (n.28)

Kiedy ULA generuje dźwięk, zewnętrzny obwód formuje sekwencję impulsów w przebieg zbliżony do sinusoidalnego o tej samej częstotliwości co impulsy wyjściowe z ULA i wyprowadza je na gniazdo MIC. Służył do tego pasywny filtr dolnoprzepustowy. Natomiast dźwięki odtwarzane przez głośniczek przechodzą przez połączone szeregowo dwie diody krzemowe typu 1N4148 (w ZX Spectrum wyd. 1 i 2) lub diodę typu 1N4148 i wtórnik emiterowy (od ZX Spectrum wyd. 3). Analizując zastosowany układ, stanie się oczywiste, że aby głośnik mógł spełniać swoją rolę, napięcie szczytowe na wyjściu ULA musi być wyższe niż spadek napięcia na dwóch diodach krzemowych i oscylować powyżej 1,2 - 1,4 V, o czym poniżej.

URSZULA

Aby odpowiedzieć na pytanie postawione w tytule należy przyjrzeć się temu w jaki sposób działa ULA. Dokładny opis ULA-’i i jej działania znajduje się w książce Chrisa Smitha pt. „The ZX Spectrum ULA - How to design a microcomputer”. W książce tej w rozdziałach 19 i 20 znajdują się szczegółowe opisy wybiegające poza ramy tego artykułu. W tym miejscu należy przypomnieć, że sygnały odczytywane lub zapisywane na taśmie magnetofonowej są szeregowym strumieniem danych, dobrze znanymi „piskami” oraz wizualizowane zmieniającymi się paskami na ramce ekranu w zależności od przesyłanego typu danych. Za konwersję szeregowego strumienia danych na równoległy odpowiada ULA (pośrednio) i procedury zaszyte w ROMie. Dane wczytywane z magnetofonu są opisane dwustanowo, dlatego do ich odczytu i zapisu wystarczy jeden bit na dedykowanym porcie wejścia/wyjścia (ang. Input/Output [I/O]).

PORT 254

W ZX Spectrum, zresztą tak samo jak w jego protoplastach, najważniejszy jest port 254 (0xFE), do którego przypisano obsługę klawiatury, odczyt i zapis na magnetofon, generację dźwięku oraz zmianę koloru ramki na ekranie (tzw. border). Poszczególne bity w tym porcie zostały wykorzystane w następujący sposób:

FunkcjaNumer bitu
76543210
WejścieEARKlawiatura
WyjścieSPKMICRamka obrazu
Tab 1. Mapa portu 254

Dla operacji wyjścia na tym porcie pojawienie się zera na trzecim bicie2 (MIC) aktywuje tylko wyjście magnetofonowe. Stan wysoki na czwartym bicie (SPK) spowoduje włączenie się wewnętrznego głośnika, a także obecność dźwięku na wyjściu do magnetofonu MIC. Wywołaniem tego portu steruje uproszczony dekoder adresów, w którym adres 254 (0xFE) dekodowany jest z wykorzystaniem tylko linii adresowej A0. Jednoadresowy dekoder został odziedziczony po wcześniejszych konstrukcjach Sinclair Research – ZX80 i ZX81. Należy pamiętać, że każde odwołanie do portów w których linia adresowa A0 jest w stanie niskim, powodowało aktywację portu ULA. W uproszczeniu odwołania do wszystkich portów parzystych w ZX Spectrum włączało port 254 zarezerwowany dla ULA. Aktywacja tego portu jest także uwarunkowana statusem linii /IORQ (ang. Input-Output Request) oraz wewnętrznego wskaźnika operacji ULA na dolnym RAMie, tzw. contention. Stan niski na liniach sterujących /RD (ang, ReaD) i /WR (ang. WRite) określał czy następuje odczyt (/PortRD), czy zapis (/PortWR) do tego portu.

EAR JAK UCHO

Układ wejścia EAR w ULA
Układ wejścia EAR w ULA

ULA jest układem cyfrowym (do pewnego momentu) i wymaga poziomów TTL dla sygnałów wejściowych. Wewnętrznie w ULA wbudowano bardzo prosty układ wejściowy – bramkowany bufor z wejścia analogowego z magnetofonu wprost na szynę danych (D6).

Ściśle określona sekwencja zmian sygnału wejściowego (przełączanie pomiędzy stanem niskim a wysokim), o ściśle określonym ich czasie trwania (liczonym w taktach procesora) jest interpretowana przez procedury w ROMie jako poszczególne bity protokołu szeregowego. Dokładny opis procedury do odczytu i interpretacji danuych można znaleźć w zdeasemblowanej i skomentowanej wersji ROMu, dostępnego w sieci.

MIC JAK MIKROFON

Układ wyjścia MIC w ULA
Układ wyjścia MIC w ULA

Wyjście na magnetofon jest także szeregowe i dwustanowe na bicie trzecim (D3) portu wyjściowego 0xFE. Wewnętrznie w ULA jest ono zrealizowane na jednym przerzutniku D (pamięć jednobitowa), którego wyjście jest aktywowane w taki sposób, aby liczba zmian stanów logicznych na jego wyjściu odpowiadała sekwencji równej stanowi jednego bitu danych w protokole szeregowym.

SPK JAK GŁOŚNIK

W konstrukcji ZX Spectrum nie zastosowano dedykowanego układu dźwiękowego, a za generację dźwięku odpowiada ULA oraz procedura w ROM. Dźwięki generowane są programowo na podstawie software’owego oscylatora, którego oscylacje powodują zmiany stanu logicznego pojedynczego bitu na porcie wyjściowym 254 z zadaną przez użytkownika częstotliwością i przez określony czas (np. BEEP czas_trwania, ton3). Mechanizm generowania dźwięków jest analogiczny do zastosowanego dla wyjścia na taśmę, z tą różnicą, że dane wystawiane są na bicie 4 (D4) portu wyjściowego 0xFE przez procedurę w ROMie.

WYJŚCIE CYFROWE A MOŻE ANALOGOWE

Forma samego układu ULA w obudowie o 40 nóżkach i ściśle określona liczba możliwych połączeń ze światem zewnętrznym narzuciła ograniczenia w zastosowanych rozwiązaniach. Richard Altwasser zaproponował współdzielone połączenia ze światem zewnętrznym dla wejścia audio EAR i wyjścia MIC/SPK. Jego podejście doprowadziło do bardzo ciekawego rozwiązania, które zostało opatentowane przez Sinclair Research w 1982 roku.

Wyjście analogowe ULA
Wyjście analogowe ULA

O ile wejście EAR można śmiało uznać za w pełni cyfrowe o tyle sprawa komplikuje się dla wyjścia MIC/SPK. ULA była układem o dużej skali integracji i konfiguracji przystosowanej do elastycznego wykorzystania. Ferranti dostarczał maski układów i gotowych elementów w formie komórek do wykorzystania, a do zleceniodawcy należało zaprojektowanie struktury połączeń wewnętrznych dostępnych elementów, w taki sposób aby logika spełniala jego wymagania. ULA miała w swojej budowie dostępne naniesione komórki do budowy urządzeń wyjściowych i je wykorzystano do budowy bardzo prostego przetwornika cyfrowo-analogowego. Jego zadaniem było dostarczenie sygnału wyjściowego o dwóch amplitudach zależnych od typu wyjścia będącego w użyciu (MIC lub SPK). Przetwornik ten został zbudowany z dzielnika rezystancyjnego, którego podział był sterowany tranzystorami i teoretycznie mógł generować cztery poziomy napięć wyjściowych w zależności od stanu bitów danych D3 i D4 portu wyjściowego 0xFE. Poziomy tych napięć zostały dobrane tak, aby dźwięk uruchamiał wewnętrzny głośnik ZX Spectrum i był wyprowadzany na wyjście MIC. Natomiast sygnał z zapisem programu na magnetofonie był „słyszalny” tylko na wyjściu MIC i nieobecny na wewnętrznym głośniczku. Można by rzec, skoro wyjście z ULA’i jest opisane na czterech stanach, więc dźwięk jest generowany dwubitowo. Niestety nie jest tak różowo, ponieważ cztery stany są stanami teoretycznymi i w praktyce dwa z nich są trudne do rozróżnienia na wyjściu ULA. Dokładny opis, obliczenia dla 4 stanów przetwornika C/A oraz różnice pomiędzy wersjami ULA są zawarte w książce Chrisa w rozdziałach 19 i 20.

Na przytoczonym schemacie podano dwie wartości rezystorów dzielnika rezystancyjnego, w kolorze czarnym wartości z książki o ULA (rozdział 20), natomiast w kolorze niebieskim wartości z wniosku patentowego. Różnice wynikają z faktu, iż wniosek patentowy był oparty o wartości elementów dostępnych w predefiniowanych komórkach CML układów Ferranti z serii 5000. W procesie rekonstrukcji ULA’i ze zdjęć jej struktury, korzystano z układów z serii 6000 i faktycznych wymiarów geometrycznych poszczególnych elementów. Różnice w układzie wyjściowym pomiędzy obiema wersjami ULA’i zostały dokładnie opisane w książce i mogą być pominięte. Z wartości w tabeli 2, nasuwa się oczywisty wniosek, że poziomy napięć w przypadku logicznej jedynki na obu bitach lub tylko bicie D3 są prawie identyczne. Ponadto, sytuacja w której oba bity D3 i D4 będą w stanie wysokim na porcie 254 jest mało prawdopodobna i oznaczałaby, że równolegle wykonywane są procedury generowania dźwięku i zapisu na taśmę. Z tego powodu należy przyjąć, że przetwornik C/A w ULA jest zdolny do generowania trzech poziomów napięcia wyjściowego, więc jest półtorabitowy.

Sygnał SPKSygnał MICNapięcie wyjściowe
ULA 6C000 (pin 28)
Bit D4Bit D3
000,34 V
010,65 V
103,59 V
113,75 V
Tab. 2. Wartości napięć wyjściowych ULA

TIMEX I JEGO SCLD

Timex, projektując swoją wersję ULA, nie zmienił podejścia do obwodów wyjścia na magnetofon i wewnętrzny głośnik. Mogłoby się wydawać, że zastosowanie większego układu o 68 wyprowadzeniach pozwoliłoby na pełną niezależność wejścia i wyjść dla wszystkich 3 sygnałów (EAR, MIC i SPK), ale jednak nie. Rozdzielono wejście EAR od wyjść MIC i SPK, które nadal współdzielą wyprowadzenie z układu. Mogło to wynikać z tego, że SCLD zawiera kilka dodatkowych elementów logicznych w tym logikę dla sterowania pamięciami górnego RAM, która w ZX Spectrum jest zbudowana z układów dyskretnych. Ponad to, Timex w swoich założeniach wyposażył swoje komputery TS 2068 i TC 2068 w dedykowany programowalny generator dźwięków (ang. Programmable Sound Generator) typu AY-8-8912. Logika sterująca PSG została także zawarta w SCLD. Co prawda do obsługi PSG wykorzystano inne porty niż te w ZX Spectrum 128K, to jednak możliwości dźwiękowe dużych Timexów były o niebo lepsze od tych ze starszego brata. Sytuacja zmieniła się diametralnie, kiedy Timex zaprojektował i wyprodukował TC 2048, którego pozbawiono układu PSG, ale do jego budowy wykorzystano ten sam układ SCLD co w przypadku TC 2068, tj. SCLD TS 2068 PAL. Wewnętrznie w TC 2048 drzemią ukryte możliwości, które nie były wykorzystane przez oprogramowanie ZX Spectrum, ani przez samą konstrukcję tego mikrokomputera. W ostatecznym rozrachunku TC 2048 niewiele różni się od protoplasty i zamierzony cel prawie pełnej zgodności z ZX Spectrum został osiągnięty przez inżynierów Timexa.

Sygnał SPKSygnał MICNapięcie wyjściowe
SCLD (pin 12)
Bit D4Bit D3
000,86 V
010,29 V (L) 0,90 V (H)
100,86 V (L) 5,0 V (H)
110,29 V (L) 5,0 V (H)
Tab. 3. Wartości napięć wyjściowych ULA (L - stan niski, H stan wysoki)

W pierwszych wersjach płyty TC 2048 wejście EAR jest takie samo jak w Speccy, z elementami pasywnymi, co skutkuje pewną głuchotą Timexa. W ostatniej jej wersji Timex zastosował klucz na tranzystorze, co pozwala na wczytywanie programów ze słabszych źródeł sygnału. Możliwości generowania dźwięków nadal opierają się o rozwiązania z ULA’i, z tym że poziomy sygnałów generowanych dla MIC i SPK różnią się nieznacznie od tych z ZX Spectrum.

W Timexie wyjście MIC jest, tak samo jak w ZX Spectrum, zbudowane z elementów pasywnych (filtr dolnoprzepustowy i układ formujący), natomiast wyjście na wewnętrzny głośnik przepuszczane jest przez prosty wzmacniacz na jednym tranzystorze. Jeśli porówna się odsłuchowo ZX Spectrum z Timexem, to ten pierwszy wypada jakoś tak cicho i blado w porównaniu z „wrzaskami” dobiegającymi z dużego głośnika w Timexie. Dla jednych to zaleta, dla innych wada. Włączenie się głośniczka w Timexie o pierwszej w nocy przy Manic Minerze może obudzić i doprowadzić do szewskiej pasji współdomowników. A co do samych poziomów sygnałów, nadal można przyjąć, że mamy do czynienia z przetwornikiem półtorabitowym.

Symulacja dzielnika napięciowego dla sygnałów (SPK i MIC) o częstotliwości 500Hz.
Symulacja dzielnika napięciowego dla sygnałów (SPK i MIC) o częstotliwości 500Hz.

SŁOWO NA KONIEC

Z technicznego punktu widzenia nic nie stoi na przeszkodzie, aby zmusić Speccy do generowania dźwięku o większej rozdzielczości niż 1 bit, z trzema poziomami napięcia wyjściowego. Wymagane będzie pominięcie procedur w ROMie oraz podłączenie się pod zewnętrzny wzmacniacz i głośnik. Niestety brak dedykowanego układu dźwiękowego obciąża procesor w momencie generowania dźwięku i nie jest on zdolny do wykonania jakiejkolwiek innej pracy niż jego generowanie. Należy także dodać, że natura ludzka jest przekorna i wyzwala kreatywność, co zostało udowodnione w wielu grach i demach, które ograniczenia dźwiękowe zamieniły w majstersztyki. Aby posłuchać, co można uzyskać na 1-bitowym beeperze przez manipulację danymi na porcie 254 warto sięgnąć do softu, np. „Trantor The Last Stormtrooper”, „Rubber Love”, „Huvva”, „King Tut’s Awakening” oraz wielu innych tytułów. Tak na marginesie, nie należy wdawać się w żadną dyskusję na temat „półtorabitowości dźwięków ZX Spectrum” z twardogłowymi miłośnikami maszynek spod znaku A lub C, ponieważ na bank zostaniemy obdarowani pełnym politowania spojrzeniem lub posądzeni o herezję.

OD AUTORA

Przyczynkiem do napisania tego artykułu były moje doświadczenia zdobyte przy uruchamianiu zamiennika SCLD do Timexa. Sporo czasu spędziłem na poprawnym odwzorowaniu sygnałów wyjściowych z w pełni cyfrowego CPLD na analogowe wyjście magnetofonu i głośnika oraz jego zgodności z pierwowzorem. Ze względu na optymalizację typów części potrzebnych do budowy zamiennika oraz inną charakterystykę sygnałów wyjściowych z CPLD zmieniłem wagi dzielnika rezystancyjnego oraz liczbę tranzystorów niezbędnych do przełączania jego konfiguracji. Przy projektowaniu wykonałem kilka symulacji w LTSpice, a następnie wyniki zweryfikowałem w układzie rzeczywistym. Każdy może zbudować taki układ na płytce prototypowej i sprawdzić jego działanie przez zwieranie wejść SPK i MIC do zasilania i masy oraz pomiar napięcia na wyjściu TAPE, do czego serdecznie namawiam.

Sygnał SPKSygnał MICNapięcie wyjściowe
LTSpice
Napięcie wyjściowe
SCLD Q (pin 12)
Bit D4Bit D3
000,23 V0,26 V
010,78 V0,75 V
104,27 V4,25 V
Brak komentarzy. Może czas dodać swój?
Dodaj komentarz
Zaloguj się, aby móc dodać komentarz.
Oceny
Tylko zarejestrowani użytkownicy mogą oceniać zawartość strony
Zaloguj się , żeby móc zagłosować.

Brak ocen. Może czas dodać swoją?