Вход

Просмотр полной версии : Разработка нового ПО для Специалиста



Zidane
17.07.2025, 12:21
В общем-то на данную тему меня навел CityAce. Суть сабжа - новое ПО для Специалиста если и выйдет, то неизвестно как и когда. Отсюда простой и логичный вывод - нужно писать самому. И первоочередное, что требуется, это редакторы BASIC и ассемблера, с вменяемым видеорежимом. С чего начинается редактор? С рабочей области? Неа - с парсера строки. То есть с блока, который разбирает строку на части, анализирует, "ху из ху" и заносит все эти компоненты по нужным адресам. И вот чой-то я понять не могу, и даже представить, как такое на ассемблере написать.
Нет, в общих чертах все ясно - вызвать подпрограмму опроса клавиатуры, считать букву, занести в буфер. И так по цикла, до нажатия Enter. Длина буфера - 128 байт (ну к примеру) Опять же нужен анализатор кода. Может у кого есть готовые наработки или честно позаимствованные чужие идеи, хотя бы для ознакомления, желательно с кодом?
Вообще в первую очередь хочется сделать интерпретатор BASIC, на основе такового от ZX Spectrum - компьютер сразу разживется весьма приличным количеством литературы, хотя к нему и не относящейся, но которую можно использовать. Это раз.
А второе, как-то меня спросили: а есть ли какой простенький компилятор Си под это железо. То есть, интерес у людей есть - нет приемлемых средств разработки. Кстати в другой ветке под моими роликами кто-то заикался про RUST, что ли...
Но все это начинается с парсера строк. Так что идеи и готовые решения приветствуются

Serg6845
17.07.2025, 13:04
С чего начинается редактор? С рабочей области? Неа - с парсера строки. То есть с блока, который разбирает строку на части, анализирует, "ху из ху" и заносит все эти компоненты по нужным адресам. И вот чой-то я понять не могу, и даже представить, как такое на ассемблере написать. Нет, в общих чертах все ясно - вызвать подпрограмму опроса клавиатуры, считать букву, занести в буфер. И так по цикла, до нажатия Enter. Длина буфера - 128 байт (ну к примеру)

для этого в мониторе есть стандартная подпрограмма, 0xc80f


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


очень примитивный парсер есть в том же мониторе, готового кода под рукой нет, Ghidra в зубы и ковырять... там все несложно.
парсер посложнее - например в SDOS, есть исходники
https://zx-pk.ru/threads/29892-sd-karta-i-sdos-dlya-8i-bitnykh-pk.html?p=1205312&viewfull=1#post1205312
смотреть dos_rk.asm, вокруг метки CMDLIST



А второе, как-то меня спросили: а есть ли какой простенький компилятор Си под это железо.

есть
https://github.com/alemorf/c8080

этот я пока не пробовал.

https://github.com/alemorf/retro_computers/tree/master/Specialist/my_extensons/sd_controller

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

Zidane
20.07.2025, 17:00
В общем, к вопросу об ассемблере. Нашел. Жаль только консольный, но и то хорошо. Что имеем: сам ассемблер, который ассемблирует кучу разных ассемблеров. Для каждого свой файл. Для процессоров сесейства Z80 (к которому автор также относит I8080) нужен файл vasmz80_oldstyle.exe - переваривает мнемоники Z80 и I8080. Можно указать набор мнемоник -8080 (набор для I8080, без этого параметра, как я понял - Z80). Чтобы работал с именами мнемоник I8080 - параметр -intel-syntax, а чтобы на выходе давал файл с 16-ричными кодами, добавляем параметр -Fbin
по итогу строка для ассемблирования файла, набранного в Notepad++ в мнемониках I8080 выглядит следующим образом, при условии, что файл ассемблера находится в одной папке с целевым файлом:
vasmz80_oldstyle.exe test.asm -8080 -intel-syntax -Fbin
На выходе получаем файл a.out. Всегда и я не уверен, можно ли изменить параметр. Сильно не вчитывался. У этого самого файла, a.out, меняем расширение на a.obj, и пользуемся утилиткой, которую я взял на этом же форуме. Она добавляет заголовок к файлу и расширение *.rks, после чего файл уже можно использовать в эмуляторе. Мнемоники Z80 не проверял, но должно работать.
Ресурсы:
Страничка ассемблера: http://sun.hasenbraten.de/vasm/
Ссылки для скачивания: http://www.compilers.de/vasm.html
Ассемблер vasm и утилита obj2rks в одном файле: https://disk.yandex.ru/d/kV4yvaSSPURghw

Был бы весьма признателен, если бы кто-то смог упаковать это в одну программу, желательно с GUI. Но даже так, инструмент крайне интересный и заслуживающий пристального внимания. Есть еще такая штука как WLA DX, он, в поледних релизах, тоже умеет I8080, но там нужно настраивать файл с картой памяти, что гемор, а потому изучение этого проекта я забросил, но может кому будет интересно.

Кстати для написания кода в мнемониках I8080 крайне удобно использовать GNUSims8085 - подсветка синтаксиса и прочие ништяки. Жаль отассемблировать файл нельзя, или я не понял как.

fifan
20.07.2025, 19:05
А зачем такие заморочки? Наверное все Си- повёрнутые программисты никак не могут без своих примочек. Давно пишу в программе asm80win от Вячеслава Медноногова, пишу в мнемонике Z80, в том числе и для Специалиста. Текст набираю в обычном редакторе.

CityAceE
20.07.2025, 22:56
SJAsmPlus + Notepad++
У меня есть ролики, где я показываю, как я пишу.

