nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 17 Jul 2018 11:36



Reply to topic  [ 23 posts ]  Go to page Previous  1, 2
(Без)умная идея 
Author Message
Doomed

Joined: 08 Apr 2013 05:04
Posts: 443
Location: 213.247.249.139
Reply with quote
barsik wrote:
В Специалисте не принцип сканирования бегущим нулём, а табличный метод определения кода клавиатуры. Там на матрицу по вертикали выкидываются все нули и считывается матрица по горизонтали, затем наоборот, выкидывается все нули по горизонтали и считывается матрица по вертикали. Номер бита в котором 0 по вертикали сдвигами умножается на 16, к результату прибавляется номер бита (0...11) по горизонтали, что даёт смещение в таблице. Затем из таблицы берётся код. Это в 1.5 раза больше объём кода, но намного быстрее.

А что будет, если нажато более 1 кнопки?


27 Apr 2018 10:42
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
barsik wrote:
В Специалисте не принцип сканирования бегущим нулём, а табличный метод определения кода клавиатуры.

Это смотря в каком "Специалисте" и какая программа...
Когда разбирали всё это, чтобы подключить к "Специалисту" PS/2 клавиатуру через микроконтроллер,
чтобы полностью имитировать матрицу клавиатуры реального "Специалиста", выяснили, что в зависимости
от того, под каким ПО работает "Специалист" там как бы не 3 метода в совокупности.

Точно я сейчас уже не помню, но материал этот на форуме должен быть.


P.S. В частности: http://www.nedopc.org/forum/viewtopic.php?f=46&t=9081
Attachment:
SPkbdBB55.gif
SPkbdBB55.gif [ 47.65 KiB | Viewed 397 times ]

_________________
iLavr


27 Apr 2018 12:01
Profile
Senior

Joined: 19 Feb 2017 04:46
Posts: 109
Location: 600 км от Москвы
Reply with quote
Для апп.эмулятора ПЗУ Специалиста надо слегка изменить.

Т.к загрузки с МГ всё-равно нет, то по сбросу надо сделать сразу выход в монитор или на процедуру выбора запускаемой программы из числа резидентных. Иначе при уходе на п/п-мму ввода блока по сбросу, произойдёт завис на определении константы ввода по пилотону, т.к при этом PB0 читается напрямую и перехват п/п-ммы LDBYTE не поможет от зависа (даже нажатие <НР> + <F9> не поможет, т.к клавиатура контроллируется только в процедуре ввода байта). heavy, если Вам лень тратить время на это самому, то могу странслировать 100% совместимую версию ПЗУ, забив в нём все МГ-подпрограммы, это работа на 10 минут.

И для начала совсем не обязательно клавиатуру эмулировать правильно. Чтобы получить версию позволяющую прогонять системное ПО, это не требуется. Когда я в 1997-1998 писал свой эмулятор РК86, я изначально вообще не собирался (да и не знал как) делать полноценную эмуляцию клавиатуры.

Я полагал, что достаточно проэмулировать только стандартные входные точки ПЗУ, т.к в ж.РАДИО в 80-тые читал призывы делать только корректное ПО, работающее с железом корректно. Потому вообще не собирался эмулировать ПЗУ F800. При любом вызове подпрограмм выше F800 управление возвращалось к эмулятору и работа стандартных подпрограмм эмулировалась. Например, при вызове п/п-ммы F809 обслуживались упр.коды, а печатаемый символ из регистра C, клался в экранное ОЗУ по адресу из ячеек 7600/7601, затем текущий адрес вывода в этой ячейке сдвигался, также менялись координаты POSX,POSY в ячейках 7602/7603. Это выполнялось в 100 раз быстрее, чем прогон программы в ПЗУ, что было важно.

Кстати, такой подход позволяет эмулировать РК86 на ОРИОНЕ с тактом в 5 МГЦ. При этом даже в некоторые РК-игры можно играть, несмотря на эмулируемую скорость всего в 200 КГЦ (это потому, что в играх в качестве "паузы-тормозилки" используется время прогона п/п-ммы опроса клавиатуры, которое в таком эмуляторе в 25 раз быстрее)

В разных версиях ПЗУ разные адреса внутренних исполнительных частей стандартных подпрограмм. Но т.к эмулятор работает с одной версией ПЗУ и пользователь не может это изменить, то не проблема перехватить п/п-мму INKEY (что я привёл выше) и эмулировать её работу 32-х разрядным процессором контроллера.

Эта п/п-мма возвращает код символьных клавиш в нижнем регистре, не делая обработки нажатия клавиши <НР> и состояния флага RUSLAT. Потому в эмуляторе достаточно возвращать код и правильно ставить состояние порта PB1, по которому читается клавиша <НР> (её должна заменять Shift на PC-клавиатуре).

Так, что всё, что требуется сделать, чтобы вообще не возиться с клавиатурой, - это перехватывать точку INKEY (узнать её адрес можно из PRN листинга трансляции).

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

