Итерируй это

Сложно ли программировать на советском калькуляторе?

Точной статистики нет, но интуиция подсказывает, что чуть ли не каждый ребенок, у которого дома была печатная машинка, любил играть с ней. Одним нравился звук клавиш, другим звонок, срабатывавший в крайнем положении каретки. Третьи представляли себе сложный компьютер, управляющий ледоколом или даже космолетом. И каждый из таких играющих мечтал, что когда-нибудь у него появится это величайшее чудо, имя которому — ЭВМ. Совместно с инженерами «Авито» мы решили ненадолго вернуться в детство и обзавелись микрокомпьютером «Электроника МК-85», одним из массовых и популярных аппаратов такого класса в конце 1980-х годов.

МК — значит «микрокомпьютер»

В первой половине 1980-х годов начался подъем советской электронной промышленности. Хотя элементная база, выпускавшаяся предприятиями СССР даже по спецзаказу Министерства обороны, значительно уступала по качеству даже самым завалящим западным образцам, несколько научно-исследовательских институтов занимались разработкой вычислительных машин самых разных размеров и сложности. В этот период были созданы бухгалтерские компьютеры серии «Искра», школьные учебные машины «Ириша» и «Корвет», экспедиционный «Океан-240» с очень маленькой потребляемой мощностью, бытовой ПК8000 и многие-многие другие.

Считается, что в 1986 году министр электронной промышленности СССР Александр Шокин дал зеленоградскому Научно-исследовательскому институту точной технологии задание воспроизвести на советской элементной базе японский программируемый калькулятор Casio FX-700. Для того времени это был один из самых компактных и довольно быстродействующих карманных компьютеров. FX-700 имел матрично-символьный жидкокристаллический дисплей, встроенный интерпретатор языка программирования BASIC, полноценную QWERTY-клавиатуру и интерфейсный порт для подключения кассетного магнитофона (чтобы сохранять и считывать программы) или компактного принтера, печатавшего на термобумаге.

По другой версии, уже накопленные технологии и компетенции позволили коллективу Научно-исследовательского института точной технологии в инициативном порядке приступить к разработке компактного одноплатного компьютера. В результате в 1985 году был создан экспериментальный образец компактного одноплатного компьютера на базе 16-разрядного процессора Н1806ВМ2 (японский FX-700 имел 4-разрядный процессор). Поскольку работы были инициативными, велись они медленно.

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

Но, что важно, подарочные электронные книжки понравились руководству партии и, когда чуть позже НИИТТ предложил разработать компактный программируемый калькулятор, аналогичный FX-700, оно проект поддержало. Так на свет и появилась «Электроника МК-85» со встроенным интерпретатором BASIC. Правда, из-за особенностей советской категоризации товаров, «машина» попала в разряд калькуляторов. Очень дорогих калькуляторов. В магазинах МК-85 продавался по 145 рублей, но все равно пользовался огромной популярностью у инженеров.

Первая версия МК-85 имела 16-разрядный центральный процессор, контроллер ввода-вывода, постоянную память объемом 16 килобайт и оперативную память объемом 2 килобайта. Внешний вид «Электроники МК-85» был скопирован с FX-700, но внутри советское изделие с японским близнецом ничего общего не имело. Позднее НИИТТ разработал усовершенствованную версию МК-85М, в которой процессор и контроллер ввода-вывода были объединены в одну микросхему. Этот калькулятор имел постоянную память объемом 32 килобайта.

МК-85 получился настолько удачным, что на его базе была создана и специальная версия МК-85С, которая использовалась в криптографических системах советских, а позднее и российских банков, а также в некоторых военных системах.

Впрочем, без недоработок тоже не обошлось. В частности, в МК-85 при одновременном нажатии кнопок «0» и «.» (они располагаются рядом друг с другом на цифровом блоке клавиатуры) замыкалась та же дорожка, что и при нажатии скрытой под задней крышкой кнопки полного сброса. То есть, при случайном нажатии (не всегда, но непредсказуемо) сохраненные в памяти программы полностью стирались, как если бы устройством никогда не пользовались. Зеленоградский завод «Ангстрем», выпускавший МК-85, эту проблему решить так и не смог. Некоторые энтузиасты решали проблему наклеиванием пластикового валика-разделителя между кнопками.

