PDA

Просмотр полной версии : Эмулятор УКНЦ - UKNCBTL



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

nzeemin
25.05.2012, 18:28
В JEK.SAV картинка по прежнему застревает на третьей заливке.
Скорость вывода на экран стала не реально большой, раза в три.
Duble Intrlaced это хорошо, еще бы оставить Duble без Intrlaced.

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

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


Случайно заметил, что эмулятор от 23.10.2011 работает почти в два раза быстрее, чем от 02.10.2011. Интересно, почему?

http://nzeemin.livejournal.com/329172.html
Гонял профайлер на макинтоше, заинлайнил пару функций обращения к памяти.

Vamos
25.05.2012, 22:05
Можете это описать как цельный тест-кейс? То есть ссылку где взять диск (желательно один), по шагам что за чем запускать и нажимать.
http://zx.pk.ru/showpost.php?p=302625&postcount=188

Здесь попытки Alex_K что-то сделать:
http://zx.pk.ru/showpost.php?p=426298&postcount=407
http://zx.pk.ru/showpost.php?p=426380&postcount=408
http://zx.pk.ru/showpost.php?p=426381&postcount=409
http://zx.pk.ru/showpost.php?p=426419&postcount=410

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

Patron
25.05.2012, 23:30
сделать отдельное сохранение настроек (*.INI) для каждой запущенной копии эмулятора. Что-бы можно было соединить через com0com два эмулятора.Вряд ли такое возможно.

Проще, наверное, продублировать (скопировав) каталог с эмулятором и настраивать эти копии по-разному.

Vamos
25.05.2012, 23:51
Вряд ли такое возможно.

Проще, наверное, продублировать (скопировав) каталог с эмулятором и настраивать эти копии по-разному.
Можно и из другого каталога, только сейчас файл ini сохраняется где-то в системных папках. И я знаю программы которые одним ярлыком запускаются вроде с разными настройками (есть чекбокс "разрешить(запретить) запуск второй копии программы").

Patron
26.05.2012, 00:34
Можно и из другого каталога, только сейчас файл ini сохраняется где-то в системных папках. И я знаю программы которые одним ярлыком запускаются вроде с разными настройками (есть чекбокс "разрешить(запретить) запуск второй копии программы").Когда запущены несколько процессов одного EXE-файла - трудно чётко определить какой из процессов должен использовать какой INI-файл ( в такой ситуации, в общем случае - количество процессов и количество INI-файлов не совпадает ).

Я у себя в "эмуляторе ДВК" сделал так, что имя INI-файла всегда совпадает с именем файла эмулятора (если INI-файл с таким именем отсутствует - эмулятор его создаёт). Это даёт возможность иметь в одном каталоге несколько копий эмулятора с разными именами и не путаться в настройках ( при этом запуск двух процессов одного EXE-файла не допускается ).

Vamos
26.05.2012, 22:43
Patron, Разобрался, да, в реальности разные папки с ini файлами.

nzeemin
28.05.2012, 01:06
На диске GD.DSK стоит посмотреть две демонстрашки - очень красиво.

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

http://youtu.be/XmflcGDBygY

shattered
28.05.2012, 08:07
Интересно, это (пакет инженерной графики) разработка с 0 или порт Графора (например)?

Vamos
30.05.2012, 23:55
nzeemin, тут еще по поводу эмуляции дисковода, может поможет.

Titus
http://zx.pk.ru/showpost.php?p=469948&postcount=366
Alex_K
http://zx.pk.ru/showpost.php?p=469986&postcount=368

nzeemin
03.06.2012, 20:10
Убедился что в эмуляторе можно подготовить полноценный образ винчестера для использования с драйвером WD, сделал подробную инструкцию со скриншотами:
http://code.google.com/p/ukncbtl/wiki/IDEHDD#Подготовка_образа_HDD_в_э муляторе
Системный диск с правильными WDX и WDR лежит тут: http://ukncbtl.googlecode.com/svn/trunk/src/UKNCBTL.TB/data/sys1002wdx.dsk

nzeemin
08.07.2012, 18:44
Во вложении 26-я бета.
Изменения:
- добавлена индикация вращения двигателя диска -- слово Motor в строке статуса
- настройки теперь хранятся в .ini-файле рядом с .exe-файлом -- раньше хранились в реестре

http://ukncbtl.googlecode.com/files/UKNCBTL-beta26-exe.zip

nzeemin
13.07.2012, 22:42
Добавил четвёртый режим экрана -- 960 x 576 -- увеличение 1,5 x 2, с интерлейсом.

Titus
14.07.2012, 01:03
Добавил четвёртый режим экрана -- 960 x 576 -- увеличение 1,5 x 2, с интерлейсом.
Добавь еще 1.25 x 2, и будет, как на реале)

shattered
14.07.2012, 02:27
а можно поступить, как MAME/MESS и пользоваться шейдерами. будет 100% тру :-)

http://forums.bannister.org/ubbthreads.php?ubb=showflat&Number=69832

nzeemin
14.07.2012, 17:03
Режим экрана №5 -- 1280 x 864 -- увеличение 2 x 3.
Соответственно, тратит гораздо больше процессорного времени и памяти.

nzeemin
27.07.2012, 12:42
На TestBench собрал пять случаев где по каким-то причинам программа застрявает или не запускается. В четырёх случаях из этих пяти помогает "передёргивание" дисковода -- повторное подключение того же диска (в том числе третья заливка в JEK). Т.е. однозначно указывает на проблемы с эмуляцией флоппи. Что в общем не удивительно -- обработка ошибок там сейчас никакая -- сначала пытались сделать лишь бы было, дальше нужно повышать надёжность.

"Lode Runner" с диска ITO90 -- не понял как его запустить, только гуляет между заставкой и таблицей рекордов.

Titus
27.07.2012, 13:48
"Lode Runner" с диска ITO90 -- не понял как его запустить, только гуляет между заставкой и таблицей рекордов.
Пробел вообще-то)

Vamos
28.07.2012, 03:00
В четырёх случаях из этих пяти помогает "передёргивание" дисковода -- повторное подключение того же диска (в том числе третья заливка в JEK). Т.е. однозначно указывает на проблемы с эмуляцией флоппи.

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

Titus
28.07.2012, 03:02
Мне тут подумалось, а если сделать так, чтобы эмулятор мог работать с физическим флопповодом.
А смысл?

hobot
28.07.2012, 03:19
Пробел вообще-то)

Информация верная ))) Пробел(!) Классный на УКНЦ- Lode - очень плавный,
и там кстати есть редактор уровней, вечная жизнь (фикс+Ю),
перескочить в следующий уровень (ФИКС+N) и что то там ещё ФИКС+ что то - я всё уже и не помню :redface:


http://savepic.net/3176473.gif
http://savepic.net/3177497.gif


nzeemin, вот только что забрал 2.8 версию - буду смотреть, огромное спасибо, уже оценил ОГРОМНЫЙ экран )))

http://savepic.net/3164185.gif

Vamos
28.07.2012, 03:22
А смысл?

А смысла вообще ни в чем и ни где нет :)

Titus
28.07.2012, 03:27
А смысла вообще ни в чем и ни где нет :)
Смысл есть во всем)
Легче наделать образов, тем более, что софта под УКНЦ с гулькин нос. А с образми работать удобнее, чем дрючить диск.

nzeemin
14.08.2012, 00:57
Добавил возможность сохранения скриншота в формате PNG (4-битный нежатый, 94011 байт), в диалоге сохранения скриншота поставил этот формат по умолчанию, также можно выбрать BMP (4-битный нежатый, 92278 байт) из списка типов.

Предваряя вопрос "зачем?" -- как-нибудь думаю сделать сохранение анимации в формате APNG.

nzeemin
16.08.2012, 15:02
Теперь есть три команды сохранения скриншотов:
- Screenshot -- делает PNG скриншот ничего не спрашивая, в текущей папке с именем в виде даты и времени
- Save Screenshot as -- показывает диалог сохранения, с возможностью выбора формата PNG либо BMP
- Save Animation -- показывает диалог сохранения в формат APNG, создаёт файл и включает режим сохранения скриншотов после каждого фрейма (25 раз в секунду по времени УКНЦ). Режим выключается повторным выбором той же команды, при этом закрывается файл.

Все три команды вынесены на панель инструментов (toolbar).

В APNG сохраняется без сжатия, поэтому файл быстро растёт. Формат APNG могут просматривать некоторые браузеры (Opera например), есть инструменты оптимизации и конвертации в GIF: http://littlesvr.ca/apng/

Titus
16.08.2012, 17:20
- Save Animation -- показывает диалог сохранения в формат APNG, создаёт файл и включает режим сохранения скриншотов после каждого фрейма (25 раз в секунду по времени УКНЦ).
А как быть с тем, что вообще-то у УКНЦ развертка 50 кадров в секунду? )

nzeemin
16.08.2012, 17:41
А как быть с тем, что вообще-то у УКНЦ развертка 50 кадров в секунду? )

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

Titus
16.08.2012, 17:45
Никак. UKNCBTL не эмулирует развёртку, а показывает состояние экрана в конце каждого 2-го кадра. И пока не планирую делать что-либо в этом направлении -- не думаю что это так критично.
Лично для меня весьма критично. Я люблю видеть то изображение, которое показывает оригинал. У меня в эмуляторе, например, не просто 50фпс, но еще и синхронизированы с разверткой монитора PC. Что, например, позволяет видеть во всей красе аппаратный плавный скроллинг.

nzeemin
17.08.2012, 11:57
Поломанный PAFCOMMANDER в Emustudio отлично работает, а
в UKNCBTL увы , дискету прилагаю, для запуска файл PC.SAV

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

Алексей, получается что драйв без дискеты в РСН всегда возвращает установленный бит 7? с такой поправкой у меня PAF Commander загрузился, но хотелось бы точно знать -- что вообще должен возвращать драйв без дискеты в статусе.
Кроме того, есть две ситуации: 1) привод есть, не вставлена дискета 2) привода нет. Интересует что содержит РСН для этих двух случаев.

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

И ещё вопрос по PAF Commander. При выборе устройства показывается табличка -- MZ0..7, SD0..7, HD0..7, LD0..7 -- почему по восемь устройств MZ, вроде как максимум 4? что за устройства SD, HD, LD?

nzeemin
19.08.2012, 12:40
- На тулбаре кнопку Screenshot сделал простой кнопкой, убрал меню -- когда нужны две остальные команды можно в меню File залезть
- Добавил фикс с флагом MOREDATA для флоппи-драйвов без дискеты -- заработал PAF Commander и другие несколько мест где подвисало

http://ukncbtl.googlecode.com/files/UKNCBTL-beta31-exe.zip

Alex_K
19.08.2012, 13:51
Алексей, получается что драйв без дискеты в РСН всегда возвращает установленный бит 7? с такой поправкой у меня PAF Commander загрузился, но хотелось бы точно знать -- что вообще должен возвращать драйв без дискеты в статусе.
Кроме того, есть две ситуации: 1) привод есть, не вставлена дискета 2) привода нет. Интересует что содержит РСН для этих двух случаев.

Ух ты... оказывается, этот бит влияет на подвисание в тех случаях про которые раньше говорилось -- та же третья заливка в JEK например.
Никита, извиняюсь за поздний ответ.
Во-первых, надо разделить понятия контроллера и дисководов. На контроллер приходит одна линия данных на чтение, на основе поступающих данных и формируется вся считываемая информация и соответственно, в зависимости от ситуации, формируются все флаги регистра состояния. А уже к этой линии на чтение может подключаться любой драйв, или вообще ничего не подключаться. Сам контроллер не знает подключен к нему дисковод или нет, не его это функция. Аналогично и со всеми входящими и выходящими линиями.
Во-вторых - при сбросе, включении питания или сбросе через бит 8 контроллер переходит в режим чтения с поиском адресного маркера. В этом режиме все поступающие на контроллер данные анализируются на поиск пропуска синхроимпульса и чтобы прочитанные данные были равны 0xA1. При этом бит готовности находится в сброшенном состоянии и никакие данные в регистр данных чтения не передаются (остаются старые данные). После того, как был найден адресный маркер, ставится бит готовности, в регистр данных передаются первые прочитанные данные (0xA1A1). И вот здесь контроллер уже входит в режим чтения данных, поступающие на его вход данные аккуратно нарезаются словами каждые 64 мкс (точнее два раза по 32 мкс, т.к. сдвиговый регистр байтовый). Естественно, реальные данные будут, если выдержаны следующие условия:
1. Выбран драйв (установлен бит 10 в регистре 177130)
2. Дисковод реально подключен (в UKNCBTL всегда).
3. Дискета находится в дисководе.
4. Включен мотор.
По этим условиям также должен осуществиться и поиск адресного маркера. Если контроллер уже находится в режиме формирования данных (нарезка), а хоть какое-то условие не выполнено, то тогда нарезка данных не прекращается, а в регистр данных поступает нуль. Т.е. после того как успешно был найден адресный маркер контроллер аккуратно формирует данные каждые 64 мкс, с установкой флага готовности.

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

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


И ещё вопрос по PAF Commander. При выборе устройства показывается табличка -- MZ0..7, SD0..7, HD0..7, LD0..7 -- почему по восемь устройств MZ, вроде как максимум 4? что за устройства SD, HD, LD?
Здесь все просто - в RT-11 все устройства делятся на символьные и блочные. Соответственно PAF Commander сканирует все установленные драйвера в системе и выбирает из них только блочные. А RT-11 до версии 5.6 поддерживала до восьми устройств на драйвер, при этом сколько реально устройство поддерживает - один, два или восемь - узнать невозможно. Потому и выводится все - 0 до 7.
SD - это квазидиск (по команде SET SD INFORM), что такое HD - не знаю. А LD - драйвер логических дисков, это когда на физическом диске или внутри другого логического диска можно создать файл (обычно с расширением DSK) и назначить его диском. Для этого в RT-11 есть команды MOUNT и DISMOUNT.

nzeemin
20.08.2012, 17:16
http://ukncbtl.googlecode.com/files/QtUkncBtl-beta32-Windows.zip

В этом релизе добавлена первичная поддержка скриптинга. Командой File > Run Script выбирается .JS-файл и запускается на выполнение. Язык файла -- ECMAScript, по сути это JavaScript. В тексте программы может использоваться объект emulator, имеющий методы:

emulator.reset(); -- сброс машины
emulator.run(100); -- работа эмулятора в течение 100 фреймов, каждый фрейм это 1/25 секунды
emulator.saveScreenshot("test.png"); -- сохранение скриншота в формате PNG

Пример скрипта:


emulator.reset();

for (i = 0; i < 10; i++)
{
emulator.run(10);
emulator.saveScreenshot('test' + i + '.png');
}


Справочник по ECMAScript: http://qt-project.org/doc/qt-4.8/ecmascript.html

В дальнейшем набор методов объекта emulator будет расширятся.

b2m
20.08.2012, 17:34
Тоже хотел нечто подобное добавить в свой эмуль, но меня опередили :)

Shadow Maker
21.08.2012, 14:21
Но savestate никогда никто не добавит. Зато свистелок уже тыщу внедрили. Анимацию сохранять в apng это конечно важнее.

PS: Ну да, надоел уже всем, я в курсе.

Titus
21.08.2012, 15:12
Но savestate никогда никто не добавит. Зато свистелок уже тыщу внедрили. Анимацию сохранять в apng это конечно важнее.

PS: Ну да, надоел уже всем, я в курсе.
Все правильно, мнение народа важно) Отстаивай свою позицию.

nzeemin
21.08.2012, 17:12
http://ukncbtl.googlecode.com/files/QtUkncBtl-beta33-Windows.zip

Ещё одна порция свистелок и перделок.
Собственно в этом релизе скриптовое API несколько доработано.

Напомню, было всего три метода:
emulator.reset(); -- сброс машины
emulator.run(100); -- работа эмулятора в течение 100 фреймов, каждый фрейм это 1/25 секунды
emulator.saveScreenshot("test.png"); -- сохранение скриншота в формате PNG

Дальше что добавилось:

emulator.attachCartridge(1, 'romctr_basic.bin'); -- подключение картриджа
emulator.detachCartridge(1); -- отключение картриджа
emulator.attachFloppy(0, 'sys1002.dsk'); -- подключение диска
emulator.detachFloppy(0); -- отключение диска
emulator.attachHard(1, 'WDC170inv.img'); -- подключение харда, работает только если уже подключена прошивка через emulator.attachCartridge
emulator.detachHard(1);

emulator.getUptime(); либо свойство emulator.uptime -- возвращает number количество секунд работы эмулируемой машины, по emulator.reset() сбрасывается в 0

emulator.keyScan(0153); -- нажимает клавишу (задаётся скан-код), прогон 3 фрейма, отпускает, прогон 3 фрейма
emulator.keyScan(0153, 6); -- то же но задаётся интервал (фреймов) от нажатия до отжатия
emulator.keyScanShift(0013); -- нажатие SHIFT, 2 фрейма, нажатие клавиши, 3 фрейма, отжатие клавиши, 2 фрейма, отжатие SHIFT, 3 фрейма -- т.е. комбинация для ввода символа в другом регистре
emulator.keyString('1\n'); -- ввод серии символов; для каждого ASCII-символа ищется скан-код, если нужно используется нажатие SHIFT

emulator.getCPU() либо emulator.cpu -- получение объекта для ЦП
emulator.getPPU() либо emulator.ppu -- получение объекта для ПП

Дальше описываю в примерах для ПП, для ЦП то же самое:
emulator.ppu.getName() либо emulator.ppu.name -- название процессора, "CPU" либо "PPU"
emulator.ppu.getReg(0) либо emulator.ppu.r(0) -- значение в регистре 0..7
emulator.ppu.getPC() либо emulator.ppu.pc -- значение в регистре 7
emulator.ppu.getSP() либо emulator.ppu.sp -- значение в регистре 6
emulator.ppu.getPSW() либо emulator.ppu.psw -- значение в PSW
emulator.ppu.isHalt() либо emulator.ppu.halt -- признак HALT/USER режима

emulator.ppu.readWord(0160304) -- прочитать слово из памяти процессора

emulator.ppu.disassemble(0160304) -- дизассемблирует одну инструкцию по заданному адресу, возвращает массив из четырёх элементов: { address, instruction, arguments, instruction length }

Актуальный справочник по скриптовому API лежит здесь: http://code.google.com/p/ukncbtl/wiki/Scripting

nzeemin
21.08.2012, 19:32
Тоже хотел нечто подобное добавить в свой эмуль, но меня опередили :)

Под Qt скриптинг прикручивается довольно легко -- движок есть в самом фреймворке.

Меня тоже интересует как бы его попроще прикрутить к Win32-программе. JavaScript движков много но все какие-то сложные: http://en.wikipedia.org/wiki/List_of_ECMAScript_engines

Ещё видимо популярно использовать скриптинг на Lua:
http://code.google.com/p/psxjin/wiki/LuaScriptingFunctions
http://code.google.com/p/snes9x-rr/wiki/LuaScriptingFunctions

esl
21.08.2012, 20:06
еще довольно часто питон прикручивают

nzeemin
21.08.2012, 22:48
Но savestate никогда никто не добавит. Зато свистелок уже тыщу внедрили. Анимацию сохранять в apng это конечно важнее.

PS: Ну да, надоел уже всем, я в курсе.

На самом деле сейвстейтами я занимался, но успехов особых не было.

Во вложении первая версия в которой сейвы хоть как-то заработали -- по крайней мере, простейший Save/Load на загрузочном меню работает, в сложных случаях пока не тестировал.

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

В Qt-версию сейвстейты тоже добавил, будут со следующим релизом, причём формат сейвов совпадает с Win32-версией.

Error404
21.08.2012, 23:48
Тоже хотел нечто подобное добавить в свой эмуль, но меня опередили :)

В каких случаях такое может использоваться?

nzeemin
22.08.2012, 12:24
В каких случаях такое может использоваться?

Можно я отвечу?

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

nzeemin
23.08.2012, 18:11
SDL-версия эмулятора в full screen на моём рабочем мониторе:
http://img-fotki.yandex.ru/get/6507/7448436.7/0_72f85_b00baab1_L.jpg

---------- Post added at 18:11 ---------- Previous post was at 17:48 ----------

http://ukncbtl.googlecode.com/files/UkncBtlSdl-35-Windows.zip

Эта версия почти не управляется из интерфейса, все настройки задаются через INI-файл UkncBtlSdl.ini -- обычный INI-файл с секциями SDL, VIDEO, UKNCBTL.

Секция SDL -- все ключи начинаются с "SDL_", все пары ключ-значение без изменений передаются в SDL, полный набор опций описан в http://www.libsdl.org/docs/html/sdlenvvars.html
В частности, можно указать размещение окна на экране и выбрать видеодрайвер:
SDL_VIDEO_WINDOW_POS=300,200
SDL_VIDEODRIVER=directx

Секция VIDEO:
Width и Height -- ширина и высота окна, по умолчанию 800 x 600.
BitsPerPixel -- количество бит на пиксел, обычно 0 т.е. родное, можно поставить 32 или 16, но обычно не нужно.
FullScreen -- флаг показа на полный экран; при установленном флаге (1, yes, true) в Width и Height лучше ставить родное разрешение монитора.
ScreenMode -- число от 0 до 4, режим скалирования экрана УКНЦ, те же режимы что в win32-версии.

Секция UKNCBTL:
Cartridge1=romctr_basic.bin -- подключение картриджа
Floppy0=RT11A5.dsk -- подключение флоппи
Hard1=harddisk.img -- подключение харда

Пример INI-файла -- показ в полный экран на FullHD мониторе:


[UKNCBTL]
Cartridge1=romctr_basic.bin
Floppy0=RT11A5.dsk

[SDL]
SDL_DEBUG=1
SDL_VIDEO_WINDOW_POS=300,200
SDL_VIDEODRIVER=directx

[VIDEO]
Width=1920
Height=1080
BitsPerPixel=0
FullScreen=1
ScreenMode=4


Клавиатура размаплена, но не до конца.
Выход по клавише Esc.

nzeemin
24.08.2012, 19:07
Погонял Win32-версию UKNCBTL под профайлером VS2012. Результаты неутешительные.
Основное на что уходит время:

Emulator_PrepareScreenRGB32() -- около 40%
CMotherboard::SystemFrame() -- около 38%, в том числе
- CProcessor::CommandExecution() -- ~3%
- CProcessor::InterruptProcessing() -- ~6%

Сам рендеринг экрана средствами VFW занимает доли процента, поэтому не так важно чем образ экрана отправляется на видеокарту. Посмотрел код PrepareScreen -- оптимизировать там особо нечего.

Titus
25.08.2012, 02:43
Посмотрел код PrepareScreen -- оптимизировать там особо нечего.
Не смотрел код, но уверен, что оптимизировать всегда есть чего, особенно, если изначально оптимизация особо не закладывалась.

проф
25.08.2012, 10:28
Вы бы (оба ) не язвили друг на лруга, а усилия объединили. Всё равно проекты некоммерческие.

Titus
25.08.2012, 12:25
Вы бы (оба ) не язвили друг на лруга, а усилия объединили. Всё равно проекты некоммерческие.
Мы совершенно не язвим. Во всяком случае nzeemin. Я тоже стараюсь подталкивать в конструктивные направления.
А усилия в некоторой степени и так обьединены. Когда я вижу у них ошибку, говорю. Они тоже мне много интересного рассказали.
А в плане самого эмулятора - концепции и построение очень разное, там даже отдельные функциональные блоки не перенесешь, т.е. каждый делает по-своему, как считает правильным. Я упираю на одно, они на другое. И кто хочет, может вполне заимствовать друг у друга чего-то.
Например, у них появились сканлайны и масштабирование в пропорциях, как у меня. У меня дополнительные палитры, как у них. Это, если смотреть на интерфейсные стороны. И т.д.

nzeemin
06.09.2012, 20:06
было:


for (int s = 0; s < scale; s++)
*pBits++ = valueRGB;

стало:


switch (scale)
{
case 8:
*pBits++ = valueRGB;
*pBits++ = valueRGB;
*pBits++ = valueRGB;
*pBits++ = valueRGB;
case 4:
*pBits++ = valueRGB;
*pBits++ = valueRGB;
case 2:
*pBits++ = valueRGB;
case 1:
*pBits++ = valueRGB;
default:
break;
}

охеренный прирост производительности, процентов на 20-30
я-то думал 2-3% было бы классно здесь выжать

На моём ноуте с выключенным звуком эмулятор выдавал 500% от оригинала, теперь 700%.

Titus
06.09.2012, 20:11
охеренный прирост производительности, процентов на 20-30
я-то думал 2-3% было бы классно здесь выжать

На моём ноуте с выключенным звуком эмулятор выдавал 500% от оригинала, теперь 700%.
Ну вот, а ты говорил) А можно ведь и еще быстрее)

nzeemin
07.09.2012, 19:11
Основное на что уходит время:

Emulator_PrepareScreenRGB32() -- около 40%
CMotherboard::SystemFrame() -- около 38%, в том числе
- CProcessor::CommandExecution() -- ~3%
- CProcessor::InterruptProcessing() -- ~6%

Занимался сегодня ещё оптимизацией.
В итоге, теперь пятёрка лидеров по затратам времени:

CMotherboard::SystemFrame() -- 40.90%
Emulator_PrepareScreenRGB32() -- 24.39%
CProcessor::InterruptProcessing() -- 9.52%
CMemoryController::GetWord() -- 5.64%
CProcessor::CommandExecution() -- 4.52%

На ноуте уже примерно 750% от оригинала.

Titus
07.09.2012, 22:42
CMotherboard::SystemFrame() -- 40.90%
Emulator_PrepareScreenRGB32() -- 24.39%
CProcessor::InterruptProcessing() -- 9.52%
CMemoryController::GetWord() -- 5.64%
CProcessor::CommandExecution() -- 4.52%
Эти названия ни о чем не говорят, нужна расшифровка)

hobot
09.09.2012, 02:29
beta 37, optimized

Спасибо за новую бету! Очень полезная и удобная кнопка "скриншот",
остальное будем гонять, на картинке видно какой на моём ноуте % "без звука",
но ноут греться стал сильнее к сожалению.


http://savepic.net/3385321.jpg


в архиве прилепленном дискета со "скриншота"
загрузчик + игрушки

hobot
10.09.2012, 02:36
OС-85 в бете 37 UKNCBTL
http://savepic.net/3376989.png
Этой интересной дискетой поделился [anasana]
Образ для UKNCBTL в прилепленном архиве.

nzeemin
10.09.2012, 10:16
OС-85 в UKNCBTL 3.7b

Ещё один вариант RT-11 ? И чья это разработка?

И не 3.7b, а бета 37 8-)

hobot
10.09.2012, 17:35
И не 3.7b, а бета 37 8-)
Поправил !

Ещё разок самые свежие и актуальные ссылки по теме:
http://zx.pk.ru/attachment.php?attachmentid=37236&d=1346948690 -ukncbtl beta37
http://zx.pk.ru/attachment.php?attachmentid=37259&d=1347143289 -дискета с играми и системой
http://pdp-11.org.ru/~hobot_lmb/EMULATORS/UKNCBTL_HDD/ -образы ЖД для UKNCBTL (инструкции и описания там)
http://www.old-games.ru/forum/showthread.php?p=828719#post828719 -ещё игрушки для UKNCBTL

nzeemin
13.09.2012, 13:09
Для интереса попробовал сделать реализацию эмулятора в виде C++/CLI модуля плюс интерфейс на C#, в общем и целом получилось.
Visual Studio 2005, .NET Framework 2.0

http://img-fotki.yandex.ru/get/6610/7448436.7/0_746d9_38589bcf_orig

Titus
13.09.2012, 13:27
А как на счет улучшения качества?
Точная эмуляция времянок процессора, памяти и т.д.

nzeemin
13.09.2012, 14:35
А как на счет улучшения качества?
Точная эмуляция времянок процессора, памяти и т.д.

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

hobot
16.10.2012, 15:39
Когда нет -- интерфейс и эксперименты.
Рано или поздно будет (я думаю) очередная бета для Win, у меня такая просьба-предложение: может путь для сохранения скриншотов жестко в ini файле завести?
Просто сейчас картина такая - путь для сохранения скриншота читается(подставляется) из переменной - а это сбивает с толку иногда.
:redface:

nzeemin
21.10.2012, 18:30
может путь для сохранения скриншотов жестко в ini файле завести?
Просто сейчас картина такая - путь для сохранения скриншота читается(подставляется) из переменной - а это сбивает с толку иногда.
:redface:

Скриншот сохраняется по "текущему" пути. Т.е. это папка которая была текущей при запуске приложения. Разве это не устраивает?

hobot
23.10.2012, 22:21
была текущей при запуске приложения
Не совсем так! Устраивает, если бы было так, но это не так ! )))
Попробуйте в процессе уже после запуска воткнуть какой нибудь образ, и папка
с образом становится текущей и скрин пишется уже в неё (вот я что имел в виду,
когда писал про переменную), а если я ОН_ЛАЙН образ из архива подцеплю? Куда
скрин улетит - неведомо )))

Спасибо за ответ!

Patron
24.10.2012, 02:56
Попробуйте в процессе уже после запуска воткнуть какой нибудь образ, и папка с образом становится текущейЯ тоже только на днях обнаружил, что любой диалог открытия файла в Windows меняет текущий каталог. Приходится запоминать текущий каталог сразу после запуска эмулятора и потом использовать для пути по-умолчанию эту запомненную строку.

hobot
24.10.2012, 14:09
Я тоже только на днях обнаружил
О том и речь ) Благодарю, Patron !
Поэтому я и предложил пускай пользователь имеет возможность либо определить
путь сохранения в ini файле или допустим в буфер системы ?

Приходится запоминать текущий каталог сразу после запуска эмулятора
Или как-то так наверное даже правильней?

hobot
11.12.2012, 22:41
прилеплю сюда что-бы не забылось\потерялось, может будет время что бы посмотреть в чём там проблема с запуском? (http://zx.pk.ru/showpost.php?p=558203&postcount=83)

Спасибо.

Vamos
27.01.2013, 19:49
На текущий момент мыслей по поводу реализации прерываний нет, поэтому пока то что есть: работающий С2 и СА оба пока не работают по прерываниям.
По С2 можно загрузиться с НХ сервера, по СА загрузка останавливается с ошибкой, но тоже результат :) .
Для связи используется программа сом0сом http://sourceforge.net/projects/com0com/
Все остальное в ветках "Сеть УКНЦ" и "УКНЦ загрузка через стык С2"
Для сети запуск копий из разных папок.

nzeemin
28.01.2013, 02:25
Затащил к себе код от Vamos, и озаботился настройкой COM-портов -- уже жаловались что приходится менять код под себя. Не доделал ещё, но будет примерно так: отдельный диалог на редактирование структуры DCB. Если какие-либо ещё параметры DCB нужно вытащить в редактор -- скажите, сделаю.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363214(v=vs.85).aspx -- DCB structure

http://img-fotki.yandex.ru/get/5642/7448436.7/0_7a214_dc87e392_orig

Vamos
28.01.2013, 02:33
Наверное это лишнее, в реале УКНЦ кроме скорости стыка С2 все жёстко определено.

hobot
28.01.2013, 19:08
nzeemin, если будет возможность - посмотри пожалуйста ещё раз про звук для свежей компиляции UKNCBTL. Штука такая - на обычном DESKTOPE у меня бортовой звук и там все норм работает, а на ноуте UKNCBTL портит настройку так, что приходиться лазить поправлять иначе такое в колонках шипение при запуске других приложений пугающее ))) Впрочем я привык уже после запуска эмулятора лазить автоматом в звук.настройки ноута ))) Проблема в том, что минимальное значение ползунка почему то на звуковухе бука вызывает перегруз в купе с переключением на (только) левый канал. Какие ещё доработки планируются?
Возможно ли ожидать Load State в обозримом будущем и в целом любые новости по этому проекту всегда очень интересно !

Patron
30.01.2013, 11:56
Для реализации прерываний портов СА и С2 нужно модифицировать не только функцию void CFirstMemoryController::SetPortWord(WORD address, WORD word), но и void CFirstMemoryController::SetPortByte(WORD address, BYTE byte), которая в данный момент выглядит довольно бледно:



