Welcome, Guest. Please login or register.


Author Topic: Z80 reset (Read 1360 times)

Online Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 20.0 Firefox 20.0
    • View Profile
    • http://enterprise.iko.hu/
Z80 reset
« on: 2013.April.17. 08:49:12 »
Sikerült egy több hónapos fejtörést okozó bugot megtalálnom :-)
Az EXOS 2.4 tesztjének fejlesztése során jutottam el oda, hogy miután emulátoron remekül működött, kipróbáltam valódi gépen, és itt jött a döbbenet: reset nyomására úgy le tud fagyni, hogy nem segít a további reset nyomkodás se, csak a kikapcsolás. Néha mindjárt bekapcsoláskor ez történt.
Végül biztonsági mentésből visszaszedve az előző verziókat megtaláltam hol került be a hiba, majd összehasonlítgatva kiderült, hogy nem tervezett módon bekerült egy feltételes utasítás, anélkül, hogy előtte feltétel vizsgálat lett volna :oops: Ok ezt én rontottam el, de miért nem jön elő emulátoron a hiba?

Rákerestem, hogy mi történik a Z80 registerekkel resetnél, ezt a leírást találtam, ahol egy titokzatos Matt nevű illető információja alapján ezt írják, hogy resetnél az AF és az SP az mindig FFFFh lesz.
Quote
Matt has done some excellent research on this. He found that AF and SP are always set to
FFFFh after a reset, and all other registers are undefined (different depending on how long the
CPU has been powered or, different for different Z80 chips).

Az ep128emu is így működik gondolom ezen leírás alapján (pluszban még az IX és IY regisztereket is FFFFh-ra teszi, ezt még nem találtam meg hol írták :oops: ). Így érthető, hogy miért nem jött elő a hiba emulátoron.
Innen viszont egyből jön a gondolat, hogy nagyon úgy tűnik, ez a leírás hamis! Meg kéne nézni, mi is történik valójában.

Összetákoltam egy pici programot, ami alaplapi ROM-ként betéve kiírja a regiszterek értékét, majd feltölti őket értékekkel, és végtelen ciklusban várja a reset gomb megnyomását. Ekkor megtekinthető, hogy a reset milyen hatással volt a feltöltött értékekre.
Ez lesz beállítva:


Ime néhány bekapcsoláskori érték:
9057-1
9059-2
9061-3
9063-4
9065-5
9067-6
9069-7
9071-8

Több különböző Z80 lett próbálva, de mint látható, köze nincs a leírásban állítotthoz, max néha véletlenül van olyan. A regiszterek teljesen véletlenszerűen töltődnek fel, kivéve a PC meg az I,R ami a Zilog leírás szerint is nullázva lesz.
Valószínűleg valami gyártástechnikai dolog miatt, a Zilog és ST gyártmányú procik jobban szeretik az 1-es biteket, a NEC pedig a 0-akat. A legérdekesebb az NDK gyártmányú darab, ami az AAh értékeket szereti nagyon.

Reset után viszont valamennyi procin ez a helyzet:
9073-9
Vagyis valamennyi register értéke megörződik, kivéve a PC meg az I,R ami nullázva lesz.

Ep128emu-n viszont jelenleg ez a helyzet:


Ha jól nézem innen:
Code: [Select]
 void Z80::reset()
  {
    R.PC.L = 0;
    R.I = 0;
    R.IM = 0;
    R.IFF1 = 0;
    R.IFF2 = 0;
    R.RBit7 = 0;
    R.R = 0;
    R.AF.W = 0xFFFF;
    R.SP.W = 0xFFFF;
    R.IX.W = 0xFFFF;
    R.IY.W = 0xFFFF;
    R.Flags &= ~
        (Z80_EXECUTING_HALT_FLAG |
         Z80_CHECK_INTERRUPT_FLAG |
         Z80_EXECUTE_INTERRUPT_HANDLER_FLAG | Z80_INTERRUPT_FLAG |
         Z80_NMI_FLAG | Z80_SET_PC_FLAG);
    newPCAddress = -1;
  }

Kell törölni a négy FFFF értékadást.

Offline lgb

  • EP addict
  • *
  • Posts: 3496
  • Country: hu
  • æðsta yfirmaður
  • OS:
  • Linux Linux
  • Browser:
  • Chrome 27.0.1453.47 Chrome 27.0.1453.47
    • View Profile
    • http://lgb.hu/