angry_troll wrote:
А что будет, если нажато более 1 кнопки?

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


28 Apr 2018 07:51
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
barsik wrote:
Так, что всё, что требуется сделать, чтобы вообще не возиться с клавиатурой, - это перехватывать точку INKEY (узнать её адрес можно из PRN листинга трансляции).

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

Откровенно говоря, это не совсем так.
Довольно большое количество оригинальных программ управляли портом клавиатуры и опрашивали
его сами.
Ну и C81B опять же было не во всяком системном ПЗУ.

Ну а игры от РК86 на "Специалисте" это несколько нонсенс - для чего тогда у "Специалиста" графика
384х256 точек, которой не было ни у РК86, ни у Микроши, как и у всех им подобных?

_________________
iLavr


28 Apr 2018 08:17
Profile
Senior

Joined: 19 Feb 2017 04:46
Posts: 109
Location: 600 км от Москвы
Reply with quote
Lavr wrote:
Откровенно говоря, это не совсем так. Довольно большое количество оригинальных программ управляли портом клавиатуры и опрашивали его сами.

Конечно. Почти все приличные игры написанные специально для Специалиста клавиатуру опрашивают прямым доступом к ППА клавиатуры. Я потому и написал, что только игры от РК будут работать при такой упрощённой эмуляции клавиатуры.

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

Проблема была в том, что п/п-мму INKEY (аналог эр-кашной п/п-ммы F81B) для Специалиста не стандартизовали, хотя физически она есть. А т.к игры в подавляющем большинстве писались так, чтобы работать только при наличии одного ПЗУ, т.наз. загрузчика (не требуя на C800 наличия эр-ка подобных входов), то по причине отсутствия в загрузчике п/п-ммы "чтения на лету" (F81B), и приходилось писать свой опрос матрицы.

А вот игры от РК конвертировались уже почти всегда с использованием входов C800, потому нужды в собственном опросе не было. И даже РК-игры, в которых был собственный опрос с бегущим нулём, приходилось переделывать на стандартный опрос с использованием C81B (т.к без наличия диодов в схеме матрицы сканирование нулём не работало).

Кстати, чтобы введя ПЗУ C800 не требовалось переделывать РК-программы, достаточно было применить 2 диода, чтобы по адресу F800...F8FF читалось ПЗУ C800...C8FF.

Image

Но в данном контексте речь шла о том, чтобы для начала получить хотя бы частично работающую версию этой конструкции. Всегда полезно, когда есть промежуточные успехи (добавляет энтузиазм). Глупо стремиться сразу всё сделать хорошо и идеально. Это как при разработке программы. Сначала на большинство функций ставятся бутафорские заглушки или имитация. Благодаря чему отлаживается ядро программы, основная петля. А затем уже бутафория заменяется на реально работающие процедуры.

Lavr wrote:
Ну и C81B опять же было не во всяком системном ПЗУ.

Теоретически да, но на практике нет. Да, игры в основном грамотно делали так, чтобы они работали при наличии только загрузчика (т.к не все были настолько богаты, чтобы позволить себе истратить лишние 3-5 рублей на покупку второй 573 РФ2). Но я и предлагал перехватывать точку внутри загрузчика, а не вход C81B.

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

Во-первых, C037 ради крошечного ускорения выводит по OR без очистки знакоместа. Таким образом при выводе на нечистый экран на экран выводится просто мусор. Знакоместо очищает только Забой. Потому п/п-мма C809, чтобы не писать полностью новую процедуру вывода символа делает так. Она выводит забой, затем возвращает курсор на место и затем передает управление на C037. Потому системные программы, чтобы вывод был таким же как во всех остальных компьютерах в мире вызывают C809, а не C037.

Во-вторых, вообще нет ролика экрана. По выводу ВК в последней строке экрана, курсор перескакивает на первую строку. Потому Орлову пришлось писать свой ролик для подпрограммы C809 (причём он сделал его тормозным, т.е без использования стека).

Ясно, что для системных программ такое поведение неприемлемо. Потому все системные программы (кроме самого раннего бейсика) используют и требуют наличия ПЗУ C800 с орловским (или совместимым) монитором. Таким образом ПЗУ C800 это не монитор, а тоже ROM-BIOS, т.к содержит стандартные входные точки.

Получается, что если хочешь только играть в игры, тебе достаточно ПЗУ в 2 кб. Но если нужны системные программы, то без ПЗУ C800 не обойтись. Потому только самые несерьёзные пользователи Специалиста не имели ПЗУ C800.

Кстати, третий недостаток п/п-ммы C037 загрузчика в том, что она не обрабатывает искейп-коды. И даже прямое позиционирование курсора отсутствует, что вообще нонсенс. Отпозиционировать курсор можно только некорректно залезая в служебные ячейки ПЗУ POSX,POSY, но которые в свою очередь неудобные для программиста, т.к не абсолютные в значениях координат, а в виде абстрактных экранных данных.

