PDA

Просмотр полной версии : Повышаем качество эмуляции Львов ПК-01



NEO SPECTRUMAN
22.03.2021, 18:55
собственно сабж

эмуляция Львова долгие годы мягко говоря SUXX
и это надо как то уже менять...
а для этого нужно проведение тестов на реале


ну и начнем с карты памяти при подключенной видео памяти
в известной документации не описано что именно находится по адресам $0000...3FFF

Однако
следует помнить, что при таком переключении от шин МП отключа-
ется область основного ОЗУ 0000H-7FFFH
а разные эмуляторы эмулируют оно по разному

b2m - ПЗУ
Emulator3000 - ОЗУ (но не с 8000, а с 0000)
Эмулятор HW - похоже, что вообще пусто - считываются нули из этой области

но из схемы есно что включение видеопамяти в адрессное пространство происходит принудительной установкой A15
а сама видео память в обычном режиме просто "прячется" под ПЗУ

https://i.postimg.cc/R0YhnZj3/2021-03-20-085239.png
https://i.postimg.cc/907Ljzjy/2021-03-20-084703.png

изза чего по адресам 0000...3FFF должно быть зеркало 8000...BFFF
что очень полезно (вощем я уже это использую не дожидаясь результатов : )
так как это позволит использовать свой набор rst при включенной видео памяти
включать видео память без дополнительного перехода в 8000...BFFF
да и вообщем это несколько критичный момент изза которого на эмуляторе может все прекрасно работать а на реале нет

ну а чтоб выяснить что именно подключается туда на само деле
запилен тест
MEMORY MAP TEST
https://www.mediafire.com/file/w1shek27xiuldpt/mem_map_test_r0000.7z/file
который читает все 64К с подключенной видео памятью и без
и выплевывает сплющенно на экран

так же

пофикшенный конфиг для emu от b2m-а
https://www.mediafire.com/file/1six584j0ey3wor/Lvov_b2m_config.7z/file

ожидаемый на реале результат
https://i.postimg.cc/x8VgfgKF/2021-03-22-181749.png https://i.postimg.cc/QddmdFTs/2021-03-22-181800.png

Pyk
22.03.2021, 19:50
А по сбросу судя по всему на адрес 0000 временно подключается ПЗУ - до записи в какой-нибудь порт (сигнал I/O W на D 5.1), что сразу же и происходит - команда OUT 00h по адресу E800...

Исправленная конфигурация для Emu80:
http://emu80.org/temp/lvov.conf.7
(временное подключение ПЗУ не реализовано: по сбросу управление сразу передается на E800, думаю, это не очень критично, хотя реализовать несложно)

Проверять на реале будем? Или поверим, что так оно и есть?

NEO SPECTRUMAN
22.03.2021, 20:01
до записи в какой-нибудь порт (сигнал I/O W на D 5.1)
а посмотри что может вызывать зависание компа при in ($00)

какоето объяснение нашел
осталось его переварить


Любая операция IN или OUT в порты 0 - 191 будет подвешивать компьютер, из за снятия сигнала READY на CPU.
В руководстве по Бэйсику для команды OUT указано, что разрешенные порты 192 - 255.
Плохо, что:
- не пояснили причин
- не сделали проверки и защиты от подвисания.

Причина кроется в следующем:
Арбитр доступа к видео ОЗУ построен на микросхемах D1.1 D1.2 D5.2 D4
Он Реагирует на доступ по адресам A14 = A15 = 1 но неразличает доступ к ОЗУ или портам!
CPU на командах IN и OUT дублирует A0-A7 на A8-A15

Почему так сделано? Х.З.
Доработать можно включением пары вентилей в цепь сигнала D5.2-12
Но думаю такой цели нет. Надо просто знать и правильно эмулировать.

PS сканировать порты ненадо!
во Львове нет ничего кроме двух ВВ55 по адресам
С0-С3 и D0-D3
+ при эмуляции надо учесть, что A2 игнорируется !
т.е. С0-С3 эквивалентно С4-С7
и D0-D3 эквивалентно D4-D7

+ есть безадресный порт на запись
триггер D5.1

устанавливается при сбросе
и сбрасывается при первой записи в любой порт

это схема начального старта
процессор ВМ80 стартует с нулевого адреса, соответственно выбор ПЗУ на старте не такой как в нормальном состоянии.
триггер блокирует участие в выборе А14 и А15.
т.е. код из ПЗУ которое в нормальном состоянии C000 времменно сидит на 0000
первые команды должны быть типа

jmp C003
out A,(xx)

но совсем необязательно переключать сразу

для коректной эмуляции надо продолжать мапить адреса по другому пока не пройдет первая команда out
----------
2 дополнения:
- на схеме Львова ОПЕЧАТКА D28-3 подключен не на А3, а на А5 !!!
- D28 выбирается так же как и D9 схемой начального сброса,
т.е. после сброса до прохождения первой команды OUT дешифрация адреса для портов неработает. Думаю на практике это ничего незначит.
Первая команда типа OUT C3,xx достигнет своей цели, просто сигнал CS
будет немного задержан.
-----------
ответы на вопросы:
> что происходит на реале, когда мы обращаемся к портам
> 0xE0 - 0xFF? В эмуляторах они есть зеркалятся на порты 0xC0 - 0xDF.
> Насколько верно такое поведение?