void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)
{
WORD word = (address&1)?((WORD)byte) << 8:(WORD)byte;
switch (address) {
case 0176560: //network
case 0176561: //СА: Регистр состояния приемника
m_Port176560 = (m_Port176560 & ~0100) | (word & 0100); // Bit 6 only
break;
case 0176562: // СА: Регистр данных приемника
case 0176563: // недоступен по записи
return ;
case 0176564: // СА: Регистр состояния источника
case 0176565:
m_Port176564 = (m_Port176564 & ~0105) | (word & 0105); // Bits 0,2,6
break;
case 0176566: // СА: Регистр данных источника
case 0176567: // нижние 8 бит доступны по записи
m_Port176566 = word & 0xff;
m_Port176564 &= ~128; // Reset bit 7 (Ready)
break;

case 0176570: // Стык С2: Регистр состояния приемника
case 0176571:
case 0176572: // Стык С2: Регистр данных приемника
case 0176573:
case 0176574: // Стык С2: Регистр состояния источника
case 0176575:
case 0176576: // Стык С2: Регистр данных источника
case 0176577:
return ;
}
}


---------- Post added at 10:56 ---------- Previous post was at 10:29 ----------



void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)
{
WORD word = (address&1)?((WORD)byte) << 8:(WORD)byte;
switch (address) {
case 0176560: //network
case 0176561: //СА: Регистр состояния приемника // Bit 6 only
m_Port176560 = (m_Port176560 & ~0100) | (word & 0100);
break;
}
}


Правильно ли я понимаю, что при использовании такого алгоритма обработки в эмуляторе байтовой записи в порт - команда CLRB @#176561 сбросит разрешение прерываний ?

Настоящая УКНЦ действительно преобразует байт в слово перед записью в порт ?

Vamos
30.01.2013, 11:58
Patron, видимо nzeemin еще не затащил код, у меня там все прописано.
Но толку пока от этих прерываний мало, DLTST показывает что все хорошо, а загрузка как не шла так и не идет TU58 в том числе.

Patron
30.01.2013, 12:02
DLTST показывает что все хорошо, а загрузка как не шла так и не идет TU58 в том числе.DLTST пишет в порт слова. Запись слов мы вчера наладили. Но если программа пишет в порт байты - нужно налаживать void CFirstMemoryController::SetPortByte(WORD address, BYTE byte), а там просто мрак кромешный.

Vamos
30.01.2013, 12:09
Правильно ли я понимаю, что при использовании такого алгоритма обработки в эмуляторе байтовой записи в порт - команда CLRB @#176561 сбросит разрешение прерываний ?

Настоящая УКНЦ действительно преобразует байт в слово перед записью в порт ?
Вот не знаю, но команда MOVB @#176561,R5 проходит, номер станции работает.

---------- Post added at 12:09 ---------- Previous post was at 12:05 ----------


DLTST пишет в порт слова. Запись слов мы вчера наладили. Но если программа пишет в порт байты - нужно налаживать void CFirstMemoryController::SetPortByte(WORD address, BYTE byte), а там просто мрак кромешный.
С этой функции все и началось, после того как я туда скопипастил из void CFirstMemoryController::SetPortWord(WORD address, WORD word) все для С2, стала работать загрузка НХ сервера.

Alex_K
30.01.2013, 12:12
Для реализации прерываний портов СА и С2 нужно модифицировать не только функцию void CFirstMemoryController::SetPortWord(WORD address, WORD word), но и void CFirstMemoryController::SetPortByte(WORD address, BYTE byte), которая в данный момент выглядит довольно бледно:



void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)
{
WORD word = (address&1)?((WORD)byte) << 8:(WORD)byte;
....................
}

Тут все значительно проще - 1801ВП1-065 сигнал WTBT не обрабатывает, при байтовой записи в 1801ВМ2 неиспользуемый байт устанавливается нулями, потому и есть такая строчка: WORD word = (address&1)?((WORD)byte) << 8:(WORD)byte;, которая делает целое слово, присутствующее на линиях адреса-данных. Достаточно вызвать SetPortWord с этим словом.

Patron
30.01.2013, 12:38
неиспользуемый байт устанавливается нулямиТогда нужно просто добавить туда обработку прерываний.

...

Исправленный исходник требует дальнейших улучшений:

1. При установке разрешения прерывания в готовом регистре приёмника - прерывание возникает так же, как в передатчике, а регистры приёмников почему-то остались неисправленными:



void CFirstMemoryController::SetPortWord(WORD address, WORD word)
{
switch (address) {
case 0176560: //network
case 0176561: // СА: Регистр состояния приемника // Bits 2,6 only
m_Port176560 = (m_Port176560 & ~0104) | (word & 0104);
break;
case 0176570: // Стык С2: Регистр состояния приемника
case 0176571: // Bit 6 only
m_Port176570 = (m_Port176570 & ~0100) | (word & 0100);
break;
}
}



2. Приоритеты IRQ портов СА и С2 в файле Board.cpp остались неправильными:



m_pCPU->InterruptVIRQ(3, 0370);
m_pCPU->InterruptVIRQ(3, 0374);
m_pCPU->InterruptVIRQ(3, 0360);
m_pCPU->InterruptVIRQ(3, 0364);


---------- Post added at 11:31 ---------- Previous post was at 11:22 ----------

Запись байта в регистр данных передатчиков СА и С2 обрабатывается так:



void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)
{
WORD word = (address&1)?((WORD)byte) << 8:(WORD)byte;
switch (address) {

case 0176566: // СА: Регистр данных источника
case 0176567: // нижние 8 бит доступны по записи
m_Port176566 = word & 0xff;
m_Port176564 &= ~128; // Reset bit 7 (Ready)
break;

case 0176576: // Стык С2: Регистр данных источника
case 0176577:
return ;
}
}
Почему такая разница ?
Как записываемый в регистр данных С2 байт попадает в переменную m_Port176576 ?
Правильно ли, что при записи байта в регистр данных передатчика С2 - бит готовности в слове состояния не сбрасывается ?

---------- Post added at 11:38 ---------- Previous post was at 11:31 ----------

Ещё ошибка:


m_pProcessor->InterruptVIRQ(8, 0364);


Должно быть:


m_pProcessor->InterruptVIRQ(10, 0364);

Vamos
30.01.2013, 12:39
Как записываемый в регистр данных С2 байт попадает в переменную m_Port176576 ?
http://zx-pk.ru/showpost.php?p=571646&postcount=568

Меня смущает вот это m_Port176564 &= ~128; // Reset bit 7 (Ready)
я думаю должно быть так m_Port176564 &= ~0200; // Reset bit 7 (Ready)

Patron
30.01.2013, 12:42
У всех прерываний должны быть разные приоритеты IRQ ( для С2 - приемник 7, передатчик 8, для СА - приемник 9, передатчик 10 ), иначе прерывания могут теряться.

---------- Post added at 11:42 ---------- Previous post was at 11:40 ----------


Меня смущает вот это128 == 0200 (проверил при помощи калькулятора).
Но лучше, конечно, везде писать 0200 - тогда легче понять о чём речь.

Vamos
30.01.2013, 12:46
128 == 0200 (проверил при помощи калькулятора).
Я имел ввиду другое, операция & побитовая и при использовании 128 не сбросится ли бит 6 (0100).

Patron
30.01.2013, 12:51
Я имел ввиду другое, операция & побитовая и при использовании 128 не сбросится ли бит 6 (0100).Т.к. и 128, и 0200, и 0x80 - это одно и то же число ( 10000000b ), то при одинаковом их использовании и результат будет одинаковым.

Alex_K
30.01.2013, 13:00
Я имел ввиду другое, операция & побитовая и при использовании 128 не сбросится ли бит 6 (0100).
Не не сбросит, перед этим делается инверсия операцией ~, поэтому из слова 128 получится слово 65407, оно же 177577, оно же 0xF7.

Titus
30.01.2013, 13:02
[/COLOR]128 == 0200 (проверил при помощи калькулятора).
Но лучше, конечно, везде писать 0200 - тогда легче понять о чём речь.
А чего, Си разве понимает восьмеричные числа?

Alex_K
30.01.2013, 13:09
А чего, Си разве понимает восьмеричные числа?
Titus, вы только проснулись? Для справки - язык Си изначально был сделан на PDP-11, поэтому так и похож на ассемблер PDP-11. Ну соответственно, т.к. на PDP-11 использовалась восьмеричная система, то использовалась она и в Си, достаточно число начать с нуля.

Titus
30.01.2013, 13:20
Titus, вы только проснулись? Для справки - язык Си изначально был сделан на PDP-11, поэтому так и похож на ассемблер PDP-11. Ну соответственно, т.к. на PDP-11 использовалась восьмеричная система, то использовалась она и в Си, достаточно число начать с нуля.
Я не проснулся, я просто не использую восьмеричную систему, и нигде, кроме PDP-систем ее не встречал) Она для меня чуждая) Близкая - десятичная и шестнадцатиричная. Поэтому все нюансы, связанные с ней мне не известны)
Мало того, видел много исходников на Си, встречаются шестнадцатиричные числа 0x..., но чтобы восьмеричные встретить - никогда такого не было)

Vamos
30.01.2013, 13:21
поэтому так и похож на ассемблер PDP-11.
Нуу.. после Макро11 он мне показался китайской грамотой, а сейчас там еще всякие объекты классы, мне компилятор чуть мозг не вынес сообщениями об ошибках когда я его три недели назад поставил впервые к себе на комп.
Хотя сейчас посмотрев на некоторые исходники Макро11, это конечно стилем называется, но помоему это очень много букв.

Alex_K
30.01.2013, 13:22
Я не проснулся, я просто не использую восьмеричную систему, и нигде, кроме PDP-систем ее не встречал) Она для меня чуждая) Близкая - десятичная и шестнадцатиричная. Поэтому все нюансы, связанные с ней мне не известны)
Мало того, видел много исходников на Си, встречаются шестнадцатиричные числа 0x..., но чтобы восьмеричные встретить - никогда такого не было)
Но ведь в любом руководстве по языку должно это быть описано. Надеюсь также, что EmuStudio наконец-то в консоли будет выдавать в восьмеричной системе.

Titus
30.01.2013, 13:24
Но ведь в любом руководстве по языку должно это быть описано. Надеюсь также, что EmuStudio наконец-то в консоли будет выдавать в восьмеричной системе.
Ну, если что опционально специально для любителей восьмеричной системы.

Alex_K
30.01.2013, 13:25
Нуу.. после Макро11 он мне показался китайской грамотой, а сейчас там еще всякие объекты классы, мне компилятор чуть мозг не вынес сообщениями об ошибках когда я его три недели назад поставил впервые к себе на комп.
Хотя сейчас посмотрев на некоторые исходники Макро11, это конечно стилем называется, но помоему это очень много букв.
С объектно-ориентированным программированием у меня тоже очень сложно. Так как я привык к ассемблеру и классическому Си, то я знаю, что делает программа, а с этими классами, методами много непоняток, они как бы сами в себе.

Titus
30.01.2013, 13:26
Но ведь в любом руководстве по языку должно это быть описано.
Да, но за ненадобностью никогда не обращал внимания.

Alex_K
30.01.2013, 13:27
Ну, если что опционально специально для любителей восьмеричной системы.
Ой!!! :eek_std: Неужели дождались?

Titus
30.01.2013, 13:31
С объектно-ориентированным программированием у меня тоже очень сложно. Так как я привык к ассемблеру и классическому Си, то я знаю, что делает программа, а с этими классами, методами много непоняток, они как бы сами в себе.

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

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


Ой!!! :eek_std: Неужели дождались?
Не, ну не сейчас) У эмулятора же даже нет настроек, чтобы это включить)

Patron
30.01.2013, 13:50
я знаю, что делает программа, а с этими классами, методами много непоняток, они как бы сами в себе.На самом деле смысл объектного программирования в своей основе вполне "ассемблерный" - объект это немного улучшенная обычная структура ( srtuct ), с тремя важными и полезными новшествами:

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

2. Членами могут быть не только данные, но и функции (их называют "методы"), и даже автоматически разыменуемые указатели на функции ( их называют "виртуальные методы" ).

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

Если никакие из этих возможностей не использовать - объект класса C++ будет ничем не отличим от экземпляра обычной структуры C.

Titus
30.01.2013, 13:57
Если никакие из этих возможностей не использовать - объект класса C++ будет ничем не отличим от экземпляра обычной структуры C.
Тогда и незачем особо использовать классы)
У меня, например, EmuStido написан практически на чистом Си, и прекрасно и удобно выглядит и работает)

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

Patron
30.01.2013, 15:12
Тогда и незачем особо использовать классыКонструкторы - это просто песня. Т.к. в C++ все типы данных являются классами - конструктор можно задать для чего угодно. У меня почти все "обычные" структуры имеют конструкторы с пустым телом - просто устанавливающие для членов значения по умолчанию.

Например:


struct Point {
int X;
int Y;
Point():
X(0),
Y(0)
{}
};
В подобной ситуации становится абсолютно невозможно создать экземпляр такой структуры с неинициализированными членами.

Если хочется дополнительно иметь возможноcть явно задавать начальные значения членов при создании структуры - можно сделать так:



struct Point {
int X;
int Y;
Point( int X0 = 0, int Y0 = 0 ):
X(X0),
Y(Y0)
{}
};


и создавать экземпляры, например, так:


Point A;
Point B(1,1);

Titus
30.01.2013, 15:14
У меня почти все "обычные" структуры имеют конструкторы с пустым телом - просто устанавливающие для членов значения по умолчанию.
Лично для меня все это лишнее. Мне нагляднее, когда без классов - простые функции и простые данные. Без всяких указаний классов, зон паблик не паблик, конструкторов и т.д.

Patron
30.01.2013, 15:36
Мне нагляднее, когда без классов - простые функции и простые данные.C++ - это и есть практически "чистый ассемблер" в том виде, в котором он должен быть. Использовать все его возможности в полном объёме или не использовать - зависит от потребностей. По мере роста потребностей - растёт и объём используемых возможностей.

Важно лишь с самого начала понимать, что все без исключения возможности С++ - это практически всё тот же "чистый ассемблер" без каких-либо "наворотов".

Titus
30.01.2013, 15:43
Важно лишь с самого начала понимать, что все без исключения возможности С++ - это практически всё тот же "чистый ассемблер" без каких-либо "наворотов".
Я так не считаю)
Программировал и на С++ с классами когда-то, и на чистом Си, и для меня просто Си очень дружественный, а ООП - нет.

Patron
30.01.2013, 15:55
для меня просто Си очень дружественный, а ООП - нет.То, что повсюду называют ООП - на мой взгляд - просто вывих мозга. Как можно писать в таком стиле я представить себе не могу. Именно безумный стиль "ООП" многие (как я понимаю) путают с сутью объектного подхода.

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

Вот пример класса LockVarType, создающего объекты быстрой межпоточной синхронизации размером в одно слово:



#define DWORD_ALIGN __declspec(align(4))
#define LOCK_VAR_TYPE DWORD_ALIGN LONG volatile

class LockVarType {
public:
LockVarType():dwLockVar(0){}
inline dword IsLocked(){ return dwLockVar; }
inline void Lock( int nSleepMS = 0 )
{
while( InterlockedCompareExchange( &dwLockVar, 1, 0 ) ) { Sleep( nSleepMS ); }
}
inline void UnLock() { dwLockVar = 0; }
inline bool TimedLock( dword uTimeOut_MS, int nSleepMS = 0 )
{
dword uTC = GetTickCount();
while( InterlockedCompareExchange( &dwLockVar, 1, 0 ) )
{
if( GetTickCount() - uTC >= uTimeOut_MS ) { return false; }
Sleep( nSleepMS );
}
return true;
}
inline bool TryLock() { return !InterlockedCompareExchange( &dwLockVar, 1, 0 ); }

protected:
LOCK_VAR_TYPE dwLockVar;

};

Этот объект имеет после компиляции размер в одно слово.
Сделать межпоточную синхронизацию легче и проще вряд ли реально.

Titus
30.01.2013, 15:58
Этот объект имеет после компиляции размер в одно слово.
Сделать межпоточную синхронизацию легче и проще вряд ли реально.
Эм... точно одно слово? Я вижу какие-то функции)

Patron
30.01.2013, 16:18
Эм... точно одно слово? Я вижу какие-то функции)Это макросы, которые подставляются в код программы в тех местах, где пользователь хочет как-то использовать объект.

Например, чтобы включить, а потом выключить межпоточную блокировку пользователь пишет:


LockVar.Lock();
................
LockVar.UnLock();

А в код программы вставляется:


while( InterlockedCompareExchange( &dwLockVar, 1, 0 ) ) { Sleep(0); }
................
dwLockVar = 0;

