MK61S, программное обеспечение

Ветка форума для обсуждения программного обеспечения МК61S.
Firmware

Официальный git-репозиторий проекта на Гитлабе.

Другие тематические ветки форума:

Новости от 10.10.2020
Результаты нашей работы с уважаемым Digitalinvitro над MK61S за отчетный период:

  • Завершено мигрирование на STM32 Black Pill: ARM Cortex-M4, Частота: 100МГц, ОЗУ: 128К, флеш-память: 512К
  • Проект переведен на C++, в С оставлено только ядро MK61Emu
  • Добавлен виртульный COM-порт, подключение через USB-C
  • Работа с Serial-терминалом в режиме эха
  • Тест "Короткие билеты": 3.9 сек или 10.2х от оригинала
Forums: 

Завел отдельный одноименный форум для проекта, темы переместил сюда.

Отлично! Я как раз хотел попросить :)

Как успехи в деле калькуляторостроения?
Подумалось (невесело), что лет через 10 потенциальные пользователи начнут потихоньку вымирать. Сайту уже 13 лет, так что время идет быстро.

Да, как-то вот остро так тюкнуло, что угу, последние могикане из мира ПМК...
Вот буквально несколько дней назад друзья помогли с разводкой печатной платы. Назовем ее "pre BETA" :)
Я собираюсь заказать изготовление минимальной партии 5 штук, для пробы. Пайка некоторых компонентов нетривиальна в домашних условиях, но возможна.
плата 1
плата 2
плата 3

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

Сделал первый релиз прошивки МК61S на Гитлабе.

Сабж :)

Релиз 0.6.9 выставляет линию CPU_OFF_Pin с небольшой задержкой после включения, для отладки управления питанием.

Теперь надо ждать первой спаянной платы :)

Я тут немного запутался с кодированием нажатий кнопок клавиатуры на вход эмулятора (key_x, key_y):

void MK61Emu_DoKeyPress(const int key1, const int key2) {
    m_IK1302.key_x = key1;
    m_IK1302.key_y = key2;
    MK61Emu_DoStep();
}

Где-нибудь есть табличка подсмотреть? Откуда, например, для кнопки F берутся 11 и 9?

MK61Emu_DoKeyPress(11, 9);          // F

Координата X равна 11, так как клавиша F подключена к разрядному сигналу Д11. Почему же выходная шина К3 кодируется девяткой, лучше ответят авторы эмулятора. Моё предположение, что К1 и К2 кодируются 8 и 1, а К3 это их логическая сумма. Возможно, это сигнал внешнего входа H со стр. 110. Ещё интересна таблица 4.2 на стр. 130. С учётом двух рисунков её легко доработать до того, что нужно.

Если что, стр. 69, 76, 110 и 130 тут:
http://www.emulator3000.org/Books/PMKUIP/PMKUIP.djvu

Спасибо за инфо, про Д11 я так и подумал, глядя на схему.
В коде MK61S у нас есть констатный массив ascii_to_key, в котором ASCII символ с терминала преобразуется в клавиатурную пару. Если приглядеться к массиву, то видно, что считано может быть либо 8, либо 9, либо 0. Уважаемый digitalinvitro предположил следующее:

этот номер соответствует номеру К, только с учетом линий порта, на которые была подключена клавиатура, а именно:

8 - 1.00.0
9 - 1.00.1
0 - 0.00.0

Разряды 3 и 0 дают нам 10, 11, 00

Таблица 4.2 со страницы 130 интересная, надо ее обмозговать

Схема подключения клавиатуры на Рис. 2.19, стр. 70. В верхнем левом углу три линии. Скорее всего они соответствуют К1, К2 и К3 с предыдущей страницы, где матрица клавиатуры (Рис. 2.18). Через диоды VD1, VD2 эти три линии «упаковываются» в два бита К1, К2 на входе DD1. Видимо это и есть ваши «разряды 3 и 0». Ещё туда, правда, зачем-то замешивают Д13 с выхода той же микроЭВМ — диоды VD3, VD4 часть той же схемы.

В-общем, здесь я бы и стал искать секрет key2, он же key_y. Описание на стр. 69-71 есть, но весьма скупое. И на стр. 110, повторюсь, «сигнал внешнего входа H» похож на «разряды 3 и 0» — только уже со стороны микрокода. А экспериментальным путём получается установить, кто прав? Там всего-то три значения надо подобрать, из 0, 1, 8 и 9.