Re: Z80 reset
« Reply #1 on: 2013.April.17. 10:46:06 »
Quote from: Zozosoft
Kell törölni a négy FFFF értékadást.

Node, akkor meg lehet mindig nulla lesz. Nem tudom amugy, ha a valtozo erteke nem inicializalt (marmint C es C++, emu szinten mondom) es nem adsz neki erteket FFFF-re, akkor lehet meg mindig nulla lesz, nehany C fordito nullanak inicializalja a BSS reszt (nehany meg hozza nem nyul tehat a memoria elozo allapota, de van ahol viszont OS szinten nullazak az allokalt lapokat, tehat akkor is kerdeses, hogy nem nullazodik-e). Ha emulalni kene "valodi" Z80-at, akkor inkabb random szam generalas kene az FFFF ertekadas helyett :D Marmint ha az a cel, hogy minnel jobban hasonlitson az emulalt Z80 a "valodihoz". Amikor en irtam Z80 emut amugy en is FFFF-nek inicializaltam :) Es oszinten, imho nem is fontos, mert ugye ugyis illene aztan a futo ROM kodnak feltoltenie stb. Amde pont ahogy irod, neha jol jon pl akar egy bug nyomozasnal is, ha kb hasonloan viselkedik mint a valodi CPU, igy elobb kiderulhet par turpissag :) Ilyen elven viszont arra is lehetne opcio hogy NMOS/CMOS Z80, illetve NEC/Zilog meg stb ... :-P

Online Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 20.0 Firefox 20.0
    • View Profile
    • http://enterprise.iko.hu/
Re: Z80 reset
« Reply #2 on: 2013.April.17. 10:53:49 »
Itt a fő szempont, hogy resetnél ne törlődjenek a regiszterek, mert így lesz olyan mint az igazi. Ez megvalósul ezen sorok törlésével.
A bekapcsoláskori véletlenség kérdését már feltettem Istvánnak.
Mondjuk ez már csak maximalizmus :-)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 18.0 Firefox 18.0
    • View Profile
Re: Z80 reset
« Reply #3 on: 2013.April.17. 11:18:52 »
Quote from: lgb
Node, akkor meg lehet mindig nulla lesz.
Itt mindig nulla lesz, mert a Z80::Z80() először egy memset() hívással törli az összes regisztert.

Offline lgb

  • EP addict
  • *
  • Posts: 3496
  • Country: hu
  • æðsta yfirmaður
  • OS:
  • Linux Linux
  • Browser:
  • Chrome 27.0.1453.47 Chrome 27.0.1453.47
    • View Profile
    • http://lgb.hu/
Re: Z80 reset
« Reply #4 on: 2013.April.17. 11:51:01 »
Quote from: Zozosoft
Itt a fő szempont, hogy resetnél ne törlődjenek a regiszterek, mert így lesz olyan mint az igazi. Ez megvalósul ezen sorok törlésével.
A bekapcsoláskori véletlenség kérdését már feltettem Istvánnak.
Mondjuk ez már csak maximalizmus :-)

Igen, en is a power-on allapotra gondolok, nem feltetlen a reset-re csupan. Bar ez erdekes: Z80 megtartja a regiszterek allapotat reset utan? Marmint ha nem bekapcsolasrol van szo. En azt hittem, ez EXOS-ban ugy van, hogy a regiszterek erteke nem marad meg, "csupan" arrol van szo, hogy ugye az exos warm reset vector a memoriaban be van allitva, es oda ugrik vissza reset utan pl, de a regiszterek erteke elveszik.

Offline Povi

  • EP addict
  • *
  • Posts: 1873
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 20.0 Firefox 20.0
    • View Profile
    • http://povi.fw.hu
Re: Z80 reset
« Reply #5 on: 2013.April.17. 21:37:19 »
Quote from: Zozosoft
Több különböző Z80 lett próbálva, de mint látható, köze nincs a leírásban állítotthoz, max néha véletlenül van olyan. A regiszterek teljesen véletlenszerűen töltődnek fel, kivéve a PC meg az I,R ami a Zilog leírás szerint is nullázva lesz.
Érdekes részletek derülnek ki! :-)
*** Speicherplatz zu klein