Sziasztok, szóval én terveztem és írtam a programját a Z80MU-nak. Ebben egy 168MHz-es Cortex-M4-es proci dolgozik a képmegjelenítésen, a Z80 futtatásán, az IO eszközök kezelésén, kivéve a hangot. A hangot egy másik, 72MH-es Cortex-M3-as proci generálja, ami egy 3Mbit/s-es soros vonalon kapja az adatokat (üzemmód beállíáts, regiszterszám, adat, stb...).
A Z80 utasítások nem órajel alapon vannak végrehajtva, ezt nem bírná a proci, hanem utasításonként, és ha 64us-nyi utasítást végrehajtott, akkor bevárja a sorszinkront. A sorszinkron a videójel DMA megszakításával érkezik, ami alatt feltölti a következő sorhoz szükséges adatokkal a DMA buffert, és az aktuális sor pedig a másik DMA bufferből kerül megjelenítésre. A DMA 16 bites adatokat küld ki a videó buszra, 4R 4G 4B 2- H V. RGB értelemszerűen az RGB értékek, 2 nem használt kimenet is van, és a HSYNC és a VSYNC biteket.
A Z80 utasítások ciklusra pontosak, ezeket már többször is leellenőriztem, azokkal nincs baj.
EP128 emuláció: nekem sosem volt még a kezemben igazi EP128, így csak az ep128emu-val tudom összehasonlítani, de ebben a programban elég korlátozott a debug lehetőség, legalábbis én nem jöttem rá, hogyan lehet pl. bármit módosítani benne. A lényeg az, hogy eddig nem is hallottam se a NICK, se a DAVE chipekről, és ezeknek a leírása sem az emulátor készítők legjobb barátja.
Időzítések: a DAVE timerei mindkét processzorban emulálásra kerülnek, mert mint említettem, a Z80 emulálása gyorsabban végrehajtásra kerül, mint a valóságban, és utána vár a HSYNC-re.
Szóval a lényegre térve: itt többen is említettétek, hogy fontos a memória várakozás időzítése. Ez még biztosan nem jó az emulátorban, csak van benne valami. Egészen pontosan minden memória műveletnél hozzáad egy órajelet a Z80 ciklusokhoz ha be van állítva a "minden flag" a DAVE-ben. A csak az M1-nél történő várakozás még nincs benne.
Ha valaki leírná, hogy pontosan hogyan is kell időzíteni a várakozásokat, azt megköszönném.
Továbbá a DAVE timereit sem tudom a Z80 órajelével etetni, egyszerűen nem bírja a proci. Ezért az 1Hz, 50Hz és az 1kHz-es megszakítások számlálói a HSYNC alatt változnak csak, a CPUCLK/15625 értékkel, és ekkor történik az IRQ generálása is. Nem tudom, hogy ez okozhat-e valamilyen problémát?
Aztán a hanggenerátor megszakítással is kellet egy kicsit trükköznöm, hogy a Z80 emuláció a megfelelő sebességgel fusson: bizonyára észrevettétek, hogy a kazettáról töltés lassabb egy kicsit, mint az eredeti gépen. Itt kénytelen voltam sűrűbben foglalkozni a hg megszakítással, míg normál módban csak minden 16.-ik DAVE órajelre lép a számláló, de ekkor 16-ot. Lehet, hogy nem jó az ötletem, sőt most, hogy közben néztem a kódot, a DAVE frekvencia osztó bitje itt nincs is emulálva, ezt majd pótolom. Ebből az következik, hogy ha a DAVE hg értéke kisebb, mint 16, akkor kimaradhat megszakítás, de én úgy számoltam, hogy ennél sűrűbben értelmetlen megszakítást generálni...
Asszem jobb lesz ezt az egész számlálósdit újraírni...
Szóval minden segítséget, ötletet szívesen veszek, és amint működik rendesen az emuláció, utána majd rátérek a hanggenerátor problémára. Addig is egy kérdés, a bricky nevű program a 11-es és a 15-ös regisztereket használja D/A konverternek, ezek a zajcsatorna amplitudó regiszterei, és természetesen nem is szól megfelelően a hang. Esetleg valaki utána tudna nézni addig is a dolognak?
Üdv.
Zoli