I just made a test bench log of T80 (log of instruction's M1, and first M1 coming after knowing that I send a lot of NOP after my instruction), and compare it to a JavaCPC timing array. Some instructions was not tested (interrupt wait, and special timing (instructions with change timing)), but all others passed correctly.
==== Instruction timing : currently in r008.5.14 ====
In r008.5.14, in GA, I do use begin of edge for IO_ACK instead of state.
In r008.5.14, M1 reached same time of IO_ACK are ignored (not M1) in WAIT_n generator.
In r008.5.14, MEM_WR has an OSD menu choice to switch between "quick" and "slow", "slow" mode does insert ONE WAIT_n during detection of MEM_WR. This switch exists because somes games are running in "slow" mode and others in "quick" mode. ==== Instruction timing : talk about r008.5.14 ==== In fact it exists several instruction making MEM_wr, and adding each one ONE WAIT_n does result in different case of synchronization. If it's about managing GA reading pixels, perhaps not only M1 signal is truly synchronized but also the MEM_RD and MEM_WR accesses at another offset.
[http://www.cpcwiki.eu/forum/emulators/cpc-z80-timing/ CPC Z80 timing]
If it's about managing GA reading pixels, perhaps not only M1 signal are synchronized but also the MEM_RD and MEM_WR accesses at another offset.
[http://amstrad.eu/modules/newbb/viewtopic.php?post_id=24592 Timings instructions Z80 sur CPC]
If interruption r52 is regular, even while making a continues MEM_WR, interruption (int<='1') shall be taken into account above WAIT_n insertions ?
In Z80 sequence diagram, an IO_ACK(+M1) is preceded by M1 (single)
cpctest.dsk -Timing Instruction- is different while using mode "MEM_WR=slow" and "MEM_WR=quick". Strangly better using "MEM_WR=quick".
Current version is using "Z80_HACK=true" (parameter set during compilation), that shunt Z80.WAIT_n entry, Z80.clock is slow down during theses WAIT_n. It's the only current way I succeed in slowing down enough Timing Instruction for unlocking Saboteur 2 game.
Key games here are : Saboteur 2 (run fine with "MEM_WR=slow", does freeze with "MEM_WR=quick") and Arkanoid II (run fine with "MEM_WR=quick", too slow using "MEM_WR=slow")
=== Test of a real Zilog 80 ===