PDA

Просмотр полной версии : Не понимаю, как работает мультиколор в игре



predatoralpha
26.05.2012, 02:58
Решил дисассемблировать одну игру (Buzzaw+), глянуть как реализован мультиколор.
Там огромный состав вот такого кода:

LD sp,nnnn 10
POP 10
POP 10
POP 10
EXX 4
POP 10
POP 10
POP 10
POP 10
LD sp,nnnn 10 94

PUSH 11
PUSH 11
PUSH 11
PUSH 11
EXX 4
PUSH 11
PUSH 11
LD sp,nnnn 10
PUSH 11
LD A,(IX+-n) 19
OUT (0xFE),A 11 121

Цифирки - такты выполнения.
Получается, что на вывод тратится 121 такт.

Но время, которое тратится на бордюр и горизонтальную синхру - 96 тактов.
http://www.zxdesign.info/horiztiming.shtml
На остальное время проц блокирован ULA, при выводе в медленную память или порты.
Что я неправильно понимаю??? Или возможна запись в порт во время вывода изображения, в фирменном спеке?

jerri
26.05.2012, 09:16
тебе это не в графике писать надо а в программировании

в строке у тебя 216 или 224 такта
у тебя получается 94+121=215 тактов

возможно в конце знакоместной строки всплывет еще пара nop

predatoralpha
26.05.2012, 10:47
Это не мой код, а отлично работающая игра.
То, что тактов меньше - не проблема. Ula придержит немного проц.
Вопрос в другом - почему это вообще работает, и не сбивается. Слишком много тактов тратится на вывод.
Кстати, 216 тактов - это где, в каких клонах?

goodboy
26.05.2012, 12:06
а что мешает пообщаться с автором игры на форуме wos ???
это ведь проще чем мыслить догадками. хорошо хоть он (автор) сделал поддержку времянок Пентагона.

TmK
26.05.2012, 12:21
Это не мой код, а отлично работающая игра.
То, что тактов меньше - не проблема. Ula придержит немного проц.
Вопрос в другом - почему это вообще работает, и не сбивается. Слишком много тактов тратится на вывод.


А я бы сказал слишком мало)))
Команды работы с медленной памятью занимают 88 тактов (8команд)
торможение в пределах идет только когда отображается экран (128т), и торможения нет на бордюре (96т для zx48 и 100т для zx128)
Большинство приведенного кода выполняется на бордюре, и только 1 команда попадает на торможение (+8т максимум тормозиться)

вот тебе и ответ)

94+121=215 -> 9/13т свободно для торможения +- остальные выравниваются

jerri
26.05.2012, 13:10
Это не мой код, а отлично работающая игра.
То, что тактов меньше - не проблема. Ula придержит немного проц.
Вопрос в другом - почему это вообще работает, и не сбивается. Слишком много тактов тратится на вывод.
Кстати, 216 тактов - это где, в каких клонах?

Это на фирменной машине при отсутствии конфликта с УЛА

на скорпионах 216/224 такта
на пентагонах 224 такта стабильно

TmK
26.05.2012, 14:13
Это на фирменной машине при отсутствии конфликта с УЛА

Дык как раз я и объяснил как и когда происходит конфликт с УЛА :)


на скорпионах 216/224 такта
на пентагонах 224 такта стабильно

на пентагонах да, на скорпионах нет... что за число такое 216?
На скорпионах всегда 224!

Единственное НО - команды до четного такта продлеваются, т.е. на пентагоне LD A,1 7тактов, на скорпионе 8 (в каких то ревизиях это должны были исправить)

jerri
26.05.2012, 14:57
TmK, возьми желтый скорп и возьми зеленый :)
у меня на желтом было 224 такта
на зеленом 216
так я фиксил мультиколоры

TmK
26.05.2012, 14:59
страшный какой то комп))) Что на самом деле на зеленом 216 тактов оО?
я думал там 224 и как раз округление до четнотактового убрано...

