Вход

Просмотр полной версии : ZXMAK2 - Виртуальная машина ZX Spectrum



Страницы : 1 2 3 4 5 6 [7] 8 9

goodboy
05.02.2015, 20:03
что делать если в памяти вовсе не бейсик программа, или программа немного покуроченная протектором
рассматривать область между переменными (progs) и (vars) ?
только кто будет переводить в текст токены ?

Arigato
05.02.2015, 20:14
шифты и кнопки можно настроить в Keyboard.Mdx.config, а вот с несколькими кнопками на одну спектрумовскую, это действительно сейчас не получится, нужно будет мэппинг доработать
Идея такая:

<Key Name="CapsShift" Value="LeftShift RightShift" />
или
<Key Name="CapsShift" Value1="LeftShift" Value2="RightShift" />

То есть Name содержит описание спектрумкой кнопки (или комбинации), а Value содержит название кнопки на клавиатуре.


это можно и не в дебаггер, только вопрос что делать если в памяти вовсе не бейсик программа, или программа немного покуроченная протектором
Если программа нормальная - копировать (или сохранять в .txt) нормальную программу, в противном случае как получится. Управляющие символы (цвета и прочее) просто исключить, оставив текст.


только кто будет переводить в текст токены ?
Автоматически и переводить по таблице. Там ведь их совсем не много, не проблема массив преобразования задать.

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

Eltaron
05.02.2015, 20:27
Я писал примитивный плагин для просмотра бейсик-программ http://zx-pk.ru/showpost.php?p=550932&postcount=642
Добавляется как отладчик. Только два года прошло, он уже не запускается, наверное - архитектура эмуля помнялась. Сам проверить пока не могу.

Arigato
05.02.2015, 23:02
В общем, проблему копирования программы на Бейсики решил отдельной утилитой. Кому надо, она тут: http://zx-pk.ru/showthread.php?p=779873

Остальные вопросы остаются в силе.

ZXMAK
07.02.2015, 00:20
Идея такая:

<Key Name="CapsShift" Value="LeftShift RightShift" />
или
<Key Name="CapsShift" Value1="LeftShift" Value2="RightShift" />

То есть Name содержит описание спектрумкой кнопки (или комбинации), а Value содержит название кнопки на клавиатуре.


проблема в том что не у всех спектрумов есть CapsShift :smile:
В конфигурации задаются просто имена реальных кнопок клавиатуры PC, но независимые от платформы, а в качестве значения указаны кнопки как они называются на конкретной платформе.
Эмулятор понятия не имеет что такое CapsShift, т.к. на клавиатуре PC такой кнопки нету.
Про эту кнопку знает только конкретный девайс клавиатуры.

ZXMAK
07.02.2015, 03:02
Сделал тестовый рендерер на SlimDX, просьба проверить как себя ведет на разных машинах.
При запуске в окне должны плавно и попиксельно двигаться вверх разноцветные квадраты.
Для теста нужно поресайзить окно, посворачивать его, залочить/разлочить комп (Win+L) чтобы программа потеряла видеокарту ну и т.д.

Смотреть нужно - не вылезет ли ошибка и не остановится ли движение квадратов :)
Заодно просьба указать что за комп/система и насколько плавно плывут квадраты :)

К сожалению саму длл-ку SlimDX.dll приаттачить не могу, она в архиве занимает 800 килобайт - форум такой размер не пускает, но ее можно установить с официального сайта, отсюда: http://slimdx.org/download.php
Нужна версия которая .NET 4 / x86

[bETA]mEN
07.02.2015, 13:12
Для теста нужно поресайзить окно, посворачивать его, залочить/разлочить комп (Win+L) чтобы программа потеряла видеокарту ну и т.д.
полёт нормальный
Win 7 x64
http://i.imgur.com/ZCH375B.png
http://i.imgur.com/q1azRcE.gif

Alex Rider
07.02.2015, 13:33
Core i7-3820, Win7 x64, GF FTX 760 - Ok

zebest
07.02.2015, 21:17
При запуске в окне должны плавно и попиксельно двигаться вверх разноцветные квадраты.
двигаются. Часов 12 ужо как. Одна странность - на разных мониторах - разная скорость движения. В 10-ток раз. оба 60 Гц. Нормально?

ZXMAK
08.02.2015, 00:09
двигаются. Часов 12 ужо как. Одна странность - на разных мониторах - разная скорость движения. В 10-ток раз. оба 60 Гц. Нормально?

если скорость разная то подозрительно, возможно где-то баг.
Если ресайз делал, то вероятно из-за неправильного разрешения

ZXMAK
08.02.2015, 08:27
Просьба затестить эмулятор с новым алгоритмом для Direct3D рендерера.
Тестовую версию выложил тут: https://zxmak2.codeplex.com/releases/view/611440

Новый алгоритм юзает Direct3D в довольно жестком многопоточном режиме, поэтому нужно проверить как это будет работать на разных машинах.
В этой версии рендерер видео, рендерер аудио, эмуляция и UI - все живут в своих отдельных и независимых параллельных потоках :)
За счет этого стабильность видео вышла на новый уровень, сейчас сбои синхронизации возникают только когда происходит сброс direct3d (при ресайзе окна или потере видеокарты).
Реализация еще полностью не завершена, могут быть баги :)

Что нужно потестить - нормально ли работает (нет ли задержек и т.п.), как ведет себя при ресайзе, сворачивании окна, при блокировке экрана.

ZXMAK
08.02.2015, 11:31
Size 400% не лочиЦЦа. Так задумано?

Что означает фраза "не лочицца"?

Кстати, очень интересно как на твоей особенной машине эта версия себя ведет?

PS: Релиз вроде стабильный получился, погонял - очень хорошо и плавно работает, нужно подчистить код и можно к видеофильтрам переходить. Для начала думаю неплохо будет blur, black-n-white, emboss и contrast :biggrin:

zebest
08.02.2015, 11:40
то и значит. галочку ставлю, мЫшкой дергаю, не размер,просто за окно, сразу меняет размер, ну и галка возле 400% пропадает, как при ресайзе..
с 300% такого фокуса нет.
http://savepic.net/6387917.jpg
upd
с 1472х1216 сразу меняет на 1472х1002. само.

ZXMAK
08.02.2015, 11:53
то и значит. галочку ставлю, мЫшкой дергаю, не размер,просто за окно, сразу меняет размер, ну и галка возле 400% пропадает, как при ресайзе..
с 300% такого фокуса нет.
http://savepic.net/6387917.jpg
upd
с 1472х1216 сразу меняет на 1472х1002. само.

Хм, видимо баг с вычислением размеров, я правильно тебя понял, что при 400% размер окна сам уменьшается при движении мышью над окном?

Можешь еще снять скриншот с гафиком при синхронизации от времени? и скриншот от видео, но с нормальным размером окна.Чтото у тебя нестабильно vblank ловит. Это только при большом окне?

Titus
08.02.2015, 14:16
Просьба затестить эмулятор с новым алгоритмом для Direct3D рендерера.

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

ZXMAK
08.02.2015, 20:12
блин, ну как бы на пальцах то объяснить. Если мы выставляем 100, 200, 300 % и двигаем само окно по экрану - то размер окна не должен менятся. Так и есть. Кроме случая с 400%
http://savepic.net/6384844.jpg
слева - по времени, справа - по видео.

Слева вроде нормально, только смущают вот эти два пика, ты в это время по менюшке view не нажимал? Может ресайз делал или сброс?
А справа это с включеным фильтром noflick? Если да, то все ок :)

---------- Post added at 19:12 ---------- Previous post was at 19:02 ----------


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

Управлять приоритетом процесса, сам процесс не должен. Это параметр, которым должен управлять юзер. К тому-же во многих случаях у юзера может не быть привелегии на изменение приоритета, тогда процесс не сможет его изменить.
ZXMAK2 задает только относительные приоритеты своим потокам внутри процесса и в управление приоритетами системы не вмешивается, система лучше знает как ей распределить приоритеты. Эмулятор только подсказывает ей какой из его потоков более важный, а какой менее важный.

Titus
08.02.2015, 21:42
ZXMAK2 задает только относительные приоритеты своим потокам внутри процесса и в управление приоритетами системы не вмешивается, система лучше знает как ей распределить приоритеты. Эмулятор только подсказывает ей какой из его потоков более важный, а какой менее важный.

В том-то и дело, что она них хрена не знает)
Эмуляторы - это класс задач реального времени. Без повышения себе приоритета (не до RealTime, пускай, но хотя бы до High Priority), никак не возвыситься над другими нереалтайм задачами - браузерами и всякой другой офисноподобной, но жрущей время фигней.

zebest
08.02.2015, 22:12
А справа это с включеным фильтром noflick? Если да, то все ок
Нет. Как раз с выключенным. Это два эмуля одновременно запущены были, кстати графики загрузки все время прыгают вверх\вниз

ZXMAK
08.02.2015, 23:05
В том-то и дело, что она них хрена не знает)
Эмуляторы - это класс задач реального времени. Без повышения себе приоритета (не до RealTime, пускай, но хотя бы до High Priority), никак не возвыситься над другими нереалтайм задачами - браузерами и всякой другой офисноподобной, но жрущей время фигней.

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

Для управления приоритетами внутри процесса система предоставляет относительные приоритеты потоков. Однако я бы с осторожностью и к этим приоритетам относился. Как правило планировщик задач достаточно умен, чтобы правильно распределить время.
Поэтому ZXMAK2 использует управление приоритетами по минимуму - подсказывает планировщику что у этого потока приоритет лучше ставить чуть выше, а у этого чуть ниже, и не более.
Мои многочисленные тесты, только подтверждают это - любая попытка вмешательства в приоритеты приводит к нежелательным негативным эффектам. Приложение хорошо работает, только если не вмешивается в приоритеты потоков, не говоря уж о приоритетах процессов в системе.

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

Titus
08.02.2015, 23:19
Если ты так щепетилен в этом ворпосе, то дай хотя бы юзеру методологию управлять этим приоритетом через твой эмуль (если ему приспичит). Чтобы юзер каждый раз не лазил в настройки процесса. Т.е. если юзер специально не хочет иной приоритет, ты его и не трогай. А если в конфиге все же юзер прописал иной, то имеет право.

А мой опыт тестирования эмуляторов показал, что управление приоритетом прекрасно везде работает. Ни один из пользователей EmuStudio, во всяком случае, никогда не говорил о проблемах с этим.

ZXMAK
08.02.2015, 23:25
А мой опыт тестирования эмуляторов показал, что управление приоритетом прекрасно везде работает. Ни один из пользователей EmuStudio, во всяком случае, никогда не говорил о проблемах с этим.

в старых системах любой процесс может выполнить операцию требующую административных привелегий. В новых это не работает (случаи когда юзер отключает UAC и дает всем процессам админские права, открывая дорогу вирусам не рассматриваем). Я ориентируюсь на новые, поэтому ZXMAK2 сам приоритетами не управляет и поэтому не требует административных прав для запуска :)
Более того, особой разницы между realtime приоритетом и нормальным я вообще не вижу. Если алгоритм хорошо спроектирован, он будет хорошо работать с любым приоритетом. Кроме того, сам подумай что будет если все процессы будут сами себе ставить realtime приоритет?

Titus
08.02.2015, 23:32
в старых системах любой процесс может выполнить операцию требующую административных привелегий. В новых это не работает (случаи когда юзер отключает UAC и дает всем процессам админские права, открывая дорогу вирусам не рассматриваем). Я ориентируюсь на новые, поэтому ZXMAK2 сам приоритетами не управляет и поэтому не требует административных прав для запуска :)

На сколько я понимаю, и в 7 и в 8 если ты не админ, процесс может поставить себе приоритет любой, кроме RealTime.

---------- Post added at 23:30 ---------- Previous post was at 23:28 ----------


Более того, особой разницы между realtime приоритетом и нормальным я вообще не вижу. Если алгоритм хорошо спроектирован, он будет хорошо работать с любым приоритетом.

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

---------- Post added at 23:32 ---------- Previous post was at 23:30 ----------


Кроме того, сам подумай что будет если все процессы будут сами себе ставить realtime приоритет?

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

ZXMAK
08.02.2015, 23:37
Как не проектируй, но у тебя есть 20 миллисекунд на эмуляцию кадра, рендер видео, вывод этого всего и прочее. Если любой другой процесс жирно забрал время в эти 20мс, то как не проектируй, эмулятор тормознет.

процесс который сам себе ставит приоритет - это на мой взгляд однозначный *****код, например если увижу что какой-то процесс требует приоритет выше нормального, пользоваться таким процессом не буду и удалю его :smile:
Эмулятор не сможет хорошо работать имея realtime приоритет. Этим он отбирает время у процессов которые могут лочить ресурсы. И если у них приоритет будет ниже чем у эмулятора, то эмулятор имея высокий приоритет будет жрать процессор вхолостую, т.к. всеравно будет ждать освобождения ресурсов, но ресурсы будут освобождаться медленно, т.к. эмулятор как собака на сене - сидит на процессоре, но ни сам не может его эффективно использовать, ни другим не дает чтобы быстрее освободить ресурсы :wink:

Поэтому даже не вижу смысла делать галочку "собака на сене" :biggrin:

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

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

Titus
08.02.2015, 23:44
процесс который сам себе ставит приоритет - это на мой взгляд однозначный *****код, например если увижу что какой-то процесс требует приоритет выше нормального, пользоваться таким процессом не буду и удалю его :smile:
Эмулятор не сможет хорошо работать имея realtime приоритет. Этим он отбирает время у процессов которые могут лочить ресурсы. И если у них приоритет будет ниже чем у эмулятора, то эмулятор имея высокий приоритет будет жрать процессор вхолостую, т.к. всеравно будет ждать освобождения ресурсов, но ресурсы будут освобождаться медленно, т.к. эмулятор как собака на сене - сидит на процессоре, но ни сам не может его эффективно использовать, ни другим не дает чтобы быстрее освободить ресурсы :wink:

Поэтому даже не вижу смысла делать галочку "работать как собака на сене" :biggrin:

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

Это твои идеалогические заморочки, практика показывает, что это не так)

Во первых, я не говорил про realtime приоритет, а про high приоритет, он на один ниже и ничего не лочит. Но даже в realtime все работает идеально, если грамотно спроектирован эмулятор. Нигде он не сидит в холостую и ничего не жрет. Как только выполнил все, что надо, отдал время другим процессам.

Значит тебе пока что не удалось) Как удастся, поделись опытом, может и я откажусь от высокого приоритета)

ZXMAK
08.02.2015, 23:50
Это твои идеалогические заморочки, практика показывает, что это не так)

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

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

Titus
08.02.2015, 23:55
Поэтому для оптимизации нужно думать не как украсть у системы лишний квант времени, а как снизить требования к необходимому времени.

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

ZXMAK
09.02.2015, 00:08
Никак не снизить, т.к. есть необходимые затраты на эмуляцию, рендер экрана, звука и прочего. Винда не система реального времени, если ей немножко в этом не помочь. Обьяснив, что здесь выполняй, а здесь выполняй, но не сейчас.

ты не понимаешь простую вещь, windows - это не система, где один процесс может захватить все ресурсы и монопольно использовать их.
Система шарит ресурсы между всеми процессами в равной степени.

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

Windows не настолько умна, чтобы рулить приоритетами, в зависимости от локов на ресурсах. Поэтому твой вызов просто уйдет на прожигание времени в холостом цикле, в ожидании пока не закончится вызов другого процесса, у которого ты украл время. Однако он не закончится до тех пор, пока ему не предоставят время. А твой процесс его не предоставляет, т.к. поставил себе риалтайм приоритет.

По итогу все могло бы закончится просто дедлоком. Однако планировщик системы знает что есть такие глупые процессы, которые могут себе без реальной нужды красть процессорное время. Поэтому он иногда не смотрит на приоритет и всеравно дает немного времени низкоприоритетному процесу. Благодаря этому, рано или поздно, но всетаки тот процесс снимет лок с видеокарты и твой процесс сможет получить к ней доступ. Однако произойдет это гооораздо позже, чем если бы у твоего процесса был нормальный приоритет :wink:

Так что высокий приоритет преимуществ не дает, а наоборот, при неразумном использовании может привести к тому что все будет наглухо висесть.

Titus
09.02.2015, 00:12
ты не понимаешь простую вещь, windows - это не система, где один процесс может захватить все ресурсы и монопольно использовать их.
Система шарит ресурсы между всеми процессами в равной степени.

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

...

Так что высокий приоритет преимуществ не дает, а наоборот, при неразумном использовании может привести к тому что все будет наглухо висесть.

Мой процесс не может вмешаться, если система не даст ему квант времени. И украсть у драйвера ничего не может тоже, и обратиться в обход системы к видеокарте тоже.

Ты можешь рассказывать чего угодно - от некошерности руления приоритетами в среде винды до чего-то еще, но только не то, что это не дает преимуществ или завешивает систему, потому что я 10 ЛЕТ пользуюсь подобной базой в эмуляторе, а это достаточная практика для собирания багов)

ZXMAK
09.02.2015, 00:20
Мой процесс не может вмешаться, если система не даст ему квант времени. И украсть у драйвера ничего не может тоже, и обратиться в обход системы к видеокарте тоже.

Ты можешь рассказывать чего угодно - от некошерности руления приоритетами в среде винды до чего-то еще, но только не то, что это не дает преимуществ или завешивает систему, потому что я 10 ЛЕТ пользуюсь подобной базой в эмуляторе, а это достаточная практика для собирания багов)

видеокарта может быть захвачена кем угодно, в том числе и самой системой, это никак не зависит от приоритета. Процесс с любым приоритетом, даже Low, может сделать вызов драйверу видеокарты и пока вызов не завершится это залочит видеокарту даже для самых мажорных процессов с realtime приоритетом. Мажорные процессы ничего не смогут с этим сделать, у них будет процессорное время, но они будут его жечь вхолостую ожидая пока не завершится вызов к драйверу, сделаный каким-то процессом у которого какой-то жалкий Low приоритет. А он быстро не завершится, т.к. какой-то шибко умный процесс решил оттяпать себе времени по максимуму.

Чтобы решить эту проблему, нужно не красть у системы время, повышая приоритет, а наоборот - давать системе как можно больше времени, чтобы блокировки установленные другими процессами снялись как можно быстрее :wink:

Кроме видеокарты в системе полно таких ресурсов - звуковая карта, диск, память и т.п.

Titus
09.02.2015, 00:24
видеокарта может быть захвачена кем угодно, это никак не зависит от приоритета. Процесс с любым приоритетом, даже Low, может сделать вызов драйверу видеокарты и пока вызов не завершится это залочит видеокарту даже для самых мажорных процессов с realtime приоритетом. Мажорные процессы ничего не смогут с этим сделать, у них будет процессорное время, но они будут его жечь вхолостую ожидая пока не завершится вызов к драйверу, сделаный каким-то процессом у которого какой-то жалкий Low приоритет.

Чтобы решить эту проблему, нужно не красть у системы время, повышая приоритет, а наоборот - давать системе как можно больше времени, чтобы блокировки установленные другими процессами снялись как можно быстрее :wink:

Какие ты можешь назвать 'мажорные' процессы, которым доступ к видюхе важнее, чем эмулятору?

Разумеется, системе надо отдавать все свободное от эмулятора время, только это в среде равных приоритетов не обеспечит реалтаймовости.

---------- Post added at 00:24 ---------- Previous post was at 00:22 ----------



Кроме видеокарты в системе полно таких ресурсов - звуковая карта, диск, память и т.п.

Звуковая карта (программный мишкер, отправляющий смикшированный фрагмент звуковухе) работает не зависимо от приоритетов процессов.

ZXMAK
09.02.2015, 00:33
Какие ты можешь назвать 'мажорные' процессы, которым доступ к видюхе важнее, чем эмулятору?

Разумеется, системе надо отдавать все свободное от эмулятора время, только это в среде равных приоритетов не обеспечит реалтаймовости.

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

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

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

Titus
09.02.2015, 00:46
Похоже, каждый из нас останется при своем мнении)

Я для себя выбор сделал, и иных альтернатив максимальной реалтаймовости эмулятора никто предложить не может, и ты в том числе. Если будет что предложить (на практике), а не в предположительной теории - я всегда за такое рассмотрение)

ZXMAK
09.02.2015, 00:49
Вот для примера:


Real-time priority is really dangerous. It's higher priority than nearly everything else. It's higher priority than mouse input, keyboard input, and the disk cache. If you foolishly set the priority class of a CPU-intensive program to real-time, it will suck up your entire processor, leaving no cycles for anything else.

In particular, since not even input runs at real-time priority, you can't stop it via any interactive means, because the thread that manages input can't even run to process your input.

Mind you, even if the input thread did run at real-time priority, that wouldn't really help you any. Sure, it could receive your input and distribute it to the appropriate application queues, but those applications are themselves not running with real-time priority, so all that happens is that your input gets quickly transferred to the input queues, where it then sits waiting for the applications to process them (which will never happen since the applications are not running with high enough priority).


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

Titus
09.02.2015, 00:54
Вот для примера:

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

Это опять же не про меня)