fifan
23.07.2025, 18:58
Посты о "правильности" выбора мнемоники удалил. Тема называется "Разработка нового ПО для Специалиста", а не о "Правильность выбора мнемоники при разработке нового ПО для Специалиста".

Zidane
01.08.2025, 08:00
В общем, пишу программу для вывода символов и строк для будущего редактора. В принципе написал и все работает. То бишь есть сами символы, указание позиции табуляции цвет и инверсия. Но вот вдруг допер - у меня в таблице только кириллица. По мелочи сойдет, но для редактора нужен полный набор символов. То бишь, 256. Полный набор латиницы кириллицы специальные символы и т.п. Вопрос не в этом. Вопрос в том, как удобно выполнять переключение.
Кнопка "Рус/Лат" не пойдет - переключение регистра букв, то есть занята уже. Нужно какую-то кнопку занять, чтобы выполнять переключение. Я настоящего Специалиста в руках никогда не держал и какие там кнопки есть и чем они занят - фиг знает. Есть предположение использофать какую-нибудь из функциональных клавиш. Но сколько их и какими кодами определяются... Вопрос.
В общем-то этом и проблема: какой клавишей или комбинацией удобнее всего будет переключать раскладку клавиатуры. Планируется её работа как флага, в зависимости от состояния которого выполняется сдвиг адреса таблицы символов. И как удобнее выводить индикацию текущего режима. Я вообще склоняюсь к варианту современных ос - небольшой индикатор в панели редактора. Но пока вопрос тоже открыт.

Не в тему: самописная программа, при всей её кривости, работает куда как быстрее и удобнее чем то что есть в ПЗУ "Специалист" (взял набор управляющих кодов из набора ZX Spectrum), так что "Монитор" все равно придется переписывать. Наверное... Потому что 2 кБ на новый знакогенератор в оперативке жаль.

CityAceE
01.08.2025, 08:27
Кнопка "Рус/Лат" не пойдет - переключение регистра букв, то есть занята уже. Нужно какую-то кнопку занять, чтобы выполнять переключение.
У Специалиста изначально есть две кнопки, предназначенные для смены регистра: НР - нижний регистр, и НР фикс. - нижний регистр фиксированный

https://pic.maxiol.com/thumbs2/1754025784.780858384.keyboardclassic.jpg (https://pic.maxiol.com/?v=1754025784.780858384.keyboardclassic.jpg&dp=2)

Чуть позже НР фикс. переименовали в РУС/ЛАТ.

https://pic.maxiol.com/thumbs2/1754026058.780858384..jpg (https://pic.maxiol.com/?v=1754026058.780858384..jpg&dp=2)

Собственно, по моему мнению, тут и вариантов особых нет:

РУС/ЛАТ (НР фикс.) - смена раскладки
НР - аналог SHIFT


Потому что 2 кБ на новый знакогенератор в оперативке жаль.
Ну и, кстати, полный набор символов так же есть в ПЗУ, если, конечно, третью микросхему ставили. Всё описано в Моделисте-Конструкторе №4 за 1989 год.

https://pic.maxiol.com/thumbs2/1754027023.780858384.8.jpg (https://pic.maxiol.com/?v=1754027023.780858384.8.jpg&dp=2)

https://pic.maxiol.com/images2/1754028044.780858384.hello.png

Zidane
01.08.2025, 09:40
Ну и, кстати, полный набор символов так же есть в ПЗУ, если, конечно, третью микросхему ставили. Всё описано в Моделисте-Конструкторе №4 за 1989 год.



Если там стандартный 6*8 то фигня. Собственно весь сыр-бор у меня и начался из-за перехода на шаблоны 8*8. Я уже не раз говорил, что самое большое препятствие на пути популяризации специалист - его Монитор. А цвет и инверсия шли бонусом.

CityAceE
01.08.2025, 11:06
Если там стандартный 6*8 то фигня.
Да, там 6*8. Но на самом деле шрифт с такой матрицей, не тот кривой, что в ПЗУ, а с нормальным начертанием, выглядит очень даже прилично, по мне так лучше, чем 8*8. Да и больше его на экране поместится. А ещё лучше всё будет смотреться на экране, если использоваться не фиксированную матрицу для каждого симвова, а пропорциональную. Но основная его проблема - это скорость вывода на экран. Вот она реально расстраивается. Но, светлые умы давно уже всё оптимизировали и серьёзно повысили скорость относительно ПЗУшной процедуры.

Zidane
01.08.2025, 14:28
CityAceE,спасибо за предложение, меня от такого шрифта аж корежит, уж не знаю почему. Так что этот вариант даже не рассматривается. Хотя это примерно из той же серии, что и спор про мнемоники. Ну и ко всему нужен мне полноценный цвет на байт. Я ведь говорю - хочу сделать для Специалиста максимально схожий со спектрумовским BASIC, чтобы было доступно максимальное количество литературы. А то Специалист вещь в себе даже больше, чем Радио-86РК...Там то хоть видеочип спасает.

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

CityAceE
01.08.2025, 16:25
Я ведь говорю - хочу сделать для Специалиста максимально схожий со спектрумовским BASIC, чтобы было доступно максимальное количество литературы
Это замечательная цель! Пожелаю довести идею до логического завершения. В этом случае действительно лучше пользоваться матрицей 8*8. Ну и раз всё пишется с нуля, то, безусловно, полный набор кириллицы тоже будет очень кстати.