Titus
30.01.2013, 16:24
Например, чтобы включить, а потом выключить межпоточную блокировку пользователь пишет:


LockVar.Lock();
................
LockVar.UnLock();

На простом Си я напишу LockVar() или UnlockVar()

Patron
30.01.2013, 17:41
На простом Си я напишу LockVar() или UnlockVar()Обычно нужно ещё передать используемую переменную в качестве параметра (не писать же для каждой новой переменной собственные уникальные макросы), а когда переменная объект - она сама себя передаёт в качестве аргумента своим методам.

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

Вот и получается, что разница между LockVar( &dwLockVar ) и LockVar.Lock() только в том, что при переносе кода из одного проекта в другой - не надо думать, что относится к блокировке, а что нет - всё необходимое уже "упаковано" в описание объекта.

---------- Post added at 16:41 ---------- Previous post was at 16:26 ----------

Важное преимущество C++ перед C, которое заставляет писать даже C-программы в формате C++ - это возможность объявлять любую переменную там, где она нужна, а не в начале функции.

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

А можно в ANSI C задавать переменную цикла прямо в операторе for ?


for( int i = 0 ; i < 100 ; i++ )

Titus
30.01.2013, 18:40
А можно в ANSI C задавать переменную цикла прямо в операторе for ?


for( int i = 0 ; i < 100 ; i++ )


Да, это возможность удобная, и сам ее иногда использую. Хотя, стараюсь не злоупотреблять, чтобы не раскидывать обьявления по коду.
Так же в Си++ удобно, что можно писать преобразование типов, скажем, не k = (long)i, а k = long(i). Для наглядности иногда удобней.

Вот и все, чем я пользуюсь из Си++ )

NovaStorm
30.01.2013, 19:05
Именно безумный стиль
"Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво"
(С) я думаю всё знают чей =)

Patron
30.01.2013, 19:12
можно писать преобразование типов, скажем, не k = (long)i, а k = long(i).Насколько я понимаю - в первом случае к объекту i применяется копирование типа long, а во втором случае сначала создаётся новый объект типа long - т.е. вызывается его конструктор, получающий значение объекта i в качестве начального значения, а потом копируется уже вновь созданный объект. Если включена оптимизация - код может получиться одинаковым, а если нет - первый вариант будет короче.

Titus
30.01.2013, 19:19
Насколько я понимаю - в первом случае к объекту i применяется копирование типа long, а во втором случае сначала создаётся новый объект типа long - т.е. вызывается его конструктор, получающий значение объекта i в качестве начального значения, а потом копируется уже вновь созданный объект. Если включена оптимизация - код может получиться одинаковым, а если нет - первый вариант будет короче.
Не знаю, какие там обьекты, в инструкции про это ничего не сказано) Сказано, что синтаксис может быть и таким, и таким)

hobot
30.01.2013, 20:35
Про ООП (но не про Си!)

Я не проф. и Си вообще всегда бежал, но вот Паскаль от УК-НЦ потом турбо-паскаль в ДОС - для удовольствия и наконец Delphi под Win. ООП - конструкторы\диструкторы я понял только из объяснений Patrona - слишком заумные мне попадались видимо толкователи до этого.

Но я вот что хотел сказать то - читал учебник (автора не помню), по Delphi, где автор полностью отказался от термина ООП и вообще не использовал его ни разу ни на одной странице (единственный учебник в котором автор на одном со мной языке говорил про ООП паскаль и Delphi), он вводит там такой термин Событийно Ориентированное Программирование.

Мне например "методы" ? Ну то есть переменные объекта, которые через
точку пишутся очень обрадовали! Но потребовалось время что-бы привыкнуть воспринимать и код и результат по новому, если раньше программа была строго линейная (или я такой как рельсы прямой!), то есть автоматом вылетала в монитор
когда доходила до END., то под Win созданное окно так и будет висеть и получать сообщения. В целом это я так - впечатлениями делюсь, но мне например
нелегко было отказаться от циклов и некоторых других вещей которые "не рекомендуются" при СОП, просто потому-что не нужны или не желательны или требуют дополнительного обслуживания (я имею в виду ProcessMessages).

И странное дело, вот объяснения Patrona я понимаю, а код из примеров (сам синтаксис Си для меня всегда был страшен - может потому что я
начинал с Бейсика на БК0010? Но все эти фигурные скобочки - у меня
ассоциация с комментами из паскаля ))) Паскаль - просто больше похож
(Delphi сюда же). на язык человека и наглядней (для меня) для простых
вычислений. Но я не профи.


