Самодельный калькулятор в корпусе Б3-23 (На Н1806ВМ2)

Карманные вычислительные устройства и механические вычислители
1Ж24Б
Advanced Member
Сообщения: 634
Зарегистрирован: 07.11.2014,18:19
Откуда: Kaluga

Вклад в сообщество

Сообщение 1Ж24Б » 21.10.2018,20:42

Есть живой Б3-23 и МК-57. Что требуется выполнить?
Просто Александр. Consul'oвед второго уровня.

Гость

Сообщение Гость » 22.10.2018,00:36

Ну, собсна, всё -- софт в "консольном" варианте готов!

Желающих протестировать, приглашаю сюда:
https://onlinegdb.com/rkoD9v2sm -- версия с логикой вычисления процентов, как у Б3-23
https://onlinegdb.com/ry3kCP2sQ -- версия с улучшенной логикой вычисления процентов (сам придумал :) )
[upd 22.10.18 16:05] сделал фикс в вычислениях процентов
[upd 23.10.18 00:35] переделал обработку = в вычислениях процентов
[upd 23.10.18 12:46] переделал логику вычисления процентов в режимах * и /

Инструкция:
- открываете ссылку (см. выше)
- увидите страничку с моим проектом -- Вы не сможете его редактировать, но сможете его запустить на исполнение
- нажимаете кнопку Run -- нужно подождать 5-10 сек., пока проект скомпилируется
- далее в нижней половине экрана откроется текстовая консоль (белые буквы на чёрном фоне) -- в неё моя программа напечает приветствие и приглашение к диалогу
- если нижняя часть слишком узкая по высоте, то наведите мышкой на границу-разделитель и потяните её вверх, чтобы увеличить высоту окна консоли, уменьшая высоту окна с кодом
- переведите курсор (мышкой) в консоль и попробуйте ввести какие-нибудь примеры для расчёта
- ... например, введите [font=Courier]1+2=[/font]
- каждый раз в конце нажимайте ENTER, чтобы завершить ввод строки -- ну, дальше, думаю, сами разберётесь
- программа обрабатывает клавишу-за-клавишей и после каждой "клавиши" печатает состояние дисплея калькулятора и внутреннее состояние аппарата
- когда Вам надоест, в пустой строке нажмите Ctrl+D (эта комбинация в POSIX операционных системах при дефолтных настройках вводит с консоли символ "конец файла")
- программа подосвиданькается с Вами и завершит работу
- ... далее нажмите ENTER (ну или просто закройте окно браузера)

Пример, как это выглядит в окне браузера:
Изображение

Теперь о безопасности Вашего компьютера (если Вы вдруг боитесь, что я хочу Вам вирус подпустить):
- как Вы могли догадаться, моя программа компилируется и запускается не у Вас на компьютере, а где-то далеко за-морями-за-лесами на каком-то буржуйском сервере (как сейчас модно говорить, "в облаке")
- браузер, запущенный на Вашем компьютере, просто передаёт тому серверу, какие кнопульки Вы нажимаете у себя на клавиатуре, и получает от сервера картиночку, которую надо отрисовать в окне -- для Вас же это в совокупности выглядит как работа с консольным приложением
- короче, на Вашем компьютере ничего по сути не запускается, и никакое экзешники-с-вирусами на него не приползают

Для тех же, кто хочет скомпилировать прямо у себя в бинарь и сей бинарь запустить, можете скачать проект отсюда:
https://github.com/xoiss/b3-23.git

Проект написан под Linux. Проверял на Ubuntu 14 (Trusty):
Изображение

Если у Вас Windows, то Вам потребуется установить наборы MinGW + MSys. Я проверил - собирается, взлетает, летает, садится.
Если у Вас macOS, BSD, Solaris, то... думаю, тоже заведётся, но Вам наверняка потребуется допилить Makefile (если у Вас на машине нет gcc, то это точно придётся сделать).

Вот. Как-то так.

Немного передохну и попробую перекинуть на ДВК под RT-11, для начала.
Может, ещё доделаю остальные функции процессора к145ип11 -- которые в Б3-23 были спрятаны "под капотом", но зато видны в клавиатуре Б3-26 и МК-57

Всем привет!

Гость

Сообщение Гость » 22.10.2018,00:55

1Ж24Б писал(а):Есть живой Б3-23 и МК-57. Что требуется выполнить?
Ну, вообще я хотел поспрашивать в отношении операции взятия процентов... но я её так или иначе уже успел реализовать, что называется "по своему разумению".

