Точность эмуляции Радио 86РК

Эмулятор Радио-86РК и других советских компьютеров на КР580ВМ80А http://www.emu80.org

Moderator: Pyk

Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Точность эмуляции Радио 86РК

Post by Shiru Otaku »

Выяснял тут различные подробности устройства РК-шки - как работает ВГ75 вообще (даташит 8275 местами ошибается или умалчивает детали), и какие её фичи реализованы в РК. Написал тест, прогнал его на моём Спектр'е. Потом им-же потестил Эмулятор-3000. Другие эмуляторы пока не тестил (может, кто хочет?). Публикую результат, чтобы авторы эмуляторов РК (я знаю, что они сюда захаживают:), если у них будет такое желание, реализовали эмуляцию видеоконтроллера более точно.

Сам тест, его исходник, и видео с записью выполнения на реале, здесь: http://rapidshare.de/files/28966885/test1.rar.html (извиняюсь за рапидшару). Архив - 5 мегабайт.

Результаты теста есть в архиве, также пишу их здесь:


Описание теста.


Проверяется алгоритм работы команды установки позиции курсора:

0 - курсор помещается в координаты 8,8
1 - передаётся код команды смены позиции
2 - передаётся первый параметр (выяснено: перемещение происходит сразу по приёму параметра)
3 - передаётся второй параметр

Проверяются режимы отображения курсора (в позиции 8,8):

0 - мигающий инверсный блок (выяснено: инверсия на РК не реализована)
1 - мигающее подчёркивание символа
2 - немигающий инверсный блок
3 - немигающее подчёркивание символа

Проверяется отображение псевдографики средствами ВГ

Четыре строки всех возможных символов псевдографики,
со всеми вариантами атрибутов:

- не мигает, не подсвечено
- не мигает, подсвечено
- мигает, не подсвечено
- мигает, подсвечено

Выяснено: псевдографика (character attributes) не
реализована на РК. Подсветка не реализована на РК.
Подтверждается отсутствие реализации инверсии.

Проверяются атрибуты отображения символов (не все комбинации проверяются)
ВГ находится в режиме прозрачных атрибутов:

A - без атрибутов
B - подчёркивание
C - инверсия
D - мигание
E - подсветка
F - подчёркивание с инверсией
G - подчёркивание с миганием
H - подчёркивание с подсветкой
I - инверсия с миганием
J - подсветка с миганием

Выяснено: режим прозрачных атрибутов (не занимающих знакоместо) сбивает
синхронизацию CRT/DMA! Поэтому происходит скролл экрана. Почему - неясно,
возможно не работает FIFO в ВГ (работает не так, как описано).

Повторение предыдущего теста в режиме непрозрачных атрибутов.

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




Выполнение теста на Эмулятор-3000:

- Команда курсора отрабатывается неправильно (по завершении передачи параметров)
- Режимы отображения курсора реализованы полностью, что не соответствует реальному РК
- Псевдографика не реализована, но результат (глюки) не соответствует реальному РК
- Атрибуты символов не реализованы вообще ни в каком виде
- Рассинхронизация CRT/DMA, соответственно, не учтена
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Надо сохранить в анналах - а почему Emu80 обойдён? Вроде бы самый адекватный эмуль....

P.S. А что есть аналог 75-й микрухи?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Shaos wrote:А что есть аналог 75-й микрухи?
ЕМНИП это КР580 есть аналог i82xx/i80xx. Или нет???
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

HardWareMan wrote:
Shaos wrote:А что есть аналог 75-й микрухи?
ЕМНИП это КР580 есть аналог i82xx/i80xx. Или нет???
Я иметь ввиду оригинал 8275 - какие глюки повторяемы на нём?
Я тут за главного - если что шлите мыло на me собака shaos точка net
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

ВГ75 - это 8275. А вот насколько точной копией он является - это вопрос. По крайней мере, некоторые моменты даташита на 8275 либо содержат ошибки, либо ВГ75 имеет отличия. Думаю, что всё-же в описании ошибки, а ВГ скопирован точно.
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

Попытался потестить в трёх других известных мне эмуляторах - неудачно. Давятся моим файлом из-за неправильной длины, указанной в заголовке;) А вот реал, между прочим, не давится (понятно, что говорит об ошибке - но файл загружается, и можно запустить). И Эмулятор-3000 тоже.

Потестирую потом.
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

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

Версия 2.86, в режиме graph (наиболее точная эмуляция), перехват обращений к памяти по записи и чтению.

Перемещение курсора - выполняется правильно (сразу по приёму первого параметра). Кстати, в текстовом режиме оно выполняется неправильно - по завершении передачи параметров, получается - два разных движка ВГ в Emu80?

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

Псевдографика не реализована (так и надо), но глюки не соответствуют реалу.

Рассинхронизация CRT/DMA в режиме прозрачных атрибутов не эмулируется.

В режиме непрозрачных атрибутов: атрибут мигания эмулируется, атрибут инверсии эмулируется (а не должен), подсвечивание не эмулируется (так и надо), подчёркивание не эмулируется (а должно).
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

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

