PocketMK – эмулятор калькулятора МК-61

T:
Z:
Y:
X:
rad grad deg


Your browser does not support the HTML5 canvas tag.
Ввод программы

PocketMK – эмулятор семейства популярнейших советских программируемых калькуляторов БЗ-34...МК-61. Основное отличие эмулятора состоит в использовании незадействованных адресов команд, позволивших добавить еще один регистр F, команды для специальных функций (x!, sinh, cosh, tanh, asinh, acosh, atanh, erf, J0, J1, Y0, Y1), команды добавления к регистру (M+) и команды вывода графики в растровое изображение размером 400×300 точек. Имеется два основных режима работы: режим калькулятора, режим редактирования программы (включается галочкой в панели "Программа").

PocketMK использует обратную польскую форму записи. Например, для вычисления выражения 2+3*(6+7) надо выполнить следующие действия: 2 B↑ 3 B↑ 6 B↑ 7 + * + или более просто 6 B↑ 7 + 3 * 2 +. Использование функций аналогично. Например, вычислим синус от угла 37 градусов 30 минут. Сначала превратим минуты в десятичную дробь: 37.5. Переключив PocketMK в режим deg (переключатель находится в верхнем левом углу в режиме калькулятора), вводим это число последовательным нажатием клавиш 3 7 . 5 и берем от него синус, нажав клавиши F sin. На индикаторе читаем значение синуса: 0.6087614290087207. Если нужно ввести большое число, можно воспользоваться командой ввода порядка EE. При этом для отрицательных порядков за ней следует ввести команду ±. Например, 1 . 7 8 EE 5 3 дает 1.78e53, 2 . 5 6 EE ± 7 дает 2.56e-7, 3 ± EE 6 дает -3e6

Внешний вид

PocketMK имеет два режима работы: режим калькулятора (по умолчанию) и режим ввода программы. В режиме калькулятора PocketMK работает в интерактивном режиме – любая нажатая клавиша сразу же выполняется. Вверху находятся кнопки переключения ввода углов, содержимое стека {X,Y,Z,T} и кнопки управления программой. В средней части располагается клавиатура, вид которой зависит от состояния функциональных клавиш «F» и «K». Внизу находятся кнопки панели инструментов и панель меню.

Кнопки переключения ввода углов имеют следующее значение: deg – углы считаются в градусах (период sin(x) равен 360), grad – углы считаются в градах (период sin(x) равен 400), rad – углы считаются в радианах (период sin(x) равен 2π).

Окно отображения стека расположено сверху посередине. «Главный» регистр X выделен цветом, поскольку именно с ним выполняются все основные операции – сложение, вычитание, умножение и деление, вычисление функций, запись и считывание регистров, операции условного перехода. Остальные регистры стека являются скорее «дополнительными» и выводятся серым цветом.

Кнопки управления выполнением программы позволяют выполнить программу пошагово (Step) и запустить программу на автоматическое выполнение с текущей программной позиции (Run). Для остановки программы (например, в случае зацикливания) служит кнопка Stop, заменяющая кнопку Run при запуске программы.

Клавиатура отображается в режиме калькулятора и в режиме редактирования программы. Ее вид зависит от нажатия функциональных клавиш «F» и «K», располагающихся в левой верхней части клавиатуры. Для удобства пользователя цвета кнопок изменяются вместе с изменением их функциональности. Кроме того, графические команды выделены зеленым цветом, а команды обращения к регистрам фиолетовым. Часть кнопок имеет смысл только при выполнении программы (команды перехода, остановки программы и т.д., выделенные желтым). Действие остальных команд одинаково «полезно» в любом режиме. Отличие состоит в том, что в режиме калькулятора команды выполняются сразу, а в режиме ввода программы они записываются в программную память.

Регистры, стек и операции