живого скорпа никогда не трогал...

predatoralpha
26.05.2012, 17:03
Ребята, не знаю как на скорпионах и пентагонах, а на фирменных спеках как за медленную память, так и за порты отвечает ULA.
http://lvd.nm.ru/ZX/2_sch.png
И порт не может работать совсем уж прозрачно в режиме видеоотображения. Поскольку на шине данных есть данные, а на адресной шине ULA идёт RAS/CAS для медленной памяти.
И вот между первым PUSH и последним OUT есть 121 такт. Что в никакие времянки не влазит.
Отсюда вопрос - как фирменная ULA обрабатывает запись в порт? Блокирует проц? Задерживает на пару тактов? Как то ещё? Потому что если ULA блокирует проц, этот код не может исполняться на фирменном Спеке.

Blade
26.05.2012, 17:04
jerri, какой то странный зеленый скорп. В нем никто паяльником не копался? На тех зеленых, что я видел было 224 такта в строке. В деме Infarct мультиколоры работали нормально.

newart
26.05.2012, 18:50
jerri, какой то странный зеленый скорп.
Он перепутал желтый с зеленым.

jerri
26.05.2012, 19:53
Blade, ну значит попутал
просто тот что у меня - у него желтая плата и infarct работает неправильно
у Spider/WDG был скорп с зеленой платой со смуком и там все работало на УРА

так что я хз какой из них зеленый а какой желтый
но может и я за давностью лет и цвет конечно попутал

при этом на пентагоне на бордюре отображались мультиколоры до 2х точек
а у меня бордюрные эффекты прыгали с точностью до знакоместа

так что отображение экрана там реализовано с точностью до 4х тактов

TmK
26.05.2012, 22:59
Ребята, не знаю как на скорпионах и пентагонах, а на фирменных спеках как за медленную память, так и за порты отвечает ULA.
http://lvd.nm.ru/ZX/2_sch.png
И порт не может работать совсем уж прозрачно в режиме видеоотображения. Поскольку на шине данных есть данные, а на адресной шине ULA идёт RAS/CAS для медленной памяти.
И вот между первым PUSH и последним OUT есть 121 такт. Что в никакие времянки не влазит.
Отсюда вопрос - как фирменная ULA обрабатывает запись в порт? Блокирует проц? Задерживает на пару тактов? Как то ещё? Потому что если ULA блокирует проц, этот код не может исполняться на фирменном Спеке.

1. Читай пост выше, что я написал что как и когда выполняется, и что и когда тормозиться.

2. Тема про медленную память обсуждалась неоднократно:
http://www.worldofspectrum.org/faq/reference/hardware.htm
http://www.worldofspectrum.org/faq/reference/128kreference.htm
http://www.worldofspectrum.org/faq/reference/48kreference.htm
http://zx.pk.ru/showthread.php?t=444
http://zx.pk.ru/showthread.php?t=657

ну и просто поиск по WOS и zx.pk.ru со словами: медленная память, contended memory и т.п.

3. Если есть желание, запускаем spin - там в дебагере есть счетчик тактов, полезно посмотреть

predatoralpha
27.05.2012, 12:45
.... Спасибо, у меня было убеждение, что проц во время вывода намертво блокируется. Спасибо что прояснили.

predatoralpha
30.05.2012, 17:57
/// Кстати, 216 тактов - это где, в каких клонах? ////
Это на фирменной машине при отсутствии конфликта с УЛА

на скорпионах 216/224 такта
на пентагонах 224 такта стабильно
Если верить вот этому
http://www.worldofspectrum.org/faq/reference/48kreference.htm
http://www.worldofspectrum.org/faq/reference/128kreference.htm
то на фирменных было 224 такта для 48К и 228 тактов для 128K/+2 (вероятно, компенсировали возросшую частоту проца с 3.50000 MHz до 3.54690 MHz). Так что 216 - это в клонах.

