Этот эмулятор, использующий JavaScript (т. е. совместимый с большинством браузеров), можно использовать для написания и отладки программ под ПМК-61, используя дополнительные возможности, которые недоступны в реальном калькуляторе:
Сам калькулятор отображён близко к тому, как он выглядит в реальности. Кнопки можно нажимать мышкой, или при помощи пробела и Enter, если они в фокусе.
Кнопки самого ПМК не активны, пока он выключен (кроме кнопки включения питания), или находится на паузе.
Кроме того, можно использовать горячие
клавиши
(кроме кнопки включения), которые
отображаются как подсказки над каждой кнопкой.
Горячие
клавиши не работают, когда фокус в поле ввода кода программы.
Они также не зависят от раскладки языка, состояния CapsLock и NumLock.
Фактически, зависят от физического расположения клавиши на клавиатуре.
−,
+– так же. На основной это правее цифры 9.
*только на дополнительной клавиатуре, т. к. на основной она совмещена с
8. Знак деления на основной клавиатуре (на дополнительной и так видно) обычно расположен снизу возле правого Shift (после буквы
Ю).
.или
,(оба понимаются как
.). На дополнительной клавиатуре очевидно снизу.
~(для смены знака) там, где буква Ё, обычно под Esc.
Kпонимается как английская, так и русская (где
R).
Расширенные возможности по умолчанию включены и контролируются
переключателем
Отображать расширенные возможности: регистры и код программы
.
Содержимое 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 строк.
Но самое интересное – это конечно ввод программы. По кнопке
Ввести в память
можно попытаться ввести текст, который сейчас
находится в поле программы в программную память ПМК. При этом,
если калькулятор был выключен, он включится автоматически.
Результат можно узнать, прочитав его обратно.
Одно из достоинств свободного текстового поля – можно легко менять части кода местами, переставлять операторы и тут же смотреть, что получилось.
Чтобы понять, как вводить программу, расскажу о работе парсера, который считывает команды. Он сделан так, чтобы максимально упростить ввод, в то же время учитывает множество разных вариантов ввода.
что ближе. Буква
Зи цифра 3 тоже взаимозаменяемы. Все похожие на дефис (– –, — —, − −) заменяется на знак дефиса.
nn.(ровно две цифры), т. е. в виде адреса с точкой. В этом случае команда будет помещена по этому адресу, а все последующие (без префикса) последовательно после неё. Понятно, что первая команда по умолчанию идёт по нулевому адресу. Для адреса после 99 допустимо
A0,
-0,
.0.
.и
-воспринимаются как цифра А, но только для двузначных чисел, т. е.
0-будет интерпретироваться как 0A (команда
.), но
-– как просто минус. Сначала выполняется п.4, а значит буквы ЗО будут восприняты как код 30.
Далее опишем псевдокоды, которые понимает парсер. В первой колонке
идёт код команды, во второй команда, какой она будет представлена
при выводе, а далее (через пробелы) варианты ввода.
Не забывайте про правила 3 и 4 выше, поэтому варианты приведены
в канонической
форме, т. е. с уже преобразованными буквами
в верхнем регистре. И разумеется, Вывод
тоже подходит для ввода.
Код | Вывод | Принимается парсером |
---|---|---|
10 | + | |
11 | - | |
12 | × | ⋅ X * |
13 | ÷ | / : |
0A | . | , • |
0B | /-/ | +/- |
0C | ВП | BП |
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Π Π 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-> -> 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 | K× | KX K* K⋅ |
29 | K÷ | 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ИП… |
Некоторые пояснения.
0до
E.
−1– приведены оба.
Кроме того, если первой строкой текста кода является
# | 00 01 02 03 04 05 06 07 08 09
с любыми пробельными символами,
то она игнорируется. В некоторых таблицах с текстами программ это
обозначало заголовок с адресацией.
Если вначале строки стоит номер и |
, например 20 | FL1
, то
это воспринимается как 20.FL1. Причины те же, что выше – воспринимать
текст из ранее опубликованных программ, где первая колонка обозначает
адресацию.
Код по вертикали
Этот переключатель влияет не только на вывод, но и на ввод. При этом нужно учитывать, что само поле редактирования воспринимает текст в обычном порядке, поэтому парсер просто транспонирует результат в памяти. В связи с этим есть некоторые ограничения:
простой текст.