Просмотр полной версии : Клавиатура DEC LK201
CodeMaster
31.01.2014, 23:14
Она совместима с МС 7004, можно её подключить к Электронике 85 для проверки работоспособности? Или её можно подключить к COM-порту ПЦ?
Она совместима с МС 7004, можно её подключить к Электронике 85 для проверки работоспособности? Или её можно подключить к COM-порту ПЦ?
http://deskthority.net/wiki/DEC_LK201
Симпатичные кнопочки, никогда не щупал живьём такие.
По ссылки кроме краткого описания (англ.) есть фотки со всех ракурсов.
(*это не ответ на ваш вопрос это я для оживления темы картинкой)
Она совместима с МС 7004, можно её подключить к Электронике 85 для проверки работоспособности? Или её можно подключить к COM-порту ПЦ?Электроника 85 без проблем работает с LK201, правда последние версии LK201 ( якобы ) рассчитаны на питание +5, а не +12 вольт. Этот момент есть смысл уточнить перед подключением к Эл.85.
Для подключения к COM-порту PC - порт надо настроить на скорость 4800;8N1.
Клавиатуры МС 7004 и LK201 генерят сканкоды, поэтому единственный смысл их подключения к PC - использование конвертера "Эмулятора ДВК" для превращения сканкодов этих клавиатур в ASCII-коды нажатых клавиш для последующего использования в эмуляторе или передачи в другой COM-порт.
CodeMaster
01.02.2014, 07:27
это я для оживления темы картинкой
Тогда лучше так:
http://media.auvito.de/images/cache/99/b8/27/99b827e9b802d2cbef6c8260607b15d4.jpg?http%3A%2F%2F www.computer-makarow.de%2Fimages%2Fproduct_images%2Fpopup_image s%2F20_0.jpg,400,400,,,,-1,-1,-1,-1,-1,-1,0,0,0
У меня очень похожа на эту.
правда последние версии LK201 ( якобы ) рассчитаны на питание +5, а не +12 вольт. Этот момент есть смысл уточнить перед подключением к Эл.85
Интересно как? Шильдика на ней нет. Посмотреть внутри или сначала подключить +5В и посмотреть на её реакцию?
Для подключения к COM-порту PC - порт надо настроить на скорость 4800;8N1.
А распиновку клавиатуры или схему подключения не подскажешь?
З.Ы. Расипиновку нашёл
http://freebsd.csie.nctu.edu.tw/www.netbsd.org/htdocs/docs/Hardware/Machines/DEC/LK201_connector.jpg
D-> к Rx, D<- к Tx подключать?
Интересно как? Шильдика на ней нет. Посмотреть внутри или сначала подключить +5В и посмотреть на её реакцию?
Да подключи питание (только питание) 5В и посмотри осциллографом на выходе при нажатии кнопки. Если сигнал есть значит клавиатура 5 вольтовая. Тогда её к COM порту нельзя подключать напрямую. В этом случае используй конвертер типа MAX232.
---------- Post added at 10:53 ---------- Previous post was at 09:29 ----------
Да, как подключишь скинь сканкоды очень интересно сравнить с мс7004.
Интересно как? Шильдика на ней нет. Посмотреть внутри или сначала подключить +5В и посмотреть на её реакцию?Вот что пишут на эту тему:
? anonymous - 02.02.2013 17:40
Разобрал LK201 свою - используются контакты пленок посеребрёных, как в новой клавиатуре БКшки, в остальном начинка такая же, на MCS48, только со внутренним ПЗУ, а в 7004 - внешнее, и у моей нет стабилизатора 12v→5v, сразу 5v подаётся с линии, что выжгло бы её при подключении к ДВК.
Вот мне тут поведал историю приятель, у них тоже были клавиатуры и со стабилизатором и без него, последние попадали с vaxstation, а 12в - с терминалами и их жгли, когда меняли местами. У попадавшихся мне микроваксов rs423 вместо rs232 используется, видимо под него и не устанавливался стабилизатор, т.к. там ±5в уровни. Жаль на ней PN не видно какой, шильдик давно отклеился и потерялся.
---------- Post added at 11:59 ---------- Previous post was at 11:54 ----------
сканкоды очень интересно сравнить с мс7004.Сканкоды у LK201 такие:
https://www.netbsd.org/docs/Hardware/Machines/DEC/LK201_large_keycodes.jpg
CodeMaster
01.02.2014, 13:24
и посмотри осциллографом
Осциллографа нет (точнее есть, но считай, что нет), а реакция светодиодов ни о чём не скажет?
В этом случае используй конвертер типа MAX232.
У меня ещё есть терминал VT510 надо посмотреть нельзя ли её к нему подключить.
в остальном начинка такая же, на MCS48, только со внутренним ПЗУ, а в 7004 - внешнее
А что значит "внешнее"?
а реакция светодиодов ни о чём не скажет?Если на входе питания стоит преобразователь 12в-5в, то вряд ли клавиатура заработает, если на этот преобразователь подать 5в. Значит ДА, если при подаче 5в клавиатура не подаёт признаков жизни - можно смело подавать 12в.
А что значит "внешнее"?Я понял так, что у LK201 микроконтроллер со встроенным в чип ПЗУ, а внутри МС 7004 - обычный процессор с программой во внешнем ( по отношению чипу процессора ) ПЗУ.
А что значит "внешнее"?
Я понял так, что у LK201 микроконтроллер со встроенным в чип ПЗУ, а внутри МС 7004 - обычный процессор с программой во внешнем ( по отношению чипу процессора ) ПЗУ.
У МС7004 такой же микроконтроллер 1816ВЕ48 (аналог i8748). Он также имеет на своём борту репрограммируемое ПЗУ с УФ-стиранием объемом 1 Кбайт, но может работать с внешним ПЗУ объемом до 4 Кбайт. А программа в МС7004 занимает 2 Кбайта, потому и внешнее ПЗУ.
Сканкоды у LK201 такие:
Я имел в виду "живые" сканкоды (дамп эмулятора VT52).
Осциллографа нет (точнее есть, но считай, что нет), а реакция светодиодов ни о чём не скажет?
Светодиоды должны моргнуть я думаю. Если моргнули значит контроллер запустился.
У МС7004 такой же микроконтроллер 1816ВЕ48 (аналог i8748). Он также имеет на своём борту репрограммируемое ПЗУ с УФ-стиранием объемом 1 Кбайт, но может работать с внешним ПЗУ объемом до 4 Кбайт. А программа в МС7004 занимает 2 Кбайта, потому и внешнее ПЗУ.
Там стоит КМ1816ВЕ35 который не имеет ничего на своём борту. А внешнее ПЗУ у него 2 Кбайта кс573рф2.
Там стоит КМ1816ВЕ35 который не имеет ничего на своём борту. А внешнее ПЗУ у него 2 Кбайта кс573рф2.
По официальной документации в МС7004 стоит 1816ВЕ48, вживую не видел. А по схеме вход выбора внутренней/внешней ПЗУ EMA никуда не подключен.
shattered
01.02.2014, 18:54
Прошивки ПЗУ из 7004 где-то есть?
Прошивки ПЗУ из 7004 где-то есть?
Есть (http://zx.pk.ru/showpost.php?p=461033&postcount=1447) плюс дизассемблированные с комментариями.
http://zx.pk.ru/attachment.php?attachmentid=44972&stc=1&d=1389423285
CodeMaster
06.02.2014, 17:02
Разобрал клавиатуру, КРЕНка есть, значит 12-ти вольтовая. Подключил 12В к контроллеру без кнопок - загорелись 3 светодиода, кроме первого (Hold session). Подключил 12В с кнопками, загорелись все 4-ре - не гаснут, клава не пищит, на кнопки не реагирует. Походу мёртвая :-(
CodeMaster, а сфотографируй пожалуйста плату контроллера этой клавиатуры поразборчивей, а то в сети я вообще ничего ясного не нашел, а в эмуляции MESS, 2Kb прошивка "23-00159-00.bin" в http://mamedev.org/source/src/mess/machine/dec_lk201.c.html это "dump of the 'cost reduced' 6805 CPU version", не "ROM dump of the i8048 CPU version".
P.S. Ага, после просмотра фотографий от CodeMaster, (23-004M2-00 / SCN8051H chip) выгуглилось вот тут уточнение:
http://www.classiccmp.org/pipermail/cctech/2013-February/102099.html
и http://forums.bannister.org/ubbthreads.php?ubb=showflat&Number=91968#Post91968
CodeMaster
06.02.2014, 18:47
CodeMaster, а сфотографируй пожалуйста плату контроллера этой клавиатуры поразборчивей
Фотки высокого качества ушли на мыло.
1.После подачи питания измерить на ОЭВМ + 5в, и есть ли импульсы на кварце
( он, кстати, может быть механически побит - т.к. внутри - стекло ).
2.После включения с кнопками проверить наличие импульсов на всех ножках однокристалки после нажатия кнопки - вдруг только выходной ключ КОМ-порта неисправен ? Должны быть телеграфные посылки при нажатии и отжатии кнопки.
Если +5в. есть, генерация кварца есть, а импульсов нет - вероятно, произошел пробой статикой от сканов кнопок - т.е. без софта ОЭВМ изделие неремонтопригодно.
3.Еще можно проверить наличие сигнала "сброс ОЭВМ" - вырабатывается на конденсаторе - электролите. Может, он высох ?
CodeMaster
07.02.2014, 11:23
P.S. Ага, после просмотра фотографий от CodeMaster, (23-004M2-00 / SCN8051H chip) выгуглилось вот тут уточнение:
Всё весьма запущено ;-) Т.е. их минимум 3 варианта существовало: i8051/i8031/MC68HC05
1.После подачи питания измерить на ОЭВМ + 5в, и есть ли импульсы на кварце
Нужен осциллограф, т.ч. пока отложил до лучших времён.
т.е. без софта ОЭВМ изделие неремонтопригодно
А программируется она через параллельный интерфейс, т.е. таракана надо выпаивать?
Разобрал клавиатуру, КРЕНка есть, значит 12-ти вольтовая. Подключил 12В к контроллеру без кнопок - загорелись 3 светодиода, кроме первого (Hold session). Подключил 12В с кнопками, загорелись все 4-ре - не гаснут, клава не пищит, на кнопки не реагирует. Походу мёртвая :-(
Если можно, фото КРЕНки на плате.
Возможно клавиатура сообщает что линия связи отсутствует. Поэтому на кнопки она будет реагировать когда установится связь.
Всё весьма запущено ;-) Т.е. их минимум 3 варианта существовало: i8051/i8031/MC68HC05
Твой вариант 8051
Нужен осциллограф, т.ч. пока отложил до лучших времён.
Ну 5в то можно посмотреть.
А программируется она через параллельный интерфейс, т.е. таракана надо выпаивать?
Ранние 51е программируются через программатор. Но у тебя возможно одноразовый чип.
И ещё: За прошивку берутся в последнюю очередь.
CodeMaster
07.02.2014, 17:59
Если можно, фото КРЕНки на плате.
Ну, самая обычная в корпусе ТО-220 Уже собрал, разбирать пока не буду.
Твой вариант 8051
Это я понял ;-) я в общем.
Ну 5в то можно посмотреть.
Позже, есть вариант что появится вторая, тогда посмотрю в сравнении.
И ещё: За прошивку берутся в последнюю очередь.
Да я в принципе, вдруг уже была возможность наплатного программирования.
Сканкоды у LK201 такие:
А есть код инициализации?
Я тут подключил клавиатуру МС7004 к терминалу VT240 и тот отказался работать. Пишет: VT240 Keyboard Error- 6.
Как вариант попробую сменить на советские прошивки в терминале.
- - - Добавлено - - -
Upd. Нашел коды.
Вроде такие:
If the keyboard passes all power up tests with no error,
the resulting sequence sent to the computer is: 0x01 0x00 0x00 0x00
- - - Добавлено - - -
Upd2. А такой код в МС7004 есть. Остаётся только дампить порт VT240 на другие команды.
Возможно что терминал спрашивает языковый вариант клавиатуры.
- - - Добавлено - - -
Запрос на клавиатуру LK201 от терминала VT240 такой:
023 217 217 211 021 217 023 203 023 217 217 211 375 021 200 023 217 217 211 247 247 375 023
:v2_dizzy_facepalm: :)
- - - Добавлено - - -
Коды на LK201 окт/нех.
023/013- зажечь светодиод
217/8F- все светодиоды
211/89-?
021/11- погасить светодиод
203/83-?
375/FD- запускает последовательность включения клавиатуры
200/80- вниз (?)
247/A7- подать сигнал на бипер.
shattered
14.12.2018, 23:51
наш клон vt240 тоже шлет такие коды, и обычная прошивка от 7004 на это обижается. может быть, есть другая какая-то
наш клон vt240 тоже шлет такие коды, и обычная прошивка от 7004 на это обижается. может быть, есть другая какая-то
Да нет, клавиатура вполне выполняет эти коды (т.е. зажигает светодиоды и пищит). Это VT240 что-то не нравится.
В принципе в меню даёт зайти (кнопка "пауза"). По меню можно спокойно ходить/настраивать, дальше не пробовал.
Надо эхо сделать чтоб что-то напечатать.
shattered
15.12.2018, 00:50
все же, если обнаружится владелец работающей комбинации мс7105 и мс7004, которая при старте показывает логотип "Электроника", а не ошибку клавиатуры -- можно попросить его снять дампы для сравнения :-)
В общем такая каша получается.
МС7004 при включении ( клавиатура подключена к VT240) даёт код такой:
Дамп с программы Terminal v1.9b (нех)
C0 00 B7 B6 B7
Дамп с программы эмулятора VT52 (ост)
300 1000 000 267 266 267
Дамп с программы Terminal v1.9b (нех)
C0 00 B7 B6 B7
Дамп с программы эмулятора VT52 (ост)
300 1000 000 267 266 267
в дамп с программы эмулятора VT52 похоже, что лишняя 1000 записалась... байт не может иметь такого значения.
в дамп с программы эмулятора VT52 похоже, что лишняя 1000 записалась... байт не может иметь такого значения.Так (если правильно помню) эмулятор отображает приход сигнала BREAK.
- - - Добавлено - - -
Нашёл в исходнике, что это значит:
void BadFrame_CommandProcessor( PVOID ch, SocketClass *pSender )
{
return ByteReceiver( PVOID(((int)ch)|01000), pSender );
}
Т.е. к передаваемым байтам эмулятор добавляет 01000, если байт был принят с ошибкой границы кадра (т.е. без стоповых битов). Байт 000, принятый без стоповых битов - это сигнал BREAK.
Байт 000, принятый без стоповых битов - это сигнал BREAK.
Я сделал проще, соединил Тх,Rx СОМ порта вместе, подал с эмулятора VT52 BREAK, получил 1000 000.
- - - Добавлено - - -
.
Немного переделал выход клавиатуры. В обход микросхемы двуполярного передатчика, сделал выход через инвертор с микроконтроллера. На выходе получается ТТЛ который тоже берёт СОМ порт.
Дамп с программы эмулятора VT52 (ост)
1000 000 1000 000 267 266 267
Минусовое питание передатчика D7 появляется позже плюсового питания. Из-за этого на выходе происходит сдвиг нуля в плюс, и происходит ложное срабатывание.
Это я по коду 300 который не должен быть в самом начале.
- - - Добавлено - - -
Кстати ТТЛ сигнал VT240 не нравится, он его просто не берёт. Видать ему надо строго от минус 3 в отличии от РС.
- - - Добавлено - - -
......
Внес изменения в схему клавиатуры.
1) уменьшил ёмкость до 1мкФ конденсатора С3 для более быстрого старта микроконтроллера D1. Сигнал PSEN подаётся более раньше на генератор отрицательного напряжения.
2) уменьшил ёмкость до 10мкФ конденсатора С21 для более быстрого заряда от отрицательного напряжения. В недостатке сглаживания ёмкостью С21 не наблюдается.
Теперь получается дамп такой:
1000 000 267 266 267
- - - Добавлено - - -
Т.е. к передаваемым байтам эмулятор добавляет 01000 А правильно ли это? Ведь программа
Terminal v1.9b чётко определяет последовательность нулей.
Код при старте клавиатуры МС7004 подключенной к VT240.
BIN.
00000000
10110111
10110110
10110111
В нехе так:
00 В7 В6 В7
Правда, судя по всему BREAK эта программа считает двухбайтовым.Третий байт печатает. Хотя тут уже осциллографом надо вылавливать. Может клавиатура и один байт выдаёт.
если байт был принят с ошибкой границы кадра (т.е. без стоповых битов).
Так нет там стоповых бит. Стартовый есть, после него ведется отсчет на 8бит вроде и всё.
Байт 000, принятый без стоповых битов - это сигнал BREAK.
Ну в ASCII та есть ещё и символ "NUL" (пустой символ). Как он будет передаваться без стоповых битов.
- - - Добавлено - - -
.....
Замер на осциллографе дал таки результаты:
При включении дает (непрерывный) BREAK длительностью- 130мсек.
Длительность байта - 1,6мсек. (включая старт бит)
То-есть за 130мсек даёт 81,25 байтов нулей :)
- - - Добавлено - - -
По поводу стоп бита.
При зажатой клавише повторяется код к периодом 33мсек.
В принципе этот период за стоп бит годится, за очень жирный стоп бит :).
shattered
17.12.2018, 21:22
кстати, хорошо бы замерить реальную скорость передачи -- у меня в эмуляторе вышло, что мс7004 шлет на скорости 4960, а не 4800 bps.
кстати, хорошо бы замерить реальную скорость передачи -- у меня в эмуляторе вышло, что мс7004 шлет на скорости 4960, а не 4800 bps.
Могу так сказать: сбоев при приёме с клавиатуры МС7004 на скорости 4960 программой Terminal v1.9b я не обнаружил. Дело в том что приёмник синхронизируется с каждым приходом нового байта. При правильной скорости захват бита происходит по середине длительности одного бита. Т.е. рассчитано так что при небольшом отклонение в скорости в +/- захват будет.
Если скорость больше номинала, то последний бит будет захвачен в начале длительности. Если меньше то в конце.
Разумеется отклонение скорости не должно превышать пределы длительности последнего бита в кадре. Если сдвиг скорости происходит за пределы последнего бита в кадре, то будет сбой.
...
В программе Terminal v1.9b можно выставить нестандартную скорость приёма/передачи, но не факт что выставляет эту скорость контроллер последовательного порта.
- - - Добавлено - - -
шлет на скорости 4960, а не 4800 bps.
А правильно ли идет подсчет скорости? Возможно что 4800 это чисто данные, 4960 вместе со служебными битами.
С другой стороны, нужна ли для эмулятора такая точность? Вроде в МАМЕ/MESS нет выхода на СОМ порт.
- - - Добавлено - - -
все же, если обнаружится владелец работающей комбинации мс7105 и мс7004, которая при старте показывает логотип "Электроника", а не ошибку клавиатуры -- можно попросить его снять дампы для сравнения :-)
У меня конфигурация такая: VT240- клавиатурный порт <-> СОМ порт PC - Эм. MS7004.
Дамп при включении с Эм.MS7004.
001 000 000 000
Этот код VT240 пропускает т.к. сам ещё не загрузился.
Далее VT240 выходит на заставку "VT240 OK".
Дамп с Эм.MS7004 после заставки "VT240 OK".
001 000 000 000 001 000 000 000 001 000 000 000
Вторая и третья 4х байтовая посылка вроде как ответ на команду 375.
Дамп с VT240 на эм. MS7004.
023 217 217 211 021 217 023 203 023 217 217 211 375 023 217 217 211 021 217 247 213 375 012 201 022 202 032 201 042 201 250 266 072 202 102 202 112 203 320 132 203 142 203 152 203 162 203 231 271 043 202 341 021 217 172 144 236 174 144 236 176 144 236 343 023 200
UPD!
При проверке клавиатуры отработки кода 375 (инициализация) таки отвечает 001 000 000 000. Но отвечает если это одна команда. В сочетании с кодом 211 375 - отвечает 267, что и получается при посылке от VT240. В сочетании с кодом 213 375 отвечает правильно 001 000 000 000.
Ну и при включении нет кода 001 000 000 000.
UPD2
Как выяснилось, после кода 211 вроде как любая команда не всегда проходит.
Пробовал так:
211 247 - нет сигнала бипера. ответ - 267
при повторном коде 211 247 - сигнал бипера есть. ответа -нет.
и ещё раз 211 247 - сигнал бипера есть. ответа -нет.
Если после этого дать код 375 247 - нет сигнала бипера. ответа -нет.
После включения клавиатуры.
Код 375 247 - нет сигнала бипера. ответ есть - 001 000 000 000.
При повторном коде 375 247 - нет сигнала бипера. ответ есть - 001 000 000 000.
Вырезал аппендикс :) клавиатуры DEC LK201 из документа EK-104AA-ТМ-001.
Про отдельный документ только на клавиатуру, я не в курсе.
https://i.ibb.co/kHbC22w/2018-12-23-200910.jpg
Скачать -здесь. (http://doc.pdp-11.org.ru/DEC/KBD_LK201.pdf)
Купил на авито фирменную LK201!
Отмыл её, счистил инвентарники (с трудом). В целом состояние очень хорошее, но вот внутри было много пыли.
https://pic.maxiol.com/thumbs2/1664625565.1559557961.lk201.jpg (https://pic.maxiol.com/?v=1664625565.1559557961.lk201.jpg&dp=2)
Когда вскрывал для чистки, специально обратил внимание на плату, нашёл там LM340, т.е. стабилизатор, аналог нашей КРЕН5.
Собрал для неё переходник с Rj9 на СШ-5 под распайку нашей МС 7004.
https://pic.maxiol.com/thumbs2/1664625627.1559557961.perehod.jpg (https://pic.maxiol.com/?v=1664625627.1559557961.perehod.jpg&dp=2)
В целом полностью работоспособна! Отлично дружит с Xhomer, эмулятором ДВК (надо поправить таблицу соответствий символов кодам) и реальной Электроникой 85.
Скриншот из xhomer
https://pic.maxiol.com/thumbs2/1664626052.1559557961.snapshotimage00.png (https://pic.maxiol.com/?v=1664626052.1559557961.snapshotimage00.png&dp=2)
Если кому-то интересно, вот шильдик:
https://pic.maxiol.com/thumbs2/1664625958.1559557961.dscn8075.jpg (https://pic.maxiol.com/?v=1664625958.1559557961.dscn8075.jpg&dp=2)
Сравнение с МС 7004.
https://pic.maxiol.com/thumbs2/1664625988.1559557961.lk2017004.jpg (https://pic.maxiol.com/?v=1664625988.1559557961.lk2017004.jpg&dp=2)
надо поправить таблицу соответствий символов кодам
Что не соответствует?
Что не соответствует?
Ну очевидно вместо QWERTY печатается JCUKEN
На 85-й? Так надо просто загрузить не нашу ОСь, а оригинальную. Скан-коды у LK201 и МС7004, в общем-то, одинаковые, а какие из этих скан-кодов будут порождены символы ASCII решает драйвер терминала. Только вот про русскую раскладку придется забыть - вместо ЙЦУКЕНГ получится ЯВЕРТЫУ (вроде не ошибся). А чтобы сделать ЙЦУКЕНГ, надо будет КАПИТАЛЬНО переработать драйвер терминала. Если это будет RT-11, то придется переработать PI.SYS, а что делать с ПРОСом я понятия не имею, скорее всего, ничего сделать не выйдет.
Так надо просто загрузить не нашу ОСь, а оригинальную.
Да это понятно.
Я выше писал конкретно про эмулятор ДВК
Я выше писал конкретно про эмулятор ДВКЯ, вероятно, пропустил, что там делает эмулятор ДВК с клавиатурой 7004. Но, подозреваю, что с этим только к Патрону. То есть, конечно, нельзя исключить вариант, что, возможно, что-то удастся пропатчить с помощью какого-либо виндового двоичного редактора, но о русской клавиатуре без Патрона следует забыть, не будет ее.
но о русской клавиатуре без Патрона следует забыть
Да про русскую и речи никакой нет, это вы начали.
Да про русскую и речи никакой нет, это вы начали.Посмотрел я описание подключения 7004 к эмулятору. Детально я, конечно, не вникал, но мне показалось, что таблица соответствия кодов ASCII сканкодам клавиатуры прописывается где-то в инишниках.
Добавлю. Я надеялся, что Патрон сделал, пусть, не КЦГД-шную клавиатуру, но, хотя бы КСМ-ную. Ага, два раза. На этой 7004 сделано нечто, похожее на 15ИЭ-00-013. Нет, я понимаю, у человека любимый дисплей и всё такое, но чем ему КСМ не угодил?
- - - Добавлено - - -
Впрочем, если я не ошибся и таблица действительно прописана в инишниках, то, детально вникнув в нее, можно сделать и КСМ-овскую клавиатуру, и, может быть и КЦГД-шную...
Посмотрел я описание подключения 7004 к эмулятору. Детально я, конечно, не вникал, но мне показалось, что таблица соответствия кодов ASCII сканкодам клавиатуры прописывается где-то в инишниках.
Только для тех клавиш, коды которых не изменяются при нажатии <Shift> и <Ctrl>.
У LK201 не только буквенные клавиши не совпадают с МС7004, но и те клавиши со скобками и знаками, которые рядом с буквенными. Чтобы сделать адаптер для LK201 - нужно правильно переделать несколько таблиц сканкодов:
#define U(x) x+0200
////////////////////////
const byte MS7004_Converter::LAT_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', ';', // 270..277
'1', 'j', 'f', 'q', '_', '2', 'c', 'y', // 300..307
'^', U(37), '/', '3', 'u', 'w', 's', 0, // 310..317
'4', 'k', 'a', 'm', ' ', 0, '5', 'e', // 320..327
'p', 'i', 0, '6', 'n', 'r', 't', 0, // 330..337
'7', 'g', 'o', 'x', 0, '8', '[', 'l', // 340..347
'b', 0, '9', ']', 'd', '@', 0, '0', // 350..357
'z', U(38), 'v', ',', 0, U(39), 'h', '.', // 360..367
0, '-', ':', '\\', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_FKS_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', ';', // 270..277
'1', 'J', 'F', 'Q', '_', '2', 'C', 'Y', // 300..307
'^', U(37), '/', '3', 'U', 'W', 'S', 0, // 310..317
'4', 'K', 'A', 'M', ' ', 0, '5', 'E', // 320..327
'P', 'I', 0, '6', 'N', 'R', 'T', 0, // 330..337
'7', 'G', 'O', 'X', 0, '8', '[', 'L', // 340..347
'B', 0, '9', ']', 'D', '@', 0, '0', // 350..357
'Z', U(38), 'V', ',', 0, U(39), 'H', '.', // 360..367
0, '-', ':', '\\', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_Shift_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '+', // 270..277
'!', 'J', 'F', 'Q', '_', '"', 'C', 'Y', // 300..307
'~', U(37), '?', '#', 'U', 'W', 'S', 0, // 310..317
'$', 'K', 'A', 'M', ' ', 0, '%', 'E', // 320..327
'P', 'I', 0, '&', 'N', 'R', 'T', 0, // 330..337
'\'', 'G', 'O', 'X', 0, '(', '{', 'L', // 340..347
'B', 0, ')', '}', 'D', '`', 0, '0', // 350..357
'Z', U(38), 'V', '<', 0, U(39), 'H', '>', // 360..367
0, '=', '*', '|', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_FKS_Shift_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '+', // 270..277
'!', 'j', 'f', 'q', '_', '"', 'c', 'y', // 300..307
'~', U(37), '?', '#', 'u', 'w', 's', 0, // 310..317
'$', 'k', 'a', 'm', ' ', 0, '%', 'e', // 320..327
'p', 'i', 0, '&', 'n', 'r', 't', 0, // 330..337
'\'', 'g', 'o', 'x', 0, '(', '{', 'l', // 340..347
'b', 0, ')', '}', 'd', '`', 0, '0', // 350..357
'z', U(38), 'v', '<', 0, U(39), 'h', '>', // 360..367
0, '=', '*', '|', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::RUS_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', ';', // 270..277
'1', 'J', 'F', 'Q', '_', '2', 'C', 'Y', // 300..307
'^', U(37), '/', '3', 'U', 'W', 'S', 0, // 310..317
'4', 'K', 'A', 'M', ' ', 0, '5', 'E', // 320..327
'P', 'I', 0, '6', 'N', 'R', 'T', 0, // 330..337
'7', 'G', 'O', 'X', 0, '8', '[', 'L', // 340..347
'B', 0, '9', ']', 'D', '@', 0, '0', // 350..357
'Z', U(38), 'V', ',', 0, U(39), 'H', '.', // 360..367
0, '-', ':', '\\', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::RUS_FKS_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', ';', // 270..277
'1', 'j', 'f', 'q', '_', '2', 'c', 'y', // 300..307
'~', U(37), '/', '3', 'u', 'w', 's', 0, // 310..317
'4', 'k', 'a', 'm', ' ', 0, '5', 'e', // 320..327
'p', 'i', 0, '6', 'n', 'r', 't', 0, // 330..337
'7', 'g', 'o', 'x', 0, '8', '{', 'l', // 340..347
'b', 0, '9', '}', 'd', '`', 0, '0', // 350..357
'z', U(38), 'v', ',', 0, U(39), 'h', '.', // 360..367
0, '-', ':', '|', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::RUS_Shift_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '+', // 270..277
'!', 'j', 'f', 'q', '_', '"', 'c', 'y', // 300..307
'~', U(37), '?', '#', 'u', 'w', 's', 0, // 310..317
'$', 'k', 'a', 'm', ' ', 0, '%', 'e', // 320..327
'p', 'i', 0, '&', 'n', 'r', 't', 0, // 330..337
'\'', 'g', 'o', 'x', 0, '(', '{', 'l', // 340..347
'b', 0, ')', '}', 'd', '`', 0, '0', // 350..357
'z', U(38), 'v', '<', 0, U(39), 'h', '>', // 360..367
0, '=', '*', '|', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::RUS_FKS_Shift_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '+', // 270..277
'!', 'J', 'F', 'Q', '_', '"', 'C', 'Y', // 300..307
'^', U(37), '?', '#', 'U', 'W', 'S', 0, // 310..317
'$', 'K', 'A', 'M', ' ', 0, '%', 'E', // 320..327
'P', 'I', 0, '&', 'N', 'R', 'T', 0, // 330..337
'\'', 'G', 'O', 'X', 0, '(', '[', 'L', // 340..347
'B', 0, ')', ']', 'D', '@', 0, '0', // 350..357
'Z', U(38), 'V', '<', 0, U(39), 'H', '>', // 360..367
0, '=', '*', '\\', U(40), U(41), 0, 0, // 370..377
};
.
Обновилась текущая сборка "эмулятора ДВК": DVK_Emulator_16.10.22_18-03 (https://emulator.pdp-11.org.ru/DVK/distr/DVK_Emulator_16.10.22_18-03.rar)
Изменения:
1. Объекту MS7004_Converter добавлен параметр LK201_Mode со значением по-умолчанию 0. Пример - в файле конфигурации MS7004_Converter.cfg. Для подключения клавиатуры LK201 - значение параметра нужно изменить на 1:
[MS7004_Converter.ini]
LK201_Mode = 1
...
На данный момент таблицы сканкодов следующие:
#define U(x) x+0200
////////////////////////
const byte MS7004_Converter::LAT_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', ';', // 270..277
'1', 'j', 'f', 'q', '_', '2', 'c', 'y', // 300..307
'^', U(37), '/', '3', 'u', 'w', 's', 0, // 310..317
'4', 'k', 'a', 'm', ' ', 0, '5', 'e', // 320..327
'p', 'i', 0, '6', 'n', 'r', 't', 0, // 330..337
'7', 'g', 'o', 'x', 0, '8', '[', 'l', // 340..347
'b', 0, '9', ']', 'd', '@', 0, '0', // 350..357
'z', U(38), 'v', ',', 0, U(39), 'h', '.', // 360..367
0, '-', ':', '\\', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_to_ASCII_LK201[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '`', // 270..277
'1', 'q', 'a', 'z', '_', '2', 'w', 's', // 300..307
'x', '<', '/', '3', 'e', 'd', 'c', 0, // 310..317
'4', 'r', 'f', 'v', ' ', 0, '5', 't', // 320..327
'g', 'b', 0, '6', 'y', 'h', 'n', 0, // 330..337
'7', 'u', 'j', 'm', 0, '8', 'i', 'k', // 340..347
',', 0, '9', 'o', 'l', '.', 0, '0', // 350..357
'p', U(38), ';', '/', 0, '=', ']', '\\', // 360..367
0, '-', '[', '\'', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_FKS_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', ';', // 270..277
'1', 'J', 'F', 'Q', '_', '2', 'C', 'Y', // 300..307
'^', U(37), '/', '3', 'U', 'W', 'S', 0, // 310..317
'4', 'K', 'A', 'M', ' ', 0, '5', 'E', // 320..327
'P', 'I', 0, '6', 'N', 'R', 'T', 0, // 330..337
'7', 'G', 'O', 'X', 0, '8', '[', 'L', // 340..347
'B', 0, '9', ']', 'D', '@', 0, '0', // 350..357
'Z', U(38), 'V', ',', 0, U(39), 'H', '.', // 360..367
0, '-', ':', '\\', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_FKS_to_ASCII_LK201[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '`', // 270..277
'1', 'Q', 'A', 'Z', '_', '2', 'W', 'S', // 300..307
'X', '<', '/', '3', 'E', 'D', 'C', 0, // 310..317
'4', 'R', 'F', 'V', ' ', 0, '5', 'T', // 320..327
'G', 'B', 0, '6', 'Y', 'H', 'N', 0, // 330..337
'7', 'U', 'J', 'M', 0, '8', 'I', 'K', // 340..347
',', 0, '9', 'O', 'L', '.', 0, '0', // 350..357
'P', U(38), ';', '/', 0, '=', ']', '\\', // 360..367
0, '-', '[', '\'', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_Shift_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '+', // 270..277
'!', 'J', 'F', 'Q', '_', '"', 'C', 'Y', // 300..307
'~', U(37), '?', '#', 'U', 'W', 'S', 0, // 310..317
'$', 'K', 'A', 'M', ' ', 0, '%', 'E', // 320..327
'P', 'I', 0, '&', 'N', 'R', 'T', 0, // 330..337
'\'', 'G', 'O', 'X', 0, '(', '{', 'L', // 340..347
'B', 0, ')', '}', 'D', '`', 0, '0', // 350..357
'Z', U(38), 'V', '<', 0, U(39), 'H', '>', // 360..367
0, '=', '*', '|', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_Shift_to_ASCII_LK201[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '~', // 270..277
'!', 'Q', 'A', 'Z', '_', '@', 'W', 'S', // 300..307
'X', '>', '?', '#', 'E', 'D', 'C', 0, // 310..317
'$', 'R', 'F', 'V', ' ', 0, '%', 'T', // 320..327
'G', 'B', 0, '^', 'Y', 'H', 'N', 0, // 330..337
'&', 'U', 'J', 'M', 0, '*', 'I', 'K', // 340..347
',', 0, '(', 'O', 'L', '.', 0, ')', // 350..357
'P', U(38), ':', '?', 0, '+', '}', '|', // 360..367
0, '_', '{', '"', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_FKS_Shift_to_ASCII[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '+', // 270..277
'!', 'j', 'f', 'q', '_', '"', 'c', 'y', // 300..307
'~', U(37), '?', '#', 'u', 'w', 's', 0, // 310..317
'$', 'k', 'a', 'm', ' ', 0, '%', 'e', // 320..327
'p', 'i', 0, '&', 'n', 'r', 't', 0, // 330..337
'\'', 'g', 'o', 'x', 0, '(', '{', 'l', // 340..347
'b', 0, ')', '}', 'd', '`', 0, '0', // 350..357
'z', U(38), 'v', '<', 0, U(39), 'h', '>', // 360..367
0, '=', '*', '|', U(40), U(41), 0, 0, // 370..377
};
const byte MS7004_Converter::LAT_FKS_Shift_to_ASCII_LK201[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 000..007
0, 0, 0, 0, 0, 0, 0, 0, // 010..017
0, 0, 0, 0, 0, 0, 0, 0, // 020..027
0, 0, 0, 0, 0, 0, 0, 0, // 030..037
0, 0, 0, 0, 0, 0, 0, 0, // 040..047
0, 0, 0, 0, 0, 0, 0, 0, // 050..057
0, 0, 0, 0, 0, 0, 0, 0, // 060..067
0, 0, 0, 0, 0, 0, 0, 0, // 070..077
0, 0, 0, 0, 0, 0, 0, 0, // 100..107
0, 0, 0, 0, 0, 0, 0, 0, // 110..117
0, 0, 0, 0, 0, 0, U(77), U(2), // 120..127
U(3), U(4), U(5), 0, 0, 0, 0, 0, // 130..137
0, 0, 0, 0, U(6), U(7), U(8), U(9), // 140..147
U(10), 0, 0, 0, 0, 0, 0, 0, // 150..157
0, U(11), U(12), U(13), U(14), 0, 0, 0, // 160..167
0, 0, 0, 0, U(15), U(16), 0, 0, // 170..177
U(17), U(18), U(19), U(20), 0, 0, 0, 0, // 200..207
0, 0, U(21), U(22), U(23), U(24), U(25), U(26), // 210..217
0, 0, U(50), 0, U(61), U(60), U(51), U(52), // 220..227
U(53), U(54), U(55), U(56), U(63), U(57), U(58), U(59), // 230..237
U(62), U(27), U(28), U(29), U(30), 0, 0, U(31), // 240..247
U(32), U(33), U(34), 0, 0, 0, U(73), U(72), // 250..257
U(74), U(76), U(75), U(71), U(70), 0, 0, 0, // 260..267
0, 0, 0, 0, U(35), U(36), '\t', '~', // 270..277
'!', 'q', 'a', 'z', '_', '@', 'w', 's', // 300..307
'x', '>', '?', '#', 'e', 'd', 'c', 0, // 310..317
'$', 'r', 'f', 'v', ' ', 0, '%', 't', // 320..327
'g', 'b', 0, '^', 'y', 'h', 'n', 0, // 330..337
'&', 'u', 'j', 'm', 0, '*', 'i', 'k', // 340..347
',', 0, '(', 'o', 'l', '.', 0, ')', // 350..357
'p', U(38), ':', '?', 0, '+', '}', '|', // 360..367
0, '_', '{', '"', U(40), U(41), 0, 0, // 370..377
};
Если какие-то клавиши обрабатываются неправильно - сообщайте.
На данный момент таблицы сканкодов следующие:
Может их вообще вынести во внешний файл и считывать его, если в конфиге будет указана ссылка?
Patron, Проверяю. Всё работает, но вместо L выводится D. Сама D работает нормально.
На моей LK201 D выдаёт код 205 (8), а L - 236 (8).
Надоел переходник, обжал/спаял отдельный кабель. Сделал его подлиннее.
https://pic.maxiol.com/thumbs2/1665237604.1559557961.img20221008155731.jpg (https://pic.maxiol.com/?v=1665237604.1559557961.img20221008155731.jpg&dp=2)
Релиз эмулятора обновлён (https://zx-pk.ru/threads/18351-emulyator-dvk.html?p=1164319#post1164319). Исправлена ошибка - при замене таблицы скан-кодов МС7004 для LK201 была пропущена буква "L".
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot