Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Odtwarzacz plików SID z C64

przemek_bundy 16 Sep 2011 13:14 11796 17
Renex
  • Odtwarzacz plików SID z C64

    Witam

    Chciałem przedstawić moją konstrukcję odtwarzacza plików SID. Jest to moje protopywowe urządzenie zbudowane na dwóch
    płytkach uniwersalnych.Wszystkie połączenia są wykonane kabelkami.Sercem układu jest ATmega32 który jest prostym
    emulatorem procesora z C64 6502.Oryginalny układ SID'a został wymontowany z C64.Ogólnie moje założenia były takie,aby
    napisać program który będzie odtwarzał pliki SID.W internecie można znaleźć dużo projektów emulacji 6502.Jednak ja wolałem
    dla swoich potrzeb i sprawdzenia siebie samego napisać wszystko od zera.Program powstał w Bascomie.Jak się później okazało
    miało też to swoje minusy.Gdyż nawet przy prędkości zegara 20 Mhz,przy bardziej "zapętlonych" playerach SID'a daje się
    odczuć zwolnienie odtwarzania utworu.Jest to spowodowane również tym że praca zmiennych mojego emulatora opiera się nie
    rejestrach ale na pamięci ram ATmega.A i większość instrukcji 6502 napisanych jest w Bascomie a nie w czystym
    asemblerze.Owszem są wstawki asemblerowe,w newralgicznych punktach.Tam gdzie to było potrzebne. np: zapis/odczyt ramu.W
    pierwszej fazie projektowania miałem jeden plik SID który był dołączony do programu za pomocą funkcji: $inc Później
    dodałem obsługę kart SD.Program odczytuje pliki SID z: root albo z "pierwszych katalogów". Obecne funkcje odtwarzacza to:
    szybkie przewijanie do przodu,pause,zmiana katalogów przód/tył,zmiana SID'ów wewnątrz katalogów przód/tył, zmiana SID'ów
    wewnątrz plików SID.Mój emulator nie odtwarza SID'ów na przerwaniach CIA ani sampli.Poza tym dla przyśpieszenia jak na
    Bascom, stos korzysta z ramu Atmega32 a nie z zewnętrznego RAM'u.Którym są dwie kości po 32 kilo połączone poprzez bufor
    '573 z ATmega32.Układ przedwzmacniacza za SID'em został ściągnięty z oryginalnego schematu C64.Który jest podłączony do
    radia samochodowego jako wzmacniacz AUX.Układ zasilany jest napięciem 12V. Stabilizator 5V dla ATmega32 zasilanie ogólne,
    Stb.3,3V dla karty SD i Stb.9V dla SID'a jako drugie zasilanie.Dodatkowy rezonator 4Mhz poprzez układy 4011 i 4013 tworzy
    generator zegara TTL potrzebny do ożywienia SID'a.Ogólnie chcę do tego zrobić ładną płytkę PCB i obudowę.Myślałem też o
    zastosowaniu ATmega128 wtedy odpadło by parę kostek, a i przybyło parę portów do obsługi dodatkowych przycisków.Program
    też by się troszkę uprościł.A żeby całość nie została zapomniana i zakurzona mam w planach wbudować zegar z datą i
    Alarmem.Który o zadanej godzinie odtwarzał by wybrane pliki SID.Ale to już czas i chęci pokażą co będzie dalej z tym
    projektem.

    Pozdrawiam...


    Odtwarzacz plików SID z C64

    Odtwarzacz plików SID z C64

    Tutaj poprawiony film,odtwarza się normalnie:
    http://www.youtube.com/watch?v=fq9acOLkK_M


    Niestety mój projekt nie ma konkretnego schematu.
    Wszystko było rysowane na bieżąco w zeszycie,a później brałem się za lutowanie.
    Całość była składana i testowana stopniowo.Przy podłączaniu ramu do atmega opierałem się na tym schemacie:
    http://sklep.avt.pl/photo/_pdf/AVT270.pdf
    z tym że tutaj sygnał CS ramu jest podłączony przez inwerter do jednego pinu.W moim projekcie każdy CS jest podłączony do osobnego pinu.Chodziło o to że port który jest podłączony do ramu, jest dzielony z SID'em
    Odtwarzacz plików SID z C64


    Wyjście audio,schemat przerysowany z oryginalnego C64
    Odtwarzacz plików SID z C64


    Układ generujący zegar dla SID'a.
    oparty na tym schemacie:
    http://www.edw.com.pl/pdf/k04/45_12.pdf
    Odtwarzacz plików SID z C64


    Plik z kodem w Bascom.
    Program powstawał i był testowany kawałkami w kolejności:
    -testowanie zlutowanej całości, czy w ogóle działa.poprawny zapis/odczyt ramu i zatrzasku '573
    -testowanie SID'a, wydobycie z niego jakich kolwiek dźwięków,napisanie prostego programu na wzór Basicowych programów z C64 ale przełożonych na Bascom.Początkowo nie było generatora zegara dla SID'a, powstał on później.Zegar był "podkradany" z C64 z Expansion Port.
    -w końcu mozolne opisanie wszystkich instrukcji 6502, zrozumienie ich działania,przetestowanie czy spełniają swoje zadanie.Nie obyło się bez błędów oczywiście.które dały o sobie znać później gdy jedne SID'y grały a inne nie.Lub gdy SID po paru sekundach grania zaczynał wydawać z siebie dziwne dźwięki lub milkł.przy usuwaniu błędów pomógł mi program:6502 Macroassembler & Simulator Michała Kowalskiego.
    -dodanie generatora zegara SID
    -Obsługa kart SD

    Wyzwaniem było wykrycie plików SID które obsługują CIA lub sampli.
    Do tej pory pozostaje jeszcze parę błędów.Niektóre SID'y zawieszają playera (pewnie jakaś pętla z której nie można wyjść),Niektóre SID'y się nie odtwarzają pomimo że czas upływa i widać że emulator pracuje.Mam nadzieje że znajdę czas i chęci na usunięcie tych błędów.

    Obsługa karty SD była możliwa dzięki projektowi ze strony:
    http://members.aon.at/voegel/
    Początkowo pliki były czytane z root'a.Stopniowo dodawałem kod.
    dlatego i on też był pisany w częściach.

    Cool? Ranking DIY
    About Author
    przemek_bundy
    Level 12  
    Offline 
    przemek_bundy wrote 103 posts with rating 90. Live in city Kętrzyn. Been with us since 2005 year.
  • Renex
  • #2
    Deepone
    Level 22  
    Witam, podoba mi się player. Jednak to wideo, które udostępniłeś niewiele prezentuje.
    Nagrałbyś jeden utwór i pokazał całość z dźwiękiem nie zmieniajac utworów w trakcie.
    Czy planujesz udostępnić źródła i schemat?
  • #3
    a.bakus
    Level 15  
    Jak rozumiem w pliku SID są instrukcje wykonywalne, w przeciwnym razie niepotrzebna by była emulacja procesora c64. Mam rację?
  • #4
    Duch__
    Level 31  
    Witam. Można by prosić o część schematu z podłączeniem zewnętrznego ramu do Atmegi32 oraz fragment kodu pokazujący zapis jakiś zmiennej do zewnętrznego ramu?
  • Renex
  • #6
    Deepone
    Level 22  
    @leonow32 - ja w to wątpie, wg mnie emuluje tylko minimum wymagalne do odtworzenia muzyki.
    @a.bakus - cały dźwięk jeszcze "przechodzi" przez układ dźwiękowy SID (czyli albo MOS 6581 lub 8580).
  • #7
    xanio
    Level 27  
    @Deepone - nie, w plikach .sid są instrukcje procesora 6502, w tym player danego utworu. To nie tak jak .mod, gdzie jest powiedzmy 'standard', który wiadomo jak odtwarzać - tutaj teoretycznie każdy utwór może mieć swój player.
  • #8
    Deepone
    Level 22  
    @xanio - ok, aż tak biegły nie jestem w temacie SIDa i dziękuje za te info, postanowiłem się przyjrzeć formatowi. Jednak tak czy siak do odtwarzania wykorzystuje układ SID. Ale aby odtwarzać muzykę to chyba nie trzeba robić emulacji procesora 6502 1:1 (która i tak nigdy taka nie będzie), dobrze rozumiem?
  • #9
    SylwekK
    Level 32  
    @Deepone - niestety trzeba robić emulację. Tak jak już powiedział xanio to zwykły kod w asemblerze. Wiem to, bo sam pisałem playery na ten i podobne procesorki w maszynach Commodore. W tego typu muzyczkach to po prostu wolna amerykanka - jak kto sobie napisze tak ma :D . Oczywiście były pewne standardy ale wiązało się to raczej z konkretnym programem do tworzenia muzyki i sposobem wywoływania z przerwania. Zgadza się, do odtwarzania wykorzystuje układ SID ale to logiczne bo daje on specyficzne brzmienie i jego kompletna emulacja na AVR moim zdaniem wyszła by gorzej niż odtwarzanie gotowych sampli z modów na Amigę...
    Szacun dla autora, że podjął się takiego zadania.
  • #10
    zieluś
    Level 18  
    Można prosić o Giane Sisters ??
  • #11
    Tommy82
    Level 41  
    zieluś wrote:
    Można prosić o Giane Sisters ??


    I airwolfa.
  • #12
    przemek_bundy
    Level 12  
    Air Wolf:
    http://www.youtube.com/watch?v=xm1lsjbI0Zg

    Giana Sisters:
    Czy o tą muzyczkę chodziło?
    http://www.youtube.com/watch?v=FXU_pGquR4Q

    Mój program emuluje wszystkie instrukcje 6502.Jednak czasy ich wykonywania są dłuższe.Myślałem też o tym żeby oryginalny 6502 zastąpić atmegą.Jest to możliwe do zrealizowania.Jednak mój emulator temu nie podoła.Jeżeli się wsłuchacie to idzie wyczuć momenty w których jest minimalne przycięcie odtwarzanego utworu SID. Sprawdzałem w czasie testów gdy program wchodził w pętlę emulowanego SID'a,że od momentu wywołania (sys xxxx-adres grania playera) do czasu wyjścia z Playera (RTS) może być wykonanych nawet 800 instrukcji C64.A przy takich wartościach nawet 20 Mhz w moim projekcie wymięka.trzeba dodać że te przykładowe 800 instrukcji trzeba pomnożyć przez 50 ramek (wywołanie 50 razy na sekundę).Zatem Atmega ma troszkę zajęcia.Czas na wyświetlaczu jednej sekundy odpowiada właśnie 50 ramkom. I nie jest to czas rzeczywisty który upłynął.
  • #13
    Rafraf
    Level 16  
    Podobne projekty wykonane zostały tez w przeszłości:

    http://www.swinkels.tvtom.pl/swinsid/playsid.htm
    http://kevtris.org/Projects/sid/oldsid.html

    Gdybys pisal w asm zamiast bascom to atmega na pewno by sobie poradzila z emulacja 6502, ale wątpie aby atmega była w stanie zastąpić 6510/8500 w C64, za to mogła by być świetnym np koprocesorem matematycznym (do operacji gdzie mamy nieduzo danych wejściowych i niedużo danych wyjściowych a sporo kalkulacji, np mnożenie macierzy ;) )
  • #14
    zieluś
    Level 18  
    przemek_bundy wrote:
    Air Wolf:
    http://www.youtube.com/watch?v=xm1lsjbI0Zg

    Giana Sisters:
    Czy o tą muzyczkę chodziło?
    http://www.youtube.com/watch?v=FXU_pGquR4Q

    Mój program emuluje wszystkie instrukcje 6502.Jednak czasy ich wykonywania są dłuższe.Myślałem też o tym żeby oryginalny 6502 zastąpić atmegą.Jest to możliwe do zrealizowania.Jednak mój emulator temu nie podoła.Jeżeli się wsłuchacie to idzie wyczuć momenty w których jest minimalne przycięcie odtwarzanego utworu SID. Sprawdzałem w czasie testów gdy program wchodził w pętlę emulowanego SID'a,że od momentu wywołania (sys xxxx-adres grania playera) do czasu wyjścia z Playera (RTS) może być wykonanych nawet 800 instrukcji C64.A przy takich wartościach nawet 20 Mhz w moim projekcie wymięka.trzeba dodać że te przykładowe 800 instrukcji trzeba pomnożyć przez 50 ramek (wywołanie 50 razy na sekundę).Zatem Atmega ma troszkę zajęcia.Czas na wyświetlaczu jednej sekundy odpowiada właśnie 50 ramkom. I nie jest to czas rzeczywisty który upłynął.


    Na "comodorcu" ja grałem tylko w tą wersje http://www.youtube.com/watch?v=Ne-09Bs_bRo i o tą mi chodziło ale i tak dobrze że pokazałeś
  • #15
    michal.fita
    Level 15  
    Emulatory procesorów powinno się implementować na FPGA, a nie męczyć się w Bascomie, który ma 100% overhead. Gdybyś napisał to w C, to prawdopodobnie miałbyś dużo lepsze rezultaty.

    Implementacja tego w C na AVR lub w VHDL/Verilog na FPGA miałaby dużo większy walor edukacyjny, gdyż w BASCOM profesjonalnych rozwiązań tej skali nikt nie robi. A tak można się nauczyć czegoś i potem zaskoczyć potencjalnego pracodawcę ciekawym doświadczeniem technicznym.
  • #16
    xanio
    Level 27  
    Mam wrażenie, że muzyka się przycina w momencie zmiany napisu na LCD.
  • #17
    przemek_bundy
    Level 12  
    Dobra spostrzegawczość:D
    Próbowałem z tym walczyć, ale na razie nie mam pomysłu jak się tego pozbyć.Każde wywołanie podprogramu zwiększa zmienną i wyświetlana jest inna informacja na ekranie.Trzeba by było wszystko przetestować i wykryć w którym miejscu należy przebudować program.

    Code: vbnet
    Log in, to see the code
  • #18
    xanio
    Level 27  
    Myślę, że odtwarzacz powinien wykonywać się na przerwaniach a funkcje obsługujące ekran wtedy gdy jest na to czas. Prawdopodobnie masz obsługę odtwarzania i wyświetlania/obsługi przycisków zrobione na przemian w pętli głównej programu, przez co dłuższe niż normalnie wykonanie pewnych fragmentów w tej pętli powoduje opóźnienia w odtwarzaniu.