Вот кстати говоря вопрос такой - если Си родился из макро-11 (а судя
по данным многие профессионалы сразу начинали с той самой версии,
минуя ассемблер, где Паскаль впервые в виде транслятора появился,
так же на PDP? (наверное это легко нагуглить, но всё же).

---------- Post added at 20:35 ---------- Previous post was at 20:34 ----------


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

Patron
30.01.2013, 20:46
Главное - какой будет быстрее работать?Сейчас оптимизаторы достигли такой крутизны, что при включённой глобальной оптимизации - вызов целого вороха вложенных функций может скомпилироваться в одну-две ассемблерных команды вообще без всяких вызовов подпрограмм.

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

nzeemin
30.01.2013, 20:58
Patron, Vamos -- спасибо за критику и вклад в проект.
Сейчас станции уже начинают пытаться переговариваться, но сбиваются.

http://img-fotki.yandex.ru/get/4119/7448436.7/0_7a31e_3d220139_orig

При этом на принимающей станции выпадает в СТОП.

Загрузчик из сети в ПЗУ (спасибо Alex_K):


; Загрузчик из сети
164160$:MTPS #340 ; Запретить прерывания
MOVB @#176561,R5 ; Выделение в R5 номера сетевой станции
MOV R5,R0
BIC #177760,R5
ASR R0
BIC #177717,R0
BIS R0,R5
MOVB R5,164556$ ; Сохранение номера сетевой станции
MOVB 164572$,R0 ; R0 = 173(8)
XOR R5,R0 ; R0 = 173(8) XOR номер_сетевой_станции
MOVB R0,164572$
MOV #30,R0 ; R0 = 30 (адрес вектора команды EMT)
MOV #164500$-164160$+1000,(R0)+ ; Установка вектора прерывания EMT
CLR (R0)+ ; Установка ССП при вызове EMT
MOV #164512$-164160$+1000,(R0)+ ; Установка вектора прерывания TRAP
CLR (R0)+ ; Установка ССП при вызове TRAP
164244$:MOV #10000,SP ; Установка указателя стека
MOV #164526$-164160$+1000,@#100 ; Устан. вект. прер. сет. таймера
CLR @#102
MTPS #0 ; Разрешить прерывания
CLR 164534$ ; Очистка счетчика ожидания
164272$:TRAP 0 ; Чтение пришедшего байта
CMP 164534$,#5 ; Счетчик ожидания больше пяти
BLO 164272$ ; Нет
164304$:EMT 0 ; Посылка и чтение очередного байта
CMPB #376,R0 ; Пришедший байт равен 376(8)
BNE 164304$ ; Нет
MOV #164554$-164160$+1000,R1 ; R1 = адрес блока передачи
164320$:MOVB (R1)+,R0 ; R0 = очередной байт из блока передачи
CMPB #376,R0 ; Он равен 376(8) ?
BEQ 164334$ ; Да
EMT 0 ; Посылка и чтение очередного байта
BR 164320$
164334$:EMT 0 ; Посылка и чтение очередного байта
CMPB #377,R0 ; Прочитанный байт равен 377(8) ?
BNE 164334$ ; Нет
EMT 0 ; Посылка и чтение очередного байта
CMPB R5,R0 ; Полученный байт равен номеру станции ?
BNE 164334$ ; Нет
MOV #377,R4 ; R4 = 377(8) (контрольная сумма)
XOR R0,R4 ; R4 = 377(8) XOR номер_сетевой_станции
MOV #50000,R1 ; R1 = адрес расположения загрузчика
EMT 0 ; Посылка и чтение очередного байта
MOV R0,R3 ; R3 = считанный байт
XOR R0,R4 ; Подсчет контрольной суммы
164372$:EMT 0 ; Посылка и чтение очередного байта
CMPB #373,R0 ; Считанный байт равен 373(8) ?
BLOS 164410$ ; Выше или равен 373(8)
XOR R0,R4 ; Подсчет контрольной суммы
MOVB R0,(R1)+ ; Передача принятого байта в память
BR 164372$
164410$:BNE 164426$ ; Принятый байт равен не равен 373(8)
EMT 0 ; Посылка и чтение очередного байта
COM R0 ; Инверсия принятого байта
XOR R0,R4 ; Подсчет контрольной суммы
MOVB R0,(R1)+ ; Передача принятого байта в память
COM R0 ; Инверсия для передачи
BR 164372$
164426$:CMPB #374,R0 ; Принятый байт равен 374(8)
BNE 164244$ ; Нет
EMT 0 ; Посылка и передача байта
CMPB R0,R4 ; Он равен контрольной сумме ?
BNE 164244$ ; Нет
EMT 0 ; Посылка и передача байта
BISB #10,R0 ; R0 = R0 OR 10(8)
EMT 0 ; Посылка и передача байта
CMPB #377,R0 ; Принятый байт равен 377(8)
BNE 164244$ ; Нет
EMT 0 ; Посылка и передача байта
MOV #4,@#176560 ; Включение кольцевой сети
MTPS #340 ; Запретить прерывания
JMP @#50000 ; Переход на исполнение загрузчика
; Подпрограмма передачи байта в локальную сеть (исполнение команды EMT)
164500$:TSTB @#176564 ; Передатчик СА готов ?
BPL 164500$ ; Нет
MOVB R0,@#176566 ; Передача байта в сеть
; Подпрограмма чтения байта, пришедшего по сети (исполнение команды TRAP)
164512$:TSTB @#176560 ; Приемник СА готов ?
BPL 164512$ ; Нет
MOVB @#176562,R0 ; Прием байта из сети
RTI
; Подпрограмма исполнения прерываний таймера
164526$:CLR @#176560 ; Включение режима загрузки
INC (PC)+ ; Инкремент счетчика ожидания
164534$:.WORD 0
CMP 164534$,#1000 ; Счетчик ожидания превысил лимит времени ?
BHI 164550$ ; Да
RTI
164550$:JMP 164244$
; Блок передачи в сеть
164554$:.BYTE 377,0,0,204,0,0,0,0,0,0,0,0,0,374,173,60,377,376,0 ,0

Patron
30.01.2013, 21:05
Сейчас станции уже начинают пытаться переговариваться, но сбиваются.Это происходит из-за того, что в эмулируемом порту (почему-то) эмулируется overrun.
Можно вставить в эмулятор слежение за битом 012 в регистре состояния приёмника и убедиться.

Vamos
30.01.2013, 21:08
Так вот он какой 1801ВП-065, там оказывается есть бит 0 и бит 2 в регистре состояния приемника.
Бит 2 это вывод ST, программное управление вкл./выкл. станции из кольцевой сети.
Бит 0 ??? , разрыв линии

Получается это те самые DTR/DSR которые и должны были быть 107, 108 на стыке С2

Alex_K
30.01.2013, 21:28
Так вот он какой 1801ВП-065, там оказывается есть бит 0 и бит 2 в регистре состояния приемника.
Бит 2 это вывод ST, программное управление вкл./выкл. станции из кольцевой сети.
Бит 0 ??? , разрыв линии

Получается это те самые DTR/DSR которые и должны были быть 107, 108 на стыке С2
Уже писалось, что линии квитирования ни на какие биты не выводятся, квитирование делается полностью аппаратно самим 1801ВП1-065.
Бит 0 - разрыв линии - это посылка BREAK.
А вывод ST - это не бит 2, а сигнал "свой адрес". Благодаря этому можно на неиспользуемые биты 1801ВП1-065 вешать свою обвязку без необходимости дешифрации адреса. В этом случае достаточно запомнить только младшие биты (различать приемник, передатчик, регистры данных) и реагировать на сигналы DIN, DOUT. Сигнал RPLY выставит сама 1801ВП1-065. Вот в этой обвязке есть номер станции и управление электронным коммутатором сети.

Vamos
31.01.2013, 00:26
Это происходит из-за того, что в эмулируемом порту (почему-то) эмулируется overrun.
А подскажите пожалуйста как в НХ сервере сделана работа с СОМ портом, что переполнения не происходит.

Patron
31.01.2013, 02:18
А подскажите пожалуйста как в НХ сервере сделана работа с СОМ портом, что переполнения не происходит.Так и там тоже были переполнения

http://zx-pk.ru/attachment.php?attachmentid=39491&stc=1&d=1358979832

поэтому, проверить на счёт переполнений всегда есть смысл первым делом.

Vamos
31.01.2013, 02:30
Так и там тоже были переполнения
НО переполнения возникали уже в загрузчике НХ сервера, а все остальные программы вызывают переполнение в загрузчике УКНЦ, почти сразу.
Есть ли смысл рассматривать фукцию CreateFile() с параметром FILE_FLAG_OVERLAPPED или результат будет такой же?

Patron
31.01.2013, 03:25
Есть ли смысл рассматривать фукцию CreateFile() с параметром FILE_FLAG_OVERLAPPED или результат будет такой же?Т.е. чтение виртуального порта в Windows возвращается с ошибкой?
Но ведь в порту com0com включена бесконечная буферизация и переполнения быть не может..

Vamos
31.01.2013, 03:38
Как я понял, запись в буфер происходит слишком быстро и код эмулятора не успевает.

Vamos
31.01.2013, 03:51
Ну вот чего ему не хватает :mad:

http://zx-pk.ru/attachment.php?attachmentid=39581&stc=1&d=1359589855

если кому попадался этот тест с пунктом 6 (стык С2) поделитесь пожалуйста.

Patron
31.01.2013, 03:54
Как я понял, запись в буфер происходит слишком быстро и код эмулятора не успевает.Речь пока не о диагнозе, а об анамнезе - т.е. действительно ли какая-то из функций Windows ( чтение порта, запись порта ) возвращает ошибку или WaitCommEvent рапортует о EV_ERR ?

Vamos
31.01.2013, 04:16
Patron, на этот вопрос у меня ответа нет, но вот код, может там чего


if (m_SerialInCallback != NULL && frameticks % 416 == 0)
{
CFirstMemoryController* pMemCtl = (CFirstMemoryController*) m_pFirstMemCtl;
if ((pMemCtl->m_Port176574 & 004) == 0) // Not loopback?
{
BYTE b;
if (m_SerialInCallback(&b))
{
if ((pMemCtl->m_Port176570 & 0200) == 0) // Ready?
{
pMemCtl->m_Port176572 = b;
}
else
{
pMemCtl->m_Port176570 |= 010000; // Set Overflow flag
}
pMemCtl->m_Port176570 |= 0200; // Set Ready flag
}
}
}

if (m_SerialOutCallback != NULL && frameticks % serialOutTicks == 0)
{
CFirstMemoryController* pMemCtl = (CFirstMemoryController*) m_pFirstMemCtl;
if (serialTxCount > 0)
{
serialTxCount--;
if (serialTxCount == 0) // Translation countdown finished - the byte translated
{
if ((pMemCtl->m_Port176574 & 004) == 0) // Not loopback?
{
(*m_SerialOutCallback)((BYTE)(pMemCtl->m_Port176576 & 0xff));
}
else // Loopback
{
pMemCtl->m_Port176572 = pMemCtl->m_Port176576 & 0xff;
pMemCtl->m_Port176570 |= 0200; // Set Ready flag
}
pMemCtl->m_Port176574 |= 0200; // Set Ready flag
}
}
else if ((pMemCtl->m_Port176574 & 0200) == 0) // Ready is 0?
{
serialTxCount = 8; // Start translation countdown
}
}

nzeemin
31.01.2013, 09:27
У меня пока основная гипотеза -- что передача байт из эмулятора происходит без проверки того готов ли к этому COM-порт. Поэтому вероятно мы и видим overrun. Вообще общение с COM-портом у меня построено не на overlapped и не на событиях, а по более простой схеме -- чисто байтовое чтение и запись. При чтении если очередной байт не готов -- он не отдаётся. Но при записи пишется всё не взирая на возможные переполнения.

hobot
31.01.2013, 11:44
если кому попадался этот тест с пунктом 6 (стык С2) поделитесь пожалуйста.
Эта версия TUK.SAV от СЭМЗА, я сейчас потыкался - другой версии не нашёл,
попробуй TS.SAV - просто ради эксперимента?

http://savepic.org/2745756.png

http://savepic.org/2736540.png


и вот ещё отдельный для СА "TSA.SAV"
http://savepic.org/2697628.png

hobot
31.01.2013, 11:46
Кажется где-то под С2 было что-то отдельно написано, если откопаю-вспомню выложу сразу.

Patron
31.01.2013, 12:41
Поэтому вероятно мы и видим overrun.А мы таки видим именно overrun ?

Мы видим именно бит 010000 в регистре статуса приёмника ?

Если да - это неправильная эмуляция.

Вот такой код в принципе ошибочен:


if (m_SerialInCallback(&b))
{
if ((pMemCtl->m_Port176570 & 0200) == 0) // Ready?
{
pMemCtl->m_Port176572 = b;
}
else
{
pMemCtl->m_Port176570 |= 010000; // Set Overflow flag
}
pMemCtl->m_Port176570 |= 0200; // Set Ready flag
}



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

Но ещё надо учитывать, что драйвер com0com - пакетный. Он не следит за промежутком времени между байтами ( в Windows вообще ни одна программа этого не делает ), поэтому, если эмулятор допускает формирование признака overrun - при работе в Windows этот признак обязательно будет формироваться.

---------- Post added at 11:38 ---------- Previous post was at 11:35 ----------

Здесь даже промежутки времени не столь важны.

Ведь в реальном порту действует квитирование, т.е. байт не может быть принят, если порт не готов. А в эмуляторе может! И даже признак overrun формируется!

---------- Post added at 11:41 ---------- Previous post was at 11:38 ----------

Поэтому - в нынешнем состоянии эмулятор эмулирует работу 1801ВП1-065 по кабелю без линий квитирования. А по такому кабелю ни TU58, ни сеть УКНЦ работать не могут.

Alex_K
31.01.2013, 14:39
Если да - это неправильная эмуляция.

Вот такой код в принципе ошибочен:


if (m_SerialInCallback(&b))
{
if ((pMemCtl->m_Port176570 & 0200) == 0) // Ready?
{
pMemCtl->m_Port176572 = b;
}
else
{
pMemCtl->m_Port176570 |= 010000; // Set Overflow flag
}
pMemCtl->m_Port176570 |= 0200; // Set Ready flag
}

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

Ведь в реальном порту действует квитирование, т.е. байт не может быть принят, если порт не готов. А в эмуляторе может! И даже признак overrun формируется!
Поэтому - в нынешнем состоянии эмулятор эмулирует работу 1801ВП1-065 по кабелю без линий квитирования. А по такому кабелю ни TU58, ни сеть УКНЦ работать не могут.
А как это так, что байт не может быть принят, если порт не готов? Может, еще как может. Ведь для приема другая сторона его передает, а если она не следит за состояниями линии квитирования, то она может его передать и возможно переполнение. Единственное 1801ВП1-065 не сможет передать байт, если на линии BSYD нет готовности от приемника той стороны.
И кстати в сетевом адаптере линии квитирования не используются, там только прием, передача и земля.

Patron
31.01.2013, 14:47
А в чем ошибочность кода? Если стоит признак готовности, то данные с приемника не считаны, и при приходе других данных ставится бит переполнения, а принятая посылка теряется.Ошибочность в том, что Windows не исключает приход в программу любого количества байтов без задержки вообще. Это же мы не с аппаратным портом по прерываниям работаем, а опрашиваем входной буфер Windows ёмкостью 3К. Пока Windows занимается своими делами - в этом буфере копятся байты, а когда процесс исполняющейся программы эмулятора получает свой квант - ему вываливаются из буфера все накопившиеся там байты разом.


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

Alex_K
31.01.2013, 15:03
Ошибочность в том, что Windows не исключает приход в программу любого количества байтов без задержки вообще. Это же мы не с аппаратным портом по прерываниям работаем, а опрашиваем входной буфер Windows ёмкостью 3К. Пока Windows занимается своими делами - в этом буфере копятся байты, а когда процесс исполняющейся программы эмулятора получает свой квант - ему вываливаются из буфера все накопившиеся там байты разом.
Это же с какой скоростью по COM-порту идти данные? Да и как же редко программ должна получать кванты времени?
Проблема может быть в другом. UKNCBTL работает по фреймам, 25 фреймов в секунду. Т.е. быстренько эмулируется 1/25 секунды, обновляется экран, а потом спит в ожидании завершения 1/25 секунды на реальном PC. Вот во время этой спячки и могут придти реальные данные. Но однако же в эмуляторе данные с очереди снимаются со скоростью порта внутри фрейма, поэтому между снятиями данных эмулируемая программа должна успеть прочесть приемник. Если успевает, то и переполнения не будет.

И это на скорости 57600.. Круто! Быстро же должны работать программы сетевого обмена, чтобы не потерять ни одного байта.
Быстро. Загрузчик из ПЗУ без прерываний. А в RT-11 драйвер MC.SYS работает в режиме прерываний. Но драйвер MC.SYS не является самим драйвером, а скорее резидентной программой, сидящей на обработке и отправке пакетов по сети.

Titus
31.01.2013, 15:07
UKNCBTL работает по фреймам, 25 фреймов в секунду. Т.е. быстренько эмулируется 1/25 секунды, обновляется экран, а потом спит в ожидании завершения 1/25 секунды на реальном PC.
А чего не 1/50? Почему выбрали каждый второй фрейм?

Patron
31.01.2013, 15:34
между снятиями данных эмулируемая программа должна успеть прочесть приемник. Если успевает, то и переполнения не будет.Именно так. И проведённые испытания показывают, что как раз и не успевает.

В настройках COM-порта можно сделать дополнительную опцию: Эмулировать OVERRUN - при включении которой чтение из буфера Windows будет работать как сейчас, а при выключении - как надо.

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


А чего не 1/50?Даже за 1/50 секунды com0com на скорости 9600 насыпет во входной буфер 20 байтов.

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

Хочется же иметь возможность эмулировать как работу по кабелю без квитирования, так и работу по кабелю с квитированием.

Вот выбор этих режимов и надо добавить в окно настроек COM-порта.

Alex_K
31.01.2013, 15:35
Именно так. И проведённые испытания показывают, что как раз и не успевает.
В эмуляторе еще не сделана корректно эмуляция последовательного порта, вот дождемся нормальной эмуляции, тогда уже можно говорить о переполнении, есть или нет.

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

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

Patron
31.01.2013, 16:07
В эмуляторе еще не сделана корректно эмуляция последовательного порта, вот дождемся нормальной эмуляции, тогда уже можно говорить о переполнении, есть или нет.Т.е. до сих пор неизвестно, устанавливается ли бит переполнения в ходе работы..
А если добавить в это самое место отладочную печать и всё узнать ?

Alex_K
31.01.2013, 16:27
Т.е. до сих пор неизвестно, устанавливается ли бит переполнения в ходе работы..
А если добавить в это самое место отладочную печать и всё узнать ?
В эмуляторе есть такая функция для вывода сообщения в консоль вроде DebugPrint. Так что можно в интересующие места программы вставлять вывод на консоль.

Patron
31.01.2013, 16:27
Если с выключенной эмуляцией оверрана всё заработает - значит оверран эмулируется плохо. Если же и тогда ничего не заработает - значит качество эмуляции оверрана не при чём.

alone
31.01.2013, 16:42
Сейчас оптимизаторы достигли такой крутизны, что при включённой глобальной оптимизации - вызов целого вороха вложенных функций может скомпилироваться в одну-две ассемблерных команды вообще без всяких вызовов подпрограмм.
Удивительно, почему тогда программы пухнут год от года.

Patron
31.01.2013, 17:14
Если загрузчик TU58 использует сигнал BREAK, то он не начнёт нормально работать до тех пор, пока в нужные места эмулятора не будут вставлены вызовы SetCommBreak и ClearCommBreak.

Patron
01.02.2013, 17:05
Эксперимент по запуску эмулятора TU58 с "Эмулятором ДВК" показал, что эмуляция сигнала BREAK для работы с эмулятором TU58 через com0com не обязательна.

После запуска - TU58.exe предлагает нажать клавишу [Esc] и пропустить ожидание сигнала BREAK. После чего начинает обрабатывать пакеты в заданном порту, позволяя результативно выполнить в эмуляторе ДВК команды DIR DD: и BOOT DD:

---------- Post added at 16:05 ---------- Previous post was at 14:48 ----------

Выяснилось, что эксперимент по работе с эмулятором TU58 без сигнала BREAK был не вполне корректным - оказывается, и эмулятор последовательного порта в "Эмуляторе ДВК", и адаптер COM-порта в модульном API поддерживают передачу сигнала BREAK. В описании com0com тоже указано, что передача сигнала BREAK не просто поддерживается, а многократно улучшалась.

Однако, эмулятор TU58 начал нормально работать только после отключения ожидания сигнала BREAK нажатием клавиши [Esc].

Так что пока вся эта история с сигналом BREAK выглядит довольно непонятно.

Vamos
01.02.2013, 18:26
как бы вот, после нажатия ESC
http://zx-pk.ru/attachment.php?attachmentid=39598&stc=1&d=1359728766

Patron
01.02.2013, 21:59
как бы вот, после нажатия ESC
Когда я отключил в эмуляторе ДВК посылку сигнала BREAK - стало так же, поэтому без посылки BREAK TU58.exe работать не будет.

Посылку BREAK добавить нетрудно - когда программа устанавливает бит 00 в статусе передатчика - нужно вызвать SetCommBreak( hComPort ) ( и ещё можно сделать Sleep(15) - тогда Windows успевает отреагировать до сброса этого бита эмулятором ), а когда программа обнуляет установленный бит 00 - нужно вызвать ClearCommBreak( hComPort ) ( здесь Sleep уже не нужен ).

---------- Post added at 20:45 ---------- Previous post was at 19:45 ----------

Хотя, если внимательнее присмотреться к сообщениям TU58.exe:


command 2 count 800 block 2

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

Поэтому, ситуация с сигналом BREAK в данном конкретном случае не вполне ясна - если TU58.exe и без сигнала BREAK передал загрузчик, то на чём всё потом остановилось..

Однако, когда я отключил BREAK в эмуляторе ДВК и дал DIR DD: - эффект был нулевой, а с посылкой BREAK - всё работало как надо.

---------- Post added at 20:49 ---------- Previous post was at 20:45 ----------

Возможно, в последнем случае дело было не в самом сигнале BREAK, а в том, что при подаче BREAK эмулятор делал Sleep(15) - вот TU58.exe и успевал ответить до отвала драйвера DD.SYS по таймауту.

Сейчас проверю эту гипотезу..

---------- Post added at 20:59 ---------- Previous post was at 20:49 ----------

ДА! TU58.exe нормально работает без BREAK !!!

Если вместо сигнала BREAK просто делать Sleep(15) - TU58.exe без проблем обслуживает любые запросы драйвера DD.SYS

Только что загрузил RT-11 c DD: с отключенной посылкой BREAK.

Vamos
01.02.2013, 22:01
то на чём всё потом остановилось..

вот на этом

http://zx-pk.ru/attachment.php?attachmentid=39601&stc=1&d=1359741657

Patron
01.02.2013, 22:29
вот на этомТ.е. загрузчик успешно прочитался, успешно запустился и довольно много чего читает.

Есть уже отладочная печать в том месте, где бит переполнения устанавливается ?
Из-за переполнения проблема или нет ?

Vamos
01.02.2013, 22:48
Есть уже отладочная печать в том месте, где бит переполнения устанавливается ?
У меня нет.


Из-за переполнения проблема или нет ?
видимо нет. видимо BREAK
http://zx-pk.ru/attachment.php?attachmentid=39602&stc=1&d=1359744341

Подскажите куда втыкать SetCommBreak, там где порт инициализируется или там где бит 00 обрабатывается.

Patron
01.02.2013, 23:29
куда втыкать SetCommBreak
Вот сюда:


void CFirstMemoryController::SetPortByte(WORD address, BYTE byte)
{
WORD word = (address&1)?((WORD)byte) << 8:(WORD)byte;
switch (address) {
case 0176574: // Стык С2: Регистр состояния передатчика
case 0176575:
if (((m_Port176574 & 0300) == 0200) && (word & 0100))
m_pProcessor->InterruptVIRQ(8, 0374);
if (word & 01)
{
if (!(m_Port176574 & 01))
{ // BREAK
SetCommBreak( m_hEmulatorComPort );
Sleep(15);
}
}
else
if (m_Port176574 & 01)
ClearCommBreak( m_hEmulatorComPort );
m_Port176574 = (m_Port176574 & ~0105) | (word & 0105);
break;
}
}

void CFirstMemoryController::SetPortWord(WORD address, WORD word)
{
switch (address) {
case 0176574: // Стык С2: Регистр состояния передатчика
case 0176575:
if (((m_Port176574 & 0300) == 0200) && (word & 0100))
m_pProcessor->InterruptVIRQ(8, 0374);
if (word & 01)
{
if (!(m_Port176574 & 01))
{ // BREAK
SetCommBreak( m_hEmulatorComPort );
Sleep(15);
}
}
else
if( m_Port176574 & 01 )
ClearCommBreak( m_hEmulatorComPort );
m_Port176574 = (m_Port176574 & ~0105) | (word & 0105);
break;
}
}

nzeemin
02.02.2013, 17:10
Я вот думаю -- не проще ли сразу после SystemFrame() вызвать SetCommBreak(), а непосредственно перед SystemFrame() сделать ClearCommBreak().
Если проблема действительно в паузе между фреймами, это может помочь.

---------- Post added at 17:10 ---------- Previous post was at 17:00 ----------

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

Vamos
02.02.2013, 17:17
Пока только код от Patron
http://zx-pk.ru/attachment.php?attachmentid=39608&stc=1&d=1359811007

Patron
02.02.2013, 18:17
я пробовал запускать загрузку по сети когда оба эмулятора работают на полной скорости (без звука) -- загрузка тоже падает с ошибкой.Сначала лучше загрузку с эмулятора TU58 по С2 наладить - для неё я (в принципе) могу сделать лог всех выполняемых процессором команд.

---------- Post added at 17:09 ---------- Previous post was at 17:01 ----------


Пока толькоА если не грузиться сразу при помощи TU58.SAV, а сначала загрузиться как обычно и дать команду:
DIR/FU/BL/VOL DD:

А потом:
BOOT DD:

---------- Post added at 17:17 ---------- Previous post was at 17:09 ----------

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

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

nzeemin
02.02.2013, 23:00
На реальной машине вот так

На текущем коде эмулятора (ревизия 482), палитра GRB.
Думаю, этот тест можно считать пройденным.

http://img-fotki.yandex.ru/get/6424/7448436.7/0_7a3ef_7834a066_orig

nzeemin
03.02.2013, 16:15
Beta 38

- Палитра в 128 цветов, из-за этого размер файла скриншота увеличился в два раза
- Интегрирован код работы с COM-портом и код реализации сети через COM-порт от Vamos; работа Стык С2 явно улучшилась; но сеть пока практически не работает
- Для настройки COM-портов сделан диалог редактирования структуры DCB
- Исправление ошибок

http://ukncbtl.googlecode.com/files/UKNCBTL-beta38-exe.zip

Благодаря лучшей реализации Стык С2 появилась возможность загрузки и работы с HX Server, связь двух программ на одном PC выполняется через виртуальные порты com0com.
Последняя версия HX Server by Patron: http://zx.pk.ru/showthread.php?p=569515#post569515
Инструкции по настройке: http://zx-pk.ru/showpost.php?p=564797&postcount=160
Запускаем HX Server. После этого запускаем эмулятор, в Settings указываем правильное название и настройки порта. В главном меню УКНЦ выбираем загрузку со Стык С2. Ожидаем загрузки системы.

Выражаю особую благодарность тем, кто активно помогал и содействовал появлению этой версии: Vamos, Patron, Titus и конечно hobot.

Patron
03.02.2013, 16:46
У меня сложилось впечатление, что в коде посылки BREAK можно обойтись вообще без Sleep(15)


if (!(m_Port176574 & 01))
{ // BREAK
SetCommBreak( m_hEmulatorComPort );
Sleep(15);
}

nzeemin
03.02.2013, 20:06
Поскольку утилита оказалась востребованной, сделал небольшое улучшение.
Теперь в командной строке можно задать опцию -dcb и указать к ней параметры структуры DCB, например:
UkncComSender.exe COM8 VERT.SAV -dcb "rts=on"


UkncComSender Utility v1.2 by Nikita Zimin [Feb 3 2013 19:57:55]

Serial port name is not specified.

Usage: UkncComSender [<Options>] <PortName> <FileToSendName>
Options:
-dcb "<DcbParams>"
<DcbParams>:
baud=b
parity={n|e|o|m|s}
data={5|6|7|8}
stop={1|1.5|2}
to={on|off}
xon={on|off}
odsr={on|off}
octs={on|off}
dtr={on|off|hs}
rts={on|off|hs|tg}
idsr={on|off}


Реализация использует функцию Win32 BuildCommDCB(), которая парсит строку параметров и заполняет DCB: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363143(v=vs.85).aspx

http://ukncbtl.googlecode.com/files/UkncComSender.zip

NovaStorm
03.02.2013, 21:24
nzeemin, вот с таким ini крашится, не знаю, нужно ли что-то поправлять, без него-то работает =)


