START
_______________

Atari 8-bit

GAL-MMU

SIO2PC

Atari static RAM

Atari R-Flex

Atari Turbofreezer III

ARC by Pasiu/SSG

Atari Cartridge

Emulator USB Joy

SIDari

YAMari

SONari

SAMari

TIGari

I/O Dekoder

CART+ECI expander


Atari Multicart XE

Atari Full S-RAM

Atari 16-bit

ACSI-SCSI interface

Video digitizer faST

MegaSTe SCSI
internal interface


ST RAMcart

Peter Putnik's
ACSI-CF Interface


Narzędzia

GALprog

Przetwornica StepUp

Przelotki układów DIP

Laminator do PCB

Wiertarka do PCB

Wytrawiarka PCB

Monitor LCD Multi

Programator ALL-07

C64

BlackBOX 8.1

Inne projekty

CS9236 Moduł MIDI


Literatura

Hardware

Software

Varia

Nalewka wiśniowa
 

TIGari

     Kolejny układ generowania dźwięku w Atari. Tym razem wziąłem się za wiekowy
Texas Instruments Generator - SN76489AN , który został zastosowany między innymi
w komputerach TI99/4, Sord M5, ColecoAdam, BBC Micro, a także w wielu wczesnych
konsolach do gier. Jest to prosty układ generujący dźwięki w trzech kanałach z jednym generatorem szumu. Odpowiednie zaprojektowanie logiki umożliwiło bezproblemowe
dołączenie go do Atari mimo, że sterowanie jest totalnie niekompatybilne z rodziną
65xx. Sam projekt nie jest zbyt skomplikowany, jednakże dopiero zastosowanie CPLD
Xilinx całą historię uczyniło przejrzystą i upakowaną. Polecam ten projekt wszystkim
zainteresowanym budową nowych rozszerzeń dla Atari.

 




     Poniżej prezentuję schemat układu. Oryginalnie w każdym z komputerów/konsol
był zastosowany pojedynczy układ scalony. Ja w swoim projekcie zastosowałem dwa
choćby po to, aby wzbogacić możliwości dźwiękowe o trzy kanały i "stereo". Dobrze
jest przeważnie mieć więcej niż mniej :)


     Schemat logiki sterującej zawarty w CPLD Xilinx XC9572XL

     Krótki opis projektu wraz z przydatnymi plikami:

     Układ zmontowałem na zamówionej w JLCPCB płytce (ze względu na raster cpld),
której rozmiary zostały dopasowane do standardowej obudowy Z-7. Wiem, że to jest
słabe rozwiązanie, mimo to posiada zaletę - jest sporo miejsca na umieszczenie części.
     Potencjometry montażowe zastosowałem tylko w układzie prototypowym. Normalnie
należy wlutować zworki aby je pominąć. Będą przeszkadzać w zamknięciu obudowy
chyba, że się je przygnie do PCB. Przycisk tact-switch służy do wyciszenia modułu w
sytuacji gdy system "zawiśnie" i nie będzie możliwości programowego wyłączenia
wyjść audio układów.

Plik schematu format Eagle
Pliki projektu Xilinx webISE
Firmware CPLD
Pliki PCB format GERBER/EXCELLON

     Jak widać na schemacie logiki sterującej - mamy wewnątrz CPLD opisane części
składające się na to, aby całość działała zgodnie z wymaganiami TI zawartymi w
datasheet SN76489AN oraz z hardware Atari.

Datasheet SN76489AN

     Do sterowania wykorzystałem w dosyć naturalny sposób linie adresowe uzyskując
w ten sposób poniższą mapę adresową:

BASE - adres modułu ustawiany DIPswitchem (jeden z 8 obszarów na stronie $D5)
(w) - zapis, (r) - odczyt

BASE+1 (w) - adres układu 1 - kanał lewy
BASE+2 (w) - adres układu 2 - kanał prawy
BASE+3 (w) - adresowanie obydwu układów jednocześnie (!)
BASE+4 (r) - odczyt danej identyfikacyjnej - 212 dec - litera T w negatywie
BASE+8 (w) - odblokowanie wyjścia audio układu 1
BASE+16 (w) - odblokowanie wyjścia audio układu 2
BASE +24 (w) - odblokowanie wyjść audio obydwu układów (!)

     Mimo, że wszystkie informacje są zawarte w datasheet oraz w sieci Internet, podam
kilka wskazówek rozjaśniających kwestie programowe.

     Po pierwsze - układ SN76489 nie posiada jakichkolwiek układów inicjalizacji
sprzętowej po włączeniu zasilania, więc gdy się go uruchomi - natychmiast zaczyna
generować w sposób przypadkowy dźwięk. Zbudowałem więc w oparciu o klucze
analogowe 74HCT4066 układ kontroli wyjść dźwięku tak, aby po włączeniu zasilania
wyjście audio było zablokowane. Prawidłowa sekwencja inicjalizacji programowej
powinna obecnie wyglądać następująco (użyję PEEK,POKE)

PEEK BASE+4:REM Jeżeli wartość = 212 - TIGari jest obecny w systemie
POKE BASE+3,159:REM głośność kanału 1=0 dla obydwu układów
POKE BASE+3,191:REM głośność kanału 2=0 dla obydwu układów
POKE BASE+3,223:REM głośność kanału 3=0 dla obydwu kanałów
POKE BASE+3,255:REM głośność szumu s=0 dla obydwu kanałów
POKE BASE+24,0:REM odblokowanie wyjść audio obydwu kanałów

     Poniżej zamieszczam przykładowe programy w BASIC testujące zachowanie się
