ZXNet эхоконференция «code.zx»
тема: Speccy Timings.
от: Vitaly Vidmirov
кому: Alexander Ageev
дата: 12 Dec 1998
Здрасте, здрасте Alexander!
Однажды, в студёную летнюю пору, что-то около (10-11-98/00:59:05)
писал как-то Alexander Ageev к Vitaly Vidmirov ...
VV>> Что значит "про работу ULA"? Времянки, или отличия от, скажем,
VV>> пентагона?
AA> И времянки, и отличия от пентагона, интересует _АБОЛЮТHО ВСЕ_ про ULA.
AA> У тебя есть информация по задержкам, формируемым ULO'й при обращении
AA> к порту FE и разделяемой памяти ?
AA> Предполагаемый вариант ответа: нет ;) потому как никто ни знает
Вполне сносная инфа по ULA (естественно, с точки зрения программной
эмуляции Спектрума) имеется в описалове к Лунтеровскому эмулю.
Я уже кидал сюда выдержки из оного, но как выяснилось, её никто не видел ;)
Так же некоторые сведения были подчерпнуты путем "выспроса" и
"выпыта" у чехов (K3L).
Вообще, спектрумы бывают 48, 128, +2 (= +2 + магнитофон), +2а
(amstradовский +2), +3 (то же самое но с дискоглотом).
Hе буду тут распинаться про то, что ULA работает на своей
шине и со своим куском памяти. Это и так общеизвестно.
Времянки, память.
Времянки различаются только для 48к и 128к машин. Тачки +2а/+3
аналогичны 128-му (и +2), правда не во всём, т.к. были переработаны.
48к:
|<- 224 ->|
+---------+--+--+--+-------
|/////////|rb|lb|hb| ^ ^
|<- 128- >|24|24|48| |192|
|/////////|<>|<>|<>| | |
+---------+--+--+--|--- | 312
| ^56 | | | | |
#---------+--+--+--| |
| ^64 | | | | | (~16 за кадром)
+---------+--+--+--+-------
# - появляние int'a (224 x 64 = 14336)
итого 224 x 312 = 69888
для 128к:
|<- 228 ->|
+---------+--+--+--+-------
|/////////|rb|lb|hb| ^ ^
|<- 128 ->|??|??|??| |192|
|/////////|<>|<>|<>| | |
+---------+--+--+--|--- | 311
| ^56 | | | | |
#---------+--+--+--| |
| ^63 | | | | |
lb+rb+hb = 100 тактов, вероятно распределяются как 25/25/50.
итого 228 x 311 = 70908
Естественно, такую с такой скоростью проц будет работать только
тогда, когда он работает с fast памятью. При работе с
разделяемой (slow) памятью процессор тормозится, пока ULA не
сделает своё чёрное дело.
Как известно, для 48-го slow память занимает адреса #4000-#7FFF.
Для 128-х машин тормозными являются банки:
для 128/+2: 1-3-5-7
для +2а/+3: 4-5-6-7
Степень затормаживания при обращении к slow памяти различна для
разных машин: 48 -> 128(+2) -> +2а(+3) в порядке увеличения
производительности.
В среднем, обращения к slow памяти занимают на 15-20% больше.
Если же и программа там, то торможение может достигать 25-30%.
Hапример ld a,(#4000) будет длиться ~15 тактов (по инфе от Dron/K3L ;).
Порты.
in a,(#fe) происходит не сразу, и занимает ~12.25 тактов против 11-ти.
Об out (#fe) я, честно говоря не помню, но _вроде_ не тормозит.
Да, цвет бордер'а изменяется в момент засоса байта видеоданных,
т.е. каждые 4 такта.
Банки способны щёлкаться по:
128/+2: out(#fd),#1x, ровно как и по out(#0d),#1x
+2a/+3: out(#fd),#5x.
Глюк ULA
Отдельно остановлюсь на причине, по которой нельзя класть
в регистр I числа, такие, чтобы вектор был в slow памяти.
Как известно, во время выполнения цикла m1 (извлечение кода
операции) z80 выполняет регенерацию памяти, выдавая в младшую
часть адреса регистр R, а в старшую I. ULA, видя что адрес лежит
прямо в slow памяти, думает что проц хочет прочитать байт по
этому адресу ... и в итоге, не справившись с такой частотой
чтения пропускает каждый второй байт. Вместо него повторяется
предыдущий.
Этот глюк для 48 и 128/+2 не опасен - просто визуальные эффекты.
В то время как на +2a/+3, программы тотчас же рушатся.
Чё-то больше ничего вспомнить не могу :(
злобный Виталик AKA Dark/X-Trade
|