отвер на вопрос: неверно.
там есть 4 линии выбора портов на D28
С0-С7
D0-D7
E0-E7
F0-F7

первые 2 заведены на ВВ 55 и поскольку А3 игнорируется, то
С0-С3 = С4-С7
D0-D3 = D4-D7

все 4 линии выведены на коннектор ВНЕШ1

DDp
22.03.2021, 22:01
запилен тест
MEMORY MAP TEST

Проверять на реале будем?
Обязательно!

Вот, что получилось на моём экземпляре https://drive.google.com/file/d/103hGPl07WVPe9CemqsRqWO1G3wHR9wT1/view?usp=sharing

Pyk
22.03.2021, 22:57
Ну что, считаем гипотезу об адресном пространстве подтвержденной? :)

kolk
23.03.2021, 00:14
Обязательно!

Вот, что получилось на моём экземпляре https://drive.google.com/file/d/103hGPl07WVPe9CemqsRqWO1G3wHR9wT1/view?usp=sharing

Чем видео захватывали?

NEO SPECTRUMAN
23.03.2021, 03:32
Вот, что получилось на моём экземпляре
так же видно что ПЗУ-шка не очень то и зануляет память при включении
можно даже будет пару раз выгрузить содержимое памяти после включения
и подставлять оно в эмулятора :v2_dizzy_roll:

я думал что память не очищается только при наличии своего обработчика ресета

DDp
23.03.2021, 19:44
Чем видео захватывали?
Behold TV H8 (http://beholder.ru/products/h8/)

...пару раз выгрузить содержимое памяти после включения...
Во вложении.

NEO SPECTRUMAN
23.03.2021, 19:46
Во вложении.
о крута!

тут своя шахматка
https://i.postimg.cc/Kvx3NxM3/lv-r1.png

https://i.postimg.cc/6pQ7kcz9/lv-r2.png

можно даже проэкстраполировать до конца
и получить то что якобы и должно быть и в видео памяти при старте

https://i.postimg.cc/fytCfdgs/lv-r111.png


- - - Добавлено - - -


Во вложении.
как говорится
"я смотрю ты прям напрашиваешься на закидывание тебе каких то тестов" :)

...но сначала их надо придумать и написать...
те что были нужны за 7 лет забылись...

DDp
23.03.2021, 20:08
...что якобы и должно быть и в видео памяти при старте
https://drive.google.com/file/d/1rYeFubf70tH905zItCof0KIrj9BGsBkc/view?usp=sharing

NEO SPECTRUMAN
23.03.2021, 20:47
https://drive.google.com/file/d/1rYe...ew?usp=sharing
но тут прикол что эта память то очищается при старте
и она никак не сможет повлиять...
ну например на рнд генераторы которые прочесывают память туда сюда для большего рнд

хотя можно тоже сравнить с вангованием
или даже восстановить содержимое

- - - Добавлено - - -

а вот тут по идеи можно будет услышать хитрожопое пищание портом палитры
https://www.mediafire.com/file/sk0lx1hquqbx812/WHPlay_palette_beep.7z/file
услышать только со встроенного динамика
на магнитофон звук не пойдет (на него пойдет сплошное 1)

щас оно не эмулируется
проверил emu80, b2m-u и e3000

ну и сделано оно на скорую руку и будет должно играть кривее чем должно
а может и не будет (мне проверить то некак)

преимущества такого мигающего пищания более быстрый цикл пищалки
а значит большая частота дискретизации
правда динамик издает такой скрежет
что там п*х качественный мы сигнал на него подаем или нет :)

Pyk
23.03.2021, 21:22
Надо будет сделать, ждем теста на реале.
И скриншотик с реала неплохо бы - может быть, дойдут руки сделать более аутентичное отображение с полосами, а то некрасивое мигание сейчас какое-то...

NEO SPECTRUMAN
23.03.2021, 21:26
И скриншотик с реала неплохо бы
он нам ничего не даст

да и тест этот придется писать с микрофона ;)

а для мультиколоров нужно снимать растактовку команд (в придачу в разных участках памяти)
детектить какие есть задержки
а это никто кроме меня в здравом уме делать не будет :)

а только потом писать мультиколорный тест...
тут же прерываний по КСИ нет для синхронизации...

DDp
23.03.2021, 22:47
а вот тут по идеи можно будет услышать хитрожопое пищание портом палитры
Скрипит. Мигает. https://drive.google.com/drive/folders/1Z4OyTyRLXM2-RfX9G7Ek00uS8Yu2SRAv?usp=sharing

а для мультиколоров нужно снимать растактовку команд (в придачу в разных участках памяти)
детектить какие есть задержки
Делал недавно что-то подобное (по той же ссылке) b00000.7z и b00002.7z

Pyk
23.03.2021, 22:51
NEO SPECTRUMAN, я просто хотел сделать картинку чуть более приближенную к реальности - пусть будут хотя бы полосы, какой уж тут мультиколор...

NEO SPECTRUMAN
23.03.2021, 22:57
Скрипит
шота жутко оно скприпит :v2_dizzy_tired2:
ладно потом впилят в эмуляторе
послушаем это я накосячил
или это так пищит динамик на самом деле :)

