Описание возможностей эмулятора ПМК-61

Кратко о возможностях

Этот эмулятор, использующий JavaScript (т. е. совместимый с большинством браузеров), можно использовать для написания и отладки программ под ПМК-61, используя дополнительные возможности, которые недоступны в реальном калькуляторе:

Базовые возможности

Сам калькулятор отображён близко к тому, как он выглядит в реальности. Кнопки можно нажимать мышкой, или при помощи пробела и Enter, если они в фокусе.

Кнопки самого ПМК не активны, пока он выключен (кроме кнопки включения питания), или находится на паузе.

Кроме того, можно использовать горячие клавиши (кроме кнопки включения), которые отображаются как подсказки над каждой кнопкой. Горячие клавиши не работают, когда фокус в поле ввода кода программы. Они также не зависят от раскладки языка, состояния CapsLock и NumLock. Фактически, зависят от физического расположения клавиши на клавиатуре.

Расширенные возможности по умолчанию включены и контролируются переключателем Отображать расширенные возможности: регистры и код программы.

Отображение содержимого регистров памяти

Содержимое 15 (R0…RE) регистров памяти отображается в виде: цифры мантиссы, и если есть порядок, то символ ^ (разделения порядка), а если порядок содержит шестнадцатеричные цифры, то они отображаются через дополнительный разделительный символ |. В последнем случае именно такой вид порядка будет отображён при выводе его на экран. Числовое значение до знака | показывает его фактическое значение (с точки зрения калькулятора).

Приведём пример в виде таблицы, где будем указывать вводимые команды, содержимое основного экрана калькулятора и поле регистра X (оно шире, чем на экране, по указанной вверху причине). Не забывайте, что это полный эмулятор калькулятора, а значит он эмулирует все особенности физического калькулятора.

Ввод Экран Регистр X Комментарий
5 0 50. 50. Просто ввод числа 50.
F10x 1. 50 1. ^ 50 Обратите внимание, что в поле появился разделитель порядка. Место под знак остаётся пустым.
Fx2 ЕГГ0Г 1. ^100 На основном экране отобразится код ошибки из-за переполнения порядка (более 99), но в поле будет показано число с порядком 100, т. е. фактически калькулятор может его использовать, хотя и не может его показывать.
Fx2 3ГГ0Г 1. ^200 Порядок увеличился. Начинаются известные из Еггогологии ЗГГОГи и их особенности – в стеке адресов возврата появилось ненулевое значение.
Fавт 3ГГ0Г 1. ^200 Без изменений.
. 3ГГ0Г 200 1. ^ 57|--3 Команда ., и вот он(!) известный способ заставить калькулятор отобразить на экране значение сверхчисла. Но глядя на поле регистра видно, что фактически это уже другое число, не очень большое, но с порядком, содержащим шестнадцатеричные цифры.
Fавт 1. --3 1. ^ 57|--3 Вот мы этот порядок и проявили явно.
0 + 1. 57 1. ^ 57 А сложив с нулём, ещё и узнали фактическое значение.

И кстати, в документе про недокументированные особенности указано правило 160, по которому в данном случае порядок −103 (−−3 = −A3 = −103) превращается в 57-й.

Стек адресов возврата начинается снизу (как стек данных). Во время выполнения он может временно отображать мусор. При остановке всё нормализуется.

Буфер обмена

Значение любого регистра можно выделить и скопировать в буфер обмена как обычный текст.

Также можно вставить текст обратно в регистр X (активный экран). Вставка проходит только при нажатии горячих клавиш (Ctrl+V, Shift+Ins), и НЕ на поле редактирования программы.

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

После ввода восьми цифр автоматически эмулируется нажатие клавиши ВП, что позволяет вводить такие числа, как 1.2345678-02.

Пример: текст -1.23     ^-03 вызовет эмуляцию нажатия клавиш 1, ., 2, 3, /-/, ВП, 0, 3, /-/ и приведёт к правильному результату.

Состояние

Кнопка Прочитать позволяют прочитать всё содержимое ПМК в виде одной строки (автоматического копирования в буфер обмена не производится, чтобы не иметь проблем с безопасностью). Её можно не интерпретировать, считайте это бинарное состояние, но в виде текста.

Если требуется прочитать состояние при работающей программе, можно использовать переключатель Пауза, который остановит работу ПМК (без сброса переменных). При этом нажатие на кнопки ПМК станет невозможным (они заблокируются).

Позднее в любой момент можно Ввести сохранённую строку состояния обратно, восстановив все регистры и программу. Если ПМК до этого был выключен, то он автоматически включится.

Ускоренный режим в 80-90 раз ускоряет выполнение, но вглядеться в индикацию на основном экране ПМК, что используется в некоторых играх, будет уже затруднительно. По умолчанию (после включения) этот режим выключен. Если ускоренный режим включен, то он таким остается, даже если выключить Отображать расширенные возможности: регистры и код программы.

Предупреждение: состояние переключателей Отображать расширенные возможности: регистры и код программы и Ускоренный режим не сохраняется для совместимости с исходным эмулятором, в котором этих флагов нет. При восстановлении состояния, соответственно, не изменяются.