Тем не менее, интересно было бы проверить несколько примеров. Если можете помочь -- было бы здорово.

1. Введите [font=Courier]C C 10000 - 0.1234 =[/font]
- мой симулятор даёт ответ: [font=Courier]9999.8766[/font]
- интересно, даст ли настоящий аппарат такой же ответ, или выдаст 9999.876 или 9999.877, потеряв четвёртый знак после запятой

2. Введите [font=Courier]C C 10 / 6 =[/font]
- мой симулятор даёт ответ: [font=Courier]1.6666667[/font]
- интересно, какой будет крайний справа знак на настоящем аппарате -- 6 или 7
[upd] похоже, Б3-23 всё-таки округляет "отсечением", например на нём получается 11111111 * 55555555 = 6172839.3, а должно быть 6172839.4

3. Введите [font=Courier]C C / 2 =[/font]
- некоторые калькуляторы в таком случае выполняют вычисление выражения 1 / 2 = 0.5 -- т.е. суть, если делимое не было задано, то принимают его равным 1, но не 0
- мой симулятор это не делает (мне было лень, честно), поэтому он выдаст ответ [font=Courier]0.[/font] -- так, как если бы было введено 0 / 2
- интересно, как это воспринимает настоящий аппарат -- что он выдаст, 0 или 0.5

4. Введите [font=Courier]C C 1 - 2 =[/font]
- где будет знак "минус" ?
- на МК-57 знак "минус" отображается на экране, вроде бы, справа от числа -- видел картинку в интернете
- на экране Б3-23 (и, вроде бы Б3-26) знак "минус" отображается слева от числа...
- ... однако, в случае если число имеет менее восьми знаков, то я не нашёл свидетельств, на каком знакоместе отображается знак "минус" -- (а) всегда в крайнем левом разряде или же (б) он как бы мигрирует в пределах индикатора так, чтобы быть прилепленным вплотную к числу слева от старшей цифры
- мой симулятор отображает знак минус всегда в крайнем левом разряде (впрочем, этот аспект запрограммирован не в самом "симуляторе", а уже в "адаптере")

Спасибо!

Гость

Сообщение Гость » 22.10.2018,16:31

1Ж24Б писал(а):Есть живой Б3-23 и МК-57. Что требуется выполнить?
... если можно, то вот ещё несколько примеров на проценты -- я здесь привожу так, как у меня в симуляторе реализовано

5. Введите [font=Courier]C C 200 + 5 % =[/font]
- после нажатия клавиши % на экране должно быть 10.
- а после нажатия клавиши = на экране должно быть 210. -- что и есть результат вычисления (200+5%)

6. ... продолжая пункт 5, сразу введите [font=Courier]6 % =[/font]
- после нажатия клавиши % симулятор выдаёт 12.
- после нажатия клавиши = симулятор выдаёт 212. -- что есть результат вычисления (200+6%)
- другими словами, при повторных вычислениях с процентами симулятор в качестве константы использует "базу исчисления процентов" -- в данном случае это число 200
- интересно, что на пункт 6 скажет настоящий Б3-23

7. Введите [font=Courier]C C 10 / 3 %[/font]
- после нажатия клавиши % на экране должно быть 333.33333 -- т.е. 10 составляет 3% от 333,33333

8. ... продолжая пункт 7, сразу нажмите клавишу [font=Courier]=[/font]
- после нажатия = симулятор выдаёт 0,03 -- т.е. он как бы делает обратную операцию -- возвращает, сколько процентов (в долях единицы, в данном случае) составляет 10 от 333,33333
- опять таки в качестве константы здесь было использовано первый введённый аргумент -- число 10
- интересно, что на пункт 8 скажет настоящий Б3-23

Спасибо!

1Ж24Б
Advanced Member
Сообщения: 634
Зарегистрирован: 07.11.2014,18:19
Откуда: Kaluga

Вклад в сообщество

Сообщение 1Ж24Б » 22.10.2018,21:15

Б3-23:

1. 9999,877

2. 1,6666666

3. 0

4. -_______1

5. 10 и 210

6. 12 и 212

7. 333,33333