[UKNCBTL]
Toolbar=1
Keyboard=1
Tape=0
ScreenHeightMode=4
Debug=0
Cartridge1=C:\Documents and Settings\User\Мои документы\Dropbox\УКНЦ\UKNCBTL\roms\i de_wdromv0110.bin
Sound=1
Hard2=C:\hdd.img
Parallel=0
Autostart=0
SerialPort=
SoundVolume=27531

nzeemin
03.02.2013, 21:54
nzeemin, вот с таким ini крашится, не знаю, нужно ли что-то поправлять, без него-то работает =)

Спасибо за баг-репорт.
В коде подключения картриджа у меня ошибка -- проверяет на INVALID_HANDLE_VALUE, а должно проверять на 0.

Vamos
05.02.2013, 20:06
Помучал еще код эмулятора, добился стабильной загрузки TU58, теперь загрузка из сети проходит до стадии загрузки системы а дальше опять облом с переполнением :( .

http://zx-pk.ru/attachment.php?attachmentid=39654&stc=1&d=1360080317

http://zx-pk.ru/attachment.php?attachmentid=39655&stc=1&d=1360080317

Patron
05.02.2013, 20:38
опять облом с переполнением

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



#include <deque>
std::deque<BYTE> CA_OverrunBuf;

BOOL CFirstMemoryController::NetworkInput(BYTE inputByte)
{
if (m_Port176560 & 0200) // Ready?
{
if( bEmulate_CA_Overrun )
{
m_Port176560 |= 010000; // Set Overflow flag
}
else
{
CA_OverrunBuf.push_back( inputByte ); // Store byte..
}
}
else
{
m_Port176562 = (WORD)inputByte;
m_Port176560 |= 0200; // Set Ready flag
if (m_Port176560 & 0100) // Interrupt?
return TRUE;
}
return FALSE;
}

WORD CFirstMemoryController::GetPortWord(WORD address)
{
switch (address) {
case 0176562: // СА: Регистр данных приемника
case 0176563: // нижние 8 бит доступны по чтению
m_Port176560 &= ~010200; // Reset bit 12 and bit 7
if( CA_OverrunBuf.size() )
{
WORD uPrev = m_Port176562;
m_Port176562 = (WORD)CA_OverrunBuf.front();
CA_OverrunBuf.pop_front();
m_Port176560 |= 0200; // Set Ready flag
if( m_Port176560 & 0100 )
m_pCPU->InterruptVIRQ(9, 0360);
return (uPrev + m_NetStation);
}
return (m_Port176562 + m_NetStation);
}
}



Кстати - при переполнении в регистре данных остаётся старый байт, а не появляется новый.

Vamos
05.02.2013, 20:52
Вот код, эмулирующий работу по кабелю с квитированием и полностью исключающий переполнения
Дело в том что сеть УКНЦ работает без квитирования и у меня задача чуть больше чем соединить два эмулятора. И проблема на самом деле как я и писал ранее в том что код эмулятора в определенные моменты не успевает за отведенное системным фреймом время сбросить бит готовности, кое что из вашего кода я сейчас попробую, спасибо, есть подозрение что обработка прерываний тормозит.

Patron
05.02.2013, 21:03
В любом случае - принятый байт может попасть в регистр данных только если бит готовности сброшен.

Исходник, который я редактировал - содержал ошибку:



BOOL CFirstMemoryController::NetworkInput(BYTE inputByte)
{
m_Port176562 = (WORD)inputByte;
if (m_Port176560 & 0200) // Ready?
m_Port176560 |= 010000; // Set Overflow flag
else
{
m_Port176560 |= 0200; // Set Ready flag
if (m_Port176560 & 0100) // Interrupt?
return TRUE;
}
return FALSE;
}


Должно быть так:



BOOL CFirstMemoryController::NetworkInput(BYTE inputByte)
{
if (m_Port176560 & 0200) // Ready?
m_Port176560 |= 010000; // Set Overflow flag
else
{
m_Port176562 = (WORD)inputByte;
m_Port176560 |= 0200; // Set Ready flag
if (m_Port176560 & 0100) // Interrupt?
return TRUE;
}
return FALSE;
}

Vamos
05.02.2013, 21:18
В любом случае - принятый байт может попасть в регистр данных только если бит готовности сброшен.
Так я уже пробовал, только другим способом в результате загрузка останавливалась почти сразу, причем не важно по прерываниям или с проверкой бита готовности работала программа. В случае с СА там происходит переполнение не случайным образом а стабильно в одном и том же месте т.е. вторичный загрузчик из сети уже работает по прерываниям, а вот когда загрузилась RT-11 похоже в момент смены адресов вектора прерывания этот лишний байт и пролезает

http://zx-pk.ru/attachment.php?attachmentid=39656&stc=1&d=1360084655

http://zx-pk.ru/attachment.php?attachmentid=39657&stc=1&d=1360084655

Patron
05.02.2013, 23:01
На скорости 57600 при 12 битах на посылку порт СА получает 4800 байтов в секунду, а значит новый байт приходит через каждые 208'000 наносекунд.

Vamos
05.02.2013, 23:16
Каждый фрейм равен 1/25 секунды = 40 мс = 20000 тиков, 1 тик = 2 мкс.

* 20000 тиков системного таймера - на каждый 1-й тик
* 2 сигнала EVNT, в 0-й и 10000-й тик фрейма
* 320000 тиков ЦП - 16 раз за один тик
* 250000 тиков ПП - 12.5 раз за один тик
* Отрисовка 288 видимых строк, по 32 тика на строку (только в первой половине фрейма)
** Первая невидимая строка (#0) начинает рисоваться на 96-ой тик
** Первая видимая строка (#18) начинает рисоваться на 672-й тик
* 625 тиков FDD - каждый 32-й тик
* 52 тиков обмена с COM-портом - каждый 416 тик
* 8 тиков обмена с NET-портом - каждый 64 тик ???
Если я все правильно понимаю, то в эмуляторе каждое телодвижение синхронизировано с системным фреймом, и какое бы кол-во байт в сек. не приходило оно будет считываться из буфера строго в определенный момент времени и на выполнение команд процессором отведено времени кратно этому считыванию и если за отведенный промежуток времени на считывание процессор не успевает прочесть приемник то возникает преполнение. Как то так.

Patron
06.02.2013, 00:19
Если 1 мс это 500 тиков, то в порт С2 поступает по одному байту каждые 573 тика ( а не каждые 416 тиков), а в порт СА по одному байту каждые 104 тика ( на не каждые 64 тика ).

Vamos
06.02.2013, 00:38
Patron, Вы абсолютно правы, просто расчеты не мои и делилось не на 12 бит а на 8, но это сути дела не меняет. Попробую еще раз объяснить, ситуация аналогична как с НХ сервером при работе со сжатием, только в данном случае на мой взгляд почему-то кодом эмулятора процессора долго обрабатывается прерывание или что-то еще. Т.е. на 104 тика отведенные для чтения из регистра процессору дается 104*16 тиков, а вот успеет ли выполнится тот или иной набор команд вопрос, видимо не всегда успевает.

Patron
06.02.2013, 00:43
процессору дается 104*16 тиковА тайминги конкретных команд процессора как учитываются ?
Сколько команд обработчика прерывания порта СА успевает выполниться между байтами ?

Vamos
06.02.2013, 00:49
А тайминги конкретных команд процессора как учитываются ?
Ну насколько мне известно про тайминги то они условны насколько условны я не знаю.
На второй вопрос у меня пока тоже нет ответа :(

nzeemin
06.02.2013, 23:56
А тайминги конкретных команд процессора как учитываются ?
Сколько команд обработчика прерывания порта СА успевает выполниться между байтами ?

Точных таймингов команд до сих пор нет. Кроме того, время выполнения команд конечно зависит от времени отклика устройств на шине.
Имеющиеся тайминги команд основаны на таймингах команд БК и несколько изменены, с тем чтобы время выполнения команд по тестам примерно совпадало с реалом.
Конкретику можно посмотреть в emubase/Processor.cpp.
Например, простейшие операции регистр-регистр занимают 11 тактов.

Vamos
07.02.2013, 00:03
Конкретику можно посмотреть в emubase/Processor.cpp.
А можно еще конкретнее, с цифрами, и можно ли изменить скажем тактовую центрального проца отдельно от системного фрейма ?

nzeemin
07.02.2013, 00:10
В эмуляторе есть такая функция для вывода сообщения в консоль вроде DebugPrint. Так что можно в интересующие места программы вставлять вывод на консоль.

Рекомендую для отладочных вещей пользоваться вызовами DebugLog() и DebugLogFormat() -- они пишут в файл trace.log, это быстрее DebugPrint() и не ограничено размером буфера виндового контрола EDIT (кажется, 64К текста).

Если нужно получить в логе трассу команд, можно в конец CProcessor::FetchInstruction() вставить примерно такой блок:


#if !defined(PRODUCT)
WORD address = GetPC() - 2;
WORD data[4];
for (int i = 0; i < 4; i++)
data[i] = GetWord(address + i * 2);
TCHAR strInstr[8];
TCHAR strArg[32];
DisassembleInstruction(data, address, strInstr, strArg);
DebugLogFormat(_T("%06o: %s\t%s\n"), address, strInstr, strArg);
#endif


---------- Post added at 00:10 ---------- Previous post was at 00:05 ----------


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

Цифры все в коде, цифр этих много, зависит от команды и режимов адресации.
Если хочется видеть по конкретному коду сколько тактов занимают команды -- можно смотреть или логировать в конце CProcessor::Execute() на выходе из функции CProcessor::CommandExecution() сколько прописано в m_internalTick -- это и будет время выполнения команды.

Чтобы замедлить/ускорить процессор можно либо в CMotherboard::SystemFrame() изменить количество вызовов SYSTEMFRAME_EXECUTE_CPU и SYSTEMFRAME_EXECUTE_PPU, либо в коде процессора изменять m_internalTick.

Vamos
07.02.2013, 00:16
Т.е. общего тактирования на процессор нет? так чтобы в одном месте подправить.
И еще не понятно сколько времени отводится для выполнения прерывания VIRQ, т.е. процессор вроде как ни каких команд не выполняет но должен сохранить много чего в стеке кажется.

nzeemin
07.02.2013, 00:17
Какие ещё доработки планируются?
Возможно ли ожидать Load State в обозримом будущем и в целом любые новости по этому проекту всегда очень интересно !

Load State не всё сохраняет (например там нет состояния floppy), но в целом он сейчас работает намного стабильнее чем раньше.

По поводу планируемых доработок -- я бы хотел от вас видеть список хотелок. У меня планов ещё много, но я с ними не тороплюсь.

Vamos
07.02.2013, 00:41
По поводу планируемых доработок -- я бы хотел от вас видеть список хотелок.
Где-то я уже писал, не нашел, хочется двойной экран без интерлесинга (он уже был в старых бетах) и полноэкранный режим :) .

NovaStorm
07.02.2013, 10:24
nzeemin, посмотрел новый билд. Не понравилась смена курсора на кнопках, имхо лучше подсвечивать сами клавиши. Было бы неплохо иметь хоткеи на load/save state. Да ещё play/pause на Break для откладки повесить.

hobot
08.02.2013, 00:03
Load State не всё сохраняет (например там нет состояния floppy), но в целом он сейчас работает намного стабильнее чем раньше.

По поводу планируемых доработок -- я бы хотел от вас видеть список хотелок. У меня планов ещё много, но я с ними не тороплюсь.

Жаль сохранение от старой версии не хочет восстановить в последней бете)
Гоняю 38 версию - впечатления самые положительные в целом, особенно в плане
флопов - я не знаю правили там что то или нет, но работают лучше чем когда либо.
Глюк что некоторые приложения с харда отказываются дискеты видеть, но тут
такая вещь - я на реальной машинке столкнулся с этим, иногда без всякого повода
выскакивает ошибка, а повторный запрос может сработать 50\50 (в эмуляторе почти так-же).
Картинки чётко сохраняет вроде проверил в папку эмулятора (!)
Присоединяюсь к Vamos - полноэкранный режим (Screen Mode 5 - почти оно)
(по поводу других прочих версий (QT,SDL) я действительно мог что-то и неправильно написать, поскольку писал с чужих слов-впечатлений - сам пользуюсь и интересуюсь (пока) только Win32 версией)

NovaStorm
08.02.2013, 09:23
А по RT11DSK сюда баги писать? А то у меня она крэшится когда в "rt11dsk l" я ей пихаю образ не дискетки, а винта =)

nzeemin
08.02.2013, 11:31
А по RT11DSK сюда баги писать? А то у меня она крэшится когда в "rt11dsk l" я ей пихаю образ не дискетки, а винта =)

То что крэшится конечно не гуд, но для работы с винчестером предназначены команды hl, hx, hu:


Disk image commands:
rt11dsk l <ImageFile> - list image contents
rt11dsk e <ImageFile> <FileName> - extract file
rt11dsk a <ImageFile> <FileName> - add file
Hard disk image commands:
rt11dsk hl <HddImage> - list HDD image partitions
rt11dsk hx <HddImage> <Partn> <FileName> - extract partition to file
rt11dsk hu <HddImage> <Partn> <FileName> - update partition from the file
Parameters:
<ImageFile> is UKNC disk image in .dsk or .rtd format
<HddImage> is UKNC hard disk image file name
<Partn> is hard disk image partition number, 0..23
<FileName> is a file name to read from or save to

NovaStorm
08.02.2013, 12:21
Да, хелп-то я сообразил посмотреть, потому и засомневался, постить ли...