Кстати Орлов, эту ошибку тоже не исправил, хотя ESC+Y в ПЗУ РК86 обслуживается. Это как раз и вызывает несовместимость с ПО от РК86. Таким образом делали новый ROM-BIOS с целью обеспечить совместимость, но даже столь важную вещь как совместимость самой главной подпрограммы не обеспечили.

В четвёртых, не обслуживаются упр.коды 8A, 8B позволяющие включить/выключить вывод символов в инверсии, что снова заставляет нагло напрямую лезть в служебные ячейки ПЗУ.

Все эти и другие ошибки базовых ПЗУ были исправлены в более грамотных версиях ПЗУ, причём при сохранении совместимости. Например, в ПЗУ C800 совмещены 18 стандартных и более 20 недокументированных (хотя иногда сдуру кое-кем используемых) входов в п/п-ммы ПЗУ.


Last edited by barsik on 28 Apr 2018 10:05, edited 5 times in total.



28 Apr 2018 09:27
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
barsik wrote:
Кстати, чтобы введя ПЗУ C800 не требовалось переделывать РК-программы, достаточно было применить 2 диода, чтобы по адресу F800...F8FF читалось ПЗУ C800...C8FF.

Был очень хороший вариант системного ПЗУ от кооператива из Барнаула, где по адресу F800
было ПЗУ, дублирующее вызовы, характерные для РК-86: F803, F806, F809 и т.д.
А С81В никакого не было...

Эту идею потом подхватили в RAMFOS (кстати, многое списали из DDT SP-580) они уже дублировали
и те и другие адреса: F803=С803, ... и т.д. Хотя и не все.

А вот 580ВВ55 сидела на разных адресах.
Так что подзапутана была эта проблема в "Специалисте"...

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

_________________
iLavr


28 Apr 2018 09:48
Profile
Senior

Joined: 19 Feb 2017 04:46
Posts: 109
Location: 600 км от Москвы
Reply with quote
heavy wrote:
- только графический режим 384x256 (как у Специалиста), но адресация по-другому - вертикальными столбиками по 8 бит (точек) - будет удобно рисовать любые шрифты (даже разно-ширинные)

Странно, что никто не отреагировал на этот абзац.

Режим, когда экранный байт выводится не по горизонтали, а по вертикали никогда и нигде (во всём мире) ещё не использовался. Так работают принтеры (т.е годятся принтерные шрифты). Возможно это можно сделать в данном устройстве, где железо реализовано программно. А для реала это очень невыгодно, т.к развёртка в реале идёт по горизонтали, отчего при вертикальном размещении экранного байта частота доступа к ОЗУ увеличивается в 8 раз, т.е нужно 10-ти наносекундное ОЗУ. Потому таких видео-адаптеров в мире нет.

Гораздо более разумна организация экрана точно как у Специалиста (но с размером 512*256). В пользу этого важным доводом является наличие драйверов на все размеры шрифтов (D5, D6, D7, D8) для экрана Специалиста/Ориона (хотя большая часть, в том числе и моих драйверов написана для Z80, т.к драйвер для КР580 тормознее на 10%) и возможность отладки графики в эмуляторах Специалиста и ОРИОНА.

heavy wrote:
графический режим 384x256

Экран шириной в 384 точки очень невыгоден для текста. Байтовый шрифт 8*10 на экране 512*256 не только красивее, но главное, в три раза быстрее, чем шрифт 6*10 на экране в 384*256, несмотря на бОльший размер экрана (это из-за того, что в байтовых шрифтах отпадает чтение экрана, сдвиг фонта и маскирование). Лишь ролик экрана из-за большего размера экрана медленнее. Но для данной конструкции это не играет роли, т.к ролик можно делать встроенной функцией эмулятора на скорости 160 МГЦ.

Потому самым разумным форматом экрана является экран 512*256 с линейной вертикальной организацией точно как в Специалисте.

heavy wrote:
- ядро i8080

Если уж делать подобную конструкцию, основное применение которой - это CP/M, в которой больше программных пакетов для Z80 и наиболее полезные компиляторы требуют именно Z80, то и эмулировать разумно именно Z80. Если нет готового модуля для Z80, то более привлекательным изделие сделает даже частичный Z80, - достаточно добавить к блоку эмуляции 8080 JR-команды, 16-ти битовые SBC и загрузки двойных регистров.

В итоге получится очень простой и дешёвый CP/M-компьютер.


20 May 2018 15:11
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
barsik wrote:
Режим, когда экранный байт выводится не по горизонтали, а по вертикали никогда и нигде (во всём мире) ещё не использовался.

Почему же не использовался? :o Использовался и весьма популярен в LCD дисплеях типа Nokia 3310 и иже с ним.
Image

_________________
iLavr


20 May 2018 16:47
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 23 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.