Ez a script a memória várakozások hatásait is jól kell mérje?
Természetesen igen, mert a vízszintes video pozíció változásai alapján méri az időt (ezért kell Step módban futtatni, vagy minden címre töréspontot beállítani). Legfeljebb az lehet probléma, hogy csak egy-két utasításból álló kódnál nem elég pontos.
Mert egy érdekes anomáliával találkoztam:Ez alapján azt vártam, hogy egy sok-sok LDI utasítást tartalmazó rutin jelentõsen lassul az OUT 191,4 hatására. De az össz rutinra nézve kb csak annyi különbség volt mint az LDIR-es változatnál, én bénáztam el valamit, vagy az LDIR is generál minden körben M1 ciklust?
Ha az LDI vagy LDIR által olvasott és/vagy írt terület a video memóriában van, akkor az megváltoztathatja az időzítést. LDI utasításnál például ha a DE és a HL is video memóriára mutat, de az LDI nem video memóriában van, akkor a várakozási módtól függetlenül kb. 22.5 ciklus lesz több egymást követő LDI utasítás átlagos futásideje (a várakozás nélküli változat csak többet vár a video RAM-ra).
Az LDI utasítás részletes időzítése:
4 (M1: EDh olvasása) + 4 (M1: A0h olvasása) + 3 (olvasás HL címről) + 3 (írás DE címre) + 2 (HL, DE növelése - illetve ezek talán már a memóriaműveletek közben történnek, BC csökkentése, jelzőbitek állítása)
A tényleges olvasás vagy írás (az adatbusz mintavételezése) az M1 műveleten belül 2.0 ciklusnál történik a 4-ből, a normál memóriaműveletnél 2.5 ciklusnál a 3-ból, és I/O műveletnél 3.5 ciklusnál a 4-ből. A /WAIT bemenetet a Z80 az M1 és normál memória műveletnél is 1.5 ciklusnál figyeli, I/O műveletnél pedig 2.5 ciklusnál:
[ Guests cannot view attachments ] [ Guests cannot view attachments ] [ Guests cannot view attachments ]
Az LDIR időzítése azonos az LDI-vel, ha a végrehajtásával a BC értéke 0-ra csökken. Egyébként még a fent leírt 16 ciklus után van további 5 ciklus, ami gyakorlatilag relatív ugrást végez vissza az LDIR utasításra, amelyet aztán a Z80 újra beolvas a memóriából.