układów. Test 1 - przejście przez pełną skalę dźwięku obu układów - niezłe stereo.
Test 2 produkuje muzyczkę "SELF TEST" Atari na kanałach układu 1, układu 2, obydwu
układów (stereo) oraz test szumu. Programiki napisane "w locie" więc z pewnością mają
wiele wad i niedociągnięć. Mimo to - powinny działać i spełniać swoje zadanie.

Test 1
Test 2

     Model programowy jest prosty, ale mimo tego wyjaśnię co i jak:

Programowanie wysokości tonu polega na wysłaniu dwóch bajtów. Wysokość tonu jest
określana przy pomocy 10-bitowego słowa.

bajt1 7 6 5 4 3 2 1 0   bajt2 7 6 5 4 3 2 1 0   
              F F F F             F F F F F F
      1 R R R 3 2 1 0         0 0 9 8 7 6 5 4

R R R
0 0 0 - kanał 1
0 1 0 - kanał 2
1 0 0 - kanał 3

Jak widać powyżej - najstarszy bit bajtu pierwszego jest zawsze ustawiony na 1.
Kolejne 3 bity określają numer wybranego rejestru (kanału). bity od 0 do 3 stanowią
najmłodsze bity 10-bitowego słowa wysokości tonu. Bajt 2 wysyłany po pierwszym
ma bit 7 i 6 ustawiony zawsze na 0. Bity od 0 do 5 stanowią starszą część 10-bitowego
słowa sterującego wysokością (9,8,7,6,5,4).

10-bitową wartość, którą wpisujemy w powyższy sposób oblicza się nastepująco:

n=(N/f)*0,03125

Gdzie n - wartość 10bit, N - częstotliwość zegara w Hz (tu 3546894Hz), f - żądana
częstotliwość (wysokość) tonu.

Kolejne dźwięki muzyczki "SELF TEST" Atari są nastepujące:

G1 - 391,9Hz - wartość 283   bajt1=11, bajt2=17
F1 - 349,6Hz - wartość 317   bajt1=13, bajt2=19
B1 - 466,2Hz - wartość 238   bajt1=14, bajt2=14
C2 - 523,3Hz - wartość 212   bajt1=4,  bajt2=13
F2 - 698,5Hz - wartość 159   bajt1=15, bajt2=9
D2 - 587,3Hz - wartość 189   bajt1=13, bajt2=11

Aby wysłać bajt1 do kanału 1 należy dodać do wartości bajt1 liczbę 128 dec. Jeżeli ma
to być kanał 2, wtedy do bajt1 należy dodać liczbę 160, natomiast dla kanału 3 wartość
dodawana do bajt1 jest równa 192. Oczywiście należy także zadbać o właściwe czasy
trwania dźwięku (długości nut), ale to już należy do innej klasy zagadnień.

Programowanie głośności kanału polega na wysłaniu jednego bajtu:

bajt1 7 6 5 4 3 2 1 0
      1 R R R 3 2 1 0

R R R
0 0 1 - głośność kanału 1
0 1 1 - głośność kanału 2
1 0 1 - głośność kanału 3
1 1 1 - głośność szumu

Bit 1 zawsze ustawiony na 1, kolejne 3 wyznaczają numer kanału, a bity od 0 do 3
określają głośność w taki sposób, że wartość 0000 ustawia głośność największą, a
wartość 1111 wyłącza wyjście audio wybranego kanału.

bajt1 7 6 5 4 3 2 1 0
      1 R R R 3 2 1 0

R R R
1 1 0 - kontrola szumu

bit 2 - określa rodzaj szumu. 0 - okresowy, 1 - biały
bity 1 i 0 - określają częstotliwość jak jest generowany szum (wysokość "tonu")

0 0 - N/512
0 1 - N/1024
1 0 - N/2048
1 1 -  wyjście generatora 3

     To wszystko. Jest to bardzo prosty generator, gdzie obwiednię zawsze trzeba robić
programowo o ile jest to niezbędne. Jeden kształt fali na wyjściu nie oferuje wielkich
doznań :). Można spróbować sterowania wyłącznie bitami głośności, co powinno dać
możliwość odtwarzania 4-bitowych sampli. Mimo prostoty - układy SN76489 generują
programowalne dźwięki, a to jest główny powód, dla którego powstał TIGari. Nie jest to
również ostatnie słowo w kategorii rozszerzenia dźwiękowe Atari 8-bit.

     Ze względów ogólnych nie udostępniam projektu PCB, jedynie pliki Gerber/Excellon.
Na podstawie opublikowanego schematu można wykonać PCB według własnego
pomysłu, dopasowania do innej obudowy, zmiany położenia elementów, itd. Zaznaczam,
że układ XC9572XL-VQ64 posiada raster wyprowadzeń 0,5mm i w związku z tym lepiej
zlecić wykonanie płytek specjalistycznej firmie produkującej PCB. Ja osobiście zlecam
w JLCPCB - ponieważ mają duże możliwości, produkują szybko i naprawdę dobrze.

NIE JEST TO KRYPTOREKLAMA.

Bardzo proszę o uszanowanie mojego autorstwa i nieużywanie projektu w celach
komercyjnych bez zgody. Pomysł udostępniam za darmo dla każdego, kto zechce
go użyć. Jednocześnie nie mam nic przeciwko udoskonaleniom i przeróbkom pod
warunkiem wskazania źródła pochodzenia oryginału.

Polecam