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

demo

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

14. Таблица опкодов в Z-машине

Таблица опкодов в Z-машине
 
Приводим таблицы на английском языке. Во избежание недоразумений.

Two-operand opcodes 2OP

St

Br

Opcode

Hex

V

Inform name and syntax

Link

   

------

0

---

---

 
 

*

2OP:1

1

 

je a b ?(label)

je

 

*

2OP:2

2

 

jl a b ?(label)

jl

 

*

2OP:3

3

 

jg a b ?(label)

jg

 

*

2OP:4

4

 

dec_chk (variable) value ?(label)

dec_chk

 

*

2OP:5

5

 

inc_chk (variable) value ?(label)

inc_chk

 

*

2OP:6

6

 

jin obj1 obj2 ?(label)

jin

 

*

2OP:7

7

 

test bitmap flags ?(label)

test

*

 

2OP:8

8

 

or a b -> (result)

or

*

 

2OP:9

9

 

and a b -> (result)

and

 

*

2OP:10

A

 

test_attr object attribute ?(label)

test_attr

   

2OP:11

B

 

set_attr object attribute

set_attr

   

2OP:12

C

 

clear_attr object attribute

clear_attr

   

2OP:13

D

 

store (variable) value

store

   

2OP:14

E

 

insert_obj object destination

insert_obj

*

 

2OP:15

F

 

loadw array word-index -> (result)

loadw

*

 

2OP:16

10

 

loadb array byte-index -> (result)

loadb

*

 

2OP:17

11

 

get_prop object property -> (result)

get_prop

*

 

2OP:18

12

 

get_prop_addr object property -> (result)

get_prop_addr

*

 

2OP:19

13

 

get_next_prop object property -> (result)

get_next_prop

*

 

2OP:20

14

 

add a b -> (result)

add

*

 

2OP:21

15

 

sub a b -> (result)

sub

*

 

2OP:22

16

 

mul a b -> (result)

mul

*

 

2OP:23

17

 

div a b -> (result)

div

*

 

2OP:24

18

 

mod a b -> (result)

mod

*

 

2OP:25

19

4

call_2s routine arg1 -> (result)

call_2s

   

2OP:26

1A

5

call_2n routine arg1

call_2n

   

2OP:27

1B

5

set_colour foreground background

set_colour

       

6

set_colour foreground background window

set_colour

   

2OP:28

1C

5/6

throw value stack-frame

throw

   

------

1D

---

---

 
   

------

1E

---

---

 
   

------

1F

---

---

 

Opcode numbers 32 to 127: other forms of 2OP with different types.

 

One-operand opcodes 1OP

St

Br

Opcode

Hex

V

Inform name and syntax

Link

 

*

1OP:128

0

 

jz a ?(label)

jz

*

*

1OP:129

1

 

get_sibling object -> (result) ?(label)

get_sibling

*

*

1OP:130

2

 

get_child object -> (result) ?(label)

get_child

*

 

1OP:131

3

 

get_parent object -> (result)

get_parent

*

 

1OP:132

4

 

get_prop_len property-address -> (result)

get_prop_len

   

1OP:133

5

 

inc (variable)

inc

   

1OP:134

6

 

dec (variable)

dec

   

1OP:135

7

 

print_addr byte-address-of-string

print_addr

*

 

1OP:136

8

4

call_1s routine -> (result)

call_1s

   

1OP:137

9

 

remove_obj object

remove_obj

   

1OP:138

A

 

print_obj object

print_obj

   

1OP:139

B

 

ret value

ret

   

1OP:140

C

 

jump ?(label)

jump

   

1OP:141

D

 

print_paddr packed-address-of-string

print_paddr

*

 

1OP:142

E

 

load (variable) -> (result)

load

*

 

1OP:143

F

1/4

not value -> (result)

not

       

5

call_1n routine

call_1n

Opcode numbers 144 to 175: other forms of 1OP with different types.

 

Zero-operand opcodes 0OP

St

Br

Opcode

Hex

V

Inform name and syntax

Link

   

0OP:176

0

 

rtrue

rtrue

   

0OP:177

1

 

rfalse

rfalse

   

0OP:178

2

 

print (literal-string)

print

   

0OP:179

3

 

print_ret (literal-string)

print_ret

   

0OP:180

4

1/-

nop

nop

 

*

0OP:181

5

1

save ?(label)

save

       

4

save -> (result)

save

       

5

[illegal]

 
 

*

0OP:182

6

1

restore ?(label)

restore

       

4

restore -> (result)

restore

       

5

[illegal]

 
   

0OP:183

7

 

restart

restart

   

0OP:184

8

 

ret_popped