А то Специалист вещь в себе даже больше, чем Радио-86РК...
Вот здесь соглашусь. Вроде бы и в журнале схему опубликовали, и схема максимально простая, и даже потом некоторые заводы начали производить клоны, и пользователей было какое-то количество. Но по итогу нет ни софта приличного, ни пользователей, которые как будто бы все испарились куда-то. А между тем, комп с такими параметрами, как у Специалиста, в своё время (1985 год) был очень даже крутым.

На Специалисте интересно что-то делать, потому что там поле не паханое! Программ, которые раскрывали бы его потенциал, можно сказать, нет. Один только Exolon и есть.

Zidane
02.08.2025, 17:09
В общем попытался разработать тех задание для своего интерпретатора BASIC и понял, что кое-что не сходится. Ну во первых, номера строк не нужны, как пережиток прошлого. Счетчик команд движется по текстовому буферу (команды переводятся в токены), инкрементируясь при нахождении каждого байта 0 - разделителя команд. Второе. Такой подход делает возможным использование меток. Метка - 6 букв с двоеточием и номер строки (2 байта от начала буфера) куда надо перейти. Далее.. Интерактивный режим, на мой взгляд, не нужен - то бишь, набираем текст как в обычном редакторе. И вот здесь вопрос со скроллингом выходит на первый план. В стандартном ПЗУ скроллинг выполняется через копирование байтов в одном столбце, что и вызывает "волнообразный" сдвиг. На мой взгляд лучше копировать по 8 байтов через стек процессора две соседние строки. Тогда копирование "рывком" тоже бужет заметно, но, как мне кажется, восприниматься будет попроще, чем волна.
Далее. Процессор с трудом обновляет экран. То бишь, когда листинг выйдет за пределы одного экрана, то скроллить вверх/вниз станет проблемно. Может не скроллить, а очистить рабочую облать и напечатать нужный текст заново? Затем еще проблема с переменными. Нет, на начальном этапе я представляю что делать: таблицв VARS, к примеру, 6 байтов на переменную, имя, тип, адрес и размер (один байт). Но вот допустим в процессе программы меняется размер переменной и она стала больше - нужно же в памяти это все перекомпоновать. А как? Вопрос...
И, наконец, самое последнее, но оно из самых важных, на мой взгляд. BASIC морально все же устарел... Так может подумать о разработке интерпретатора более популярного языка. Например перенести ограниченный синтаксис Python. Называть новый язык программирования pysic, я не предлагаю, но так как Python намного популярнее любого другого языка программирования возможно имеет смысл сделать осылку именно к нему. Все это пока размышления и проблемы которые я пока не представляю, как решить. Пишу парсер по тихой грусти.

aspgnom
02.08.2025, 17:23
Все это хорошо, но кто этим будет пользоваться. Нормальный Python мы не напишем(по крайней мере мне мозгов не хватит) и все это будет чертовски медленно. По моему скромному мнению
лучше написать что то подобное на транслятор с Python(PC) сразу в код i8080. Вот там можно реализовать ваш pysic. И удобно писать и сразу в машинный код.

CityAceE
03.08.2025, 09:24
Сейчас на платформе Специалист пользователей можно посчитать по пальцам, да и то, подавляющее большинство - это те, кто паяет очередной клон, чтобы два раза запустить его и поставить на полку. На горизонте не видно того, кто что-то пишет. Поэтому какова вероятность, что кто-нибудь, кроме автора, да и то во время отладки проекта, будет программировать на новом языке? На мой взгляд сейчас нужно делать упор на тот софт, который позволит воспользоваться наследием с других платформ. И вот как раз Basic со Спектрума (или MSX, или БК-0010, или любой другой популярной платформы) будет гораздо полезнее любого нового языка. Пользователи, пусть и с некоторыми ограничениями, смогут запускать программы, написанные, на этом языке и воспользоваться литературой, которой в своё время было выпущено множество.

CityAceE
15.08.2025, 08:18
А регистр по нажатию НР. Она теперь как CapsLock
Весьма спорное решение. НР - это аналог Shift. Если хочется CapsLock, то уместнее его посадить на любую "бесполезную" кнопку, например, ПВ.

Zidane
15.08.2025, 08:22
Весьма спорное решение. НР - это аналог Shift. Если хочется CapsLock, то уместнее его посадить на любую "бесполезную" кнопку, например, ПВ.

Так а если она все равно не работает (если исходить из разговора выше) то почему нет? Хотя вообще вопрос одного байта всего лишь...

CityAceE
15.08.2025, 08:43
если она все равно не работает
Кто "она"? НР? Почему не работает? Прекрасно работает. Просто в Мониторе она работает особым образом, но в других программах работает, как мы привыкли. Например, в текстовом редакторе The Last Word (правда, под Монитор SP580), НР фикс - это РУС/ЛАТ, а НР - это Shift.

P.S. Перенесу-ка я эти сообщения в профильную тему.

Zidane
15.08.2025, 09:14
Кто "она"? НР? Почему не работает? Прекрасно работает. Просто в Мониторе она работает особым образом, но в других программах работает, как мы привыкли. Например, в текстовом редакторе The Last Word (правда, под Монитор SP580), НР фикс - это РУС/ЛАТ, а НР - это Shift.

P.S. Перенесу-ка я эти сообщения в профильную тему.