Vamos
08.02.2013, 13:33
Код:
Disk image commands:
rt11dsk l <ImageFile> - list image contents
rt11dsk e <ImageFile> <FileName> - extract file
rt11dsk a <ImageFile> <FileName> - add file
Hard disk image commands:
rt11dsk hl <HddImage> - list HDD image partitions
rt11dsk hx <HddImage> <Partn> <FileName> - extract partition to file
rt11dsk hu <HddImage> <Partn> <FileName> - update partition from the file
Parameters:
<ImageFile> is UKNC disk image in .dsk or .rtd format
<HddImage> is UKNC hard disk image file name
<Partn> is hard disk image partition number, 0..23
<FileName> is a file name to read from or save to
А есть хелп по дебагеру в эмуляторе, а то я чего-то совсем не могу разобраться :(

nzeemin
08.02.2013, 13:39
А есть хелп по дебагеру в эмуляторе, а то я чего-то совсем не могу разобраться :(

http://code.google.com/p/ukncbtl/wiki/Debugger -- этого недостаточно?
Или давай по конкретным проблемам -- что не получается.

Vamos
08.02.2013, 13:54
Или давай по конкретным проблемам -- что не получается.
"Слева внизу -- отладочная консоль, в которой можно вводить команды; краткий список команд выдается по команде h."
Вот это и не получается, жму h жму другие команды, а в ответ тишина.

nzeemin
08.02.2013, 18:19
"Слева внизу -- отладочная консоль, в которой можно вводить команды; краткий список команд выдается по команде h."
Вот это и не получается, жму h жму другие команды, а в ответ тишина.

Удивительно.
h<Enter> -- даёт хелп

Если действительно всё так плохо -- засними скринкаст чтоли и в меня брось.
Плюс конфигурация системы.

Vamos
08.02.2013, 18:33
Если действительно всё так плохо -- засними скринкаст чтоли и в меня брось.
Плюс конфигурация системы.
что такое скринкаст? если это кнопка видео в эмуляторе, то что снимать, у меня даже символ непечатается. Причем это было на всех бетах.
Что должно входить в конфигурацию системы и как ее получить?

Vamos
08.02.2013, 21:09
nzeemin, извините если отнял ваше время, все работает, пора мне отдыхать,
только щаз заметил в самом низу строчку в которой надо вводить, раньше тыкал в окне выше.

nzeemin
08.02.2013, 23:04
nzeemin, извините если отнял ваше время, все работает, пора мне отдыхать,
только щаз заметил в самом низу строчку в которой надо вводить, раньше тыкал в окне выше.

Это значит что интерфейс неочевиден -- надо переделать.

Кстати, если есть пожелания по отладочным окнам -- велкам!

Vamos
09.02.2013, 00:02
Это значит что интерфейс неочевиден -- надо переделать.

Кстати, если есть пожелания по отладочным окнам -- велкам!
С этой точки зрения я бы разместил строку для ввода команд сразу после "Use 'h' command to show help." т.е. справа.

hobot
10.02.2013, 19:05
В приложенном архиве сохранения из игры Knight (2-3-4 - уровни).
Записывались и проверялись для версии эмулятора beta38.

Подробности

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

Файл в архиве:2level.uknc
http://savepic.ru/4036054.png
Ничего сложного - новые монстры появляются только.

Файл в архиве:2.5level.uknc
http://savepic.ru/4037078.png
Во втором же, только ближе к финалу.

Файл в архиве:3level.uknc
http://savepic.ru/4008406.png
Начало 3-го уровня, его стоит пройти самому
что-бы понять что будет поджидать тебя дальше.

Файл в архиве:3level_FINALMONSTR.uknc
http://savepic.ru/4000214.png
Финальный монстр 3-го уровня.
Жук - очень колоритный персонаж(монстр).

Файл в архиве:4level.uknc
http://savepic.ru/3999190.png
4-й уровень, первый по настоящему сложный для
прохождения, но миновать два перекрёстных обстрела
всё же можно. Задача максимум - пройти без потери попыток.


Запускать в выше указанной версии UKNCBTL.
используя функцию Load State.
http://savepic.ru/4041174.png

На всякий случай, надо и управление напомнить:
F1(K1) - включение\отключение паузы
F2(K2) - три режима звука последовательно
Если во время игры взять бонус "Ферзь" и после
появления счётчика времени включить и отключить
паузу фон продолжит двигаться при замерших монстрах.

Загружаем, пробуем играть.

NovaStorm
12.02.2013, 10:58
А можно ли сделать так, чтобы окно эмулятора было не с фиксированным размером, а изменяемым, его максимизированный статус мог сохраняться, а изображение от УКНЦ центрировалось в окне?

nzeemin
13.02.2013, 21:45
Нумерация версий эмулятора поменялась -- теперь это просто ревизия кода в репозитории.

Изменения:

UKNCBTL: one more fix in serial/network implementation.
UKNCBTL: resizeable main window.
UKNCBTL: ConsoleView prompt moved to separate control.
UKNCBTL: MainWindow_AdjustWindowSize() - change window position only in Debug mode.
UKNCBTL: "Switch CPU/PPU" command.
UKNCBTL: ScreenView bitmap scaling using AVERAGERGB() macro.
UKNCBTL: Version.tpl -> Version.h using SubWCRev.exe for PRODUCT configuration.
UKNCBTL: keyboard mask in KeyboardView.
UKNCBTL: DebugView -- debug toolbar.
UKNCBTL: Emulator_LoadROMCartridge error checking fixed.

hobot
13.02.2013, 22:31
UKNCBTL сборка 495
Полноэкранности пока нет, но сохранения (State (http://zx.pk.ru/attachment.php?attachmentid=39761&d=1360510427)) от 38беты загружает - работают )
Не центруется экран УК-НЦ при развёртывании окна эмулятора.
Или может я просто не научился пока как?

Остальное будем гонять в процессах )

Titus
13.02.2013, 23:38
Нумерация версий эмулятора поменялась -- теперь это просто ревизия кода в репозитории.

Изменения:

UKNCBTL: one more fix in serial/network implementation.
UKNCBTL: resizeable main window.
UKNCBTL: ConsoleView prompt moved to separate control.
UKNCBTL: MainWindow_AdjustWindowSize() - change window position only in Debug mode.
UKNCBTL: "Switch CPU/PPU" command.
UKNCBTL: ScreenView bitmap scaling using AVERAGERGB() macro.
UKNCBTL: Version.tpl -> Version.h using SubWCRev.exe for PRODUCT configuration.
UKNCBTL: keyboard mask in KeyboardView.
UKNCBTL: DebugView -- debug toolbar.
UKNCBTL: Emulator_LoadROMCartridge error checking fixed.

Наверное эмулятор делается специально для иностранцев. Иначе как обьяснить только английские нотации)

---------- Post added at 23:38 ---------- Previous post was at 23:35 ----------

И зачем ресайз окна, если изображение не центруется, и/или не масштабируется?

hobot
13.02.2013, 23:54
Есть ещё два наблюдения :
из плюсов
- ЖД и возможно флоппы (их трудно оценить но ЖД точно) шустрее стал !
из минусов
- каждая новая версия UKNCBTL всё сильнее греет мой ноут (

Остальное будем гонять в процессе ).

---------- Post added at 23:54 ---------- Previous post was at 23:51 ----------


И зачем ресайз окна,
Так Debug режим никто не отменял же, но конечно я им почти не пользуюсь и мне
конечно было-бы комфортнее при необходимости доступа к кнопкам управления иметь экран УК-НЦ по центру или (когда кнопки не нужны) полноэкранный режим )

NovaStorm
14.02.2013, 19:00
>UKNCBTL: resizeable main window.
Про центрирование уже упомянули, я хочу высказаться про "screen mode 5". Когда я разворачиваю окно, слева остаётся его рамка. Разрешение у меня 1280х1024, и охота, чтобы удвоенный по горизонтали экран влезал полностью в монитор, чему рамка мешает.
Может быть стоит вывести наличие интерлейса в отдельную галочку для всех вариантов масштабирования?
Эмулем хоть один англоязычный человек пользуется? =)

hobot
14.02.2013, 19:25
Эмулем хоть один англоязычный человек пользуется? =)
Гарантирую, что да ! )

---------- Post added at 19:22 ---------- Previous post was at 19:20 ----------

Как минимум одна копия в Вашингтоне стоит (или стояла 100% около года назад тогда ещё 24 или 28 версия - не помню какая точно).

---------- Post added at 19:25 ---------- Previous post was at 19:22 ----------


"screen mode 5"
у меня то же не влезает ( , но у меня разрешение меньше 1280х800 - а этот режим
для больших дюймов совсем )

nzeemin
15.02.2013, 14:07
В этой версии переделана логика расчёта расположения окон, с тем чтобы экрану отводилось всё оставшееся место. Экран центрируется, остальное заполняется чёрным. Лишние полоски убраны. Добавлен режим View | Fullscreen.

Titus
15.02.2013, 15:00
А когда будет точная эмуляция таймингов процессора и железа? :v2_wink2:

NovaStorm
15.02.2013, 15:27
nzeemin, при переключении в фулскрин галочка не ставится на этом пункте меню, а так - шикарно! Хотя у меня и без фулскрина всё прекрасно.
Мысли про масштабирование - может удобнее вместо фиксированных выборов сделать выбор масштаба по горизонтали/вертикали, плюс галки коррекции аспекта и интерлейса? Вроде так более "общо".

---------- Post added at 15:27 ---------- Previous post was at 15:21 ----------


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

Titus
15.02.2013, 15:36
А это разве возможно? Насколько я понял, там же шина и то, что по ней ходит, может зависеть не только от конденсаторов на плате и их состояния, но чуть ли не от погоды в Челябинске.
Конечно, возможно) Все это плавает в тестах из-за невозможности точной синхронизации, а на деле подчиняется вполне точным закономерностям.

Patron
15.02.2013, 15:51
Важно, что при любых отклонениях быстродействия ( из-за прогрева, разброса номиналов элементов и т.п. ) соотношение продолжительностей различных команд остаётся неизменным.

Правильные тайминги - это именно правильные соотношения, а не "правильные" абсолютные значения.

Titus
15.02.2013, 16:01
Важно, что при любых отклонениях быстродействия ( из-за прогрева, разброса номиналов элементов и т.п. ) соотношение продолжительностей различных команд остаётся неизменным.

Правильные тайминги - это именно правильные соотношения, а не "правильные" абсолютные значения.

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

NovaStorm
15.02.2013, 16:04
Правильные тайминги - это именно правильные соотношения, а не "правильные" абсолютные значения.
Я не смог осилить тему по таймерам, технически не подкован, но разве с ними при плавающих таймингах проблем не будет? Или это "плавание" слишком мелкое, чтобы их доставить?

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

Vamos
15.02.2013, 16:46
Добавлен режим View | Fullscreen.
Это не тот Fullscreen которого хотелось, а хотелось экран УКНЦ в размер экрана монитора. :(

NovaStorm
15.02.2013, 16:50
Vamos, "fit to screen"? Его же сильно исковеркает.

ZEman
15.02.2013, 16:52
nzeemin, пожалуй тоже поддержу Vamos, сделайте пожалуйста Правильный полноэкранный режим в эмуляторе.

nzeemin
15.02.2013, 17:01
Вопрос же в том как скалировать изображение. Стандартный StretchBlt -- это ужас-ужас, как по качеству так и по производительности. Можно использовать DirectX, можно писать свой скалер -- но оба эти способа мне пока неинтересны.

nzeemin
15.02.2013, 17:14
Сделано сохранение положения окна, режима maximized и режима fullscreen.

NovaStorm
15.02.2013, 19:13
Играл сейчас в LAST HERO, ну КАК ЖЕ не хватает хоткеев на save/load! Можно сделать какие-нибудь F7-F8 для default.uknc? И для Run тоже.
А то на 9 уровне(сколько их там всего?) при большом количестве объектов начинаются просто ЭПИЧЕСКИЕ тормоза и всё дрыгается рывками - по коридорам летать никакой возможности, старею, чтоль? =)
И какой там алгоритм подбора бонусов?

Titus
15.02.2013, 20:10
Я не смог осилить тему по таймерам, технически не подкован, но разве с ними при плавающих таймингах проблем не будет? Или это "плавание" слишком мелкое, чтобы их доставить?
Они казались плавающими, пока не были теоретически обоснованы. А как обосновались, стали неплавающими)

hobot
15.02.2013, 21:02
Это не тот Fullscreen которого хотелось, а хотелось экран УКНЦ в размер экрана монитора.
Присоединяюсь в этом к Vamos, сейчас развертывание окна и центровка УК-НЦ экрана
сделана хорошо, поскольку часто нужно иметь доступ к кнопкам дискет и меню, а вот
галочка (режим) фулскрин (полноэкран) ИМХО: должен делать размер экрана УК-НЦ,
а не окна эмулятора (которое и без галочки теперь можно развернуть) =
desktop.height
desktop.width
Как в допилиной версии БК-эмулятора там же получилось,
(осторожно !)

http://savepic.ru/4025998.jpg


значит и с
УК-НЦ получится - например по нажатию стандартного alt+enter ?
В любом случае - благодарность за центрование экрана внутри окна,
так намного удобнее )))

---------- Post added at 20:59 ---------- Previous post was at 20:54 ----------


И какой там алгоритм подбора бонусов?
До конца не проходил.
По поводу оружия я не брал его после того как классные шевелящиеся снарядики,
покрывающие площадь перед кораблём шириной с сам корабль не начинают лететь
автоматически. Все дальнейшие виды всяких там гипотенуз (смайл) только усложняют
прохождение ) По счёту это или 4 или 5 fier потом их не надо просто собирать. Как-то так.

---------- Post added at 21:02 ---------- Previous post was at 20:59 ----------

По полноэкрану просто добавлю - в таком режиме мой бук (с включенными звуковыми
фишками в эмуляторе) реально превращается в любимый мною БК! ) Как-бы ) Эффект присутствия однако.

Patron
15.02.2013, 21:06
Вот я тоже не смог пока осилить тему по таймерам. Нужна предварительная работа -- прочитать все нужные треды обсуждений и понять что имелось в виду. собрать тесты на диск, погонять их, сопоставить с тем что получилось у умных людей на реале. Потом уже решать что не так сделано в эмуляторе и двигаться по пути улучшения.Общая идея "формулы быстродействия" проста - время выполнения команды складывается из "алгоритмической" задержки и суммарной задержки всех обращений к памяти.

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

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

Titus
15.02.2013, 21:17
Общая идея "формулы быстродействия" проста - время выполнения команды складывается из "алгоритмической" задержки и суммарной задержки всех обращений к памяти.
Это может оказаться не совсем точно.
Точная эмуляция - это эмуляция, при которой каждая команда делится на элементы работы с шиной. Т.е. команда эмулируется не целиком, а дробится на микрокоманды.

---------- Post added at 21:17 ---------- Previous post was at 21:16 ----------

В EmuStudio, кстати, так и сделано)

Patron
15.02.2013, 21:26
Точная эмуляция - это эмуляция, при которой каждая команда делится на элементы работы с шиной. Т.е. команда эмулируется не целиком, а дробится на микрокомандыА я разве не то же самое сказал?

Alex_K
15.02.2013, 21:41
В EmuStudio, кстати, так и сделано)
А в EmuStudio учитывается предвыборка?

Titus
15.02.2013, 22:50
А я разве не то же самое сказал?
Ну, если то, то я согласен)

---------- Post added at 22:50 ---------- Previous post was at 22:47 ----------


А в EmuStudio учитывается предвыборка?
Да, т.к. писано по первому тому родного технического описания. Правда, возможно, не совсем верно, т.к. многой информации тогда еще не было. Тайминги работы блоков тоже сделаны не совсем такие, как должны быть, т.к. такой информации не было. Сейчас тоже нет содержимого ПЗУ микрокоманд процессора. Феликс хоть и сфоткал и что-то начал разбирать, но все это заглохло. Кроме того, у меня не учитываются здадержки памяти.

hobot
15.02.2013, 22:56
nzeemin, правый нижний уголок экрана УК-НЦ в режиме ^полноэкран для окна
и <interlaced upscaled> для экрана УК-НЦ :
http://savepic.ru/4043408.png
Может быть только на моей матрице так? Это не страшно, просто не ясно почему так,
раньше не замечал )

nzeemin
07.03.2013, 22:57
Несколько раздосадованный тем, что пользователям не понравился фулскрин, я сел писать новую архитектуру рендеров.

Суть в том что отрисовщик экрана (рендер) будет вынесен из основного приложения в DLL, причём DLL можно менять, используя разные механизмы формирования изображения. Кроме того, основное приложение не ссылается на зависимые библиотеки, ссылки на нужные .lib стоят только в проектах отдельных DLL.

RenderVfw.dll использует "Video for Windows" -- тот же механизм что сейчас реализован в эмуляторе; ориентирован на вывод 1:1 и кратное масштабирование -- например, в 2 раза или 2 x 1.5.
RenderDX9.dll (DirectX 9) и RenderOpenGL.dll -- ориентированы на произвольное масштабирование, в т.ч. в режиме Fullscreen.

В аттаче действующий макет с тремя рендерами, пока с единственным режимом в каждом из них. RenderTester позволяет подцепить один из рендеров и выводит статичное изображение, плюс есть команда для измерения предельного FPS.
RenderDX9 и RenderOpenGL дают 60 FPS -- думаю это привязано к частоте обновления монитора; зато они дают такой FPS даже на FullHD разрешении.
Пока конечно всё это написано неидеально -- по сути под DX и OpenGL я пишу впервые.

Vamos
07.03.2013, 23:30
У меня нормально рендерит только OpenGL, только верхняя рамка окна остается и системный трей.
DirectX 9 - это вообще не запустилось, каккие-то ошибки выдает.
Video for Windows - не рендерит т.е. картинка во всех режимах 1:1

nzeemin
08.03.2013, 14:44
У меня нормально рендерит только OpenGL, только верхняя рамка окна остается и системный трей.
DirectX 9 - это вообще не запустилось, каккие-то ошибки выдает.
Video for Windows - не рендерит т.е. картинка во всех режимах 1:1