ret_popped

   

0OP:185

9

1

pop

pop

*

     

5/6

catch -> (result)

catch

   

0OP:186

A

 

quit

quit

   

0OP:187

B

 

new_line

new_line

   

0OP:188

C

3

show_status

show_status

       

4

[illegal]

 
 

*

0OP:189

D

3

verify ?(label)

verify

   

0OP:190

E

5

[first byte of extended opcode]

extended

 

*

0OP:191

F

5/-

piracy ?(label)

piracy

Opcode numbers 192 to 223: VAR forms of 2OP:0 to 2OP:31.

 

Variable-operand opcodes VAR

St

Br

Opcode

Hex

V

Inform name and syntax

Link

*

 

VAR:224

0

1

call routine ...0 to 3 args... -> (result)

call

       

4

call_vs routine ...0 to 3 args... -> (result)

call_vs

   

VAR:225

1

 

storew array word-index value

storew

   

VAR:226

2

 

storeb array byte-index value

storeb

   

VAR:227

3

 

put_prop object property value

put_prop

   

VAR:228

4

1

sread text parse

sread

       

4

sread text parse time routine

sread

*

     

5

aread text parse time routine -> (result)

aread

   

VAR:229

5

 

print_char output-character-code

print_char

   

VAR:230

6

 

print_num value

print_num

*

 

VAR:231

7

 

random range -> (result)

random

   

VAR:232

8

 

push value

push

   

VAR:233

9

1

pull (variable)

pull

*

     

6

pull stack -> (result)

pull

   

VAR:234

A

3

split_window lines

split_window

   

VAR:235

B

3

set_window window

set_window

*

 

VAR:236

C

4

call_vs2 routine ...0 to 7 args... -> (result)

call_vs2

   

VAR:237

D

4

erase_window window

erase_window

   

VAR:238

E

4/-

erase_line value

erase_line

       

6

erase_line pixels

erase_line

   

VAR:239

F

4

set_cursor line column

set_cursor

       

6

set_cursor line column window

set_cursor

   

VAR:240

10

4/6

get_cursor array

get_cursor

   

VAR:241

11

4

set_text_style style

set_text_style

   

VAR:242

12

4

buffer_mode flag

buffer_mode

   

VAR:243

13

3

output_stream number

output_stream

       

5

output_stream number table

output_stream

       

6

output_stream number table width

output_stream

   

VAR:244

14

3

input_stream number

input_stream

   

VAR:245

15

5/3

sound_effect number effect volume routine

sound_effect

*

 

VAR:246

16

4

read_char 1 time routine -> (result)

read_char

*

*

VAR:247

17

4

scan_table x table len form -> (result)

scan_table

*

 

VAR:248

18

5/6

not value -> (result)

not

   

VAR:249

19

5

call_vn routine ...up to 3 args...

call_vn

   

VAR:250

1A

5

call_vn2 routine ...up to 7 args...

call_vn2

   

VAR:251

1B

5

tokenise text parse dictionary flag

tokenise

   

VAR:252

1C

5

encode_text zscii-text length from coded-text

encode_text

   

VAR:253

1D

5

copy_table first second size

copy_table

   

VAR:254

1E

5

print_table zscii-text width height skip

print_table

 

*

VAR:255

1F

5

check_arg_count argument-number

check_arg_count

Extended opcodes EXT

St

Br

Opcode

Hex

V

Inform name and syntax

Link

*

 

EXT:0

0

5

save table bytes name prompt -> (result)

save

*

 

EXT:1

1

5

restore table bytes name prompt -> (result)

restore

*

 

EXT:2

2

5

log_shift number places -> (result)

log_shift

*

 

EXT:3

3

5/-

art_shift number places -> (result)

art_shift

*

 

EXT:4

4

5

set_font font -> (result)

set_font

*

     

6/-

set_font font window -> (result)

set_font

   

EXT:5

5

6

draw_picture picture-number y x

draw_picture

 

*

EXT:6

6

6

picture_data picture-number array ?(label)

picture_data

   

EXT:7

7

6

erase_picture picture-number y x

erase_picture

   

EXT:8

8

6

set_margins left right window

set_margins

*

 

EXT:9

9

5

save_undo -> (result)

save_undo

*

 

EXT:10

A

5

restore_undo -> (result)

restore_undo

   

EXT:11

B