8. 111,11111 :(

До МК57 не добрался сегодня.
Просто Александр. Consul'oвед второго уровня.

Гость

Сообщение Гость » 22.10.2018,22:11

о, спасибо!!!

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

1Ж24Б
Advanced Member
Сообщения: 634
Зарегистрирован: 07.11.2014,18:19
Откуда: Kaluga

Вклад в сообщество

Сообщение 1Ж24Б » 22.10.2018,23:02

Второй калькулятор МК-57А, и он даёт такие же результаты.
Просто Александр. Consul'oвед второго уровня.

Гость

Сообщение Гость » 23.10.2018,01:43

В общем, пока ехал домой, разобрался, что к чему.
Симулятор я переделал... но не в сторону к Б3-23, а, наоборот :)

Получается, что в к145ип11 всего четыре регистра (в общем то, я так и думал изначально):
1. Регистр первого операнда, он же - регистр клавиатуры/индикатора
2. Регистр второго операнда, он же - регистр константы (в операциях с константой)
3. Вспомогательный регистр для операций умножения и деления. Точно не могу знать, но он либо формирует (накапливает) в себе произведение/частное, либо удерживает множимое/делимое
4. Регистр памяти (доступен только в Б3-26, МК-57)

В процессе выполнения операции деления, например [font=Courier]200 / 40 =[/font], делимое (200) уничтожается, т.к. из него в цикле вычитается делитель (40), пока в регистре делимого в остатке не окажется 0 (ну или пока счётчик сформированных разрядов частного не досчитает до 8). Делитель же (40) в процессе деления сохраняется, и далее служит константой.

Когда мы вычисляем обратный процент, например [font=Courier]10 / 5 %[/font], в сущности необходимо выполнить деление 10 / 5 (в ответе 2) и потом подвинуть запятую на два разряда вправо (чтобы получить искомое 200). Сотвесна, делимое (10 - база) уничтожается, а делитель (5 - ставка процента) становится константой... Нажимать после этого клавишу = лишено всякого смысла, конечно же.

Сейчас у меня реализована другая логика. Константой становится не ставка процента, а база для вычисления процентов. Это необходимо в операциях вычисления наценки/скидки (например, [font=Courier]200 + 5 % =[/font]). Но правильно ли делать константой базу при вычислениях процентов (но не наценки) -- это вопрос.

Хммм... наверное, всё-таки логика, реализованная в Б3-23, более правильная, т.е. при вычислении просто процентов (но не скидок) константой должна становиться именно ставка процента. Если в калькуляторе при этом есть M-регистр, то это позволяет вести расчёт суммы налога по ведомости. То есть типа такого: [font=Courier]200 * 13 % M+ 207 % M+ 204 % M+ ...[/font] -- в итоге даст 200 * 13/100 + 207 * 13/100 + 204 * 13/100 ... Хотя, не понятно, какой смысл вести расчёт именно так, если можно так: (200+207+204) * 13/100 :)

Логика, реализованная у меня, позволяет, наоборот, вычислять разные проценты от одной и той же базы. Например, [font=Courier]200 * 5 %[/font] (даёт 10), далее [font=Courier]6 %[/font] (даёт 12) и т.д.

Логика, которую я реализовал в симуляторе, в к145ип11 в любом случае не влезла бы, т.к. для её реализации требуется пятый регистр -- в нём необходимо запомнить базу (10) на время выполнения операции деления, чтобы потом восстановить это значение как константу (делимое в процессе деления разрушается). Так что, в случае с настоящими калькуляторами ответ на вопрос, какую логику выбрать, был предопределён чисто соображениями минимализма "железа".

В общем, надо ещё поразмышлять, какой вариант лучше/правильнее.

... в общем, подумал, и сделал два варианта:
1. в точности, как у Б3-23
2. как у Б3-23, но улучшенный

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

итак, первый вариант в "примере 8", как и положено, возвращает 111.11111 -- хотя это и совершенно бессмысленная операция, но пусть будет "в точности как Б3-23" -- просто в дань уважения

во втором варианте я попытался наделить "нажатие клавиши =" в операциях вычисления прямых и обратных процентов каким-то вразумительным смыслом, а именно:
- если ввести 200 * 5 %, то, как и положено, получаем 10 -- но далее, если нажать =, то теперь получаем обратно 200
- по аналогии, если ввести 10 / 5 %, получаем, как и положено, 200 -- и далее, если нажать =, то теперь получаем обратно 10
- в общем, в обоих случаях клавиша = выполняет действие обратное клавише %
- действия можно чередовать % = % = и т.д.
- в остальном логика не изменилась
- в операциях вычисления наценки/скидки функция клавиши = не менялась, но осталась как у Б3-23