http://rapidshare.de/files/29203790/test2.rar.html (4 мегабайта)


Описание теста.


Тест курсора - проверяется, что будет при выходе значений координат за пределы экрана. В цикле перебираются значения 0..255 для X, потом тоже самое выполняется для Y; текущая координата отображается на экране.

Выяснено: счётчики координат имеют разную разрядность. Для X-координаты используется 7 бит (т.е. при значениях более #80 курсор снова виден на экране!); для Y-координаты используется 6 бит.



Четыре раза выполняется тестовый вывод двух экранов с использованием атрибутов в разных режимах. Первый экран - горизонтальная строка символов A-P, перед каждым идёт код атрибута (все возможные варианты). Второй экран – такая же строка символов, но выводится по вертикали.

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

Второй заход - вывод в режиме прозрачным атрибутов (который устанавливается Монитором РК по умолчанию). Наблюдается сдвиг экрана.

Третий заход - аналогично первому, но размер экранного буфера (т.е. счётчика DMA) уменьшен на 15 (кол-во использованных атрибутов). Сдвиг экрана не устраняется.

Третий заход - также аналогично первому, но размер экранного буфера увеличен на 15. Сдвиг экрана прекращается, но наблюдается мерцание изображения (кадр есть, кадр нет). Возможно, это проблемы моего клона РК - в игре Lode Runner у меня наблюдается аналогичное мерцание (хотя там не используются атрибуты, там высота символов уменьшена до 8 пикселей). Непрозрачные атрибуты в этом режиме отображаются, как и предполагалось - без пробелов между символами в горизонтальной строке. Однако, вертикальная строка символов сдвинулась по диагонали.

Выяснено: в режиме прозрачных атрибутов... что происходит-то в нём?



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



Тест изменения номера линии для подчёркивания - номер изменяется от 0 до 15. Тест проводится в режиме непрозрачных атрибутов, чтобы избежать рассинхронизации CRT/DMA. Мусор под символами при значении номера линии <8 присутствует, и это правильно, т.к. согласно описанию при значении 1 старшего бита номера линии подчёркивания выполняется гашение самой верхней и самой нижней линий символа.

Выяснено: изменение линии подчёркивания на РК реализовано, и оно также влияет на номер строки, в которой будет появляться курсор (если он отображается в виде подчёркивания).




Эмулятор 3000:

Разрядность счётчиков координат курсора не учитывается - при выходе значения за пределы 0..79,0..63 он просто не отображается.

Атрибуты не эмулируются (это же показал и предыдущий тест); в любом режиме отображаются как некоторые символы знакогенератора.

DMA не эмулируется вообще, изменение размера экранного буфера никак не влияет на изображение.

Черезстрочный режим не эмулируется.

Изменение номера линии подчёркивания не влияет ни на что (атрибут подчёркивания не реализован; курсор отображается на одной и той-же линии).



Emu80 (настройки как в предыдущем тесте):

Разрядность счётчиков координат курсора не учитывается - при выходе значения за пределы 0..79,0..63 он просто не отображается.

Атрибут инверсии эмулируется неправильно, атрибут подчёркивания не эмулируется (как и в предыдущем тесте). Действие эмулируемых атрибутов, судя по инверсии, начинается в поле с атрибутом, а не на следующем поле (как указывает документация и как происходит на реале).

Прозрачные атрибуты не эмулируются (считаются непрозрачными).

DMA не эмулируется вообще, изменение размера экранного буфера никак не влияет на изображение.

Черезстрочный режим не эмулируется.

Изменение номера линии подчёркивания влияет на номер линии отображения курсора, как и должно быть.
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

Shiru wrote:Выяснено: в режиме прозрачных атрибутов... что происходит-то в нём?
Извиняюсь, забыл описать этот момент:) Вобщем, фишка вот в чём: согласно описанию 8275, в режиме прозрачных атрибутов при чтении кода атрибута сразу-же происходит чтение следующего байта (оно идёт в буфер FIFO с обрезанием до 7 бит, и при отображении строки также сразу достаётся оттуда). То есть, происходит ещё один запрос байта по DMA, но счётчик символов в строке при этом, видимо, не уменьшается. Отсюда и рассинхронизация CRT/DMA - каждый использованный на экране атрибут в режиме прозрачных атрибутов увеличивает размер запрашиваемых для кадра данных на 1, и следующий кадр читается не с начала экранного буфера.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Ну ты просто таки гигантскую работу провёл!
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Ball Bess
Maniac
Posts: 211
Joined: 14 Mar 2006 00:20
Location: Иркутск

Post by Ball Bess »

