Очень просто: чтобы вычислить время выполнения команды с точностью до десятых долей такта, я выполняю команду много раз подряд (команда размножена в памяти) и затем делю получившееся время на число команд.
Так вот, поскольку частота процессора (4 МГц) не совпадает с частотой видеоконтроллера (6 МГц), одна и та же команда может выполниться за разное число тактов: процессор пытается считать из памяти аргумент, а память может быть не готова отвечать. А в другой раз может быть сразу готова.
Итого, надо рассматривать блок из трёх команд.
Например, в быстрой памяти MOV (R2),R1 выполняется (попутно считывая аргумент из медленной памяти) за 16 тактов, следующая такая же команда снова за 16 тактов, а вот третья уже за 32, потому что в это время контроллер памяти занял шину и не позволяет считать команду. Вот и получаем (16+16+32)/3 = 21,3 такта в среднем на команду MOV (R2),R1.
А в медленной памяти эта команда всегда выполняется за 32 такта.
Для демки «Good Apple» я ещё писал тест блока произвольных команд, так как разные команды в разной последовательности в разное время обращаются к памяти и перестановкой местами некоторых команд можно устранить лишние простои.



Ответить с цитированием