goodboy
30.05.2012, 18:13
228 тактов для 128K/+2 (вероятно, компенсировали возросшую частоту проца с 3.50000 MHz до 3.54690 MHz)

не компенсировали, а использовали один кварц для проца и ПАЛкодера. (на 48 их два)

jerri
30.05.2012, 21:55
я хз что там в мануалах
но мультиколор в Venom рассчитан в целом на 224 такта в строке
а она вроде под 128 к машину

predatoralpha
31.05.2012, 00:09
Немного меньше в игре - это не проблема. ULA задержит проц, если операция доступа к медленной памяти (в частности видеопамяти) попадёт на формирование видеостроки. И подровняет этот доступ к видеопамяти в положенную им "дырку", когда выводится бордюр и идёт обратный ход луча. Тут не нужен расчёт до такта, я говорю про время всей цепочки.
А вот команды доступа к медленной памяти должны помещаться в "дырку". ULA их сама подсинхронизирует к дырке, за счёт задержек проца.

jerri
31.05.2012, 11:10
predatoralpha, есть музыкальная демка... хз не помню как называется
там музыка конверченная с атари на ау играется, там доступ просчитан до такта

predatoralpha
31.05.2012, 12:16
Я оччень сомневаюсь, что прям таки до такта. Впрочем, не исключаю адаптации под конкретную модель.

goodboy
31.05.2012, 12:27
есть музыкальная демка... хз не помню как называется
там музыка конверченная с атари на ау играется, там доступ просчитан до такта к примеру вот эта http://www.pouet.net/prod.php?which=11147 или эта http://www.pouet.net/prod.php?which=54501 (грузить после usr0 в 128ом бейсике)

TmK
31.05.2012, 14:37
predatoralpha, есть музыкальная демка... хз не помню как называется
там музыка конверченная с атари на ау играется, там доступ просчитан до такта

Дык в любых демках где нужна синхра с экраном все до такта просчитывается.

Я вот тут про медленную память думал... надо графики сигналов z80 смотреть... Там торможение идет во время сигналов запись/чтение походу чтоли +- выставление адреса мб хотя врятли...

predatoralpha
31.05.2012, 16:33
Дык в любых демках где нужна синхра с экраном все до такта просчитывается.
До такта - не обязательно. Можно чуть меньше.


Я вот тут про медленную память думал... надо графики сигналов z80 смотреть... Там торможение идет во время сигналов запись/чтение походу чтоли +- выставление адреса мб хотя врятли... Адрес там всегда болтается, через мультиплексор:
http://lvd.nedopc.com/ZX/2_sch.png
Похоже, тормозит по IOREQ, и по MREQ при A14 и А15 в медленную память. Но я не вполне понял что ты хотел сказать.

TmK
01.06.2012, 09:11
я к тому что, например команда LD (HL),A - 7 тактов
цикл обработки процом:
x1 тактов - чтение и дешифрация команды
x2 тактов - выставление шины адреса, шины данных
x3 тактов - выдача сигнала MREQ, WR - вот тут и идет торможение

т.е. если команда начала считываться на XXX такте, то тормоза будут на XXX+x1+x2 такте, так вот удобно бы посмотреть для каждой команды когда происходит это торможение, тогда можно все расчитать так, чтобы уменьшить торможение (скажем чтобы оно попадало на 0 или 1 торможение в тактах)

predatoralpha
01.06.2012, 11:49
Ну да. Тормозится только цикл доступа к медленной памяти.
Такты команд неплохо расписаны здесь:
http://igorkov.org/pdf/Z80-Central-Processor-Unit.pdf
5.4 Очерёдность выполнения по циклам

Правда, там на команду PUSH цикл доступа к памяти трёхтактовый, а реально на шине это занимает 2 такта. Непонятно, пустышка первый или последний такт.
PS. Вру. 2 такта используется для чтения кода операции и рефреша. Для доступа к данным используется 3.