я ожидал что не будет низких
а тут ВНЕЗАПНО нет высоких

Pyk
23.03.2021, 23:05
Ага, впилю. Не сегодня только уже...

NEO SPECTRUMAN
23.03.2021, 23:07
шота жутко оно скприпит
как оно задумано можно послушать в emu80
https://www.mediafire.com/file/mhk84cktbf3awhz/WHPlay_r0012.7z/file
эта версия усердно гадит в порт $C2 по всем подряд (щелкает памятью итд)
так что не надо ее запускать на реалах с принтерами :)
а быть может и на реалах вообще

хотя как задумано послушать оно нельзя
оно задумано не то под SpecialFX нето под еще что то
поэтому оно и тут звучит местами как неторт

Pyk
24.03.2021, 00:30
В общем, довольно оперативно получилось сделать:
http://emu80.org/v4beta/Emu80qt_40352_test.7z

Распаковать поверх версии 4.0.351 с заменой.

Я правильно понимаю, что при выводе на магнитофон встроенный динамик тоже пищит?

- - - Добавлено - - -

В этой версии исправлены как динамик, так и распределение памяти.

- - - Добавлено - - -

напоминаю, что в эмуляторе есть настройка "Не воспроизводить звук с магнитофона".
Если включить, будет воспроизводиться только звук со встроенной пищалки.

ivagor
24.03.2021, 07:02
а для мультиколоров нужно снимать растактовку команд (в придачу в разных участках памяти)
детектить какие есть задержки
а это никто кроме меня в здравом уме делать не будет
Ну почему же.

NEO SPECTRUMAN
24.03.2021, 10:10
Я правильно понимаю, что при выводе на магнитофон встроенный динамик тоже пищит?
до притом пищит в противофозе
тоесть нельлзя просто взять и тупо сумировать оба сигнала в эммуляторе
тк будет громкость только падать (когда на реале она будет увеличиватся)


pb7 pc0
0 0 BEEP TAPE B=1 T=1
0 1 BEEP .... B=1 T=0
1 0 .... TAPE B=0 T=1
1 1 BEEP .... B=1 T=0

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

хотя никто не мешает проинверттировать сигнал бипера :)

но это не поможет имитировать гипотетический режим полтора битного DAC


3 = pc0=0 pb7=0 TAPE+BEEP
2 = pc0=0 pb7=1 TAPE
1 = pc0=1 pb7=1 BEEP

1 = pc0=1 pb7=0 BEEP

Pyk
24.03.2021, 18:11
хотя никто не мешает проинвертировать сигнал бипера
А я инвертировал сигнал магнитофона. а не бипера. Хотя бы из того соображения, чтобы при старте на выходах не было постоянной составляющей.
В общем, сейчас на выходе эмулятора будет:


pc0 0 1 0 1
pb7 0 0 1 1
---------------
out 1 2 0 2

То есть в некоторой степени это можно рассматривать как реализацию "гипотетического режима полтора битного DAC", хотя на реале этот режим мне кажется несколько надуманным - пищалка и магнитофон в общем случае в разных местах, как можно рассматривать суммарный звук с них?

- - - Добавлено - - -

P. S. Как говорится, поспешишь - людей насмешишь. Табличка выше - это как я хотел сделать. А на самом деле у меня сейчас просто выводится звук спикера. Сделаю еще одну сборку чуть позже.

NEO SPECTRUMAN
24.03.2021, 18:40
кажется несколько надуманным
до посредственно оно суммируется
потом ищо поэкспериментирую...

Pyk
25.03.2021, 14:31
В общем, все-таки все правильно в последней сборке, поправил ошибку в таблице только. Правильная:


pc0 0 1 0 1
pb7 0 0 1 1
---------------
out 1 2 0 2