PocketMK хранит числа в специальных переменных – регистрах. Каждый регистр памяти имеет свое обозначение в виде цифры или буквы. Шестнадцать из них обозначаются числами от 0 до 9 и начальными буквами латинского алфавита (A, B, C, D, E, F). По сути эти регистры являются обычными переменными, обращение к которым возможно произвольным образом. Еще четыре регистра образуют стек и обозначаются латинскими буквами (X, Y, Z, T). Прямой доступ возможен только к одному регистру из них – регистру X. Остальные регистры участвуют в вычислениях и доступны только с помощью команд работы со стеком. Последний из регистров (называемый B или X1) хранит информацию о предыдущем значении регистра X и может быть только прочитан с помощью команды Bx. Часто в описаниях программ перед регистром ставят букву R (например, RA – регистр А), чтобы отличать регистр от буквы. Регистры X, Y, Z, T отображаются на экране калькулятора. Регистры 0,1,...,F можно посмотреть в панели «Регистры».

При вводе в калькулятор число заносится в регистр X. Прочитать число в регистрах 0,1,...,F можно с помощью кнопки MR (от английского «memory read»). Например, команда MRA впишет число из регистра A в регистр Х. Аналогично команда MSA (от английского «memory save») запишет число из регистра Х в регистр А. Команда M+A прибавит число из регистра Х к числу, хранящемуся в регистре А. Команда M+ отсутствовала в МК-61 и была введена для удобства работы и программирования различных статистических приложений.

Каждая операция калькулятором выполняется либо над одним числом, находящимся в регистре X (операция одноместная: x2, sin, erf и т.д.), либо над двумя числами, одно из которых находится в регистре X, а другое - в регистре Y. Отличительной особенностью этого калькулятора является то, что операция, которую следует производить с двумя числами, выполняется после ввода двух чисел – используется так называемая польская или постфиксная запись выражений.

Числа, над которыми нужно совершить ту или иную арифметическую операцию, должны находиться в двух регистрах – X и Y. В регистр Y можно попасть только из регистра X. Делается это нажатием клавиши B↑. При этом в регистре X остается копия числа. Затем в регистр X записывается второе число, причем первое число стирается. В случае вычитания уменьшаемое должно находиться в Y, а вычитаемое – в X. При делении в Y должно находиться делимое, в X – делитель. После ввода числа в оба регистра, можно нажать клавишу выбранной операции. Результат ее будет помещен в регистр X. То, что было прежде в регистре Y, не сохранится. Здесь следует обратить внимание на то, что если в регистре X находился результат операции, то ввод нового числа в регистр X автоматически передвигает старое содержимое регистра X в регистр Y. Исключением являются операции очистки регистра Cx и операция B↑.

Наконец, в таблице приведено состояние стека до и после применения различных операций:

ОперацияСтек доСтек после
Ввод числа r из регистра или числа πb x y z tb r x y z
Ввод числа n после Сх, B↑b x y z tb n y z t
Ввод числа n после других операцийb x y z tb n x y z
Команда Cxb x y z tb 0 y z t
Команда B↑b x y z tb x x y z
Команда Bxb x y z tb b x y z
Команда b x y z tx y x z t
Команда b x y z tx y z t x
Вычисление функции f(x)b x y z tx f y z t
Двуместная операция gb x y z tx g z t t
Команда B↓b x y z tx y z t t

Программирование

Составим теперь простую программу вычисления площади круга. Формула для вычисления площади круга известна: S=πD2/4, где D – диаметр круга. Константа π уже есть в калькуляторе. Величину D необходимо вручную ввести с клавиатуры (оно будет помещено в регистр X). Пусть D = 3. Для ручного расчета нужно нажать клавиши: x2 F pi * 4 /. На индикаторе читаем результат: 7.0685834705770345. Те же клавиши и в той же последовательности нужно будет нажать, когда мы станем вводить в калькулятор программу для вычисления площади круга.

Программа располагается в калькуляторе в виде отдельных команд, каждая из которых занимает свою ячейку программной памяти (некоторые управляющие – две ячейки – команда и адрес). Всего таких ячеек 160. Им присвоены номера, называемые адресами – от #00 до #F9. В силу совместимости с МК-61 нумерация сделана так, что первая цифра шестнадцатеричная, а вторая всего лишь десятичная. Например, адрес #F9 = 0xF*10+9 = 159. Такая вот смесь ☺ !