Ну потому что в эмуляторе при нажатии на Shift (при заданной КОИ7Н2) не выводится ничего. Даже позиция курсора не меняется. В целом, как я уже сказал - вопрос всего в одном байте, по которому выполняется установка флага. Собственно вопрос, а Специалист вообще может обработать две одновременно нажатые клавиши? Имеется ввиду с помощью стандартных подпрограмм? Потому что если нет, то вопрос такого шифта отпадает сам собой.

CityAceE
15.08.2025, 11:31
Ну потому что в эмуляторе при нажатии на Shift (при заданной КОИ7Н2) не выводится ничего.
Если включить КОИ8 из журанала, то всё НР в мониторе работает как положено, именно как нижний регистр. По умолчанию печатаются заглавные буквы, а совместно с НР - строчные.


Специалист вообще может обработать две одновременно нажатые клавиши?
Две и более. Да сколько угодно, хоть 10. Тут проблема в том, что не все PC-клавиатуры столько могут за раз обработать и, соответственно, эмулятор не будет воспринимать такие нажатия.

Вот можно убедиться, запустив этот тест клавиатуры Рюмика (https://zx-pk.ru/threads/35304-voprosy-po-arkhitekture-quot-spetsialista-quot.html?p=1186885&viewfull=1#post1186885), который работает из ОЗУ.

Zidane
31.08.2025, 05:34
В общем, победил я парсер команд... Даже двумя способами. Первый, используя пробел в качестве разделителя создаем массив со списком всех команд, которые есть в языке программирования. На и затем последовательно сравниваем первое слово введенной команды с каждым значением из списка. Если буквы не совпали - счетчик списка команд уменьшить на один, и, если команды еще есть, перейти к первому следующему разделителю и сравнить снова. Иначе команды нет. Плюс такого способа очевиден -100% гарантия нахождения нужного значения в массиве, если оно там есть. С другой стороны, имеем балласт в виде этого самого массива и не самый быстрый способ поиска нужного токена. Второй - просто присвиваем каждой букве значение от 1 до 23 (в латинице же 22 буквы?) и просто вычисляем сумму букв в первом слове (если это не число). Так как 6*23 даст 138, то для всех команд более чем хватит. Сразу получаем токен. Плюсы очевидны - нет массива со списком команд, поиск быстрее, да и считать все буквы нет необходимости - главное получить уникальный токен для конкретной команды. И еще есть возможность использовать команды длинной до 11 символов.... Есть где разгуляться. А вот потом я чуток присел. Для BASIC нужен текстовый буфер, место для переменных - благо искать по имени я уже научился, стек GOSUB, место под счетчики циклов, ух... Короче BASIC пока полежит в сторонке - редактор ассемблера будет написать проще, как мне кажется. Текстовый буфер, область трансляции, область для меток... На вскидку все. От этого и буду плясать. А там посмотрим, как пойдет. Сейчас проблема ввод команды сделать - курсор, новый символ, перемещение по строке, удаление символа ну и все в этом духе. При этом в мыслях сделать редактор а-ля Spectrum-BASIC, то есть внизу экран ввода команды, а сверху набранный листинг. Но вообще в перспективе все-таки хочется нормальный редактор с привычным меню - ассемблирование, запуск, просмотр облака меток ну и все в таком духе. Планов масса - хватило бы терпения )

Zidane
28.10.2025, 16:12
Ковыряю дальше.. Оказалось, парсер фигня, да и спеременными придумал как разобраться. Настоящим приключением стало написание редактора строк. Даже не редктора текста, а именно редактора строк ) По образцу ZX Spectrum. Ну да не суть. В процессе разработки пришел к следующему: $01 - удалить символ перед курсором, $03- вставить пробел после курсора, $0D - ввод команды, $08 - курсор влево, $18 - курсор вправо. И все худо-бедно даже заработало, без лишних пробелов в водимой команде после редактирования.
Вылез другой вопрос: при вводе символов подпрограмма $c812 возвращает только коды латиницы в нижнем регистре. И никак с этим ладу дать не могу. Вне зависимости от состояния РУС/ЛАТ и клавиши НР всегда возвращается фиксированный набор кодов... И вот тут встал вопрос - а как? Самый простой вариент - переписать подпрограмму вывода символов с полного нуля, работая с таблицей символов размером в 256 байт. Тогда туда войдет все. А конкретный код определять по состоянию флагов chars и register, состояние которых, собственно, определяет, как обрабатывается символ с кодом большим чем $39. То есть все коды до $39 включительно обрабатываются "как есть", а остальные вычисляются. Возможно в Монитор так и делается, я не вникал. Минусы очевидны - программа набранная в таком знакогенераторе только с его же помощью и будет нормально отображаться, что не есть гут... Может укого какие предложения есть, как опросить клавиатуру на предмет нужного кода в зависимости от состояния РУС/ЛАТ и регистра букв? Хотя сам я скорее всего сделаю так, как написал, но спросить тоже надо, может я чего криво думаю.

