Связь с администрацией сайта:       

demo

Среди толпы я одинок

15. Словарь опкодов в Z-машине

Самый высокий идеал перевода ... достигается, когда читатель швыряет нетерпеливо перевод в огонь, и начинает терпеливо изучать язык.
Philip Vellacott
15.1
Словарь ниже в алфавитном порядке и включает в себя записи на каждый опкод, указанный в приведенных таблицах выше, а также краткие заметки о нескольких опкодах, которые когда-то существовали, но теперь убраны.
 
15,2
Z-машина имеет ту же концепцию "таблиц" (как и внутренние структуры данных) в Inform. В частности, таблица представляет собой массив слов (в динамической или статической памяти), в которых исходная запись и число последующих слов в таблице. Например, таблица с тремя записями занимает 8 байт, расположенных как 3 слова, х, y, z.
15,3
Во всех случаях, где один из операндов должен быть в определенном диапазоне, то его  поведение не определено, если это не было сделано. Например, интерпретатор соответствует стандарту, даже если он выходит из строя, когда неизвестный номер объекта (в том числе 0) задается для объекта операнда. Тем не менее, см S А для главных принципов, касающихся выявления и работы с ошибками.
add
2OP: 20 14 add a b -> (result)
 16-разрядное дополнение.
 
and
2OP:9 9 and a b -> (result)
Побитовое.
aread
Это опкод Inform для чтения клавиатуры под версии 5 и более поздних версий. (В Inform sread под Версии 3 и 4) См read в спецификации.
art_shift
EXT:3 3 5/- art_shift number places -> (result)
Имеется ли арифметический сдвиг number(числа). Сдвиг вправо, бит знака сохраняется, а также сдвигается вниз. (Альтернатива поведение log_shift .)
Операнд "places" должен находиться в диапазоне от -15 до +15, в противном случае поведение не будет определено.
buffer_mode
VAR:242 12 4 buffer_mode flag
Если mode установлено на 1, вывод текста на нижнем окне в потоке 1 буферизуется так, что он может переноситься должным образом. Если установлено значение 0, действие будет иным.
В версии 6, этот опкод является излишним (атрибут окна "buffering" может быть установлен вместо этого). Он используется дважды в каждом из 6 -й версии сюжетных файлов Infocom, в процедурe $verifyFrotz устанавливает атрибут "buffering" для текущего окна, в то время как собственные интерпретаторы Infocomустанавливают его, но ничего не делая. Этот стандарт отошел на задний план и как результат buffer_mode не определен в версии 6.
buffer_screen
EXT:29 1D 6/* buffer_screen mode -> (result)
Сообщает интерпретатору, что нужно делать буферизацию с дисплея. Если mode равен 0, обновления должны быть сделаны как можно чаще. Если mode равен 1, то интерпретатор может вносить изменения в резервное хранилище, а также нет крайней необходимости в обновлении экрана. Интерпретатор может игнорировать настройки данного опкода программистом, по умолчанию режим 0 (обновление экрана как можно чаще).
С buffer_screen в любом состоянии, обновление видимого дисплея может быть принуждаемым параметром путем установки buffer_screen -1, без изменения текущего состояния буферизации. Обратите внимание, что buffer_screen -1 не очищает текстовый буфер.
Возвращаемым значением будет старым состоянием buffer_screen.
См S 8 для более подробной информации.
*** [1.1] Этот опкод будет присутствовать только в интепретаторах, подчиняющихся Стандарту 1.1 или более поздних версий, поэтому файлы истории должны проверить номер Стандарта интепретатора перед выполнением этого опкода.
call
VAR:224 0 1 call routine ...up to 3 args... -> (result)
Команда callработаеттолько в версии 3, Informиспользует call_vs в более поздних версиях: она вызывает подпрограмму с 0, 1, 2 или 3 аргументами и сохраняет результирующее возвращаемое значение. (Когда адрес 0 вызывается процедура, ничего не происходит, а возвращаемое значение будет false)
call_1n
1OP:143 F 5 call_1n routine
Выполняет routine() и выдает результат.routine() – это имя процедуры.
call_1s
1OP:136 8 4 call_1s routine -> (result)
Значение routine().
call_2n
2OP:26 1A 5 call_2n routine arg1
Выполняет routine(arg1) и выдает результат.
call_2s
2OP:25 19 4 call_2s routine arg1 -> (result)
Значение  routine(arg1).
call_vn
VAR :249 19 5 call_vn routine ...up to 3 args...
Как call, но отбрасывает результат.
call_vs
VAR:224 0 4 call_vs routine ...up to 3 args... -> (result)
См call.
call_vn2
VAR:250 1A 5 call_vn2 routine ...up to 7 args...
Вызов с переменным числом, от 0 до 7 аргументов, а затем выдает результат. Это (и call_vs2) однозначно имеют дополнительный байт типов кодов операций , чтобы указать типы аргументов  от 4 до 7. Следует отметить, что это приемлемо, чтобы использовать эти опкоды с менее чем 4-х аргументов (в этом случае второй байт информации типа будет просто $ff).
call_vs2
VAR:236 C 4 call_vs2 routine ...up to 7 args... -> (result)
См call_vn2 .
catch
0OP:185 9 5/6 catch -> (result)
Действует как зекрало throw (и занимающий тот же опкод, что pop, используемый в версии 3 и 4). Catch возвращает текущий "stack frame ".
check_arg_count
VAR:255 1F 5 check_arg_count argument-number
Branches(условия, ветви), если данный аргумент (считая с 1) был предоставлен вызовом текущей подпрограммы. (Это позволяет подпрограммам в версиях 5 и более поздних различать вызовы routine (1) и routine (1,0), которые раньше было бы невозможно отличить друг от друга)
check_unicode
EXT:12 C 5/* check_unicode char-number -> (result)
Определяет, может ли печатать интерпретатор или получить данные с клавиатуры, заданного символа Unicode. Бит 0 должен быть установлен, тогда и только тогда, когда интерпретатор может печатать символ; бит 1, тогда и только тогда, когда интерпретатор может получить его с клавиатуры. Биты от 2 до 15 не определены.
*** [1,0] Этот опкод будет присутствовать только в интерпретаторах, подчиняющихся Стандарту 1.0 или более поздней версии, так что файлы истории должны проверить номер Стандарта интерпретатора перед выполнением данного опкода.
clear_attr
2OP:12 C clear_attr object attribute
Создать object не имеющий пронумерованный атрибут attribute.
copy_table
VAR:253 1D 5 copy_table first second size
Если second  равен нулю, то size байта second обнулен.
В противном случае first копируется во second, его длина в байтах, их абсолютное значение size (то есть, size, если size положителен, -size если sizeотрицателен).
Если size положителен, то интерпретатор должен копировать вперед или назад таким образом, чтобы избежать повреждения в first, в процессе копирования. Если size имеет отрицательное значение, то интерпретатор должен копировать вперед, даже если это изменяет first. ( "Beyond Zork" использует этот опкод, чтобы заполнить массив с пробелами).
(В версии 0.2 этого документа ошибочно указано, что если size является положительным, то копирование всегда должно работать и в обратном направлении. Это приводит к тому, что игрок будет не в состоянии пересечь реку рядом с истоком в «Journey», игра использует copy_table показывая опции меню, и меню «Downstream, Upstream, Cross, Return» изменяется на «Return, Return, Return»)
dec
1OP:134 6 dec (variable)
Переменная dec на 1.
dec_chk
2OP:4 4 dec_chk (variable) value ?(label)
Декремент переменной, и ветви, если она сейчас меньше заданного значения.
div
2OP:23 17 div a b -> (result)
16-разрядное деление. Деление на ноль должен остановить интерпретатор с соответствующим сообщением об ошибке.
draw_picture
EXT:5 5 6 draw_picture picture-number y x
Вывод изображения с заданным номером. (y, x) координаты (в левом верхнем углу изображения), причем зависит от желания, в том, что нулевое значение для у или х означает, что курсор у или х координат в текущем окне. 
encode_text
VAR:252 1C 5 encode_text zscii-text length from coded-text
Переводит ZSCII слово в Z-закодированный текстовый формат (хранится в coded-text), как будто это была запись в словаре. Текст начинается с from в zscii-text буфер и length символов. (Некоторые интерпретаторы игнорируют это и держат перевод, пока они не получат 0 символов в любом случае, или уже пополняют 6-байтовую Z-закодированную строку)
erase_line
VAR:238 E 4/6 erase_line value
Версии 4 и 5: если значение равно 1, начинать от текущей позиции курсора до конца строки в текущем окне. Если значение не равно 1, то ничего не делать.
Версия 6: если значение равно 1, удалить от текущей позиции курсора до конца своей линии в текущем окне. Если нет, то стереть заданное число пикселей минус один от курсора (обрезается, чтобы оставаться внутри правого края). Курсор при этом не двигается.
erase_picture
EXT:7 7 6 erase_picture picture-number y x
Как draw_picture , но рисует соответствующую область по цвету фона для данного окна. Будет неправильным, если вызывать опкод с неверным номером изображения.
erase_window
VAR:237 D 4 erase_windowwindow
Стирает окно с заданным номером (по цвету фона); или если он -1, то он очищает разделенные экраны; или если -2 он очищает экран без его разделения. В тех случаях , где -1 и -2, курсор может перемещаться (см S 8 для подробностей).
"extended"
Этот байт (десятичное 190) не является инструкцией, но указывает на то, что код операции "extended": следующий байт содержит номер в расширенном наборе.
get_child
1OP:130 2 get_child object -> (result) ?(label)
Получить первый объект, содержащийся в данном объекте, разветвление(условие), если оно существует, то есть не является nothing (то есть, не 0).
get_cursor
VAR:240 10 4/6 get_cursor array
Переводит текущую строку курсора в слово 0 данного массива, а также текущего столбца курсора в слове 1. (Массив не является таблицей и не имеет никакой информации о размере в своем первоначальном входе)
get_next_prop
2OP:19 13 get_next_prop object property -> (result)
Выдает число следующих свойств, переданного в объекте. Он может быть равен нулю, что указывает на конец списка свойств; если вызывается с нуля, он отдает число, представленное первым свойством. Это неприемлемо, чтобы пытаться найти следующее свойство, которого не существует, и интерпретатор должен остановить с сообщением об ошибке (если он может эффективно проверить это условие).
get_parent
1OP:131 3 get_parent object -> (result)
Получить родительский объект (обратите внимание, что это не имеет никакого   отношения к "branch if exists").
get_prop
2OP:17 11 get_prop object property -> (result)
Прочитать свойство из объекта (что приводит к значению по умолчанию, если оно не было объявлено). Если свойство имеет длину 1, то значение только байт. Если он имеет длину 2, первые два байта свойства принимаются в качестве значения слов. Это неприемлемо для опкода, ведь он должен использоваться, если свойство имеет длину больше 2, а результат не определен.
get_prop_addr
2OP:18 12 get_prop_addr object property -> (result)
Получить адрес байта (в динамической памяти) данных свойств данного объекта. Опкод должен возвращать 0, если объект не получил свойств.
get_prop_len
1OP:132 4 get_prop_len property-address -> (result)
Получить длину данных свойств (в байтах) для имущества данного объекта. Это неприемлемо, чтобы попытаться найти длину свойств имущества, которых не существует для данного объекта, и интерпретатор должен остановиться с сообщением об ошибке (если он может эффективно проверить это условие).
@get_prop_len 0 должен возвращать 0. Это требуется для некоторых игр Infocom и файлов, созданных старыми версиями Inform.
get_sibling
1OP:129 1 get_sibling object -> (result) ?(label)
Получить следующий объект в дереве, ветвления, если он существует, то есть не 0.
get_wind_prop
EXT:19 13 6 get_wind_prop window property-number -> (result)
Читает данное свойство активного окна (см S 8).
inc
1OP:133 5 inc (variable)
Приращение переменной на 1.
inc_chk
2OP:5 5 inc_chk (variable) value ?(label)
Приращение переменной, и ветви, если в настоящее время он больше, чем значение.
input_stream
VAR:244 14 3 input_stream number
Выбирает текущий входной поток.
insert_obj
2OP:14 E insert_obj object destination
Перемещение объекта O , чтобы стать первым потомком объекта D. (Таким образом, после операции child из D представляет собой О, а sibling из O является тем, что было раньше child в D.) Все дети O двигаются с ним. (Изначально O может быть в любой момент в дереве объектов, он может не иметь parent)
je
2OP:1 1 je a b c d ?(label)
Переход, если равен любой из последующих операндов. (Таким образом , @je никогда не перехоит и @je AB переходит, если а = b)
je только с 1 операндом не допускается.
jg
2OP:3 3 jg a b ?(label)
Переход, если а>b (с использованием 16-разрядным сравнением).
jin
2OP:6 6 jin obj1 obj2 ?(label)
Переход, если объект является прямым потомком b, то есть, если parent является b.
jl
2OP:2 2 jl a b ?(label)
Переход, если а<b (с использованием 16-разрядным сравнением)
jump
1OP:140 C jump ?(label)
Перейти (безусловно) к данной метке. (Это не команда ветвления и операнд представляет собой 2-байтовое смещение и обращение к программному счетчику) Это приемлемо для этого опкода, чтобы перейти к другой подпрограмме (которая не должна изменять состояние вызова подпрограммы), хотя считается плохой практикой, чтобы сделать это и Txd дизассемблер не исключение.
Назначения скачка опкодом является:
Address after instruction + Offset - 2
Это аналогично расчету для сдвигов ответвлений.
jz
1OP:128 0 jz a ?(label)
Переход, если а = 0 .
load
1OP:142 E load (variable) -> (result)
Значение переменной, на которую ссылается операнд и хранимая в результате. (Inform не использует эту функцию, см примечания к S 14.)
loadb
2OP:16 10 loadbarraybyte-index -> (result)
Stores array--> byte-index (т.е. байт по адресу array+byte-index, который должен находиться в статической или динамической памяти).
loadw
2OP :15 F loadw array word-index -> (result)
Stores array-->word-index (т.е. слово по адресу array+2*word-index, который должен находиться в статической или динамической памяти).
log_shift
EXT:2 2 5 log_shift number places -> (result)
Имеется ли логический сдвиг number по заданному количеству places, сдвиг влево, (то есть увеличение), если places положительна, вправо, если negative. Сдвиг вправо, знак обнуляется вместо того , чтобы быть сдвинут. (Смотри также art_shift .)
Операнд "Places" должен находиться в диапазоне от -15 до +15, в противном случае поведение не определено.
make_menu
EXT:27 1B 6 make_menu number table ?(label)
Элементы управления меню с номерами больше 2 (то есть, он не контролирует три системы меню). Если таблица равна 0, меню удаляется. Каждая таблица представляет собой строку ZSCII: первый элемент является названием меню, последующие - записи.
mod
2OP:24 18 mod a b -> (result)
Остаток после того, как произошло16-разрядное деление. Деление на ноль должно остановить интерпретатор с соответствующим сообщением об ошибке.
mouse_window
EXT:23 17 6 mouse_window window
Ограничить координаты курсора мыши, чтобы быть внутри данного окна. По умолчанию он находится в окне 1. Установка -1 не принимает ограничения. (Щелчки мыши не сообщаются, если стрелка находится вне окна и интерпретаторы, предположительно, должны удерживать стрелку аппаратными средствами, если это возможно)
move_window
EXT:16 10 6 move_window window y x
Перемещение данного окна в пикселях (у, х): (1,1), которые начинают с левого верхнего угла. Ничего на самом деле не происходит (так как окна полностью прозрачные): но любое будущее построение происходит в новом месте.
mul
2OP:22 16 mul a b -> (result)
Подпись 16-битного умножения.
new_line
0OP:187 Bnew_line
Печать возврата каретки на новую строку.
nop
0OP:180 4 1/- nop
 Вероятно, официальные инструкции "no operation ", которые, соответственно, никогда не работают (ни в одном из файлов данных Infocom): он может быть брейкпоинтом.
not
1OP:143 F 1/4 not value -> (result)
VAR:248 18 5/6 not value -> (result)
Побитовое NOT (т.е. все 16 бит в обратном порядке). Обратите внимание, что в версии 3 и 4 это инструкция 1OP, разумно, так как она имеет 1 операнд, но в более поздних версиях он был перемещен в расширенный набор , чтобы освободить место для call_1n .
or
2OP:8 8 or a b -> (result)
OR - побитовое.
output_stream
VAR:243 13 3 output_stream number table
6 output_streamnumbertablewidth
Если stream равен 0, то ничего не происходит. Если он положителен, то выбирается этот поток; если отрицательно, то деактивируется. (Напомним, что несколько различных потоков могут быть выбраны одновременно.)
Когда поток 3 выбран, table должен быть предоставлен индекс (в какой текст может быть напечатан). Первое слово всегда держит количество напечатанных символов, фактический текст хранится в байтах в шаге table+2. Это не обязанность интерпретатора, чтобы беспокоиться о длине этой таблицы.
В версии 6, width поля необязателен, он может быть дан: текст будет так, как если бы это было в окне с этим номером (если ширина равна нулю или положительна) или box-width  пикселей в ширину (при отрицательном значении ). Тогда таблица будет содержать не обычный текст, а форматированный текст: см print_form .
picture_data
EXT:6 6 6 picture_data picture-number array ?(label)
Спрашивает интерпретатор для получения данных по картинке с данным номером. Если номер картинки действителен, то информация записывается в массив: высоту в слове 0, ширину в слове 1, и это все в пикселях. (Это массив, а не "таблица" с исходной информацией о размере)
В противном случае, если номер картинки равен нулю, то интерпретатор записывает количество доступных картинок в слово 0 массива и номер версии файла изображения в слово 1, и ветви, если какие-либо изображения доступны. (Первая версия 6 Amiga интерпретатора Infocomне обрабатывает этот случай должным образом, и ранние выпуски "Zork Zero" не используют его. Функция может быть добавлена ​​в MSDOS из "Zork Zero".)
В противном случае, ничего не происходит.
picture_table
EXT:28 1C 6 picture_table table
Учитывает таблицу индексов изображения, интерпретатор может , если он хочет загружать или распаковать эти изображения с диска в кэш для удобной и быстрой прорисовки в дальнешем. "Zork Zero" часто использует это, например, для его peggleboard дисплея. Кроме того, он ожидает, что быстрое построение только тех изображений, которые перечисленны в последнем вызове picture_table . Другими словами, любые изображения все еще в кэше, когда вызывается picture_table. (Интерпретатор Amiga 6.14 использует кэш размером 5K и никогда не кэширует любые отдельные изображения больше, чем 1K.)
piracy
0OP:191 F 5/- piracy ?(label)
Интерпретаторы требуют быть «легковерным» и безоговорочно подстраиваться.
pop
0OP:185 9 1 pop
 Показывает верхний элемент в стеке. (Это существенно в случаях, когда требуется потерять нежелательные результаты обычных вызовов в ранних версиях)
pop_stack
EXT:21 15 6 pop_stack items stack
Заданное число элементов показывается из верхней части стека: по умолчанию системный стек, в противном случае приведенному в качестве второго операнда.
print
0OP:178 2 print <literal-string>
Печатает Z-закодированную строку.
print_addr
1OP:135 7 print_addr byte-address-of-string
Печать (в Z-кодировке) строки в данный байт адреса, в динамической или статической памяти.
print_char
VAR:229 5 print_char output-character-code
Печать ZSCII символов. Операнд должен знать коды символов, определенных в ZSCII для вывода (см S 3). В частности, он должен, конечно, не может быть отрицательным или больше, чем 1023.
print_form
EXT:26 1A 6 print_form formatted-table
Печать отформатированной таблицу вида, написанной выходным потоком 3. Это доработанный вариант print_table, чтобы справиться со шрифтами, пикселями и другим игровым имуществом. Она представляет собой последовательность строк, завершается  нулевым словом. Каждая строка представляет собой слово, содержащее количество символов, за которым следует.
print_num
VAR:230 6 print_num value
Печать (подпись) числа в десятичной системе счисления.
print_obj
1OP:138 A print_obj object
Печать Краткого наименования объекта (Z-закодированную строку в заголовке объекта, а не свойство). Если номер объекта является недопустимым, интерпретатор должен остановить с соответствующим сообщением об ошибке.
print_paddr
1OP:141 D print_paddr packed-address-of-string
Печатная версия (Z-закодированных) строк в данном упакованном адресе в верхней памяти.
print_ret
0OP:179 3 print_ret <literal-string>
 Печать Z-закодированной строки, а затем печатает новую строку, а затем возвращает истину (т.е. 1).
print_table
VAR:254 1E 5 print_table zscii-text width height skip
Печатает прямоугольник текста на экране и располагается вправо и вниз от текущей позиции курсора, заданной width и height, из таблицы ZSCII данного текста. (Высота не является обязательным и по умолчанию 1.) Если значение skip задано, то многие символы текста перескакивают между строками.
print_unicode
EXT:11 B 5/* print_unicode char-number
Печать символа Unicode. См S 3.8.5.4 и S 7.5 для большей инфомарции. Данный код символа должен быть определен в Unicode.
*** [1,0] Этот опкод будет присутствовать только в интерпретаторах , подчиняющихся Стандарту 1.0 или более поздней версии, так что файлы истории должны проверить номер Стандарта интерпретатора перед выполнением этого опкода.
pull
VAR:233 9 1 pull (variable)
6 pull stack -> (result)
Вытаскивает значение стека. (Если стек недостаточен, интерпретатор должен остановить программу с соответствующим сообщением об ошибке) В версии 6, стек в вопросе может быть указан как пользователь указал в настройках: в противном случае это стек игры.
push
VAR:232 8 pushvalue
Заносит значение в стек игры.
push_stack
EXT:24 18 6 push_stack value stack ?(label)
Помещает значение на заданный стек пользователя, и ветвление. Если стек переполняется, то ничего не происходит (это не является ошибкой).
put_prop
VAR:227 3 put_prop object property value
Записывает значение данного свойства данного объекта. Если свойства не существует для этого объекта, интерпретатор должен остановить с соответствующим сообщением об ошибке. Если длина свойства 1, то интерпретатор должен хранить только наименьше значимое значение. Как с get_prop - длина свойства не должна быть больше, чем 2: если опкодом это поведение не определено.
put_wind_prop
EXT:25 19 6 put_wind_prop window property-number value
Записывает свойства окна (см get_wind_prop ). Это должно быть использовано только тогда, когда нет прямой команды (например, move_window) , чтобы использовать вместо того, чтобы, как некоторые такие операции могут иметь непредсказуемые последствия.
quit
0OP:186 Aquit
 Выход из игры, сразу. (Любой вопрос "Вы уверены?" должен быть задан в игре, а не в интерпретаторе) Это неправильно, чтобы вернуться из основной программы (то есть, откуда начинается первое исполнение).
random
VAR:231 7 random range -> (result)
Если range является положительным, возвращает случайное число между 1 и range. Если range является отрицательным, то срабатывает генератор случайных чисел к этому значению и возвращаемое значение равно 0. Большинство интерпретаторов рассмотривают вопрос о предоставлении 0 в range неправильным (потому что они пытаются делить с остатком по диапазону), но правильным поведением является переустановка генератора в качестве случайного выбора, интерпретатор может (например, используя временной интервал в миллисекундах).
(Некоторые версии 3 игры, такие как "Enchanter" выпуска 29, был глагол отладки  #random, который набрав, скажем, #random 14 вызывало вызов random с -14.)
read
VAR:228 4 1 sread text parse
4 sread text parse time routine
5 aread text parse time routine -> (result)
 (Обратите внимание, что внутренне в Inform опкод на read записывается как опкод aread в версии 5 и более поздних версий, и как sread в версиях 3 и 4)
Этот опкод читает целую команду с клавиатуры (не отображается автоматически). Это приемлемо, чтобы можно вызвать курсор в любом месте и на любом окне.
В версиях от 1 до 3, строка состояния автоматически перерисована в первую очередь.
Последовательность символов не считывается из текущего входного потока до возврата каретки (или, в версии 5 и выше, любой символ завершения).
В версиях от 1 до 4 байт 0 text-buffer первоначально должен содержать максимальное количество букв, которые могут быть набраны, минус 1 (интерпретатор не должен принимать больше, чем может). Текст набран и сводится к нижнему регистру (таким образом, чтобы он мог быть аккуратно напечатан обратно программой , если это необходимо) и хранится в байтах 1, с нулевым значением (но без какого - либо другого символа, таким как код возврата каретки). (Это означает, что если байт 0 содержит n байт, то буфер должен содержать n + 1 байт, что делает его массив string длиной n в Inform)
В версии 5 и более поздних версиях, байт 0 text-buffer должен изначально содержать максимальное количество букв, которые могут быть набраны (интерпретатор не должен принимать больше чем может). Интерпретатор хранит количество символов фактически на 1 байт (не считая завершающего символа), а сами символы (приведенные к нижнему регистру) в байте 2 (не хранящие завершающего символа). (Некоторые интерпретаторы ошибочно добавляют нулевой байт после текста в любом случае, так что имеет смысл для буфера содержать по крайней мере n + 3 байта.)
Кроме того, если байт 1 содержит положительное значение в начале ввода, а затем read предполагает, что количество символов, оставшихся от предыдущего прерванного ввода и записывает новые символы после того, как те, которые уже есть. Это печально для любого интерпретатора, желающего дать ввод текста характерный внешний вид на экране, но "Beyond Zork", "Zork Zero " и "Shogun ", несомненно, требуют его. («Just a tremendous pain in my butt» - Andrew Plotkin; " the most unfortunate feature of the Z-machine design " - Stefan Jokisch)
В версии 4 и более поздних версиях, если операнды time и routine со значениями (а не ноль) , то процедура вызова routine() производится каждые time / 10 секунд во время процесса чтения с клавиатуры. Если эта процедура возвращает истину, все входные данные будут удалены (до нуля), и процесс считывания завершается сразу. (Код символ завершения является 0.) routine разрешает печатать на экране, даже если он возвращает ложь, чтобы сигнал "carry on": интерпретатор должен заметить  это и перерисовывать строку для ввода до тех пор, пока вход продолжается. (Frotz замечает, если позиция курсора находится на левом поле после того, как процедура прерывания возвращается.)
Если вход был прекращен обычным способом, т.е. игроком, набрав возврат каретки, а затем делается возврат каретки (так курсор перемещается на следующую строку). Если она была прервана, курсор остается в крайнем правом конце текста, набранного до сих пор.
Далее, выполняется лексический анализ по тексту (за исключением того, что есть в версии 5, а затем, если parse-buffer равен нулю, то это пропускается). Первоначально байт 0 parse-buffer должен удерживать максимальное количество текстовых слов, которые могут быть разобраны. (Если это N, буфер должен быть по крайней мере длиной 2 + 4 * N байт для хранения результатов анализа)
Интерпретатор делит текст на слова и смотрит их в словаре, как описано в S 13. Количество слов, записывается в байте 1 и один 4-байтовый блок записывается для каждого слова, от байта 2 и далее (за исключением того, что он должен прекратить ввод, прежде чем выйти за рамки указанного максимального количество слов). Каждый блок состоит из байта адреса слова в словаре, если он находится в словаре, или 0, если это не так; за ним следует байт, который дает количество букв в слове;  и, наконец, байт, который дает позицию в parse-buffer первой буквы слова.
В версии 5 и более поздних версиях это инструкция сохранения: возвращаемое значение является символом завершения (обратите внимание, что пользователь, нажав клавишу "Ввод" может привести к результату 10 или 13 и они должны быть возвращены, и интерпретатор должен вернуться к 13). Задержка ввода возвращает 0.
(В версии 1 и 2 и ранние версии 3, игры по ошибке записывают длину 240 в parse-buffer  в байте 0: более поздние игры исправили эту ошибку и записывают 59, потому что 2 + 4 * 59 = 238, так что 59 является максимальным числом текстовых слов, которые могут быть разобраны в буфер длиной по 240 байт. Старые версии библиотеки Inform 5 совершают ту же ошибку. Ошибка имеет очень серьезные последствия.)
(Интерпретаторы просят остановить с соответствующим сообщением об ошибке, если текст или разбор буфера имеют длину менее 3-х или 6 байт, соответственно: иногда это происходит из-за предыдущего массива, и он постепенно нарастает, вызывая ошибки, которые потом очень трудно найти.)
read_char
VAR:246 16 4 read_char 1 time routine -> (result)
Читает один символ из входного потока 0 (клавиатура). Первый операнд должен быть 1 (предположительно он был предоставлен для поддержки нескольких устройств ввода, но только использовалась клавиатура). time и routine не являются обязательными (в версии 4 и более поздних версиях) и рассматриваются как в read выше.
read_mouse
EXT:22 16 6 read_mouse array
Четыре слова в array записаны координаты мыши, координаты х, биты кнопки, и слово меню.
Биты кнопки расположены таким образом, что кнопка "primary" является младшим битом, то "secondary" (если он присутствует), это следующий самый младший бит, и так далее, вплоть до потенциала 16 кнопок. Упорядочение кнопок должно быть таким, что является наиболее естественным для host system. Вот некоторые предложенные задания:
                                      Button assignments
             Platform                    Bit 0 (low)           Bit 1            Bit 2
             ---------------------------------------------------------------------
             RISC OS           Select                   Adjust       Menu
             MacOS      Primary/only              Secondary Tertiary   ...
             Windows          Left                      Right           Middle
             X                                Left                      Right          Middle
 В слове меню, верхний байт - номер меню, и нижний байт - номер элемента (от 0). (Обратите внимание, что массив не является таблицей и не имеет первоначальной информации о размере. Данные записываются на индексы от 0 до 3 в массиве.)
remove_obj
1OP:137 9 remove_obj object
Отделить объект от своего родителя, так что он больше не будет иметь какого-либо из родителей. (Его дети остаются в его распоряжении.)
restart
0OP:183 7 1 restart
Перезапуск игры. (Любой вопрос "Вы уверены?" должен быть задан в игре, а не в интерпретаторе). Только фрагменты информации, отставшиеся из предыдущего состояния являются "transcribing to printer" битом (бит 0 'Flags 2' в заголовке, по адресу $ 10) и "use fixed pitch font " бит (бит 1 'Flags 2').
В частности, изменение адреса начала программы перед перезапуском не будет иметь эффект перезагрузки с этого нового адреса.
restore
0OP : 182 6 1 восстановления (ярлык)?
0OP : 182 5 4 восстановление -> (результат)
EXT : 1 1 5 восстановить таблица байт имя наталкивает> (результат)
См save. В версии 3, ответвление фактически никогда не делается, если игра успешно возобновилась, оттуда, где он был сохранен, или не удалось загрузить файл сохранения игры.
Как и при restart, транскрипция и фиксированные биты шрифта сохраняются. Интерпретатор дает игре способ узнать, что необходимо восстановить (см save).
*** [1,0] Начиная с версии 5 он может иметь дополнительные параметры, как это делает save , и возвращает число загруженных байтов,  если это произошло.
Если восстановление терпит неудачу, то возвращается 0, но опять-таки это обязательно произойдет, так как в противном случае управление будет уже в другом месте.
restore_undo
EXT:10 A 5 restore_undo -> (result)
 Работает как и restore, но восстанавливает состояние игры сохраненной в памяти с помощью save_undo . Поведение restore_undo не определен , если save_undo ранее не произошло (и игра не может использовать его): интерпретатор может просто игнорировать это.
ret
1OP:139 Bretvalue
 Возвращает из текущей подпрограммы значение заданной.
ret_popped
0OP : 184 8 ret_popped
pop вершина стека и возвращает значение. (Это эквивалентно ret sp, но на один байт меньше)
rfalse
0OP:177 1 rfalse
Возвращает false (то есть 0) из текущей процедуры.
rtrue
0OP : 176 0 rtrue
Возвращает true (т.е., 1) из текущей подпрограммы.
save
0OP:181 5 1 save ?(label)
0OP:181 5 4 save -> (result)
EXT:0 0 5 save table bytes name prompt -> (result)
По версии 3 и 4, попытки сохранить игру (все вопросы об именах файлов просят делать интерпретаторы), а также ветвление событий в случае успеха. Начиная с версии 5 это store, а не инструкции ветвления; значение store0 для отказа, 1 для "удачного сохранения" и 2 для "игра восстанавливается и возобновляет выполнение в месте, где он был сохранен".
Это неприемлемо, чтобы использовать этот опкод внутри подпрограммы прерывания.
*** [1,0] Расширение также имеет (необязательные) параметры, которые сохраняют область сохранения, чей адрес и длина в байтах, а также предоставляет предложенное имя файла: nameявляется указателем на массив ASCII - символов, содержащая это имя (как обычно предшествует байт, которое дает количество символов). См S 7.6. 
*** [1.1] В Стандарте 1.1 есть дополнительный необязательный параметр, prompt, допускается в версии 5 и расширяет возможности сохранения / восстановления. Это позволяет автору игры сказать интерпретатору, что он должен делать запрос на подтверждение имени файла при условии (prompt 1), или просто сохранять / восстановливать с помощью прилагаемого файла (prompt 0). Если параметр не указан, следует ли запрашивать или нет, это вопрос именно для интерпретатора  - это может быть глобально настраиваемым пользователем. Интерпретаторы Infocomделают запрос для имени файлов, многие современные из них этого не делают.
save_undo
EXT:9 9 5 save_undo -> (result)
Как и save, за исключением того, что не могут быть указаны необязательные параметры: он сохраняет игру в кэш - памяти, принадлежащих интерпретатору. Если интерпретатор не в состоянии обеспечить эту функцию, она должна возвратить -1: в противном случае она возвращает save возвращаемого значения.
Это неприемлемо, чтобы использовать этот опкод внутри подпрограммы прерывания
scan_table
VAR:247 17 4 scan_table x table len form -> (result)
Является ли х одним из слов в table, которая состоит из Len слов? Если это так, возвращает адрес, где он впервые встречается и ветви. Если нет, то возвращает значение 0 и ничего не делает.
form не является обязательным (и используется только в версии 5): Бит 7 установлен для слов, очистка байтов: остальное содержит длину каждого поля в таблице. (Первое слово или байт в каждой области) Таким образом , $82 по умолчанию.
scroll_window
EXT:20 14 6 scroll_window window pixels
Прокрутка активного окна с заданным количеством пикселей (отрицательное значение прокручивается в обратном направлении, т.е. вниз). Это может быть сделано для любого окна и не связано с атрибутом окна "scrolling".
set_attr
2OP:11 B set_attr object attribute
Создать object, который имеет пронумерованный атрибут attribute .
set_colour
2OP:27 1B 5 set_colour foreground background
6 set_colourforegroundbackgroundwindow
 Если цвета текста доступны, то установливает цвет текста, который будет на переднем плане. (Flush - любой буферизированный текст на экране, в старых цветах, в первую очередь) В 6-й версии, аргумент  window является необязательным и по умолчанию он в текущем окне. (Эта опция поддерживается в Amiga и DOS интерпретаторах Infocom)
(Одна из 5 версий игры использует это: "Beyond Zork" (Paul David Doherty сообщает об этом, как он используется "76 раз в 870915 и 870917, 58 раз в 871221").
set_cursor
VAR:239 F 4 set_cursor line column
6 set_cursorlinecolumnwindow
 Перемещение курсора в текущем окне в позиции (х, у) (в единицах) по отношению к (1,1) и верхнему левому углу. (Кроме того, если курсор будет лежать вне текущей настройки полей, он перемещается к левому краю текущей строки)
В версии 6, set_cursor -1 выключает курсор, и либо set_cursor -2 или set_cursor -2 0 включает его снова. Неизвестно, что, во всяком случае, этот второй аргумент означает: во всех известных случаях он равен 0.
set_font
EXT:4 4 5 set_font font -> (result)
EXT:4 4 6 set_font font window -> (result)
 Если запрошенный шрифт доступен, то он будет выбран для текущего окна, и значение store является идентификатором шрифта от предыдущего шрифта (который всегда положителен). Если шрифт недоступен, то ничего не произойдет, а значение 0 store.
Если ID шрифта отдает 0, шрифт не меняется, и идентификатор текущего шрифта возвращается.
(Старые интерпретаторы Infocom в не хранить 0 для недоступного шрифта, но эта функция, безусловно, полезна и была введена в версии 0.2 настоящего стандарта).
*** [1.1] В версии 6, set_font имеет дополнительный параметр окна, как для set_colour . Это было частью оригинального дизайна Infocom, но пропущено более ранними стандартами. Окно c числом -3 означает "выбранное в данный момент окно"
set_margins
EXT:8 8 6 set_margins left right window
Устанавливает ширину полей (в пикселях) слева и справа для данного окна (которые по умолчанию 0). Если курсор уходит и в настоящее время находится за пределами полей вообще, переместить его обратно к левому краю текущей строки (см S 8.8.3.2.2.1).
set_text_style
VAR:241 11 4 set_text_style style
Устанавливает стиль текста для: Roman (если 0), Reverse Video (если 1), полужирный (если 2), курсив (4), Fixed Pitch (8). В некоторых интерпретаторах (хотя это не требуется) сочетание стилей можно комбинировать. В них, при изменении Roman следует отключить все другие стили в данный момент, которые установлены.
*** [1.1] Для Стандарта 1.1, это приемлемо требовать комбинации стилей в одном опкоде set_text_style путем сложения значений (которые являются степенями двойки). Если параметр не равен нулю, то все приведенные стили активируются. Если параметр равен нулю, то все стили отключаются. Если интерпретатор не в состоянии обеспечить требуемую комбинацию стиля, он должен отдавать предпочтение первым стилей, запрошенных в самый последний вызов к set_text_style, и в том, что на самом высоком бите, что делает приоритет Fixed, курсив, полужирный, reverse.
set_true_colour
EXT:13 D 5/* set_true_colour foreground background
EXT:13 D 6/* set_true_colour foreground background window
 Передний и задний план являются 15-битными значениями цвета:
bit 15 = 0
bits 14-10 blue
bits 9-5 green
bits 4-0 red
Необязательный параметр окна допускается только в V6, и работает так же , как и в set_colour .
*** [1.1] Этот опкод будет присутствовать только в интерпретаторах , подчиняющихся Стандарту 1.1 или более поздней версии, поэтому файлы истории должны проверить номер Стандарта интерпретатора перед выполнением этого опкода.
set_window
VAR:235 B 3 set_window window
Выбор окна для вывода текста.
show_status
0OP:188 C 3 show_status
(Только в версии 3) Отображение и обновление строки состояния в настоящее время (не ждать до следующего ввода с клавиатуры). (В теории этот опкод является непримелемым в более поздних версиях, но интерпретатор должен относиться к нему как кnop, потому Версия 5 Выпуск 23 'Wishbringer' содержит этот опкод)
sound_effect
VAR:245 15 5/3 sound_effect number effect volume routine
Данный эффект происходит с заданным звуковым числом. Младший байт volume  имеет уровень громкости, старший байт число повторов. (Значение 255 означает "loudest possible" и "forever" соответственно.) (Параметр "forever" указывает общее количество раз воспроизведения звука, а не количество раз , чтобы повторить его после первой игры.) (В версии 3, повторы не поддерживаются, а старший байт должен быть равен 0.)
Обратите внимание, что номера звукового эффекта 1 и 2 (см короткие электронные звуки S 9) , и в этих случаях другие операнды должны быть опущены. И наоборот, если какой - либо из других операндов присутствуют, номер звукового эффекта должен быть 3 или выше.
effect может быть: 1 (prepare), 2 (start), 3 (stop), 4 (finish with).
В версии 5 и более поздних версий, то routine вызывается (без параметров) после того, как звук был завершен (он играет в фоновом режиме в то время как Z-машина работает над другими вещами). (Это используется в «Sherlock» , чтобы осуществить выходы, что объясняет, почему там есть таинственные номера, как $ 34FB, которые ранее считалось, что они делают задержу) Процедура не вызывается , если звук будет остановлен другим звуковым сигналом или с помощью вызова Effect 3.
См замечания к S 9 , для которых формы этого опкода были фактически использованы Infocom.
В теории, @sound_effect; (без операндов вообще) является неприемлемым. Однако интерпретаторы просят подавать звуковой сигнал (как если бы операнд был 1) , если это возможно.
Установка повтора на ноль в V5 является неприемлемым - предполагается, что интерпретаторы рассматривают это как запрос для воспроизведения звука один раз, а может выдать предупреждение.
Для уточнения:
    @sound_effect номер 3/4
остановит звук "number", если она воспроизводится в данный момент (или загружена). В противном случае он игнорируется.
    @sound_effect 0 3/4
остановит все звуки - музыку и эффекты.
split_window
VAR:234 A 3 split_window lines
Разделяет экран так, чтобы верхнее окно имело заданное количество строк: или, если это ноль, опять соединяет экран. В версии 3 (только) верхнее окно должно быть очищено после разъединения.
В версии 6, это должно примерно подражать поведением более ранней версии 5 (см S 8), хотя там количество строк в единицах, а не линий. (Существующие игры версии 6, кажется, используют этот опкод только ограничивают движение курсора. «Journey» создает область состояния, которая на весь экран, а затем скрывает его с двумя другими окнами)
Окна 0 и 1 совмещены вместе, чтобы заполнить экран, так что окно 1 имеет заданную высоту и находится в верхнем левом углу, в то время как окно 0 помещается чуть ниже него.
Курсор остается в том же абсолютном положении экрана (что означает, что его Y-координата будет отличаться относительно происхождения окна, так как это будет начало координат), если только это положение больше не в окне вообще, в этом случае оно подходит к начала координат окна(в верхнем левом углу окна).
sread
Это опкод Inform для чтения клавиатуры под Версии 3 и 4. (В Inform тот же опкод как aread в более поздних версиях) См read для подробностей.
store
2OP:13 D store (variable) value
Установливает VARiable, на который ссылается операнд value.
storeb
VAR:226 2 storeb array byte-index value
array->byte-index = value, т.е. сохраняет заданное значение в байте адреса array+byte-index (который должен лежать в динамической памяти). (См loadb)
storew
VAR:225 1 storewarrayword-indexvalue
array-->word-index = value, т.е. сохраняет заданное значение в слове по адресу array+2*word-index (который должен находиться в динамической памяти). (См loadw)
sub
2OP:21 15 subab -> (result)
16-разрядные вычитание.
test
2OP:7 7 test bitmap flags ?(label)
Переход, если все флаги установлены в растровом заголовке (например, если bitmap & flags == flags).
"test_array"
См clear_flag. ( ITF реализует это как безусловно ложное.)
test_attr
2OP:10 A test_attr object attribute ?(label)
Переход, если object имеет attribute.
throw
2OP:28 1C 5/6 throw value stack-frame
Противопоставим catch: сбрасывает состояние вызова подпрограммы в состояние, которое было, когда было поймано заданное значение кадра стека "caught", а затем возвращается. Другими словами, он возвращается, как будто от процедуры, которая выполняется от catch, который понимает, что это значение кадра стека.
tokenise
VAR:251 1B 5 tokenise text parse dictionary flag
Это выполняет лексический анализ (см read выше).
Операнды dictionary и flag не являются обязательными.
Если dictionaryне нулевой, то он используется (если нет, то обычный словарь игры). Если flag установлен, нераспознанные слова не записываются в буфер синтаксического анализа и их слоты остаются неизменными: это по-видимому, так, что, если несколько инструкций tokenise  выполняются в ряд, каждый заполняет многие слоты без очистки, заполненных другими опкодами.
Синтаксический пользовательский словарь немного отличается. Словарь пользователя должен выглядеть так же, как и основной, но не должен быть отсортирован в алфавитном порядке. Если число записей задается как -n, интерпретатор читает это как "N записей несортированы". Это очень удобно, если таблица в следствие изменяется в игре: если, например, игрок имеют вещи.
verify
0OP:189 D 3 verify ?(label)
verify подсчитывает (два байта) контрольную сумму файла от $ 0040 и выше (путем суммирования значений каждого байта в файле, по модулю $ 10000 ) и сравнивает со значением в заголовке игры, ветвление, если из двух значений есть согласие на это. (Ранняя версия 3 игры не имеет необходимых контрольных сумм, чтобы сделать это возможным.)
Интерпретатор должен прекратить вычисления, когда достигается длина файла (как указано в заголовке). Это приемлемо для файла, чтобы содержать больше байт, чем он может, но если это так, что дополнительные байты должны быть все 0. (Некоторые сюжетные файлы проверяют точное количество страниц виртуальной памяти.) Тем не менее, многие файлы истории Infocomна самом деле содержат ненулевые данные, поэтому интерпретаторы должны быть уверены, чтобы исключить отступы из расчетов контрольных сумм.
window_size
EXT:17 11 6 window_size window y x
Изменить размер окна в пикселях. (Не изменяет текущего дисплея.)
window_style
EXT:18 12 6 window_style window flags operation
Изменения атрибутов для активного окна. Битовая карта атрибутов задается таким образом, что биты являются: 0 - сохранять текст в полях, 1 - прокрутка, когда находится в нижней части, 2 - копирование текста в выходной поток 2 (печать), 3 - буферный текст word-wrap между краями окна.
Операция по умолчанию равна 0, что означает "set to these settings". 1 означает "set the bits supplied". 2 означает "clear the ones supplied", а 3 означает "reverse the bits supplied" (тоестьисключающееИЛИ).
Rate this item
(0 votes)
Login to post comments