Еггогология: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Polzohod (обсуждение | вклад) м кавычки, тире |
→ПСЧ-режим: информация взята из той же статьи ТМ. Другой способ входа в журнале упоминается, но не приводится. |
||
(не показано 249 промежуточных версий, сделанных более чем 100 участниками) | |||
Строка 1: | Строка 1: | ||
{{стиль статьи|дата=2023-09-09}} |
|||
'''Еггоголо́гия''' — изучение скрытых возможностей [[калькулятор|микрокалькуляторов]]. |
|||
[[Файл:Elektronika MK 52 with ERROR.jpg|thumb|400px|[[Электроника МК-52]] с сообщением «ERROR» (из-за специфического отображения буквы ''r'' зачастую читалось как «ЕГГОГ»)]] |
|||
'''Еггоголо́гия''' — изучение недокументированных возможностей [[калькулятор|микрокалькуляторов]]. |
|||
== Происхождение == |
|||
Название происходит от надписи ERROR, которую многие калькуляторы высвечивают при ошибке — обычно эта надпись больше похожа на ЕГГОГ. Широкое распространение получила в [[СССР]], в середине [[1980-е|80-х]] гг. прошлого века, связано с появлением первого массового советского программируемого [[микрокалькулятор|микрокалькулятора]] [[Б3-34]]. |
|||
Название впервые возникло в СССР и носит шуточный характер. Предположительно происходит от сообщения об ошибке «ЕГГОГ» ({{lang-en|Error}} — ошибка), которую выдавали программируемые микрокалькуляторы второго поколения [[СССР|советского]] производства ([[Электроника Б3-34]], [[МК-54]], [[Электроника МК-56|МК-56]], [[МК-61]], [[МК-52]], МС 1104) на [[Семисегментный индикатор|семисегментных индикаторах]]. Термин впервые появился в журнале «[[Техника — молодёжи]]» после цикла статей [[Пухов, Михаил Георгиевич|М. Пухова]], посвящённых программированию на микрокалькуляторах серии «[[Электроника Б3-34]]»<ref name="tm-1985-01">{{Статья|заглавие=Мягкой посадки!|год=1985|издание=Техника — молодёжи|тип=журнал|месяц=6|страницы=56}}</ref>, и серии из девяти рассказов о фантастическом путешествии с Луны на Землю под общим названием «„Кон-Тики“: путь к Земле»<ref name="tm-kon-tiki">Михаил Пухов. «Кон-Тики»: путь к Земле // «Техника — молодёжи», 1985, № 8—12; 1986, № 1—4.</ref>. В этом цикле, кроме игровых программ, описывались различные недокументированные возможности микрокалькуляторов и видеосообщения, многие из которых получались путём манипуляций с клавишами после появления сообщения об ошибке «ЕГГОГ» ([[Файл:Еггог.svg|43px]]). |
|||
Читатели журнала с огромным энтузиазмом откликнулись на рассказ об обнаруженных недокументированных возможностях микрокалькуляторов, стали искать новые, и по окончании цикла «Кон-Тики…» появился небольшой раздел «Новости еггогологии». С помощью опубликованных в нём недокументированных приёмов было написано множество новых игровых программ, большинство из которых просто не могло быть создано стандартными средствами в силу ограниченности ресурсов калькуляторов семейства [[Электроника Б3-34|Б3-34]].{{нет АИ|7|06|2023}} |
|||
Журнал «Техника — молодёжи» опубликовал ряд статей по исследованию недокументированных возможностей микрокалькуляторов. |
|||
== Направления еггогологии == |
|||
[[Category:Калькулятор]] |
|||
Изначально предметом интереса была возможность формирования на дисплее буквенно-цифровых комбинаций, содержащих не только цифры 0-9, но и [[Шестнадцатеричная система счисления|шестнадцатеричные]] символы, отображаемые калькулятором как '''–''', '''L''', '''С''', '''Г''', '''Е''' и пробел. Их можно было получить путём манипуляций над несохраняемым сообщением ЕГГОГ, которое микрокалькулятор выдаёт при попытке выполнить некорректную операцию (деление на ноль и т. д.). Такие «числа» можно хранить в регистрах памяти и использовать в качестве сообщений в игровых программах. В журнале «Техника — молодёжи» описывалась методика получения самых различных «видеосообщений», от буквы «Г» для программы «Лунолёт-1»<ref name="tm-1985-01" /> до целого мультфильма о полёте космического корабля по мотивам рассказа «Путь к земле»<ref>{{Статья|заглавие=Мягкой посадки!|год=1985|издание=«Техника — молодёжи»|тип=журнал|месяц=12|страницы=48—49}}</ref>. |
|||
[[sl:Eggogologija]] |
|||
В дальнейшем, одним из направлений еггогологии стало расширение диапазона обрабатываемых чисел (числа с порядками от 100 до 199 также отображаются на экране как ЕГГОГ, см. [[Еггогология#«Нестандартные» числа|«Нестандартные» числа]]) и изучение реакции микрокалькулятора на попытки произвести операции с числами за пределами стандартного диапазона. |
|||
Другое направление еггогологии изучало недокументированные возможности режима программирования; энтузиасты находили способы ввода недокументированных команд, например, содержащих символ «пусто» (F), изучали возможности нестандартного использования адресного пространства программ (см. [[#Главная и побочные ветви|Главная и побочные ветви]]), [[Еггогология#ПСЧ-режим|ПСЧ-режим]]. |
|||
После того как в 2011 году инженером Ф. Лазаревым была проанализирована аппаратная архитектура советских микрокалькуляторов и считано содержимое ПЗУ, многие необычные возможности ПМК получили логическое обяснение. Стало ясно, что «Тьма» является зацикливанием прошивки ПМК, а сообщение «ЕГГОГ» генерируется головным процессором К745ИК1302 по таймауту, когда ни один из ведомых процессоров не смог обработать введённую команду<ref>{{Cite web|lang=ru|url=https://habr.com/ru/post/505612/|title=МК-61: история, эмуляция, устройство|website=Хабр|access-date=2022-10-26|archive-date=2022-10-26|archive-url=https://web.archive.org/web/20221026153329/https://habr.com/ru/post/505612/|deadlink=no}}</ref>. |
|||
== «Нестандартные» числа == |
|||
Еггогология утверждает, что порядок ([[показатель степени]]) диапазона обрабатываемых микрокалькулятором чисел ограничен по модулю 1000 и делит этот диапазон на так называемые этажи или «'''ярусы'''»<ref name="tm-1986-01">«Техника — молодёжи», 1986, № 1, с. 54.</ref>. Каждый ярус — это сотня из диапазона от 0 до 999. То есть нулевой ярус — это числа с основанием степени от 0 до 99, первый ярус — числа с показателем степени от 100 до 199 и т. д. Всего ярусов десять, причём минус первый ярус эквивалентен девятому (то есть показатель степени −80 в представлении микрокалькулятора эквивалентен 920), минус второй — восьмому (например, показатель −180 эквивалентен 820) и т. д. |
|||
Документацией максимальное значение чисел, над которыми можно производить математические действия, ограничивалось значением ±9.9999999 × 10<sup>±99</sup> (то есть нулевым и минус первым ярусами). В самом деле, если ввести в микрокалькулятор число 1 × 10<sup>50</sup> (для чего достаточно последовательности нажатий клавиш {{nobr|'''1 ВП 50'''}}) и возвести его в квадрат (нажать '''Fx²'''), то получаем сообщение на дисплее «'''ЕГГОГ'''». Такая индикация по документации является признаком сообщения об ошибке, так как число 1 × 10<sup>100</sup> выходит за пределы «стандартного» диапазона. Оказывается, что это не сообщение об ошибке, а способ индикации чисел первого яруса, и с этим числом можно производить обычные операции: складывать, умножать, делить, вычислять значения функций, запоминать его в регистре памяти, вызывать из регистра. Таким же образом можно работать с числами второго яруса (например 1 × 10<sup>200</sup>, простейший способ получить такое число — возвести в квадрат число 1 × 10<sup>100</sup>). Чтобы выяснить реальные значения таких чисел, их нужно было разделить на 1 × 10<sup>99</sup> или другие подобные числа для приведения к числу из нулевого яруса (по абсолютному модулю не более 9,9999999 × 10<sup>99</sup>). |
|||
Другими словами, давался способ расширения диапазона чисел, обрабатываемых стандартными действиями, до ±9.9999999 × 10<sup>299</sup>. Также было возможно с некоторыми ухищрениями (с помощью специально написанных программ) получать числа до ±9.9999999 × 10<sup>799</sup> и анализировать их значение (то есть выяснить [[Мантисса (математика)|мантиссу]] и порядок). С помощью таких «вычислений» доказывалось, что девятый ярус представляет собой числа с отрицательным значением основания степени (например, 1 × 10<sup>920</sup> было эквивалентным представлением числа 1 × 10<sup>−80</sup>). Числа восьмого яруса (числа от ±1 × 10<sup>800</sup> до ±9.9999999 × 10<sup>899</sup> а также от ±1 × 10<sup>900</sup> до ±9.9999999 × 10<sup>900</sup>) невозможно сохранить после их получения, так как они немедленно преобразовывались в обычный нуль, независимо от того, с какой стороны к ним «подбираться» (с седьмого или девятого яруса). |
|||
=== Классификация числовых ярусов === |
|||
{| class="wikitable" |
|||
!Числовой ярус |
|||
!Название чисел |
|||
!Диапазон чисел |
|||
!Краткая характеристика числа из этого диапазона |
|||
|- |
|||
|Нулевой |
|||
|Обычные числа с неотрицательным порядком |
|||
|От ±1 до ±9.9999999 × 10<sup>99</sup> |
|||
|Можно производить обычные вычисления |
|||
|- |
|||
|Первый |
|||
|«ЕГГОГи» |
|||
|От ±1 × 10<sup>100</sup> до ±9.9999999 × 10<sup>199</sup> |
|||
|Можно производить обычные вычисления, но отображаются на дисплее как [[Файл:Еггог.svg|43px]] |
|||
|- |
|||
|Второй |
|||
|«3ГГОГи» |
|||
|От ±1 × 10<sup>200</sup> до ±9.9999999 × 10<sup>299</sup> |
|||
|Можно производить обычные вычисления, но отображаются на дисплее как [[Файл:3ггог.svg|43px]]. Выполняют безусловный переход на адрес, совпадающий с двумя первыми цифрами порядка (от 20 до 29) |
|||
|- |
|||
|Третий |
|||
|«Неукротимые чудовища» |
|||
|От ±1 × 10<sup>300</sup> до ±9.9999999 × 10<sup>399</sup> |
|||
|Способны произвольно перевести микрокалькулятор в режим исполнения программы или привести к его зависанию |
|||
|- |
|||
|Четвёртый |
|||
|«ОС-оборотни» |
|||
|От ±1 × 10<sup>400</sup> до ±9.9999999 × 10<sup>499</sup> |
|||
|Копируют в искажённом виде структуру ярусов, применяются для анализа других чисел. Искажают содержимое регистра С |
|||
|- |
|||
|Пятый |
|||
|«Тьма» |
|||
|От ±1 × 10<sup>500</sup> до ±9.9999999 × 10<sup>599</sup> |
|||
|При попытке вывода на дисплей приводят к зависанию микрокалькулятора. Индикатор гаснет, работоспособность восстанавливается после выключения и включения (в МС 1104 имелась специальная кнопка для подавления этого эффекта) |
|||
|- |
|||
|Шестой |
|||
|«С-ЕГГОГ-оборотни» |
|||
|От ±1 × 10<sup>600</sup> до ±9.9999999 × 10<sup>699</sup> |
|||
|Искажают содержимое регистра С |
|||
|- |
|||
|Седьмой |
|||
|«Длинные монстры» |
|||
|От ±1 × 10<sup>700</sup> до ±9.9999999 × 10<sup>799</sup> |
|||
|Копируют в искажённом виде структуру ярусов, применяются для анализа других чисел |
|||
|- |
|||
|Восьмой (минус второй) |
|||
|«Нули» |
|||
|От ±1 × 10<sup>800</sup> до ±9.9999999 × 10<sup>900</sup> или от ±1 × 10<sup>−200</sup> до ±9.9999999 × 10<sup>−100</sup> (зависит от способа получения) |
|||
|Немедленно преобразовывается в обычный ноль |
|||
|- |
|||
|Девятый (минус первый) |
|||
|Обычные числа с отрицательным порядком |
|||
|От ±1 × 10<sup>−99</sup> до ±9.9999999 × 10<sup>−1</sup> |
|||
|Можно производить обычные вычисления |
|||
|} |
|||
=== Подробное описание === |
|||
==== «3ГГОГи» ==== |
|||
Под этим сообщением прячутся числа от ±1 × 10<sup>200</sup> до ±9.9999999 × 10<sup>299</sup>. Над ними можно производить обычные арифметические операции. При появлении 3ГГОГа на экране десятичная точка сохраняет своё положение от предыдущего числа, а счётчик адресов программы устанавливается на адрес, равный двум первым цифрам порядка 3ГГОГа. |
|||
Любой 3ГГОГ может быть «расшифрован» командами: FАВТ, точка (справа на дисплее появляется его порядок), FАВТ (слева появляется мантисса бывшего 3ГГОГа, а справа возникает порядок --L или --3). |
|||
При вызове 3ГГОГа из регистра памяти 0-9 и последующем нажатии ВП или десятичной точки калькулятор ведёт себя несколько похожим образом, как если бы на дисплее появилось «сверхчисло» с порядком, начинающимся на номер регистра. Например, если 3ГГОГ вызван из регистра 1 — возникает сообщение ЕГГОГ; из регистра 2 — снова 3ГГОГ; из регистра 3 — в режиме программирования появляется «испорченная» команда « 3»; из регистра 4 — Тьма; из регистра 7 — «Длинный монстр». |
|||
==== «ОС-оборотни» ==== |
|||
От ±1 × 10<sup>400</sup> до ±9.9999999 × 10<sup>499</sup>. |
|||
При вытаскивании «ОС-оборотня» из регистра он заносит свой «хвост» в регистр С. «Хвост» также является сверхчислом, чьи две первые цифры порядка являются последними двумя цифрами порядка «ОС-оборотня». Если «хвост» также является «ОС-оборотнем» (это происходит для чисел с порядками с 440 по 449), то он также заносит свой «хвост» в регистр С. Существуют оборотни 3-го порядка — числа с порядком 444. |
|||
Пример: |
|||
В/О FПРГ Fx<sup>2</sup> Fx<sup>2</sup> × Fx<sup>2</sup> Х→ПС Сх С/П FАВТ В/О 1 ВП 22 В↑ 1 ВП 50 С/П <br> |
|||
П→ХС на экране 0 <br> |
|||
П→ХС на экране 0 <br> |
|||
П→ХС на экране 0 <br> |
|||
П→ХС на экране последний «Хвост» с тремя буквами Е. |
|||
==== «С-ЕГГОГ-оборотни» ==== |
|||
От ±1 × 10<sup>600</sup> до ±9.9999999 × 10<sup>699</sup>. |
|||
Если «С-ЕГГОГ-оборотня» вытащить из регистра, то он прикроется содержимым регистра C, а сам переместится в регистр Y. При выполнении над ним арифметической операции — Г.ГГОГ. |
|||
На основе свойств «С-ЕГГОГ-оборотня» придуман т. н. «'''АСО-анализ'''»: |
|||
# В регистр 0 помещаем «С-ЕГГОГ-оборотень» (можно и в другой регистр) |
|||
# В регистр А (только!) помещаем ЕГГОГ. |
|||
# П→XA П→X0 PX — содержимое регистра C — мантисса и 3-значная степень |
|||
# /−/ — содержимое P0 |
|||
Меры предосторожности при работе с «С-ЕГГОГ-оборотнями»: |
|||
# «Тьма» наступает: |
|||
#* если после «АСО-анализа» нажать ВП, FАВТ |
|||
#* если сразу после формирования ЕГГОГА вытащить «С-ЕГГОГ-оборотня» |
|||
#* если вытащить «С-ЕГГОГ-оборотня» при «ПСЧ-режиме» |
|||
#* если «С-ЕГГОГ-оборотень» вытаскивает из регистра C сам себя |
|||
==== «Длинные монстры» ==== |
|||
Другое название — «К-числа». |
|||
От ±1 × 10<sup>700</sup> до ±9.9999999 × 10<sup>799</sup>. |
|||
На индикаторе при появлении «Длинного монстра» появляется следующее число: |
|||
'''1,2345678{{e|735}}''' = '''[50.12345678 3]''' Где первая цифра 5 на индикаторе — это третья цифра порядка, а последняя цифра 3 на индикаторе — вторая цифра порядка. А сам «Длинный монстр» записывается на '''73''' адрес программы, что соответствует первым двум цифрам порядка числа. |
|||
== Недокументированные команды == |
|||
=== Команды «со стре́лками» в [[Б3-34]] === |
|||
На микрокалькуляторе [[Б3-34]] (и совместимых с ним [[МК-54]], [[МК-56]]) во всех регистровых командах вместо клавиши номера (буквы) регистра можно использовать клавишу '''↑''', то есть доступны недокументированные команды '''ИП↑''', '''П↑''', '''КИП↑''', '''КП↑''', '''Kx≠0↑''', '''Kx≥0↑''', '''Кх<0↑''', '''Kx=0↑''', '''КБП↑''', '''КПП↑'''. При вводе этих команд в режиме программирования формируются коды, заканчивающиеся на E. При выполнении таких команд фактически происходит обращение к регистру 0; команды прямого обращения к регистру полностью аналогичны '''ИП0''' и '''П0''', но остальные команды, которые обеспечивают косвенный доступ к регистру 0, имеют важное отличие от соответствующих команд '''КИП0''', '''КП0''' и других: они не уменьшают значения регистра 0 при обращении. Это даёт возможность косвенного обращения к регистру 0 двумя способами: с уменьшением и без уменьшения значения в регистре. |
|||
Использование «команд со стрелками» упрощает обход регистров в цикле, позволяя использовать значение в регистре 0 одновременно и как счётчик цикла, и как индекс регистра. Например, простейшая программа суммирования значений в регистрах 1-N (предполагается, что данные записаны в регистры, а N вводится в регистр X перед запуском программы) выглядит так: |
|||
* '''П0 0 КИП↑ + FL0 02 С/П''' (данные в регистрах от 1 до N) — 7 команд. |
|||
Вариант без «команд со стрелками»: |
|||
* '''П0 0 ИП0 ПE F⟳ КИПE + FL0 02 С/П''' — 10 команд; |
|||
* '''П0 2 + П1 0 КИП1 + FL0 05 С/П''' (данные в регистрах от 2 до N+1) — 10 команд и два дополнительных регистра (несколько быстрее). |
|||
Команды косвенных переходов «со стрелками» позволяют хранить адрес перехода в регистре 0 и выполнять переходы на него без модификации содержимого. Так как команда косвенного перехода занимает один шаг программы, а обычная команда перехода — два, запись адреса в регистр позволяет выиграть по одному шагу программы для каждого перехода на этот адрес. |
|||
У калькуляторов [[МК-61]] и [[МК-52]] клавиша «'''↑'''» соответствует новому регистру памяти E, а коды операций с регистром E соответствуют кодам «команд со стрелками» Б3-34, так что на этих калькуляторах «команды со стрелками» недоступны<ref name="nij-1989-11">Школа начинающего программиста. Занятие двадцать шестое. — «[[Наука и жизнь]]», 1989, № 11, с. 124—130</ref> (см. табл.). Обозначениям клавиш '''П''', '''ИП''' и '''↑''' в Б3-34 соответствуют '''Х→П''', '''П→Х''' и '''Е''' в МК-61 и МК-52. |
|||
{| class="wikitable" |
|||
!Коды команд |
|||
!Команды Б3-34 |
|||
!Команды МК-61, МК-52 |
|||
|- |
|||
|7E |
|||
|Kx≠0↑ |
|||
|Kx≠0E |
|||
|- |
|||
|8E |
|||
|КБП↑ |
|||
|КБПЕ |
|||
|- |
|||
|9E |
|||
|Kx≥0↑ |
|||
|Kx≥0E |
|||
|- |
|||
| -E |
|||
|КПП↑ |
|||
|КППЕ |
|||
|- |
|||
|LE |
|||
|КП↑ |
|||
|КX→ПЕ |
|||
|- |
|||
|CE |
|||
|Кх<0↑ |
|||
|Kx<0E |
|||
|- |
|||
|ГE |
|||
|КИП↑ |
|||
|КП→ХЕ |
|||
|- |
|||
|EE |
|||
|Kx=0↑ |
|||
|Kx=0E |
|||
|} |
|||
Недоступность «команд со стрелками» в моделях МК-61/МК-52 создаёт сложности при адаптации программ от Б3-34, использующих эти команды. Для команд косвенных переходов проблема решается просто: нужный адрес записывается в регистр E, который в программах для Б3-34 не используется, и команды «со стрелками» меняются на команды с указанием регистра E. Но для команд КИП↑/КП↑ ситуация намного сложнее: удаление каждой из них увеличивает размер программы минимум на 3 шага, из-за чего программной памяти может не хватить. В новых моделях МК-152/МК-161 доступны новые двухшаговые регистровые команды косвенного обращения РКИП00/РКП00, работающие так же, как КИП↑/КП↑ в Б3-34; каждая такая команда увеличивает программу только на один шаг, а гораздо бо́льшая программная память новых калькуляторов делает это увеличение практически несущественным. |
|||
=== Некорректные операции с клавишей К === |
|||
На микрокалькуляторе [[Б3-34]] большинство недокументированных операций с клавишей К вызывает сообщение ЕГГОГ. Это команды К3—К9, К+, К−, К×, К÷, <math>\mathrm{K\underset{\rightarrow}{\overset{\leftarrow}{XY}}}</math>, К↑, К/−/, КВП, КСх и К десятичная запятая. Команды К1 и К2 эквивалентны операции КНОП. |
|||
На [[МК-61]] и [[МК-52]] к сообщению ЕГГОГ приводят только команды К−, К×, К÷. Команды К1 и К2 также эквивалентны операции КНОП. Коды остальных команд документированы и используются для преобразования временны́х и угловых мер, определения модуля и знака числа, целой и дробной частей числа, бо́льшего из двух чисел, логических операций и генерации случайного числа. |
|||
Некорректной операцией на МК-61 и МК-52 является также перевод минут (секунд) в градусы <math>\mathrm K \overrightarrow{_{\circ\,\prime}}</math> и <math>\mathrm K \overrightarrow{_{\circ\,\prime\,\prime\prime}}</math>, если величина минут или секунд более или равна 60. |
|||
Сообщение ЕГГОГ, полученное с помощью некорректных операций с клавишей К, не является «сверхчислом» первого «яруса» и не может быть сохранено в регистре памяти, но может быть использовано для вывода на индикатор символов 16-ричных цифр, например: |
|||
1 К− (высвечивается ЕГГОГ) ВП ВП ↑ (высвечивается буква Е). |
|||
Полученную букву Е можно сохранять в регистрах памяти и извлекать оттуда, а с помощью регистров 0—3 также и преобразовывать в символы других 16-ричных цифр: |
|||
П0 КИП0 ИП0 КНОП (Г) КИП0 ИП0 КНОП (С) КИП0 ИП0 КНОП (L) КИП0 ИП0 КНОП (-) КИП0 ИП0 КНОП (9) и т. д. |
|||
Подобные приёмы использовались для формирования видеосообщений, например, в игровых программах. |
|||
Получение видеосообщения, начинающегося с цифры F (изображается как пустое место) может нарушить нормальную работу микрокалькулятора (искажение программы и данных, самопроизвольный переход в режим счёта и т. п.). Избежать этого можно, сразу же «изгнав» его {{nobr|командой ↑}}, подаваемой не менее четырёх раз<ref name="nij-1989-11"/> (по другим данным — семь раз<ref>«Техника — молодёжи». 1986, № 7.</ref>), не пытаясь проводить какие-либо другие операции. |
|||
=== Искусственный ввод кодов команд === |
|||
В одном шаге программной памяти микрокалькулятора могут содержаться две шестнадцатеричные цифры, то есть теоретически может существовать 256 различных кодов команд. Из них в руководстве пользователя МК-61/52 документированы 214. Существует искусственный приём, позволяющий ввести 12 из 42 недокументированных кодов. Для этого вводится одна из команд переходов, например БП (код 51) и за ней две 16-ричные цифры, воспринимаемые калькулятором как адрес перехода. После этого команда перехода затирается командой-«пустышкой» КНОП, а последующий шаг при выполнении программы будет воспринят калькулятором уже не как адрес перехода, а как команда<ref name="alfredklomp">Alfred Klomp. Some experiments with hacking the ЭЛЕКТРОНИКА МК-61. — http://www.alfredklomp.com/technology/mk-61/ {{Wayback|url=http://www.alfredklomp.com/technology/mk-61/ |date=20081028120117 }}</ref>. Некоторые из этих кодов можно ввести также путём недокументированных операций с клавишей К, описанных в предыдущем подразделе. |
|||
{| class="wikitable" |
|||
!Коды команд |
|||
!Действия команд |
|||
!Ввод через клавишу К |
|||
|- |
|||
|27 |
|||
|Вызывает сообщение ЕГГОГ |
|||
|K− |
|||
|- |
|||
|28 |
|||
|Вызывает сообщение ЕГГОГ |
|||
|К× |
|||
|- |
|||
|29 |
|||
|Вызывает сообщение ЕГГОГ |
|||
|K÷ |
|||
|- |
|||
|2L |
|||
|Вызывает сообщение ЕГГОГ |
|||
|Нет |
|||
|- |
|||
|2С |
|||
|Вызывает сообщение ЕГГОГ |
|||
|Нет |
|||
|- |
|||
|2Г |
|||
|Вызывает сообщение ЕГГОГ |
|||
|Нет |
|||
|- |
|||
|2E |
|||
|Вызывает сообщение ЕГГОГ |
|||
|Нет |
|||
|- |
|||
|3С |
|||
|Вызывает сообщение ЕГГОГ |
|||
|Нет |
|||
|- |
|||
|3Г |
|||
|Копирует содержимое регистра Х в Х1. Содержимое регистров X, Y, Z и Т сохраняется. |
|||
|Нет |
|||
|- |
|||
|3Е |
|||
|Перемещает содержимое регистра Х в Х1, копирует содержимое регистра Y в Х. |
|||
Содержимое регистров Y, Z и Т сохраняется. |
|||
|Нет |
|||
|- |
|||
|55 |
|||
|Ничего не делает (равнозначна команде КНОП) |
|||
|К1 |
|||
|- |
|||
|56 |
|||
|Ничего не делает (равнозначна команде КНОП) |
|||
|К2 |
|||
|} |
|||
Коды 55 и 56 использовались во входных языках малосерийных аналогов МК-52<ref>Программируемые микрокалькуляторы: устройство и пользование / Под ред. Я. К. Трохименко. — М.: Радио и связь, 1990. — c. 123—124.</ref>. |
|||
Данный приём неприменим для ввода остальных 30 недокументированных кодов команд, содержащих 16-ричную цифру F (изображаемую на индикаторе как пустое знакоместо), поскольку на клавиатуре микрокалькулятора нет клавиши для ввода цифры F (не путать с префиксной клавишей F). Некоторые способы ввода таких кодов будут рассмотрены в следующем подразделе. |
|||
=== Ввод кодов команд, содержащих цифру F === |
|||
В микрокалькуляторе [[МК-52]] существует возможность формирования любого из 256 кодов команд по любому из адресов программной памяти. Для этого используется следующая особенность записи программ в ППЗУ. При нормальном процессе записи программы необходимо сначала стереть соответствующий участок памяти ППЗУ. Если же этого не сделать, то происходит побитовое логическое сложение кодов команд из ОЗУ с кодами, имевшимися в ППЗУ ранее<ref name="nij-1989-01">Школа начинающего программиста. Занятие двадцать второе. — «Наука и жизнь», 1989, № 1, с. 124—129.</ref>. Так, если в ППЗУ по некоторому адресу записана команда БП (код 51), а по соответствующему адресу в ОЗУ находится команда В↑ (код 0Е), то результатом логического сложения будет команда с кодом 5F (которая приводит к зависанию микрокалькулятора). Действия команд с кодами, содержащими цифру F, приведены в следующей таблице: |
|||
{| class="wikitable" |
|||
!Коды команд |
|||
!Действия команд |
|||
|- |
|||
|0F |
|||
|Документированная команда FBx |
|||
|- |
|||
|1F, 2F, 3F |
|||
|Ничего не делают (равнозначны команде КНОП) |
|||
|- |
|||
|4F |
|||
|Равнозначна команде X→П0 (код 40) |
|||
|- |
|||
|5F |
|||
|Приводит к зависанию микрокалькулятора. Индикатор гаснет, работоспособность восстанавливается после отключения и включения питания. |
|||
|- |
|||
|6F |
|||
|Равнозначна команде П→Х0 (код 60) |
|||
|- |
|||
|7F |
|||
|Равнозначна команде Кх≠00 (код 70) |
|||
|- |
|||
|8F |
|||
|Равнозначна команде КБП0 (код 80) |
|||
|- |
|||
|9F |
|||
|Равнозначна команде Кх≥00 (код 90) |
|||
|- |
|||
| -F |
|||
|Равнозначна команде КПП0 (код -0) |
|||
|- |
|||
|LF |
|||
|Равнозначна команде КХ→П0 (код L0) |
|||
|- |
|||
|CF |
|||
|Равнозначна команде Кх<00 (код С0) |
|||
|- |
|||
|ГF |
|||
|Равнозначна команде КП→Х0 (код Г0) |
|||
|- |
|||
|EF |
|||
|Равнозначна команде Кх=00 (код Е0) |
|||
|- |
|||
|F0, F1, ... FF |
|||
|Ничего не делают (равнозначны команде КНОП) |
|||
|} |
|||
К сожалению, недокументированные команды 7F, 8F, … EF, осуществляющие косвенный доступ к регистру 0, уменьшают его содержимое, так же как и их документированные аналоги с кодами 70, 80, … Е0 и не могут служить заменой командам «со стрелками» в [[Б3-34]]. |
|||
В [[Б3-34]] и [[МК-61]], не имеющих ППЗУ, также существует возможность ввода некоторых команд с кодами, содержащими цифру F, но лишь по нескольким фиксированным адресам. Один способ состоит в использовании команд В/0 КПП''N'' в режиме ручных вычислений (F АВТ), ''N'' — любой из регистров (0—9, А—Е). При этом микрокалькулятор переходит в режим программирования и вставляет код F''N'' по адресу 30+''N'' (для буквенных регистров А—Е соответственно 40—44). Заметим, что при использовании регистров 0—6 результат зависит от их содержимого<ref name="tm-1986-05">«Техника — молодёжи», 1986, № 5, с. 52.</ref> Другой способ (проверенный его автором только на МК-61<ref name="alfredklomp"/>) использует воздействие некорректной операции «ВП десятичная запятая» на «сверхчисла» первого «яруса» (ЕГГОГи). Для этого сначала создаётся «сверхчисло» двукратным применением команды ВП с суммой порядков более 99 (например, ВП 10 ВП 90), а затем, после появления сигнала ЕГГОГ, нажатием клавиш «ВП десятичная запятая 0». Это также переводит микрокалькулятор в режим программирования, и в данном примере по адресу 51 будет записана команда F1. Второй знак и адреса, и команды определяется первым знаком порядка в первой команде ВП (например, ВП 20 ВП 80 ВП .0 даёт команду F2 по адресу 52 и т. д.) |
|||
=== Недокументированное применение десятичной запятой в программе === |
|||
Команда «десятичная запятая» (код 0-), использованная в программе (за исключением случаев документированного применения — для ввода числа по программе знак за знаком), заменяет значение в регистре Х на то, которое было в нём после последней из команд 0, 1, … 9, В↑, П→Х0, П→Х1, … П→Х9, П→ХА, … П→ХЕ<ref name="nij-1989-04">«Наука и жизнь», 1989, № 4, с. 112.</ref>. |
|||
=== Недокументированные способы диагностики ошибок === |
|||
При возникновении сигнала ЕГГОГ при счёте по программе существует два недокументированных способа определить, в результате какой операции произошёл останов<ref name="nij-1989-11"/>: |
|||
# Нажатие клавиши ↑ в Б3-34 (В↑ в МК-61/52). Если на индикаторе по-прежнему ЕГГОГ, то произошло переполнение, а если число — некорректная операция, «виновником» которой является это число. |
|||
# Нажатие клавиши ВП. Возможные показания индикатора и соответствующие им ошибки: |
|||
#* «ЕГГОГ 00» — переполнение («сверхчисло» первого «яруса») |
|||
#* «Г.ГГОГ 00» — деление на нуль, вычисление логарифма от нуля, степенной функции 0<sup>0</sup>, некорректная операция с клавишей К. |
|||
#* «ЕГ.ГОГ 00» — вычисление tg 90°. |
|||
#* «Е.ГГОГ 00» — вычисление арксинуса или арккосинуса от числа, большего 1. |
|||
#* «ЕГГОГ 00» (с десятичной запятой на том же месте, что в аргументе) — положительный аргумент показательной функции больше допустимого |
|||
#* «−ЕГГОГ 00» (с десятичной запятой на том же месте, что в аргументе) — отрицательный аргумент показательной функции по модулю больше допустимого, или извлечение квадратного корня из отрицательного числа. |
|||
Второй способ не работает после первого, и наоборот. Чтобы применить обе диагностики, необходимо дважды запустить программу с одинаковыми исходными данными. В режиме ручных вычислений это также работает, но обычно не требуется, поскольку и так ясно, в результате какой операции возникла ошибка. |
|||
=== Команда В/0 вне подпрограммы === |
|||
Команда В/0, предназначенная для завершения подпрограмм, при использовании в основной программе, как правило, осуществляет переход на адрес 01. Этим иногда пользуются для сокращения программы, заменяя две команды БП 01 одной В/0. Особенно часто эта особенность используется при нестандартном использовании адресного пространства программы (см. [[#Главная и побочные ветви|Главная и побочные ветви]]). Однако иногда использование этой особенности приводит к неправильному результату. |
|||
Причина этой особенности в том, что адреса, с которых вызываются подпрограммы, записываются в пятирегистровый стек возврата, а по команде В/0 извлекаются из него и происходит возврат на адрес, на единицу больший. Если в стек возврата ничего не было записано, в нём хранятся нули и по команде В/0 происходит переход на адрес 01. То же самое произойдёт, если в стек возврата заносилось не более четырёх адресов при вызовах подпрограмм и все они были извлечены при возвратах — следующий извлекаемый адрес будет нулём. |
|||
Однако если в стек возврата занесено пять адресов, при извлечении первого из них в последнем регистре формируется «адрес-диверсант», обе цифры которого совпадают с последней цифрой адреса, находившегося там ранее. По мере извлечения остальных адресов из стека возврата, «адрес-диверсант» заполняет все его регистры, и затем, в случае использования команды В/0 вне подпрограммы, переход будет осуществлён неправильно<ref name="nij-1989-11"/>. |
|||
Очистить стек возврата можно с помощью ЗГГОГа с нулевой мантиссой: '''Сх В↑ ÷ ВП Fх<sup>2</sup> Сх ↔ Сх''' |
|||
=== Косвенное обращение к регистру, содержащему число вне допустимого диапазона === |
|||
Если в каком-либо из регистров 7—Е находится число, по модулю меньшее единицы, то при косвенном обращении к нему формируется адрес перехода, определяемый мантиссой и последней цифрой порядка<ref name="nij-1989-11"/> (см. табл., М<sub>''N''</sub> — ''N''-я цифра мантиссы) |
|||
{| class="wikitable" |
|||
! Последняя цифра порядка |
|||
! Адрес перехода при отрицательных порядках |
|||
!Адрес перехода при положительных порядках |
|||
|- |
|||
| 1 |
|||
| М<sub>7</sub>М<sub>8</sub> |
|||
|М<sub>1</sub>М<sub>2</sub> |
|||
|- |
|||
| 2 |
|||
| М<sub>7</sub>М<sub>8</sub> |
|||
|М<sub>2</sub>М<sub>3</sub> |
|||
|- |
|||
| 3 |
|||
| М<sub>7</sub>М<sub>8</sub> |
|||
|М<sub>2</sub>М<sub>3</sub> |
|||
|- |
|||
| 4 |
|||
| М<sub>6</sub>М<sub>7</sub> |
|||
|М<sub>4</sub>М<sub>5</sub> |
|||
|- |
|||
| 5 |
|||
| М<sub>5</sub>М<sub>6</sub> |
|||
|М<sub>5</sub>М<sub>6</sub> |
|||
|- |
|||
| 6 |
|||
| М<sub>4</sub>М<sub>5</sub> |
|||
|М<sub>6</sub>М<sub>7</sub> |
|||
|- |
|||
| 7 |
|||
| М<sub>2</sub>М<sub>3</sub> |
|||
|М<sub>7</sub>М<sub>8</sub> |
|||
|- |
|||
| 8 |
|||
| М<sub>2</sub>М<sub>3</sub> |
|||
|М<sub>7</sub>М<sub>8</sub> |
|||
|- |
|||
| 9 |
|||
| М<sub>1</sub>М<sub>2</sub> |
|||
|М<sub>7</sub>М<sub>8</sub> |
|||
|- |
|||
| 0 |
|||
| 0М<sub>1</sub> |
|||
|0М<sub>1</sub> |
|||
|} |
|||
{{В планах|элемент=подраздел|посвящён=другим недокументированным случаям косвенного обращения к регистрам|дата=2016-11-30}} |
|||
=== ПСЧ-режим === |
|||
«Псевдосчётный режим» — методика формирования на экране микрокалькулятора произвольных буквенно-цифровых комбинаций, т. н. «слов». Основан на переводе ПМК в особый режим работы, в котором происходит считывание на индикатор записанных в программной памяти кодов (вернее, их первых символов). Описан в заметке «Новости еггогологии» «Техники — молодёжи» № 6 за 1987 год<ref name="tm-1987-06">Новости еггогологии. «Техника — молодёжи», 1987, № 6, с.54.</ref>. В этой статье первооткрывателями ПСЧ-режима названы С. Банников, И. Емельянов, Б. Мурадов. Также приведены альтернативные названия режима — «ненормальный», «режим сбора». |
|||
Перед вводом ПМК в ПСЧ-режим в память записывается короткая программа, коды команд которой начинаются со всех возможных символов (для удобства обычно используются сдвоенные символы вида '''00''', '''11''', … , '''EE'''). |
|||
Для входа в ПСЧ-режим в статье предлагается следующая последовательность команд: '''6 F10<sup>x</sup> K- ВП . 0 В/О В/О БП В/О'''. Данная процедура по сути представляет собой способ получения команды «пусто-пусто». Также редакторы упоминают, что существует более сложный способ входа в ПСЧ-режим из области «длинных монстров». |
|||
В ПСЧ-режиме меняются значения клавиш. '''В/О''' и '''С/П''' служат теперь для переключения из автономного режима в программный и наоборот. Команды '''FПРГ''' и '''FАВТ''', а также любое «сверхчисло» возвращают ПМК в нормальный режим работы. Клавиши '''ШГ''' дают возможность перемещаться вдоль записанной в память программы. Клавиши '''БП''' и '''ПП''' переносят точку просмотра и считывания на 10 адресов вглубь программы, а также позволяют оперировать с числом на индикаторе непосредственно кодами команд. |
|||
Клавиша '''ВП''' считывает в первый регистр индикатора символ из текущего адреса программной памяти. Формирование «слов» начинается с заготовки вида '''11111111''', из соответствующей ячейки программной памяти считывается нужный символ, а затем с помощью команд '''ВП /-/ 1 ПА КИПА ИПА''' от заготовки отбрасывается последний регистр, а на место первого записывается ноль, который с помощью команды '''ВП''' может быть заменён следующим символом.{{Нет АИ|25|9|2017}} |
|||
Метод позволяет вводить в буквенно-цифровые комбинации и пробел (пустышку). Пробел считывается из любого адреса «тёмной зоны». Однако из-за особенностей работы ПМК после появления «пустышки» при этом необходимы дополнительные действия (прочистка стека, усложнённая последовательность команд для укорочения заготовки, соблюдение ограничений на использование клавиш '''ШГ'''). |
|||
Для входа в ПСЧ-режим, технически, может быть использована любая буквенно-цифровая заготовка, содержащая от 6 до 8 знаков и начинающаяся символом Г, Е или «пусто», другие начальные символы при нажатии клавиш «ВП-точка» выдадут ошибку. После команд '''ВП-точка-цифра''' калькулятор уже находится в ПСЧ-режиме с активированной клавишей '''К''' — это можно проверить, нажав '''0''' (для деактивации клавиши К), затем '''В/О''' и '''С/П''' -— они уже будут работать по-новому. Но использование ПСЧ-режима затруднено тем, что при входе в него исходная буквенно-цифровая заготовка записывается в стек возврата начиная с 3-го разряда, и при каждом нажатии В/О или БП происходит «возврат» по адресу, взятому из этого стека (команда В/О дополнительно прибавляет к нему 1). Если по команде В/О произошёл возврат на адрес «тёмной зоны», то калькулятор выходит из ПСЧ-режима. Поэтому в момент извлечения из стека адреса Е0 вместо В/О нужно нажать БП. Пример: |
|||
(Е000000.) '''ВП точка 0''' (00 0.0 51) '''0''' (Е000000.) '''В/О''' (00 00 0.0 61) '''В/О''' (.Е.1.) '''В/О''' (.Е.2.) '''С/П''' (.Е.3.) — произошёл выход из ПСЧ-режима в режим программирования. |
|||
(Е000000.) '''ВП точка 0''' (00 0.0 51) '''0''' (Е000000.) '''В/О''' (00 00 0.0 61) '''БП''' (00 00 0.0 Е0) '''В/О''' (00 . 01) '''В/О''' (00 . 01) '''С/П''' (Е000000.) — калькулятор остался в ПСЧ-режиме, стек возврата очищен. |
|||
(Е89-LCГ.) '''ВП точка 0''' (00 0.0 51) '''0''' (Е89-LCГ.) '''БП''' (00 00 0.0 60) '''БП''' (00 00 0.0 Е8) '''БП''' (экран гаснет) — переход по адресу «9-» привёл к зависанию ПМК. |
|||
=== Недокументированные особенности команды ВП === |
|||
Команда ВП превращает 0 в 1 (при этом в стеке меняется только значение регистра Х, остальные регистры стека сохраняют свои значения). Это используется в программе вычисления факториала для её сокращения, заменяя несколько команд (условный переход, его адрес, ввод единицы) одной командой ВП<ref name="fink">Л. М. Финк. Папа, мама, я и микрокалькулятор. — М.: Радио и связь, 1988. — с. 71.</ref>. |
|||
Кроме того команда ВП является единственной командой (как на МК-54, так и на МК-61), которая правильно ведёт себя в ручном и пошаговом (!) режимах, но при этом может вести себя неправильно в автоматическом режиме. Данный нюанс вводит в ступор новичков (так как в пошаговом режиме команда работает правильно, а потому найти ошибку в программе не удаётся), и исправить ошибку удаётся лишь за счёт замены команд «число», ВП на команды '''«число», F10<sup>Х</sup>, «х»''' ,но для этого требует лишний шаг. |
|||
Команда '''ВП .''' (десятичная запятая), выполненная над любым числом, кроме комбинаций, начинающихся на Е или Г, немедленно выводит ЕГГОГ, и если в памяти есть место на две команды, значительно быстрее других методов искусственного вывода ЕГГОГ — некорректных операций и К−, которые вызывают паузу около 3 секунд. Обычный «долгий» ЕГГОГ пропускает одну команду, а мгновенный (ВП .) — нет. |
|||
{{В планах|элемент=подраздел|посвящён=другим недокументированным особенностям команды ВП|дата=2016-11-30}} |
|||
== Главная и побочные ветви == |
|||
В советских программируемых калькуляторах Электроника [[Б3-34]], [[МК-54]], [[МК-56]], [[МК-61]], [[МК-52]] (и аналогичных) физической оперативной памяти столько, сколько заявлено в руководстве к ПМК, но из-за особенностей аппаратной реализации существует виртуальный 160-шаговый цикл<ref>В инструкциях к ПМК о 160-шаговом цикле ничего не сказано.</ref>, состоящий из 3 ветвей: «главной», «короткой побочной» и «длинной побочной»<ref name="tm-1986-02">«[[Техника — молодёжи]]», 1986, № 2, стр. 56.</ref>. |
|||
'''Главная ветвь''' — это то, что в характеристиках калькулятора указывается как «Количество шагов программы». В семействе Б3-34 главная ветвь занимает 98 шагов — адреса с «00» по «97», в [[МК-61]] и [[МК-52]] 105 шагов — с «00» по «104» (на экране отображается как «−4»). Если калькулятор в конце главной ветви не встретил команд В/О, С/П или БП, то счётчик шагов продолжает увеличиваться, и калькулятор переходит в диапазон короткой побочной ветви. |
|||
'''Короткая побочная ветвь''' занимает 14 шагов программы — с адреса «98» по «L1» ([[МК-61]] и [[МК-52]]: 7 шагов с адреса «−5» по «L1»). Эти адреса соответствуют реальным адресам «00» — «13» ([[МК-61]] и [[МК-52]]: «00» — «06»). Если в этих адресах калькулятор не встретил команд В/О, С/П или БП, то счётчик шагов продолжает увеличиваться, и калькулятор переходит в диапазон длинной побочной ветви. |
|||
'''Длинная побочная ветвь''' занимает 48 шагов программы — с адреса «L2» по «F9». Эти адреса соответствуют реальным адресам «00» — «47»). Если в этих адресах калькулятор не встретил команд В/О, С/П или БП, то счётчик шагов продолжает увеличиваться, и калькулятор переходит в главную ветвь. В длинной побочной ветви с адреса «C1» начинается «тёмная зона»: коды команд, записанные в соответствующие адреса главной ветви, при переходе в режим ПРГ на индикатор не выводятся, однако в режиме счёта исправно выполняются. |
|||
Графически этот процесс выглядит так (на примере [[МК-52]]): |
|||
[[Файл:PMK Memmory branch.png|Ветви программной памяти калькулятора МК-52]] |
|||
Данная недокументированная особенность не позволяла писать программы длиннее документированного объёма, зато позволяла дважды избежать команд безусловного перехода на нулевой адрес (иногда по нулевому адресу ставилась команда В/О). |
|||
== Ошибки в микрокалькуляторах == |
|||
Кроме недокументированных возможностей, некоторые микрокалькуляторы содержали ошибки. |
|||
=== Ошибки в Б3-21 некоторых выпусков === |
|||
В первых выпусках микрокалькулятора [[Б3-21]] возникала ошибка при сложении числа, содержащего семь девяток в мантиссе и цифру более 4 в восьмом (неиндицируемом) разряде мантиссы, с бо́льшим по порядку числом; например, при сложении 9,9999999 и 10 получалось 120. |
|||
Также в некоторых Б3-21 при вычислении сложных операций (например, синуса) могло исказиться содержимое одного из регистров кольцевого стека. |
|||
Некоторые Б3-21 неправильно выполняли оператор вызова подпрограммы ПП, если он находился по одному из адресов 55, 65, 70, 80, 91 или 92. Вместо перехода к подпрограмме в них выполнялся оператор, код которого равен адресу подпрограммы<ref>Сергей Фролов. История советских калькуляторов. Часть II. — iNFUSED BYTES OnLine, http://www.enlight.ru/ib/also/calcs/calcs2.htm {{Wayback|url=http://www.enlight.ru/ib/also/calcs/calcs2.htm |date=20120717031255 }}</ref>. |
|||
=== Ошибки в Б3-34 некоторых выпусков === |
|||
В некоторых микрокалькуляторах [[Б3-34]] операция возведения в степень Fx<sup>y</sup> выполнялась с ошибкой, если предыдущая операция была двухместной (кроме возведения в степень) и в её результате получилось число, имеющее в восьмом разряде мантиссы цифру 5 или 7. Этой ошибки можно избежать, если перед выполнением операции Fx<sup>y</sup> нажать дополнительно клавиши F1/x F1/x<ref>«Наука и жизнь», 1984, № 2, с. 66.</ref> (что заменяет результат двухместной операции таким же результатом одноместной, на котором эта ошибка не возникает). Другие «взаимоисключающие» операции (например, Fx<sup>2</sup> F√ или Fe<sup>х</sup> Fln) для этой цели менее пригодны, так как могут привести к переполнению. |
|||
В ранних выпусках микрокалькуляторов нельзя было заканчивать подпрограмму командами одноместных операций Fsin, Flg, F√ и др., а также производить смену знака ''результата'' вычислений клавишей /−/<ref>В. П. Дьяконов. Справочник по расчётам на микрокалькуляторах. 3-е изд., доп. и перераб. — М.: Наука, Гл. ред. физ.-мат. лит., 1989. — с. 41.</ref>. |
|||
=== Ошибки в МК-61 и МК-52 === |
|||
Операция Kmax считает ноль самым большим числом. Эта ошибка использовалась в некоторых программах<ref name="nij-1988-11">«Наука и жизнь», 1988, № 11, с. 84—85.</ref>. |
|||
При некоторых операциях, например, определении дробной части отрицательного числа, возникает «отрицательный нуль» (изображается на индикаторе как «−0»), который при условных переходах ведёт себя как отрицательное число<ref name="nij-1988-11" />. |
|||
=== Ошибки и нерациональные решения в блоках расширения памяти БРП-3 и БРП-4 === |
|||
В блоке БРП-3, программе 16 использована неправильная формула <math>x^z = e^z \ln x</math> вместо <math>x^z = e^{z \ln x}</math>, соответственно неправильно составлена и программа. Там же для определения аргумента комплексного числа <math>a+bi</math> используется формула <math>\phi = \operatorname{arctg}(b/a)</math> без учёта как знаков <math>a</math> и <math>b</math>, так и того, что действительная часть может быть нулём. В результате при <math>a < 0</math> происходит ошибка в определении аргумента на 180°, а при <math>a = 0</math> — останов деления на нуль<ref>Вам привет от БРП. — «Наука и жизнь», 1990, № 10, с. 115.</ref>. |
|||
В блоке БРП-4 в «лунолётной» игровой программе «Космическая посадка» физическая модель ошибочна, что может приводить к бессмысленным результатам. Например, при свободном падении космического аппарата на Луну с большой высоты глубина кратера может составлять менее 8 мм, хотя скорость в момент соприкосновения с лунной поверхностью превышает 3000 м/с. В том же блоке микрокалькулятор «нарушает правила» в игровых программах «Жизнь» и «Магараджа». Целый ряд программ составлен нерационально и поддаётся значительным сокращениям. Например, программа для отыскания минимальной поверхности <math>S_\text{min}</math> или минимальной длины сварных швов <math>L_\text{min}</math> цилиндрической банки заданного объёма <math>V</math> может быть сокращена на 15 шагов при использовании более простых формул<ref>И второй том… комом. — «Наука и жизнь», 1991, № 6, с. 130—131.</ref>. |
|||
== См. также == |
|||
* [[Недокументированные возможности]] |
|||
* [[Нечисло]] |
|||
== Примечания == |
|||
{{примечания|2}} |
|||
== Ссылки == |
|||
* {{cite web| author =Сергей Фролов.| authorlink =| datepublished =| url =http://www.leningrad.su/b334/b334.htm| title =Электроника Б3-34: микрокалькулятор-загадка| format =| work =Sergei Frolov's home page| publisher =| accessdate =2012-07-05| lang =| description =}} |
|||
* {{cite web| author =Сергей Фролов.| authorlink =| datepublished =1998-09-26| url =http://www.enlight.ru/ib/also/calcs/calcs2.htm| title =История советских калькуляторов. Часть II| format =| work =iNFUSED BYTES e-magazine| publisher =| accessdate =2012-07-05| lang =| description =}}{{неавторитетный источник}} |
|||
* {{cite web |
|||
| author = Сергей Анваров. |
|||
| authorlink = |
|||
| datepublished = 2021-07-07 |
|||
| url = https://sergeanvarov.github.io/russian/mk61/%D0%9D%D0%B5%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%9F%D0%9C%D0%9A%20%D0%9C%D0%9A-61.html |
|||
| title = Недокументированные возможности программируемого микрокалькулятора МК-61 |
|||
| work = |
|||
| publisher = |
|||
| accessdate = 2021-08-17 |
|||
| lang = |
|||
| description = Подробное описание недокументированных возможностей ПМК 61 |
|||
}} |
|||
[[Категория:Советские программируемые микрокалькуляторы]] |
|||
[[Категория:Ошибки]] |
|||
[[Категория:Компьютерный юмор]] |
Текущая версия от 17:23, 7 октября 2024
Стиль этой статьи неэнциклопедичен или нарушает нормы литературного русского языка. |
Еггоголо́гия — изучение недокументированных возможностей микрокалькуляторов.
Происхождение
[править | править код]Название впервые возникло в СССР и носит шуточный характер. Предположительно происходит от сообщения об ошибке «ЕГГОГ» (англ. Error — ошибка), которую выдавали программируемые микрокалькуляторы второго поколения советского производства (Электроника Б3-34, МК-54, МК-56, МК-61, МК-52, МС 1104) на семисегментных индикаторах. Термин впервые появился в журнале «Техника — молодёжи» после цикла статей М. Пухова, посвящённых программированию на микрокалькуляторах серии «Электроника Б3-34»[1], и серии из девяти рассказов о фантастическом путешествии с Луны на Землю под общим названием «„Кон-Тики“: путь к Земле»[2]. В этом цикле, кроме игровых программ, описывались различные недокументированные возможности микрокалькуляторов и видеосообщения, многие из которых получались путём манипуляций с клавишами после появления сообщения об ошибке «ЕГГОГ» ().
Читатели журнала с огромным энтузиазмом откликнулись на рассказ об обнаруженных недокументированных возможностях микрокалькуляторов, стали искать новые, и по окончании цикла «Кон-Тики…» появился небольшой раздел «Новости еггогологии». С помощью опубликованных в нём недокументированных приёмов было написано множество новых игровых программ, большинство из которых просто не могло быть создано стандартными средствами в силу ограниченности ресурсов калькуляторов семейства Б3-34.[источник не указан 576 дней]
Направления еггогологии
[править | править код]Изначально предметом интереса была возможность формирования на дисплее буквенно-цифровых комбинаций, содержащих не только цифры 0-9, но и шестнадцатеричные символы, отображаемые калькулятором как –, L, С, Г, Е и пробел. Их можно было получить путём манипуляций над несохраняемым сообщением ЕГГОГ, которое микрокалькулятор выдаёт при попытке выполнить некорректную операцию (деление на ноль и т. д.). Такие «числа» можно хранить в регистрах памяти и использовать в качестве сообщений в игровых программах. В журнале «Техника — молодёжи» описывалась методика получения самых различных «видеосообщений», от буквы «Г» для программы «Лунолёт-1»[1] до целого мультфильма о полёте космического корабля по мотивам рассказа «Путь к земле»[3].
В дальнейшем, одним из направлений еггогологии стало расширение диапазона обрабатываемых чисел (числа с порядками от 100 до 199 также отображаются на экране как ЕГГОГ, см. «Нестандартные» числа) и изучение реакции микрокалькулятора на попытки произвести операции с числами за пределами стандартного диапазона.
Другое направление еггогологии изучало недокументированные возможности режима программирования; энтузиасты находили способы ввода недокументированных команд, например, содержащих символ «пусто» (F), изучали возможности нестандартного использования адресного пространства программ (см. Главная и побочные ветви), ПСЧ-режим.
После того как в 2011 году инженером Ф. Лазаревым была проанализирована аппаратная архитектура советских микрокалькуляторов и считано содержимое ПЗУ, многие необычные возможности ПМК получили логическое обяснение. Стало ясно, что «Тьма» является зацикливанием прошивки ПМК, а сообщение «ЕГГОГ» генерируется головным процессором К745ИК1302 по таймауту, когда ни один из ведомых процессоров не смог обработать введённую команду[4].
«Нестандартные» числа
[править | править код]Еггогология утверждает, что порядок (показатель степени) диапазона обрабатываемых микрокалькулятором чисел ограничен по модулю 1000 и делит этот диапазон на так называемые этажи или «ярусы»[5]. Каждый ярус — это сотня из диапазона от 0 до 999. То есть нулевой ярус — это числа с основанием степени от 0 до 99, первый ярус — числа с показателем степени от 100 до 199 и т. д. Всего ярусов десять, причём минус первый ярус эквивалентен девятому (то есть показатель степени −80 в представлении микрокалькулятора эквивалентен 920), минус второй — восьмому (например, показатель −180 эквивалентен 820) и т. д.
Документацией максимальное значение чисел, над которыми можно производить математические действия, ограничивалось значением ±9.9999999 × 10±99 (то есть нулевым и минус первым ярусами). В самом деле, если ввести в микрокалькулятор число 1 × 1050 (для чего достаточно последовательности нажатий клавиш 1 ВП 50) и возвести его в квадрат (нажать Fx²), то получаем сообщение на дисплее «ЕГГОГ». Такая индикация по документации является признаком сообщения об ошибке, так как число 1 × 10100 выходит за пределы «стандартного» диапазона. Оказывается, что это не сообщение об ошибке, а способ индикации чисел первого яруса, и с этим числом можно производить обычные операции: складывать, умножать, делить, вычислять значения функций, запоминать его в регистре памяти, вызывать из регистра. Таким же образом можно работать с числами второго яруса (например 1 × 10200, простейший способ получить такое число — возвести в квадрат число 1 × 10100). Чтобы выяснить реальные значения таких чисел, их нужно было разделить на 1 × 1099 или другие подобные числа для приведения к числу из нулевого яруса (по абсолютному модулю не более 9,9999999 × 1099).
Другими словами, давался способ расширения диапазона чисел, обрабатываемых стандартными действиями, до ±9.9999999 × 10299. Также было возможно с некоторыми ухищрениями (с помощью специально написанных программ) получать числа до ±9.9999999 × 10799 и анализировать их значение (то есть выяснить мантиссу и порядок). С помощью таких «вычислений» доказывалось, что девятый ярус представляет собой числа с отрицательным значением основания степени (например, 1 × 10920 было эквивалентным представлением числа 1 × 10−80). Числа восьмого яруса (числа от ±1 × 10800 до ±9.9999999 × 10899 а также от ±1 × 10900 до ±9.9999999 × 10900) невозможно сохранить после их получения, так как они немедленно преобразовывались в обычный нуль, независимо от того, с какой стороны к ним «подбираться» (с седьмого или девятого яруса).
Классификация числовых ярусов
[править | править код]Подробное описание
[править | править код]«3ГГОГи»
[править | править код]Под этим сообщением прячутся числа от ±1 × 10200 до ±9.9999999 × 10299. Над ними можно производить обычные арифметические операции. При появлении 3ГГОГа на экране десятичная точка сохраняет своё положение от предыдущего числа, а счётчик адресов программы устанавливается на адрес, равный двум первым цифрам порядка 3ГГОГа.
Любой 3ГГОГ может быть «расшифрован» командами: FАВТ, точка (справа на дисплее появляется его порядок), FАВТ (слева появляется мантисса бывшего 3ГГОГа, а справа возникает порядок --L или --3).
При вызове 3ГГОГа из регистра памяти 0-9 и последующем нажатии ВП или десятичной точки калькулятор ведёт себя несколько похожим образом, как если бы на дисплее появилось «сверхчисло» с порядком, начинающимся на номер регистра. Например, если 3ГГОГ вызван из регистра 1 — возникает сообщение ЕГГОГ; из регистра 2 — снова 3ГГОГ; из регистра 3 — в режиме программирования появляется «испорченная» команда « 3»; из регистра 4 — Тьма; из регистра 7 — «Длинный монстр».
«ОС-оборотни»
[править | править код]От ±1 × 10400 до ±9.9999999 × 10499.
При вытаскивании «ОС-оборотня» из регистра он заносит свой «хвост» в регистр С. «Хвост» также является сверхчислом, чьи две первые цифры порядка являются последними двумя цифрами порядка «ОС-оборотня». Если «хвост» также является «ОС-оборотнем» (это происходит для чисел с порядками с 440 по 449), то он также заносит свой «хвост» в регистр С. Существуют оборотни 3-го порядка — числа с порядком 444.
Пример:
В/О FПРГ Fx2 Fx2 × Fx2 Х→ПС Сх С/П FАВТ В/О 1 ВП 22 В↑ 1 ВП 50 С/П
П→ХС на экране 0
П→ХС на экране 0
П→ХС на экране 0
П→ХС на экране последний «Хвост» с тремя буквами Е.
«С-ЕГГОГ-оборотни»
[править | править код]От ±1 × 10600 до ±9.9999999 × 10699.
Если «С-ЕГГОГ-оборотня» вытащить из регистра, то он прикроется содержимым регистра C, а сам переместится в регистр Y. При выполнении над ним арифметической операции — Г.ГГОГ.
На основе свойств «С-ЕГГОГ-оборотня» придуман т. н. «АСО-анализ»:
- В регистр 0 помещаем «С-ЕГГОГ-оборотень» (можно и в другой регистр)
- В регистр А (только!) помещаем ЕГГОГ.
- П→XA П→X0 PX — содержимое регистра C — мантисса и 3-значная степень
- /−/ — содержимое P0
Меры предосторожности при работе с «С-ЕГГОГ-оборотнями»:
- «Тьма» наступает:
- если после «АСО-анализа» нажать ВП, FАВТ
- если сразу после формирования ЕГГОГА вытащить «С-ЕГГОГ-оборотня»
- если вытащить «С-ЕГГОГ-оборотня» при «ПСЧ-режиме»
- если «С-ЕГГОГ-оборотень» вытаскивает из регистра C сам себя
«Длинные монстры»
[править | править код]Другое название — «К-числа».
От ±1 × 10700 до ±9.9999999 × 10799.
На индикаторе при появлении «Длинного монстра» появляется следующее число:
1,2345678⋅10735 = [50.12345678 3] Где первая цифра 5 на индикаторе — это третья цифра порядка, а последняя цифра 3 на индикаторе — вторая цифра порядка. А сам «Длинный монстр» записывается на 73 адрес программы, что соответствует первым двум цифрам порядка числа.
Недокументированные команды
[править | править код]Команды «со стре́лками» в Б3-34
[править | править код]На микрокалькуляторе Б3-34 (и совместимых с ним МК-54, МК-56) во всех регистровых командах вместо клавиши номера (буквы) регистра можно использовать клавишу ↑, то есть доступны недокументированные команды ИП↑, П↑, КИП↑, КП↑, Kx≠0↑, Kx≥0↑, Кх<0↑, Kx=0↑, КБП↑, КПП↑. При вводе этих команд в режиме программирования формируются коды, заканчивающиеся на E. При выполнении таких команд фактически происходит обращение к регистру 0; команды прямого обращения к регистру полностью аналогичны ИП0 и П0, но остальные команды, которые обеспечивают косвенный доступ к регистру 0, имеют важное отличие от соответствующих команд КИП0, КП0 и других: они не уменьшают значения регистра 0 при обращении. Это даёт возможность косвенного обращения к регистру 0 двумя способами: с уменьшением и без уменьшения значения в регистре.
Использование «команд со стрелками» упрощает обход регистров в цикле, позволяя использовать значение в регистре 0 одновременно и как счётчик цикла, и как индекс регистра. Например, простейшая программа суммирования значений в регистрах 1-N (предполагается, что данные записаны в регистры, а N вводится в регистр X перед запуском программы) выглядит так:
- П0 0 КИП↑ + FL0 02 С/П (данные в регистрах от 1 до N) — 7 команд.
Вариант без «команд со стрелками»:
- П0 0 ИП0 ПE F⟳ КИПE + FL0 02 С/П — 10 команд;
- П0 2 + П1 0 КИП1 + FL0 05 С/П (данные в регистрах от 2 до N+1) — 10 команд и два дополнительных регистра (несколько быстрее).
Команды косвенных переходов «со стрелками» позволяют хранить адрес перехода в регистре 0 и выполнять переходы на него без модификации содержимого. Так как команда косвенного перехода занимает один шаг программы, а обычная команда перехода — два, запись адреса в регистр позволяет выиграть по одному шагу программы для каждого перехода на этот адрес.
У калькуляторов МК-61 и МК-52 клавиша «↑» соответствует новому регистру памяти E, а коды операций с регистром E соответствуют кодам «команд со стрелками» Б3-34, так что на этих калькуляторах «команды со стрелками» недоступны[6] (см. табл.). Обозначениям клавиш П, ИП и ↑ в Б3-34 соответствуют Х→П, П→Х и Е в МК-61 и МК-52.
Коды команд | Команды Б3-34 | Команды МК-61, МК-52 |
---|---|---|
7E | Kx≠0↑ | Kx≠0E |
8E | КБП↑ | КБПЕ |
9E | Kx≥0↑ | Kx≥0E |
-E | КПП↑ | КППЕ |
LE | КП↑ | КX→ПЕ |
CE | Кх<0↑ | Kx<0E |
ГE | КИП↑ | КП→ХЕ |
EE | Kx=0↑ | Kx=0E |
Недоступность «команд со стрелками» в моделях МК-61/МК-52 создаёт сложности при адаптации программ от Б3-34, использующих эти команды. Для команд косвенных переходов проблема решается просто: нужный адрес записывается в регистр E, который в программах для Б3-34 не используется, и команды «со стрелками» меняются на команды с указанием регистра E. Но для команд КИП↑/КП↑ ситуация намного сложнее: удаление каждой из них увеличивает размер программы минимум на 3 шага, из-за чего программной памяти может не хватить. В новых моделях МК-152/МК-161 доступны новые двухшаговые регистровые команды косвенного обращения РКИП00/РКП00, работающие так же, как КИП↑/КП↑ в Б3-34; каждая такая команда увеличивает программу только на один шаг, а гораздо бо́льшая программная память новых калькуляторов делает это увеличение практически несущественным.
Некорректные операции с клавишей К
[править | править код]На микрокалькуляторе Б3-34 большинство недокументированных операций с клавишей К вызывает сообщение ЕГГОГ. Это команды К3—К9, К+, К−, К×, К÷, , К↑, К/−/, КВП, КСх и К десятичная запятая. Команды К1 и К2 эквивалентны операции КНОП.
На МК-61 и МК-52 к сообщению ЕГГОГ приводят только команды К−, К×, К÷. Команды К1 и К2 также эквивалентны операции КНОП. Коды остальных команд документированы и используются для преобразования временны́х и угловых мер, определения модуля и знака числа, целой и дробной частей числа, бо́льшего из двух чисел, логических операций и генерации случайного числа.
Некорректной операцией на МК-61 и МК-52 является также перевод минут (секунд) в градусы и , если величина минут или секунд более или равна 60.
Сообщение ЕГГОГ, полученное с помощью некорректных операций с клавишей К, не является «сверхчислом» первого «яруса» и не может быть сохранено в регистре памяти, но может быть использовано для вывода на индикатор символов 16-ричных цифр, например:
1 К− (высвечивается ЕГГОГ) ВП ВП ↑ (высвечивается буква Е).
Полученную букву Е можно сохранять в регистрах памяти и извлекать оттуда, а с помощью регистров 0—3 также и преобразовывать в символы других 16-ричных цифр:
П0 КИП0 ИП0 КНОП (Г) КИП0 ИП0 КНОП (С) КИП0 ИП0 КНОП (L) КИП0 ИП0 КНОП (-) КИП0 ИП0 КНОП (9) и т. д.
Подобные приёмы использовались для формирования видеосообщений, например, в игровых программах.
Получение видеосообщения, начинающегося с цифры F (изображается как пустое место) может нарушить нормальную работу микрокалькулятора (искажение программы и данных, самопроизвольный переход в режим счёта и т. п.). Избежать этого можно, сразу же «изгнав» его командой ↑, подаваемой не менее четырёх раз[6] (по другим данным — семь раз[7]), не пытаясь проводить какие-либо другие операции.
Искусственный ввод кодов команд
[править | править код]В одном шаге программной памяти микрокалькулятора могут содержаться две шестнадцатеричные цифры, то есть теоретически может существовать 256 различных кодов команд. Из них в руководстве пользователя МК-61/52 документированы 214. Существует искусственный приём, позволяющий ввести 12 из 42 недокументированных кодов. Для этого вводится одна из команд переходов, например БП (код 51) и за ней две 16-ричные цифры, воспринимаемые калькулятором как адрес перехода. После этого команда перехода затирается командой-«пустышкой» КНОП, а последующий шаг при выполнении программы будет воспринят калькулятором уже не как адрес перехода, а как команда[8]. Некоторые из этих кодов можно ввести также путём недокументированных операций с клавишей К, описанных в предыдущем подразделе.
Коды команд | Действия команд | Ввод через клавишу К |
---|---|---|
27 | Вызывает сообщение ЕГГОГ | K− |
28 | Вызывает сообщение ЕГГОГ | К× |
29 | Вызывает сообщение ЕГГОГ | K÷ |
2L | Вызывает сообщение ЕГГОГ | Нет |
2С | Вызывает сообщение ЕГГОГ | Нет |
2Г | Вызывает сообщение ЕГГОГ | Нет |
2E | Вызывает сообщение ЕГГОГ | Нет |
3С | Вызывает сообщение ЕГГОГ | Нет |
3Г | Копирует содержимое регистра Х в Х1. Содержимое регистров X, Y, Z и Т сохраняется. | Нет |
3Е | Перемещает содержимое регистра Х в Х1, копирует содержимое регистра Y в Х.
Содержимое регистров Y, Z и Т сохраняется. |
Нет |
55 | Ничего не делает (равнозначна команде КНОП) | К1 |
56 | Ничего не делает (равнозначна команде КНОП) | К2 |
Коды 55 и 56 использовались во входных языках малосерийных аналогов МК-52[9].
Данный приём неприменим для ввода остальных 30 недокументированных кодов команд, содержащих 16-ричную цифру F (изображаемую на индикаторе как пустое знакоместо), поскольку на клавиатуре микрокалькулятора нет клавиши для ввода цифры F (не путать с префиксной клавишей F). Некоторые способы ввода таких кодов будут рассмотрены в следующем подразделе.
Ввод кодов команд, содержащих цифру F
[править | править код]В микрокалькуляторе МК-52 существует возможность формирования любого из 256 кодов команд по любому из адресов программной памяти. Для этого используется следующая особенность записи программ в ППЗУ. При нормальном процессе записи программы необходимо сначала стереть соответствующий участок памяти ППЗУ. Если же этого не сделать, то происходит побитовое логическое сложение кодов команд из ОЗУ с кодами, имевшимися в ППЗУ ранее[10]. Так, если в ППЗУ по некоторому адресу записана команда БП (код 51), а по соответствующему адресу в ОЗУ находится команда В↑ (код 0Е), то результатом логического сложения будет команда с кодом 5F (которая приводит к зависанию микрокалькулятора). Действия команд с кодами, содержащими цифру F, приведены в следующей таблице:
Коды команд | Действия команд |
---|---|
0F | Документированная команда FBx |
1F, 2F, 3F | Ничего не делают (равнозначны команде КНОП) |
4F | Равнозначна команде X→П0 (код 40) |
5F | Приводит к зависанию микрокалькулятора. Индикатор гаснет, работоспособность восстанавливается после отключения и включения питания. |
6F | Равнозначна команде П→Х0 (код 60) |
7F | Равнозначна команде Кх≠00 (код 70) |
8F | Равнозначна команде КБП0 (код 80) |
9F | Равнозначна команде Кх≥00 (код 90) |
-F | Равнозначна команде КПП0 (код -0) |
LF | Равнозначна команде КХ→П0 (код L0) |
CF | Равнозначна команде Кх<00 (код С0) |
ГF | Равнозначна команде КП→Х0 (код Г0) |
EF | Равнозначна команде Кх=00 (код Е0) |
F0, F1, ... FF | Ничего не делают (равнозначны команде КНОП) |
К сожалению, недокументированные команды 7F, 8F, … EF, осуществляющие косвенный доступ к регистру 0, уменьшают его содержимое, так же как и их документированные аналоги с кодами 70, 80, … Е0 и не могут служить заменой командам «со стрелками» в Б3-34.
В Б3-34 и МК-61, не имеющих ППЗУ, также существует возможность ввода некоторых команд с кодами, содержащими цифру F, но лишь по нескольким фиксированным адресам. Один способ состоит в использовании команд В/0 КППN в режиме ручных вычислений (F АВТ), N — любой из регистров (0—9, А—Е). При этом микрокалькулятор переходит в режим программирования и вставляет код FN по адресу 30+N (для буквенных регистров А—Е соответственно 40—44). Заметим, что при использовании регистров 0—6 результат зависит от их содержимого[11] Другой способ (проверенный его автором только на МК-61[8]) использует воздействие некорректной операции «ВП десятичная запятая» на «сверхчисла» первого «яруса» (ЕГГОГи). Для этого сначала создаётся «сверхчисло» двукратным применением команды ВП с суммой порядков более 99 (например, ВП 10 ВП 90), а затем, после появления сигнала ЕГГОГ, нажатием клавиш «ВП десятичная запятая 0». Это также переводит микрокалькулятор в режим программирования, и в данном примере по адресу 51 будет записана команда F1. Второй знак и адреса, и команды определяется первым знаком порядка в первой команде ВП (например, ВП 20 ВП 80 ВП .0 даёт команду F2 по адресу 52 и т. д.)
Недокументированное применение десятичной запятой в программе
[править | править код]Команда «десятичная запятая» (код 0-), использованная в программе (за исключением случаев документированного применения — для ввода числа по программе знак за знаком), заменяет значение в регистре Х на то, которое было в нём после последней из команд 0, 1, … 9, В↑, П→Х0, П→Х1, … П→Х9, П→ХА, … П→ХЕ[12].
Недокументированные способы диагностики ошибок
[править | править код]При возникновении сигнала ЕГГОГ при счёте по программе существует два недокументированных способа определить, в результате какой операции произошёл останов[6]:
- Нажатие клавиши ↑ в Б3-34 (В↑ в МК-61/52). Если на индикаторе по-прежнему ЕГГОГ, то произошло переполнение, а если число — некорректная операция, «виновником» которой является это число.
- Нажатие клавиши ВП. Возможные показания индикатора и соответствующие им ошибки:
- «ЕГГОГ 00» — переполнение («сверхчисло» первого «яруса»)
- «Г.ГГОГ 00» — деление на нуль, вычисление логарифма от нуля, степенной функции 00, некорректная операция с клавишей К.
- «ЕГ.ГОГ 00» — вычисление tg 90°.
- «Е.ГГОГ 00» — вычисление арксинуса или арккосинуса от числа, большего 1.
- «ЕГГОГ 00» (с десятичной запятой на том же месте, что в аргументе) — положительный аргумент показательной функции больше допустимого
- «−ЕГГОГ 00» (с десятичной запятой на том же месте, что в аргументе) — отрицательный аргумент показательной функции по модулю больше допустимого, или извлечение квадратного корня из отрицательного числа.
Второй способ не работает после первого, и наоборот. Чтобы применить обе диагностики, необходимо дважды запустить программу с одинаковыми исходными данными. В режиме ручных вычислений это также работает, но обычно не требуется, поскольку и так ясно, в результате какой операции возникла ошибка.
Команда В/0 вне подпрограммы
[править | править код]Команда В/0, предназначенная для завершения подпрограмм, при использовании в основной программе, как правило, осуществляет переход на адрес 01. Этим иногда пользуются для сокращения программы, заменяя две команды БП 01 одной В/0. Особенно часто эта особенность используется при нестандартном использовании адресного пространства программы (см. Главная и побочные ветви). Однако иногда использование этой особенности приводит к неправильному результату.
Причина этой особенности в том, что адреса, с которых вызываются подпрограммы, записываются в пятирегистровый стек возврата, а по команде В/0 извлекаются из него и происходит возврат на адрес, на единицу больший. Если в стек возврата ничего не было записано, в нём хранятся нули и по команде В/0 происходит переход на адрес 01. То же самое произойдёт, если в стек возврата заносилось не более четырёх адресов при вызовах подпрограмм и все они были извлечены при возвратах — следующий извлекаемый адрес будет нулём.
Однако если в стек возврата занесено пять адресов, при извлечении первого из них в последнем регистре формируется «адрес-диверсант», обе цифры которого совпадают с последней цифрой адреса, находившегося там ранее. По мере извлечения остальных адресов из стека возврата, «адрес-диверсант» заполняет все его регистры, и затем, в случае использования команды В/0 вне подпрограммы, переход будет осуществлён неправильно[6].
Очистить стек возврата можно с помощью ЗГГОГа с нулевой мантиссой: Сх В↑ ÷ ВП Fх2 Сх ↔ Сх
Косвенное обращение к регистру, содержащему число вне допустимого диапазона
[править | править код]Если в каком-либо из регистров 7—Е находится число, по модулю меньшее единицы, то при косвенном обращении к нему формируется адрес перехода, определяемый мантиссой и последней цифрой порядка[6] (см. табл., МN — N-я цифра мантиссы)
Последняя цифра порядка | Адрес перехода при отрицательных порядках | Адрес перехода при положительных порядках |
---|---|---|
1 | М7М8 | М1М2 |
2 | М7М8 | М2М3 |
3 | М7М8 | М2М3 |
4 | М6М7 | М4М5 |
5 | М5М6 | М5М6 |
6 | М4М5 | М6М7 |
7 | М2М3 | М7М8 |
8 | М2М3 | М7М8 |
9 | М1М2 | М7М8 |
0 | 0М1 | 0М1 |
Этот подраздел ещё не написан. |
ПСЧ-режим
[править | править код]«Псевдосчётный режим» — методика формирования на экране микрокалькулятора произвольных буквенно-цифровых комбинаций, т. н. «слов». Основан на переводе ПМК в особый режим работы, в котором происходит считывание на индикатор записанных в программной памяти кодов (вернее, их первых символов). Описан в заметке «Новости еггогологии» «Техники — молодёжи» № 6 за 1987 год[13]. В этой статье первооткрывателями ПСЧ-режима названы С. Банников, И. Емельянов, Б. Мурадов. Также приведены альтернативные названия режима — «ненормальный», «режим сбора».
Перед вводом ПМК в ПСЧ-режим в память записывается короткая программа, коды команд которой начинаются со всех возможных символов (для удобства обычно используются сдвоенные символы вида 00, 11, … , EE).
Для входа в ПСЧ-режим в статье предлагается следующая последовательность команд: 6 F10x K- ВП . 0 В/О В/О БП В/О. Данная процедура по сути представляет собой способ получения команды «пусто-пусто». Также редакторы упоминают, что существует более сложный способ входа в ПСЧ-режим из области «длинных монстров».
В ПСЧ-режиме меняются значения клавиш. В/О и С/П служат теперь для переключения из автономного режима в программный и наоборот. Команды FПРГ и FАВТ, а также любое «сверхчисло» возвращают ПМК в нормальный режим работы. Клавиши ШГ дают возможность перемещаться вдоль записанной в память программы. Клавиши БП и ПП переносят точку просмотра и считывания на 10 адресов вглубь программы, а также позволяют оперировать с числом на индикаторе непосредственно кодами команд.
Клавиша ВП считывает в первый регистр индикатора символ из текущего адреса программной памяти. Формирование «слов» начинается с заготовки вида 11111111, из соответствующей ячейки программной памяти считывается нужный символ, а затем с помощью команд ВП /-/ 1 ПА КИПА ИПА от заготовки отбрасывается последний регистр, а на место первого записывается ноль, который с помощью команды ВП может быть заменён следующим символом.[источник не указан 2657 дней]
Метод позволяет вводить в буквенно-цифровые комбинации и пробел (пустышку). Пробел считывается из любого адреса «тёмной зоны». Однако из-за особенностей работы ПМК после появления «пустышки» при этом необходимы дополнительные действия (прочистка стека, усложнённая последовательность команд для укорочения заготовки, соблюдение ограничений на использование клавиш ШГ).
Для входа в ПСЧ-режим, технически, может быть использована любая буквенно-цифровая заготовка, содержащая от 6 до 8 знаков и начинающаяся символом Г, Е или «пусто», другие начальные символы при нажатии клавиш «ВП-точка» выдадут ошибку. После команд ВП-точка-цифра калькулятор уже находится в ПСЧ-режиме с активированной клавишей К — это можно проверить, нажав 0 (для деактивации клавиши К), затем В/О и С/П -— они уже будут работать по-новому. Но использование ПСЧ-режима затруднено тем, что при входе в него исходная буквенно-цифровая заготовка записывается в стек возврата начиная с 3-го разряда, и при каждом нажатии В/О или БП происходит «возврат» по адресу, взятому из этого стека (команда В/О дополнительно прибавляет к нему 1). Если по команде В/О произошёл возврат на адрес «тёмной зоны», то калькулятор выходит из ПСЧ-режима. Поэтому в момент извлечения из стека адреса Е0 вместо В/О нужно нажать БП. Пример:
(Е000000.) ВП точка 0 (00 0.0 51) 0 (Е000000.) В/О (00 00 0.0 61) В/О (.Е.1.) В/О (.Е.2.) С/П (.Е.3.) — произошёл выход из ПСЧ-режима в режим программирования.
(Е000000.) ВП точка 0 (00 0.0 51) 0 (Е000000.) В/О (00 00 0.0 61) БП (00 00 0.0 Е0) В/О (00 . 01) В/О (00 . 01) С/П (Е000000.) — калькулятор остался в ПСЧ-режиме, стек возврата очищен.
(Е89-LCГ.) ВП точка 0 (00 0.0 51) 0 (Е89-LCГ.) БП (00 00 0.0 60) БП (00 00 0.0 Е8) БП (экран гаснет) — переход по адресу «9-» привёл к зависанию ПМК.
Недокументированные особенности команды ВП
[править | править код]Команда ВП превращает 0 в 1 (при этом в стеке меняется только значение регистра Х, остальные регистры стека сохраняют свои значения). Это используется в программе вычисления факториала для её сокращения, заменяя несколько команд (условный переход, его адрес, ввод единицы) одной командой ВП[14].
Кроме того команда ВП является единственной командой (как на МК-54, так и на МК-61), которая правильно ведёт себя в ручном и пошаговом (!) режимах, но при этом может вести себя неправильно в автоматическом режиме. Данный нюанс вводит в ступор новичков (так как в пошаговом режиме команда работает правильно, а потому найти ошибку в программе не удаётся), и исправить ошибку удаётся лишь за счёт замены команд «число», ВП на команды «число», F10Х, «х» ,но для этого требует лишний шаг.
Команда ВП . (десятичная запятая), выполненная над любым числом, кроме комбинаций, начинающихся на Е или Г, немедленно выводит ЕГГОГ, и если в памяти есть место на две команды, значительно быстрее других методов искусственного вывода ЕГГОГ — некорректных операций и К−, которые вызывают паузу около 3 секунд. Обычный «долгий» ЕГГОГ пропускает одну команду, а мгновенный (ВП .) — нет.
Этот подраздел ещё не написан. |
Главная и побочные ветви
[править | править код]В советских программируемых калькуляторах Электроника Б3-34, МК-54, МК-56, МК-61, МК-52 (и аналогичных) физической оперативной памяти столько, сколько заявлено в руководстве к ПМК, но из-за особенностей аппаратной реализации существует виртуальный 160-шаговый цикл[15], состоящий из 3 ветвей: «главной», «короткой побочной» и «длинной побочной»[16].
Главная ветвь — это то, что в характеристиках калькулятора указывается как «Количество шагов программы». В семействе Б3-34 главная ветвь занимает 98 шагов — адреса с «00» по «97», в МК-61 и МК-52 105 шагов — с «00» по «104» (на экране отображается как «−4»). Если калькулятор в конце главной ветви не встретил команд В/О, С/П или БП, то счётчик шагов продолжает увеличиваться, и калькулятор переходит в диапазон короткой побочной ветви.
Короткая побочная ветвь занимает 14 шагов программы — с адреса «98» по «L1» (МК-61 и МК-52: 7 шагов с адреса «−5» по «L1»). Эти адреса соответствуют реальным адресам «00» — «13» (МК-61 и МК-52: «00» — «06»). Если в этих адресах калькулятор не встретил команд В/О, С/П или БП, то счётчик шагов продолжает увеличиваться, и калькулятор переходит в диапазон длинной побочной ветви.
Длинная побочная ветвь занимает 48 шагов программы — с адреса «L2» по «F9». Эти адреса соответствуют реальным адресам «00» — «47»). Если в этих адресах калькулятор не встретил команд В/О, С/П или БП, то счётчик шагов продолжает увеличиваться, и калькулятор переходит в главную ветвь. В длинной побочной ветви с адреса «C1» начинается «тёмная зона»: коды команд, записанные в соответствующие адреса главной ветви, при переходе в режим ПРГ на индикатор не выводятся, однако в режиме счёта исправно выполняются.
Графически этот процесс выглядит так (на примере МК-52):
Данная недокументированная особенность не позволяла писать программы длиннее документированного объёма, зато позволяла дважды избежать команд безусловного перехода на нулевой адрес (иногда по нулевому адресу ставилась команда В/О).
Ошибки в микрокалькуляторах
[править | править код]Кроме недокументированных возможностей, некоторые микрокалькуляторы содержали ошибки.
Ошибки в Б3-21 некоторых выпусков
[править | править код]В первых выпусках микрокалькулятора Б3-21 возникала ошибка при сложении числа, содержащего семь девяток в мантиссе и цифру более 4 в восьмом (неиндицируемом) разряде мантиссы, с бо́льшим по порядку числом; например, при сложении 9,9999999 и 10 получалось 120.
Также в некоторых Б3-21 при вычислении сложных операций (например, синуса) могло исказиться содержимое одного из регистров кольцевого стека.
Некоторые Б3-21 неправильно выполняли оператор вызова подпрограммы ПП, если он находился по одному из адресов 55, 65, 70, 80, 91 или 92. Вместо перехода к подпрограмме в них выполнялся оператор, код которого равен адресу подпрограммы[17].
Ошибки в Б3-34 некоторых выпусков
[править | править код]В некоторых микрокалькуляторах Б3-34 операция возведения в степень Fxy выполнялась с ошибкой, если предыдущая операция была двухместной (кроме возведения в степень) и в её результате получилось число, имеющее в восьмом разряде мантиссы цифру 5 или 7. Этой ошибки можно избежать, если перед выполнением операции Fxy нажать дополнительно клавиши F1/x F1/x[18] (что заменяет результат двухместной операции таким же результатом одноместной, на котором эта ошибка не возникает). Другие «взаимоисключающие» операции (например, Fx2 F√ или Feх Fln) для этой цели менее пригодны, так как могут привести к переполнению.
В ранних выпусках микрокалькуляторов нельзя было заканчивать подпрограмму командами одноместных операций Fsin, Flg, F√ и др., а также производить смену знака результата вычислений клавишей /−/[19].
Ошибки в МК-61 и МК-52
[править | править код]Операция Kmax считает ноль самым большим числом. Эта ошибка использовалась в некоторых программах[20].
При некоторых операциях, например, определении дробной части отрицательного числа, возникает «отрицательный нуль» (изображается на индикаторе как «−0»), который при условных переходах ведёт себя как отрицательное число[20].
Ошибки и нерациональные решения в блоках расширения памяти БРП-3 и БРП-4
[править | править код]В блоке БРП-3, программе 16 использована неправильная формула вместо , соответственно неправильно составлена и программа. Там же для определения аргумента комплексного числа используется формула без учёта как знаков и , так и того, что действительная часть может быть нулём. В результате при происходит ошибка в определении аргумента на 180°, а при — останов деления на нуль[21].
В блоке БРП-4 в «лунолётной» игровой программе «Космическая посадка» физическая модель ошибочна, что может приводить к бессмысленным результатам. Например, при свободном падении космического аппарата на Луну с большой высоты глубина кратера может составлять менее 8 мм, хотя скорость в момент соприкосновения с лунной поверхностью превышает 3000 м/с. В том же блоке микрокалькулятор «нарушает правила» в игровых программах «Жизнь» и «Магараджа». Целый ряд программ составлен нерационально и поддаётся значительным сокращениям. Например, программа для отыскания минимальной поверхности или минимальной длины сварных швов цилиндрической банки заданного объёма может быть сокращена на 15 шагов при использовании более простых формул[22].
См. также
[править | править код]Примечания
[править | править код]- ↑ 1 2 Мягкой посадки! // Техника — молодёжи : журнал. — 1985. — Июнь. — С. 56.
- ↑ Михаил Пухов. «Кон-Тики»: путь к Земле // «Техника — молодёжи», 1985, № 8—12; 1986, № 1—4.
- ↑ Мягкой посадки! // «Техника — молодёжи» : журнал. — 1985. — Декабрь. — С. 48—49.
- ↑ МК-61: история, эмуляция, устройство . Хабр. Дата обращения: 26 октября 2022. Архивировано 26 октября 2022 года.
- ↑ «Техника — молодёжи», 1986, № 1, с. 54.
- ↑ 1 2 3 4 5 Школа начинающего программиста. Занятие двадцать шестое. — «Наука и жизнь», 1989, № 11, с. 124—130
- ↑ «Техника — молодёжи». 1986, № 7.
- ↑ 1 2 Alfred Klomp. Some experiments with hacking the ЭЛЕКТРОНИКА МК-61. — http://www.alfredklomp.com/technology/mk-61/ Архивная копия от 28 октября 2008 на Wayback Machine
- ↑ Программируемые микрокалькуляторы: устройство и пользование / Под ред. Я. К. Трохименко. — М.: Радио и связь, 1990. — c. 123—124.
- ↑ Школа начинающего программиста. Занятие двадцать второе. — «Наука и жизнь», 1989, № 1, с. 124—129.
- ↑ «Техника — молодёжи», 1986, № 5, с. 52.
- ↑ «Наука и жизнь», 1989, № 4, с. 112.
- ↑ Новости еггогологии. «Техника — молодёжи», 1987, № 6, с.54.
- ↑ Л. М. Финк. Папа, мама, я и микрокалькулятор. — М.: Радио и связь, 1988. — с. 71.
- ↑ В инструкциях к ПМК о 160-шаговом цикле ничего не сказано.
- ↑ «Техника — молодёжи», 1986, № 2, стр. 56.
- ↑ Сергей Фролов. История советских калькуляторов. Часть II. — iNFUSED BYTES OnLine, http://www.enlight.ru/ib/also/calcs/calcs2.htm Архивная копия от 17 июля 2012 на Wayback Machine
- ↑ «Наука и жизнь», 1984, № 2, с. 66.
- ↑ В. П. Дьяконов. Справочник по расчётам на микрокалькуляторах. 3-е изд., доп. и перераб. — М.: Наука, Гл. ред. физ.-мат. лит., 1989. — с. 41.
- ↑ 1 2 «Наука и жизнь», 1988, № 11, с. 84—85.
- ↑ Вам привет от БРП. — «Наука и жизнь», 1990, № 10, с. 115.
- ↑ И второй том… комом. — «Наука и жизнь», 1991, № 6, с. 130—131.
Ссылки
[править | править код]- Сергей Фролов. Электроника Б3-34: микрокалькулятор-загадка . Sergei Frolov's home page. Дата обращения: 5 июля 2012.
- Сергей Фролов. История советских калькуляторов. Часть II . iNFUSED BYTES e-magazine (26 сентября 1998). Дата обращения: 5 июля 2012.[неавторитетный источник]
- Сергей Анваров. Недокументированные возможности программируемого микрокалькулятора МК-61 (7 июля 2021). — Подробное описание недокументированных возможностей ПМК 61. Дата обращения: 17 августа 2021.