Зверинецъ
Специалист (был когда-то "совсем стандарт") - 1988-2023
Ленинград1 +256К +AY+BDI+VGA выход +Ethernet (Speccyboot) +Xmodem (115200)+divmmc
Ленинград2 + CF карта
Платформа 8085+Z80+CPLD (Специалист МХ2 +SD +FDD +PS/2kbd)
БК0010-01 стоковый[свернуть]
Поковырялся в ПЗУ. Процедуры опроса действительно несколько отличаются. Конкретно в "Монитор-2" насколько удалось понять, после проверки клавиши НР происходит вывод звука а потом... опять опрос... То есть вроде как бесконечный цикл с условием проверки нажатия клавиши НР. Но это не точно, только на первый взгляд.
Теперь по самой теме опроса клавиатуры. Как я понял, сначала нужно загрузить в регистр управления значение $82. Опрашиваем столбец через LDA $ff01. Значение нужно где-то сохранить. Затем, загружаем в регистр управления значение $91, и опрашиваем сначала $ff00 и если оно равно $ff, то загрузить из $ff02 и уже там проверить вторую половину байта. И вот теперь, на основании значений номера строки и столбца, вычисляем значение клавиши. Я правильно понял?
По моему глубокому убеждению, прямое программирование портов это очень плохой подход. Например, при прямом программировании перестанет работать моя раскладка QWERTY/ЙЦУКЕН на реальных оригинальных компьютерах, где я установил соответствующую прошивку и нарадоваться не могу. Опять же существуют всякие контроллеры PC-клавиатуры, которые неизвестно как будут работать с такой программой. Ну ладно ещё курсор с пробелом напрямую опрашивать - они на одной линии и от раскладки не зависят. Но алфавитно-цифровые клавиши я бы опрашивал именно через стандартные подпрограммы ПЗУ. Прямой опрос клавиатуры можно, конечно, сделать, но это не так просто для понимания, да и отожрёт память, которой и так мало.
Вот пример, как я опрашиваю курсор с пробелом.
И всё же я до сих пор не понимаю, что и где не работает в стандартной процедуре ПЗУ? Предлагаю всё-таки сосредоточиться на этом вопросе и решить его:Код:;------------------------------------------------------------- ; Опрос клавиатуры на предмет нажатия курсорных клавиш и пробела ; Результат в регистре А ; A = 0 - не было нажатия ; Z = 1 - не было нажатия ; Отдельные установленные биты: ; 0 - Вниз ; 1 - Вверх ; 2 - Вправо ; 4 - Влево ; 5 - Пробел keyboard: ld a, 0x91 ; Программируем ППИ КР580ВВ55А ld (0xff03), a ; Порты A и C - на ввод, порт B - на вывод ld a, 0b11111011 ld (0xff01), a ; Отправляем 0 в строку матрицы с нужными клавишами ld a, (0xff02) ; Встречаем 0 в левой половине клавиатуры cpl and 0b00000011 ld h, a ld a, (0xff00) ; Встречаем 0 в правой половине клавиатуры cpl and 0b00110100 or h ret
1. Скачиваем это прошивку.
2. Распаковываем и переименовываем в spec_m2.rom
3. Скачиваем свежую версию Emu80.
4. Заменяем файл ...\Emu80\spec\spec_m2.rom тем, который распаковали и переименовали. Нужно также убедится, что в конфиге spec.conf правильно указан диапазон ПЗУ (addrSpace.range = &rom, 0xC000, 0xDFFF)
5. Запускаем эмулятор и выставляем там раскладку "Йцукен".
После этого будет полное соответствие нанесённым на клавиатуру символам (ждём свежей версии Emu80, там будет фикс для трёх забытых кнопок), будут заглавные и строчные русские и латинские символы, будут работать стандартные подпрограммы ПЗУ, как я показывал.
Последний раз редактировалось CityAceE; 07.11.2025 в 12:38.
С уважением, Станислав.
Zidane(07.11.2025)
В общем-то да, тут я согласен, ибо каждый раз придумывать новые костыли - занятие сомнительное. Так может эту исправленную прошивку использовать как стандарт де-факто? Едва ли кто-то предложит что-то новое, софт работает, насколько я понял, да и вообще гламур. Просто хотелось бы чтобы такая прошивка шла в комплекте с эмулятором, а то вот такие приколы... Ну не очень интересные.Сообщение от CityAceE;1220016
И всё же я до сих пор не понимаю, что и где не работает в стандартной процедуре ПЗУ? Предлагаю всё-таки сосредоточиться на этом вопросе и решить его:
1. Скачиваем это [URL="https://zx-pk.ru/attachment.php?attachmentid=82930&d=1760027835"
Зверинецъ
Специалист (был когда-то "совсем стандарт") - 1988-2023
Ленинград1 +256К +AY+BDI+VGA выход +Ethernet (Speccyboot) +Xmodem (115200)+divmmc
Ленинград2 + CF карта
Платформа 8085+Z80+CPLD (Специалист МХ2 +SD +FDD +PS/2kbd)
БК0010-01 стоковый[свернуть]
Это прошивка отличается от стандартной всего лишь двумя байтами. Плюс есть возможность полностью вернуть родное поведение, сделав сброс с зажатым НР. Так что да, эта прошивка могла бы стать стандартной. Но тут решать @Pyk.
Это да, вынужденно было сделано для оставления совместимости со всем наследием. Пришлось идти на компромиссы. Однако поведение предсказуемое и возможно легкое перекодирование как внешними кодировщиками, так и встроенным в пользовательскую программу экспортом.
Последний раз редактировалось CityAceE; 07.11.2025 в 16:37.
С уважением, Станислав.
В общем, после нашего здесь обсуждения, пришел к следующему решению: собрать два набора символов: КОИ7Н2 и ту же КОИ7Н2 с буквами в нижнем регистре. Переключения выполнять следующим образом:
- РУС/ЛАТ переключает набор символов латиница/кириллица/псевдографика. Номер символа находится в диапазоне от 0 до 255
- ПВ переключает регистр букв. Если в момент нажатия на клавишу установлен режим вывода псевдографики, включается режим латиницы в верхнем регистре. Но тут возможны обсуждения
- Конкретный режим ввода символов отображается соответствующей буквой курсора L/R/G/l/r тут думаю все понятно.
- Псевдографика расположена вместо цифр и специальных символов во второй таблице символов (с буквами в нижнем регистре). Коды от $20 до $3a включительно обрабатываются как есть, пока включен любой курсор, кроме G. Если G, то принимаются только коды из этого диапазона, а подставляются коды символов псевдографики.
- Длина строки до 48 символов. Пока что. Просто потому что такой подход сильно упрощает обработку и отображение строки.
Как будет готов такой редактор строки, как по мне, можно уже приступать к полноценной разработке редактора.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)