Autor Wątek: Emulator AY-3-8912 na AVR  (Przeczytany 54233 razy)

KWF

  • *****
  • Wiadomości: 7102
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #45 dnia: 2019.09.12, 11:32:36 »
Chyba mam do SMD. Poszukam.
KWF
-----
R Tape loading error 0:1

Maryjan

  • *****
  • Wiadomości: 6878
  • Miejsce pobytu:
    Skarżysko-Kam.
  • Scotch whiskey and West Highland Terrier
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #46 dnia: 2019.09.12, 11:33:52 »
Ok.
I'am waiting
"Co miałem powiedzieć - przeczytałem..." Nikodem Dyzma

KWF

  • *****
  • Wiadomości: 7102
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #47 dnia: 2019.09.12, 11:44:43 »
KWF
-----
R Tape loading error 0:1

Maryjan

  • *****
  • Wiadomości: 6878
  • Miejsce pobytu:
    Skarżysko-Kam.
  • Scotch whiskey and West Highland Terrier
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #48 dnia: 2019.09.12, 11:47:12 »
Dzięki :)
Zamówię sobie.
"Co miałem powiedzieć - przeczytałem..." Nikodem Dyzma

skoti

  • *****
  • Wiadomości: 803
  • Miejsce pobytu:
    Polska
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #49 dnia: 2019.09.12, 12:17:06 »
Prośba do posiadaczy emulatora o puszczenie programu z załącznika. Pochodzi ze strony http://hypr.ru/blog/747.html Głównie chodzi mi o część gdzie testowane są rejestry AY.
Tak przy okazji to genialna apka do testowania pojedynczych AY i TurboSound.

KWF

  • *****
  • Wiadomości: 7102
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #50 dnia: 2020.09.09, 09:31:38 »
skoti: niezły programik :) do testowania chińskich malowanek

:) Ukazała się nowa wersja (26.0) emulatora: https://www.avray.ru/ay_ym_emulator/
KWF
-----
R Tape loading error 0:1

KWF

  • *****
  • Wiadomości: 7102
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #51 dnia: 2020.09.29, 23:37:22 »
Schemat emulatora, co wisi na OSHPark.
KWF
-----
R Tape loading error 0:1

KWF

  • *****
  • Wiadomości: 7102
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #52 dnia: 2021.01.21, 13:55:39 »
Wgrywanie emulatora to ATmegi8.

Używałem do tego celu programatora TL866A ze złączem ICSP. Aby go wgrać poprawnie emulator należy zwrócić uwagę na:
  • skompilowany kod emulatora
  • konfigurację emulatora
  • bity konfiguracyjne MCU

1. Kod emulatora
W paczce z emulatorem znajdują się skompilowany pliki z kodem emulatora pod kilka układów serii ATmega: 8, 48, 88, 168 i 328. Dodatkowo dla każdego typu MCU są wersje dla 2 kanałów lub 3 kanałów audio oraz wersje z tabelami głośności do emulacji układów typu AY-3-891x lub YM. Do zamiennika rzeczywistego PSG w wersji AY-3-891x na ATmega8 należy wybrać wersję 3 kanałową, dedykowaną do tego MCU i z tabelą głośności np. AY. Kod emulatora wgrywa się do pamięci flash MCU (Code):



2. Konfiguracja emulatora
Plik konfiguracyjny emulatora jest uzależniony od trzech czynników:
  • trybu pracy emulatora - w tym przypadku tryb pracy równoległej, ponieważ dane przesyłane są po szynie danych o szerokości 8 bitów
  • częstotliwości zegara MCU, np. 24MHz
  • częstotliwości zegara podanego na PSG, np. 1.75MHz
Plik konfiguracyjny wgrywamy do pamięci EEPROM MCU (Data):



3. Bity konfiguracyjne MCU
Ostatnią rzeczą jest poprawne ustawienie fuse-bitów, a one mają inne wartości dla każdego typu MCU, np, dla ATmega8 odpowiednio:
  • fuse low byte = 0xCE
  • fuse high byte = 0xCF
Lock-bitów nie ustawiamy (!!!) i bajt je opisujący powinien mieć wartość 0xFF.


Wszystkie powyższe informacje są zawarte w pliku tekstowym załączonym do paczki z emulatorem. W tym pliku jest też zawarta instrukcja, w jaki sposób zaprogramować MCU przy użyciu AVRDUDE.
KWF
-----
R Tape loading error 0:1

KWF

  • *****
  • Wiadomości: 7102
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #53 dnia: 2021.03.06, 20:11:40 »
Hahaha: R.I.P. AY

Swoją drogą zmajstrowałem zamiennik w SMD ponad 3 lata temu:
« Ostatnia zmiana: 2021.03.06, 20:25:33 wysłana przez Klaud »
KWF
-----
R Tape loading error 0:1

Maryjan

  • *****
  • Wiadomości: 6878
  • Miejsce pobytu:
    Skarżysko-Kam.
  • Scotch whiskey and West Highland Terrier
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #54 dnia: 2021.03.07, 00:14:47 »
Raczej wątpię, żeby ktoś uruchomił linię produkcyjną AY-3-89xx, dlatego sprzętowy emulator wydaje się atrakcyjnym rozwiązaniem.
Problemem jest tylko brak portów I/O.
Układy WD 1770 i WD 1772 też się już kończą - ceny powoli robią się na nie kosmiczne.
Więc być może i tu będzie pole do popisu dla emulatora sprzętowego.
"Co miałem powiedzieć - przeczytałem..." Nikodem Dyzma

KWF

  • *****
  • Wiadomości: 7102
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #55 dnia: 2021.03.07, 07:24:31 »
https://github.com/alexanderk23/ayx - co prawda na STM, ale z portami I/O.

Swoją drogą prawie 2 lata temu Rosjanie rozrysowali całą wewnętrzną strukturę układu AY-3-8910.

Istnieje też niezła implementacja AY/TS w HDL.

Moim zdaniem "emulowany" AY, to tylko kwestia czasu oraz wielkości rynku. Swoją drogą kilka firm nadal nadal robi zamienniki pełnowymiarowego AYka i w sumie nie są one gorsze od oryginału.
KWF
-----
R Tape loading error 0:1

Maryjan

  • *****
  • Wiadomości: 6878
  • Miejsce pobytu:
    Skarżysko-Kam.
  • Scotch whiskey and West Highland Terrier
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #56 dnia: 2021.03.07, 21:24:57 »
A tej implementacji AY-ka nie widziałem.
Ciekawe, jak to gra.
"Co miałem powiedzieć - przeczytałem..." Nikodem Dyzma

damik

  • Fresh rosin sniffer ;)
  • *****
  • Wiadomości: 2673
  • Miejsce pobytu:
    Generalnie Polska, głównie Bytom czasem Bielsko-Biała oraz okolice
  • ZX'owy i nie tylko...
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #57 dnia: 2022.05.20, 15:33:28 »
Trochę odkopię temat, bo jakiś czas temu pojawiła się nowsza (chyba finalna) wersja softu do tego.

Jest też na Github'ie podobny projekt: https://github.com/Yevgeniy-Olexandrenko/avr-ay-board

W porównaniu z wersją Klaudiusza ma to jeszcze dołożone filtry RC na wyjściach ABC, ale z nimi to gra strasznie cicho jednak można jeszcze poeksperymentować zmniejszając rezystory i dobierając kondensatory.

Zmontowałem akurat  z nudów na szybciora to cacko na Atmega88-20AU i "ćwierka" mi to w miarę poprawnie przy 30MHz, bo taki kwarc akurat znalazłem.  ;)

BTW, zostało mi jeszcze kilka gołych płytek gdyby ktoś się chciał pobawić.



« Ostatnia zmiana: 2022.05.20, 16:56:35 wysłana przez damik »
Wszystkiego po trochu: Schwarz, mydło i powidło... konsole, stare i nieco nowsze komputery oraz akcesoria i duperele.

ArturM

  • ***
  • Wiadomości: 228
  • Miejsce pobytu:
    GZM
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #58 dnia: 2025.01.10, 10:33:15 »
Z góry przepraszam za takie wykopaliska, ale trafiłem na ten wątek dopiero teraz, gdy poskładałem sobie dwie płytki v1.4 z układem ATmega48PA@20MHz.

Przejdźmy jednak do rzeczy. Emulacja AY jeśli chodzi o generator dźwiękowy działa. Niestety tryb pracy jako 3 kanały wyjściowe ma pewien mankament. Otóż kanał B jest odtwarzany zdecydowanie ciszej niż A i C. Można to "naprawić" ustawiając tryb pracy jako 2 kanały z programowym mikserem i eliminując standardowy układ miksera na rezystorach. Ewentualnie zmieniając układ by tylko dostosowywał poziom wyjściowy z emulatora (Który jest zdecydowanie większy) do tego co daje oryginalny AY.

Teraz pytanie: Dlaczego tak się dzieje, i dlaczego jeszcze to nie zostało wychwycone i poprawione? Odpowiedź być może jest taka, że w układzie docelowym tego projektu - czyli samodzielnego grajka to nikomu nie przeszkadzało :-X. Pozostaje tylko kwestia skąd to się bierze.

Takie zachowanie w trybie pracy z 3-ma kanałami wynika IMHO z błędnych założeń układowych i programowych.
Jeśli zajrzymy do kodu źródłowego to będzie można zauważyć, że licznik TIMER1 nie tylko pracuje jako generator dwóch przebiegów PWM - 1-bitowy DAC - dla kanałów A i C, ale jest też podstawą czasu generowanego dźwięku. Dlatego też bitowość tego przetwornika zależy od... częstotliwości pracy kwarcu (załącznik).
Przy konfiguracji licznik TIMER1 jest skracany do wartości wymaganej by dźwięk był poprawny w zakresie jego tonacji.

    ; Defines the counter's TOP value
    ; ICR1H = 0
    ; ICR1L = config
    out     EEARL, YH               ; set EEPROM address 2
    sbi     EECR, b0
    in      r18, EEDR               ; load byte 2 from EEPROM to r18