5/*

print_unicode char-number

print_unicode

   

EXT:12

C

5/*

check_unicode char-number -> (result)

check_unicode

   

EXT:13

D

5/*

set_true_colour foreground background

set_true_colour

       

6/*

set_true_colour foreground background window

set_true_colour

   

-------

E

---

---

 
   

-------

F

---

---

 
   

EXT:16

10

6

move_window window y x

move_window

   

EXT:17

11

6

window_size window y x

window_size

   

EXT:18

12

6

window_style window flags operation

window_style

*

 

EXT:19

13

6

get_wind_prop window property-number -> (result)

get_wind_prop

   

EXT:20

14

6

scroll_window window pixels

scroll_window

   

EXT:21

15

6

pop_stack items stack

pop_stack

   

EXT:22

16

6

read_mouse array

read_mouse

   

EXT:23

17

6

mouse_window window

mouse_window

 

*

EXT:24

18

6

push_stack value stack ?(label)

push_stack

   

EXT:25

19

6

put_wind_prop window property-number value

put_wind_prop

   

EXT:26

1A

6

print_form formatted-table

print_form

 

*

EXT:27

1B

6

make_menu number table ?(label)

make_menu

   

EXT:28

1C

6

picture_table table

picture_table

*

 

EXT:29

1D

6/*

buffer_screen mode -> (result)

buffer_screen

 
14.1 Содержание
Эти таблицы содержат все 119 опкодов и взятое описание из словаря в S 15, описывая именно то, что каждый должен делать. Кроме того, в них перечислены опкоды, которые фактически используются в известных файлах истории Infocom, а также документы синтаксиса языка Inform.
 
14.2 Диапазоны Опкодов
Формально, это неправильно для игры содержать опкод без указания его версии. Интерпретатор должен обычно прерывать работу соответствующим сообщением.
14.2.1
Тем не менее, расширенные опкоды в диапазоне EXT: 29 EXT: 255 должно быть просто проигнорированы (возможно, с предупреждающим сообщением где-то экране).
14.2.2
*** [1.0] [1.1] EXT: 11 и EXT: 12 опкоды, которые добавлены в стандарте 1.0 и могут быть сгенерированы в коде, составленные Inform 6.12 или в более поздних версиях. EXT: 13 и EXT: 29 являются новыми в стандарте 1.1. EXT: от 14 до EXT: 15 и EXT: 30 EXT: 127, зарезервированы для будущих версий этого документа.
14.2.3
Дизайнеры, которые хотят создавать свои собственные "новые" опкоды, для одной конкретной игры, могут использовать номера кодов операций в диапазоне EXT: от 128 до EXT: 255.Легко изменить имена в Inform и собрать такие опкоды. (Конечно, игра должна иметь к нему доступ с соответствующим образом модифицированным интерпретатором, чтобы запустить его)
14.2.4
Интерптетаторы-writers в идеале должны делать это быстро, предоставляя подпрограмму, которая вызывается, если EXT: 128 - EXT: 255 найдены. Так что требуется интерпретатору минимальная возможная модификация.
 
 
Чтение таблиц опкодов
Две колонки "St" и "Br" (store and branch) отмечаются, если программа хранит результат в переменной, и должна ли она обеспечить метку для перехода.
"Опкод"(Opcode) пишется TYPE:Decimal (Тип: Десятичное), где TYPE является счетчиком операнда (2OP, 1OP, 0OP или VAR) , либо EXT для двух байтовых опкодов (где первый байт (десятичное) 190). Десятичное число является наименьшим возможным десятичным значением опкода. Шестнадцатеричное число является числом опкода  в пределах каждого TYPE .
В столбце "V" предоставляется информация о версии. Если не указано иное, то код операции будет указан как «версия 1». До этого времени, его использование является неприемлемым. По мере увеличения версии, некоторые опкоды меняют свои значения и они имеют более одной строки спецификации. Другие вновь становятся не нужными, и они помечены [illegal].
В некоторых случаях, версия дается как "3/4". Первое число это номер версии, которой принадлежит опкод спецификации, а второе является самой ранней версией, в которой опкод известен и на самом деле будет использоваться в файле истории Infocom. Прочерк означает - никогда не использовались (в любой из версий 1 до 6). Обозначение "5 / * " или "6 / * " означает, что опкод был введен в настоящем документе стандартов задолго после эпохи Infocom.
 
Язык Inform assembly
В этом разделе Inform 6 assembly, который намного лучше и эффективнее в работе, чем Inform 5. Inform 6 assembly может генерировать все легальные опкоды и автоматически устанавливает любые последующие биты заголовка (например, использование  set_colour установит автоматически бит "colours needed") ,
Один из способов получить картинку в Inform 6 assembly, это составить короткую программу с отслеживанием так называемого «реле» (с помощью -a или -t переключателей).
1. Inform непосредственно начинается с @ на ассемблере. В приведенном ниже синтаксисе, (variable) и (result) должны быть переменными (или sp, специальная переменная имя доступно только на ассемблере, и это означает , указатель стека); (label) метка (не рутинным имя).
(literal-string) должен быть буквенный текст в кавычках "thus".
Процедура должна быть именем подпрограммы. В противном случае любое имя в  Inform (например, '/' или 'beetle' ) может быть дано в качестве операнда.
2. Это не является обязательным, но целесообразно поместить -> перед store -variable. Например, в
    @mul a 56 -> sp;
( "умножить переменную а на 56 и поместить результат в стек") , -> могут быть опущены, но должны быть включены для ясности.
3. Метка на ответвление(условие), следует начинать со знака вопроса. Как и в
@je a b ?Equal;      ! Branch to Equal if a == b
 (Если знак вопроса опущен, условие составляется в краткой форме, которое будет работать только для очень близлежащих меток и очень редко оказывается полезным в коде, написанном вручную) . Обратите внимание, что эффект любой команды перехода по метке может быть сведены на нет с помощью тильды ~ :
@je a b ?~Different; ! Branch to Different if a ~= b
 4. Метки собраны с использованием точки:
   .MyLabel;
 Все ветви такой метки должны быть в пределах той же процедуры. (Inform 6 assembly накладывает на одну и ту же процедуру ограничение.)
5. Большинство операндов собраны очевидным образом: цифры и постоянные значения (например , символы) как числа, переменные, как переменные, sp в качестве значения на вершине стека. Есть два исключения. Опкод "Вызов"(Call) ожидает в качестве первого операнда имя подпрограммы для вызова:
  @call_1n MyRoutine;
 но можно также дать побочный адрес, как постоянный, так и переменный, используя квадратные скобки:
    @call_1n [x];        ! Call routine whose address is in x
Во- вторых, есть семь переменных опкодов доступа Z-машины, по их номерам: таким образом , следовало бы писать, скажем, константу 0 вместо переменной sp. Это неудобно, поэтому Inform ассемблер вместо этого принимает имена переменных. Inform переводит имя переменной в качестве операнда "small constant " с номером этой переменной в качестве значения. Неэффективными опкодами являются:
inc,  dec,  inc_chk,  dec_chk,  store,  pull,  load.
Inform обозначения для этого включают в себя квадратные скобки:
@inc frog;          ! Increment var "frog"
@inc [frog];        ! Increment var whose number is in "frog"
 Истории файлов Infocom часто используют такие инструкции.
6. Inform assembly также записывает возможные расширения инструкции Z-машины. (Конечно, они могут работать только при использовании настроенного интерпретатора) Просто задайте спецификацию в двойных кавычках, где обычно задают имя опкода. Например,
@"1OP:4S" 34 -> i;
@get_prop_len 34 -> i;
 эквивалентные инструкции, такие как get_prop_len инструкции 4 в 1OP (один операнд) набора - это опкод Store. Синтаксис:
        "  0OP       :  decimal-number  flags  "        (range 0 to 15)
       1OP                                                                            0    15
       2OP                                                                   0    15
       VAR                                                                            32   63
       VAR_LONG                                                     32   63
       EXT                                                                  0    255
       EXT_LONG                                                              0    255
 
EXT_LONG логическая возможность, но не был использован в Z-машине до сих пор: ассемблер предоставляет его на будущее, если он будет полезен) Возможные (Flags) флаги:
       S    Store opcode
       B    Branch opcode
       T    Text in-line instead of operands
            (as with "print" and "print_ret")
       I    "Indirect addressing": first operand is a (variable)
       Fnn  Set bit nn in Flags 2 (signalling to the interpreter that an
            unusual feature has been called for): the number is in decimal
Например,
    "EXT: 128BSF14"
Нами созданный новый опкод, номер 128 в расширенном диапазоне, который является одновременно и Branch и Store, и сборка которого вызывает бит 14  и должен быть установлен в "Flags 2". См S 14.2 ниже, для правил о том, как давать номер для вновь созданных опкодов.
 
Примечание
Обозначение "5/3" для sound_effect потому, что это явная особенность для версии 5 и была использована также в одной игре, версии 3, «The Lurking Horror».
2OP  Опкод  0 был предназначен для установки брейк-поинта в отладке (и может быть использован для этого снова). Это был не nop.
read_mouse и make_menu , как полагается, были использованы только в «Journey» (на основе проверки 11 сюжетных файлов V6).
picture_table  используется один раз в «Shogun» и несколько раз в «Zork Zero».
Голосуй
(0 Голоса)
Оставьте комментарий

Поля, отмеченные звездочкой(*) обязательны для заполнения. HTML теги не приветствуются.

Вход на сайт