Отмена последней команды

Эта кнопка появляется только тогда, когда будет нажата какая-то клавиша на калькуляторе. Она позволяет отменить действие последней команды и вернуть ПМК в состояние, которое было до того (всключает все клавиши, в том числе перевод в режим ПРГ и обратно).

На текущий момент переключатель Р-ГРД-Г не сохраняется (пока не ясно, что лучше – сохранять или нет).

Отменяется целиком команда, а не одно нажатие. Т. е. если нажать три кнопки K + БП + e, то будет отменена одна команда КБПе. Аналогично и для остальных. Понятно, что для кнопки + только она и будет отменена.

Пока отображение отмены не настраивается, т.е. она всегда активна, даже при условии, что снято Отображать расширенные возможности: регистры и код программы.

Сохраняются последние 1000 команд (очередь отката). При переполнении старые забываются навсегда. При выключении ПМК или вводе состояния очередь отката очищается.

Код программы

Это самое интересное в эмуляторе.

Вывод кода программы в виде текста

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

Простой код

По умолчанию включён. В этом случае выводятся только команды, без адреса. Форматируется по 10 команд в строку с равномерным отступами для лучшего чтения. Если флаг сброшен, то каждая команда предваряется адресом (с точкой), для удобства восприятия уменьшенным шрифтом и неярким цветом.

Подсветка

По умолчанию включён. В этом случае каждая команда раскрашивается, в зависимости от типа:

Цвет Используется для…
Цитрусовый операций со стеком и пустых операторов.
Истинно зелёный операций работы с регистрами памяти, в том числе косвенными.
Глубокий красный всех функций и операций. Fπ или Cx считаются функциями.
Королевский синий операторов, которые могут изменить порядок выполнения. Условные и безусловные переходы, операторы сравнения. Команды остановки и возврата.
Обычный чёрный операторов ввода числа, т. е. цифр, ввода порядка, смены знака, точки.
Барни фиолетовый с подчёркиванием числовых значений адресов перехода после операторов сравнения, циклов или безусловных переходов.
Красный операторов, которые точно приведут к остановке по ошибке.

Если флаг подсветки не установлен, то будет вывод обычным цветом текста.

Числовые значения

По умолчанию выключен. Будут выведены только числовые коды операций, а не их псевдокоды. При этом два предыдущих флага сохраняют значения (с адресами или подсветкой).

Код по вертикали

По умолчанию выключен. В этом режиме команды выводится сверху вниз, а затем слева направо. Получается 11 колонок и 10 строк.

Ввод текста в код программы

Но самое интересное – это конечно ввод программы. По кнопке Ввести в память можно попытаться ввести текст, который сейчас находится в поле программы в программную память ПМК. При этом, если калькулятор был выключен, он включится автоматически. Результат можно узнать, прочитав его обратно.

Одно из достоинств свободного текстового поля – можно легко менять части кода местами, переставлять операторы и тут же смотреть, что получилось.

Чтобы понять, как вводить программу, расскажу о работе парсера, который считывает команды. Он сделан так, чтобы максимально упростить ввод, в то же время учитывает множество разных вариантов ввода.

Правила парсера

  1. Парсер считает командами всё, что разделено пробелами (или концом строки). Т. е. псевдокод команды не должен содержать пробелы. И формально можно все команды указать в одну строку. При этом оформление текста игнорируется (цвет, шрифт), а используется только текст.
  2. Парсер воспримет только первые 105 команд, остальные проигнорирует. Если команд меньше, то оставшееся место будет безусловно заполнено нулями (как делает ПМК при включении).
  3. Парсер игнорирует регистр букв. Т. е. можно вводить в верхнем, нижнем или смешанном режиме – всё распознается.
  4. Он считает одинаковыми все буквы, которые визуально похожи в английском и русском алфавитах. Т. е. можно вводить в смешанном режиме, всё равно парсер разберётся. Конкретно буквы (приведены только русские) А, В, С, Е, З, К, М, О, Р, Х, Д. Последнюю он будет считать как букву D (регистр D). Буква О (русская или английская) и нуль также не отличаются при разборе. Т. е. используйте что ближе. Буква З и цифра 3 тоже взаимозаменяемы. Все похожие на дефис (– –, — —, − −) заменяется на знак дефиса.
  5. Каждая команда может содержать префикс адреса в виде nn. (ровно две цифры), т. е. в виде адреса с точкой. В этом случае команда будет помещена по этому адресу, а все последующие (без префикса) последовательно после неё. Понятно, что первая команда по умолчанию идёт по нулевому адресу. Для адреса после 99 допустимо A0, -0, .0.
  6. Вместо псевдокода можно использовать цифровой код команды в шестнадцатеричном виде, при этом только два последних разряда принимаются во внимание. Однознаковые числа по кодам совпадают сами с собой, т. е. код 2 и цифра 2 это одно и то же. Как и выше символы . и - воспринимаются как цифра А, но только для двузначных чисел, т. е. 0- будет интерпретироваться как 0A (команда .), но - – как просто минус. Сначала выполняется п.4, а значит буквы ЗО будут восприняты как код 30.