Кроме того, при выполнении некоторых тригонометрических операций на экране микрокомпьютеры появлялся «мусор», а иногда вычисление синуса и косинуса приводило к перезагрузке устройства. В остальном микрокомпьютер получился очень удачным, настолько, что выпущенная позднее «Электроника МК-90» с графическим дисплеем не пользовалась такой популярностью, как МК-85.

TEST EXE

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

Итак. «Машинка» в наших руках. Первым делом мы набрали команду TEST и нажали клавишу «EXE». В ответ «Электроника» провела самодиагностику: проверила объем памяти и ее тестирование записью и чтением данных, контрольные суммы процессора, экран. После успешной проверки микрокомпьютер перезагрузился и высветил надпись «READY P0» — готовность к исполнению первой программы в памяти. Которой, впрочем, там нет. Самодиагностика стирает все данные в памяти. Затем, уже из любопытства, набираем недокументированную команду WHO, пасхальное яйцо из 1987 года. В ответ «Электроника» высветила надпись «Программу разработал Подоров А. Н.». Это один из конструкторов, участвовавших в проекте «Электроники МК-87» и МК-85.

Что ж, микрокомпьютер работает. В конце инструкции к МК-85, которую удалось найти в интернете, обнаружился код программы поиска числа Фибоначчи по порядковому номеру в ряду. Ее то мы и решили проверить, но не просто так. Однажды у нас с инженерами «Авито» в руках побывал советский персональный компьютер «Нафаня» со встроенным интерпретатором Sinclair BASIC. На нем мы пробовали три метода вычисления числа Фибоначчи. Об этом можно почитать в материале «Код персонального домового». В этот раз мы решили наглядно посмотреть, как разный код влияет на скорость исполнения программы.

Для эксперимента мы решили проверить наш итеративный код, работавший на «Нафане», код из инструкции к МК-85 и прямое вычисление по формуле. Для того, чтобы запустить наш код, его пришлось немного модифицировать, чтобы он заработал на МК-85. В частности, в BASIC, в отличие от Sinclair BASIC, переменная объявляется просто через присвоение ей значения, например, A=0, а не с помощью директивы LETLET A=0. Кроме того, в BASIC объявлять операторы, директивы или переменные можно одной строкой с помощью разделителя — :.

В итоге у нас получилась такая программа:

 10 INPUT N
 20 IF N=0 THEN GO TO 200
 30 A=0:B=1
 40 FOR I=2 TO N
 50 C=B:B=A+B:A=C
 60 NEXT I
 70 PRINT B
 80 STOP
200 PRINT N

Построчно этот код читается так. Спрашиваем у пользователя номер числа Фибоначчи, которое требуется найти. Если пользователь указал 0, то переходим к строке 200, на которой выводим на экран введенное число — 0. Затем программа останавливается.

Если же число не 0, то объявляем переменную A и присваиваем ей значение 0, затем объявляем переменную B со значением 1. Эти переменные будут использоваться при повторяющемся вычислении в теле цикла.

Сам цикл объявлен в строке 40. Счетчик цикла — I — начинается с двух, причем тело цикла, следующее за строкой с оператором FOR будет итерироваться только в том случае, если переменная N (указанное пользователем число) будет больше счетчика цикла. Если же меньше, то код, следующий за объявлением цикла будет выполнен только один раз.

На строке 50 объявляем переменную C и записываем в нее значение переменной B, затем в переменную B записываем результат сложения значений переменных A и B, а потом переменной A присваиваем значение переменной C. На строке 60 оператор NEXT увеличит значение переменной I на 1, и цикл, если значение переменной N все еще больше I, повторится.

После того как тело цикла выполнится один или несколько раз и цикл завершится, программа перейдет к строке 70, выведет на экран найденное число Фибоначчи и на строке 80 остановится — сработает директива STOP.

Код из примера в инструкции выглядит так:

10 A=0:B=1
20 INPUT N
30 FOR I = 3 TO N
40 C=A+B
50 A=B
60 B=C
70 NEXT I
80 PRINT C
90 END

Следует отметить, что эта программа считает 0 в качестве первого числа в ряду Фибоначчи, в отличие от нашего кода, в котором 0 — это 0. Соответственно, если нашу программу попросить найти десятое в ряду число Фибоначчи, ответ будет 55, а программы из инструкции — 34. Число 55 в ряду Фибоначчи для этой программы — одиннадцатое.

Наконец, так выглядит код программы, которая просто вычисляет число Фибоначчи:

10 INPUT N
20 PRINT INT (0.5+(((SQR 5+1)/2)^N)/SQR 5)

При запуске мы давали каждой из программ вычислить десятое в ряду число Фибоначчи (для советского примера — одиннадцатое). Результат получился очень интересным: наша программа нашла ответ за 2,1 секунды, а советская программа — за 1,1 секунды. На вычисление числа Фибоначчи по формуле ушло аж 6,05 секунды.

Разница во времени объясняется довольно просто. Первая программа в начале содержит условный оператор, которому необходимо некоторое время на проверку соответствия введенной пользователем переменной заданному условию. По этой причине первая программа немного уступает второй, в которой условного оператора нет. При этом обе эти программы выполняются быстро (особенно по сравнению с третьей), поскольку оперируют только с одним простым арифметическим действием — сложением. В отличие от третьей программы, в которой присутствуют и квадратные корни, и возведение в степень, и деление. Как показал эксперимент, на все эти вычисления требуется время.

Кстати, в МК-85 присутствует так называемый турбо-режим. В этом режиме микрокомпьютер имеет значительно большую производительность. В инструкции к МК-85 написано, что в турбо-режиме включать устройство лучше при подключенном внешнем питании, поскольку энергопотребление микрокомпьютера становится велико, и батарейки очень быстро разряжаются. Чтобы перейти в турбо-режим, нужно выключить устройство, нажать клавишу «+» и затем включить его.

В режиме повышенной производительности у нашей программы на поиск числа Фибоначчи ушло примерно 0,2 секунды. Программа из инструкции высветила результат настолько быстро, что мы не успели засечь время; практически моментально. На вычисление числа Фибоначчи в турбо-режиме у микрокомпьютера ушли 1,3 секунды.

Поиграй на калькуляторе

Поскольку микрокомпьютер «Электроника МК-85» имеет встроенный интерпретатор BASIC, энтузиасты приспособили его и для игр. В начале 1990-х программы для МК-85 публиковались в журналах. Любопытно, что работали они не на всех устройствах. На одних МК-85 они запускались без проблем, на других выдавали ошибку. Это было связано не только с тем, что часть программ была написана для МК-85М, а запускалась на МК-85, но и с самими «прошивками» микрокомпьютеров.

Только лишь для МК-85 известно четыре версии, самая ранняя из которых, например, не допускает ручного ввода операторов при программировании (принимаются только операторы, введенные сочетанием клавиш). Нам попалась версия с поздней прошивкой, которая не только понимает ручной ввод команд и операторов, но и не требует для большинства из них пробела перед аргументом.

В 2014 году программист Сергей Бобров написал собственный вариант популярной игры «Принц Персии» для МК-85. Посмотреть на его программу можно здесь. Управление персонажем в ней очень простое: клавиша 4 — шаг влево, 6 — шаг вправо, 8 — прыжок в сторону, в которую перед этим был сделан шаг. Играть на МК-85 в эту игру лучше в турбо-режиме; в противном случае вы даже ее загрузки будете ждать пока все электролитические конденсаторы не пересохнут.

И, да, в представленном коде игры строки 10 и 71 превышают допустимую для МК-85 длину строки в 63 символа. Это ограничение можно обойти, если записать код вручную и без пробелов, не прибегая к сочетаниям клавиш. Проверить уже записанные строки можно командой LIST, а внести изменения в конкретную строку можно командой LIST с номером этой самой строки.

Мир языков программирования с 1980-х годов сильно изменился. Появились новые языки, новые подходы, паттерны и парадигмы программирования. Но все это было бы невозможно без изобретений, сделанных многие десятилетия назад. И иметь возможность прикоснуться к ним и сегодня, по-настоящему приятно.

Василий Сычёв

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.
Что было раньше

Расставьте важные открытия человечества по порядку