Чтобы ввести программу в калькулятор, надо перевести его в состояние, называемое режимом редактирования программы. В режиме редактирования PocketMK нажатие клавиш приводит к вводу команды в программную память вместо ее непосредственного выполнения. Для перехода в режим редактирования программы следует раскрыть панель программа и поставить галочку напротив Ввод программы. Стрелки в этой панели перемещают курсор (текущий адрес), кнопки Ins и Del добавляют и удаляют текущую/последнюю ячейку программы. Адрес первой команды в строке указывается перед двоеточием. Текущая позиция курсора выделена голубым. Курсор не показывается если он находится за последней командой (калькулятор готов к добавлению новой команды).

Нажимаем x2 и в программе появляется x2. Ее появление в таблице означает, что команда занесена в программную память. Одновременно прямоугольник сместился вправо – счетчик адресов увеличился на 1. Далее нажимаем F π и в программе появляется π (модификатор F в программе всегда опускается) и т.д. Таким образом вводятся все команды. Для останова работы калькулятора по программе необходимо ввести специальную команду: stop (клавиши F stop).

Чтобы проверить работу программы вернемся в режим калькулятора (сняв галочку), введем диаметр круга и запустим программу кнопкой Run. На мгновение мигнет индикатор Stop вместо Run и программа выдаст ответ. Кнопка Stop предназначена для останова программы (например, в бесконечном цикле). Для пошагового исполнения программы (в целях отладки или в качестве одного из способов ввода чисел) можно воспользоваться кнопкой Step. Ее действие полностью аналогично Run, но будет исполнена только текущая команда.

Следует отметить, что в отличие от калькулятора MK-61, переход в начало программы осуществляется автоматически, если курсор не виден (ожидается добавление новой команды). Кроме того, программа автоматически останавливается при достижении конца введенных команд (команда stop в конце программы не обязательна).

Команды перехода

Для безусловного перехода на адрес программы используется клавиша go (аналог команды БП – безусловный переход). После команды следует указать адрес перехода. Например, для того, чтобы перейти на адрес 60, надо нажать клавиши: go 6 0. Эта команда работает только в программном режиме и занимает две ячейки памяти: первая ячейка – код команды перехода, вторая – адрес перехода. Отмечу, что для совместимости с программами МК–61 пришлось ввести «странную» систему адресов. Всего ячеек 160 с адресами – от 00 до F9. При этом адрес состоит их двух цифр: первая цифра шестнадцатеричная, а вторая десятичная. Например, адрес #F9 = 0xF*10+9 = 159.

Чтобы вызвать подпрограмму, используется команда sub (аналог команды ПП – переход на подпрограмму). Так же, как и в команде безусловного перехода, необходимо указать адрес, с которого начинается подпрограмма. Команда возврата из подпрограммы – ret (аналог команды В/О). Подпрограммы могут вкладываться друг в друга.

Также есть специальные команды, которые изменяют порядок выполнения программы в зависимости от содержимого регистра X. Это команды x<0, x≥0, x=0, x≠0. Если условие выполняется, то управление передается на команду, следующую за командой условия (напомним, что команда условия занимает 2 ячейки – команда и адрес), в противном случае – управление передастся на указанный адрес. Например, с адреса 20 мы введем строку: F x<0 25, тогда если содержимое регистра X будет меньше нуля, то программа продолжится с адреса 22, а если ноль и больше, то с адреса 25.

Для организации циклов предусмотрены специальные команды L0, L1, L2, L3. После ввода этих команд также необходимо указать адрес перехода. Каждая команда ассоциирована с регистрами от 0 до 3, соответственно. После выполнения команды происходит вычитание единицы из этого регистра и сравнение результата с нулем. Если результат равен нулю, то программа продолжит свое выполнение со следующего адреса. Иначе – перейдет на указанный адрес перехода. Напишем программу вычисления факториала. Сначала перейдем в режим программирования с помощью меню или панели управления. Затем вводим программу: MS0 1 MR0 * L0 02. После ввода программы переходим в режим калькулятора, вводим число вводится с клавиатуры и нажимаем кнопку Run. В результате в регистре X появляется факториал числа. Можно проверить вычисленное значение нажав ↔ K x!.

Все команды PocketMK имеют уникальный номер в диапазоне 0...255. Полный список команд с указанием их кодов можно найти в таблице. Здесь номер строки дает старший разряд, номер столбца – младший разряд номера команды. Например, команда |x| имеет номер 0x31.

x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF
x000123456789.±EECxB↑Bx
x10+*/10xexlglnasinacosatansincostanY0
x20πsqrtx21/xxyB↓shchtherfx!asinhacoshatanhY1
x30col|x|signcls[x]{x}maxandorxornotrndpntlinerectarc
x40MS0MS1MS2MS3MS4MS5MS6MS7MS8MS9MSAMSBMSCMSDMSEMSF
x50stopgoretsubnopJ0J1x≠0L2x≥0L3L1x<0L0x=0wait
x60MR0MR1MR2MR3MR4MR5MR6MR7MR8MR9MRAMRBMRCMRDMREMRF
x70Kx≠00Kx≠01Kx≠02Kx≠03Kx≠04Kx≠05Kx≠06Kx≠07Kx≠08Kx≠09Kx≠0AKx≠0BKx≠0CKx≠0DKx≠0EKx≠0F
x80Kgo0Kgo1Kgo2Kgo3Kgo4Kgo5Kgo6Kgo7Kgo8Kgo9KgoAKgoBKgoCKgoDKgoEKgoF
x90Kx≥00Kx≥01Kx≥02Kx≥03Kx≥04Kx≥05Kx≥06Kx≥07Kx≥08Kx≥09Kx≥0AKx≥0BKx≥0CKx≥0DKx≥0EKx≥0F
xA0Ksub0Ksub1Ksub2Ksub3Ksub4Ksub5Ksub6Ksub7Ksub8Ksub9KsubAKsubBKsubCKsubDKsubEKsubF
xB0KMS0KMS1KMS2KMS3KMS4KMS5KMS6KMS7KMS8KMS9KMSAKMSBKMSCKMSDKMSEKMSF
xC0Kx<00Kx<01Kx<02Kx<03Kx<04Kx<05Kx<06Kx<07Kx<08Kx<09Kx<0AKx<0BKx<0CKx<0DKx<0EKx<0F
xD0KMR0KMR1KMR2KMR3KMR4KMR5KMR6KMR7KMR8KMR9KMRAKMRBKMRCKMRDKMREKMRF
xE0Kx=00Kx=01Kx=02Kx=03Kx=04Kx=05Kx=06Kx=07Kx=08Kx=09Kx=0AKx=0BKx=0CKx=0DKx=0EKx=0F
xF0M+0M+1M+2M+3M+4M+5M+6M+7M+8M+9M+AM+BM+CM+DM+EM+F

В целом система команд основана на системе команд популярных советских микрокалькуляторов БЗ-34 или МК-61. Так что практически любая программа с МК-61 (не использующая недокументированные возможности) будет работать и на PocketMK. Однако, есть и несколько отличий. PocketMK использует фортрановские символьные обозначения функций: asin для арксинуса, tan вместо tg для тангенса и т.д. Кроме того, имеется различное начертание ряда команд с более устоявшимся англоязычным обозначением:

PocketMKБЗ-34MK-61
MRИПП→X
MSПХ→П
rndКСЧ
signКЗН
stopС/ПС/П
retВ/ОВ/О
goБПБП
subПППП

В PocketMK добавлен ряд команд (выделены цветом в таблице):

  1. графических (pnt, line, rect, arc, col, cls) для рисования точки (х,у), линии в точку (х,у), прямоугольника из текущей до точки (х,у), дуги из текущей до точки (х,у), задания цвета (можно задавать и вручную выбором из палитры) и очистки экрана;
  2. спец. функций (erf(x), sinh(x), cosh(x), tanh(x), asinh(x), atanh(x), x! = Г(x+1), j0(x), y0(x), j1(x), y1(x));
  3. прибавления регистра Х к числу в указанном регистре (команда М+);
  4. удаления числа из стека (команда B↓).