Ну, вроде, на этом всё.

Гость

Сообщение Гость » 23.10.2018,02:00

1Ж24Б писал(а):Второй калькулятор МК-57А, и он даёт такие же результаты.
Спасибо!

Могу ли я попросить Вас сделать ещё несколько примеров?

9. Набрать: [font=Courier]С С СП[/font] далее [font=Courier]200 * 13 % П+ 207 % П+ 204 % П+[/font] и в конце [font=Courier]ИП[/font]
- здесь "П+" -- это клавиша суммирования в память
- что будет выдано в результате?
- я предполагаю, что 79.43

10. Набрать: [font=Courier]C C 5 * 4 C - 2 =[/font]
- т.е. после набора "4" вот именно один раз нажать клавишу сброса "С"
- симулятор выдаёт результат как для 5 - 2 = 3
- но я предполагаю, что калькулятор выдаст -2 (минус два) как результат для 5 * 0 - 2 = -2

11. Набрать: [font=Courier]C C 5 / 4 C - 2 =[/font]
- что выдаст калькулятор? те же -2 (минус два)
- ... или выдаст ошибку деления на ноль?

Спасибо!

Гость

Сообщение Гость » 23.10.2018,13:15

Поправил логику процентов -- updated-комментарий выше. Код перезалил, ссылки на проект обновил.

Статистика:
1. Код симулятора занимает 560 строк
... если убрать декларации, пустые строки, и строки-со-скобочками, то чистого кода будет где-то около 300 строк
2. На написание и отладку собсна симулятора я потратил период времени с 09 октября по 23 октября -- это ровно 2 недели
... чистого времени - где-то в среднем по 3-4 часа в день, в расчёте 2 дня из трёх -- т.е. итого около 30-40 человеко-часов

Даже если положить, ну, пусть хотя бы по 3 байта машинных команд в среднем на одну строку Си-шного кода (а это очень скромная норма), то выйдет, оценочно, около килобайта кода!
... и это ещё при том, что я НЕ реализовывал извлечение квадратного корня, работу с регистром памяти, ну и пр. мелочёвку, которые есть в к145ип11.

Ума не приложу, КАК это было впихнуто в к145ип11...

Но что для меня непонятно, каким образом инженеры это всё сделали в 70-х годах прошлого века.
У меня для этой работы был современный компутер, на котором работать - удовольствие.
И это я сделал ещё всего лишь симулятор, т.е. я не запихивал этот код в мягко-говоря-своеобразную архитектуру микро-ЭВМ 145ип11.
Либо у них тогда на это ушло реально на пару порядков больше сил и времени, либо у них был какой-то технологический секрет (суперкомпутер??), либо... эти люди были на самом деле оооочень талантливыми.
// я не знаю, кто разработал прошивку для конкретно 145ип11, -- может наши сделали это сами, а может скопировали у американцев (вроде был такой чип Rockwell A5901 -- http://www.arithmomuseum.com/album.php?ac=A5901&lang=en)... но ведь кто-то же это изначально сделал

MM, надо делать железку!

MM
Advanced Member
Сообщения: 5894
Зарегистрирован: 02.08.2013,22:13
Откуда: Павловский Посад Мск.обл.
Контактная информация:

Вклад в сообщество

Сообщение MM » 23.10.2018,14:31

xoiss писал(а):3 байта машинных команд в среднем на одну строку Си-шного кода
ИМХО, по аналогии с Паскалем, порядка 20 байт ( 10-14 ( 8 ) слов ) на 1 оператор Паскаля, с точностью переменных 2 байта.
Надо проверить, может ли исполняемый коТ работать в ПЗУ, или придется переписать на "натуральный ассемблер" - там не будет проблем с ПЗУ . При написани такого текста следует сделать базовую переменную - адрес начала таблиц переменных в ОЗУ и фиксировать указатель стека в начале программы, т.к. он будет в районе адресов 170400 ( 8 ).
Текст на ассемблере следует заранее писать в перемещаемом по адресам варианте.

Сделал 2-ю редакцию Э3 - чуть малость по-универсальней, с 8-битным Ковоксом, см. пост выше.
Этот вариант заточен именно под замену 145ИП11 - клава до 9 х 4 сканов, и возможное расширение под RT-11.

Нужен опытный тополог ДПП.
Господин Пантера г. Москва не нашел возможности заняться проектом.
Коллекционирование радиодеталей : http://collectingrd.kxk.ru/

Ответить