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
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.
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
). Í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:
[ Guests cannot view attachments ]
Ime néhány bekapcsoláskori érték:
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
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:
[ Guests cannot view attachments ]
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:
[ Guests cannot view attachments ]
Ha jól nézem innen:
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.