🎱 Сложности при написании «99 бутылок» на «Электронике МК-61»

Электроника МК-61 (127.50КиБ)
Тот самый калькулятор «Электроника МК-61», который попал мне в руки

Как и обещал в прошлый раз, хочу рассказать с какими сложностями мне пришлось столкнуться при написании «Песни о пиве» на программируемый калькулятор «Электроника МК-61».

Калькулятор попал ко мне для передачи в компьютерный музей, который готовится к открытию в высшей школе «ИТИС» и у меня и мыслей-то не было что-то под него писать — хотелось лишь посмотреть что из себя представляет написание программ под этот гаджет, с которыми я много сталкивался в детстве через журнал «Наука и жизнь».

В процессе изучения я наткнулся на заинтриговавшую меня вещь. В некоторых операциях калькулятор переключался в режим шестнадцатеричного счисления, о чём сигнализировала восьмёрка и точка в первом разряде. Шестнадцатеричная система калькулятора (38.55КиБ)
По этой таблице калькулятор отображает шестнадцатеричные числа

Как видно по таблице выше, отображение этих чисел сильно отличается от общепринятого (как правило для цифр больше девятки используются латинские буквы от A до F) и я не мог не отметить, что с их помощью легко написать английское «beer» («пиво»).

Тем более мне очень повезло в том, что индикацией этого режима является именно восьмёрка, стоящая спереди — так похожая на первую букву в нужном мне слове. Как вы теперь понимаете, на экране в моей программе написано на «BEEr», с точки зрения калькулятора там одни числа и индикатор режима — «8.EEГ» или «EED» в привычной записи (десятичное «3821»).

Так же я воспользовался тем, что «F» в этой странной нотации — пробел, что позволило мне отделить число от «надписи». Дальнейшее — дело техники.

Листинг из предыдущего поста начинается с подготовки данных в регистрах — нескольких масок на которые битовыми операциями в дальнейшем наложатся числа так, чтобы получилась нужная мне «строка». Настоящая программа начинается с нажатий на «В/О» и «ПРГ», и активно пользуется подготовленными данными.

Маски и оставшиеся числа побитно накладываются двумя подпрограммами — по отдельности на диапазоны 0…5 и 6…9 — способы их получения разнятся. Я широко использую операцию «ИНВ» — она инвертирует биты числа, по логике инвертирования цифры 6…9 превращаются в на свои позициях 9…6, и тут никаких сложностей, а знаки в диапазоне 0…5 получаются сложнее — там накладываются сразу две специальные маски и счётчик.

Для примера кусочек подпрограммы, номер слева соответствует номеру инструкции при вводе в калькулятор и каждую строку я прокомментирую, но следует понимать, что в реальности эти комментарии частью программируемы не являются:
// когда что-то попадает в «X» предыдущее значение смещается в «Y» (там стек из 4 позиций)
45 1 // «1» кладётся в регистр «X», входной параметр сместился в «Y»
46 + // Y + 1, передаётся в «X», это коррекция данных после операций, которые шли выше
47 К П→Х 7 // в «X» помещается число из регистра (маска), указанного в регистре №7
48 + // Y+X → X
49 ИНВ // инвертирование битов в «X», сейчас на экране написано «8.EEГ» плюс некий пока мусорный символ
50 К П→Х 8 // в «X» помещается число из регистра, указанного в регистре №8
51 ^ // операция «И», на экране — «8.EEГ», из некого символа получилось требуемое число
52 В/О // возврат из подпрограммы
Десятки и единицы выбираются адресами масок, которые я передаю при помощи косвенной адресации, хорошо, что такое вообще есть в языке — это позволяет эффективно пользоваться подпрограммами.

Подпрограмма вызывается два раза с разными параметрами — для десятков и единиц, получаются две маски, которые позднее накладываются друг на друга.

Сильно расстраивает отсутствие памяти для долговременного хранения, в устройстве хоть и есть батарейный отсек, но при любом сбое питания (батарейки сели, а блок питания не подключен), память калькулятор сбрасывается и программу придётся набрать заново. То же ожидает и в случае, если одну программу нужно будет заменить другой — хотя программы можно запускать с произвольного адреса, много их в память не уместится — её ёмкость всего 105 инструкций.
6 февраля 2016 21:41

SiMM (инкогнито)
6 февраля 2016, 22:59

ЭСППЗУ (электрически стираемое перепрограммируемое постоянное запоминающее устройство) было у МК-52, в котором можно было сохранять программы и данные, плюс к оному цеплялись модули расширения памяти с набором готовых программ.

bolknote.ru (bolknote.ru)
6 февраля 2016, 23:01, ответ предназначен SiMM

Ого, если в руки попадёт, побалуюсь, спасибо! :)

Алекс (инкогнито)
7 февраля 2016, 10:53

Назывались эти модули "блок расширения памяти" (БРП). У меня в детстве был БРП-4. Имел, кажется, 4 кбайт памяти. Вот он, справа от калькулятора:
https://commons.wikimedia.org/wiki/File:Elektronika_MK_52_with_accessories.jpg?uselang=ru
Быстрый поиск выдал полный список содержащихся программ:
http://mk.semico.ru/brp4.htm
(Эх, сколько раз я разбивал космический аппарат о Луну!)

gnuth (инкогнито)
7 февраля 2016, 11:51

По поводу посадк на луну.
В журнале "Техника молодежи" была серия статей с программами для полёта с Луны на Землю.

Степанищев Михаил (инкогнито)
10 февраля 2016, 17:15, ответ предназначен bolknote.ru:

На современных ПМК ряда МК-152/161 написать эту "песню" не сложно - с выводом текста на графический индикатор. Память для долговременного хранения информации тоже имеется. Хотя конкретная программа не пойдёт - команды логических операций там обрабатываются иначе.

bolknote.ru (bolknote.ru)
10 февраля 2016, 20:16, ответ предназначен Степанищев Михаил

Ого, их до сих пор выпускают? А для чего? Какое у них применение в современном мире?

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)