Да, истина где-то рядом. В принципе, досконально знать почему так не обязательно, главное, что сейчас эмулятор работает (надеюсь) со всеми нужными клавишами МК61. Я добавлю enum с названиями кнопок ПМК, который будет возвращать индекс в констатном массиве key_x и key_y для упрощения написания кода клавиатуры.

Насколько я помню, я добавлял этот массив для работы с эмулятором на компьютерной клавиатуре. В "железном" устройстве он не нужен.

поддержка железной клавиатуры и протокол обмена с РС, а пока это единственный способ коммуникации с МК61 - посылка ASCII кодов через usb-uart терминал.

Кстати, сейчас при включении происходит ожидание СОМ-порта, без этого МК61s не инициализируется. Это тоже надо будет убрать

В Гитлабе новый релиз прошивки, версия 0.6.13:

- Светодиод мигает один раз после старта.
- Клавиша SW11 "ВЫХОД" выключает питание.

Поставил плату на стойках на оргстекло, для защиты:
MK61S плата
МК61S плата, вид сзади

MK61S, прошивка 0.6.14:

Кнопка SW17 "ЭКР" включает/выключает подсветку дисплея
Удержание кнопки SW17 перед включением питания запускает HW тест кнопок столбца KBD_9: SW6, SW28, SW29, SW30

«ЭКР» уже использовано в МК-161 для отображения экрана автоматической работы. Для подсветки можно использовать символ ☀️ (солнца), как на клавиатуре МК-161.

Есть кнопки курсора и P, вот наклейка.

Но если надо, поменять название клавиш не вопрос - уважаемый Арбинада как раз сейчас рисует цветную наклейку.

Да, предлагаю поменять название клавиши подсветки в сторону совместимости, чтобы не создавать проблем для новичков. Изменение знакогенератора, вроде, не потребуется.

То есть ЭКР меняем на "солнышко"?

Да, если у Сергея нет возражений.

Кстати, наиболее адекватный символ в Юникоде (High Brightness Symbol): 🔆. Ещё на выбор: ☼, ☀, ☀︎, 🔅

Мне этот символ ☼ нравится как-то больше других.

Еще подумалось, что выключение надо повесить поверх кнопки ВЫХ, через нажатие F. Тогда будет, как в классических калькуляторах HP

А как происходит включение МК61S, есть отдельная кнопка? Всё-таки ВЫХ это выход в главное меню. На ЭКВМ он не зависит от состояния калькулятора, который всего лишь один из пунктов меню. Вышел с нажатой F или К — вернулся в калькулятор, она всё ещё нажата.

Кстати, ☼ — хороший выбор. Это символ WHITE SUN WITH RAYS из Юникода 1.1. Он монохромный, не навязывает цвета, укладывается в 16 бит (263c) и достаточно старый (1993 год), чтобы широко поддерживаться.

Включение происходит отдельной кнопкой, которая не является частью клавиатурной матрицы калькулятора (кнопка запускает электронный выключатель батареи и MCU сразу же после загрузки должен подтянуть CPU_ON пин в высокий уровень, как бы перехватывая кнпку выключателя.

Выключение же программное - MCU сбрасывает CPU_ON пин и схема обесточивается. Поэтому выключение можно назначить, например, поверх кнопки ВЫХ, и выключение будет как F ВЫКЛ, на манер DM42:
Off

А что произойдёт, если нажать кнопку включения включённого МК61S? Можно ли это отследить программно?

1) Ничего не произойдет
2) Нельзя отследить

Ход мыслей понятен, но это требует другого дизайна на уровне железа

Требуется помощь зала - как прикрутить к эмулятору Р-ГРД-Г?

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

На JavaScript переключатель работает, только что проверил.

Да, в онлайн-эмуляторе работает, но как-то сложно продраться через русскоязычный JS:

const микросхемы = [ИР2_1, ИР2_2, ИК1302, ИК1303, ИК1306];
			Мера_угла = parseInt(состояние[0], 16);
			if (!Картинка) Элемент_по_названию(Мера_угла == 10 ? "Радианы" : Мера_угла == 11 ? "Градусы" : "Грады").checked = true;
			else Элемент_по_названию("Р_ГРД_Г").style.left = (Мера_угла == 10 ? "181px" : Мера_угла == 11 ? "198px" : "190px");
			for (сч_1 = 0; сч_1 < 2; сч_1++) {
				const отступ = 256 * сч_1;
				for (сч_2 = 0; сч_2 < 252; сч_2++)
					микросхемы[сч_1].M[сч_2] = parseInt(состояние[сч_2 + 1 + отступ], 16);
				микросхемы[сч_1].вход = parseInt(состояние[253 + отступ], 16);
				микросхемы[сч_1].выход = parseInt(состояние[254 + отступ], 16);
				микросхемы[сч_1].такт = parseInt(состояние.substr(255 + отступ, 2), 16);
			}