Псевдокоды

Далее опишем псевдокоды, которые понимает парсер. В первой колонке идёт код команды, во второй команда, какой она будет представлена при выводе, а далее (через пробелы) варианты ввода. Не забывайте про правила 3 и 4 выше, поэтому варианты приведены в канонической форме, т. е. с уже преобразованными буквами в верхнем регистре. И разумеется, Вывод тоже подходит для ввода.

Код Вывод Принимается парсером
10 +
11 -
12 × ⋅ X *
13 ÷ / :
0A . , •
0B /-/ +/-
0C ВП
0D Сx CX
15 F10ˣ 10ˣ F10^X 10^x F10X 10X F10**X 10**X
16 Feˣ FEˣ Eˣ FE^X E^X FEX EX FE**X E**X
22 Fx² FX² X² FX^2 X^2 FX2 X2 FX**2 X**2
24 Fxʸ FXʸ Xʸ FX^Y X^Y FXY
17 Flg FLG LG
18 Fln FLN LN
1D Fcos FC0S C0S
1A Fcosᐨ¹ FC0Sᐨ¹ C0Sᐨ¹ FC0S⁻¹ C0S⁻¹ FC0S-1 C0S-1 FARCC0S ARCC0S
1C Fsin FSIN SIN
19 Fsinᐨ¹ FSINᐨ¹ SINᐨ¹ FSIN⁻¹ SIN⁻¹ FSIN-1 SIN-1 FARCSIN ARCSIN
1E Ftg FTG TG
1B Ftgᐨ¹ FTGᐨ¹ TGᐨ¹ FTG⁻¹ TG⁻¹ FTG-1 TG-1 FARCTG ARCTG
20 FΠ Π FПИ ПИ
21 F√ √ FKBK0P KBK0P FK0PEHЬ K0PEHЬ FKBK0PEHЬ KBK0PEHЬ
23 F1/x F1/X 1/X
0E В↑ B↑ ↑ B^ ^
0F FВх FBX ВX
14 <-> ↔ XY X↔Y ⟷ ←→
25 FѺ Ѻ F↻ ↻ F-> -> F→ →
3E x←y X←Y
3B КCЧ KCЧ CЧ KE
37 КɅ КɅ Ʌ K^ K⋀ ⋀ K∧ ∧ K/\ /\ KΛ Λ K. KA
38 КV KV V K⋁ ⋁ K∨ ∨ K\/ \/ K/-/ KB
39 К(+) K(+) (+) K⊕ ⊕ KBП KC
3A Кинв KИHB ИHB KCX KD
2A КМ→Ч KM→Ч M→Ч KM→Ч KMЧ MЧ
30 КЧ→М KЧ→MKЧM ЧM K3
26 КМ→Г KM→Г M→Г KMГ MГ K+
33 КГ→М KГ→M Г→M KГM ГM K6
32 Кзн K3H 3H K5
31 К|x| K|X| |X| K4
34 К[x] K[X] [X] K7
35 К{x} K{X} {X} K(X) (X) K8
36 Кmax KMAX MAX K9
27 K-
28 KX K* K⋅
29 K/ K:
52 В/О B/0
50 С/П C/П CП
51 БП
8… KБП…
53 ПП
A… KПП…
5E Fx=0 FX=0 X=0
E… Kx=0… KX=0…
57 Fx≠0 FX≠0 X≠0 FX#0 X#0 FX!=0 X!=0 FX<>0 X<>0
7… Kx≠0… KX≠0… KX#0… KX!=0… KX<>0…
59 Fx≥0 FX≥0 X≥0 FX>=0 X>=0 FX⩾0 X⩾0
9… Kx≥0… KX≥0… KX⩾0… KX>=0…
5C Fx<0 FX<0 X<0
C… Kx<0… KX<0…
5D FL0 L0
5B FL1 L1
58 FL2 L2
5A FL3 L3
54 КНОП KH0П H0П K0
55 K1
56 K2
4… xП… XП… П… X→П…
B… KxП… KXП… KX→П… KП…
6… Пx… ПX… ИП… П→X…
D… КПx… KПX… KП→X… KИП…

Некоторые пояснения.

Кроме того, если первой строкой текста кода является # | 00 01 02 03 04 05 06 07 08 09 с любыми пробельными символами, то она игнорируется. В некоторых таблицах с текстами программ это обозначало заголовок с адресацией.

Если вначале строки стоит номер и |, например 20 | FL1, то это воспринимается как 20.FL1. Причины те же, что выше – воспринимать текст из ранее опубликованных программ, где первая колонка обозначает адресацию.

Разбор при включенном режиме Код по вертикали

Этот переключатель влияет не только на вывод, но и на ввод. При этом нужно учитывать, что само поле редактирования воспринимает текст в обычном порядке, поэтому парсер просто транспонирует результат в памяти. В связи с этим есть некоторые ограничения: