Сложно ли программировать на советском калькуляторе?
Точной статистики нет, но интуиция подсказывает, что чуть ли не каждый ребенок, у которого дома была печатная машинка, любил играть с ней. Одним нравился звук клавиш, другим звонок, срабатывавший в крайнем положении каретки. Третьи представляли себе сложный компьютер, управляющий ледоколом или даже космолетом. И каждый из таких играющих мечтал, что когда-нибудь у него появится это величайшее чудо, имя которому — ЭВМ. Совместно с инженерами «Авито» мы решили ненадолго вернуться в детство и обзавелись микрокомпьютером «Электроника МК-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.
Удивительно, но во время общероссийского режима самоизоляции спрос на ретро-электронику значительно вырос. Если раньше в продаже можно было найти любой из вариантов МК-85, то на момент покупки нами микрокалькулятора, предложений были единицы. Наш образец пришлось заказывать из Нижнего Новгорода. Микрокомпьютер пришел в очень хорошем внешнем состоянии. Правда, продавец не удосужился вынуть из МК-85 солевые батареи, которые со временем протекли. Из-за этого отгнил один из контактов, который, впрочем, был успешно восстановлен с помощью фольги.
Итак. «Машинка» в наших руках. Первым делом мы набрали команду TEST
и нажали клавишу «EXE». В ответ «Электроника» провела самодиагностику: проверила объем памяти и ее тестирование записью и чтением данных, контрольные суммы процессора, экран. После успешной проверки микрокомпьютер перезагрузился и высветил надпись «READY P0» — готовность к исполнению первой программы в памяти. Которой, впрочем, там нет. Самодиагностика стирает все данные в памяти. Затем, уже из любопытства, набираем недокументированную команду WHO
, пасхальное яйцо из 1987 года. В ответ «Электроника» высветила надпись «Программу разработал Подоров А. Н.». Это один из конструкторов, участвовавших в проекте «Электроники МК-87» и МК-85.
Что ж, микрокомпьютер работает. В конце инструкции к МК-85, которую удалось найти в интернете, обнаружился код программы поиска числа Фибоначчи по порядковому номеру в ряду. Ее то мы и решили проверить, но не просто так. Однажды у нас с инженерами «Авито» в руках побывал советский персональный компьютер «Нафаня» со встроенным интерпретатором Sinclair BASIC. На нем мы пробовали три метода вычисления числа Фибоначчи. Об этом можно почитать в материале «Код персонального домового». В этот раз мы решили наглядно посмотреть, как разный код влияет на скорость исполнения программы.
Для эксперимента мы решили проверить наш итеративный код, работавший на «Нафане», код из инструкции к МК-85 и прямое вычисление по формуле. Для того, чтобы запустить наш код, его пришлось немного модифицировать, чтобы он заработал на МК-85. В частности, в BASIC, в отличие от Sinclair BASIC, переменная объявляется просто через присвоение ей значения, например, A=0
, а не с помощью директивы LET
— LET 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-х годов сильно изменился. Появились новые языки, новые подходы, паттерны и парадигмы программирования. Но все это было бы невозможно без изобретений, сделанных многие десятилетия назад. И иметь возможность прикоснуться к ним и сегодня, по-настоящему приятно.
Василий Сычёв
Расставьте важные открытия человечества по порядку
Когда-нибудь задумывались, что электромобиль появился раньше обычного, бензинового? А о том, что первая модель телеграфа была представлена публике почти за сто лет до, например, периодической системы элементов Менделеева? Действительно, некоторые изобретения человечества кажутся старше, чем они есть на самом деле. Попробуйте расставить 20 важнейших открытий по хронологии. И помните: не все так однозначно, как вам кажется.