Всё правильно.
DX9 не работает скорее всего потому что его runtime не установлен на вашей машине.
RenderVfW показывает пока только режим 1, без масштабирования.

Во вложении новая версия рендеров.
Отключил VSync для DX9 и OpenGL -- появилась возможность померить реальный FPS.
В RenderOpenGL сделал оптимизацию для вывода 1:1.

На моей машине теперь показывает такие FPS:


902x526 1920x1038 640x288 960x576
VfW - - ~1140 -
DX9 ~260 110-140 440-500 210-300
OpenGL ~230 ~75 ~478 ~200

Intel Core2 Duo T7500 @ 2.20 GHz
nVidia GeForce 8400M GS
Windows 7 x64

nzeemin
08.03.2013, 19:10
Есть ещё такая тема как скалеры семейства hqx.
Для интереса попробовал прикрутить hq2x_32 отсюда: http://code.google.com/p/hqx/
Но он довольно медленный, получается 12 FPS в пике. И расход памяти 16 МБ плюсом.
Зато картинка отличная: http://img-fotki.yandex.ru/get/4129/7448436.8/0_7b843_75d91b7a_orig

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

ZEman
08.03.2013, 19:52
nzeemin, может лучше не стоит, мазня получается.

Vamos
08.03.2013, 20:13
ZEman, нормально получается, этож будет отдельно от эмулятора, не хочешь не влючай.

ZEman
08.03.2013, 20:15
да символы какието неправильные получаются.
лучше бы скайнлайн или фосфорный эффект добавить.

Titus
08.03.2013, 20:23
Зато картинка отличная: http://img-fotki.yandex.ru/get/4129/7448436.8/0_7b843_75d91b7a_orig
Фу... плохой фильтр.

nzeemin
08.03.2013, 21:06
По одному скриншоту не стоит судить о качествах фильтра, скоро можно будет увидеть в действии. По скорости всё оказалось не так плохо -- около 60 FPS, а вот по памяти расход около 64 МБ, но это только на время работы данного режима.

shattered
08.03.2013, 22:02
да символы какието неправильные получаются.
лучше бы скайнлайн или фосфорный эффект добавить.

Или сразу поддержку HLSL, как в MAME.

hobot
09.03.2013, 22:57
что пользователям не понравился фулскрин,
Мне понравился! ) Только в таком режиме и сижу теперь, но как я писал - это фулскрин для эмулятора, а не для УК-НЦ экрана ) Вот по поводу картинки в сборке 499 правый край экрана УК-НЦ иногда довольно отчётливо край нижнего последнего
символа рисует где-то в середине (но покраю - в смысле не снизу) или наоборот опускает его до уровня нижней рабочей области. Иногда вся верхняя половинка
экрана как-бы на пиксель (экрана реального) сдвинута и получается не прямая линия а как бы на -+1 сдвинутая, скрин я один уже делал, по возможности ещё сделаю, надо просто поймать этот момент )



Зато картинка отличная:
Впервые (наверное) с Titusom одного мнения о графике, у меня в одном из граф-ред. для обработки статичных картинок есть этот фильтр, я его пробовал
для скриншотов, ИМХО: Самый худший из всех что я видел.

Пока ещё не понял сути нововведений и не пощупал Render-Tester - в общем пока
не понял что это, надо поглядеть )



как в MAME.
MAME - это мама MESSa ?

shattered
09.03.2013, 23:01
MAME и MESS сейчас фактически одно и то же -- они собираются из тех же исходников, отличаются только набором эмулируемых систем. При желании можно собрать UME, который будет уметь все сразу.

hobot
09.03.2013, 23:07
FPS test

http://savepic.ru/4245126.png

http://savepic.ru/4249222.png


Если честно совсем не понимаю как такими вещами пользоваться )
Сделал скрины на всякий случай )

---------- Post added at 23:07 ---------- Previous post was at 23:07 ----------


UME
UME - unisex? )))

nzeemin
09.03.2013, 23:25
Первая сборка с новой архитектурой рендеров.

Рендер (пока) из интерфейса НЕ выбирается. По умолчанию используется RenderVfw.dll. Если нужен другой, то параметром Render в .ini-файле задаём имя DLL и перезапускаем приложение. Например:
Render=RenderDX9.dll
или
Render=RenderOpenGL.dll

Объясню зачем я затеял эту тему с рендерами. Мне самому до сих пор вполне хватало того механизма что был. Он прекрасно работает на небольших разрешениях экрана, на крупных разрешениях он конечно дико тормозит. Но я понимаю, что есть пользователи для которых важна картинка именно в большом разрешении. Для них я начал ветку UKNCBTL.SDL, но пока не успел её серьёзно развить. Кроме того, механизм рендеров позволил мне выделить отрисовщики в отдельные модули, которые можно развивать отдельно. Теперь не нужно затаскивать в основной модуль ссылки на DirectX, более того -- даже ссылка на VfW убралась.

Формальный список изменений версии 513 по сравнению с 499:

UKNCBTL: ScreenView -- screen mode table instead of switch/case.
UKNCBTL: fixed access to 177712 address on PPU bus.
UKNCBTL: Processor.cpp -- tuning timings, added some comments.
UKNCBTL: ScreenView and others reworked to the new render architecture.

hobot
09.03.2013, 23:30
На всякий случай ещё пару скринов. но что то мне кажется это бред какой-то или
я ничего не понимаю просто ) Жму на кнопки как мартышка )


http://savepic.ru/4214426.png

http://savepic.ru/4217498.png


А можно просто вот присвоить по галочке full screen это свойство
не окну эмулятора, а экрану УК-НЦшному ? ) И всё ) Без всяких
рендеров )

nzeemin
09.03.2013, 23:35
А можно просто вот присвоить по галочке full screen это свойство
не окну эмулятора, а экрану УК-НЦшному ? ) И всё ) Без всяких
рендеров )

Т.е. правильно я понимаю -- ты хочешь чтобы экран УКНЦ масштабировался на весь экран контупера, всё верно?
Это сейчас достигается (с версии 513) включением рендера DX9 либо OpenGL -- они всегда масштабируют картинку до полного окна.

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

hobot
09.03.2013, 23:41
513
Скрины перевернуты и зеркально ещё до кучи ! )))

---------- Post added at 23:41 ---------- Previous post was at 23:35 ----------


Т.е. правильно я понимаю -- ты хочешь чтобы экран УКНЦ
Извиняюсь, форум лагает у меня немного. Не видел вопроса.
А куда в 513 изчезли настройки выбора размера окна УК-НЦ ? Снова крохотные буковки ? Мне нужно реально для удобства 2 режима всего (это только моё мнение!)
1 - как фулскрин в 499 с рамкой где есть тулбар и меню
2 - когда непосредственно экран УК-НЦ и больше ничего нету

По 513 у меня сразу куча вопросов - ей нужны эти DLL в папке, а ROM-BIN файл
уже не нужен? Почему крохотный экран же снова? Как всё это настроить, что бы было как в 499 ))) Только с возможностью врубать УК-НЦшный экран без тулбаров
на всю плоскость экрана? ))) Туплю - я да? Но честно не понимаю куда всё делось и как это вернуть, можно старый ini файл скормить от 499 версии ?

Vamos
09.03.2013, 23:45
DirectX у меня не работает.
VfW - очеееень тормозит.
OpenGL - по скорости вообще нет изменений в сравнении с предыдущими версиями, картинка мне больше нравится по сравнению с VfW, но вот из полноэкранного режима не выходит.

hobot
10.03.2013, 00:22
DirectX у меня не работает.
VfW - очеееень тормозит.
OpenGL - по скорости вообще
А где ты это видишь? Я вообще не понимаю )

Скрин-Моде 5 почти оно, но не умещается на моём 1280х800 (
Получается у меня как-то вот так :

Вот такие скрины - ну это понятно и легко поправить ИМХО )))

http://savepic.ru/4219536.png

http://savepic.ru/4225680.png

А вот это-же почти как будто за родным моником!!!
Для этого режима можно что бы тулбар и строка состояния и кнопочкименю(!) или всплывали как-то или убирались ??? Может тогда он уместиться и можно в нём реально торчать было бы? Торчать - за эмулятором в смысле ))) Вот он эффект присутствия - но не умещается !!! )

А максимально умещаемый - этот самый "гадкий фильтр", либо никаких отличий от 499.
По скорости работы не вижу отличий ни в одном из режимов экрана !!! )))


http://savepic.ru/4209296.png

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

Запустил save_state Knight во всех режимах - игра не тормозит - скорость одинаковая

Vamos
10.03.2013, 00:27
hobot, прикольный у тебя ноут :) , и сом0сом не работает... мдя.
А скорость на твоей картинке в низу циферки с процентами, сравни с 499 версией :)

hobot
10.03.2013, 00:34
Получается Screen_Mode 5 самый правильный вид экрана и я не могу себе это позволить ))) А ведь это на ноуте, на ЭЛТ - на основной машине разрешение
ещё меньше ((( Грустно (((

---------- Post added at 00:34 ---------- Previous post was at 00:29 ----------


А скорость на твоей картинке в низу циферки с процентами, сравни с 499 версией
да всё 1 в 1 - при включенном звуке 103%, при выключенно плавает - макс 372% примерно. Да com0com не работает и главное я не понимаю почему ))) Такие дела.
Проц кстати слабенький у ноута, да ещё и с плавающей скоростью - типа
offtop про мой ноут

мобильная Cora ---> http://www.ferra.ru/ru/notebooks/s26537/< - мне кажется их уже не делают давненько ))) Конечно он прокачан, не витринный вариант.


---------- Post added at 00:34 ---------- Previous post was at 00:34 ----------

Ну и плюс настройки правильные что бы быстродействие не кушалось куда не надо)

Vamos
10.03.2013, 00:35
Вообще наверное самый "идеальный" экран 1280х900 были такие модели на ноутах, в него хорошо впишется 2х640=1280 и 1,5х576=864.

hobot
10.03.2013, 00:41
в него хорошо впишется 2х640=1280 и 1,5х576=864
Давай! Добей [hobot'a] 64 пикселями (((

Titus
10.03.2013, 00:42
Вообще наверное самый "идеальный" экран 1280х900 были такие модели на ноутах, в него хорошо впишется 2х640=1280 и 1,5х576=864.
1.5 - это неправильные пропорции для экрана УКНЦ.

hobot
10.03.2013, 00:43
1.5 - это неправильные пропорции для экрана УКНЦ.
Так ) Здравствуйте доктор ) Следущего позвать ? )))
Я тут плачу и у меня истерика, заранее извиняюсь, но у меня проблемы в 64 пикселях )))

Vamos
10.03.2013, 00:53
1.5 - это неправильные пропорции для экрана УКНЦ.
Зато не надо апскейлеры прикручивать :)

hobot
10.03.2013, 02:00
Зато не надо апскейлеры прикручивать
Вот можно я всё таки задам вопрос (в который раз) в чём сложность присвоить
значению высоты и ширины экрана УК-НЦ (не путать с окном эмулятора!) с шириной и высотой system_screen пользователя ??? Выбрав один какой-нибудь вид обработки картинки (не буду неправильные термины писать поскольку не совсем в этом понимаю). Тогда было бы пофиг что у одного 800\600, а у другого 1024-768, а у третьего бук на котором матрица держит (прямо) только 1280х800, остальное не прямо, а у четвёртого вообще 52" монитор во всю стену ??? Сложность в чём ?
Можно как-то просто просто что бы я понял ?

---------- Post added at 02:00 ---------- Previous post was at 01:58 ----------

В эмуляторе БК работает же? Просто по alt-enter как любое окно в Windows?

Vamos
10.03.2013, 02:06
Сложность в том что 1 пиксел картинки нужно размазать по 1,1-1,8 физического пикселя экрана.

Titus
10.03.2013, 02:12
Зато не надо апскейлеры прикручивать :)
Все и так прекрасно делается для близкократных пропорций типа 1.25, 1.33.

nzeemin
10.03.2013, 13:49
мобильная Cora ---> http://www.ferra.ru/ru/notebooks/s26537/< - мне кажется их уже не делают давненько )))

Разрешение 1280 x 800 -- у моего ноута такое же.
В планах сделать фильтр для разрешения 960 x 720 -- это увеличение 1,5 x 2,5 -- под такое разрешение должно быть идеально.

nzeemin
10.03.2013, 14:37
Набросал на скорую руку режим "960 x 720, 4:3", без интерлейса.

Vamos
10.03.2013, 16:39
Набросал на скорую руку режим "960 x 720, 4:3", без интерлейса.
Отличная картинка, вот только будет ли фуллскрин без рамки окна, для отключения можно задействовать правую кнопку мыши так в видео игрателях делают.

Titus
10.03.2013, 16:55
Набросал на скорую руку режим "960 x 720, 4:3", без интерлейса.

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

hobot
10.03.2013, 18:10
Никита, огромное спасибо! Этот режим фактически получился лучшим из всего что было, не широэкранным, а таким как надо и самое главное удачно висит между меню+тулбаром и строкой состояния.

http://savepic.ru/4220671.png


У меня только одно пожелание осталось по видео в таком случае
(кроме скриншотов конечно), фул-скрин - галочка ИМХО: должна иметь отношение,
только к экрану УК-НЦ !!! Непосредственно (в будущей сборке), мне просто это даже логично кажется и даже очень, а свойство окна эмулятора max - в ini само пропишется если окно развернуть, ну или ручками в файле настроек.
Надо текущую сборку погонять! ) Красота ! )

---------- Post added at 18:10 ---------- Previous post was at 18:05 ----------

Ещё просто интересно - как так вышло что rom файл не нужен стал в текущей папке?
Он в сам exe-шник вписался? ) Или как?

nzeemin
10.03.2013, 18:13
Поправил ошибку со скриншотами.
Поправил сохранение/восстановление номера режима.

Vamos
10.03.2013, 18:14
удачно висит между меню+тулбаром и строкой состояния.
Не их тоже не должно быть при фуллскрине, иначе это опять не фуллскрин а что-то среднее.

nzeemin
10.03.2013, 18:14
Ещё просто интересно - как так вышло что rom файл не нужен стал в текущей папке?
Он в сам exe-шник вписался? ) Или как?

Давно уже засунул в ресурсы приложения.

hobot
10.03.2013, 18:19
игра как на 6105 выглядит ) Ну почти почти )

http://savepic.ru/4221680.png


---------- Post added at 18:19 ---------- Previous post was at 18:17 ----------


фул-скрин - галочка ИМХО: должна иметь отношение,
только к экрану УК-НЦ !!! Непосредственно

Vamos, а я что написал?



Поправил ошибку со скриншотами.
Поправил сохранение/восстановление номера режима.
Спасибо! Забрал! Будем гонять ) Ура!

Alex_K
10.03.2013, 18:26
Давно уже засунул в ресурсы приложения.
А вот это зря. Я опыты как-то делал, подправляя ошибки в коде. А сейчас нельзя. Но можно сделать так, что если рядом с exe-шником есть образ ПЗУ, то использовать его, нету - из ресурсов приложения.

hobot
10.03.2013, 18:45
Alex_K, а коварный вопрос? Если есть пзу в виде файла, можно его сделать "правильным" в плане множителя для шрифта в отличие от реальной машинки (я про теже 11 и 11. ) или это не возможно в принципе нигде (ни в реале ни в эмуляторе) или это может вызвать неработоспособность, крах и катастрофические последствия?

---------- Post added at 18:45 ---------- Previous post was at 18:43 ----------

И ещё момент, насколько идеален образ ПЗУ для эмулятора? Может быть в нём что-то
барахлит ( в наследство от реальной железяки) ? Я гипотетически интересуюсь возможностью - идеального образа ПЗУ ?

Alex_K
10.03.2013, 18:46
Alex_K, а коварный вопрос? Если есть пзу в виде файла, можно его сделать "правильным" в плане множителя для шрифта в отличие от реальной машинки (я про теже 11 и 11. ) или это не возможно в принципе нигде (ни в реале ни в эмуляторе) или это может вызвать неработоспособность, крах и катастрофические последствия?
Можно, надо подправить множитель в одном месте и контрольную сумму блока ПЗУ в другом.
Армагеддона, сдвига по временной линии и перемещения в соседнюю реальность не произойдет, можно спать спокойно.

hobot
10.03.2013, 18:48
можно спать спокойно.
А вернуть поправленный в реальную машинку это уже наверное посложнее операция (если в целом возможна) ?