CityAceE
28.10.2025, 17:34
Может укого какие предложения есть, как опросить клавиатуру на предмет нужного кода в зависимости от состояния РУС/ЛАТ и регистра букв?
Я как раз делал фикс прошивки (https://zx-pk.ru/threads/36381-dobavlenie-raskladki-qwerty-na-spetsialiste.html). Она учитывает и регистр, и раскладку.

Zidane
28.10.2025, 18:16
Да, еще как раз мысли по поводу переменных. Выделить под них место, ну это понятно. Имя переменной - до 6 символов. А вот тут вопрос, включать ли в имя переменной возможность ввода кириллицы. Так то логически вроде незачем - одна буква в другой раскладке и ищи ошбку )) Далее, разделение переменных на строковые и числовые. Надо. Но вот в качестве выделения строковых переменных в начале ставить символ$, а не в конце имени. Тогда парсер по вервому символу увидит, что за значение перед ним. Далее, самый трудный для меня вопрос - управление переменными. Ну в общем-то понятно, что переменные, в процыессе работы программы, меняют длину значения. То есть выделять фиксированное место под каждую переменную смысла нет - если новая длина будет больше, чем начальное значение, а уже за этой переменной дописана новая, да еще и не одна... Мысль такая: редактируемую переменную скопировать в буфер. Далее, собрать оставшиеся значения (сдвинуть к началу массива) на длину скопированного значения. Затем, после выполнения операций с переменной дописать метку и новое значение в конец массива данных. В качестве разделителя использовать какой-нибудь неиспользуемый код. Особых мысле по этому поводу не было, но например код FF, но можно и 0... В общем нужно подумать. При таком способе хранения данных отпадает необходимость хранить длину переменной - и так можно посчитать, массив будет динамически менять свой размер в процессе работы программы, без конфликта адресов в случае превышения длины исходного значения, да и пустых мест в массиве практически не будет, кроме разделителей. Но это сугубо имхо. Пока еще не писал, но мысль развивается именно в этом направлении.

Zidane
02.11.2025, 16:13
Собственно вопрос. При работе в эмуляторе (специалист) в справке к клавише Shift на PC привязана клавиша НР. Только вот опросить её не получается - подпрограмма $c812 никак не реагирует на нажатие НР (Shift). Как опросить эту кнопку? Ну и вообще конкретную кнопку на клавиатуре?

Pyk
03.11.2025, 00:13
Zidane, прямой опрос портов ВВ55 клавиатуры?

Zidane
03.11.2025, 12:23
Zidane, прямой опрос портов ВВ55 клавиатуры? В общем-то вопрос и был: как? Где почитать? А то платформа как черный ящик практически

CityAceE
03.11.2025, 12:44
Ну и вообще конкретную кнопку на клавиатуре?
Использовать стандартную процедуру загрузчика 0xC337. Она возвращает в регистре A (остальные регистры не портятся) готовый код символа, уже с учётом раскладки (РУС/ЛАТ) и регистра (НР).


