Lehet, hogy megtaláltam a probléma okát, de ha valóban ez az, akkor az összes CPC átiratom hibás igazi gépen
Úgy sikerült megtalálni, hogy a lefagyás helyének a megkeresése céljából a megszakítási rutint módosítottam, hogy legyen egy nagy frekvenciájú (kb. 6 kHz-es) megszakítás, amely tárolja a megszakítás előtti PC és SP értékét; így ugyan lassult a program futása, de ez nem változtatott a hibán. Így tűnt fel, hogy a lefagyás előtti utolsó megszakítás mindig 4336h címen történik, amely a loaderCall rutin elején található LD A, I utasítás utáni byte címe. Ennek az utasításnak az a célja, hogy a betöltő kódjába történő hívások vissza tudják állítani a megszakítások engedélyezését (amelyet az LD A, I elvileg a P/V biten tárol) a visszatéréskor. Gyanús lett az LD A, I utasítás, és rövid keresés után meg is találtam
ezt az információt:
"
Hey another thing you may wish to consider mentioning are the bugs in the NMOS version of the CPU.
One of them is with regard to the buggy IFF2->parity flag performance in the LD A,I and LD A,R instructions.
An error can occur when an INTACK runs near these instructions:
the parity flag will be showing 0 when it should have been 1.
A Zilog app. note is around somewhere talking about this.
It's a rather nasty bug for embeddedaapps... There are I think a few others."
Tehát ez egy Z80 hardver bug: az LD A, I / LD A, R hibásan tárolja a megszakítás engedélyezését a P/V biten, ha véletlenül pont ilyen utasításnál történik megszakítás. Ez nem minden Z80 változatnál fordul elő (csak az NMOS hibás), így lehetséges, hogy az egyik (kicserélt CPU-s ?) gép jól működött. Ezért Z80 CPU-n gyakorlatilag lehetetlen megbízhatóan megállapítani, hogy éppen engedélyezettek-e a megszakítások.
Mivel a problémás rutint mindegyik CPC átiratban használtam, elvileg mindet javítani kellene
, bár úgy látszik, soknál a gyakorlatban nincs hiba (vagy azért, mert csak letiltott megszakításnál történik loaderCall hívás, vagy mert szerencsés módon olyan az időzítés, hogy az LD A, I utasításnál nem lehet megszakítás, vagy pedig a játék időben újra engedélyezi a megszakításokat, és így nem fagy le).