Удалены редко использующиеся (по крайней мере автором) команды по преобразованию углов в минуты, секунды и обратно. Операция xy теперь стала настоящей двуместной операцией (содержимое регистра Y не сохраняется).

В нормальном виде клавиатура содержит довольно ограниченный набор часто используемых кнопок. Доступ к большинству научных функций и управляющих команд возможен после нажатия клавиш F, K или обоих сразу (для графических команд).

Ввод числа

Ввод числа осуществляется командами 0 1 2 3 4 5 6 7 8 9 . ± EE. Команды 0 1 2 3 4 5 6 7 8 9 . вводят непосредственно цифры мантиссы или порядка. Команда ± меняет знак числа в регистре Х, если введена до команды EE или знак порядка, если после. Команда EE указывает, что дальнейший ввод относится к вводу порядка. Нажатие любой другой клавиши (кроме функциональных F или K) прерывает ввод числа. При вводе нового числа предыдущее значение регистра Х поднимается вверх по стеку, если перед этим не была выполнена одна из команд Cx или B↑.

Важно! Команда EE превращает 0 в 1 (при этом в стеке меняется только значение регистра Х, остальные регистры стека сохраняют свои значения). Эта недокументированная особенность советских калькуляторов часто использовалась в программах.

Совет! Команда EE изменяет порядок любого числа в регистре Х. Поэтому для быстрого умножения числа на 10n в программе можно воспользоваться кодом EE n, занимающим всего две ячейки памяти при n=1...9.

Команды работы со стеком

К этой группе относятся команды Cx B↑ ↔ Bx ↻ B↓. Напомним, что PocketMK использует стек из 4х регистров (X,Y,Z,T) и регистр B для хранения предыдущего значения Х. Исходное значение стека будем считать равным b x y z t.

CxОбнуляет регистр Х. Ввод числа после этой команды не изменяет содержимое стека.
B↑Поднимает число Х вверх. Стек изменяется следующим образом b x x y z. Ввод числа после этой команды не изменяет содержимое стека.
Меняет содержимое регистров X и Y местами. Стек изменяется следующим образом x y x z t.
BxВозвращает значение регистра Вх в Х. Стек изменяется следующим образом b b x y z.
Вращает содержимое стека. Стек изменяется следующим образом x y z t x.
B↓Удаляет содержимое регистра Х со сдвигом стека вниз. Стек изменяется следующим образом x y z t t.

Двуместные операции

Операции выполняются над числами в регистрах X и Y. При этом содержимое регистра Y теряется, а регистры Z и T смещаются вниз. Значение регистра Х заносится в регистр В. Стек b x y z t изменяется следующим образом x g z t t, где g – результат операции. Рассмотрим команды подробнее.

+Сложение чисел X=Y + X.
Разность чисел X=Y – X.
*Умножение чисел X=Y * X.
/Деление чисел X=Y / X.
xyВозведение в степень X=XY.
andПобитовое И. Дробная часть чисел отбрасывается.
orПобитовое ИЛИ. Дробная часть чисел отбрасывается.
xorПобитовое Исключающее ИЛИ. Дробная часть чисел отбрасывается.
maxМаксимальное из чисел X и Y.

Математические функции

Вызов функции относится к одноместным операциям, не затрагивающим содержимое регистров Y, Z, T. Значение аргумента всегда заносится в регистр В. Результат действия функции помещается в регистр Х. Для обратных функций на советских калькуляторах использовались обозначения f(x)-1 (например, sin-1), в PocketMK они заменены на стандартные компьютерные обозначения с добавление буквы a перед именем функции (например, asin).