Я НЕ ИСПОЛЬЗУЮ сейчас для эмулятора realtime приоритет, а только high приоритет. По началу я использовал realtime, но это слишком жестко, если вдруг эмулятор зависнет, то только перезапуск компьютера. Однако и с realtime приоритетом он чудесно работал, если все было правильно и безошибочно спроектировано.

Так что в твоей статье говорится все верно.

ZXMAK
09.02.2015, 00:57
Какие ты можешь назвать 'мажорные' процессы, которым доступ к видюхе важнее, чем эмулятору?

в данном случае этот вопрос следует рассматривать так - "что важнее вызов функции DirectX или обработка этого вызова".

Ты говоришь что обработкой можно пожертвовать, главное чтобы вызов быстрее сработал... а то что оно в обработке зависнет - то не проблема :smile:

Titus
09.02.2015, 01:00
Ты говоришь что обработкой можно пожертвовать, главное чтобы вызов быстрее сработал... а то что оно в обработке зависнет - то не проблема :smile:

Да не зависнет ничего) Откуда такие фантазии)

Запусти EmuStudio и попробуй завесить)

ZXMAK
09.02.2015, 01:37
Да не зависнет ничего) Откуда такие фантазии)

Запусти EmuStudio и попробуй завесить)

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

Titus
09.02.2015, 01:48
Спасти ситуацию может только то, что система смотрит на приоритет как на рекомендацию, но время низкоприоритетным задачам всеравно выделяет. Однако лучше от этого не станет. EmuStudio будет стабильнее работать с обычным приоритетом. То что где-то при этом время может некорректно выдерживаться, это просто проблема алгоритма, оно точно также и с realtime при определенных обстоятельствах будет сбиваться.

Ничегошеньки не сбивается. Я долго игрался во всякие спековские игры (спек-48 с бипером у меня написан), причем на моей звуковухе Audigy, где позиция в аудиобуфере дается с точностью то единицы. На других компах, к сожалению, это не работает. Делал фулскрин, ставил через PowerStrip 50Гц развертку и наслаждался полной иллюзией спека. Плавная плавность и непрерывная звучность. Вот где кайф)

ZXMAK
09.02.2015, 01:56
Ничегошеньки не сбивается. Я долго игрался во всякие спековские игры (спек-48 с бипером у меня написан), причем на моей звуковухе Audigy, где позиция в аудиобуфере дается с точностью то единицы. На других компах, к сожалению, это не работает. Делал фулскрин, ставил через PowerStrip 50Гц развертку и наслаждался полной иллюзией спека. Плавная плавность и непрерывная звучность. Вот где кайф)

у меня звук в нем вообще не работает - какое-то посвистывание прерывающееся с частотой около 50 Гц идет и все...

http://savepic.su/4927005.png

процессор i5-761 2.6 ГГц, видеокарта GTX460, звук хз - встроенный, на риалтеке каком-то.

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

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

Alex Rider
09.02.2015, 02:08
Ребята, что вы письками знаниями меряетесь, напишите код, который доказывает или опровергает доводы оппонента. Олсо в паблике есть исходники Win2K, не думаю, чтобы "карусель" Win10 сильно далеко ушла, M$ боится трогать ядро. Найдите там доказательства.

ZXMAK
09.02.2015, 02:09
хотя нет, после уменьшения приоритета звук стал по другому работать - перестал дребезжать, но запазывает где-то на 1 сек и прерывается раз в несколько секунд :smile:

Titus
09.02.2015, 02:15
Попробовал приоритет вручную до нормы снизить - звук также дребезжит, но эмулятор стал работать отзывчевее и плавнее. С realtime была заметно заторможенность интерфейса. Кроме того что интерфейс эмулятора стал более плавным и отзывчивым, а также снижения нагрузки на процессор, от снижения приоритета до нормы ничего больше не меняется - скорость та-же.

Звук не работает, потому что когда я его писал, у меня была XP с аудиобуфером разрешением 1 отсчет. А ты тестируешь на линейке 7, где разрешение 480 отсчетов при 48000Гц, что априори не даст синхронизироваться по старому алгоритму.

---------- Post added at 02:15 ---------- Previous post was at 02:14 ----------


Ребята, что вы письками знаниями меряетесь, напишите код, который доказывает или опровергает доводы оппонента. Олсо в паблике есть исходники Win2K, не думаю, чтобы "карусель" Win10 сильно далеко ушла, M$ боится трогать ядро. Найдите там доказательства.

Думаю, что в 7-ке много че переработали относительно XP. Хотя бы тот же самый аудиомиксер. Теперь он только программный и фиксированной длины буфер - 10мс.

Alex Rider
09.02.2015, 02:25
Думаю, что в 7-ке много че переработали относительно XP. Хотя бы тот же самый аудиомиксер. Теперь он только программный и фиксированной длины буфер - 10мс.
Ну не "карусель" же. Аудиомикшер, как я понимаю - это процесс обычный. Вы же про приоритеты и локи аппаратных ресурсов дискутируете.

ZXMAK
16.02.2015, 04:47
После долгих экспериментов, зарелизил тестовую версию 2.9.2.3 (https://zxmak2.codeplex.com/releases/view/611720) с асинхронной эмуляцией :)
Результаты меня пока не удовлетворили, но вроде стабильно работает :)

Просьба затестить как ведет эмулятор на разных системах.

http://savepic.su/5058851.png

Titus
16.02.2015, 12:38
Просьба затестить как ведет эмулятор на разных системах.

На моей вроде ниче не изменилось.

ZXMAK
16.02.2015, 13:58
На моей вроде ниче не изменилось.

при синхронизации по времени или звуку, звук при таскании прерывается?

Titus
16.02.2015, 15:40
при синхронизации по времени или звуку, звук при таскании прерывается?

Да, вроде все так же. Причем больше прерывается, когда начинаешь работать в фаерфоксе, тогда конкретно прерывается. А если таскать, то тоже прерывается, но меньше.

ZEman
16.02.2015, 17:17
Да, вроде все так же. Причем больше прерывается, когда начинаешь работать в фаерфоксе, тогда конкретно прерывается. А если таскать, то тоже прерывается, но меньше.

это ...**## :D
да конечно, файрфокс может влиять на эмуляторы !

просто файрфокс сжирает память у тебя на компе и эмулятор начинает тормозить из-за нехватки ресурсов.
обнови ты уже в конце концов свой комп, как тебе это здесь уже не раз советовали.

Titus
16.02.2015, 18:48
обнови ты уже в конце концов свой комп, как тебе это здесь уже не раз советовали.

Мне уже советовали советчики не пребывающие в курсе дела.
Обьясняю еще раз популярно.

У меня есть компьютеры помощнее и помногоядернее, но работаю я и тестирую все свои эмули, в том числе, на самом слабом - Core 2 Duo 1.6Ггц, на котором включено только одно ядро.
Если автор мне скажет - дружок, не для тебя мама(ZXMAK) ягодку (ZXMAK2) растила - я перестану тестить его эмуль на своей скромной конфигурации без малейших вопросов)

[bETA]mEN
16.02.2015, 21:02
при синхронизации по времени или звуку, звук при таскании прерывается?
так он и раньше не прерывался

s_kosorev
16.02.2015, 21:46
Решил присоединиться к сообществу тестеров

Слабенький ноутбук 10 летней давности, 2х1.6ггц amd/2gb ram/Win 8.1 x64
Эмулятор даже на меню кушает 20%-25% процессора

http://savepic.su/5059766m.png (http://savepic.su/5059766.htm)

ZXMAK
16.02.2015, 23:15
Решил присоединиться к сообществу тестеров

Слабенький ноутбук 10 летней давности, 2х1.6ггц amd/2gb ram/Win 8.1 x64
Эмулятор даже на меню кушает 20%-25% процессора

http://savepic.su/5059766m.png (http://savepic.su/5059766.htm)


Это не меню кушает, а рендеринг, он сейчас всевремя работает, даже когда эмуляция на паузе - последний кадр перерисовывает.
Хотел добиться чтобы при любых операциях не было задержек, но с поддержкой старых систем это не просто :)
Смотрел видеоплееры - даже они не могут железно держать синхру и иногда срываются. Хотелось бы конечно попроще сделать, сам эмулятор уже довольно удобно выдает видео/аудио поток. Задача только в том чтобы его вывести с минимальной задержкой. Расчитывал что многопоточность заметно увеличет стабильность. Но оказалось что у directx есть с этим подводные камни... в итоге сложность вывода аудио и видео увеличилась, а эффекта заметного нет :)
Вернее есть, но на мощных многоядерных машинах. А со старыми одноядерными тяжело добиться хорошей стабильности.
С другой чтороны однопоточный вариант требует постоянно спамить очередь сообщений окна, что сказывается на нагрузке и идет борьба рендерера с ui, что приостанавливает эмуляцию.

Можно было бы как в unreal цикл сделать, тогда шустро и ствбильно будет работать, но тогда потеряются возможности ui.

Вот что интересно, сейчас ожидание кадра производится системой по present. поток рендерера никто не блочит, почему идут пропуски кадров на слабых машинах - неясно. Попробуй выключить debug info. Расчет и отрисовка графика выполняется не очень эффективно и жрет прилично процессорного времени :) с отключенным debug info, будет заметно стабильнее :)

Gonzo
16.02.2015, 23:22
пилит нормально хоть таскай окно хоть не таскай ничего не заикается))

http://savepic.su/5070040m.png (http://savepic.su/5070040.htm)


http://savepic.su/5055704m.png (http://savepic.su/5055704.htm)

Titus
16.02.2015, 23:23
С другой чтороны однопоточный вариант требует постоянно спамить очередь сообщений окна, что сказывается на нагрузке и идет борьба рендерера с ui, что приостанавливает эмуляцию

Зачем и чем спамить?

ZXMAK
16.02.2015, 23:40
Зачем и чем спамить?

Сообщениями paint, по которым рендеринг выполняется. Проблема в том что при однопоточном рендерере, present и reset должны выполняться из ui потока. Т.е. рендеринг полностью зависит от обработки оконных сообщений. По другому сделать проблематично - или спамить или в message pump цикл костыли вставлять, других вариантов я пока не встречал :)

Titus
16.02.2015, 23:43
Проблема в том что при однопоточном рендерере, present и reset должны выполняться из ui потока.

А при разнопоточном почему не должны?

zebest
18.02.2015, 00:02
Просьба затестить как ведет эмулятор на разных системах.
Как всегда - ведет себя странненько, елси не сказать больше..
Если без картинок сказать, то при переключении Frame Sync Source - внешний вид графиков дебаг-инфо - не меняется. Вообще. Или не переключает, или загрузка всегда одинакова. Но и это еще не все! для позвонивших немедленно – сниженная цена На разных мониторах - разный Render FPS -60 и 180 о_О . И?
ничего не делаю, протсо тягаю туда-сюда окно.. Картинки надеюсь не надо, джентльмены верят на слово?

---------- Post added at 23:36 ---------- Previous post was at 23:26 ----------

нее, все в ТРИ! раза ускоряется))

---------- Post added at 23:45 ---------- Previous post was at 23:36 ----------

Скажу больше) на "медленном" мониторе, где 60 фпс - при скрытии окна или сворачивании & синхре от видео - тоже ускоряется в 3 раза, слышу по звуку, а на "быстром", где всегда 180 - так 180 во всех 3х режимах, но ускоряется все же только на видео-синхре.

---------- Post added 18.02.2015 at 00:02 ---------- Previous post was 17.02.2015 at 23:45 ----------

про перемещении окна - не тормозит, а вот при изменении размеров мышью - ужжастно подтормаживает.
и да - с Новым Годом, с очередным Днем Рождения !)))

s_kosorev
18.02.2015, 01:48
Поставил вместо "коробочных" драйверов Windows 8, драйвера на аудио и видео с сайта производителя, результат странный

Видео теперь почти ровно держит 60 кадров, но эмулятору кушает в среднем 40% двухядерного проца, то есть почти целиком одно ядро. В противовес unreal который почти ничего не ест. С частотой проца ошибся 2.1Ггц а не 1.6ггц. Т.е. как бы много кушает, компьютеры с турбой наверное вообще не потянет.

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

ZXMAK
18.02.2015, 07:55
и да - с Новым Годом, с очередным Днем Рождения !)))

Спасибо :rolleyes:

ZXMAK
22.02.2015, 22:49
Изучаю возможность переделать рендерер видео. В качестве эталона неплохо выглядит видео-плеер MPC-HC (http://sourceforge.net/projects/mpc-hc/).
Однако он срывает 50 Hz синхронизацию на 75 Hz дисплее. А на 60 Hz дисплее скроллы подергиваются.

Для тестов прикрутил запись видео в эмулятор через aforge. Комиттить такой рекордер пока не буду, т.к. библиотеки тянут около 15 МБ, при этом запись звука библиотекой не поддерживается. Нужно чтото полегче найти.

Записал тестовое видео на 50 Hz с интрой от ZX-TIME-15.
Кто хочет поучавствовать, затестите пожалуйста - есть ли плеер, который способен воспроизвести это видео с плавным скролом и без срывов синхронизации (чтобы во время проигрывания не сменялся цвет фона).

Видео (61 МБ mpeg4 в zip архиве) доступно тут: https://drive.google.com/file/d/0B3Ubk04ABqGfeWJYSEp4YmJVYjQ/view?usp=sharing

Вот как youtube его проигрывает (на оригинал совсем не похоже) :):

http://www.youtube.com

[bETA]mEN
22.02.2015, 23:27
на оригинал совсем не похоже
ютуб 30 или 60 поддерживает

ZXMAK
23.02.2015, 01:50
mEN;783188']ютуб 30 или 60 поддерживает

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

[bETA]mEN
23.02.2015, 02:57
но зачем так видео до неузнаваемости менять
В оригинале:

Video: MPEG4 Video 640x512 50fps 13962kbps [V: mpeg4 simple profile, yuv420p, 640x512, 13962 kb/s]

На Youtube:

Video: MPEG4 Video (H264) 600x480 25fps 254kbps [V: h264 main L3.0, yuv420p, 600x480, 254 kb/s]

palsw
01.03.2015, 17:38
типа обновил железо - скачал самую свежую версию .закинул файлы конфигурации hdd,fdd и сами образы - и получил море ошибок.
http://i.piccy_.info/i9/fb9e9e2ee56a7ffc66c25ad72ba611b5/1425220459/29610/877399/Bezymiannyi_500.jpg (http://piccy_.info/view3/7813513/c581045d5a3f50bc166fc02281e62948/)http://i.piccy_.info/a3/2015-03-01-14-34/i9-7813513/500x267-r/i.gif (http://i.piccy_.info/a3c/2015-03-01-14-34/i9-7813513/500x267-r)

ZXMAK
01.03.2015, 18:03
Ну я тут только одну ошибку вижу - не найден файл с образом диска. судя по скрину проблема в плохом vmz файле. Его нужно просто удалить, запустить эмулятор и в настройках выбрать спринтер.

Дело в том что vmz файл содержит путь к файлу fdd, а он у тебя видимо изменился. Вобщем нужно просто создать новую конфигурацию спринтера и открыть образ fdd диска.

PS: кстати старые файлы vmz я не рекомендую подкладывать, т.к. их структура немного поменялась. Лучше зайти в настройки и кнопкой wizard выбрать конфигурацию спринтера. Сейчас vmz файл хранит информацию о масках портов для некоторых устройств (бипер, ay, магнитофон). В старых VMZ файлах этого не было, поэтому если они и заработают - будут проблемы с портами, т.к. они не будут соответствовать модели. Также в VMZ файле сейчас хранится частота AY, режим миксера (ABC/ACB/MONO/etc) и тип таблицы с амплитудами (Ay8910/Ym2149F)
vmide вроде не менялся, но были переделки для работы с двумя образами жестких дисков. Как дойдут руки до ui прикручу открытие/создание vmide как обычных образов

palsw
01.03.2015, 18:52
ZXMAK, сделал без wmz - вручную все прописал.hdd файл закинул видеться образ.все гуд .
CPU 70% загружено - жить можно.А вот в консоле выскакивает ошибка ата как в скриншоте

ZXMAK
01.03.2015, 19:38
ZXMAK, сделал без wmz - вручную все прописал.hdd файл закинул видеться образ.все гуд .
CPU 70% загружено - жить можно.А вот в консоле выскакивает ошибка ата как в скриншоте

это нормально, спринтер дает нулевую команду винчестеру, которой нет, он таким образом по ошибке проверяет не является ли винчестер сидиромом :smile:

Чтобы консоль не мешала, можно ее отключить, в файле log4net.config нужно закоментить строчку с консольным апендером в asyncAppender:



<appender name="asyncAppender" type="ZXMAK2.Logging.Appenders.AsyncAppender, ZXMAK2.Logging" >
<appender-ref ref="fileAppender" />
<!--<appender-ref ref="consoleAppender" />-->
</appender>


или просто ее удалить:


<appender name="asyncAppender" type="ZXMAK2.Logging.Appenders.AsyncAppender, ZXMAK2.Logging" >
<appender-ref ref="fileAppender" />
</appender>


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

drbars
14.03.2015, 06:33
Захожу VM-->Settings и сразу вылетает окно ошибки.
Win7 x64 Ultimate.

http://s020.radikal.ru/i702/1503/20/8df7f419ae0d.png (http://www.radikal.ru)

ZXMAK
14.03.2015, 17:33
хм, по какой-то причине среда не дает загрузить плагин gdbserver. Чтото снастройками безопасности на машине. Эмулятор случайно не с сетевого диска запускается?
Можно удалить плагин gdbserver из списка плагинов (файл plugins.config), чтобы ошибка с gdbserver не мешала. Этот плагин содержит только GDB сервер для отладки z80 кода в эмуляторе сторонними отладчиками

drbars
15.03.2015, 10:21
хм, по какой-то причине среда не дает загрузить плагин gdbserver. Чтото снастройками безопасности на машине. Эмулятор случайно не с сетевого диска запускается?
Запускается с обычного жесткого диска (D). Система на SSD диск (С).

ZEman
15.03.2015, 14:49
drbars, а какую версию эмулятора используете ?
у меня также Windows 7 x64 Ultimate, система стоит на жёстком диске SSD объёмом 256 гигабайт.
такой ошибки у меня не выскакивает.
использую версию эмулятора ZXMAK-2-9-2-3-TEST

вопрос отпал сам собой, видимо используете сборку с сайтов типа Emucr.com или Emu-france.com - они собирают релизы неправильно.
такой релиз, типа ZXMAK2 r38443 - у меня тоже ошибку выдаёт.

drbars
15.03.2015, 15:28
Скачал тут http://zxmak2.codeplex.com/

ZXMAK
15.03.2015, 23:40
Скачал тут http://zxmak2.codeplex.com/

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

Можно попробовать открыть свойства файлов и сделать unblock:
http://i.stack.imgur.com/eaElA.png

Как альтернативное решение - можно просто отключить этот плагин, удалив его из plugins.config

Doronetty
29.04.2015, 00:29
Всё хочу узнать, планируется ли доделать эмуляцию ATM-Turbo 2+ в плане поддержки полноценной клавиатуры (с эмуляцией чипа i8051) - без этого некоторые игры наотрез отказываются запускаться :(

breeze
04.05.2015, 12:18
ZXMAK, давно хотел спросить, почему такое разное поведение полосок пилотона при загрузке с ленты в 48к и 128к?

http://i.imgur.com/j4UGewL.png

http://i.imgur.com/8FjN7SE.png

Это как-то связано с ULA? Потому что в Байте, что 48, что 128 стабильно ровные полоски идут вверх.

ZX_NOVOSIB
13.05.2015, 18:05
ZXMAK, скажи, а нормальную эмуляцию связки +3 + Beta Disk Interface сложно прикрутить? Просто позарез нужен эмуль, отвечающий двум критериям:

- вменяемый дебагер.
- корректная эмуляция вышеобозначенной связки.

daniel
14.05.2015, 19:34
а нормальную эмуляцию связки +3 + Beta Disk Interface сложно прикрутить?
я как то пытался этот вопрос поднять но относительно +2A. В итоге мне было сказано что не должен +2A c TR-DOS работать. Просто надо прикрутить хотя бы поддержку DivIDE, чтобы TRDOS из под ESXDOS можно было запускать.

ZX_NOVOSIB
14.05.2015, 22:04
daniel, что +2A, что +3 - одно и тоже. Мне нужен эмуль с вменяемым дебагером, чтобы подкорректировать ром +2AB/+3, а именно максимально корректно добавить в стартовое 128-ое меню этого рома пункт TR-DOS. Далее этот ром прошьется в микросхему, микросхема вставится в +3, и получится "спектрум мечты". Посему мне поддержка divIDE не поможет, мне нужен честный BDI.

ZXMAK
15.05.2015, 05:29
ZXMAK, давно хотел спросить, почему такое разное поведение полосок пилотона при загрузке с ленты в 48к и 128к?

Это как-то связано с ULA? Потому что в Байте, что 48, что 128 стабильно ровные полоски идут вверх.

Разные тайминги развертки

ZXMAK
05.06.2015, 00:59
Седелал новый многопоточный рендерер для видео. Нужно еще немного мелочи допилить. Хотелось бы услышать отзывы. Наблюдаются ли на каких-то системах ошибки или проблемы с отрисовкой.

С новым рендерером в логе не должно появляться никаких ошибок Direct3D. При любых ресайзах, сворачивании, разворачивании и т.п.
Единственная допустимая ошибка - DeviceLostException (происходит при потере устройства по блокировке экрана и т.п.).

Если в логе появятся какие-то ошибки, просьба написать сюда, будем фиксить :)
Ну и общие впечатления по плавности видео с новым рендерером хотелось бы услышать :)
Заранее спасибо за отзывы

