Welcome, Guest. Please login or register.


Author Topic: Z80MU - ARM STM32 alapú hardveres emulátor (Read 21165 times)

Offline zka67

  • Newbie
  • Posts: 2
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #15 on: 2017.April.10. 21:05:57 »
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




Offline geco

  • EP addict
  • *
  • Posts: 7223
  • Country: hu
    • Támogató Támogató
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #16 on: 2017.April.10. 21:53:15 »
Pálinkás jó reggelt, és üdv a klubban :)

By the way klub, 15-én lesz EP klub, ha érdekel, még igazi EP-t is kezeid közé foghatsz :)

Szerintem az időzítésekben István, vagy Zozó tud majd segíteni, és tuti fog is :)

A Bricky István trückös digi lejátszóját használja, fixen magasra állítja a 0,2,és zajcsatorna kimenetét, és az egyes csatorna lesz az időzítésre használva:

Code: [Select]
        ld      a,0ch
        out     (0b4h),a
        call    waitLoop
        ld      a, 07fh
        out     (0a0h), a
        out     (0a2h), a
        out     (0a4h), a
        call    waitLoop
        ld      a, 007h                   ; reset all oscillators
        out     (0a7h), a                 ; to zero phase and output state
        call    waitLoop
        ld      a, 080h
        out     (0a1h), a                 ; channel 0 output is constant '1'
        ld      a, 00eh
        out     (0a6h), a                 ; 9-bit noise generator, clock is chn 1
        ld      b, 14
lp1:    call    waitLoop
        ld      a, 080h                   ; channel 3 clock is -(chan. 3 output)
        out     (0a3h), a
        call    waitLoop
        ld      a, 000h                   ; set channel 3 clock to '0'
        out     (0a3h), a                 ; channel 3 output should be '1'
        djnz    lp1                       ; after this loop
        call    waitLoop
        ld      a, 00fh
        out     (0a6h), a                 ; channel 3 clock is chan. 2 output (0)
        call    waitLoop
intfreq ld      hl,0014h
        ld      a,l
        out     (0a2h),a
        ld      a,h
        out     (0a3h),a
        call    waitLoop
        ld      a, 065h                   ; set OSC1 as IRQ clock, and start it
        out     (0a7h), a

Gratula a cucchoz :)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #17 on: 2017.April.10. 23:24:15 »
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.

Módosítani a második lapon lehet, itt található a monitor, és Lua script futtatására is itt van lehetőség.

Quote
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.

A fórumon található részletesebb információ mindkettőről, bár nem könnyű megtalálni a sok régi hozzászólás között.

Quote
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.

Az nem lehet, hogy nem a megfelelő módot emulálja?

0: várakozás minden műveletnél
4: várakozás csak M1-nél
8, 12: nincs várakozás

A 0 és 12 cseréje megmagyarázná a "3 MHz-es" CPU-t, sok program használja az utóbbit a várakozás tiltására.

Offline MrPrise

  • Administrator
  • EP addict
  • *
  • Posts: 2764
  • Country: hu
    • Enterprise Forever
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #18 on: 2017.April.11. 06:33:50 »
A fórumon található részletesebb információ mindkettőről, bár nem könnyű megtalálni a sok régi hozzászólás között.
A wiki-n van leírás a Nick-ről: Tigrian Nick leírása

Izgalmas ez a HW emulátor projekt!

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1346
  • Country: hu
  • Stray cat from Commodore alley
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #19 on: 2017.April.11. 09:13:41 »
@zka67: Mi a vas? Valami COTS devboard? Valamiből kiszerelt cucc? Saját tervezés?

Izgalmas ez a HW emulátor projekt!
Ez egyelőre inkább tűnik szoftvernek, mint hardvernek, de neked legyen igazad!

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #20 on: 2017.April.11. 10:17:07 »
Néhány régebbi leírás és egyéb érdekesség amit találtam:
- DAVE hanggenerátorok
- NICK órajel és video RAM időzítés tesztek
- NICK video módok működése
- további NICK video mód információ
- a 83h port felső két bitjének a működése
- NICK vízszintes szinkron TV kimeneten és 48 karakter szélesre állított kép (screenshotok)
- NICK VRAM időzítés tesztelése oszcilloszkóppal

Nem ciklus vagy M-state vagy ezekre bontott utasítás alapú emulációban nehéz lehet a video RAM pontos időzítését megoldani. Ismerni kell az egyes hozzáférések időpontját az utasításon belül, és a várakozás időtartama fél ciklus felbontású. De talán célszerűbb lenne csak valamilyen egyszerű fix időzítést (pl. 2-3 ciklus) beépíteni.

A "várakozás csak M1-nél" mód 2 ciklussal növeli minden prefixes (ED, CB, DD, FD, DD CB, FD CB) utasítás futásidejét, a többinél egy ciklus a várakozás.
« Last Edit: 2017.April.11. 10:34:14 by IstvanV »

Offline zka67

  • Newbie
  • Posts: 2
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #21 on: 2017.April.13. 01:48:13 »
Sziasztok, köszönöm mindenkinek a segítséget, és az ünnepek alatt igyekszem javítani az emulátort.

@ergoGnomik: a "vas" teljesen saját tervezés és a szoftver is teljesen saját, nincs semmi OS, az alapoktól írtam a rendszert. Mivel a határon van a "vas" teljesítménye, ezért rengeteget kellett optimalizálnom, és néhol kompromisszumokat is kellett kötnöm.

És egy kép az üres nyákokról :)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #22 on: 2017.April.13. 10:12:01 »
A Bricky István trückös digi lejátszóját használja, fixen magasra állítja a 0,2,és zajcsatorna kimenetét, és az egyes csatorna lesz az időzítésre használva:

Ennek a működése röviden:
- a 0. és a 2. csatornán beállítja a SYNC bitet, ami fix 0 kimenetet eredményez
- a 0. csatornán engedélyezett a gyűrűmoduláció (XNOR művelet a 2. csatornával), ezért lesz 0 XNOR 0 = 1 a kimenete
- az 1. csatornán átmenetileg engedélyezett a gyűrűmoduláció a 3. csatornával és a SYNC, így a kimenete a zajcsatorna kimenete invertálva
- a 3. csatorna órajele az 1. csatorna, ahol a gyűrűmoduláció felváltva engedélyezett és tiltott, azaz a zajcsatorna órajel bemenetén a saját invertált kimenete visszacsatolva és 0 váltakozik ciklusban. Ez akkor eredményez stabil állapotot, ha a polinom számláló kimenete 1
- N bites polinom számláló kimenetében legfeljebb N-1 0 bit fordulhat elő egymás után, ezért ha elég sokszor fut le a fenti ciklus, akkor garantáltan talál 1 bitet
- a 3. csatorna órajele végül a továbbra is fix 0 kimenetű 2. csatorna lesz
- az 1. csatorna most már használható megszakítás időzítésre

A wiki-n van leírás a Nick-ről: Tigrian Nick leírása

A wiki-n csak a leírás első része olvasható, a CRT és a kompozit video működéséről. Kifejezetten a NICK-ről a későbbi részekben található információ, például itt. Talán érdemes még említeni az EXOS 2.0 műszaki leírást, az ismertebb 2.1-es könyvben néhány részlet a NICK-ről már nem található meg.
« Last Edit: 2017.April.13. 11:06:44 by IstvanV »

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14779
  • Country: hu
    • http://enterprise.iko.hu/
Re: Z80MU - ARM STM32 alapú hardveres emulátor
« Reply #23 on: 2017.April.13. 10:57:24 »