10xВозведение в степень 10x = exp(x*log(10)).
exЭкспонента ex = exp(x), где e = 2.718281828459.
lgДесятичный логарифм lg(x)=ln(x)/ln(10), lg(10x)=x.
lnНатуральный логарифм, ln(exp(x))=x.
sinСинус sin(x), вычисляется в зависимости от выбора deg|grd|rad.
cosКосинус cos(x), вычисляется в зависимости от выбора deg|grd|rad.
tanТангенс tan(x)=sin(x)/cos(x), вычисляется в зависимости от выбора deg|grd|rad.
asinАрксинус asin(sin(x))=x, вычисляется в зависимости от выбора deg|grd|rad.
acosАрккосинус acos(cos(x))=|x|, вычисляется в зависимости от выбора deg|grd|rad.
atanАрктангенс atan(tan(x))=x, вычисляется в зависимости от выбора deg|grd|rad.
shГиперболический синус sh(x) = (ex – e-x)/2.
chГиперболический косинус ch(x)=(ex + e-x)/2.
thГиперболический тангенс th(x)=sh(x)/ch(x).
ashГиперболический арксинус ash(sh(x))=x.
achГиперболический арккосинус ach(ch(x))=|x|.
athГиперболический арктангенс ath(th(x))=x.
xКорень квадратный sqrt(x2) = |x|.
x2Квадрат числа.
1/x
erfИнтеграл вероятности erf(x) = ∫exp(-x2)dx.
x!Факториал x!=Г(x+1), Г(x) – гамма функция.
J0Функция Бесселя J0.
J1Функция Бесселя J1.
Y0Функция Бесселя Y0.
Y1Функция Бесселя Y1.
|x|Абсолютное значение |x| = {x для x≥0; –x для x<0}
signЗнак числа: 1 для x>0, 0 для x=0, -1 для x<0.
[x]Целая часть числа.
{x}Дробная часть числа.
rndСлучайное число. В отличии от МК-61 не зависит от числа X. Из соображений совместимости, случайное число не изменяет стек (как в случае с π).
notПобитовое отрицание. Дробная часть чисел отбрасывается.

Работа с регистрами

Для работы с регистрами предназначены три группы команд.

  1. Команды MSN записывают значение регистра Х в регистр N. Значение регистра Х не изменяется.
  2. Команды M+N прибавляют значение регистра Х к числу в регистре N и записывают результат в регистр N. Значение регистра Х не изменяется.
  3. Команды MRN присваивают регистру X значение из регистра N. Стек b x y z t изменяется следующим образом b n x y z, где n – значение в регистре N.
  4. Немножко в стороне стоит команда π. Ее действие полностью аналогично командам MRN, но в регистр Х записывается число π=3.141592653589793.
Каждая из команд присвоения регистру имеет отдельный уникальный номер. Это сделано для совместимости с программами для МК-61.

Совет! Ввод небольшого числа данных (до 16 чисел) в программу удобно выполнять с помощью заполнения регистров памяти перед запуском программы.

Совет! Ввод данных в программу можно выполнять с помощью кнопки Step. Кусок соответствующей программы будет выглядеть следующим образом: MS1 MS2 MS3 .... Идея состоит в пошаговом исполнении программы, когда число в регистре Х меняется пользователем на каждом шаге.

Совет! Часто программы используют константы (или типичные начальные условия). Их можно сохранить вместе с программой если пометить соответствующие регистры при сохранении.

Совет! Иногда удобней (особенно в играх) загрузить программу с заполненными регистрами заново, чем вводить цифры вручную.

Управление программой

Эта группа команд осуществляет управление выполнением программы. Как правило, команды из этой группы требуют 2 ячейки памяти: одна ячейка под саму команду, а вторая ячейка на адрес перехода для этой команды.

