Список всех 256 команд ПМК с дополнительным комментарием, в случае наличия недокументированных возможностей.
Код | Вид | Название | Комментарий | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00…09 | 0…9 | Ввод числа |
Ввод цифр идёт даже через границу
С/П. Т. е. если в начале программы
идёт цифра(ы), а перед её запуском тоже ввод, то он продолжится.
То же касается и разделителя ., он может
как заканчивать ввод в режиме вычислений, так и начинать в
программе – будет воспринят как разделитель целой и дробной
части.
Второе нажатие . для разделения разрядов игнорируется. Например, последовательность 1 . 2 . 3 выведет 1.23, даже в программном режиме. Если предыдущая команда была не ввод цифры или разделителя, а так же не команда В↑, то предварительно осуществляется сдвиг стека под новое число. |
||||||||||||||||||||||
0A | . | Разделитель целой и дробной части | Кроме того, что указано выше восстановление X2→X в программном режиме. См. Таинственный регистр X2. | ||||||||||||||||||||||
0B | /-/ | Смена знака | Предыдущее значение НЕ копируется в X1. Cм. также Таинственный регистр X2. Если смена знака идёт после ввода цифры, и далее снова идёт ввод цифры, то стек не сдвигается, а новое вводимое значение заменяет в регистре X то, что было после смены знака. | ||||||||||||||||||||||
0C | ВП | Ввод порядка |
Для многих чисел ввод порядка означает умножение на 10 в соответствующей степени.
После ввода порядка можно ещё раз нажать ВП и ввести число – в этом случае порядки складываются. Знак порядка можно ввести как сразу после ВП, так и после ввода цифр. Если мантисса регистра X нулевая, то первая цифра заменяется на 1, причём, если была нажата смена знака /-/ до команды ВП, то будет уже −1, даже в программном режиме. Причём у минуснуля до этого знак не отображается. На самом деле в программном режиме это будет восстановление −0 с увеличением первой цифры на 1, как указано в разделе Восстановление X2 с сохранением первой цифры числа в X. Например, выполнение программы
Пример для нестандартной нулевой мантиссы. Возьмём число 200000000. , где двойка на месте знака (!), которое получается после косвенного обращения через R4…R6, если до того там содержалось 99999999. Тут после нажатия ВП число превратится в 210000000. . |
||||||||||||||||||||||
0D | Cx | Сброс X в ноль |
Важное свойство – стек не двигается.
Предыдущее значение НЕ копируется в X1.
Обычно следующий ввод в RX сдвигает стек, но после Cx это иногда нет.
Если после команды идёт ввод цифр, то стек не сдвигается, если перед выполнением
Cx были:
|
||||||||||||||||||||||
0E | В↑ | Сдвиг стека | Если последующая команда – ввод числа, то будет ввод в X, если извлечение из памяти или Fπ – то стек ещё раз сдвинется. | ||||||||||||||||||||||
0F | FВx | Полный сдвиг, включая X1 | Единственная документированная и вводимая команда с цифрой F в коде. | ||||||||||||||||||||||
10 | + | Сложение | Результат проверяется только при X→X2, т. е. можно использовать для получения сверхчисел. | ||||||||||||||||||||||
11 | − | Вычитание | Результат проверяется только при X→X2, т. е. можно использовать для получения сверхчисел. | ||||||||||||||||||||||
12 | × | Умножение | Результат проверяется при X→X2, т. е. можно использовать для получения сверхчисел. | ||||||||||||||||||||||
13 | ÷ | Деление | Ошибка деления на ноль возникает безусловно, остальное при X→X2. | ||||||||||||||||||||||
14 | ←→ | Обмен X и Y | |||||||||||||||||||||||
15 | F10x | Возведение в степень числа 10 | Аргументы на переполнение порядка, сверхчисло, проверяется безусловно, а не при X→X2. | ||||||||||||||||||||||
16 | Fex | Возведение в степень числа e – экспонента | Аргументы на переполнение порядка, сверхчисло, проверяется безусловно, а не при X→X2. | ||||||||||||||||||||||
17 | Flg | Десятичный логарифм | Аргументы на больше нуля проверяется безусловно, а не при X→X2. | ||||||||||||||||||||||
18 | Fln | Натуральный логарифм | Аргументы на больше нуля проверяется безусловно, а не при X→X2. | ||||||||||||||||||||||
19 | Fsin-1 | Арксинус | Аргументы на |X|⩽1 проверяется безусловно, а не при X→X2. Для ГРД/Г и X = 0 выводит X = 00. | ||||||||||||||||||||||
1A | Fcos-1 | Арккосинус | Аргументы на |X|⩽1 проверяется безусловно, а не при X→X2. arccos(1) для ГРД/Г даёт ненормализованное 00. | ||||||||||||||||||||||
1B | Ftg-1 | Арктангенс |
Для чисел x ⩾ 1.|+8 результат выдаёт близкий к
максимуму– для радиан это почти π/2, для градов 99.999999. Может быть вычислен и для 1.|+100 в радианах из-за того, что порядок снижается, но не градусах. |
||||||||||||||||||||||
1C | Fsin | Синус | Аргументы на |X|<1.|+10 проверяется безусловно, а не при X→X2. | ||||||||||||||||||||||
1D | Fcos | Косинус | Аргументы на |X|<1.|+10 проверяется безусловно, а не при X→X2. | ||||||||||||||||||||||
1E | Ftg | Тангенс | Аргументы на |X|<1.|+10 проверяется безусловно, а не при X→X2. При X = π/2 + n × π тоже будет ошибка. | ||||||||||||||||||||||
1F | Пустой оператор | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
20 | Fπ | Число π – пи | Кроме того, что сдвигает стек, также копирует предыдущее X в X1, как арифметическая операция. Ещё одной особенностью является то, что это единственная не X2-влияющая команда, которая расширяет стек: сдвигает данные в глубь. | ||||||||||||||||||||||
21 | F√ | Квадратный корень | Аргументы проверяется безусловно на X⩾0, а не при X→X2. | ||||||||||||||||||||||
22 | Fx2 | Возведение в квадрат | Результат проверяется при X→X2, т. е. можно использовать для получения сверхчисел. | ||||||||||||||||||||||
23 | F1/x | Обратная величина | Ошибка деления на ноль возникает безусловно, остальное при X→X2. | ||||||||||||||||||||||
24 | Fxy | Возведение в степень |
Ошибка, если X ⩽ 0. Не принимает отрицательный X, даже когда это
математически допустимо.
Ошибка переполнения возникает безусловно, а не при X→X2. Стек не сокращается, в отличие от обычных арифметических операций. Т. е. число в Y остаётся на месте, позволяя ещё раз возвести в ту же степень. Это не документировано. |
||||||||||||||||||||||
25 | F↻ | Прокрутка стека в обратном порядке | |||||||||||||||||||||||
26 | К°→′ | Перевод угловых или временных величин из обычной формы в часть целой | Если дробное значение ⩾0.6, то будет ошибка. Целая часть не меняется, даже если шестнадцатеричное число. | ||||||||||||||||||||||
27 | К− | Ошибка | ЕГГ0Г . | ||||||||||||||||||||||
28 | К× | Ошибка | ЕГГ0Г . | ||||||||||||||||||||||
29 | К÷ | Ошибка | ЕГГ0Г . | ||||||||||||||||||||||
2A | К°→′" | Перевод угловых или временных величин из обычной формы в часть целой, включая секунды | Если дробное значение ⩾0.6, то будет ошибка. Целая часть не меняется, даже если шестнадцатеричное число. | ||||||||||||||||||||||
2B…2E | Ошибка | ЕГГ0Г . | |||||||||||||||||||||||
2F | Пустой оператор | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
30 | К°←′" | Перевод угловых или временных величин из части целого в обычную форму, включая секунды | Если дробная часть ⩽ 2.|−07, то обратное преобразование уже не срабатывает. Если = 1.|−07 то уже и прямое преобразование не меняет значение. Если целая часть шестнадцатеричное число и нет дробной части или оно = 1.|−07 – оно нормализуется, как в операциях с шестнадцатеричными цифрами. Иначе остаётся без изменений. | ||||||||||||||||||||||
31 | К∣x∣ | Модуль | Удаляет знак. Делает знакоцифру = 1, что выглядит как пустое место и соответствует положительным числам. | ||||||||||||||||||||||
32 | КЗН | Знак числа | У отрицательного нуля знак положительный, т.е. для нуля знакоцифра игнорируется. | ||||||||||||||||||||||
33 | К°←′ | Перевод угловых или временных величин из части целого в обычную форму | Если дробная часть ⩽ 2.|−07, то обратное преобразование уже не срабатывает. Если = 1.|−07 то уже и прямое преобразование не меняет значение. Если целая часть шестнадцатеричное число и нет дробной части или оно = 1.|−07 – оно нормализуется, как в операциях с шестнадцатеричными цифрами. Иначе остаётся без изменений. | ||||||||||||||||||||||
34 | К[x] | Целая часть |
Простое отбрасывание дробной части, а не математическое нахождение
целой части, т. е. [−1.2] = −1, а не −2.
Если число целое и шестнадцатеричное – оно преобразуется, как в операциях с шестнадцатеричными цифрами. Если есть дробная часть, то целая шестнадцатеричная часть остаётся без изменений. |
||||||||||||||||||||||
35 | К{x} | Дробная часть |
Простое отбрасывание целой части, а не математическое нахождение
дробной части, т. е. {−1.2} = −0.2, а не 0.8.
Для целых чисел по модулю < 10.|+7, точнее числа, которым нужно меньше восьми знакомест, получается отрицательный ноль. В сравнениях идёт как отрицательное число и как ноль. Т. е. {−1234567} = −0, но {−12345678} = 0. Шестнадцатеричные цифры в дробной части сохраняются. |
||||||||||||||||||||||
36 | Кmax | Максимум |
Стек не сокращается, в отличие от обычных арифметических операций.
Ноль исключение – самое большое число.
Обмена X и Y не происходит, т. е. либо X и Y после операции совпадают, когда в Y был максимум, либо остаются как есть, кроме копирования X в X1. |
||||||||||||||||||||||
37 | К∧ | Логическое умножение битов (AND). См. Конъюнкция, Побитовое «И» |
В логических операциях первая цифра заменяется на 8, а над
остальными цифрами мантиссы проводится побитовая операция, как с
шестнадцатеричными числами. Порядок и знак исходных чисел
значения не имеют, они могут быть даже пустышкой.
Результат всегда в форме 8.HHHHHHH
Стек для двухоперандных операций не сокращается, что позволяет выполнить операцию ещё раз. Вообще для всех синихдвухоперандых операций стек остаётся на месте, что не документировано. Перед выполнением операнды нормализуются! |
||||||||||||||||||||||
38 | К∨ | Логическое сложение битов (OR). См. Дизъюнкция, Побитовое ИЛИ | |||||||||||||||||||||||
39 | К⊕ | Логическое XOR. См. Исключающее «или», Побитовое исключающее ИЛИ | |||||||||||||||||||||||
3A | КИНВ | Логическая инверсия (NOT). См. Отрицание, Побитовое отрицание | |||||||||||||||||||||||
3B | КСЧ | Случайное число |
Единица не бывает. Ноль бывает в редких случаях: когда в регистре Y
шестнадцатеричное число, то последовательность может выдавать и ноль.
Генератор
не очень хороший, часто циклится от применения команд с К.
Сбросить на начало, как при включении, можно с помощью операции Кmax, когда регистр Y нулевой. |
||||||||||||||||||||||
3C | Ошибка | ЕГГ0Г . | |||||||||||||||||||||||
3D | То же, что и команда К°→′" (код 2A) | ||||||||||||||||||||||||
3E | Копирование Y в X, а X→X1 | Те же действия, что и пара команд F↻ В↑, только не X2-влияющая. | |||||||||||||||||||||||
3F | Пустой оператор | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
40…4E | x→ПR | Сохранение X в регистр R0…Re | |||||||||||||||||||||||
4F | Сохранение X в регистр R0 | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
50 | С/П | Стоп/пуск |
Если во время выполнения программы нажать на С/П,
то счётчик команд будет указывать на следующую команду, даже если логика
выполнения это не преполагает. Например, при выполнении программы:
уйдетиз вечного цикла. Здесь подразумевается, что R7 = 0. |
||||||||||||||||||||||
51 | БП | Безусловный переход | |||||||||||||||||||||||
52 | В/О | Возврат обратно | Стек обратных адресов подпрограмм из 5 ячеек, вначале нулевых. При возврате из подпрограммы берётся значение верхней ячейки стека + 1, для определения точки возврата, и стек сдвигается, поэтому сразу после включения ПМК команда В/О эквивалентна БП01. Но если стек адресов возврата заполнился до конца, то последний адрес стека начинает копироваться и В/О будет на этот адрес + 1. Для зануления стека, в этом случае, можно воспользоваться знаниями Еггогологии и вызвать нулевого 3Г0ГГа: Cx В↑ ÷ ВП Fx2 Cx ←→ Cx. Или запустить ненадолго бесконечную программу из одного оператора, например KПП9, при условии, что R9 = 0. | ||||||||||||||||||||||
53 | ПП | Вызов подпрограммы | Переход на адрес подпрограммы, указанный следующей командой. Этот адрес запоминается в стеке обратных адресов. См. В/О. | ||||||||||||||||||||||
54 | КНОП | Пустой оператор | |||||||||||||||||||||||
55 | К1 | Пустой оператор | |||||||||||||||||||||||
56 | К2 | Пустой оператор | |||||||||||||||||||||||
57 | Fx≠0 | Если не ноль | Пропуск адреса перехода, и выполнение следующей после него команды, если X не равен нулю. | ||||||||||||||||||||||
58 | FL2 | Цикл по регистру R2 | |||||||||||||||||||||||
59 | Fx≥0 | Если больше или равен нулю | Пропуск адреса перехода, и выполнение следующей после него команды, если X больше или равен нулю. | ||||||||||||||||||||||
5A | FL3 | Цикл по регистру R3 | |||||||||||||||||||||||
5B | FL1 | Цикл по регистру R1 | |||||||||||||||||||||||
5C | Fx<0 | Если меньше нуля | Пропуск адреса перехода, и выполнение следующей после него команды, если X меньше нуля. | ||||||||||||||||||||||
5D | FL0 | Цикл по регистру R0 | |||||||||||||||||||||||
5E | Fx=0 | Если равен нулю | Пропуск адреса перехода, и выполнение следующей после него команды, если X равен нулю. | ||||||||||||||||||||||
5F | Зависание |
Визуально воспринимается как зависание. ПМК не реагирует на ввод
команд и ничего не отображает.
Обычным образом такую команду не ввести. |
|||||||||||||||||||||||
60…6E | П→xR | Извлечение из регистра R0…Re в X | |||||||||||||||||||||||
6F | Извлечение из регистра R0 в X | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
70…7E | Кx≠0R | Косвенный условный переход при неравенстве нулю, адрес перехода в регистре R0…Re | Пропуск адреса перехода, и выполнение следующей после него команды, если X не равен нулю. Регистр R модифицируется только при переходе на указанный в нём адрес. | ||||||||||||||||||||||
7F | Косвенный условный переход при неравенстве нулю, адрес перехода в регистре R0 |
Пропуск адреса перехода, и выполнение следующей после него команды,
если X не равен нулю. Регистр R0 модифицируется только
при переходе на указанный в нём адрес.
Обычным образом такую команду не ввести. |
|||||||||||||||||||||||
80…8E | КБПR | Косвенный безусловный переход на адрес перехода в регистре R0…Re | |||||||||||||||||||||||
8F | Косвенный безусловный переход на адрес перехода в регистре R0 | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
90…9E | Кx≥0R | Косвенный условный переход, если больше или равен нулю, адрес перехода в регистре R0…Re | Пропуск адреса перехода, и выполнение следующей после него команды, если X больше или равен нулю. Регистр R модифицируется только при переходе на указанный в нём адрес. | ||||||||||||||||||||||
9F | Косвенный условный переход, если больше или равен нулю, адрес перехода в регистре R0 |
Пропуск адреса перехода, и выполнение следующей после него команды,
если X больше или равен нулю. Регистр R0 модифицируется только
при переходе на указанный в нём адрес.
Обычным образом такую команду не ввести. |
|||||||||||||||||||||||
A0…AE | КППR | Косвенный вызов подпрограммы по адресу в регистре R0…Re | |||||||||||||||||||||||
AF | Косвенный вызов подпрограммы по адресу в регистре R0 | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
B0…BE | Кx→ПR | Косвенное сохранение X в регистр, по номеру в регистре R0…Re | |||||||||||||||||||||||
BF | Косвенное сохранение X в регистр, по номеру в регистре R0 | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
C0…CE | Кx<0R | Косвенный условный переход, если меньше нуля, адрес перехода в регистре R0…Re | Пропуск адреса перехода, и выполнение следующей после него команды, если X меньше нуля. Регистр R модифицируется только при переходе на указанный в нём адрес. | ||||||||||||||||||||||
CF | Косвенный условный переход, если меньше нуля, адрес перехода в регистре R0 |
Пропуск адреса перехода, и выполнение следующей после него команды,
если X меньше нуля. Регистр R0 модифицируется только
при переходе на указанный в нём адрес.
Обычным образом такую команду не ввести. |
|||||||||||||||||||||||
D0…DE | КП→xR | Косвенное извлечение X из регистра, по номеру в регистре R0…Re | |||||||||||||||||||||||
DF | Косвенное извлечение X из регистра, по номеру в регистре R0 | Обычным образом такую команду не ввести. | |||||||||||||||||||||||
E0…EE | Кx=0R | Косвенный условный переход, если равен нулю, адрес перехода в регистре R0…Re | Пропуск адреса перехода, и выполнение следующей после него команды, если X равен нулю. Регистр R модифицируется только при переходе на указанный в нём адрес. | ||||||||||||||||||||||
EF | Косвенный условный переход, если равен нулю, адрес перехода в регистре R0. Регистр R0 модифицируется только при переходе на указанный в нём адрес. |
Пропуск адреса перехода, и выполнение следующей после него команды,
если X равен нулю. Регистр R0 модифицируется только
при переходе на указанный в нём адрес.
Обычным образом такую команду не ввести. |
|||||||||||||||||||||||
F0…FF | Пустой оператор | Обычным образом такую команду не ввести. |
Все команды, которые приводят к ошибке при проверке границ, неверном аргументе или просто помеченные, как приводящие к ошибке, успевают скопировать X → X1 перед исполнением и выдачей ошибки. Но если возникает переполнение, например слишком большое число, то копирование X → X1 будет в операции, вызвавшей переполнения, а не когда ошибка проявится из-за перевода X → X2. Понятно, это только в программном режиме. Пример, в программе
# | | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
---|---|---|---|---|---|---|---|---|---|---|
00 | | Cx | Fπ | ÷ | С/П |
ошибка возникнет на шаге 02 из-за деления на ноль, и π попадёт в X1. А если так:
# | | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
---|---|---|---|---|---|---|---|---|---|---|
00 | | КНОП | 8 | Fx2 | F10x | Fx2 | КНОП | /-/ | ВП |
то переполнение будет на шаге 04, именно там 10.|+64 попадёт в X1, а команда /-/ только проявит ошибку на экране.
Среднее время выполнения некоторых команд на реальном ПМК для ориентировки. Фактически может отличаться до 10% в зависимости от партии контроллеров, которые использовались при монтаже калькулятора.
Время в секундах | Команды |
---|---|
0.20 | +, −, ×, ÷, Fx2, Fπ, F1/x, F10x при целом X, K[x], K{x}, K|x|, Kmax, K∨, K∧, KИНВ, K⊕, команды со стеком. |
0.22 | F√. |
0.26 | Ввод чисел в RX явно, или через извлечение из регистра, а также операции FBx и В↑. |
0.31 | Fxy если X и Y целые > 0. |
0.40 | KСч, FL0 … FL3. |
1.20 | F10x, Fex, FLg, FLn. |
1.50 | Тригонометрические функции. |
2.00 | Fxy. |
Нужно ещё учитывать, что при выполнении время чтения команд с дальних адресов немного, на 1…4% медленнее, чем с начальных.
Некоторые команды с цифрой F в коде можно получить тоже недокументированным образом.
Команды F0…FE получаются по адресам 30…44 после выполнения в режиме вычислений пары команд В/О КППR, R = 0…e, которые переведут ПМК в режим ввода программы и вставят код с цифрой F. При этом в регистрах R0…R3 должно быть число заканчивающееся на 1 или 2. Точнее такое, чтобы после косвенной адресации заканчивалось на 1 или 2. Если там будет другое, например, ноль, как после включения ПМК, то для R1…R3 вставится F0…F2 по адресу 30…32, а для R0 это будет самый быстрый способ получить 3Г0ГГа, причём перехода в режим ввода программы не произойдёт, но, увы, этот 3Г0ГГ очистку стека возврата не делает.
Так же по адресам 50…59 можно вставить команды, начинающиеся с цифры F. При этом можно даже управлять, на какую цифру заканчивается и по какому адресу именно вставиться в пределах указанного диапазона. Для этого сначала сделаем ЕГГ0Г, как число, а не ошибку. Например, как 5 0 F10x Fx2. Можно его и сохранить, чтобы повторить шаги. После появления ЕГГ0Га, так или извлечения из регистра, набираем ВП {D1} {D2} . 0, где {D1} и {D2} цифры. Так вот, в этот момент ПМК перейдёт в режим ввода программы и по адресу 5{D1}, и будет вставлена команда F{D2}. Т. е. при вводе ВП 3 7 . 0, по адресу 53 будет вставлена команда F7.
Последовательность 5 команд FF через одну можно получить
по любому адресу, если стек возврата забить
числом, начинающимся
с пустышки, и перед переходом в режим ПРГ нажимается
БП Адрес
. Тогда
начиная с адреса Адрес
−11 через одну будут проставлены команды FF.
Для начала получим адрес с начальной пустышкой, например число F8, и
сохраним в регистр, например в R7. Не забыть при этом в конце убрать
такое число с начальной пустышкой из RX!
8
8
8
В↑
7
7
K∨
K{x}
ВП
2
x→П7
Cx
Теперь по этому темному
адресу вставим команду вызова подпрограммы
по R7:
KБП7
FПРГ
KПП7
FАВТ
KБП7
Потом 5 раз, чтобы забить стек возврата, нажмём ПП
После этого уже выбираем, где нам нужны команды FF. Пусть мы хотим их с
адреса 80. Тогда делаем переход на 80 + 11 = 91
БП91 и
FПРГ
FАВТ
Теперь по адресам 80, 82, 84, 86, 88 добавилась команда FF. Если нужно
побольше, например ещё и по адресам 81, 83, 85, 87, 89, то просто снова
заполним стек возврата
KБП7,
5 раз ПП, и после
БП92 и
FПРГ
FАВТ
получим то, что хотели.
Не забудьте в конце почистить стек возврата как указано в примечание для
команды В/О!