Džinova 8-bitová stránka
ARMSID
Úvod:
- Po zkušenostech s procesory typu ARM Cortex jako emulátory periférií u jiných 8-bitů (unikarta pro Sharp MZ800)
mě napadlo použít obdobný postup pro emulaci (aspoň co se obsluhy sběrnice týče) obvodů MOS6581 nebo MOS8580 (známých jako SID) v Commodore C64.
- Podobně minimalisticky kdysi začínala asi nejznámější HW náhrada SIDa tzv. SwinSID. Když obsluhu sběrnice zvládne jednoduchá Atmega na 32MHz, co
by dokázal ARM na 100MHz s matematickým koprocesorem ?
- Po prostudování datasheetů k SIDům jsem se naivně vrhnul do nadšené realizace, která se nad očekávání protáhla, jak někteří už vědí, datasheet je spíš přání (navíc neúplné) než realita :)
- A tak se zrodil ARMSID.
Popis, co to umí:
- Další z pokusů nahradit MOS6581 a MOS8580 používaných v Commodore C64. Tentokrát pojatý minimalisticky (v zapojení a jednoduchosti užití, nikoliv výkonu).
- Pokus o opravdové "plug & play" řešení. Stačí jej vložit místo původního SIDa do patice a je hotovo.
- Sám si podle napájecího napětí zjistí, který z čipů nahrazuje a začne příslušnou emulaci (lze dodatečně za chodu softwarově změnit).
- Není potřeba přepínat verzi počítače PAL/NTSC, obvod používá rovnou hodiny sběrnice počítače, vždy je synchronní s C64.
- Emuluje i měření analogových vstupů (joysticky, myš atd. - vstupy POTX a POTY)
- Analogový výstup je dostatečně proudově dimenzovaný, není potřeba pro správnou funkci cokoliv na desce počítače měnit.
- Vzorkování výstupu je 1/16 hodin C64 tedy cca 62kHz/12bitů, žádná emulace výstupu pulzní modulací, poctivý hardwarový D/A převodník.
- Filtry kompletně přenesené do číslicové podoby, emulované float point aritmetikou.
- Řádově nižší úroveň šumu a menší rušení od napájení proti originálu :)
- Podstatně nižší i odběr proudu než originál, ale také nižší než ostatní modení náhražky.
- Případný update firmwaru přímo programem v C64 bez nutnosti zasahovat do počítače.
- Nyní k sehnání zde.
Popis, co je uvnitř:
- Pár odporů, kondenzátorů, jeden stabilizátor, jeden operační zesilovač a procesor. To je vše, součástky jen z jedné strany.
- Jediný programovatelný obvod je zde STM32F410, tedy ARM Cortex M4 s HW float point aritmetikou na 100MHz.
- Analogový výstup posílený přes operační zesilovač AD8515.
- Stabilizátor pro procesor 3,3V, samotný procesor má vstupy 5V tolerantní.
- Schéma v PDF zde:
.
Firmware:
- Aktuální verze FW 2.15 z 7.1.2023 zde. Nebo jako obraz diskety. Nebo zde zazipovaný.
- Nezapomeňte si stáhnout nový konfigurační program.
- Oprava chyby při generování šumu v nejvyšší oktávě (reportováno například v hře Crossroads II a Jumpman).
- Detekce typu SID s tímto algoritmem vrací skutečné nastavení typu v konfiguraci ARMSIDa.
- Díky tomu, krom jiných, hraje i poslední část Wonderland XIII alespoň při nastavení ARMSIDa na emulaci MOS6581. Prodigy jedou !
- Oprava ve špatném časování přehrávání hudby Turrican 2 - The Final Fight (dobře slyšitelné na skladbě 2).
- Doplněno nedokumentované přehrávání "žádného" průběhu, díky tomu například Boing Boom Tschak výrazně míň (cca 20dB dolů) píská.
- Úprava v generování kombinovaných waveforms (nejen) pro emulaci MOS8580, kde se víc blíží originálu (jak jen se dá u čipů, které jsou samy o sobě různé mezi sebou, závislé na teplotě, napětí a čase).
- Předchozí FW 2.13 z 6.12.2021 zde. Nebo jako obraz diskety. Nebo zde zazipovaný.
- Opět optimalizace na rychlost, a to nejen na běh aplikace jako takové, ale i obsluhy sběrnice, konečně jedou spolehlivě "pádla" na NTSC mašině i s nejstaršími HW verzemi ARMSIDa (se součástkami nahoře) !
- Rychlejší je i start aplikace, místo stovek milisekund je ARMSID plně funkční už za míň jak 15 milisekund od připojení napájení !
- Přidána možnost "opravit" tzv. ADSR bug, tedy chybu v generátoru obálky, která je vlastní originálním čipům a je reprodukována i v ARMSIDu. V C64 to kvůli kompatibilitě není potřeba, ale pokud používáte ARMSID v syntezátorech, mohla by vás tato funkce zajímat.
- Lehce poupravena jakost (Q) obvodů filtru pro ještě věrnější reprodukci MOS8580.
- Předchozí FW 2.12 z 9.9.2020 zde. Nebo jako obraz diskety. Nebo zde zazipovaný.
- Připomínám konfiguraci "Digifix" od minulé verze, kdyby vám něco znělo jinak na emulaci MOS8580, zkontrolujte konfiguraci.
- Opraveno nastavování nejnižší frekvence filtru pro emulaci MOS6581 (občas neodpovídala simulace nastavením).
- Předchozí FW 2.11 z 10.7.2020 zde. Nebo zde zazipovaný.
- Digifix pro emulaci MOS8580 je od této verze konfigurovatelný. Softwarově jde nastavit v několika úrovních a to dokonce i v opačné polaritě.
- V základním nastavení je ale řízen skutečným proudem z externího pinu. Pokud by vám softwarový Digifix chyběl, nastavte si ho přes nový konfigurační program.
- Digifix u MOS8580 vyžaduje například hra Ghostbusters, většina hlavně nových her, dem a hudeb naopak s Digifix nepočítá a ten pak může působit rušivě a přidávat do různých míst šum a hluk.
- Je zde také dotažen hotfix v generování šumu (test bit) z predchozí verze, teď už nechybí žádný zvuk ani v TestBit_4x.sid.
- V neposlední řadě byla poladěna emulace vnitřních analogových offsetů MOS6581. Ve výsledku vede k menší zkreslení některých dem (Mahoney - Musik Run/Stop) a odstranění klapání u některých her (Bubble Bobble).
- Drobný fix aktualizace čítačů generátorů při rychlých změnách.
- Rychlejší uvolnění datové sběrnice na konci čtecího cyklu.
- Předchozí FW 2.10 z 24.3.2020 zde. Nebo zde zazipovaný.
- Proti verzi 2.9 opravuje chybu v hodnotách registru OSC3 při generování šumu. Patrné například ve hře Paradroid.
- Předchozí FW 2.9 z 17.4.2019 zde.
- Pokud máte problémy s detekcí ARMSIDu, může se hodit "blind" FW 2.9 update zde (nepotřebuje číst porty ARMSIDa během updatu, jinak obsahuje stejný FW).
- Případně obě verze včetně konfigurační utility zazipované zde.
- Pro update stačí nahrát do C64, spustit a následovat instrukce.
- Proti verzi 2.8 má 2.9 tyto vyplešení/opravy:
- Prodloužena doba pro detekci reset signálu (oprava hlášených náhodných restartů pro některé konfigurace s deskami 250407, kde není reset signál filtrován).
- Drobná oprava generování šumu na bitech s nejnižší vahou a zrychlení výpočtu.
- Další optimalizace na rychlost i velikost kódu.
- Předchozí FW 2.8 z 17.2.2019 zde.
- Pokud máte problémy s detekcí ARMSIDu, může se hodit "blind" FW 2.8 update zde (nepotřebuje číst porty ARMSIDa během updatu, jinak obsahuje stejný FW).
- Případně obě verze včetně konfigurační utility zazipované zde.
- Pro update stačí nahrát do C64, spustit a následovat instrukce.
- Proti verzi 2.7 má 2.8 tyto vyplešení/opravy:
- Konec zápisu nebo načítaní dat z registrů se řídí pouze signálem CS (u začástku to tak bylo, konec se řídil hodinami 02), může pomoci ke stabilitě v systémech jiných než C64 a C128.
- Aktualizace čítačů generátorů s přesností na 1 tik hodin 02 - cca 1us (nemění se fáze při změně tónu) !
- Správná polarita bandpass filtru.
- Doplněna emulace interních napěťových offsetů filtru.
- Přidáno softwarové "Digi Boost" - efekt, který u MOS8580 udělá odpor 330kOhm mezi EXTin a GND.
- Další optimalizace rychlosti.
Novinky ve verzi 2.7:
- Rychlejší časování pro novou verzi HW.
Novinky ve verzi 2.6:
- Zase o fous rychlejší (zrychlení odezvy při čtení registrů o dalších cca 10ns, rychlejší zpracování zápisu registrů).
Novinky ve verzi 2.5:
- Opět o kousek rychlejší přerušení (zrychlení odezvy při čtení registrů o dalších cca 10ns).
Novinky ve verzi 2.4:
- Další optimalizace přerušení (zrychlení odezvy při čtení registrů o cca 20ns).
Novinky ve verzi 2.3:
- Část přerušení přepsaná do assembleru a optimalizovaná ručně.
- Díky tomu umožněno řízení sběrnice nově jen signálem CS (u verzí 2.x netřeba synchornizaci s hodinami O2, může tak běžet i v jiných systémech než s CPU MOS6502).
- Možnost volit dolní mezní frekvence a strmosti filtrů a ukládání nastavení do paměti flash !
- Zvládá všechny průběhy a i se "samply" (aspoň některými) si taky poradí (Ghostbusters se zasmějou, Chimera na vás zakřičí).
- Plná podpora analogových filtrů (LowPass, BandPass, HighPass, kombinace, řízení jakosti Q obvodu).
- Emulace registrů OSC3 a ENV3 (odezva cca 16 taktů hodin C64).
- Joysticky a myš jedou.
Konfigurace:
- Nová verze testovacího a konfiguračního programu z 25.12.2023 zde.
- Přidána detekce vícero ARMSIDů najednou (adresy D400h,D420h,D500h,D520h,DE00h,DE20h,DF00h a 0xDF20h). Pokud je detekován více než jeden ARMSID, objeví se ještě před spuštěním výběr:
- Pokud je detekován jen jeden ARMSID, spustí se první obrazovka rovnou.
- Ukázka obrazovky konfiguračního programu:
- Lze měnit emulovaný čip MOS6581 nebo MOS8580 nebo to nechat na automatice podle napájecího napětí (nastaveno při zapnutí napájení).
- Nově lze uložit nastavení do paměti flash, bude se tak pokračovat v nastavení i při dalším zapnutí napájení.
- Na nové funkcionality - nastavení dolní mezní frekvence a strmosti filtrů je extra obrazovka po stisku klávesy E:
- Strmost filtrů pro MOS6581 odpovídá měřením uveřejněným zde.
- Pro MOS6581 lze strmost zvýšit nebo snížit v celkem patnácti krocích (-7 až +7), dolní mezní frekvenci v hodnotách 150,215 a 310Hz, pro MOS8580 v sedmi krocích pro frekvenci ladění při středním nastavení od 3kHz do 12kHz (kroky zhruba po 1/3 oktávy) a dolní mezní frekvenci také v sedmi krocích logaritmicky od 30 do 330Hz. Ukázka jiného než výchozího nastavení zde (ovládání přes kurzorové klávesy):
- Nově je v konfiguraci možnost nastavit Digifix pro emulaci MOS8580, dostaneme se k němu přes klávesu D z hlavního menu:
- Digifix můžeme nastavit buď externím odporem vůči zemi na externím pinu (stejně jako pro reálný MOS8580) nebo můžeme přepnout do softwarové emulace a nastavit úroveň v několika krocích manuálně (jedna z možností je 0% t.j. vypnout):
- Nastavení se dá uložit klávesou S do RAM ARMSIDa, vydrží tedy jen do vypnutí napájení nebo příkazu restartu:
- Nebo klávesou P trvale do flash paměti, a pak vydrží nastavení i po vypnutí napájení:
- Na nové stránce s extra funkcemi můžeme "opravit" takzvaný ADSR-Bug. Toto je zajímavé pokud používáte ARMSID v nějakém syntezátoru, kde je původní chyba z originál SIDa nežádoucí. V C64 a C128 určitě tuto volbu ponechte na "NO" pro zachování stejného chování s originál SIDem.
- Zdrojový kód konfiguračního programu v C, pro představu jak se s ARMSIDem komunikuje, je zde.
<= zpět