...

Этот код больше похож на отображение градусной меры через элементы графического интерфейса пользователя (GUI), беря её из элемента массива состояние[0].

Судя по книге Трохименко, переключатель Р-ГРД-Г подключён ко входу ПФ арифметического сопроцессора ИК1303.

Если совсем точно, «на контакты Р, ГРД и Г … подаются соответственно разрядные сигналы Д10, Д12 и Д11.» Этот разрядный сигнал «подаётся на вход ПФ микроЭВМ D2, содержащей в ПЗУ программное обеспечение для вычисления тригонометрических и обратных тригонометрических функций.»

Как этот вход ПФ реализован в эмуляторе, можно посмотреть на код ИК1303 или на элементы GUI. Возможно, они те же самые, что используются для отображения градусной меры: "Р_ГРД_Г", а также "Радианы", "Градусы" : "Грады". Третий вариант — найти, чему соответствует состояние[0] в МК61S.

Интерфейс отображает и изменяет переменную Мера_угла, у которой всего три значения: 10, 11 или 12. После чего эта переменная передаётся эмулятору вот так:

		function Шаг() {
			ИК1303.клав_y = 1;
			ИК1303.клав_x = Мера_угла;
			for (let i = 0; i < 560; i++) {
				for (let j = 0; j < 42; j++) Такт();
				if (ИК1302.обновить_индикатор) {
					for (let j = 0; j < 9; j++) Индикатор[j] = ИК1302.R[(8 - j) * 3];
					for (let j = 0; j < 3; j++) Индикатор[j + 9] = ИК1302.R[(11 - j) * 3];
					for (let j = 0; j < 9; j++) Запятые[j] = ИК1302.запятые[9 - j];
					for (let j = 0; j < 3; j++) Запятые[j + 9] = ИК1302.запятые[12 - j];
					ИК1302.обновить_индикатор = false;
				}
			}
			let обновить = false;
			for (let сч = 0; сч < 12; сч++) {
				if (Старый_индикатор[сч] != Индикатор[сч]) обновить = true;
				Старый_индикатор[сч] = Индикатор[сч];
			}
			if (обновить) {
				if (!Картинка) Отобразить_индикатор(); else Отобразить_индикатор_Картинка();
			}
			ИК1302.клав_x = 0;
			ИК1302.клав_y = 0;
			if (ИР2_1.такт == 84) Заполнить_поля(1);
		}

Надо найти похожий участок в эмуляторе МК61S, и проблема с клавишей Р-ГРД-Г и отображением градусной меры решена.

Похоже, что аналогом Мера_угла у вас служит m_emu.m_angle_unit. Её и отображайте, а клавиша Р-ГРД-Г пусть её меняет.

Если переменная не влияет на аргумент тригонометрических функций (не нашёл, где её считывают), значит ваш эмулятор сейчас сырой и знает только радианы. Тогда обращение к ИК1303 (а то и сам эмулятор ИК1303) надо допиливать, образец выше. Микрокод же общий и знает все три градусные меры. Вопрос лишь в том, чтобы правильно передать микрокоду положение Р-ГРД-Г. Как мы видим на примере JavaScript, делается это через два клавиатурных входа ИК1303.

Я вчера тоже докопался (глядя в онлайн-эмулятор и в консольный эмулятор Сергея), что передача значений угла идет только в одном месте - функция DoStep():

...
IK1303.key_y = 1;
IK1303.key_x = m_angle_unit;

Повторение такого же в МК61S результатов не дало - по-прежнему Радианы. Эмулятор тут сильно модернизирован, видимо, что-то где-то в 1303 не передается, как надо.

Но так как команда "COS 45" возвращает правильное значение для Радиан, надо полагать, 1303 работает, ибо в ней тригонометрия.

Как реализовано мигание экрана, когда программа выполняется? Я свой эмулятор делал на основе JS, там мигания вообще толком нет, нет и очистки экрана, когда команда выполняется. Я сделал и очистку экрана, и вот наконец-то доделал мигания индикатора когда программа выполняется. Хотя морда у моего эмулятора очень так себе, надо переделать, набросал контролов в ручную и все дела!

Никак не реализовано. Экран в MK61S не мигает при выполнении. Не до того - базовый функционал не работает (переключение углов не работает)

