Документация Help

Команды виртуальной машины

GET_VM_VERSION

Формат: GET_VM_VERSION

Кладет на вершину стека числовое значение - версию спецификации реализуемую кодом.

stack.push(RUNTIME_VERSION)

JMP (безусловный переход)

Формат: JMP <метка>

Заносит в регистр pc номер команды, указанной меткой.

context.pc = labels[statement.targetLabel] ?: 0

JMP_TRUE (условный переход)

Формат: JMP_TRUE <метка>

Берет с вершины стека значение типа boolean. Если оно равно true - заносит в регистр pc номер команды, указанной меткой.

if (stack.popBool()) context.pc = labels[statement.targetLabel] ?: 0

JMP_FALSE (условный переход)

Формат: JMP_FALSE <метка>

Берет с вершины стека значение типа boolean. Если оно равно false - заносит в регистр pc номер команды, указанной меткой.

if (!stack.popBool()) context.pc = labels[statement.targetLabel] ?: 0

SKIP_TRUE (условный пропуск команды)

Формат: SKIP_TRUE

Берет с вершины стека значение типа boolean. Если оно равно true - увеличивает значение регистра pc на 1.

if (stack.popBool()) context.pc++

SKIP_FALSE (условный пропуск команды)

Формат: SKIP_FALSE

Берет с вершины стека значение типа boolean. Если оно равно false - увеличивает значение регистра pc на 1.

if (stack.popBool()) context.pc++

CALL (вызов подпрограммы)

Формат: CALL <метка> <количество аргументов>

  • Сохраняет в стеке значение регистра pc (с типом Int)

  • Сохраняет в стеке значение регистра bp (с типом Int)

  • Сохраняет в стеке значение <количество аргументов> (с типом Int)

  • Заносит в регистр bp - указатель на вершину стека

  • Заносит в регистр pc номер команды, указанной меткой.

stack.push(context.pc) stack.push(context.bp) stack.push(statement.argumentsCount) context.bp = stack.lastIndex context.pc = labels[statement.label] ?: 0

RETURN (возврат из подпрограммы)

Формат: RETURN

  1. Снимает с вершины стека значение

  2. Удаляет с вершины стека все значения после указанного регистром bp

  3. Снимает с вершины стека значение (с типом int)

  4. Снимает с вершины стека значение (с типом int) и заносит его в регистр bp

  5. Снимает с вершины стека значение (с типом int) и заносит его в регистр pc

  6. Удаляет с вершины стека элементы количеством равным значению из п.п. 3

  7. Кладет на вершину стека значение полученное в п.п. 1

val returnValue = stack.pop() ?: 0 while (stack.lastIndex > context.bp) stack.pop() val arguments = stack.pop().toInt() context.bp = stack.pop().toInt() context.pc = stack.pop().toInt() repeat(arguments) { stack.pop() } stack.push(returnValue)

ARGUMENT (получение значения аргумента)

Формат: ARGUMENT <номер аргумента>

Кладет на вершину стека значение взятое из стека (без удаления) с конца со смещением равным bp - <номер аргумента> - 3

stack.push(stack.at(context.bp - statement.index - 3))

AND (логическое И)

Формат: AND

Снимает с вершины стека 2 значения (типа boolean) и кладет обратно на вершину стека результат логической операции И.

val op1 = stack.popBool() val op2 = stack.popBool() stack.push(op1 && op2)

OR (логическое ИЛИ)

Формат: OR

Снимает с вершины стека 2 значения (типа boolean) и кладет обратно на вершину стека результат логической операции ИЛИ.

val op1 = stack.popBool() val op2 = stack.popBool() stack.push(op1 || op2)

XOR (логическое исключающее ИЛИ)

Формат: XOR

Снимает с вершины стека 2 значения (типа boolean) и кладет обратно на вершину стека результат логической операции XOR.

val op1 = stack.popBool() val op2 = stack.popBool() stack.push(op1 xor op2)

NOT (логическое отрицание)

Формат: NOT

Снимает с вершины стека 1 значение (типа boolean) и кладет обратно на вершину стека результат логической операции NOT.

stack.push(!stack.popBool())