В общем-то вопрос и был: как? Где почитать? А то платформа как черный ящик практически
На мой взгляд, это избыточно. Ну а так, вот (https://zx-pk.ru/entries/293.html), например, для начала.

Zidane
03.11.2025, 14:31
Использовать стандартную процедуру загрузчика 0xC337. Она возвращает в регистре A (остальные регистры не портятся) готовый код символа, уже с учётом раскладки (РУС/ЛАТ) и регистра (НР).

Я уже где-то писал, что в эмуляторе Специалиста эта фишка не работает. Просто услышал в ответ - "сам дурак", ну и забросил. По крайней мере ни в одной версии эмуляторов Emu80 которую я скачивал, это не работает. Нажатие на Shift звук издает, а вот кода никакого не возвращает. То бишь последовательность вызовов $C337 ($C812) и затем $C815 не делает ничего. Просто ждет очередного нажатия на клавишу. Поэтому и пришлось разбираться с железом.

А вот за ссыль спасибо.

CityAceE
03.11.2025, 17:47
Я уже где-то писал, что в эмуляторе Специалиста эта фишка не работает.
В эмуляторе всё работает на 99%, как на реальном Специалисте. И уж точно подпрограмма 0xC337 точно работает именно так, как она работает на реале.
Клавиша Shift не передаёт никакого кода. У неё в принципе нет никакого кода по текущей парадигме Загрузчика Специалиста, который и обслуживает, клавиатуру.

Для чего вообще отдельно отслеживать Shift? Вызываем 0xC337. Если была нажата клавиша <1>, то подпрограмма вернёт код "1". Если мы нажимаем <SHIFT> + <1>, то подпрограмма вернёт код "!".
На алфавитные клавиши дополнительно влияет и раскладка РУС/ЛАТ.

То есть нет необходимости как-то отдельно отслеживать РУС/ЛАТ и SHIFT.

Pyk
05.11.2025, 00:48
В общем-то вопрос и был: как? Где почитать?
Хотя бы здесь (https://emu80.org/docs/spec_techinfo):

Zidane
05.11.2025, 04:53
То есть нет необходимости как-то отдельно отслеживать РУС/ЛАТ и SHIFT.
Мне вот даже сказать нечего... Коды до $39 включительно опрашиваются, а дальше - вот так: https://disk.yandex.ru/i/KTTVaEpOGaQOXA. Я уж на ютуб заливать не стал, десяток секунд всего, но более чем очевидно все. В приведенном примере как раз последовательный вызов $c337 и $c815.

Поэтому вопрос более чем актуален, я еще где-то год или два назад написал, что клавиатура по нажатию на НР впадает в ступор. То есть, реально работает РУС/ЛАТ, а НР только для узкого диапазона символов. А вот в режиме Радио-86РК все ок.

P.S. Кстати, а на сайт РосКомпозор обиделся? Без ВПН теперь не зайти мне.

CityAceE
05.11.2025, 08:08
В приведенном примере как раз последовательный вызов $c337 и $c815.

А вот как у меня отрабатывает данная программа:



call 0xc010

m1:
call 0xc337
call 0xc815
jp m1




https://rutube.ru/video/c463e24b855185e7afcfc2775851826b/

Zidane
05.11.2025, 08:12
Ну, все может быть. Но конкретно у меня эмулятор никогда такие нажатия не обрабатывал. Ни на одной платформе, то есть под Linux та же проблема. Поэтому то вопрос и возник.

Pyk
05.11.2025, 09:37
Хотя бы здесь:

Zidane, оказывается, у меня там немного недостоверная информация была относительно одного из методов опроса клавиатуры. Исправил, должно быть сейчас все ок.

- - - Добавлено - - -


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

Zidane
05.11.2025, 09:52
Очень странно это, не должно быть такого. Пришли тестовую программу и точную последовательность действий для воспроизведения - посмотрю.

Та не, тут не в программе дело. Он в принципе не обрабатывает нажатие. То есть даже при работе в Монитор, при попытке нажать любую буквенную клавишу с зажатым Shift, эмулятор пищит, а на экран ничего не выводит. Перепробовал все кодировки/раскладки. Ну и как-то так вот все.

Кстати сейчас проверил: В режиме Специалист(Монитор-1) все работает как надо. Во всех остальных - нет. В SP-580 на вывод нет ничего, но курсор двигается. В МХ НР работает.

CityAceE
05.11.2025, 11:18
Перепробовал все кодировки/раскладки. Ну и как-то так вот все.
Какая вообще задача стоит? Что необходимо от обработчика клавиатуры? Разберёмся! Может быть просто изначально подход неверный?

Zidane
05.11.2025, 11:31
Какая вообще задача стоит? Что необходимо от обработчика клавиатуры? Разберёмся! Может быть просто изначально подход неверный?

Задача стоит сделать обработчик нажатий клавиш нормальный. То бишь рус/лат + обработка нажатия НР. И, как сейчас выяснил, при работе в Монитор-1 все нормально. А вот в остальных, как уже писал, доступен только РУС/ЛАТ, а при нажатии комбинации НР+буква система меня игнорит. То есть звук есть, а действия нет. Ну вообще хоть где-то работает. Вроде же Монитор-2 обратно совместим с Монитор-1, так что только адреса вызовов поменять.

Pyk
05.11.2025, 11:32
при попытке нажать любую буквенную клавишу с зажатым Shift, эмулятор пищит, а на экран ничего не выводит
Это и в других эмуляторах так. Я всегда думал, что это нормальное поведение, и на реале должно быть так же.
Надеюсь, владельцы Специалиста прокомментируют.

Serg6845
05.11.2025, 11:40
А вот как у меня отрабатывает данная программа:


это с какой прошивкой ПЗУ?
что-то мне вспоминается что с журнальной оно и на реале с нажатым НР не работает. вечером посмотрю.

- - - Добавлено - - -


Задача стоит сделать обработчик нажатий клавиш нормальный. То бишь рус/лат + обработка нажатия НР. И, как сейчас выяснил, при работе в Монитор-1 все нормально.

вот это странно. С337 к монитору никаким боком не относится (а еще в мониторе-1 нет C815 - он вообще в других адресах живет). хотя если с ним грузится другой образ загрузчика - все может быть.

Zidane
05.11.2025, 11:45
вот это странно. С337 к монитору никаким боком не относится (а еще в мониторе-1 нет C815 - он вообще в других адресах живет). хотя если с ним грузится другой образ загрузчика - все может быть.
Та я не про это, а про то, что в Монитор-1 Shift(НР)+ буква обрабатывается нормально. То есть регистр букв меняется. А про то что в Монитор-1 нет многих вызовов Монитор-2, так то я в курсе. Проблема то у меня и возникла потому, что я хотел опрашивать состояние клавиши НР, а только не знал как это сделать. Потому что в Монитор-2 нажатие на НР не приводит к смене регистра букв. Меня это-то и удивило.

К слову о совместимости Мониторов... Логичнее, мне кажется, писать свою программу с максимальным количеством процедур, без оглядки на ПЗУ компьютера. Ну кроме, разве что, загрузить/сохранить. Тогда ведь получится универсальная программа, ведь аппаратная часть не менялась? Или я не прав?

Serg6845
05.11.2025, 12:48
Та я не про это, а про то, что в Монитор-1 Shift(НР)+ буква обрабатывается нормально.


не монитор. загрузчик. то что лежит по адресам C000-C7FF. там собственно опрос клавиатуры и живет. а монитор - по сути прикладная программа, можно запустить монитор-1 с загрузчиком где регистр не работает - и он точно так же работать не будет.



К слову о совместимости Мониторов... Логичнее, мне кажется, писать свою программу с максимальным количеством процедур, без оглядки на ПЗУ компьютера. Ну кроме, разве что, загрузить/сохранить. Тогда ведь получится универсальная программа, ведь аппаратная часть не менялась? Или я не прав?

если не считать SP-580 - можно сказать не менялась. главное - использовать авторские адреса системного ВВ55 (FF00-FF03) - тогда будет работать всегда и везде.

CityAceE
05.11.2025, 16:50
Задача стоит сделать обработчик нажатий клавиш нормальный.
Это нечёткая формулировка. Что из себя должен представлять этот "обработчик"? Каков его функционал? Что на входе, что на выходе?

Zidane
06.11.2025, 03:36
Это нечёткая формулировка. Что из себя должен представлять этот "обработчик"? Каков его функционал? Что на входе, что на выходе?

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

CityAceE
06.11.2025, 08:55
Ну почему же? Очень даже четкая, причем озвучивалась мною не раз.
Я почему переспрашиваю? Потому что в моём представлении именно стандартная подпрограмма 0xC337 и является тем самым обработчиком.
Например, вот этот короткий код, используя лишь стандартные средства Загрузчика выводит на экран всё то, что вводится с клавиатуры, уже с учётом РУС/ЛАТ и НР:


m1:
call 0xc337 ; Ввод символа с клавиатуры
or a
jp z, m1
ld c, a
call 0xc037 ; Вывод символа на экран
jp

У меня этот код работает под эмулятором, и на моих Специалистах.
Если где-то что-то не работает, то стоит посмотреть на то, что зашито/прописано в ПЗУ. Стандартном де-факто является Загрузчик Зверкова (М-К №4'89) и Монитор Орлова (М-К №9'88). Именно эти версии идут в комплекте с текущей версией Emu80. И ещё раз акцентирую внимание на то, что главной частью ПЗУ является Загрузчик (0xC000-0xC7FF). Он сдержит в себе всю поддержку стандартной периферии Специалиста (экран, клавиатуру, магнитофон, динамик), а также знакогенератор. Специалист вполне работоспособен только с одной этой микросхемой ПЗУ, просто он сразу ждёт загрузку какой-либо программы с магнитофона.


Но это как бы хотелка, на самом деле я прекрасно понимаю, что никто этим особо заморачиваться не будет (писать подпрограммы).
К сожалению, это объективная реальность. Те немногочисленные люди, которым хоть как-то интересен Специалист в большинстве своём просто разводят, собирают, паяют очередные клоны, чтобы в сотый раз запустить ЗОО и положить компьютер на полку. Новые программы никто не пишет, да и не нужны они никому. А между тем, текущие возможности Специалиста совершенно не исчерпаны. ivagor своим портом Exolon'а наглядно продемонстрировал на что способен стандартный Специалист. К сожалению, это был единичный пример.

Serg6845
06.11.2025, 09:44
Например, вот этот короткий код, используя лишь стандартные средства Загрузчика выводит на экран всё то, что вводится с клавиатуры, уже с учётом РУС/ЛАТ и НР:


m1:
call 0xc337 ; Ввод символа с клавиатуры
or a
jp z, m1
ld c, a
call 0xc037 ; Вывод символа на экран
jp

У меня этот код работает под эмулятором, и на моих Специалистах.

а я повторю вопрос - с какой прошивкой ПЗУ (и в каком режиме)? потому что у меня НР не работает ни под эмулем ни на реале.


Если где-то что-то не работает, то стоит посмотреть на то, что зашито/прописано в ПЗУ. Стандартном де-факто является Загрузчик Зверкова (М-К №4'89) и Монитор Орлова (М-К №9'88). Именно эти версии идут в комплекте с текущей версией Emu80.


и именно с ними НР как раз и не работает. по крайней мере в режиме КОИ-7 (а расширения до КОИ-8 например в комплекте Emu80 нету). а вот в самом первом загрузчике (МК №5`87) - НР работает. да, без расширенного знакогенератора оно будет выдавать мусор - но сам факт.

кстати этот загрузчик на сайте Fifan'а и в комплекте Emu80 - битый как минимум по адресам 0xC4A4-0xC4A6, там должно быть 0x09 0x1B 0x20.

CityAceE
06.11.2025, 10:05
а я повторю вопрос - с какой прошивкой ПЗУ (и в каком режиме)?
Вот с этой (https://zx-pk.ru/threads/36381-dobavlenie-raskladki-qwerty-na-spetsialiste.html). Но эта прошивка базируется на Загрузчике Зверкова и Мониторе Орлова.

Pyk
06.11.2025, 13:38
расширения до КОИ-8 например в комплекте Emu80 нету
В последнем релизе нет, но в текущей git-версии есть. Но НР не работает. Как заставить работать этот загрузчик с расширенным знакогенератором - не разбирался.


этот загрузчик на сайте Fifan'а и в комплекте Emu80 - битый как минимум по адресам 0xC4A4-0xC4A6, там должно быть 0x09 0x1B 0x20
Совершенно не помню, где я его взял, тем более, что это было лет 25 назад, но вопрос интересный, откуда взялась эта модификация? Может быть, в журнале публиковалось какое-то исправление, и это исправленный (или, наоборот, неисправленный) вариант? Где можно найти вариант с байтами 0x09 0x1B 0x20?

Serg6845
06.11.2025, 16:38
В последнем релизе нет, но в текущей git-версии есть. Но НР не работает. Как заставить работать этот загрузчик с расширенным знакогенератором - не разбирался.

включить КОИ-8 (GD080, см. МК №4-89 стр 21) - должно заработать.


Где можно найти вариант с байтами 0x09 0x1B 0x20?


это уже походу моя самодеятельность. изначально кнопок TAB и АР2 на схеме не было, и в ПЗУ было 20 20 20. т.е. все три кнопки выдавали пробел. но вот откуда взялось 20 09 03 - вот этого я не знаю. причем я у себя нашел штук 5 копий этой ПЗУ из разных источников - и везде в этом месте 20 09 03.
с другой стороны если прописать 09 1b 20 - то в Emu80 (и на реале с допаянными кнопками ТАБ и АР2) эти кнопки будут работать правильно.
да, уже больше 30 лет прошло, подробности забылись...

CityAceE
06.11.2025, 16:49
Слава богу, что даже сегодня можно получить 100%-ный код стандартного ПЗУ - дампы были опубликованы в журналах! Достаточно свериться с ними.

Serg6845
06.11.2025, 17:13
Слава богу, что даже сегодня можно получить 100%-ный код стандартного ПЗУ - дампы были опубликованы в журналах! Достаточно свериться с ними.

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

Pyk
06.11.2025, 22:51
включить КОИ-8 (GD080, см. МК №4-89 стр 21) - должно заработать
Да, работает.

у себя нашел штук 5 копий этой ПЗУ из разных источников - и везде в этом месте 20 09 03
Даже если непонятен источник, возможно, действительно стоит в эмуляторе заменить для гарантированной поддержки дополнительных кнопок и обеспечения работоспособности программ, их использовавших.

Zidane
07.11.2025, 05:43
Поковырялся в ПЗУ. Процедуры опроса действительно несколько отличаются. Конкретно в "Монитор-2" насколько удалось понять, после проверки клавиши НР происходит вывод звука а потом... опять опрос... То есть вроде как бесконечный цикл с условием проверки нажатия клавиши НР. Но это не точно, только на первый взгляд.

Теперь по самой теме опроса клавиатуры. Как я понял, сначала нужно загрузить в регистр управления значение $82. Опрашиваем столбец через LDA $ff01. Значение нужно где-то сохранить. Затем, загружаем в регистр управления значение $91, и опрашиваем сначала $ff00 и если оно равно $ff, то загрузить из $ff02 и уже там проверить вторую половину байта. И вот теперь, на основании значений номера строки и столбца, вычисляем значение клавиши. Я правильно понял?

CityAceE
07.11.2025, 12:06
Теперь по самой теме опроса клавиатуры.
По моему глубокому убеждению, прямое программирование портов это очень плохой подход. Например, при прямом программировании перестанет работать моя раскладка 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. Скачиваем это прошивку (https://zx-pk.ru/attachment.php?attachmentid=82930&d=1760027835).
2. Распаковываем и переименовываем в spec_m2.rom
3. Скачиваем свежую версию Emu80 (https://emu80.org/distr/).
4. Заменяем файл ...\Emu80\spec\spec_m2.rom тем, который распаковали и переименовали. Нужно также убедится, что в конфиге spec.conf правильно указан диапазон ПЗУ (addrSpace.range = &rom, 0xC000, 0xDFFF)
5. Запускаем эмулятор и выставляем там раскладку "Йцукен".
После этого будет полное соответствие нанесённым на клавиатуру символам (ждём свежей версии Emu80, там будет фикс для трёх забытых кнопок), будут заглавные и строчные русские и латинские символы, будут работать стандартные подпрограммы ПЗУ, как я показывал.

Zidane
07.11.2025, 12:12
spec_m2_qwerty.rom[/B]
3. Скачиваем свежую версию Emu80 (https://emu80.org/distr/).
4. Заменяем файл ...\Emu80\spec\spec_m2.rom тем, который распаковали и переименовали. Нужно также убедится, что в конфиге spec.conf правильно указан диапазон ПЗУ (addrSpace.range = &rom, 0xC000, 0xDFFF)
5. Запускаем эмулятор и выставляем там раскладку "Йцукен".
После этого будет полное соответствие нанесённым на клавиатуру символам (ждём свежей версии Emu80, там будет фикс для трёх забытых кнопок), будут заглавные и строчные русские и латинские символы, будут работать стандартные подпрограммы ПЗУ, как я показывал.

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

Serg6845
07.11.2025, 15:01
В общем-то да, тут я согласен, ибо каждый раз придумывать новые костыли - занятие сомнительное. Так может эту исправленную прошивку использовать как стандарт де-факто? Едва ли кто-то предложит что-то новое, софт работает, насколько я понял, да и вообще гламур. Просто хотелось бы чтобы такая прошивка шла в комплекте с эмулятором, а то вот такие приколы... Ну не очень интересные.

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

CityAceE
07.11.2025, 16:34
Так может эту исправленную прошивку использовать как стандарт де-факто?
Это прошивка отличается от стандартной всего лишь двумя байтами. Плюс есть возможность полностью вернуть родное поведение, сделав сброс с зажатым НР. Так что да, эта прошивка могла бы стать стандартной. Но тут решать Pyk.


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

Pyk
07.11.2025, 20:48
эта прошивка могла бы стать стандартной. Но тут решать @Pyk.
Склоняюсь все-таки к отдельной конфигурации или к отдельной настройке для основной конфигурации. Подумаю, ближе к релизу...

Zidane
08.11.2025, 16:13
В общем, после нашего здесь обсуждения, пришел к следующему решению: собрать два набора символов: КОИ7Н2 и ту же КОИ7Н2 с буквами в нижнем регистре. Переключения выполнять следующим образом:
- РУС/ЛАТ переключает набор символов латиница/кириллица/псевдографика. Номер символа находится в диапазоне от 0 до 255
- ПВ переключает регистр букв. Если в момент нажатия на клавишу установлен режим вывода псевдографики, включается режим латиницы в верхнем регистре. Но тут возможны обсуждения
- Конкретный режим ввода символов отображается соответствующей буквой курсора L/R/G/l/r тут думаю все понятно.
- Псевдографика расположена вместо цифр и специальных символов во второй таблице символов (с буквами в нижнем регистре). Коды от $20 до $3a включительно обрабатываются как есть, пока включен любой курсор, кроме G. Если G, то принимаются только коды из этого диапазона, а подставляются коды символов псевдографики.
- Длина строки до 48 символов. Пока что. Просто потому что такой подход сильно упрощает обработку и отображение строки.

Как будет готов такой редактор строки, как по мне, можно уже приступать к полноценной разработке редактора.