Прошивка 1.0.0 - функционал оригинальной МК61 достигнут:
FW 1.0.0

Прошивка версии 1.0.1 - выходим за пределы функционала МК61:
1. Поддержка новой раскладки клавиатуры:
Keypad 0.7
2. Три регистра стека (X,Y,Z) на экране:
X,Y,Z registers

Можно отображать все 4 регистра стека (X, Y, Z и T), а градусную меру, батарейку и префикс — в столбце, справа или слева.

мне кажется, перегруз будет, визуальный. Статус-строку хочется оставить именно строкой, с перспективой отображения времени и режима работы (АВТ,ПРГ,RUN).

А три регистра стека это уже больше HP42S и сильно больше МК61

Четыре регистра это полное отображение стека. Высота, уже взятая ЭКВМ в 2007 году.

С перспективой всё норм. Градусная мера, батарейка, префикс и режим работы — всё укладывается в четыре строки статусного столбца. Просто надо чуть-чуть посидеть над дизайном.

У меня сейчас в приоритетах сделать динамическую индикацию "работа по программе" и автосохранение состояния при выключении с автозагрузкой, улучшалки экрана на задний план.

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

Здесь два варианта дизайна — либо столбец статуса слева, до разных «X:». Либо он справа, после порядка. Можно отделить его от стека вертикальной чертой, их тоже ассортимент.

Сам я могу поговорить на эту тему, но не более того. Мои мысли заняты МК-261, где тоже может помочь хороший дизайн. До конца сентября мне придётся опубликовать несколько важных решений, влияющих на архитектуру.

Да и всё равно я бы МК61S по другому делал. Например, перенос P в дальний угол от F и К мне режет глаз. В отечественных, да и всех известных мне ПМК клавиши префикса сгруппированы в колонку или ряд. Если делать в соответствии с моим вкусом, никому не придётся объяснять, что такое клавиша Р, так как её назначение будет легко читаться по её местоположению.

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

Вот варианты статус строки "текущего состояния дизайна":

PKF RAD AВT ЗA01 64%

Радианы, Автоматическая работа, запись состояния в слот 01

PKF ГРД ПРГ ЧТ17 64%

Грады, Программирование, Чтение состояния из слота 17

PKF RAD RUN ЧТ01 64%
PKF RAD RuN ЧТ01 64%

Радианы, работа программы (динамическое мигание u U u U), Чтение состояния из слота 01

Чтение и Запись в слот пока не уверен как лучше сделать

красно/зелёный по индикации состояния батареи и с возможностью посмотреть на индикаторе
и какие то светодиоды на корпус дополнительно к индикатору.

P.S. Или так по включению показывать уровень батареии, а при критическом уровне индикатировать это пользвателю.
Пищалка помогла быть может и в этом. :)

Кстати, по Форт образовался такой топик "флеймового" обсуждения на стороннем ресурсе :)
"Язык Forth - зачем нужен, что можно делать на нём?": https://gamedev.ru/flame/forum/?id=263400

Увы, железо уже фиксированно, новую плату делать в таком форм-факторе вряд ли уже созреем.
Один синий светодиод на плате стоит, к сожалению, на обратной стороне платы.

Про Форт - есть возможность купить stm32f411ceu6 "черную" таблетку и такой экран 20x4? Они недорого стоят. Если да, то этого было бы достаточно, чтобы портировать Форт на МК61S ;)

Сам я вряд ли созрею

Отладочная с STM32L476 (в неё заливал Mecrisp-Stellaris)
ещё с STM32L100 (в неё сделал поддержку из VFX Forth для линейки STM32)

есть отладка с STM32F103ZET6 с ней никакой Форт не испытывал,
но у ней самое большое число выведенных пинов и нет почти ничего лишнего нa плате,
но есть MicroSD, батарейка и пара USB
и вроде ещё таблетка с STM32F103

Можно попробовать запустить проект MK61S и на них. :)
индикатор, правда двухстрочный пока в наличии, но можно подумать и о графическом

P.S. С Си и ассемблерным Форт ядром от Micrisp-Stellaris есть проект https://github.com/spyren/Mecrisp-Cube

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

Прошивка 1.0.2:
- Исправлен баг с отображением стеков
- Новая статусная строка (АВТ и ПРГ, последний показывает режим ввода программы, режим работы по программе еще не добавлен):
АВТ
ПРГ

Прототип вывода мнемоники введенной команды:

1. F ПРГ
1

2. Fx<0
2

3. 25
3

Мне кажется, этого достаточно, загромождать экран построчным листингом а-ля МК161 смысла нет.