Можно что-нибудь внятное по этому поводу?
Не совсем понимаю, что где как будет исполняться и в чём причина.
Вид для печати
Можно что-нибудь внятное по этому поводу?
Не совсем понимаю, что где как будет исполняться и в чём причина.
На английском: http://www.worldofspectrum.org/faq/r...htm#Contention
Причина - тактирование процессора приостанавливается, если доступ к памяти происходит в определенные моменты времени в область памяти которая шарится между процессором и ula. Самое короткое и не запутанное поведение можешь посмотреть в реализации ULA классов оригинальных спектрумов в zxmak2
http://zxmak2.codeplex.com/SourceCon...w/22900#391359
Я вижу, что это связано с обращениями к памяти до #8000, и всё.
В общем, расположение кода лучше с #8000.
Спасибо
нет, не только, вот ULA от Spectrum128:
тут есть и обращение к портам и к области #4000 и к #C000 (причем в зависимости от замапленой страницы)Код:protected override void WriteMem4000(ushort addr, byte value)
{
contendMemory();
base.WriteMem4000(addr, value);
}
protected override void WriteMemC000(ushort addr, byte value)
{
if ((m_pageC000 & 1) != 0)
contendMemory();
base.WriteMemC000(addr, value);
}
protected void ReadMem4000(ushort addr, ref byte value)
{
contendMemory();
}
protected void ReadMemC000(ushort addr, ref byte value)
{
if ((m_pageC000 & 1) != 0)
contendMemory();
}
#region The same as 48
private void WritePortAll(ushort addr, byte value, ref bool iorqge)
{
contendPortEarly(addr);
contendPortLate(addr);
if ((addr & 0x0001) == 0)
{
int frameTact = (int)((CPU.Tact - 2) % FrameTactCount);
UpdateState(frameTact);
PortFE = value;
}
}
private void ReadPortAll(ushort addr, ref byte value, ref bool iorqge)
{
contendPortEarly(addr);
contendPortLate(addr);
int frameTact = (int)((CPU.Tact - 1) % FrameTactCount);
base.ReadPortFF(frameTact, ref value);
}
Alexander Makeev, вообще некоторая неразбериха, смотрю.
Первый случай - одновременное обращение к 4000-8000 (видео)
второй - обращение к 1,3,5,7 страницам
Есть два важных момента:
1. Медленная и быстрая память
2. Отображение экрана/отображение бордюра
Тормоза на оригинальных машинах происходят когда отображается экран и идет обращение к медленной памяти. вот тока не помню обращение к 7ffd тоже считается обращению к медленной памяти или нет (вроде да).
Обращение к медленной памяти - выполнение кода в медленной памяти, команды чтения/записи в область медленной памяти (также и все остальные где используется обращение к памяти - RR(HL), PUSH(если стек в медленной памяти) и т.п.)
у zx128, zx+2 медленными являются страницы: 1,3,5,7 (быстрые 0,2,4,6)
у zx+2A, zx+3 медленными являются страницы: 4,6,5,7 (быстрые 0,1,2,3)
во всех zx с одним окном проецирования страниц память выглядит так:
#0000-#3FFF страница 0 (перекрытое ПЗУ)
#4000-#7FFF страница 5
#8000-#BFFF страница 2
#C000-#FFFF страница 0
соответственно:
#4000-#7FFF - всегда медленная память
#8000-#BFFF - всегда быстрая память
#C000-#FFFF - в зависимости от того какая страница туда впечатана
Про задержки - они разные в зависимости от текущего такта на который попало обращение к медленной памяти и модели:
http://www.worldofspectrum.org/faq/r...kreference.htm
Смысл задержек - простой, если в момент обращения к медленной памяти юла читает память, то проц тормозится до момента когда юла закончит свои дела, по сути, пока луч летит по экранной области, т.е юла занимает память и проц вынужден ждать. Прикол еще в том что под обращением проца к памяти понимается не только реальное обращение, но и обращение к портам, а также некоторые промежуточные состояния проца, когда он активирует memrq, но rd и wr не активирует, т.е к памяти реально не обращается