stopОстанавливает выполнение программы.
waitПриостанавливает выполнение программы на 1 секунду. Удобно использовать в динамических играх.
nopНе выполняет никаких действий.
goБезусловный переход на адрес перехода.
subВызов подпрограммы с адреса перехода.
retВозврат из подпрограммы. При пустом стеке возврата происходит возврат на нулевой адрес (начало программы).
x≠0Если условие X≠0 выполнено, выполняется команда, следующая после адреса перехода, в противном случае производится переход по адресу перехода.
x<0Если условие X<0 выполнено, выполняется команда, следующая после адреса перехода, в противном случае производится переход по адресу перехода.
x=0Если условие X=0 выполнено, выполняется команда, следующая после адреса перехода, в противном случае производится переход по адресу перехода.
x≥0Если условие X≥0 выполнено, выполняется команда, следующая после адреса перехода, в противном случае производится переход по адресу перехода.
L0После выполнения команды происходит вычитание единицы из регистра 0. Если результат R0≤0, то продолжится выполнение со следующего адреса. Иначе – перейдет на указанный адрес перехода.
L1После выполнения команды происходит вычитание единицы из регистра 1. Если результат R1≤0, то продолжится выполнение со следующего адреса. Иначе – перейдет на указанный адрес перехода.
L2После выполнения команды происходит вычитание единицы из регистра 2. Если результат R2≤0, то продолжится выполнение со следующего адреса. Иначе – перейдет на указанный адрес перехода.
L3После выполнения команды происходит вычитание единицы из регистра 3. Если результат R3≤0, то продолжится выполнение со следующего адреса. Иначе – перейдет на указанный адрес перехода.

Совет! Для быстрого возврата на нулевой адрес можно использовать команду ret. Это работает, если стек возвратов пустой (не выполняется подпрограмма в данный момент).

Совет! Использование команды wait и переключателя deg|grd|rad позволяет создавать динамические программы. Идея состоит в том, что функция cos выдает различные значения в зависимости от положения переключателя. Например, следующий код wait MR9 cos sign будет ожидать реакции пользователя 1 секунду и возвращать -1, 0, 1 для переключателя deg|grd|rad соответственно, если R9=100.

Косвенная адресация

Команды косвенной адресации начинаются с нажатия кнопки K и всегда занимают одну ячейку памяти. После нажатия K вводится одна из команд MS, MR, go, sub, x<0, x≥0, x=0, x≠0 и номер регистра. На клавиатуре команды косвенной адресации выделены фиолетовым цветом. При косвенной адресации (индексации) в командах KMS и KMR запись и считывание числа производится из регистра с номером равным остатку от деления на 16 числа в указанном регистре. Переход по адресу в командах Kgo, Ksub, Kx<0, Kx≥0, Kx=0, Kx≠0 производится по остатку от деления содержимого регистра на 160.

Перед выполнением действия значение регистра модифицируется. Если номер регистра 0, 1, 2, 3, то его значение уменьшается на единицу. Если номер регистра равен 4, 5, 6, то значение регистра увеличивается на единицу. Остальные регистры не изменяются.

Например, команда KMS0 поместит значение регистра X в регистр, номер которого указан в регистре 0, но меньший на 1. Команда KMR4 поместит в регистр X значение регистра, указанного в регистре 4, но больший на 1. Команда Kgo9 переведет работу программы на адрес, указанный в регистре 9. Аналогично переход на подпрограмму, адрес которой указан в регистре B, выполняется командой KsubB. Команда Kx=0A аналогична команде x=0 XX, но адрес перехода XX указывается в регистре A, и команда занимает одну ячейку памяти.

Следует обратить внимание, что если в регистр поместить дробное число, а затем к этому регистру применить команду косвенного вызова, то от помещенного числа будет отброшена дробная часть. Например, поместив число 12.34567 в регистр 9 и выполнив команду KMR9, в регистре 9 останется число 12. Эта «недокументированная» особенность в программах БЗ-34 часто использовалась для отделения целой части числа и была сохранена в PocketMK.

Графические команды

В PocketMK добавлены 6 графических команд: cls, col, pnt, line, rect, arc. Графический вывод производится в растровую картинку размером 400*300 с началом координат в левом нижнем углу. Все точки вне этих границ игнорируются.

Обработка ошибок

В ходе расчетов могут возникать ошибочные ситуации (например, деление на 0, извлечение корня из отрицательно числа и т.д.). В этом случае на экране показывается сообщение NaN или Infinity. Работа программы автоматически останавливается при возникновении ошибочной ситуации.

Советы