ivagor
25.03.2021, 18:12
Посмотрел тесты (https://zx-pk.ru/threads/33071-povyshaem-kachestvo-emulyatsii-lvov-pk-01.html?p=1109932&viewfull=1#post1109932) DDp (b0000x), хорошо, но мало, и на мой взгляд не очень удобно. Предлагаю более технологичный подход с использованием "магнитофона" (тест (https://disk.yandex.ru/d/SBWTrzZx3JOPSw)). Загружаем (BLOAD"",R), стартуем запись и жмем клавишу. В wav последовательно запишутся резльтаты тестирования команд, которые параллельно будут печататься на экране. Для удобства и скорости тестируется минимум команд, остальные можно свести к этим. Если что забыл - готов дополнить или можно дополнить самому, исходник прилагается. Длительность пересчитываем в такты. Точность не такая уж и плохая, для примера (выгрузил wav из emu, там без торможения) несколько команд (без округления):
NOP - 4.0735; MOV A,A - 5.0704; SHLD - 16.1053; XTHL - 18.1473
Если будет wav с реала, то готов перевести в такты.

DDp
25.03.2021, 20:31
Предлагаю более технологичный подход с использованием "магнитофона" (тест).
WAV с реала по той же ссылке (https://drive.google.com/drive/folders/1Z4OyTyRLXM2-RfX9G7Ek00uS8Yu2SRAv?usp=sharing) (tstsp1_*)

ivagor
25.03.2021, 21:47
Спасибо, весьма познавательно, только пока не очень понятно. В такты перевел (https://disk.yandex.ru/d/nk2mIY0Z1Ybqmw), но мне кажется что их нельзя использовать точно в таком виде в любых условиях, скорее всего конкретная растактовка будет зависеть и от последнего цикла предыдущей команды. Один вопрос можно считать проясненным - торможение "в целом" однородное, нет такого, что на бордюре так, а в активной области иначе, это было бы слышно и видно по wav (так было у искры-1080).

ivagor
26.03.2021, 18:01
По картинкам DDp:
b00000: mov r,r\ out - 22-23 такта
b00001: 3*nop\ mov r,r\ out - 42 такта
b00002: 2*xthl\ nop\ mov r,r\ out - (66-71)? такт
b00003: lhld\ mov r,r\ out - 49-52 такта
Результаты неплохо согласуются с TSTSP1, кроме b00002, с ним что-то сильно не то (или я неправильно измерил, но почему тогда другие совпали?). Может все же картинка b00002.png от другого теста, не от b00002.asm?

Pyk
27.03.2021, 00:05
ivagor, мы с DDp уже тестировали выполнение некоторых команд, я делал на скорую руку несколько тестов, тоже с выводом на магнитофон.
В принципе, результаты похожи:
NOP; XRA A - 6,42
MOV R,R - 7,13
XTHL - 32,08
IN; OUT - 16,04
MOV A,M (RAM) - 11,45
MOV M,A (RAM) - 12,47
MOV A,M; MOV M,A (ROM) - 8,91

Если DDp не против, можно выложить ссылку на тесты.

Результаты, в принципе, совпадают, я только брал меньше команд, зато дополнительно тестировал MOV A,M и M,A с операндом в ПЗУ.

- - - Добавлено - - -

Сейчас в эмуляторе алгоритм такой: на каждый цикл обращения к ОЗУ добавляется 2,5 такта, к портам - 1 такт.

- - - Добавлено - - -

И еще: я пытался теоретически обосновать задержки при обращении к ОЗУ, учитывая циклы обращения видеоконтроллера к ОЗУ в 400 нс через каждые 800 нс и предполагая, что цикл обращения процессора может начаться в произвольный момент времени, а также минимальную длительность цикла процессора в 9/8 от цикла видеоадаптера. У меня получилось в среднем 2,25. Для более точного соответствия реалу цифру пришлось увеличить до 2,5 - видимо, сказываются влияния циклов друг на друга, а может быть и просто напутал в своих прикидках либо опирался на неверные исходные данные...

ivagor
27.03.2021, 08:17
Сейчас в эмуляторе алгоритм такой: на каждый цикл обращения к ОЗУ добавляется 2,5 такта, к портам - 1 такт.
Близко к тому, но я бы немного дополнил. Каждая запись в озу примерно +.75 такта. И для полного счастья влияние циклов друг на друга тоже желательно учитывать, при наличии 5 тактных циклов дополнительное торможение уменьшается.
Думаю над результатом b00002, но не могу объяснить.

- - - Добавлено - - -

В tstsp1 есть одна ошибка - RET/Y неправильно тестируется. К счастью дополнительный тест не нужен, растактовка RET/Y совпадает с CALL/N, т.к. и там и там три совпадающих цикла чтения (исходно 5+3+3).

DDp
27.03.2021, 10:43
Если DDp не против
Не понимаю, почему против. :v2_huh:


Думаю над результатом b00002, но не могу объяснить.

Может все же картинка b00002.png от другого теста, не от b00002.asm?
Стек указывает на ПЗУ ! :v2_dizzy_facepalm:
Переделал - b00002b (по той же ссылке (https://drive.google.com/drive/folders/1Z4OyTyRLXM2-RfX9G7Ek00uS8Yu2SRAv?usp=sharing))

---

Здесь был неправильный тест b00004, правильный b00005 смотри ниже, 28.03.2021.

ivagor
27.03.2021, 11:11
Переделал - b00002b
Другое дело, примерно 90 тактов.

Pyk
27.03.2021, 12:20
Вот тесты и результаты, которые мы получили с DDp еще в январе:
https://disk.yandex.ru/d/o1AQ9SpJfYcDVw

Насчет дополнительных 0,75 такта на запись, пожалуй, согласен. А вот насчет 5-тактных циклов не совсем понимаю. Откуда такое предположение? Тот же MOV A,A состоит из единственного 5-тактного цикла, но довольно хорошо ложится в модель, даже наоборот, нужно убирать лишние такты... Вообще, в тесте не так много инструкций с 5-тактными циклами попали...

Кроме искусственных тестов неплохо бы еще побольше примеров работы реальных программ, для которых можно было бы замерить скорость выполнения и сравнить с эмулятором...
Попробую +0.75 для записи и посмотрю результат на том, что уже есть.

ivagor
27.03.2021, 13:06
Тот же MOV A,A состоит из единственного 5-тактного цикла, но довольно хорошо ложится в модель, даже наоборот, нужно убирать лишние такты
Так я и написал "при наличии 5 тактных циклов дополнительное торможение уменьшается".

Насчет дополнительного торможения при записи наверно не стоит торопиться, оно наблюдается для некоторых команд (MOV A,M и MOV M,A, LDA по сравнению с STA, LHLD и SHLD), и его нет для других (POP против MVI M/INR M).


Кроме искусственных тестов неплохо бы еще побольше примеров работы реальных программ, для которых можно было бы замерить скорость выполнения и сравнить с эмулятором...
Это да. Или еще можно попробовать в качестве синтетического теста смеси команд.

DDp
27.03.2021, 15:40
...еще побольше примеров работы реальных программ, для которых можно было бы замерить скорость выполнения и сравнить с эмулятором...
pi из темы (https://zx-pk.ru/threads/25783-vychislenie-chisla-pi-na-assemblere.html)

ivagor
27.03.2021, 16:04
Или мандельброт (https://disk.yandex.ru/d/722hvyskwfAjNQ).
Измерить время работы можно или вручную секундомером или с помощью записи в wav. При старте напишет PRESS ANY KEY, жмем клавишу, в wav запишется клик. Когда все нарисует в wav запишется второй клик и можно будет измерить время между кликами. Из emu получилось 81.5 секунд.

DDp
27.03.2021, 16:29
мандельброт.
127.372 sec

ivagor
27.03.2021, 17:05
Получается для пи скорость реала примерно 67%, для мандельброта 64%. Вероятно в пи активнее используется dad.

Pyk
27.03.2021, 17:50
Mandel: Emu80 в текущем состоянии: 129,597 с (реал - 127,372)
Pi32 - 10,451 (реал - 10.274)
PiRk20 - 13,941 (реал - 13.542)

В общем, эмулятор пока работает чуть медленнее реала, видимо, после добавления тактов на запись нужно будет уменьшать такты на чтение

Pyk
27.03.2021, 22:49
Потестировал немного разные варианты, пока остановился на таком:
обращение к ОЗУ +2 1/3 такта, для записи дополнительно 3/4 такта
Мандельброт - 127,71 (+0,27%)
Pi32 - 10,155 (-1,16%)
Pirk20 - 13,705 (+1,21%)
Биперная музыка от NEO SPECTRUMAN и заставка DRILLER - около +1%

Может быть, стоит чуть уменьшить 2 1/3 примерно до 2,3 - нужно больше тестов...

ivagor
28.03.2021, 11:02
Если пока нет готовых других тестов, то можно попробовать синтетические смеси (https://disk.yandex.ru/d/KUa8VoCdwrog3w)

DDp
28.03.2021, 12:46
Разобрал корпус, ткнулся осциллографом
b00005 - последовательность команд XTHL/XRA/OUT. Синхронизация осцилла (третий шуп) от выходной ножки порта.
опять налажал: CAS неправильный

https://pic.maxiol.com/images2/1616923585.1546116662.b00005oscillogram.png

Подсказывайте, что/где ещё посмотреть.

- - - Добавлено - - -


синтетические смеси
tstsp2_result_96khz_8bit.wav.7z по ссылке (https://drive.google.com/drive/folders/1Z4OyTyRLXM2-RfX9G7Ek00uS8Yu2SRAv?usp=sharing)

ivagor
28.03.2021, 14:55
Результаты (https://disk.yandex.ru/d/7rjC3sK80QyMvg) тестирования смесей не такие уж плохие, в том смысле, что сложение результатов тестирования одиночных команд в основном дает довольно близкие результаты. Самое большое отклонение - NOP+MOV A,M, почти два такта. Еще NOP+NOP+MOV A,A - отклонение почти такт. Вместо LXI+POP лучше было что-то новенькое, т.к. фактически это аналог теста POP из tstsp1.

DDp, картинки очень уж мелкие. Например, мне хотелось бы разглядеть, в какой момент READY переходит из 0 в 1.

- - - Добавлено - - -

Исправил ссылку на результаты

DDp
28.03.2021, 15:46
Результаты
Вот, вам комментарии на предыдущие результаты - ссылка (http://pc01.lviv.ua/forum/viewtopic.php?p=5207#p5207) :v2_finge:



картинки очень уж мелкие. Например, мне хотелось бы разглядеть, в какой момент READY переходит из 0 в 1.
В какой команде на каком такте/цикле? Это поможет понять торможение во Львове??? :v2_dry:

ivagor
28.03.2021, 16:09
В какой команде на каком такте/цикле? Это поможет понять торможение во Львове???
Надеюсь, что момент перехода READY 0->1 всегда одинаковый относительно границ слота доступа CPU к ОЗУ (в конце слота или за 50 нс до окончания, или за 100 нс или где-то еще). Поэтому в принципе должно быть без разницы, какую команду смотреть. Но для простоты лучше посмотреть на примере NOP или MOV A,A (или их аналогов, т.е. 4 или 5 тактных команд). Еще хорошо бы увидеть запись, лучше тоже на простом примере типа MOV M,A.
Без этого вряд ли возможно точно понять львовское торможение, по крайней мере у меня не получается.

DDp
28.03.2021, 23:41
чтение NOP
https://pic.maxiol.com/images2/1616963808.1546116662.nop.png



запись MOV M,A
https://pic.maxiol.com/images2/1616963945.1546116662.movma.png

ivagor
30.03.2021, 09:10
Похоже получилось разобраться по крайней мере с чтением. Расписал NOP; MOV A,A и MOV A,M и точные растактовки установившихся циклов из одинаковых команд:
NOP - 6.4
MOV A,A - 7.(1)
MOV A,M - 11.(428571)
Если возникнет вопрос, почему везде чуть меньше, чем в tstsp1, то дело в накладных расходах на организацию цикла (оценить их величину можно по результатам (https://zx-pk.ru/threads/33071-povyshaem-kachestvo-emulyatsii-lvov-pk-01.html?p=1110225&viewfull=1#post1110225) при отсутствии торможения). Совсем без накладных расходов на цикл можно при наличии таймера, но это уже другая история. Очевидно можно уменьшить погрешность, вносимую командами организации цикла, если увеличить число команд в одном прогоне. Теперь надо бы и запись попробовать расписать (отмечу, что вручную весьма неудобно).

ivagor
30.03.2021, 19:03
Посчитал для последовательности MOV M,A - 12.(4) такта. Все это познавательно, но малоприменимо в эмуляторе, там желательно какие-нибудь сравнительно простые и похожие на правду правила расчета. В принципе сейчас уже точность эмулятора весьма хорошая.

Pyk
30.03.2021, 19:06
Если кто-то не понял, 11.(428571) - это 11 3/7

ivagor
30.03.2021, 20:09
Пока не уверен насчет всех команд, но последовательности 4 попробованных после переходного процесса вышли на циклы: 32/5=6.4; 64/9=7.(1); 80/7=11.(428571); 112/9=12.(4). Числитель - длительность цикла в тактах проца, знаменатель - сколько соответствующих команд там помещается. Теоретически можно попробовать так считать любые команды и их сочетания, но по хорошему вероятно надо писать какую-то программку, вручную много не насчитаешь.

Pyk
01.04.2021, 23:43
DDp, можешь записать аудио с реальных заставок каких-нибудь игр, которые воспроизводят какой-нибудь звук?
Посмотрел, навскидку: тот же driller, ball.lvt, на бейсике bura.lvt, может быть, еще что-то...

ivagor
02.04.2021, 18:19
Примеры (https://zx-pk.ru/threads/21929-bipernaya-muzyka.html?p=1111353&viewfull=1#post1111353) обновленного MusicStudio тоже можно использовать для замеров скорости. После загрузки ждут нажатия клавиши, после однократного проигрывания стоп.

Pyk
02.04.2021, 22:03
Согласен, неплохо бы и пример из MusicStudio записать...

ivagor
03.04.2021, 09:05
И/или еще можно эксолоновское бипание (https://zx-pk.ru/threads/21929-bipernaya-muzyka.html?p=1111429&viewfull=1#post1111429) потестировать.

DDp
03.04.2021, 09:48
аудио с реальных заставок каких-нибудь игр, которые воспроизводят какой-нибудь звук
Выложил по той же ссылке (https://drive.google.com/drive/folders/1Z4OyTyRLXM2-RfX9G7Ek00uS8Yu2SRAv?usp=sharing) подпапка music2_16bit (качественнее) или music2_8bit (меньше, раз в 10).

Pyk
03.04.2021, 10:04
DDp, спасибо, проанализирую чуть позже.
Я бы все-таки наверное попробовал еще что-нибудь бейсиковское. В двоичных играх скорее всего применяются похожие пустые циклы для задержек, а вот в случае бейсика картина может, я думаю, отличаться...

ivagor
03.04.2021, 11:03
Я бы все-таки наверное попробовал еще что-нибудь бейсиковское.
Чтобы проверить скорость при выполнении из пзу? Вернее на смеси пзу+озу, т.к. звук из пзу, а часть бейсика и данные все равно в озу.

Pyk
03.04.2021, 12:25
ivagor, в целом да - проверить скорость на выполнении реальных бейсиковских программ...
Лучше, конечно, не чисто звук, а с какой-нибудь отрисовкой, и т.п., навскидку bura попалась, ее и предложил, может быть, что-то и более подходящее есть...
Подозреваю, что из-за большого процента кода в ПЗУ расхождение будет небольшое, но тем не менее - почему бы не посмотреть, ни разу еще бейсик не проверяли...

DDp
03.04.2021, 13:05
еще что-нибудь бейсиковское
подпапка music3 (https://drive.google.com/drive/folders/1Z4OyTyRLXM2-RfX9G7Ek00uS8Yu2SRAv?usp=sharing)

Pyk
04.04.2021, 17:53
Попытался проанализировать.

Каждый тест я прогнал на эмуляторе с тремя параметрами, на основе трех результатов посчитал относительное количество обращений на чтение и запись в ОЗУ, что позволило получить прогноз быстродействия эмулятора с другими заданными параметрами в рамках этой модели.

В общем, если менять справа вверху количество доп. тактов при обращении к ОЗУ и еще доп. при записи, то можно посмотреть, как будет меняться скорость на разных тестах.
Справа я привел скорости для некоторых комбинаций - для использующегося в последней версии 2.5/0, последнего, на котором я остановился, 2.333/0.75 и некоторых других. Пока вроде бы оптимальным вариантом вижу 2.25/0.75.
В качестве overall-итога я взял среднеквадратические из нескольких различных тестов, отбросив сомнительные и похожие (выделено синим).

К сожалению, я пока не сделал в эмуляторе сохранение выводимого звука в wav, так что на изменения могли накладываться погрешности из-за каких-то фоновых процессов и т.п. Сомнительные результаты выделил красным.

В общем, как-то так. Может быть, наведет на какие-то мысли...

ivagor
04.04.2021, 18:52
Главный момент - общий критерий в подобных случаях не задают как просто сумму, а то так можно получить и нулевое суммарное отклонение за счет сильного перекоса отдельных значений. Возможны варианты, например сумма модулей (тогда оптимальные значения 2.338 и 0.793) или сумма квадратов (2.277 и 0.745).

- - - Добавлено - - -

Для полноты картины. При исходном критерии (просто сумма) оптимальные значения 2.269 и 0.756

Pyk
04.04.2021, 19:02
ivagor, согласен, поменял на среднеквадратическое отклонение, обновил аттач.
Оптимальное значение получается в районе 2,27-2,28...

Pyk
04.04.2021, 21:21
Поскольку мне удобнее оперировать рациональными числами, попробую, пожалуй, значения 16/7 (2.286) и 3/4...

ivagor
05.04.2021, 06:19
Прощу прощения за занудность, но т.к. в данном случае важно не само значение, а достижение его минимума, то корень можно не извлекать (и оптимум будет совпадать с вышеозвученным {2.277 и 0.745}). С другой стороны корень не мешает находить правильное значение.
Для аппроксимации с двумя параметрами получилось довольно хорошо, а для дальнейшего повышения точности можно перейти к большему числу параметров, например индивидуально назначить задержку каждому типу цикла (чтение 3/4/5, запись 3/5). Следующий шаг - назначение разных задержек комбинациям циклов. Тут конечно интересный вопрос - насколько сложная аппроксимация на основе статистики достигнет точности эмуляции на базе моделирования, но это вопрос скорее теоретический.

Pyk
05.04.2021, 15:41
ivagor, согласен, корень не обязателен, но пусть будет хотя бы ради одного порядка цифр.
В принципе, можно было и просто сумму оставить, но тогда нужно уже стремиться не к минимуму, а к нулю - если положительные и отрицательные отклонения будут встречаться одинаково часто, в сумме получится 0, что нам и нужно. Но наверное так, как сейчас, все же правильнее...

Насчет дальнейшего повышения точности - идею понял, но не уверен, что готов сейчас этим заниматься, тем более, что в актуальном состоянии эмулятора с этим не получится поэкспериментировать, нужно дорабатывать...

А вот попробовать автоматизировать расчет устоявшихся циклов было бы интересно (может быть в перспективе и в эмуляторе удалось бы реализовать). Можешь немного пояснить ход рассуждений, чтобы выйти на те значения на основе осциллограмм DDp?

ivagor
05.04.2021, 16:10
Можешь немного пояснить ход рассуждений, чтобы выйти на те значения на основе осциллограмм DDp?
Могу, но сначала хочу еще посчитать команды, вдруг окажется, что найденные "правила" не совсем универсальны и их нужно откорректировать.


не уверен, что готов сейчас этим заниматься
Текущий вариант в эмуляторе очень хорошо соответствует среднему по больнице, т.е. обеспечивает очень близкую среднюю скорость, да и бипер вполне хорош. Расхождения будут там, где нужна локальная точность с учетом чтения видео, например при эмуляции визуальных тестов DDp или tstsp1/2. Можно наверно сказать, что эмуляция классических программ доведена до хорошего уровня, проблема только с новодельной экзотикой.

NEO SPECTRUMAN
03.05.2021, 06:02
Скрипит. Мигает. https://drive.google.com/drive/folde...Av?usp=sharing
ВНЕЗАПНО
если присмотретсо
видно что палитровый "мультиколор" получается с точностью до 4-х пикселей
а сами палитровые "знакоместа" 4х1 смещены относительно пиксельных "знакомест" на один пиксель
https://i.postimg.cc/bJ44Mqxp/Resultff.png
конечно может быть это изза ВНЕЗАПНОЙ кратности кода пищалки
а может так и есть

потом запилю какой нить тест

или можете запилить его сами и без меня
нужно нарисовать на экране шахматку
1111000011110000
1111000011110000
1111000011110000
1111000011110000
0000111100001111
0000111100001111
0000111100001111
0000111100001111

и гадить в поллитру с переменной скоростью (чтоб цикл плавал с шагом 1 такт туда сюда)

записать все на видео или несколько раз отскриншоить
а дальше можно усреднить жменю картинок
и посмотреть на границы палитровых "знакомест"

еще нужно проверить не смещается ли палитровые "знакоместа" при включении питания

нужно выключать БП нахрен включать
и записать подобный тест раза 4

а вот усрреденный B0000x от DDp
с той же точностью и тем же смещением
https://i.postimg.cc/NfxByr8X/Result.png

- - - Добавлено - - -

так же продублирую псто с львов форума и тут


В такты перевел, но мне кажется что их нельзя использовать точно в таком виде в любых условиях, скорее всего конкретная растактовка будет зависеть и от последнего цикла предыдущей команды.
но во первых ты doing it wrong полностью и целиком
и таким тестом ничего толком не определишь
да и сильно ты округлил не к месту

а во вторых цифры тоже интересные
https://i.postimg.cc/9f5KhK7M/lvov.png

мы видим сколько команд влезет в круглое число тактов

но тут мы вспоминаем про мерзкий ГФ24 с его никому ненужным делением на 9
который как всегда все нам портит




у нас есть 5 mhz video и возможно оно же частота ram
1--------2--------3--------4--------1--------2--------3--------4--------
часть тактов жрет чтение видео (не уверен когда именно)
=========2--------3--------4--------=========2--------3--------4--------

а тут у нас cpu работающий практически не синхронно
1---2---3---4---5---6---7---8---9---1---2---3---4---5---6---7---8---9---

а вот как то так наверно 2 nop-а будут выполнятся за 13 тактов в среднем
=========2--------3--------4--------=========2--------3--------4--------
wwwwwwww1111------------wwww1111------------wwwwwwww
1---2---3---4---5---6---7---8---9---10--11--12--13--


не нужны принимать за чистую правду
ибо я не все раздуплил на схеме
и не понел полностью и точно
...точнее тут я сильно прозевал и сделал все на оборот


но все ras cas-ы тактируются от кварца деленного на 2\4\8
когда проц на свой волне с частотой кварца деленной на 9

тоесть эмулятор должен плясать не от частоты проца
а от частоты проца*4 *8
нужно жестко втыкать в времянки...
...ну и писать чисто Львов эмулятор с нуля
а не считать получетверти тактов и мерять время пищание (которое на записях с разных звуковух уже +-1,5% плавает)...
и вообще времянки меряются мультиколорами и логическими анализаторами
мерянием длины пищания много ненамеряишь...

ну и вангую что эффективная частота проца дето в районе 1666666,6 из 2222222.2

- - - Добавлено - - -

и тут обращаем внимание на точное выравнивание всех out-ов по границам 4х1 пикселей
и это в то время как проц и видео живут совершенно на некратных частотах
может в эмуляции можно вообще плясать от частоты видео?
покрайней мере в то время когда "луч" над экраном

там вообще случаем не получается выравнивание до 9 тактов над экраном?


вот поправил и переосмыслил (расположение чтения относительно chars-ов условное!)


2nop = 13t
12345678123456781234567812345678123456781234567812 34567812345678123456781234567812345678123456781234 56781234567812345678123456781234 20MHz
1---------------2---------------3---------------4---------------1---------------2---------------3---------------4---------------1--- 1,25MHz chars
1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1--- 5MHz pixels
--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx---- chars reading
x x x x cpu can read
111111111---------------------------111111111---------------------------wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwww
1--------2--------3--------4--------5--------6--------7--------8--------9--------10-------11-------12-------13-------1--------2------ 2,2MHz Cpu


ld a,a ~ 7t
12345678123456781234567812345678123456781234567812 34567812345678123456781234567812345678123456781234 56781234567812345678123456781234 20MHz
1---------------2---------------3---------------4---------------1---------------2---------------3---------------4---------------1--- 1,25MHz chars
1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1--- 5MHz pixels
------------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx--------xxxxxxxx chars reading
x x x x cpu can read
111111111------------------------------------wwwwwwwwwwwwwwwwwwwwwwwwwww111111111------------------------------------wwwwwwwwwwwwwwww
1--------2--------3--------4--------5--------6--------7--------8--------9--------10-------11-------12-------13-------1--------2------ 2,2MHz Cpu


сколько длится чтение видео памяти нужно уточнить

или так

2nop = 13t
12345678123456781234567812345678123456781234567812 34567812345678123456781234567812345678123456781234 56781234567812345678123456781234 20MHz
1---------------2---------------3---------------4---------------1---------------2---------------3---------------4---------------1--- 1,25MHz chars
1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1--- 5MHz pixels
------------xx--------------xx--------------xx--------------xx--------------xx--------------xx--------------xx--------------xx------ chars reading
x x x x cpu can read
111111111---------------------------111111111---------------------------wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwww
1--------2--------3--------4--------5--------6--------7--------8--------9--------10-------11-------12-------13-------1--------2------ 2,2MHz Cpu


ld a,a ~ 7t
12345678123456781234567812345678123456781234567812 34567812345678123456781234567812345678123456781234 56781234567812345678123456781234 20MHz
1---------------2---------------3---------------4---------------1---------------2---------------3---------------4---------------1--- 1,25MHz chars
1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1---2---3---4---5---6---7---8---1--- 5MHz pixels
------------xx--------------xx--------------xx--------------xx--------------xx--------------xx--------------xx--------------xx------ chars reading
x x x x cpu can read
111111111------------------------------------wwwwwwwwwwwwwwwwwwwwwwwwwww111111111------------------------------------wwwwwwwwwwwwwwww
1--------2--------3--------4--------5--------6--------7--------8--------9--------10-------11-------12-------13-------1--------2------ 2,2MHz Cpu

тк там 1/8 времени клащается video\cpu на d50 или около того?