Shiru Otaku wrote:
Shiru wrote:Выяснено: в режиме прозрачных атрибутов... что происходит-то в нём?
Извиняюсь, забыл описать этот момент:) Вобщем, фишка вот в чём: согласно описанию 8275, в режиме прозрачных атрибутов при чтении кода атрибута сразу-же происходит чтение следующего байта (оно идёт в буфер FIFO с обрезанием до 7 бит, и при отображении строки также сразу достаётся оттуда). То есть, происходит ещё один запрос байта по DMA, но счётчик символов в строке при этом, видимо, не уменьшается. Отсюда и рассинхронизация CRT/DMA - каждый использованный на экране атрибут в режиме прозрачных атрибутов увеличивает размер запрашиваемых для кадра данных на 1, и следующий кадр читается не с начала экранного буфера.
Ну, да, всё правильно! В режиме "непрозрачных" атрибутов экранная область ОЗУ "один в один" соответствует размеру экрана. Коды соседних символов экрана находятся и в ОЗУ рядом. А если вставили атрибут, то это - вместо символа, т.е. атрибут занял и знакоместо на экране, там отпечатается пробел. А в режиме "прозрачных" на каждое знакоместо надо отводить по два байта (атрибут и код символа). При этом объём экранной области ОЗУ увеличивается вдвое и соответственно программируется контроллер DMA, но зато атрибуты не занимают место на экране: два соседних символа могут иметь разные атрибуты, а пробела между ними не будет.

P.S. Второй режим лучше, но разработчики РК, видно, память экономили, её ведь всего 16К было... Да и скорость работы подпрограмм, работающих с экраном повысить хотели, я думаю.
Кто мешает тебе выдумать порох непромокаемый?
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

Ball Bess wrote:А в режиме "прозрачных" на каждое знакоместо надо отводить по два байта (атрибут и код символа). При этом объём экранной области ОЗУ увеличивается вдвое
Нет, это неправильно. Не два байта, и не вдвое. Дело в том, что в режиме прозрачных атрибутов на строке их не может быть использовано больше 16 - иначе возникнет переполнение буфера FIFO (выставится соответствующий флажок, и будут браться символы с начала буфера FIFO - как сказано в документации). Насчёт изменения объёма буфера - я описал всё в предыдущем посте: он увеличивается на кол-во использованных в кадре атрибутов.

Я думаю написать ещё один тест, чтобы достоверно узнать, что будет при переполнении FIFO, а также для проверки действия атрибутов конца строки, кадра, и прекращения DMA.
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

Третий тест.

http://rapidshare.de/files/29306236/test3.rar.html


Описание теста:



Тест переполнения буфера FIFO в режиме прозрачных атрибутов. Выводятся две строки, одна над другой (с учётом смещения после первой строки). На каждой строке выводятся 20 символов с разными атрибутами: 0123456789ABCDEFGHIJ, где символы 02468 выводятся с атрибутом подчёркивания, символы ACEGI с атрибутом мигания, а остальные с выключенными атрибутами (код атрибута %10000000). Размер экранного буфера в этом тесте увеличен на 40, чтобы не было рассинхронизации CRT/DMA.

Выяснено: атрибуты действуют как указано в описании, т.е. инверсия и мигание происходят на тех полях, на которых и предполагалось. Но на экране отображается GHIJ456789ABCDEFGHIJ вместо заданной строки. Таким образом, FIFO-буфер имеет длину 16 символов, и заполняется циклически - при превышении лимита в 16 ячеек начинает заполняться с начала; выборка идёт в том-же порядке, что и заполнение, с нулевой ячейки (всё соответствует описанию).


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

Выяснено: атрибуты конца строки и кадра без остановки DMA работают, как указано в описании: после них прекращается отображение символов до конца строки и кадра соответственно.


Тест атрибута конца строки с остановкой DMA (аналогично предыдущему тесту в части атрибута конца строки). Размер экранного буфера соответственно скорректирован.

Выяснено: атрибут конца строки с остановкой DMA действует как описано - до конца строки символы не отображаются; экран из-за коррекции размера экранного буфера не сдвигается.


Тест атрибута конца кадра с остановкой DMA. Атрибут конца кадра установлен на середине экранного буфера, размер экранного буфера соответственно уменьшен вдвое.

Выяснено: атрибут конца кадра с остановкой DMA работает не так, как описано (либо это проблемы с моим реалом) - после него отображение кадра продолжается.



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

Да, насчёт атрибутов подсвечивания и инверсии - в схеме РК эти выводы ВГ75 вообще не задействованы. Соответственно, работать они не должны, хотя в Emu80 и в YARK (я не стал его подробно тестить, т.к. он совсем сырой) инверсия зачем-то реализована.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А ещё вроде есть Радио-86РК с цветным текстом! И там помниться авторы хвалились использованием стандартных фич ВГ75
Я тут за главного - если что шлите мыло на me собака shaos точка net
Shiru Otaku
Retired
Posts: 490
Joined: 16 Mar 2002 17:00

Post by Shiru Otaku »

Да, есть пара схем. Одна из них - вот:

http://nf8.jinr.ru/~volkov/pc-nostalgia/rk-color.htm

Она юзает два бита пользовательских атрибутов (GPA1,GPA0) и биты подсветки/инверсии; соответственно выходы ВГ-шки HLGT (как запрет красной компоненты) и GPA1 (как запрет синей), GPA0 (как запрет зелёной), RVV (инверсия цвета).

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