LESS (сравнение)

Формат: LESS

Снимает с вершины стека 2 значения (типа int) и кладет обратно на вершину стека результат их сравнения.

stack.push(stack.pop().toInt() < stack.pop().toInt())

MORE (сравнение)

Формат: MORE

Снимает с вершины стека 2 значения (типа int) и кладет обратно на вершину стека результат их сравнения.

stack.push(stack.pop().toInt() > stack.pop().toInt())

EQUAL (сравнение)

Формат: EQUAL

Снимает с вершины стека 2 значения (типа int) и кладет обратно на вершину стека результат их сравнения.

stack.push(stack.pop().toInt() == stack.pop().toInt())

DEFINE_BITMAP (создание изображения)

Формат: DEFINE_BITMAP <идентификатор изображения> <ширина> <высота>

Создает в рабочем списке объектов bitmap новый объект с указанными значениями идентификатора и размерами.

bitmaps.getOrPut(statement.id) { BitmapRef(statement.width, statement.height) }

STORE (ввод значения)

Формат: STORE "<строка>"

Сохраняет на вершине стека значение <строка> (типа string) (без символов ")

stack.push(statement.value)

DROP (удаление значения)

Формат: DROP

Снимает с вершины стека одно значение.

stack.pop()

DUP (копирование значения)

Формат: DROP

Снимает с вершины стека одно значение и кладет его обратно дважды.

stack.push(stack.peek() ?: false)

SWAP (обмен значений на вершине стека)

Формат: SWAP

Снимает с вершины стека два значения и кладет их в обратном порядке.

val op1 = stack.pop() ?: false val op2 = stack.pop() ?: false stack.push(op1) stack.push(op2)

SELECT (выбор)

Формат: SELECT <onTrue>" "<onFalse>"

Снимает с вершины стека значение (типа boolean) и, если оно равно true - кладет на вершину стека <onTrue>, иначе <onFalse>

stack.push(if (stack.popBool()) statement.onTrue else statement.onFalse)

STATUS (получение статуса)

Формат: STATUS <id>

Кладет на вершину стека значение статуса (типа boolean) c указанным <id>.

stack.push(statuses[statement.id] ?: false)

FETCH_BITMAP_INTO (загрузка фрагмента изображения)

Формат: STATUS <id>

Снимает с вершины стека значение (типа string) и загружает указанный в дескрипторе файл с идентификатором равным значению, снятому с вершины стека, в рабочий объект bitmap с идентификатором <id>

bitmaps[statement.target]?.let { context.fetchBitmap(stack.pop() as String, it) }

COLORIZE_BITMAP (замена цвета)

Формат: COLORIZE_BITMAP <id> <hue> <saturation> <lightness> <delta>

Заменяет цвет, указанный значениями <hue>, <saturation>, <lightness>, <delta> в рабочем объекте bitmap и идентификатором id на цвет, полученный из API МП.

bitmaps[statement.id]?.let { context.colorizeBitmap(it, statement.primaryColor, statement.hueRange) }

BLEND_BITMAP (наложение изображения)

Формат: BLEND_BITMAP <source> INTO <target>

Накладыват изображение рабочего объекта bitmap с идентификатором <source> на изображение рабочего объекта bitmap с идентификатором target с учетом прозрачности изображений.

val src = bitmaps[statement.sourceId] val tgt = bitmaps[statement.targetId] if (src != null && tgt != null) tgt.drawOn(src)

RETURN_BITMAP (завершение работы)

Формат: RETURN_BITMAP <id>

Завершает выполнение скрипта. Как результат всей работы принимается изображение, содержащееся в рабочем объекте bitmap с идентификатором <id>. Все остальные рабочие объекты bitmap удаляются.

FORMAT (форматирование строки)

Формат: FORMAT <num> <строка>

Снимает с вершины стека <num> значений. Заменяет в строке <строка> специально оформленные метки на значения, снятые со стека. Полученная строка кладется обратно на вершину стека.

Метка

Действие

%s

заменяет на строковое значение

stack.push(statement.formatString.format(*Array(statement.count) { stack.pop() ?: "" }))
Last modified: 30 декабря 2023