Ссылка на тестовый билд с новым рендерером тут: https://drive.google.com/file/d/0B3Ubk04ABqGfalo3dHVkUEoyUlU/view?usp=sharing

http://savepic.ru/7227718.png

Alex Rider
05.06.2015, 01:05
Седелал новый многопоточный рендерер для видео.
ZXMAK, обращаюсь в 100500-ё раз, сделай автообновление с вобможностью выбора Beta/неBeta! Количетсво тестеров, реквестеров фич, просто активных пользователей, а, глядишь, и желающих сотрудничать возрастет! Сейчас все как в Linux из далеких 90-х - скачай архив, распакуй, запусти... То ли дело - кликнул в ярлык, ответил "да" на вопрос об обновлении, оно скачалось, запустилось, и балуйся! Еще бы фишку "возврат к последней стабильной версии" - и вообще одно удовольствие от тестирования!

ZXMAK
05.06.2015, 02:00
ZXMAK, обращаюсь в 100500-ё раз, сделай автообновление с вобможностью выбора Beta/неBeta!

С автообновлением тяжело будет до конфигов добраться, т.к. файлы эмулятора будут хз где в дебрях системы храниться, по ярлыку не найдешь, т.к. он не на эмулятор будет ссылаться. Т.е. это возможность для тех кому кто ставит и удаляет софт через Programs в контрол панели и в настройки не лазит

Alex Rider
05.06.2015, 02:20
файлы эмулятора будут хз где в дебрях системы храниться
Ну относительно exe-шника эмулытора-то известно где? Оттуда и плясать. Единстванная проблема - корректно подхватывать конфиги от старых версий при изменении их структуры.

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

Sayman
05.06.2015, 06:53
файлы эмулятора будут хз где в дебрях системы храниться
Почему они должны храниться в дебрях системы? эмуль хранится по пути d:\zxmak2. При запуске ехешника этот путь становится текущим. Из под эмуля же читается файл, скажем, vmide или там файл cmos? ну так а почему при обновлении они должны быть где-то в другом месте. задача обновлялки - обратиться к хранилищу с обновами. там должен быть какой-то файл, который указывает на файлы, которые были обновлены, составляешь список файлов к закачке и скачиваешь. Файлы подлежащие замене заворачиваешь в zip с именем preupdate_backup_текущая_дата_врем .zip, после заворачивания удаляешь эти файлы, закачиваешь новые. всё пихается в текущий каталог, а текущий каталог будет тот каталог, из-под которого был запуск эмуля. запуск хоть с ярлыка, хоть как.

ZXMAK
05.06.2015, 09:00
Ну относительно exe-шника эмулытора-то известно где? Оттуда и плясать. Единстванная проблема - корректно подхватывать конфиги от старых версий при изменении их структуры.

Не понял почему ярлык должен ссылаться не на сам exe-шник эмуля.

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

---------- Post added at 09:00 ---------- Previous post was at 08:53 ----------


Почему они должны храниться в дебрях системы? эмуль хранится по пути d:\zxmak2.

Автообновление ClickOnce ставит программу в свою папку, гдето в дебрях programdata под некоторым guid-ом. Автообновлять по другому ClickOnce не умеет. А изобретать чтото свое, запускать под это дело сервис в инете не интересно

Sayman
05.06.2015, 09:37
Заглянул в педевикию:

ClickOnce позволяет пользователю устанавливать и запускать Windows приложение, кликая по ссылке на веб-странице,
Зачем тебе этот ClickOnce? Нужно что? Нужно, чтобы эмуль мог сам себя обновлять. Пользователь запустил эмуль. При запуске эмуль глянул по ссылке на хранилище - есть ли обнова или нет. Есть обнова. Как во многих программах. Вот к примеру - videomatch. Прога которой я на спринтер флики конверчу. При запуске мне говорит, что есть обновление. Если оно мне нужно, я кликаю на "Обновить". Так же есть кнопка с информацией об обновлении. Зачем мне как юзеру бегать на какие-то непонятные вэб-сервисы? Сделай обнову прям из под эмуля и всё. Ещё можно инсталлер прикрутить, для совсем ленивых, чтобы не нужно было ручками распаковывать, а просто запустил сетап.ехе и радуешься эмулю. Кроме того, сервис у тебя уже изобретён - codeplex где ты хранишь и исходники и бинары. добавь туда в шару xml файл с данными по обновлению и механизм просмотра/скачивания/установки этих обновлений. никакого сервиса слишком сложного тут не требуется.

---------- Post added at 12:37 ---------- Previous post was at 12:29 ----------

Кстати, про эмуль и обновления: а почему бы не сделать эмуляцию wait для достоверности эмуляции? В эмуле все машинки слишком шустрые, в отличии от реальных машинок. Да и прикрутить звук к режиму Спринтера тоже было бы неплохо, я данные тебе уже отправлял пару раз.

ZXMAK
05.06.2015, 10:15
Нужно что? Нужно, чтобы эмуль мог сам себя обновлять. Пользователь запустил эмуль. При запуске эмуль глянул по ссылке на хранилище - есть ли обнова или нет. Есть обнова. Как во многих программах. Вот к примеру - videomatch. Прога которой я на спринтер флики конверчу. При запуске мне говорит, что есть обновление. Если оно мне нужно, я кликаю на "Обновить". Так же есть кнопка с информацией об обновлении. Зачем мне как юзеру бегать на какие-то непонятные вэб-сервисы?

Это и есть ClickOnce. C веб страницы кнопкой инсталл скачивается установщик. При запуске он настраивает ярлык на кликванс и когда по нему кликаешь, кликванс проверяет обновления или запускает уже скачанную версию

---------- Post added at 10:14 ---------- Previous post was at 10:10 ----------


Кстати, про эмуль и обновления: а почему бы не сделать эмуляцию wait для достоверности эмуляции? В эмуле все машинки слишком шустрые, в отличии от реальных машинок. Да и прикрутить звук к режиму Спринтера тоже было бы неплохо, я данные тебе уже отправлял пару раз.

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

---------- Post added at 10:15 ---------- Previous post was at 10:14 ----------

Отзывы по новому рендереру есть? :)

Sayman
05.06.2015, 10:36
C веб страницы кнопкой инсталл скачивается установщик.
ничего подобного. большинство программ этим не пользуется. Пример что я привёл выше - програмка портабле. никаких установок нет. я распаковал архив с прогой и пользуюсь. Она сама всё находит все свои обновы и сама ставит, без всяких clickonce. Могу в пример привести ещё с десяток аналогичных решений.