#if MCU_TYPE == 0
    out     ICR1H, C00
    out     ICR1L, r18              ; set PWM speed from byte 2 of EEPROM (affect AY chip frequency)
#else
    sts     ICR1H, C00
    sts     ICR1L, r18              ; set PWM speed from byte 2 of EEPROM (affect AY chip frequency)
#endif
    ; ICR1L value formula (28000000/109375/2 - 1) where 28000000 = 28MHz - AVR oscillator frequency
    ; 109375 is for 1.75 MHz version, formula is (PSG frequency / 16) e.g. for 2MHz it is 2000000/16 = 125000

Można to zrobić, bo konstrukcja tego licznika na to pozwala.
Natomiast kanał B jest generowany przez licznik TIMER2, którego bitowość PWM nie jest już zależna od kwarcu. I zawsze jest 8 bitowa.
Załóżmy, że kanały A i C są 7 bitowe (mniej więcej tyle ma wyjść z równania), stąd wartość 127 wpisana do rejestru daje wypełnienie 100% - najwyższa amplituda na wyjściu analogowym. Ale nie jest tak dla kanału B, bo wpisanie tam wartości 127 daje nam tylko 50% wypełnienia! I w kodzie nie znalazłem na to działań naprawczych, a dostępne są dwa:

Pierwsze, to skrócenie licznika TIMER2 też do wartości zależnej od kwarcu. Teoretycznie da się to zrobić, bo licznik też można sprzętowo skrócić, ale jest pewien haczyk. Wtedy nie możemy dla kanału B skorzystać z wyjścia OCR2A, tylko trzeba by było skorzystać z wyjścia OCR2B, które jest tak niefortunnie umieszczone, że koliduje z jednym z przerwań zewnętrznych, z którego kod korzysta do reakcji na zmiany BDIR/BC1. Zatem ten sposób naprawy odpada już w przedbiegach.

Zostaje rozwiązanie drugie - programowe. Czyli wartość przekazywana do "przetwornika DAC" trzeba po prostu pomnożyć o jakiś faktor.
Najprościej byłoby po prostu wartość pomnożyć przez dwa: 127*2 = 255, i mamy zależność 127 = 100% wypełnienia.

#elif CHANNELS == 3
// three channel version ----------------------------------------
    lsl  OutB             ; napraw głośność B (szybkie, pomnóż OutB przez 2)
#if MCU_TYPE == 0
out OCR2,OutB
#else
sts OCR2A,OutB
#endif
// --------------------------------------------------------------
#endif

Lecz nie mamy pewności co do tego, czy dla danego kwarcu wartość max będzie właśnie <= 127 by się po przemnożeniu zmieściła w 8 bitach. Dlatego można pójść nieco inną drogą - nieco kopiując rozwiązanie kilka linijek wyżej (Mikser programowy dla dwóch kanałów).

#elif CHANNELS == 3
// three channel version ----------------------------------------
    mov     YL,OutB         ; TMP = TMP + (TMP/4 + TMP/8);
    lsr     OutB            ; napraw głośność B (bezpieczne, zwiększ o ok. 65%)
    lsr     OutB
    add     YL,OutB
    lsr     OutB
    add     OutB,YL

    #if MCU_TYPE == 0
out OCR2,OutB
#else
sts OCR2A,OutB
#endif
// --------------------------------------------------------------
#endif

Można jeszcze poeksperymentować z formułą, choć będzie to wpływać na długość kodu, a zatem na szybkość wykonania pętli emulacji.

Jak znajdę chwilę czasu to przetestuje oba rozwiązania.


ps. Jest jeszcze jedna możliwość poprawy tego kodu, choć wymaga daleko idących zmian. Całkowite odcięcie timingów od generowania PWM. Czyli: timingami zajmuje się niewykorzystany licznik TIMER0 pracujący w trybie CTC, czym zachowujemy elastyczność i zależność tonacji od częstotliwości kwarcu. Zaś liczniki TIMER1 i TIMER2 puszczamy na 8 bitów, i wtedy grają równo...
« Ostatnia zmiana: 2025.01.10, 12:04:35 wysłana przez ArturM »
ZX 48 | HQ 48 SMD | Sizif-512 | FDD3000 | SFDD3500 | M-397 Multiinterface | DivMMC AY - KiCad user | PCB Designer

damik

  • Fresh rosin sniffer ;)
  • *****
  • Wiadomości: 2673
  • Miejsce pobytu:
    Generalnie Polska, głównie Bytom czasem Bielsko-Biała oraz okolice
  • ZX'owy i nie tylko...
Odp: Emulator AY-3-8912 na AVR
« Odpowiedź #59 dnia: 2025.01.10, 11:35:41 »
Ciekawe obserwacje i spostrzeżenia, widzę że trochę to rozkminiales, ja nie byłem aż tak dociekliwy.  :)

Kolejny problem to brak obsługi portu równoległego i w związku z tym zastosowanie tego np w Amstrad CPC będzie problemem bo na tym bazuje obsługa klawiatury.
Wszystkiego po trochu: Schwarz, mydło i powidło... konsole, stare i nieco nowsze komputery oraz akcesoria i duperele.