Все задержки оригинальных моделей эмулируются
да всё просто. вон тот же режим Profi. Эмуль работает примерно на 20 быстрее. Просто можно даже на глаз определить. Загружаю систему на реальном профи и в эмуле. Запускаю какую нить прогу с рисовалкой. в эмуле летает, на реале чуть медленее. Про спринтер даже говорить не приходится - эмуль раза в 2 быстрее железки.
дело не в тормознутости отдельных клонов, а в наличии почти у всех wait`а. особенно на турбировании. Про не турбо режим говорить не буду, но в турбе эмуль явно быстрее работает (хотя турба не эмулируется, но через исходник я меняю количество тактов в инте и привет семье).

---------- Post added at 13:36 ---------- Previous post was at 13:28 ----------

Как у него вырубить показ ошибок ATA? бесит это окошко.

ZXMAK
05.06.2015, 12:34
[/COLOR]Как у него вырубить показ ошибок ATA? бесит это окошко.

настроить в log4net.config, есть два варианта:

1) отключить консольное окно с логом вообще, для этого нужно удалить эту строку из секции asyncAppender:


<appender-ref ref="consoleAppender" />


2) повысить уровень сообщений для которых открывается консольный лог, для этого в секции consoleAppender, нужно задать минимальный уровень сообщения для открытия консоли в параметре AutoLevel, например:


<AutoLevel value="Fatal" />


Есть еще много других вариантов, например задать фильтр, какие сообщения показывать в консоли, но это уже для юзеров знакомых с log4net

Это тестовый билд, поэтому в конфигурации настройка на показ всех сообщений в консоль

abelenki
05.06.2015, 13:51
настроить в log4net.config, есть два варианта:

1) отключить консольное окно с логом вообще, для этого нужно удалить эту строку из секции asyncAppender:


<appender-ref ref="consoleAppender" />


а чтобы в файл не писал, нужно ещё и это удалить:



<appender-ref ref="fileAppender" />


правильно?

ZXMAK
05.06.2015, 14:42
а чтобы в файл не писал, нужно ещё и это удалить:



<appender-ref ref="fileAppender" />


правильно?

совершенно верно :smile:

А в секции fileAppender находятся настройки записи в файл, там можно путь для логов указать

Sayman
05.06.2015, 14:45
а что насчёт реализации звука для спринтера?

ZXMAK
05.06.2015, 22:30
а что насчёт реализации звука для спринтера?

Со звуком много непонятно как он реализован в спринтере, информация конечно какая-то есть, но ее недостаточно - нужно инвестигейтиь, пробовать разные варианты. Времени на это пока не было.
Например непонятно как из 8-битной памяти получаются 16-битные значения для ацп (в каком порядке читаются, за один инкремент позиции или за два, в каком формате -- signed или unsigned, как формат задается и т.п)

ZXMAK
07.06.2015, 12:49
Пофиксил баги в новом многопоточном рендерере.
Вот новый вариант для тестов: https://drive.google.com/file/d/0B3Ubk04ABqGfTW0yT1lJcHF0Tms/view?usp=sharing

Что фиксилось:
1) исправлен детект изменения текущего дисплея;
2) удалено ограничение DeviceClip (ограничивает обновление текущим дисплеем), которое случайно попало в флаги инициализации;
3) Direct3D теперь всегда работает и создается из своего потока
4) исправлена проблема с фликами и артефактами (как будто нет синхронизации), возникавшими из-за одновременного чтения и обновления видео-кадра (актуально и для последних релизных версий)
5) небольшие оптимизации для снижения активности выделения памяти и лишних проверок секьюрити при вызовах winapi

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

ZXMAK
08.06.2015, 02:09
Windows 8.1 x64, при входе в меню VM - Settings сразу словил ошибку:
http://i72.fastpic.ru/thumb/2015/0607/5b/5941c97ba3984be8bd2eb047a3891d5b.jpeg (http://fastpic.ru/view/72/2015/0607/5941c97ba3984be8bd2eb047a3891d5b.jpg.html)
Может какой-то специфический донет надо поставить?

нет, это не связано с рендерером и не связано с дотнетом :smile:

Просто плагин GDB сервера поднимает TCP сервер, а файл сборки, в которой он находится помечен на диске, как загруженый с инета. Поэтому секьюрити системы не дает его загрузить.

Нужно в проводнике кликнуть на свойства файла Hardware.GdbServer.dll и нажать кнопку Unblock. Или не добавлять в конфигурацию машины GDB Server.

http://savepic.ru/7243545.png

Я уже писал об этом тут: http://zx-pk.ru/showpost.php?p=788956&postcount=1574

---------- Post added at 02:09 ---------- Previous post was at 01:44 ----------

Обновил тестовую версию: https://drive.google.com/file/d/0B3Ubk04ABqGfTWN0RWZlc2xsWVk/view?usp=sharing

1) переработан рендер цикл
2) добавлена обработка ошибок
3) исключены вызовы загрузки DirectX ресурсов для потерянного устройства
4) Добавлены оптимизации, исключены лишние вызовы меняющие sampler и render стейт;
5) Исправлено освобождение Direct3D, теперь оно происходит из потока рендерера
6) Исправлен детект видеоадаптера на WinXP/Win2003
7) Добавлено отображение ошибки вместо изображения, если не удалось загрузить DirectX

abelenki
08.06.2015, 03:49
на всех предыдущих версиях у меня звучали щелчки первую минуту-две после старта эмулятора. очень раздражало.

на 2.9.2.4 исчезли. спасибо!!

ZXMAK
08.06.2015, 12:39
на всех предыдущих версиях у меня звучали щелчки первую минуту-две после старта эмулятора. очень раздражало.

на 2.9.2.4 исчезли. спасибо!!

это потому, что после запуска еще не весь код скомпилирован JIT компилятором, по первому обращению могут компилироваться редкоиспользуемые методы, например для для редких инструкций Z80. Это может приводить к небольшим лагам сразу после запуска.
От этого можно избавиться заранее обработав библиотеки генератором нативного кода. Тогда система будет сразу запускать готовый код.

Новая версия работает асинхронно, поэтому лаги в одной части слабо влияют на другие части.

А генерация нативного кода делается в командной строке с помощью ngen.exe:


ngen.exe install <filename.dll>


Неудобство в том, что библиотек у эмулятора много и для каждой нужно запускать. Но можно сгенерить нативный код только для тяжелых библиотек, например:
ZXMAK2.Engine.dll
ZXMAK2.Host.WinForms.dll
ZXMAK2.Hardware.dll
ZXMAK2.Hardware.WinForms.dll
ZXMAK2.Hardware.Circuits.dll

Нужно будет тул сделать, который это будет автоматизировать.

Alex Rider
09.06.2015, 21:52
Автообновление ClickOnce ставит программу в свою папку, гдето в дебрях programdata под некоторым guid-ом. Автообновлять по другому ClickOnce не умеет. А изобретать чтото свое, запускать под это дело сервис в инете не интересно
Сорри, загруз был большой, долго не интересовался темой. Могу на досуге попробовать сделать кастомную автообновлялку на C# по мотивам когда-то изученной. Там все просто :)
upd: непросто научиться апдейтить конфиги под новые фичи.

ZXMAK
13.06.2015, 01:06
выложил немного обновленный тестовый билд: https://drive.google.com/file/d/0B3Ubk04ABqGfN1huR205Ym16aW8/view?usp=sharing

фикс косметический - исправлен размер текстуры для mimic tv эффекта (сломался в процессе переделок). Новый рендерер похоже нормально себя ведет.

ZXMAK
14.06.2015, 18:08
Обновил эмулятор до версии 2.9.2.39319: https://zxmak2.codeplex.com/releases/view/615729

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

Ожидал увидить некоторый прирост скорости от переработки кода Z80, но эффект незначительный. Основное время едят рендеринг видео и звука. Тем не менее прирост на ~100 фпс в Maximum Speed есть, но скорее за счет фиксов в рендерере.

ZXMAK
20.06.2015, 19:00
Прикрутил нормальный биндинг клавиатуры PC на клавиатуру спектрума.
Можно связывать любые комбинации PC кнопок, на любые комбинации спектрум кнопок.
Можно задавать блокировку каких-то комбинаций, если нажата кнопка, которая в комбинации не задействована.
Все задается в config файле :)
Пока не комиттил, нужно причесать.
Если есть пожелания по добавлению поддержки сочетаний кнопок по дефолту - пишите, сразу добавлю в дефолтный конфиг :)

ZXMAK
21.06.2015, 01:04
Сделал тестовый билд: https://drive.google.com/file/d/0B3Ubk04ABqGfekRmckNOTGZPNVU/view?usp=sharing

Что поменялось:

- мелкие оптимизации рендерера;

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

- добавлен биндинг клавиш PC на клавиши спектрума, настраивается в Keyboard.config. Старые конфиги мэппингов теперь лежат в ресурсах и из файлов не грузятся (они предназначены только для трансформации кодов клавиш от разных хостов во внутренний формат эмулятора). Поэтому эти файлы теперь можно модифицировать только в исходных кодах и хранятся они как ресурсы внутри DLL файлов;

- общая спектрум клавиатура переработана, она теперь поддерживает настройку маски/порта и использует биндинги из Keyboard.config. Клавиатуры от АТМ и PENTEVO удалены - вместо них теперь используется общая клавиатура с кастомными настройками порта. Заодно это пофиксило дешифрацию порта клавиатуры для АТМ 7.10


Корневые теги KeyBinding задают условия для срабатывания спектрум кнопки, которая задается аттрибутом Key.

Есть несколько вариантов:

1) Простой биндинг 1-а кнопка PC на 1-ну кнопку Spectrum'а:


<KeyBinding Key="D2" Condition="D2" />

В данном случае условие простое - нажатие одной кнопки, поэтому его можно задать сразу аттрибутом Condition тега KeyBinding. Аттрибут Condition может принимать названия кнопок PC клавиатуры, определенные enum'ом ZXMAK2.Host.Entities.Key.
В приведенном выше примере, кнопка "2" спектрума (Key="D2") напрямую привязывается к кнопке "2" PC клавиатуры (Condition="D2").

2) Чуть более сложный вариант, нажатие любой из нескольких кнопок PC клавиатуры приводят к нажатию кнопки спектрума:


<KeyBinding Key="D5">
<Condition Key="D5"/>
<Condition Key="LeftArrow"/>
</KeyBinding>


В данном случае, условие содержит несколько вариантов, поэтому задается не аттрибутом, а отдельными тегами внутри тега KeyBinding. Из первой строчки примера видно что мы задаем условие для нажатия кнопки "5" спектрума:

<KeyBinding Key="D5">

Далее следует перечень условий при любом из которых кнопка спектрума будет нажата - это нажатие кнопок "5" или "LeftArrow" (стрелка влево):


<Condition Key="D5"/>
<Condition Key="LeftArrow"/>


все условия Condition в KeyBinding работают по ИЛИ, т.е. если любое из них выполнилось, то сработает биндинг для кнопки спектрума "5".

В теге Condition также можно задать аттрибут IsPressed, который по умолчанию равен True, т.е. означет что условие срабатывает по нажатию кнопки. Можно прописать это явно:


<Condition Key="LeftArrow" IsPressed="True"/>

Соответственно, если прописать IsPressed="False", то условие будет срабатывать, если кнопка не нажата. Но для простых условий - это бесполезный флаг.

3) Сложный биндинг, позволяет задать набор условий, каждое из которых должно выполниться для срабатывания биндинга.
Сложные условия биндинга задаются тегом MultiCondition.
Этот тег может содержать внутри себя набор тегов Condition.
Условие MultiCondition срабатывает только если все под-условия Condition внутри MultiCondition выполняются.

Пример:


<KeyBinding Key="D7">
<Condition Key="D7"/>
<Condition Key="UpArrow"/>
<MultiCondition>
<Condition Key="RightShift" IsPressed="False"/>
<Condition Key="Apostrophe"/>
</MultiCondition>
</KeyBinding>


В данном примере кнопка спектрума "7" будет нажата, в любом из следующих случаев:
- нажата кнопка "7" PC клавиатуры;
- нажата кнопка "UpArrow" PC клавиатуры;
- нажата кнопка "Apostrophe" PC клавиатуры, но при этом кнопка "RightShift" PC клавиатуры не нажата.

Вот, вобщем-то этого достаточно, чтобы настроить клавиатуру под себя :smile:

PS: На самом деле MultiCondition может кроме Condition содержать также вложенные MultiCondition внутри себя. Но думаю это бесполезно. Стоит еще отметить, что условия проверяются в рантайме, т.е. количество условий и их сложнасть, в какой-то степени влияет на скорость эмуляции. Но для современных машин это не критично. Все проверки для дефолтного конфига занимают примерно 0.00001 сек и выполняются один раз в кадр.

PPS: для Profi и Quorum и Sprinter биндинги не работают, они по прежнему пока используют свои старые клавиатуры. Это связано с тем что у этих моделей свои дополнительные кнопки. Для них видимо прийдется сделать отдельные конфиги.

ZXMAK
22.06.2015, 03:26
Может ктото подскажет по спринтеру (см. детали в спойлере).

Попробовал прикрутить CovoxBlaster,
в официальной документации указано что порт управления #4F, а запись в буффер через #FB, как в режиме ковокса.
Однако код не обращается к порту #FB.

Sayman присылал обрывки информации, из которых следует, что порт управления #4E, а запись в буффер через #4F - это похоже на правду. С этими портами, поведение кода похоже на работу с ковокс бластером.

Вобщем прикрутил управление битом включения бластера на #4E, а запись в буффер на #4F, однако wavplayer почемуто не хочет запускаться.

wavplayer выводит в порт #4E значение #FE, затем значение #FF и закрывается.
Вот фрагмент который выводит #FE:
http://savepic.ru/7366370.png

Обращу внимание, что код пишет в #4E значение прочитанное из этого-же порта, но с наложением маски #FE:


LD BC,#204E
IN A,(C)
LD (#C150),A
AND #FE
OUT (C),A


т.е. код не только пишет в порт #4E, но и зачем-то читает из него.
Ктото может помочь разобраться, что из него должно читаться?

---------- Post added at 03:26 ---------- Previous post was at 01:45 ----------

Сделал тестовый билд с CovoxBlaster для спринтера: https://drive.google.com/file/d/0B3Ubk04ABqGfbl91bTBrTVJLN0U/view?usp=sharing

Пока в режиме ковокс бластера реализован только режим 8-бит моно.
Биты выбора 8/16 и mono/stereo игнорируются.
Биты выбора частоты уже работают, согласно таблички, которую прислал Sayman.

На тестовой программе под пентагоном (см. аттачмент), ковокс-бластер работает.
Но на спринтере wavplayer не запускается (см. описание проблемы выше).

Хз, может wavplayer нужно wav файл в командной строке указать? Не знаю чем залить файл на образ винта :)

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

По дефолту конфиг спринтера не содержит устройство CovoxBlaster, его нужно добавить вручную. Находится на закладке с устройствами "Sound".
Желательно поднять приоритет для CovoxBlaster выше клавиатуры.

Можно включить логирование вывода в порты #4E и #4F (пишутся значения регистров PC, BC и само значение).
Логирование включается правкой VMZ файла:


<Device type="ZXMAK2.Hardware.Sprinter.CovoxBlaster, ZXMAK2.Hardware" volume="100" logIo="True" />

Sayman
22.06.2015, 08:18
ZXMAK, проверил эту версию эмуля. звука нет.
https://www.dropbox.com/s/4jvmnizb4rl2w0v/sp_test.zip?dl=0
тут запакованный образ винта с загрузкой. в эмуле зайди в биос и выстави загрузку с винта, ф10 для сохранения. загрузишься с винта, во флексе как и в тота камандере - аль ф1 (альт ф2) для выбора диска. на диске Д там папка wav. там лежит несколько wav файлов и описание файлов в tests.txt. для запуска вафки просто нажми на энтер на этом файле, плеер запустится. этот же плеер играет на реале.

NovaStorm
22.06.2015, 09:30
Можно включить логирование вывода в порты
А есть ли/можно ли сделать логирование числа тактов от halt до инта?

ZXMAK
22.06.2015, 12:32
ZXMAK, проверил эту версию эмуля. звука нет.
https://www.dropbox.com/s/4jvmnizb4rl2w0v/sp_test.zip?dl=0
тут запакованный образ винта с загрузкой. в эмуле зайди в биос и выстави загрузку с винта, ф10 для сохранения. загрузишься с винта, во флексе как и в тота камандере - аль ф1 (альт ф2) для выбора диска. на диске Д там папка wav. там лежит несколько wav файлов и описание файлов в tests.txt. для запуска вафки просто нажми на энтер на этом файле, плеер запустится. этот же плеер играет на реале.


Спасибо, а в чем причина можешь помочь разобраться? Ведь пример для ковокс бластера работает...
Есть мысли, что плеер в ковокс бластер пишет через акселератор, который не заимплеменчен. Может есть какие-то тесты для спринтера которые звук через порты выводят?

---------- Post added at 12:32 ---------- Previous post was at 12:20 ----------


А есть ли/можно ли сделать логирование числа тактов от halt до инта?

Могу прикрутить отображение в Debug Info информацию на каком такте кадра halt сработал. Число тактов от halt до инта можно будет вычислить вычитанием из числа тактов кадра

Sayman
22.06.2015, 12:38
Спасибо, а в чем причина можешь помочь разобраться? Ведь пример для ковокс бластера работает...
Есть мысли, что плеер в ковокс бластер пишет через акселератор, который не заимплеменчен. Может есть какие-то тесты для спринтера которые звук через порты выводят?
попробую по-разбираться с этим.

ZXMAK
22.06.2015, 18:26
спасибо за образ винчестера, посмотрел - проигрыватель не закрывается, чтото проигрывает, но звук не слышен. Судя по тому что в этот момент в верхнее окно адресного пространства замаплена страница #FD, а в описании упоминается про возможность записи данных в ковокс-бластер через акселератор путем записи в страницу #FD. Очевидно именно через акселератор плеер и пишет данные.

Вопрос - где можно почитать как работает акселератор записи данных в бластер?
Есть предположение что буффер бластера мапится на запись в страницу #FD. Т.е. операции записи в эту страницу, происходят производятся не только в память, но и в буффер бластера. Я в правильном направлении думаю? Если да, есть ли какое-то управление этим маппингом или в бластер всегда пишется то что записано в страницу памяти #FD?
Что будет если записать данные по адресу, старше чем разрядность буффера бластера? Старшие биты адреса будут просто проигнорированы? или запись в этом случае не произойдет?

Еще вопросик по форматам - как технически происходит увеличение размера буффера ковокса при переключении режимов 8bit/mono, 8bit/stereo, 16bit/mono, 16bit/stereo?

В описании написано что размер буффера бластера увеличивается со 128 байт для 8bit/mono до 256 байт для 16bit. Но... 16bit/стерео требует 4 байта, а не два, значит ли это, что размер буффера увеличивается до 512 байт, или просто уменьшается число cэмплов на страницу буффера?
Как это влияет на частоту появления бита D7 в порте #4E? она меняется в зависимости от формата или четко привязана к частоте? Другими словами - влияет ли формат на частоту сэмплов, если для разных форматов выбран и тот-же код частоты?

Sayman
22.06.2015, 19:59
Очевидно именно через акселератор плеер и пишет данные.
если я всё верно понял, плеер грузит 8кб данных ваф файла в свой буфер. потом Акселем начинает кидать данные в страницу fd (страница cbl). при этом в мануале указывется, что буфер бластера всего 256байт, но разбито на 2 банки по 128 байт. контроль банок через порт fe, 7й бит. если = 0, то всё ещё работает 0я банка, иначе включилась 1я банка и нужно подкинуть данные. при этом плеер зачем то выставляет вектор IM2 на адрес a000 (или a0ff?!). есть демка (тестилка). там по синусу выводится всё в бластер, т.е. должен быть какой то писк по синусойде. параметры там выставлены 8бит, но моно или стерео не обратил внимание. palsw сейчас у себя проверит файлик и скажет что там и как. но в целом, гепотеза о работе бластера у тебя верная.

Вопрос - где можно почитать как работает акселератор записи данных в бластер?
ничем особенным оно там не отличается. т.е. те же команды включения и выключения. метод бросания данных - копирование через ld l,l. причём за раз кидает 128байт.

16bit/стерео требует 4 байта, а не два, значит ли это, что размер буффера увеличивается до 512 байт
об этом, пока, ничего не нашёл.
собственно, вот кусок кидания в бластер:

PLAY:
DI
PUSH AF
IN A,(0FEh)
RLCA
JP NC,NO_SND

PUSH HL
PUSH DE
PUSH BC

LD A,(HDD_CNT)
INC A
LD (HDD_CNT),A

; LD A,7
; OUT (0FEh),A

IN A,(PAGE3)
LD E,A
IN A,(PAGE0)
LD D,A

PUSH DE

LD A,0FDh
PLAY_PAGE EQU $-1
OUT (PAGE3),A
OUT (PAGE0),A

CALL VISIO

;****************

LD HL,0C000h
SND_A EQU $-2

LD B,0
LD D,D
LD C,128 ; 128 bytes
LD B,B

LD A,(FLAG16) ; 8/16
; AND 18h
L_DDX:
LD L,L ; асс-lines read & write to CBL
LD D,(HL)
LD (HL),D
LD B,B
ADD HL,BC ; BC=80h

SUB 8
JR NZ,L_DDX

LD A,H
OR 0C0h
LD H,A
LD (SND_A),HL

;****************

POP DE

LD A,D
OUT (PAGE0),A
LD A,E
OUT (PAGE3),A
POP BC
POP DE
POP HL

; LD A,0
; OUT (0FEh),A

NO_SND:
POP AF
EI
RETI

да и кстати, прикреплённый исходник не корректный, ниразу не ехе файл получается. а под трдос оно нафиг не надо генерить. заголовок ещё надо прикрутить:


org 8100h-512

db "EXE"
db 0
dw 200h
dw 0
dw 0
dw 0
dw 0
dw 0
dw start
dw start
dw 0bfffh
ds 490

NovaStorm
22.06.2015, 20:25
Могу прикрутить отображение в Debug Info информацию на каком такте кадра halt сработал.
Ну для начала норм. Хотелось бы конечно статистику, и даже по возможности типа "сколько рисуется второй экран", но для этого нужны наверное скрипты для эмуля, чтобы можно было ставить условия на память и порты.
А эта Debug Info рисуется только поверх экрана? Сбоку можно?

palsw
22.06.2015, 21:01
при запуске demo7.exe пердеж 85гц в обоих каналах одинаковый
можно выйти по ecs и снова запустить - работает.

http://i.piccy_.info/i9/9c4bd265d284bf490c5e4c49fe5ac208/1434996011/76032/922549/555.gif (http://piccy_.info/)http://i.piccy_.info/a3/2015-06-22-18-00/i9-8382394/345x285-r/i.gif (http://i.piccy_.info/a3c/2015-06-22-18-00/i9-8382394/345x285-r)


http://www.youtube.com

Sayman
22.06.2015, 21:08
собственно сама demo7.exe во вложении. пади не нужно говорить, как в виндах монтировать vhd файлы?)))

ZXMAK
22.06.2015, 21:40
собственно сама demo7.exe во вложении. пади не нужно говорить, как в виндах монтировать vhd файлы?)))

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

palsw
22.06.2015, 21:44
ZXMAK, в вин7 панель управления-администрирование-управление дисками - вкладка примонтировать виртуальный винт - записать все что нужно и отмонтировать. все :)

ZXMAK
22.06.2015, 23:25
. при этом плеер зачем то выставляет вектор IM2 на адрес a000 (или a0ff?!). есть демка (тестилка). там по синусу выводится всё в бластер, т.е. должен быть какой то писк по синусойде. параметры там выставлены 8бит, но моно или стерео не обратил внимание. palsw сейчас у себя проверит файлик и скажет что там и как. но в целом, гепотеза о работе бластера у тебя верная.

ничем особенным оно там не отличается. т.е. те же команды включения и выключения. метод бросания данных - копирование через ld l,l. причём за раз кидает 128байт.



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

А как буффер мапится - полностью 256 байт или только активная половинка? Если по адресу 0xC100 записать запись пойдет в нулевой байт буффера?

palsw
22.06.2015, 23:40
в муляторе проверил demo7.exe - звука нет

ZXMAK
23.06.2015, 01:06
а кто музыку выбирал? :)

Прикрутил маппинг страницы #FD на бластер, вместо wav почему-то зуммер с меняющимся тоном - надо разбираться.
А вот Demo7.exe вроде нормально работает - пик на 86 Гц,
расстояние между импульсами 513 сэмплов при 44100 Гц, т.е. 85.96 Гц:

http://savepic.ru/7445915.png

Не знаю как скомпилить приложенный исходник, т.к. компилятора для спринтера нет, скомпильте плиз его с этим набором данных (это синусоида с периодом 256 байт):


DB #00,#01,#03,#04,#06,#07,#09,#0A,#0C,#0D,#0F,#11,#1 2,#14,#15,#17
DB #18,#1A,#1B,#1D,#1E,#20,#21,#23,#24,#26,#27,#29,#2 A,#2C,#2D,#2F
DB #30,#32,#33,#34,#36,#37,#39,#3A,#3B,#3D,#3E,#3F,#4 1,#42,#43,#45
DB #46,#47,#49,#4A,#4B,#4C,#4E,#4F,#50,#51,#52,#54,#5 5,#56,#57,#58
DB #59,#5A,#5B,#5D,#5E,#5F,#60,#61,#62,#63,#64,#65,#6 6,#66,#67,#68
DB #69,#6A,#6B,#6C,#6C,#6D,#6E,#6F,#70,#70,#71,#72,#7 2,#73,#74,#74
DB #75,#75,#76,#77,#77,#78,#78,#79,#79,#79,#7A,#7A,#7 B,#7B,#7B,#7C
DB #7C,#7C,#7D,#7D,#7D,#7D,#7E,#7E,#7E,#7E,#7E,#7E,#7 E,#7E,#7E,#7E
DB #7F,#7E,#7E,#7E,#7E,#7E,#7E,#7E,#7E,#7E,#7E,#7D,#7 D,#7D,#7D,#7C
DB #7C,#7C,#7B,#7B,#7B,#7A,#7A,#79,#79,#79,#78,#78,#7 7,#77,#76,#75
DB #75,#74,#74,#73,#72,#72,#71,#70,#70,#6F,#6E,#6D,#6 C,#6C,#6B,#6A
DB #69,#68,#67,#66,#66,#65,#64,#63,#62,#61,#60,#5F,#5 E,#5D,#5B,#5A
DB #59,#58,#57,#56,#55,#54,#52,#51,#50,#4F,#4E,#4C,#4 B,#4A,#49,#47
DB #46,#45,#43,#42,#41,#3F,#3E,#3D,#3B,#3A,#39,#37,#3 6,#34,#33,#32
DB #30,#2F,#2D,#2C,#2A,#29,#27,#26,#24,#23,#21,#20,#1 E,#1D,#1B,#1A
DB #18,#17,#15,#14,#12,#11,#0F,#0D,#0C,#0A,#09,#07,#0 6,#04,#03,#01

ZXMAK
23.06.2015, 07:06
Новая тестовая версия со звуком ковокс-бластера в спринтере: https://drive.google.com/file/d/0B3Ubk04ABqGfU1VpMnFmbEI5XzA/view?usp=sharing

удалось запустить звук в wavplayer, для этого пришлось прикрутить эмуляцию прерываний от звуковухи и похимичить с флагом готовности.
Также при включении частоты 109 кГц, пришлось сделать отключение ковокса, иначе в навигаторе курсоры бешенно мерцать начинают (от прерываний бластера), т.к. установливается значение #FF в порту #4E (включение прерываний + 109 кГц).
Видимо это прерывание как-то выключается, непонятно как.

Работает только 8-битный звук (моно и стерео), 16-битный почему-то шипит, видимо какой-то особый формат используется.

wavplayer почему-то со временем теряет синхронизацию, так и не понял почему, может на риале тоже так?

palsw
23.06.2015, 09:13
ZXMAK, wavplayer рабоатет отлично на реале со звуком 8 бит стерео 44кгц по 40мб файлы

http://www.youtube.com

А вот 16бит через примерно минуту начинает песня заикаться - переполняется буфер.Но если в ком строке поставить ключ h - то играет напрямую с диска и проблем нет с заиканием.

---------- Post added at 09:13 ---------- Previous post was at 08:51 ----------

в муляторе полная тишина на всех вариантах wav и demo7

Sayman
23.06.2015, 11:38
пересобрал тестовый файлик под расшаренную синусойду. во вложении архив с исходником под sjasm.

ZXMAK
23.06.2015, 12:53
ZXMAK, wavplayer рабоатет отлично на реале со звуком 8 бит стерео 44кгц по 40мб файлы

http://www.youtube.com

А вот 16бит через примерно минуту начинает песня заикаться - переполняется буфер.Но если в ком строке поставить ключ h - то играет напрямую с диска и проблем нет с заиканием.

---------- Post added at 09:13 ---------- Previous post was at 08:51 ----------

в муляторе полная тишина на всех вариантах wav и demo7

хм в эму ляторе и на 8 битах спустя время сбивается. На стерео быстрее. Заметил что сбивается когда полоска зашкаливает, а зашкаливает она когда много точек рисуется.
Видимо разница с эмулятором из-за прерываний. Чем блокируются прерывания от бластера после сброса (когда в #4E пишется ff)? И есть ли механизм блокировки прерываний от экрана в спринтере?
Чтобы звук с нормальной скоростью выводился пришлось сделать чтобы из порта #fe читалось состояние прерываний от бластера, а не старший бит счетчика. В коде плеера вывод продолжается только если в старшем бите #fe читается 1. Что не соответствует описанию. Может чтото тут напутано?

Не ясно также в каком формате 16бит стерео пишется? Почему в этом режиме шум? Там сжатие какоето используется?

Молчит очевидно потому что ты девайс CovoxBlaster не добавил, я его в конфиг спринтера не добавлял - нужно вручную через окно конфигурации машины добавлять :wink:

palsw
23.06.2015, 13:27
ZXMAK,
Молчит очевидно потому что ты девайс CovoxBlaster не добавил, я его в конфиг спринтера не добавлял - нужно вручную через окно конфигурации машины добавлять

да ,протормозил - добавил звук выше клавы. вавки играет но рвет звук немного на 8бит .
На 16 бит просто гонит цифровой шум .
demo7 совсем не так играет в мулятре.Попробую еще demo8 в муляторе.

Sayman,
тестовый файлик под расшаренную синусойду

в тестах demo7 и demo8 синусом и не пахнет - просто иголка 85гц

---------- Post added at 13:27 ---------- Previous post was at 13:26 ----------

ZXMAK,
хм в эму ляторе и на 8 битах спустя время сбивается.

пробуй запускать с ключем h мелодии .

ZXMAK
23.06.2015, 13:53
ZXMAK,

пробуй запускать с ключем h мелодии .

нужно разобраться почему есть разница между эмулятором и риалом. Подозреваю что чтото не так в прерываниях и/или старших битах порта #FE. Как вообще в спринтере работают прерывания от бластера и экрана (взаимоисключающие или оба могут приходить? как отключаются?)

По поводу 16 бит стерео - непонятно, откуда шум берется, даже если бы частота не совпадала, такого не должно быть. Видимо 16бит стерео как-то по особому работает.

palsw
23.06.2015, 15:00
исходников wavplay нету ? в нем еще один баг есть - все мелодии одинаково называются - softw.wav

---------- Post added at 14:11 ---------- Previous post was at 14:00 ----------

ага,исходники wavplay есть - там смотрите куда лезет и как при проигровании 16бит.
гляну еще исходники альтеры - может найду covoxblaster

---------- Post added at 14:28 ---------- Previous post was at 14:11 ----------

исходники звука ADHL есть - все там просто и расписано ,но где взять спеца в ADHL ?



-- ================================================== ===
-- === AUDIO OUT =======================================
-- ================================================== ===

DAC_DATA = DFFE(DFF(AUDIO_R15,CT2,,),!CT2,,,);

-- DAC_DATA = DFF(AUDIO_R15,CLK42,,);
-- DAC_DATA = AUDIO_R15;

DAC_WS = DFF(CTH1,CLK42,,);
DAC_BCK = DFF(CT2,CLK42,,);

AUDIO_R[15..0].clk = CLK42;
AUDIO_R[15..0].ena = !CT2 & DFF(CT2,CLK42,,);

AUDIO_CH = DFF(((CTH0,CT[5..3]) == 15),CT2,,);

IF AUDIO_CH THEN
AUDIO_R[15..0].d = AY_CHS[15..0];
ELSE
AUDIO_R[15..0].d = (AUDIO_R[14..0],GND);
END IF;

-- ====== COVOX ==========

CBL_MODE = CBL_XX7;
CBL_STEREO = CBL_XX6;
CBL_MODE16 = CBL_XX5;
CBL_INT_ENA = CBL_XX4;

CBL_INT = DFF(GND,!CBL_CNT6,,(CBL_INT_ENA & (/IO or /M1)));

CBL_XX[].clk = /IOWR;
CBL_XX[].ena = DFF((DCPP[] == B"10001001"),CLK42,,); -- 89
CBL_XX[] = D[];

CBL_CTX[].clk = !CTH1;
CBL_CNT[].clk = !CTH1;

CASE CBL_XX[3..0] IS
WHEN 0 => CBL_TAB[] = 13; -- 16khz -- mono/stereo
WHEN 1 => CBL_TAB[] = 9; -- 22khz -- mono/stereo
WHEN 2 => CBL_TAB[] = 0; -- reserved
WHEN 3 => CBL_TAB[] = 0; -- reserved
WHEN 4 => CBL_TAB[] = 0; -- reserved
WHEN 5 => CBL_TAB[] = 0; -- reserved
WHEN 6 => CBL_TAB[] = 0; -- reserved
WHEN 7 => CBL_TAB[] = 0; -- reserved

WHEN 8 => CBL_TAB[] = 27; -- 7.8125 KHz -- mono/stereo 8/16 bit
WHEN 9 => CBL_TAB[] = 19; -- 10.9375 KHz -- mono/stereo 8/16 bit
WHEN 10=> CBL_TAB[] = 13; -- 15.625 KHz -- mono/stereo 8/16 bit
WHEN 11=> CBL_TAB[] = 9; -- 21.875 KHz -- mono/stereo 8/16 bit
WHEN 12=> CBL_TAB[] = 6; -- 31.25 KHz -- mono/stereo 8/16 bit
WHEN 13=> CBL_TAB[] = 4; -- 43.75 KHz -- mono/stereo 8/16 bit
WHEN 14=> CBL_TAB[] = 3; -- 54.6875 KHz -- mono/stereo 8/16 bit
WHEN 15=> CBL_TAB[] = 1; -- 109.375 KHz -- mono/stereo 8/16 bit
-- WHEN 15=> CBL_TAB[] = 0; -- (218.75)KHz -- stereo 110 only
END CASE;

IF (CBL_CTX[] == 0) THEN
CBL_CTX[].d = CBL_TAB[];
ELSE
CBL_CTX[].d = CBL_CTX[] - 1;
END IF;

CASE (CBL_STEREO,LCELL(CBL_CTX[] == 0)) IS
WHEN 0,2 => CBL_CNT[].d = CBL_CNT[];
WHEN 1 => CBL_CNT[].d = CBL_CNT[]+1;
WHEN 3 => CBL_CNT[].d = CBL_CNT[]+2;
END CASE;

CBL_CNT[].clrn = CBL_MODE;

CBL_IND = CBL_CNT7 xor CBL_WA7;

-- CBL_WR = DFF((DCPP[] == B"10001000"),CLK42,,) & !/IOWR; -- 88

CBL_WR = (DFF((DCPP[] == B"10001000"),CLK42,,) & !/IOWR) or
(DFF((DECODE.PAGE[7..0] == B"11111101"),CLK42,(CBL_INT_ENA & ACC.ACC_DIR1),) &
!DFF((DECODE.MC_WRITE or DECODE.CAS),CLK42,,/RESET));


CBL_WAE = CBL_MODE16 & DFF(!CBL_WAE,!CBL_WR,,CBL_INT);

CBL_WA[].clk = !CBL_WR;
CBL_WA[].ena = !CBL_WAE;

CBL_WA[7].clrn = CBL_MODE & CBL_INT_ENA & (CBL_INT or !CBL_CNT7);
CBL_WA[7].prn = (CBL_INT or CBL_CNT7);

CBL_WA[6..0].clrn = CBL_MODE & CBL_INT_ENA & CBL_INT;

CBL_WA[].d = CBL_WA[] + 1;

CBD[].clk = !CBL_WR;
CBD[].ena = CBL_WAE;
-- CBD[].d = D[];
CBD[].d = ACC.MDO[7..0];
CBD[].clrn = CBL_MODE16;

CBL.wren = (CBL_WR & !CBL_WAE);

-- CBL.data[] = ((D7 xor CBL_MODE16),D[6..0],CBD[]);
CBL.data[] = ((ACC.MDO15 xor CBL_MODE16),ACC.MDO[14..8],CBD[]);

CBL.wraddress[] = ((!A[15..8]) & !CBL_INT_ENA) xor CBL_WA[];

CBL.wrclock = CLK42;
CBL.wrclken = VCC;
CBL.rden = VCC;
CBL.rdaddress[] = (CBL_CNT[7..1],LCELL((CBL_CNT0 & !CBL_STEREO) or (AUDIO_CH & CBL_STEREO)));
CBL.rdclock = CLK42;
CBL.rdclken = VCC;

CBL_R[].ena = DFF((CBL_MODE or (CBL_WR)),CLK42,,);

CBL_R[].CLK = CLK42;
CBL_R[15].prn = /RESET;
CBL_R[14..0].clrn = /RESET;
CASE CBL_MODE IS
WHEN 0 => CBL_R[] = (D[7..0],B"00000000");
WHEN 1 => CBL_R[] = CBL.q[];
END CASE;

-- ====== AY-3-8910 ========

AY3.CLK42 = CLK42;

AY3./RESET = /RESET;
AY3.AY_T[8..0] = (CTH[2..0],CT[5..0]);

AY3.AY_D_WR = DFF((DECODE./IOM or /WR) or !DFF((DCPP[] == H"91"),CLK42,,),CLK42,,);
AY3.AY_A_WR = DFF((DECODE./IOM or /WR) or !DFF((DCPP[] == H"90"),CLK42,,),CLK42,,);

AY3.D[7..0] = D[];
AY3.BEEPER = BORDER4;

-- AY3.DO[7..0] : OUTPUT;

-- AY3.AY_CH_A[3..0] : OUTPUT;
-- AY3.AY_CH_B[3..0] : OUTPUT;
-- AY3.AY_CH_C[3..0] : OUTPUT;

AY_FULL[].clk = CLK42;

-- AY_CHS[].clk = !CTH0;
AY_CHS[].clk = !DFF((CTH1 & (CTH0 or !CT5)),CLK42,,);
AY_CHS[].ena = VCC;

-- AY_FULL[] = (GND,AY_CH_L[]) + (GND,AY_CH_R[]);

CASE DFF(CTH0,CLK42,,) IS
WHEN 0 => AY_FULL[] = (AY3.AY_CH_L[],GND);
WHEN 1 => AY_FULL[] = (AY3.AY_CH_R[],GND);
END CASE;

-- AY_CHS[].d = (((GND,AY_FULL[]) + (VCC,CBL.q[15..5])),B"0000");

-- AY_CHS[].d = (((GND,AY_FULL[]) + (VCC,CBL.q[15..8],B"000")),B"0000");
AY_CHS[].d = (((GND,AY_FULL[]) + (VCC,CBL_R[15..5])),CBL_R[4..1]);


---------- Post added at 14:56 ---------- Previous post was at 14:28 ----------

еще один есть плеер wav от Алексей Гавриленко 18.01.2000 но он хочет предварительно запустить cashdos.exe . Нужно ан реале запустить проверить

---------- Post added at 15:00 ---------- Previous post was at 14:56 ----------

http://i.piccy_.info/i9/b6cd6841fa58dcc4cb1c7b950085245f/1435060795/8856/877399/Bezymiannyi_500.jpg (http://piccy_.info/view3/8385543/1f62a7505f22180c780c4c305fa70258/)http://i.piccy_.info/a3/2015-06-23-11-59/i9-8385543/500x90-r/i.gif (http://i.piccy_.info/a3c/2015-06-23-11-59/i9-8385543/500x90-r)

Sayman
23.06.2015, 16:26
ну судя по коду ahdl у блястера-таки есть какие-то прерывания. не шибко спец я чтобы понять с какой периодичностью.
никакого сжатия нет. все данные ваф файла как есть кидаются в буфер бластера.

Sayman
23.06.2015, 20:21
подсунул вафку 8бит, стерео, 44кгц. эмуль выдаёт жесточайшее квантование! 16бит всё играет вместо музыки просто цифровой шум.

еще один есть плеер wav от Алексей Гавриленко 18.01.2000 но он хочет предварительно запустить cashdos.exe . Нужно ан реале запустить проверить

этот плеер был ещё для спринтера 97. на наших оно играть не будет хоть как.

palsw
23.06.2015, 21:18
Sayman, жалко,на него тоже исходники есть

Sayman
23.06.2015, 21:29
palsw, не жалко. на нормальный ивановский плеер тоже есть исходник.

ZXMAK
24.06.2015, 03:52
подсунул вафку 8бит, стерео, 44кгц. эмуль выдаёт жесточайшее квантование! 16бит всё играет вместо музыки просто цифровой шум.

этот плеер был ещё для спринтера 97. на наших оно играть не будет хоть как.

Ты хотел сказать срывы синхронизации? Квантования там быть не должно, тем более жесткого. наоборот - играет лучше чем если напрямую плеером из windows открыть. Т.к. эмулятор делает передискретизацию на частоте 21 МГц с децимацией до частоты выбранной через порт #fe (для 44кгц это 43 с копейками килогерц) с фильтром..
Нужно отметить что плеер не всегда запускается нормально, часто бывает сразу после запуска синхронизация нарушена, со временем она восстанавливается, потом опять нарушается, т.е плеер почемуто не может засинхронизироваться на back buffer страницу бластера и начинает писать в активную... Что весьма странно. Ведь по логике синхронизация по прерываниям не должна нарушаться. Вероятно из #fe должен читаться старший бит счетчика, но не во время прерывания, Иначе невозможно понять какую страницу сейчас обрабатывает бластер (отсюда и срывы синхронизации).

Проблема синхронизации как-то связана с прерываниями и возможно особенностями акселератора для #fd страницы. Demo7 действительно сейчас отличается от видео, хотя до изменений добавляющих прерывания от бластера и запись в бластер акселератором все было один в один. Нужно разобраться.

Судя по AHDL счетчик у бластера всетаки декрементируется, хотя в той версии эмулятора что я выложил инкрементируется. Пробовал менять - получается искажение звука, которое можно пофиксить если при записи в #fd страницу делать запись в бластер с инверсным адресом. Результат идентичный инкременту счетчика (как сейчас работает).

Т.е много вопросов к тому, как происходят прерывания от бластера, когда они блокируются, что же на самом деле читается из порта #fe (сейчас в эмуляторе состояние INT, которое длится 32 такта). Со старшим битом счетчика в #fe плеер работает некорректно, т.к. пока в прерывании из #fe читается 0, он в бластер не пишет вообще, т.е. скипает половину буфера. Получается что плеер использует этот бит чтобы проверить что прерывание пришло от бластера. Это не вяжется с описанием этого бита как старшим битом счетчика. Т.е. с битом D7 порта #fe тоже загадка.

Непонятно блокируются ли как-то прерывания экрана. В эмуле они ничем сейчас не блокируются, пробовал блокировать при включении прерываний от бластера - на синхронизацию звука в плеере это заметно не влияет.

С акселем есть прикол с которым пришлось столкнуться. вначале я сделал запись в бластер при любой записи в #fd страницу, но всплыла проблема - плеер читает с винчестера данные... тоже в #fd страницу. Более того, плеер не ограничивает облать записи 256 байтами, а пишет в бластер последовательно по всей странице памяти! В итоге при обращениях к винту было щелканье в бластере. Я это пофиксил записью в бластер только если запись идет акселератором.
Отсюда вытекает, что либо счетчик у бластера всетаки 14 разрядный, либо запись в бластер идет только из акселератора, но не при обычной записи в память, либо ПЛИС не делает запись в бластер при чтении с винта командой INI...

palsw
24.06.2015, 11:51
наверное баян,но все же

ZXMAK
25.06.2015, 00:36
наверное баян,но все же

к сожалению ничего по бластеру не нашел.
Разбирался в чем причина. Похоже весь вопрос в том что читается из порта #FE. Точно понять логику по фрагменту ADHL сложно, судя по AHDL за этот бит похоже отвечает CBL_IND, а на нем чтото очень хитрое накручено:



CBL_IND = CBL_CNT7 xor CBL_WA7;

-- CBL_WR = DFF((DCPP[] == B"10001000"),CLK42,,) & !/IOWR; -- 88

CBL_WR = (DFF((DCPP[] == B"10001000"),CLK42,,) & !/IOWR) or
(DFF((DECODE.PAGE[7..0] == B"11111101"),CLK42,(CBL_INT_ENA & ACC.ACC_DIR1),) &
!DFF((DECODE.MC_WRITE or DECODE.CAS),CLK42,,/RESET));


CBL_WAE = CBL_MODE16 & DFF(!CBL_WAE,!CBL_WR,,CBL_INT);

CBL_WA[].clk = !CBL_WR;
CBL_WA[].ena = !CBL_WAE;

CBL_WA[7].clrn = CBL_MODE & CBL_INT_ENA & (CBL_INT or !CBL_CNT7);
CBL_WA[7].prn = (CBL_INT or CBL_CNT7);

CBL_WA[6..0].clrn = CBL_MODE & CBL_INT_ENA & CBL_INT;

CBL_WA[].d = CBL_WA[] + 1;


дебажил код плеера. Вся загвоздка в том, что он начинает писать в бластер следующие 128 байт, только если по прерыванию из статуса бластера в порте #FE прочиталась 1. Т.к. по документации на этот флаг, он отражает какая половинка буффера бластера сейчас проигрывается, плеер с такой логикой просто не может работать, но работает. AHDL только подтверждает, что логика этого бита не простая.

Может ктото знает почему плеер на каждую половину буффера ожидает в порте #FE единичку?

Пробовал разные догадки, но они не подтвердились. Максимум что удалось добиться - звук играет с формальным соответствием документации, но в прерывании костыль - подставлять в #FE состояние INT. Частота, скорость при этом нормальные, но слышно постоянное потрескивание от сбоя синхронизации...

Также, не получилось добиться нормальной работы прерываний от бластера, сразу после сборса. При этом в порт 4e пишется #FF, т.е. частота 109 кГц с прервываниями. Но спринтер от такого режима начинает себя неадекватно вести - курсор в навигаторе бешенно мерцает, задержек на детектирование винчестеров нет - система без задержек за секунду в навигатор грузится... Пока приходится блокировать прерывания в таком режиме...

palsw
25.06.2015, 00:46
ZXMAK, может на реале что то можно прояснить - тесты какие то по запускать?

ZXMAK
25.06.2015, 01:01
Смотрел реализацию акселей, их можно немного ускорить, доработкой эмуляции Z80. Для этого можно добавить регистрацию кастомных обработчиков для нужного опкода. Тогда не нужно будет в каждом цикле проверять опкод.

---------- Post added at 01:01 ---------- Previous post was at 00:52 ----------


ZXMAK, может на реале что то можно прояснить - тесты какие то по запускать?

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

Можно попробовать проверить несколько моментов - сохраняется ли этот флаг при повторном чтении из #FE? Есть предположение, что он из прерывания один раз читается, 1-ка если прерывание от бластера пришло. В этом случае при повторном чтении флаг будет меняться.
Второй вариант - проверить как долго этот флаг не меняется при чтении сразу после прерывания. Идея в том что он может некоторое время после прерывания от бластера быть в 1-ке, после чего переходить в обычный режим - отображать состояние старшего бита счетчика.
Третий - проверить есть ли разница при чтении из #FE в прерывании от бластера и сразу после завершения обработчика. Возможно плис отслеживает вход/выход в обработчик.

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

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

CBL.wraddress[] = ((!A[15..8]) & !CBL_INT_ENA) xor CBL_WA[];


CBL_WA завязан на бите включения 16 битного режима
А что значит !A[15..8] - толи это константа, толи значение адресных линий- хз, я в AHDL практически не понимаю.
Чисто интуитивно по описанию счетчики угадываю и из этого строю предположения как это работает :)
тут же вроде есть специалисты по AHDL, может помогут разобраться?

Нужно будет попробовать сгенерить wav файл с 1,2,3,4,5,... 0,0,0,0... 1,1,1,1,1... 2,2,2,2 по 128 байт и посмотреть что плеер на бластер выдает

ZXMAK
26.06.2015, 19:51
Получилось добиться стабильной синхронизации в плеере спринтера для обоих режимов - 8бит/моно и 8бит/стерео.
Для этого из порта #FE читается бит прерывания, который устанавливается при переходе между банками буффера бластера и сбрасывается на средине банки или если произведена запись в бластер.

Если плеер начал играть с нормальной синхронизацией, то держит ее стабильно.
Но при запуске плеера, синхронизация не всегда корректная. Т.е. плеер не всегда синхронизируется начиная писать в бластер.
Может и на живом спринтере так-же?

palsw
26.06.2015, 19:57
ZXMAK,
Может и на живом спринтере так-же?

8 бит всегда играет нормально от начала и до конца.
16 бит вначале играет нормально,потом буфер глючит - примерно через 1 мин и начинаются заикания.Если поставить ключ - h - тогда всегда играет нормально от начала и до конца

ZXMAK
26.06.2015, 20:05
ZXMAK,

8 бит всегда играет нормально от начала и до конца.
16 бит вначале играет нормально,потом буфер глючит - примерно через 1 мин и начинаются заикания.Если поставить ключ - h - тогда всегда играет нормально от начала и до конца

ну с 16 бит пока неизвестно в каком формате они в бластер пишутся.
Т.е. на 8 битах плеер всегда запускается без сбоев синхронизации?

И еще вопросик - вот эти Demo7 и Demo8, они на риале тоже так работают что звук затухает и появляется опять при нажатии кнопки? Или это какой-то баг?

palsw
26.06.2015, 20:27
ZXMAK,
Т.е. на 8 битах плеер всегда запускается без сбоев синхронизации?

да

ZXMAK
27.06.2015, 04:37
Сделал тестовый билд 2.9.3.3: https://drive.google.com/file/d/0B3Ubk04ABqGfVDB0TzFZWUlEUWs/view?usp=sharing

Ковокс бластер работает с плеером, как 8 битный, так и 16 битный звук.
Не уверен что прерывания от бластера реализованы именно так как в риале, но плеер во всех режимах работает нормально.
Есть проблема со 109 кГц звуком, система часто включает этот режим, но из-за каких-то особенностей с прерываниями, прерывания бластера начинают мешать системе. Поэтому в этом режиме прерывания и звук отключены, хотя счетчик продолжает работать (нужно для синхронизации плеера).

Как выяснилось, бластер использует 512 байт буффер для 16-битного звука. Не совсем ясно как в этом режиме можно писать в старшую банку через порт #4F. Пока сделал чтобы при записи через порт, запись шла в неактивную банку...

ZXMAK
28.06.2015, 02:58
Ну для начала норм. Хотелось бы конечно статистику, и даже по возможности типа "сколько рисуется второй экран", но для этого нужны наверное скрипты для эмуля, чтобы можно было ставить условия на память и порты.
А эта Debug Info рисуется только поверх экрана? Сбоку можно?

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

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

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

Вообще, ZXMAK2 - единственный эмулятор отладчик которого позволяет в любой момент поменять текущий такт кадра и тайминги при этом не нарушаются. Все будет выполняться также, как будто код сам попал на заданный такт кадра.
Чтобы поменять такт кадра достаточно кликнуть в отладчике на строчке frmT=xxxx. В этой строчке отображается текущий такт кадра.

При отладке мультиколора для contended memory, я столкнулся с тем, что ни в одном эмуляторе невозможно нормально просимулировать выполнение кода на нужном такте. Во всех эмуляторах код работает корректно, только если дошел до прерывания своим ходом. Воздействие на счетчик тактов приводит к некорректной обработке прерываний. Что обидно, это происходит незаметно и обнаружить можно только увидев что прерывание не сработало в расчетный момент. Как пример Spectaculator, Spin и т.п. Поэтому в ZXMAK2 я постарался реализовать полноценную поддержку изменения счетчика тактов в отладчике на лету.

Экспериментируя с halt, обнаружил что в StartTact, отображаемый в DebugInfo, не всегда показывает ожидаемое значение. Задумывалось это значение как первый такт кадра, на котором процессор уже мог обработать прерывание. Из-за особенностей цикла эмуляции, получилось что значение в StartTact попадает часто уже после обработки сигнала прерывания. Что вобщемто тоже удобно.
Но... обнаружилось что иногда значение в StartTact меньше, чем в начале обработчика прерывания, после небольшого исследования выяснилось, что в StartTact может попасть значение такта на префиксном цикле Z80 (т.е. после обработки префикса, но до обработки самой префиксированной инструкции).
Т.е. следует учитывать, что StartTact отображает первый такт кадра не только в начале полного цикла, но и в начале цикла обработки префиксной инструкции.

ZXMAK
28.06.2015, 12:19
Как вам новый дизайн отладчика?
http://savepic.ru/7451368.png

Все окошки можно сайзить, перетаскивать, докать, открывать, закрывать.
Может чтото перекрасить? :smile:

Нужны иконки 16x16 для кнопок и менюшек в отладчике , может ктото нарисует?

NovaStorm
28.06.2015, 13:10
Например если прийдет прерывание не от экрана
Оо
Мы же о спектруме, да?


Можно в лог писать такт каждого хальта, чтобы без остановок прокрутить код и посмотреть по логу статистику.
Вот такого бы и хотелось. У меня идёт отрисовка кадра почти два фрейма, прерывания работают только между отрисовками через те же два фрейма. Но на *****й буржуйской untermaschine из-за тормозной памяти всё нахрен срывается и вместо двух, тратится три кадра =(
Вот, отрубая куски отрисовки, я и хотел попрофайлить. А так как цикл по тактам весьма нестабильный, то и хотелось именно статистику, от и до.

ZXMAK
28.06.2015, 23:45
Оо
Мы же о спектруме, да?


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

ZXMAK
29.06.2015, 02:00
Пара десятков строчек кода и вот запасной рендерер работает под Linux (без Wine) :cool:

http://savepic.ru/7468638m.png (http://savepic.ru/7468638.htm)

потыцал, вроде все фичи работают :biggrin:
Нет только звука и клавиатуры...

http://savepic.ru/7431761m.png (http://savepic.ru/7431761.htm)

ZXMAK
29.06.2015, 04:46
Уже с клавиатурой :cool:

http://savepic.ru/7420503m.png (http://savepic.ru/7420503.htm)

кому интересно, может сбилдить посмотреть, запасной рендерер автоматически включается при сбое рендерера Direct3D.
Он медленный и кушает процессор (на двухядерном процессоре загрузка порядка 37%), т.к. работает через winforms, но зато работает без дополнительных библиотек.

Чтобы клавиатуру включить нужно в unity.config в разделе winforms заменить вот этот кусок:


<register type="IHostKeyboard" mapTo="HostKeyboard_Mdx">
<constructor>
<param name="form" />
</constructor>
<lifetime type="transient" />
</register>


на вот этот:


<register type="IHostKeyboard" mapTo="HostKeyboard_WinForms">
<constructor>
<param name="form" />
</constructor>
<lifetime type="transient" />
</register>


Тестовый билд 2.9.3.4: https://drive.google.com/file/d/0B3Ubk04ABqGfazJKb0ZsejI2NHc/view?usp=sharing
Что нового:
- небольшие оптимизации Z80
- добавлен UI для нового дебаггера (пока включается через unity, т.к. ничего кроме окон и команд с кнопочками еще не работает);
- отрефакторен код BusManager, теперь подписка на ивенты через свойство Events (изменения затрагивают все девайсы);
- пофикшены баги с фокусом при закрытии окна отладчика;
- исправлены вызовы timeBeginPeriod/timeEndPeriod и логирование ошибки для этих вызовов. Раньше timeEndPeriod мог в некоторых случаях вызваться даже если приложение не закрывается.
- добавлен WinForms рендерер для Linux;
- добавлена WinForms клавиатура для Linux (стрелки не работают, в качестве Symbol Shift - Ctrl);
- мелкие доработки по обработке ошибок под Linux

размер релиза немного вырос на 300 кб, т.к. добавлена библиотека с докинг панелью для нового отладчика

ZXMAK
01.07.2015, 07:12
Если у кого-то есть идеи или пожелания по поводу внешнего вида для отладчика прошу написать здесь. Раньше писали различные идеи, чтобы ничего не забыть, давайте это соберем тут, пока актуально :)

На данный момент новый отладчик выглядит так:
http://savepic.ru/7482535.png

Пока не комиттил, еще не все готово :)

AndyD
01.07.2015, 11:15
Если у кого-то есть идеи или пожелания
Можно помощи попросить,мне нужен эмуль чтобы на смук были открытые порты,то есть не через ТрДос,а напрямую,нужно для отладки прожки.Тогда попользуюсь отладчиком,потестирую.

ZXMAK
01.07.2015, 13:29
Можно помощи попросить,мне нужен эмуль чтобы на смук были открытые порты,то есть не через ТрДос,а напрямую,нужно для отладки прожки.Тогда попользуюсь отладчиком,потестирую.

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

---------- Post added at 13:29 ---------- Previous post was at 13:24 ----------


Колонку с тактами сделать отключаемой. Нет таблички с памятью адресуемой регистрами. В текущем отладчике только 5 кнопок, это сохраниться? Мышку не предлагать.
Неплохо бы рассмотреть возможность подключаемых LUA скриптов. Ими можно выводить отладочную информацию, игровую графику и т.д.

а где колонка с тактами? :confused_std:
Такты теперь в статус баре отображаются.
LUA врядли буду прикручивать - много лишнего тянет, скрипты можно будет на C# прикрутить. Всякие примочки типа отладочных тулов, скриптов и т.п. - это потом можно будет как модуль к отладчику прикрутить. Пока важно сам отладчик до ума довести - дизайн допилить, брейкпоинты добавить и т.п.

Вот последний вид отладчика, регистры уже редактируются. Память пока нет, код уже в TFS, для нового отладчика добавлен девайс DEBUGGER EX:
http://savepic.ru/7478494.png

из основных фич планируется:
- Step Out (пока не ясно как условие проверять);
- Точки останова (список точек, останов по доступу к памяти/портам, условные точки останова (регистр, память, доступ к памяти/портам);
- окно Call Stack;
- Ассемблер (это пока низкоприоритетная фича, планируется вызывать внешний exe типа sjasm, какой exe, его параметры и как забирать результат будет настраиваться)

yashcher
01.07.2015, 23:40
Возможно ли сделать режим при котором выстраивались бы хотя бы процентов на 70-80 исходники игры на основе проигрования RZX?

ZXMAK
02.07.2015, 00:53
Возможно ли сделать режим при котором выстраивались бы хотя бы процентов на 70-80 исходники игры на основе проигрования RZX?

и встраивались в rzx? :smile:

yashcher
02.07.2015, 16:54
и встраивались в rzx? :smile:

Я имел в виду режим трейсинга в отладчике, когда при проигровании rzx выстраивается исходник программы. (http://zx-pk.ru/showthread.php?t=24557&highlight=rzx) Вопрос только, чтобы не путался код если будут переключения банок ОЗУ или динамический код, который всё время изменяется. Итоговый результат в ASM.

MetalliC
02.07.2015, 17:28
yashcher,
эмм, я так понимаю речь о обычном трейс логе ? который потом можно скормить скрипту IDA, который отдизасмит команды по адресам из лога и возможно проставит в комментарии еще какую полезную инфу, на пример чтоб было видно какой код исполнялся а какой нет ?
приблизительно вот так - дизасм и каменты "code used" проставлены автоматом, скриптом (процессор не Z80, но я думаю смысл понятен)
http://i69.fastpic.ru/thumb/2015/0702/e1/c9e3bcec49c7373b0f52a77306c771e1.jpeg (http://fastpic.ru/view/69/2015/0702/c9e3bcec49c7373b0f52a77306c771e1.png.html)

ZXMAK
02.07.2015, 23:48
Я имел в виду режим трейсинга в отладчике, когда при проигровании rzx выстраивается исходник программы. (http://zx-pk.ru/showthread.php?t=24557&highlight=rzx) Вопрос только, чтобы не путался код если будут переключения банок ОЗУ или динамический код, который всё время изменяется. Итоговый результат в ASM.

на мой взгляд бесполезная фича. Т.к. логи ("исходник") растущие по 300-500 мегабайт в секунду врядли можно назвать полезными... :smile:
За час проигрывания rzx, такими исходниками будет полностью забит 2 терабайтный винчестер.
Кто, чем и как это будет смотреть и тем более использовать?

У Z80 тактовая частота 3.5 МГц, у спринтера 21 МГц, т.е. от 1 до 5 миллионов строк в секунду... ;)

MetalliC
03.07.2015, 00:41
ZXMAK, для этого в отладчиках у этой функции есть ключики "только новый код" ;) то есть в лог пишутся только опкоды впервые выполненные по какому-то адресу. в случае спека128 итп еще и страницу надо будет учитывать. а даже и без такой фичи полезно иметь детект лупов, и если цикл крутится 100500 раз не писать столько раз тело цикла лог, а только раз с указанием сколько оно крутилось.

зы: дебагеры которыми лично я пользуюсь и считаю "нормальными" такое умеют ;) собсно это одна из причин почему ими и пользуюсь, в MAME/MESS например

Alex Rider
03.07.2015, 00:43
Хочется такие фичи:
1. Несколько неперекрываемых окон памяти с указанием номера страницы. Если возможно, отображение блоков памяти устройств (например, GS). Отображение памяти байтами, ASCII, словами.
2. Watch List - отображение значений выражений с использованием регистров процессора и устройств (например, последнего выданного значения в #7ffd, регистров AY, GS). Соответственно, устройства должны уметь это для отладчика выдавать. Фичу показа памяти по содержимому регистров процессора можно добавить в этот Watch List (желательно сделать байтами, буквами и словами на выбор).
3. Условные точки останова с учетом подключенных в адресное пространство страниц и по результатам вычисления выражений со значениями регистров, памяти, региситров устройств, текущего такта фрейма, начала отрисовки указаной строки экрана.
4. Статистика среднего времени исполнения кода от точки A до точки B (минорный реквест).
5. Перенастраиваемые хоткеи. Желательно иметь встроенную схему Unreal Spectrum и/или Visual Studio, дабы не перепривыкать.
6. Поддержка (в том числе, в поиске и выражениях) меток и точек останова sjasm plus. Показ меток sjasm как хинтов при наведении на знечения в памяти, значения регистров, результата вычисления в Watch List.
7. Read/Write блока памяти в bin, hex (не обязательно), дизасм, scr (bmp, png, ...), файл tr-dos. Можно сделать плагинами, кому надо, сделают и в tap, и в is-dos, и в cp-m и так далее.
8. Система плагинов для графического представления спрайтов в памяти (минорный реквест).
9. Просмотр текущих экранов как полностью, так и часть, нарисованную лучом.
10. Редактирование команд в дизассемблере с поддержкой меток. Ну, на худой конец, кодов команд.
11. Bookmarks и стек переходов по адресам, в том числе, и в окнах Memory.
12. Переход (смена текущего адреса) в Memory по значению выражений (в том числе, с регистрами процессора, значений памяти, регистров устройств).
13. Аналогичный дебаггер GS (минорный реквест).
14. Маскированный поиск по памяти цепочек байтов, слов, символов.

Sayman
08.07.2015, 11:02
ZXMAK, архиважная тема - добавь уже наконец поддержку master и slave для винтовых девайсов. мне щас глюк править нужно с работой двух девайсов, а в эмуле нет поддержки.

palsw
09.07.2015, 22:13
Некоторые наблюдения.

1.при загрузке Sprinter в окне логов картина такая

http://i.piccy_.info/i9/9f415265b46d9ef94c66b685cd78f245/1436468871/57225/877399/zagruzka_500.jpg (http://piccy_.info/view3/8456919/e8edd8675a120b967dab5e119c78d179/)http://i.piccy_.info/a3/2015-07-09-19-07/i9-8456919/500x252-r/i.gif (http://i.piccy_.info/a3c/2015-07-09-19-07/i9-8456919/500x252-r)

ВГ93 дергает 3 раза в логе ,все остальное ковокс-бластер. Если нажать esc то в окно лого каждый раз добавляется одна строчка.Что то пишет в ковокс?
Если закрыть эмулятор то окно логов вместе с ним закрывается.

2.Если выбрать в панели FN диск А или B то в окне логов непрерывно бегут логи ВГ93.Если закрыть эмулятор окно логов не закрывается и логи ВГ93 бегут

http://i.piccy_.info/i9/0a6ecf7e1a136fdabbffc5cf5a9cf61a/1436469052/53839/877399/vg93_500.jpg (http://piccy_.info/view3/8456930/16c52133713c6937f7a119d009dcc0ca/)http://i.piccy_.info/a3/2015-07-09-19-10/i9-8456930/500x248-r/i.gif (http://i.piccy_.info/a3c/2015-07-09-19-10/i9-8456930/500x248-r)

3.Если убрать галку на защиту записи диска А и попробовать делать формат FFormat 1.3 то в начале форматирования зависает

4.Если в настройках выбрать образ диска B то в FN при открытии диска B пишет INVALID MEDIA

5.Если в настройках убрать галочку NO delay ВГ93 то при открытии диска А в FN зависает сразу без отдачи каталога.

ZXMAK
11.07.2015, 01:45
Некоторые наблюдения.

1.при загрузке Sprinter в окне логов картина такая

http://i.piccy_.info/i9/9f415265b46d9ef94c66b685cd78f245/1436468871/57225/877399/zagruzka_500.jpg (http://piccy_.info/view3/8456919/e8edd8675a120b967dab5e119c78d179/)http://i.piccy_.info/a3/2015-07-09-19-07/i9-8456919/500x252-r/i.gif (http://i.piccy_.info/a3c/2015-07-09-19-07/i9-8456919/500x252-r)

ВГ93 дергает 3 раза в логе ,все остальное ковокс-бластер. Если нажать esc то в окно лого каждый раз добавляется одна строчка.Что то пишет в ковокс?
Если закрыть эмулятор то окно логов вместе с ним закрывается.

2.Если выбрать в панели FN диск А или B то в окне логов непрерывно бегут логи ВГ93.Если закрыть эмулятор окно логов не закрывается и логи ВГ93 бегут

http://i.piccy_.info/i9/0a6ecf7e1a136fdabbffc5cf5a9cf61a/1436469052/53839/877399/vg93_500.jpg (http://piccy_.info/view3/8456930/16c52133713c6937f7a119d009dcc0ca/)http://i.piccy_.info/a3/2015-07-09-19-10/i9-8456930/500x248-r/i.gif (http://i.piccy_.info/a3c/2015-07-09-19-10/i9-8456930/500x248-r)

3.Если убрать галку на защиту записи диска А и попробовать делать формат FFormat 1.3 то в начале форматирования зависает

4.Если в настройках выбрать образ диска B то в FN при открытии диска B пишет INVALID MEDIA

5.Если в настройках убрать галочку NO delay ВГ93 то при открытии диска А в FN зависает сразу без отдачи каталога.

у тебя в конфигурации машины включено логирование для вг93 и ковокса. Закрой эмулятор, удали файл с конфигурацией машины zxmak2.vmz, запусти заново. В настройках выбери модель спринтера и получится конфигурация по умолчанию. Там логирование отключено. Винт настраивать заново не нужно - подхватится существующий файл vmide

Как альтернатива, можно в существующем файле VMZ заменить аттрибуты logIo="True" на logIo="False"

Настроить логи можно в log4net.config, чтобы их вообще отключить можно этот файл удалить или переименовать, например в log4net.config.bak

palsw
11.07.2015, 08:39
ZXMAK, так я спецом врубил логи ,зачем мне их отключать. Просто есть баг в логах ВГ93 .
Тут читал архивы старые и находил упоминание о использовании для проигрывание таймера Z80 и прерывание по этому таймеру.если интересно - подкину файлик.может наведет на какие мысли по ковоксу.

ZXMAK
11.07.2015, 09:20
По 2-му пункту логи бегут после закрытия эмулятора потому что они в буффер складываются, чтобы не задерживать эмуляцию, а из буффера постепенно выгружаются на диск и в консоль (если включена), насколько хватает скорости диска и консоли. Консоль очень медленная, поэтому если она включена, то логи очень медленно выгружаются.

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

У z80 частота 3.5 мгц, в твоем логе записи (судя по дампу счетчика тактов) каждые 15 тактов пишутся, т.е. в лог пишется 233000 строк в секунду (по ≈80 символов - это 18,6 мегабайт текста в секунду), конечно консоль с таким потоком не справляется )

nzeemin
04.02.2016, 12:22
ZXMAK, обратите внимание на то как сделана сборка трассы выполнения в эмуляторе Altirra -- это довольно продвинутый эмулятор Atari:
http://www.virtualdub.org/altirra.html
http://atariage.com/forums/topic/216515-debugging-using-altirra/?p=2827027
Команда .pathrecord начинает запись пути выполнения -- в памяти формируется дамп, причём прохождение одних и тех же адресов повторно не записывается.
Команда .pathdump filename выгружает этот дамп в виде дизассемблированного кода.
Это довольно удобно, например, гоняешь игровой цикл и сразу получаешь дамп кода который в него входит. Или отдельно остановил перед прыжком игрока, начал трассу, остановил сразу после и посмотрел какой код за это отвечает.
Плюс есть окно History -- когда остановил выполнение, то сразу видишь серию команд предшествующую останову, причём она даже циклы умеет сворачивать.

Sayman
04.02.2016, 12:46
В режиме эмуляции спринтера по прежнему косяк с CBL, а так же если в конфу добавить AY, то он играет на частоте 21мгц (AY).

ZXMAK
06.02.2016, 07:11
ZXMAK, обратите внимание на то как сделана сборка трассы выполнения в эмуляторе Altirra -- это довольно продвинутый эмулятор Atari:
http://www.virtualdub.org/altirra.html
http://atariage.com/forums/topic/216515-debugging-using-altirra/?p=2827027
Команда .pathrecord начинает запись пути выполнения -- в памяти формируется дамп, причём прохождение одних и тех же адресов повторно не записывается.
Команда .pathdump filename выгружает этот дамп в виде дизассемблированного кода.
Это довольно удобно, например, гоняешь игровой цикл и сразу получаешь дамп кода который в него входит. Или отдельно остановил перед прыжком игрока, начал трассу, остановил сразу после и посмотрел какой код за это отвечает.
Плюс есть окно History -- когда остановил выполнение, то сразу видишь серию команд предшествующую останову, причём она даже циклы умеет сворачивать.

сохранять историю - это на производительности скажется очень серьезно. Сейчас эмулятор запоминает только адрес предыдущей инструкции (значение LPC в отладчике)

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


В режиме эмуляции спринтера по прежнему косяк с CBL, а так же если в конфу добавить AY, то он играет на частоте 21мгц (AY).

по CBL непонятно как прерывания от него работают на риале. Насколько помню при нулевом и единичном делителе как-то странно себя система себя вела.

По AY видимо проблема тоже в прерываниях.
А если речь о задающей частоте AY, то ее можно в файле vmz задавать, как и конфигурацию миксера (abc,acb, etc) и баланс. Ну и порты с маской для многих устройств можно задать, для всех звуковых точно.

Spectramine
06.02.2016, 13:08
ZXMAK, как включить дебаггер Adlers? Редактирования vmz-файла, как указано в хелпе, дает только пропадание пункта "Debugger" в меню (в актуальной версии эмулятора).

ZXMAK
06.02.2016, 13:20
ZXMAK, как включить дебаггер Adlers? Редактирования vmz-файла, как указано в хелпе, дает только пропадание пункта "Debugger" в меню (в актуальной версии эмулятора).

открываешь окно с устройствами, удаляешь Debugger и добавляешь нужный

Lethargeek
07.02.2016, 23:07
решил глянуть, что за эмуль хвалят в соседней ветке, запустил - сразу же нарвался на неудобства:

1) из джоев только кемпстон и мапится только на нумпад - а вот у меня ноут без нумпада, как быть?
хочу мапить любой джой на ctrl+arrows и одним щелчком переключать их на caps+cursor и обратно, как в zxspin

2) не нашёл, как отредактировать палитру (снова zxspin как пример)
некоторые игры (например, брунильда) выглядят в дефолтной ужасно
притом одной лишь корректировкой bright'а там не отделаешься

ZXMAK
09.02.2016, 10:02
решил глянуть, что за эмуль хвалят в соседней ветке, запустил - сразу же нарвался на неудобства:

1) из джоев только кемпстон и мапится только на нумпад - а вот у меня ноут без нумпада, как быть?
хочу мапить любой джой на ctrl+arrows и одним щелчком переключать их на caps+cursor и обратно, как в zxspin



вместо нумпада можно выбрать любой доступный системе джойстик в настройках



2) не нашёл, как отредактировать палитру (снова zxspin как пример)
некоторые игры (например, брунильда) выглядят в дефолтной ужасно
притом одной лишь корректировкой bright'а там не отделаешься

палитра не редактируется, объясняется динамической палитрой для некоторых ULA

Lethargeek
09.02.2016, 14:30
вместо нумпада можно выбрать любой доступный системе джойстик в настройках
расшифруй - это что, джойстик к эмулятору покупать? (совет типа "нету хлеба - ешьте пирожные")


палитра не редактируется, объясняется динамической палитрой для некоторых ULA
да у доброй половины клонов юлы-то не было, зато резюки подстроечные бывали
+ возможность покрутить настройки у телевизора (эмуль должен имитировать их локально)
и чем, собс-но, мешает динамическая палитра в случаях, когда доступна только стандартная?
zxspin же эмулирует ulaplus, что не мешает для стандартного режима свою иметь

Bedazzle
05.03.2016, 15:54
У меня под вин7 такое, можно как-то починить настройками?

http://i.imgur.com/ilIETJW.jpg

ZXMAK
30.03.2016, 11:29
У меня под вин7 такое, можно как-то починить настройками?


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

Spectramine
30.03.2016, 14:07
нужно выбрать ту-же конфигурацию спектрума, на которой записан RZX файл.
RZX чувствителен к точности эмуляции таймингов. Поэтому если эмуль на котором писался RZX имеет ошибки эмуляции, то воспроизвести такой RZX на другом эмуляторе будет проблематично. Т.к. для воспроизведения нужно чтобы эмулятор делал такие-же ошибки, как и при записи.

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

ZXMAK
30.03.2016, 22:00
Это не так. RZX специально разработан таким образом, чтобы отвязаться от точности эмуляции таймингов - для каждого фрейма в RZX файл пишется количество выборок кода операции.

да, задумывался. Но по факту RZX зависит от точности эмуляции таймингов. Там дело не в том сколько выборок перед прерыванием. А в том, что в RZX не предусмотрена информация когда начался импульс прерывания и когда закончился. Из-за неточности эмуляции таймингов в некоторых эмуляторах, может быть разброс в несколько тактов. В итоге это приводит к тому, что при других таймингах прерывание может отработать не в тот-же момент, как на эмуляторе, на котором производилась запись. Из-за этого происходит рассинхронизация.

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

Для примера, в rzx указано, что прерывание сработало на N-ой инструкции. Но не указано сколько тактов прошло от начала импульса прерывания до начала инструкции, на которой оно было обработано. В итоге эмулятор считает что прерывание всегда начинается с указанной инструкции. А на деле это мог быть последний такт активного сигнала INT. Поэтому когда выполнение попадет в обработчик прерывания, то при проигрываниии сигнал INT будет все еще активен и может сработать еще раз, если в обработчике быстро разрешить прерывания. Но при записи INT уже не был активен и повторно не срабатывал. Все... потеря синхронизации...

Корректно записать и воспроизвести такие моменты в RZX невозможно, т.к. в этом формате не предусмотрено сохранение полной информации о состоянии сигнала INT.

Shadow Maker
31.03.2016, 00:22
Корректно записать и воспроизвести такие моменты в RZX невозможно, т.к. в этом формате не предусмотрено сохранение полной информации о состоянии сигнала INT.
А галки типа "игнорить потерю синхронизации" нет? Как бы это реально в 90% случаев глубоко фиолетово, где там инт болтается.

Spectramine
31.03.2016, 22:46
да, задумывался. Но по факту RZX зависит от точности эмуляции таймингов. Там дело не в том сколько выборок перед прерыванием. А в том, что в RZX не предусмотрена информация когда начался импульс прерывания и когда закончился. Из-за неточности эмуляции таймингов в некоторых эмуляторах, может быть разброс в несколько тактов. В итоге это приводит к тому, что при других таймингах прерывание может отработать не в тот-же момент, как на эмуляторе, на котором производилась запись. Из-за этого происходит рассинхронизация.

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

Для примера, в rzx указано, что прерывание сработало на N-ой инструкции. Но не указано сколько тактов прошло от начала импульса прерывания до начала инструкции, на которой оно было обработано. В итоге эмулятор считает что прерывание всегда начинается с указанной инструкции. А на деле это мог быть последний такт активного сигнала INT. Поэтому когда выполнение попадет в обработчик прерывания, то при проигрываниии сигнал INT будет все еще активен и может сработать еще раз, если в обработчике быстро разрешить прерывания. Но при записи INT уже не был активен и повторно не срабатывал. Все... потеря синхронизации...

Корректно записать и воспроизвести такие моменты в RZX невозможно, т.к. в этом формате не предусмотрено сохранение полной информации о состоянии сигнала INT.

Всё намного проще. RZX формат изначально полностью отвязан от тактов и задержек, в том числе и от длительности сигнала INT. Есть пара неприятных нюансов, связанных с прерываниями, они решаемы (правда, через пень-колоду), но к тактам не имеют никакого отношения. Один я подробно изложил ранее в теме "Тестирование эмуляторов", второй связан с ретриггерингом прерываний.

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


А галки типа "игнорить потерю синхронизации" нет? Как бы это реально в 90% случаев глубоко фиолетово, где там инт болтается.

Такая галка нифига не решает, синхронизация для проигрывания RZX критически важна.

Bedazzle
03.04.2016, 11:03
нужно выбрать ту-же конфигурацию спектрума, на которой записан RZX файл.

А как узнать машину, если запись делал кто-то из интернетов? В начале файла виден текст Spectaculator.

Под рукой есть Emuzwin, запустил, тот переключился на +3.
Выбрал в Zxmak2 +2A/+3, загрузил rzx - ошибка. :/

goodboy
03.04.2016, 11:18
А как узнать машину, если запись делал кто-то
zxmak давал информацию при открытии rzx которая пишется в логах,
но потом вроде текст про это удалил
SpecEmu спокойно показывает этот rzx (+3)

Bedazzle
03.04.2016, 11:22
SpecEmu спокойно показывает этот rzx (+3)

Угу, я в трёх эмулях гонял без проблем, а с zxmak не сложилось.

Spectramine
04.04.2016, 00:58
проблема в tzx`e который выложил betamen - один блок в нём неправильный (loop=0), проверяйте версии с wos`a - они все рабочие.

если не трудно проверьте загрузку программ последней ревизии tzx 1.20 http://newton.sunderland.ac.uk/~mikie/examples120.zip

Если у кого-нибудь остался этот файл (examples120.zip) - поделитесь, плиз.

anasana
04.04.2016, 12:16
Если у кого-нибудь остался этот файл (examples120.zip) - поделитесь, плиз.
http://web.archive.org/web/*/http://newton.sunderland.ac.uk/~mikie/examples120.zip
(снапшот за 10-е февраля)

Eltaron
04.04.2016, 15:04
Всё намного проще. RZX формат изначально полностью отвязан от длительности сигнала INT.
Ага, отвязан... В rzx хранится всё, что читается из портов в каждый фрейм. Если у проигрывающей машины инт длинней, чем у записывающей, и из-за этого она успевает сделать дополнительный IN - синхронизация рвется, ибо ответить на этот запрос нечем. Если наоборот, инт длинней у записывающей, то при проигрывании пропустятся какие-то нажатия клавы - синхронизация один фиг тоже рвется.

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

Кстати, я собрал ZXMAK2 из сорцов и в этой версии heavyonthemagick.rzx (это ведь о нём (http://www.rzxarchive.co.uk/h.php) речь?) играется без ошибок. Там со времен "релизной" 2.9.2 много изменений было, например "add Spectrum +3 support for Z80 snapshot" - возможно, это оно.

CodeMaster
04.04.2016, 15:35
RZX формат изначально полностью отвязан от тактов и задержек, в том числе и от длительности сигнала INT.

Формат форматом, но его имплементация зависит от конкретного эмулятора. В описании RZX раздел посвящённый INT'у с рекомендациями как сделать воспроизведение INT-независимым.

Bedazzle
04.04.2016, 16:55
Кстати, я собрал ZXMAK2 из сорцов и в этой версии heavyonthemagick.rzx (это ведь о нём (http://www.rzxarchive.co.uk/h.php) речь?) играется без ошибок.

Да, про этот файл речь.

ZEman
04.04.2016, 18:43
Eltaron, а не можете выложить новенький билд куда-нибудь ?
пожалуйста :)

Spectramine
04.04.2016, 19:03
Формат форматом, но его имплементация зависит от конкретного эмулятора. В описании RZX раздел посвящённый INT'у с рекомендациями как сделать воспроизведение INT-независимым.

Если в эмуляторе RZX воспроизводится INT-зависимо, значит, программист неправильно понимает принцип воспроизведения RZX-формата. Нету там нигде никаких интов, а есть точное значение, сколько в каждом фрейме нужно выполнить выборок кода команд Z80. Выполнили, проверили триггер прерываний, если включен - зашли в обработчик - ВСЁ! Какие инты? Инты могут повлиять на запись RZX на разных эмулях, но воспроизведение уже созданного на всех эмулях должно идти одинаково. Забудьте про инты и задержки на время воспроизведения RZX, они не только не нужны, но и могут всё испортить, что в данном случае, похоже, и произошло.

Eltaron
04.04.2016, 19:22
Eltaron, а не можете выложить новенький билд куда-нибудь?
Да я думаю, проще подождать, пока ZXMAK новый релиз не сделает.
Впрочем, может новые баги найдёте :) Вот - http://dl.dropboxusercontent.com/u/4166599/zxmak2-binsnapshot-40049.zip

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


> Нету там нигде никаких интов
> в каждом фрейме

А позвольте поинтересоваться в целях увеличения образованности, а фрейм откуда отсчитывается?

Spectramine
04.04.2016, 19:40
А позвольте поинтересоваться в целях увеличения образованности, а фрейм откуда отсчитывается?

Он вообще не отсчитывается, не считая счётчика выборок кода операции.

Eltaron
04.04.2016, 19:54
счётчик выборок кода операции.
Также известный как "оставшееся количество фетчей до инта"

Вот только зачем он нужен, если нам наплевать на длину этого самого инта? Это ведь лишнее поле получается? Давайте напишем письмо в Ramsoft, пусть его уберут.

Spectramine
04.04.2016, 19:59
Также известный как "оставшееся количество фетчей до инта"

Вот только зачем он нужен, если нам наплевать на длину этого самого инта? Это ведь лишнее поле получается? Давайте напишем письмо в Ramsoft, пусть его уберут.

Извиняюсь, это не я тут туплю, так что ваш сарказм тут неуместен) Напишите, они оценят.

Eltaron
04.04.2016, 20:20
Извиняюсь, это не я тут туплю
Так вот я не уверен, если честно. Я-то этот rzx реализовывал ручками и рассинхронов на всю жизнь вперед насмотрелся. А от вас только какие-то общие соображения прочитавшего мануал человека слышны. Ни одного конкретного технического ответа.

Упростим задачу.

Представьте, что СССР в честь Олимпиады в Москве выпустил компьютер ZX-1980, у которого фрейм составляет 24 такта.

Грязный английский копипастер Слайв Кинклер решил скопировать архитектуру, но не нашел в лондонских магазинах К555ЛИ1, из-за чего был вынужден переделать схему, и его компьютер "ЯЧ Спектральный" имел 20 тактов на фрейм.

На московской Олимпиаде среди видов спорта был традиционный забег в АДСКОК, который выиграла дружественная нам сборная Зулугвая. RZX-файл с записью их триумфальной победы был разослан по телеграфу во все страны мира и правдами и неправдами, мольбами и подкупами оказался и у нашего Слайва. Вопрос: на каком фрейме у него произойдет срыв синхронизации при проигрывании на его "ЯЧ" RZX-файла, записанного на ZX-1980, если длительность команды IN A,(C) - 11 тактов.

Содержимое RZX:
Фрейм 1: влево, вниз
Фрейм 2: вниз, вниз
Фрейм 3: влево, влево.

Spectramine
04.04.2016, 20:34
Так вот я не уверен, если честно. Я-то этот rzx реализовывал ручками и рассинхронов на всю жизнь вперед насмотрелся. А от вас только какие-то общие соображения прочитавшего мануал человека слышны. Ни одного конкретного технического ответа.

Уж поверьте мне, я-то этот rzx тоже ручками реализовывал, и насмотрелся всякого) Я вам в паре предложений суть алгоритма плейбека RZX выложил, конкретно технически: "есть точное значение, сколько в каждом фрейме нужно выполнить выборок кода команд Z80. Выполнили, проверили триггер прерываний, если включен - зашли в обработчик - ВСЁ!" Дальше новый фрейм. Если вам до сих пор непонятно, ну извините, я умываю руки.

Eltaron
04.04.2016, 20:54
есть точное значение, сколько в каждом фрейме нужно выполнить выборок кода команд Z80. Выполнили, проверили триггер прерываний, если включен - зашли в обработчик - ВСЁ!
Лол. Я кароч почитал свой rzx-код - а он именно так и работает. Так что это действительно я туплю, прошу все мои понты считать гнилыми :v2_dizzy_facepalm:

Spectramine
04.04.2016, 21:25
Подкину ещё один слетающий (не сразу) в ZXMAK2 rzx файл, мне на него указал Woodster, после моего сообщения насчет неоднозначности в rzx: http://www.rzxarchive.co.uk/a/amaurote.rzx.
Там причина как раз в сомнительной ситуации, когда фрейм заканчивается командой EI. Хотя сразу после неё прерывание произойти не может, видимо, старые эмули этого не знали, соответственно, часть rzx архива не работает в ZXMak2 и FUSE (которые считают, что прерывания не было, раз после EI его быть не может). Приходится выбирать или совместимость со старыми rzx, или нативность выполнения z80. А при записи rzx избегать ситуации, когда фрейм заканчивается EI.

abelenki
05.04.2016, 04:04
Вот - http://dl.dropboxusercontent.com/u/4166599/zxmak2-binsnapshot-40049.zip
а что это за версия такая - 2.9.2.0? последняя тестовая версия, которую выкладывал ZXMAK2, новее - 2.9.3.4.

Eltaron
05.04.2016, 11:31
а что это за версия такая - 2.9.2.0? последняя тестовая версия, которую выкладывал ZXMAK2, новее - 2.9.3.4.
Без понятия, я не знаю, как идёт нумерация. Я собрал ревизию 40049 из репозитория, это крайняя ревизия от 30 марта.

ZXMAK
05.04.2016, 17:30
Без понятия, я не знаю, как идёт нумерация. Я собрал ревизию 40049 из репозитория, это крайняя ревизия от 30 марта.

версия с нулем в конце - это билд из репозитория.
Версия прописывается в .targets/Common.targets

tank-uk
02.05.2016, 20:26
ZXMAK, как обновить конфиг и ром в еве ?

ZXMAK
05.05.2016, 21:52
ZXMAK, как обновить конфиг и ром в еве ?

распаковать архив с ромами (roms.pak - это zip архив) в папку ROMS рядом с эмулятором, закинуть в папку новый ром и добавить секцию с именем нового ромсета в файле ~mapping.xml со ссылкой на новый файл.
После этого можно на вкладке памяти выбирать новый ромсет.

Сам файл roms.pak удалять не нужно. Эмулятор ищет вначале файлы в папке ROMS, если не находит нужного файла, тогда уже лезет в roms.pak. Это дает возможность в папку ROMS класть только файлы которые нужно подменить в roms.pak, не меняя сам архив.

tank-uk
05.05.2016, 22:52
ZXMAK, не хочет запускаться с новым ромом , в железном виде на еве еще обновляется бейсконфиг, куда его в эмуле подсунуть ?

Sayman
21.06.2016, 08:02
Какие-то жуткие косяки в работе с образами дисков. Образ *.img, с fat12 внутри. Делаю запись по секторам. почему то эмулятор делает запись не с начала сектора, а с какого-то смещения. На реале такой проблемы нет.

drbars
16.07.2016, 09:18
Вопрос к автору, есть ли возможность сделать в эмуляторе выгрузку файла командой из кода не в образ, а напрямую в папку винды?

rsorc
16.07.2016, 09:42
А в дебуггере - правая кнопка мыши и Save block - не оно?

Eltaron
16.07.2016, 16:48
Речь, наверное, о конвертации на лету папки с хобетными файлами в образ и обратно. Кстати, потенциально очень полезная фича. Но только это же не ерунда типа ленточных traps, тут придется навертеть килограммы эвристик, и то работать будет не всегда.

Максагор
18.07.2016, 18:21
Не прошло и двух лет, как я добрался до еще тогда обещанной темы.


хм, ATM4.50 тяжко писалась и потестить особо не начем было, с ATM7.10 проще

А можешь проверить, дешифрация портов правильная для ATM4.50?
Вот как они выбираются в ZXMAK2:

#FE - маска адреса #0001, выборка #0000 (есть подозрение что маска неправильная)
#FB - маска адреса #0004, выборка #0000
#7FFD - маска адреса #8202, выборка #0200
#FDFD - маска адреса #8202, выборка #8000
#7DFD - маска адреса #8202, выборка #0000

Updated: попробовал отключить перепутывание памяти - дема заработала на ATM4.50, но с палитрой всеравно чтото не так...

Кидаю сюда полную схему дешифрации портов АТМ1:

Обозначения адресных линий в портах здесь следующие:
"1" или "0" - однозначная обязательная установка или сброс соответствующего адреса при выборе порта.
"X" - значение этого адреса может меняться в зависимости от задач пользователя.
"n" - значение этих линий неопределено и в дешифрации адреса порта они не участвуют.

Также просьба уделить внимание описанию сигнала CPNET в порту out #FDFD.

Порт out #FE: (выборка: %nnnnnnnn XXXnX1n0)

Как и на любом Спектруме он управляет бордюром и звуком -
D0-D2 - цвет бордюра (8 цветов) – BRG
D3 - запись сигнала на магнитофон
D4 - управление звуковым каналом ("бипером")
D5-D7 - не используются.

Кроме стандартных функций введены новые, путем сброса в "0" некоторых адресных линий порта:

A7=0(именно адресная шина: то есть вывод не в #FE, а, например, в #7E! Не путать с шиной данных!!! В дальнейшем адресные шины будут обозначаться An: а шины данных - Dn) - CPUS: выключение ПЗУ, вместо него с адреса #0000 включается страница 0, а с адреса #4000 - страница 4 вместо страницы 5 с экраном(экран как и прежде располагается в 5(7) странице ОЗУ, но для доступа к нему необходимо включать эти страницы в верхней памяти по #7FFD). Это, естественно, нужно в CP/M, но ничто не мешает использовать его в обычном режиме. Правда в этом режиме недоступны порты TR-DOS, так что для работы с дисководом нужно прыгать в обычный режим: устанавливая в порте #FE линию A7 в единицу. Также не действует переключение ПЗУ через #7FFD (хотя ОЗУ, экраны, защелка верхней памяти работают): но попытавшись изменить через #7FFD сигнал ROM2: и включив позже ПЗУ обратно, вы увидите, что ваш труд не пропал даром!

A6 - RG0(A6=1 - RG0=1 и наоборот)
и
A5 - RG1(также как и с A6)

включение расширенных экранов, кроме того именно при обнулении RG0 происходит перепутывание памяти. Комбинации:

RG0=1 RG1=1 - sinclair-режим 256x192
RG0=0 RG1=1 - режим 640x200, атрибут на байт.
RG0=0 RG1=0 - режим 320x200, 16 цветов, аналог EGA.
RG0=1 RG1=0 - не используется...

-----------

A3 - Включение BRIGHT 1 для бордюра! То есть на бордюр можно выводить не 8, а 16 цветов!
(Значение бита инверсно, то есть A3=0 - BRIGHT1, A3=1 - BRIGHT0)

Маленькое НО: использование обнуления старших адресов порта #FE является не совсем удачным, так как возникла несовместимость с достаточно большим, пусть и не фатально, количеством ПО, которое вываливается в высокую графику и виснет из-за перепутывания памяти... Я это "вылечил" тумблером, которые когда надо блокировали обнуление при обращении к #FE адресов A7,6,5...

Порт in #FE: (выборка: %XXXXXXXX nnnnn1n0)

как и в стандартном Спектруме:

D0-D4 - чтение одной из пяти клавиш полуряда клавиатуры.
A8-A15 - выбор полурядов клавиатуры, путем сброса соответствующего бита в ноль.
D5 - "готовность АЦП" (аналогично #7FFD.7 для turbo 2+)
D6 - чтение сигнала с магнитофона.

Исключение -

D7 - это системный сигнал Z. Он активизируется (устанавливается в "1") строго через определенное время после INT. На этом строится защита ПЗУ CP/M в АТМ - оно закодировано (вернее та часть, которая перекидывается позднее в ОЗУ): и ключом к коду является подученное число тактов до установки Z.

Порт out #FB (выборка: %nnnnnnnn Xnnnn0n1) - вывод на принтер (centronix):

D0-D7 - данные. Также по #FB работает встроенный COVOX

A7=0 - строб данных, то есть вывод в на принтер осуществляется выводом в этот порт трижды -
OUT (#FB), A
OUT (#7B), A
OUT (#FB), A

А вообще-то это стандартный LPRINT III

Порт in #FB (выборка: %nnnnnnnn Xnnnn0n1) - чтение CENTRONIX:

D7 - BUSY с принтера ("0" - свободен, "1" - занят)
D6 - ULINE - для встроенного модема
D0-D5 - всегда в "1"

A7 - "1" - так называемый CPSYS: включение страницы ПЗУ под номером 0 с прошитой CP/M.
"0" - работа в стандартных для Спектрума страницах ПЗУ...

Всего в ПЗУ 27512 таких страниц 4 –
0 - CP/M
1 - TR-DOS 5.03
2 - BASIC 128
3 - BASIC 48

Включение CPSYS также блокирует переключение ПЗУ через #7FFD с сохранением выведенного числа до отключения этого режима. Зато сохраняется возможность доступа к портам TR-DOS (без включения ПЗУ TR-DOS). Для этого просто надо сделать CALL в промежуток от 15616 до 15871, где организованы нужные подпрограммы. Стандартным же образом доступ к этим портам и прекращается - путем выхода за пределы 16383.

В зависимости от режима работы карта памяти выглядит так:

Mode Sp-128 Sp-48 TR-DOS CP/M-sys CP/M-users
ROMs ROM2=0 ROM2=1 ROM2=0(!) ROM2=x ROM2=x
#0000 ROM-2 ROM-3 ROM-1 ROM-0 RAM-0
#4000 RAM-5 RAM-5 RAM-5 RAM-5 RAM-4
#8000 RAM-2 RAM-2 RAM-2 RAM-2 RAM-2
#C000 #7FFD-pgs #7FFD-pgs #7FFD-pgs RAM 1 or 3 RAM-3

Порт in/out #FA (выборка: %nnnnnnnn nnnnn0n0) - идет на внешний разъем - и представляет собой нечто похожее на системную шину:

Число выводимое/вводимое в/из него это D0-D7, а число выведенное в порт принтера #FB - это шина адреса A0-A7. К этому порту подключался программатор UNIPROG той же фирмы МикроАРТ.

Порт out #7FFD (выборка: %0nnnnn1n nnnnnn0n) - такой же как и в других Спектрумах:

D0-D2 - выбор одной из восьми страниц по 16Кб из 128Кб по адресу #C000.
D3 - номер видеостраницы
D4 - выбор одной из двух страниц ПЗУ: при 0 - BASIC-128, при 1 - BASIC-48
D5 - при равенстве 1 - блокирует порт #7FFD для совместимости со Спектрумом-48.
D6-D7 - не используются.

Порт in #7FFD (выборка: %0nnnnn1n nnnnnn0n) - для встроенного модема:

D0 – BELL
D1-D7 - всегда в "1"

Порты для AY (#FFFD и #BFFD) также стандартные...
(выборка: %11nnnn1n nnnnnn0n и %10nnnn1n nnnnnn0n соответственно)

Все остальные дополнительные порты образуются из порта #FD плюс
обнуление A9, что приводит к зависанию компьютера при использовании "половинки" #FD при переключении памяти и выводе звука на AY в программах для Пентагона... "Вылечил" тумблером, отрубающим A9 когда надо вручную...

Вот эти порты:

Порт out #7DFD (выборка: %0nnnnn0n nnnnnn0n) - порт палитры:

какой цвет из 16-ти в данный момент выводится на монитор (то есть лежит на шине данных контроллера графики), тот и подлежит замене. То есть это или текущий цвет бордюра, или текущий выводимый атрибут (или INK, или PAPER - в зависимости от того. Был ли установлен бит пикселя или нет).

D0-D5 – BRGbrg

Все биты цвета инверсны!!! То есть 0 - цвет включен, 1 - выключен.

brg - цвета с пониженной интенсивностью, раза в два тусклее цвета в режиме BRIGHT 0.
BRG - цвета обычной яркости - BRIGHT 0

При включении одновременно битов BRG и brg получается цвет повышенной яркости - BRIGHT 1.

Таким образом, каждый цвет из RGB имеет 4 градации яркости - от черного до BRIGHT1. Путем комбинации этих 6 битов и получаем 64 самых разнообразных оттенка.

Порт in #7DFD (выборка: %0nnnnn0n nnnnnn0n) - чтение с АЦП (covox наоборот):

D0-D7 - данные.

Порт out #FDFD (выборка: %1nnnnn0n nnnnnn0n) - системный:

D0-D1 - переключение расширенной памяти до 512Кб
D2 - ROM-диск, включение дополнительных 4-х страниц пзу, если в компе стоит не 27512, а 271000, а уж что ты туда прошьешь... Располагаются выше основных четырех страниц. В ATM-2 для использования этого наворота в CP/M прошит драйвер, а в ATM-1 "забыли"... Типа крутись сам...
D3 - CPNET - для нереализованных сетевых возможностей... Только лишь будучи установлен, приводит к зависанию при попытке обратиться к TR-DOS, ибо в этом случае при попытке обратиться в промежуток адресов РЗУ #3Dxx происходит переход не в ПЗУ TR-DOS (страница 1 в ROM-прошивке), а в ПЗУ CP/M (страница 0 в ROM-прошивке). В свое время авторы ПЗУ планировали вставить туда перехватчик обращений к портам TR-DOS, но так и не довели дело до конца, а аппаратная «мулька» осталась... Поэтому всегда это сигнал надо держать в "0"
D4 – TON
D5 – TNAB

эти биты для модема...

Порт in #FDFD (выборка: %1nnnnn0n nnnnnn0n) – НЕЗАДЕЙСТВОВАННЫЙ. Сигнал выборки на схеме дешифратора присутствует, но никуда не ведет. Теоретически возможно использовать под свои нужды.

Порты in/out #xF (выборка: %nnnnnnnn XXXnnn11) – порты BETA-disk интерфейса (#1F, #3F, #5F, #7F и #FF) – ТЕНЕВЫЕ.

апро
23.03.2017, 18:13
Del

abelenki
23.07.2017, 14:34
CodePlex закрывается (https://blogs.msdn.microsoft.com/bharry/2017/03/31/shutting-down-codeplex/).

ZXMAK2 будет на GitHub переезжать?

abelenki
01.10.2017, 10:46
подкажите, можно ли как-то запустить картридж (https://www.retroworks.es/php/download.php?file=ianna-cartucho.zip) игры The Sword of Ianna на ZXMAK2?

стандартные картриджи типа Panama Joe (http://www.worldofspectrum.org/pub/sinclair/games/p/PanamaJoe(Prototype1).rom.zip) (размером 16,384 байт) удавалось запустить переименовнием их в 48.rom, закидыванием в архив roms.pak/ZX048 и переключением модели на ZX Spectrum 48.

а вот как быть The Sword of Ianna? картридж весит 524,288 байт.

s_kosorev
01.10.2017, 10:52
инфа есть как переключать страницы?

Spectramine
01.10.2017, 10:52
подкажите, можно ли как-то запустить картридж (https://www.retroworks.es/php/download.php?file=ianna-cartucho.zip) игры The Sword of Ianna на ZXMAK2?

стандартные картриджи типа Panama Joe (http://www.worldofspectrum.org/pub/sinclair/games/p/PanamaJoe(Prototype1).rom.zip) (размером 16,384 байт) удавалось запустить переименовнием их в 48.rom, закидыванием в архив roms.pak/ZX048 и переключением модели на ZX Spectrum 48.

а вот как быть The Sword of Ianna? картридж весит 524,288 байт.

Нельзя, по идее. Картридж это же не только ПЗУ, но и схема по переключению страниц памяти. Его надо отдельно эмулировать.

Eltaron
24.01.2018, 16:17
Там, в общем, codeplex.com помер, сейчас работает только на чтение.
Я выдрал оттуда репозиторий со всеми коммитами и сконвертил в git. "Выдрал" - это самое подходящее слово, потому что из-за невероятно странной логики работы TFS с регистром в файловых именах и ещё более странной codeplex-овской схемы сопряжения TFS с svn сделать это нормальным путем - через "git-svn clone" оказалось невозможно.

На гитхабе уже было несколько зеркал, но все они представляют собой лишь снапшот определенной ревизии. Тут же вся история сохранена полностью. 1000 с лишним коммитов, жалко терять. ZXMAK, если будешь переезжать на гитхаб - форкай, сэкономишь время.
https://github.com/atsidaev/ZXMAK2

Плюс взял на себя наглость собрать рабочий эмуль из последней версии, что была в оригинальном репозитории. Там со времён последнего релиза было много изменений.
https://github.com/atsidaev/ZXMAK2/releases/tag/v2.9.2.40437

ZEman
24.01.2018, 18:07
а что вообще случилось, куда делся автор ?
также как и Кладов - потерял интерес, или что-то другое ?

Eltaron
25.01.2018, 14:05
а что вообще случилось, куда делся автор ?
также как и Кладов - потерял интерес, или что-то другое ?
Так ядро работает отлично, и 48К-128К модели сэмулированы. Это то, чего хватает 95% пользователей. Или разве остались какие-то проблемы?
У меня, к примеру, других эмулей даже и не стоит.

А эмуляцию других клонов или периферии можно реализовывать и без автора. Там же очень приятная плагинная архитектура, где наружу торчит этакий ZX-BUS.
Да и в целом внутри всё хорошо распилено на блоки и уровни абстрацкии. Сорцы и доступны, и понятны. А у Кладова совсем наоборот, и непонятны, и недоступны :)

NEO SPECTRUMAN
26.01.2018, 22:51
и непонятны, и недоступны
ну дык они и не доступны пушо стали непонятны самому Кладову :v2_dizzy_roll:

Максагор
26.01.2018, 22:59
Так ядро работает отлично, и 48К-128К модели сэмулированы. Это то, чего хватает 95% пользователей. Или разве остались какие-то проблемы?
У меня, к примеру, других эмулей даже и не стоит.

Автор сабжа запрашивал у меня подробности дешифрации портов АТМ-1 для внесения изменений в текущую версию эмуля. Я в этой ветке их выложил, но с тех пор минуло года два наверное, а реакции все нет.

abelenki
27.01.2018, 06:42
Eltaron, огромное человеческое спасибо!

Lethargeek
28.01.2018, 01:56
[01:34:12.816][6 ][FATAL] System.IO.FileNotFoundException:
System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "Microsoft.DirectX.Direct3DX.dll" либо одну из их зависимостей. Не найден указанный модуль.
Имя файла: 'Microsoft.DirectX.Direct3DX.dll'
но этот файл в каталоге эмуля существует, и в каталогах винды (десятки) есть либы directx9 :v2_unsur:

ZXMAK
12.02.2018, 02:10
но этот файл в каталоге эмуля существует, и в каталогах винды (десятки) есть либы directx9 :v2_unsur:

Видимо он не может загрузиться, т.к. в системе не найден соответствующий DirectX. Для эмулятора нужно установить DirectX 9.
Впринципе у меня есть код, который позволяет полностью выбросить MDX обертки и обращаться к DirectX напрямую, в том числе и в 64 разрядном режиме.
Есть и кроссплатформенный код для OpenGL, можно сделать единый exe, который будет работать под Linux, MacOS и Windows без перекомпиляции.
Но не знаю... нужно ли это кому-то сейчас...

drbars
12.02.2018, 07:26
ZXMAK, планируется ли поддержка портов ZX Spectrum Next ? ;)

http://www.specnext.com/tbblue-io-port-system/

Lethargeek
13.02.2018, 03:58
Для эмулятора нужно установить DirectX 9.
так он включен в состав win10, но версия d3dx9_43.dll, а эмулю нужна, как выяснилось, именно d3dx9_30.dll
может быть, стоит эту либу положить в архив с эмулятором? или пересобрать, чтобы и другие годились

MetalliC
13.02.2018, 15:14
так он включен в состав win10
нет не включен, вся эта кучка d3dx9_XX.dll и не только и есть "DirectX 9", и на десятку (и не только) его нужно устанавливать самостоятельно.

Максагор
13.02.2018, 17:24
Но не знаю... нужно ли это кому-то сейчас...

Приветствую! Будут ли учтены в вирт.машине мои уточнения по портам АТМ-1 вот тут? - http://zx-pk.ru/threads/16830-zxmak2-virtualnaya-mashina-zx-spectrum.html?p=878914&viewfull=1#post878914

Lethargeek
13.02.2018, 19:59
нет не включен, вся эта кучка d3dx9_XX.dll и не только и есть "DirectX 9", и на десятку (и не только) его нужно устанавливать самостоятельно
да, а это что тогда в system32 и syswow64?
d3d9.dll
d3d9on12.dll
d3dx9_43.dll
кучки разные для разных версий с разными буквами

MetalliC
13.02.2018, 22:08
да, а это что тогда в system32 и syswow64?
помните были дистрибутивы DX (и SDK) а-ля "август 2007" "ноябрь 2009" ? каждый из них добавлял библиотеки с очередной цифиркой. итого d3dx9_XX накопилось аж двадцать штук, с 25 по 43. в зависимости от того, с использованием какой версии DirectX SDK было скомпилировано приложение - оно потребует ту или иную версию .DLL-ек.

а в десятке решили не париться и вкинули только последние ревизии.
то есть, на 10ке "из коробки" будут работать только игры скомпилированные с самым последним DirectX SDK, а для игр или программ собранных с более старыми SDK нужно установить DirectX redist.

Lethargeek
13.02.2018, 22:45
итого d3dx9_XX накопилось аж двадцать штук, с 25 по 43
у меня намного меньше в старом компе, и ранние не требовались ни разу

ZXMAK
14.02.2018, 04:33
так он включен в состав win10

нет, в win10 из коробки есть только DirectX 10. Чтобы запустить программы под DirectX 9, его нужно дополнительно устанавливать.
Какие-то библиотеки от 9 может и присутствуют, но только те, что нужны для работы DirectX 10.

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



Порты in/out #xF (выборка: %nnnnnnnn XXXnnn11) – порты BETA-disk интерфейса (#1F, #3F, #5F, #7F и #FF) – ТЕНЕВЫЕ.

что значит теневые? такая выборка конфликтуют с выборкой порта #FB (covox) и портом #CF (IDE).
Как это разруливается в ATM?

Максагор
22.02.2018, 19:46
что значит теневые? такая выборка конфликтуют с выборкой порта #FB (covox) и портом #CF (IDE).
Как это разруливается в ATM?

"Теневые", значит, что видны только при активированном ПЗУ TR-DOS. Про IDE в ATM-turbo 1 (v4.xx и 5.20) и слыхом не слыхивали - оный появился гораздо позднее, в АТМ-2, но там и карта портов иная.

Насчет порта #FB перепроверю - возможно я что-то упустил.

s_kosorev
06.03.2018, 17:24
Получился битый репозитарий https://github.com/atsidaev/ZXMAK2/tree/master/ZXMAK2.Engine.Cpu/Processor
Тут 2в1, т.е. текущая версия и по всей видимости до какого рефакторинга

ZXMAK
10.07.2018, 13:55
вот последняя версия с моего диска, это то что я заливал последний раз на codeplex. Почистил проекты от привязки к codeplex.
https://drive.google.com/file/d/1hgziiQRBF7vYia65ecVWj8fXucpaF6uO/view?usp=sharing

Для первой сборки нужен доступ в инет - nuget скачает библиотеки log4net и Unity


На кодеплексе остались кой-какие шельвы, например код записи видео эмулятора в MP4. Но шельвы к сожалению уже не доступны.
Остались только либы, не уверен, возможно код записи в MP4 где-то остался, если так - вот либы, я их отдельно запаковал:
https://drive.google.com/file/d/1jRXooSzeXqT37-0FtoufoqTcv7dbSERz/view?usp=sharing

Добавлено: код записи видео сохранился, он лежит в сборке ZXMAK2.Host.Media, которая в проект не включена.
Но её немного починить надо.

ZXMAK
10.07.2018, 16:23
Немного почистил сборку, удалил nuget, чтобы не тянуло мусор из инета. Нужные библиотеки положил в папку Libraries.
Поправил также код ZXMAK2.Host.Media (в проект не включена, т.к. под неё нет UI).
https://drive.google.com/file/d/1qQNvRdyQ9NJe-rXIlUMH90_-arwFbmtz/view?usp=sharing

Заметки по сборке:
- Собирать в режиме Release x86 (Managed DirectX библиотеки расчитаны только на x86)

- Для запуска под отладчиком выключить галочку Debug->Exception => Managed Debugging Assistans -> Loader Lock -> Thrown (это баг Managed DirectX).

- чтобы при сборке прописывалась версия (она пишется во все dll) нужно раскоментить строку в .targets\Common.targets:


<!-- Uncomment for automatic set assembly version -->
<Import Project="CommonAssemblyVersion.targets" />

Когда эта штука включена редактор студии может глючить (не находит референсы, кидает ворнинги). На компиляцию это не влияет, но редактировать и отлаживать код мешает. Поэтому по дефолту обновление версии отключено. При компиляции с выключенным обновлением версии, версия будет отображаться как 0.0.0.0

- Для записи видео нужно создать экземпляр MediaRecorder и присвоить его _host.MediaRecorder в ZXMAK2.Host.WinForms.Views.MainView
Например можно добавить в конец метода MainView.OnLoad (когда _host уже присвоен):


_host.MediaRecorder = new ZXMAK2.Host.Media.MediaRecorder("C:\\test.mp4", renderVideo.Width, renderVideo.Height);


В итоге эмулятор будет писать видео с начала запуска... Удобно для покадровой отладки, т.к. эмулятор пишет в файл 50 герцовую развертку, т.е. все кадры, но MP4 немного размывает изображение.

Для записи звука можно аналогично создать SoundRecorder:


_host.MediaRecorder = new ZXMAK2.Host.Media.SoundRecorder("C:\\test.wav", _host.SampleRate);


Запись видео и звука при работе в режиме MaxSpeed работает с нормальной скоростью (без пропуска кадров), что можно использовать для быстрой записи видео. Записанное видео можно просматривать на хорошем видеоплеере с видеоресамплером, или на дисплее с 50 Гц разверткой - это позволяет качествено рассмотреть мультиколорные эффекты.


Эта сборка исходников включает все библиотеки, в том числе и для записи видео.

Sayman
10.07.2018, 17:04
ZXMAK, а ты уже всё, эмуль не будешь дальше пилить? а то я хотел тебя попросить о паре доработок...

ZEman
10.07.2018, 17:13
очень надеюсь что ZXMAK2 не будет заброшен, живых эмуляторов спека осталось - по пальцам руки можно пересчитать.
в общем ждём и надеемся :)

Vadim
10.07.2018, 17:15
Если ZXMAK2 эмулирует ВГ93 (я не помню просто), порт 1FFD от +3, микросхему контроллера +3, а таже подключение винта к +3 - то это было бы замечательно. Ну мне ещё нужна эмуляция винта Профи, порты Профи. Пока есть только версия unreal которая это тянет и всё.

ZXMAK
10.07.2018, 19:03
Ну я думаю небольшой апдейт сделать, заменить костыли от Managed DirectX на прямые вызовы к DirectX.
Это значительно уменьшит размер кода эмулятора, должно немного увеличить скорость и добавить поддержку 64-разрядных систем.
О большем пока не думал. Времени уже сколько прошло, сейчас это если кому-то и интересно, то единицам...

Профи в ZXMAK давно эмулируется и эмуляция винта есть. А вот контроллера от +3 нет, там не ВГ93, а чтото другое вроде...

Spectramine
10.07.2018, 19:08
А вот контроллера от +3 нет, там не ВГ93, а чтото другое вроде...

Там http://www.cpcwiki.eu/index.php/765_FDC.

Vadim
11.07.2018, 10:38
там не ВГ93, а чтото другое вроде...
Не вроде, а абсолютно точно, контроллер как на ПЦ

goodboy
11.07.2018, 11:03
контроллера от +3 нет, там не ВГ93, а чтото другое вроде...
для этого есть DLL которую используют некоторые эмули, но найти описание проблематично
"fdc765.dll by Woody is a Windows dynamic link library to allow emulators to read and write DSK files"

SoftLight
11.07.2018, 12:32
В 2017 Студии у меня не собирается Host.WinForms:

Error CS0012 The type 'IsConstModifier' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.VisualC, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. ZXMAK2.Host.WinForms C:\Users\User\Desktop\ZXMAK2-SRC-codeplex-final-fix\ZXMAK2.Host.WinForms\Mdx\DirectKeyboard.cs 37 Active

Много таких ошибок и все на этот компонент. В GAC проверил стоит Microsoft.VisualC 8.0.0.0 это мне где надо в проекте поправить чтобы собрать проект?

update: все собралось, просто жмакнул чекбокс тут:
https://thumb.ibb.co/dh0KsT/2018_07_11_12_39_30.png (https://image.ibb.co/buzqz8/2018_07_11_12_39_30.png)

ZXMAK
12.07.2018, 17:27
Заменил Managed DirectX библиотеки DirectSound и DirectInput на прямые обращения к DirectX.
Direct3D в процессе...

Просьба, у кого есть джойстик, проверить - не отвалилась ли работа джойстика? :smile:

Звук, клавиатура и мышь проверены, но есть не нулевая вероятность что где-то и они могли отвалиться. Тоже не помешает проверить.

https://drive.google.com/file/d/11HFWe9xk78KH7OsbNO33WdYG8imSq4MG/view?usp=sharing

ZEman
12.07.2018, 18:01
Просьба, у кого есть джойстик, проверить - не отвалилась ли работа джойстика?
вы про нумпад в неастройках "other - joystick kempston" ?
проверил - работает.

а что за версия такая странная 0.0.0.0

ZXMAK
12.07.2018, 18:11
вы про нумпад в неастройках "other - joystick kempston" ?
проверил - работает.

а что за версия такая странная 0.0.0.0

нет не про нумпад, а про реальный джойстик.
Девайс, да "Other - KEMPSTON JOYSTICK", только у него в настройках нужно выбрать не "Keyboard Numpad", а реальный джойстик подключенный к компу.

goodboy
12.07.2018, 18:19
у кого есть джойстик, проверить - не отвалилась ли работа джойстика?
похоже не работает.
в настройках он виден. usb xbox controller
а print in 31 выдаёт нули (проверил нажатие всех кнопок/стиков)
..........
и после выхода из эмуля (win8.1) на экране остаётся консольное окно
простым кликом его не закрыть.

ZEman
12.07.2018, 18:56
и после выхода из эмуля (win8.1) на экране остаётся консольное окно
простым кликом его не закрыть.
это проблемма виндовс 8 а не эмулятора.
у меня десятка - нормально выходит и консольное окно закрывается.

проверил на геймпаде logitech F310 - определяется в эмуляторе, но кнопки не работают.

и ещё, странность - жму на иконку quick boot (дисплей с молнией) и у меня появляется экран с надписью r tape loading error из какой-то игры, хотя я ничего не загружаю, что за ???

Максагор
12.07.2018, 19:30
Ну я думаю небольшой апдейт сделать, заменить костыли от Managed DirectX на прямые вызовы к DirectX.

Все-таки дорихтовать порты АТМ было бы совсем круто. Если еще не, конечно....

ZXMAK
13.07.2018, 07:16
похоже не работает.
в настройках он виден. usb xbox controller
а print in 31 выдаёт нули (проверил нажатие всех кнопок/стиков)


хм.. а в старой версии раотал?

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



и ещё, странность - жму на иконку quick boot (дисплей с молнией) и у меня появляется экран с надписью r tape loading error из какой-то игры, хотя я ничего не загружаю, что за ???

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

goodboy
13.07.2018, 09:29
в 2.8.0 37493 контроллер работает

ZXMAK
13.07.2018, 13:41
goodboy, а ошибок в логе никаких нет?
Путь к лог файлу прописан в log4net.config
В тестовой версии там прописано C:\Logs\ZXMAK2.log

ZXMAK
13.07.2018, 15:10
goodboy, хм... логика вроде вся сохранилась, у меня были подозрения, что список устройств может отвалиться, а тут наоборот... :)
Похоже с форматом данных от джойстика какой-то косяк... Надо посмотреть...
Ни на кнопки, ни на рычаг не реагирует?

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

Похоже нашел баг - не проверялась ошибка device.Poll. :)

Вот поправленый вариант:
https://drive.google.com/file/d/1gdEgu8s732B7eSl9eNwcvuqmd0yW1ott/view?usp=sharing

так работает?

ZEman
13.07.2018, 15:26
не работает, и консоль почему-то стала не закрываться.

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

а можете мне скинуть ту старую версию эмулятора 2.8.0 37493.
хочу на ней проверить.

goodboy
13.07.2018, 16:32
так работает?
нет

ZXMAK
13.07.2018, 16:45
образы бинарников для разных версий я не хранил, так что они ушли вместе с codeplex сервисом.

Вот версия 2.9.3.4, собранная из последнего варианта сырцов, которые на codeplex заливались:
https://drive.google.com/file/d/1xtPU6QLA5Zwx8h-7gafmPE_uQxe84vm8/view?usp=sharing


Странно что джойстик не заработал, прийдется разбираться.
Я тут заканчиваю портирование MDX.Direct3D на прямые вызовы к DirectX.
Так что отложу джойстик, будем потом все вместе тестить.

goodboy
13.07.2018, 16:56
версия 2.9.3.4
в ней джой работает

ZEman
13.07.2018, 17:36
тоже геймпад заработал.
а консоль остаётся если закрывать эмулятор нажимая мышкой на крестик.
если выбирать в меню "exit" то всё закрывается как положенно.