Fallout2 Opcode Playground

Opcodes: 8000-801F, 8020-803F, 8040-805F,
8060-807F, 8080-809F, 80A0-80BF, 80C0-80DF,
80E0-80FF, 8100-811F, 8120-813F, 8140-8155
 
List Opcodes:Used in Fallout 2Named
Known to DecompilerDescribed

Descriptions for 8005

Opcode8005, call
>> subfunction   call

Author: Wasteland Ghost

07.02.05 15:51:58

Вызов функции.
Синтаксис оригинального компилятора:
call procedure_name [in delay | when condition]; - вызов процедуры
Параметры:
procedure_name - имя процедуры
delay - задержка в игровом времени
condition - условие (условный вызов возможен только для процедур без параметров!)
Примечания:
при вызове процедура помещается в стек. Вызов может быть отменён с помощью функций Cancel и CancelAll. Процедура обязательно должна быть объявлена или определена до её вызова. Если два вызова следуют подряд, то нет никакой гарантии, что вызванные функции будут выполнены именно в таком порядке (см. также critical). Вообще, похоже, единственная функция, которая выполняется сразу, окончательно и бесповоротно - это destroy_object. При последовательном отложенном вызове одной и той же процедуры время вызова будет заменено последним значением, процедура будет выполнена только один раз (не проверено!).
Author: legacy information

22.06.02 13:29:01

Вызов одной функции из другой строится с использованием команд 800D и 8005:
8005; call; аргумент1, аргумент2, : , аргументN, количество аргументов, индекс функции в таблице функций (считается от нуля); результат функции.
Аргументов может не быть вообще, тогда количество их устанавливается в ноль. Индекс может быть указан как константа командой C001 XXXX XXXX или вычислен из имени функции командой 8028:
8028; @; указатель на строку - имя функции; индекс функции.
Указатель помещается командой 9001 XXXX XXXX и смещение считается от начала списка строк (а не идентификаторов).
Вызову функции предшествует помещение адреса возврата в стек возвратов. Пример:
Предположим, что адрес команды, следующей за вызовом функции, равен 15E6h. Функция не имеет аргументов и индекс ее равен 5. Тогда вызов функции записывается следующей последовательностью:
C001 0000 15E6 800D C001 0000 0000 C001 0000 0005 8005
Большинство функций в скриптах используются скорее как процедуры, т.е. возвращают всегда нулевой результат, не используемый в дальнейшем. Для удаления такого результата из стека используется описанная выше команда 801A, следующая непосредственно за 8005.
Author: legacy information

18.06.02 22:31:22

Вызов одной функции из другой строится с использованием команд 800D и 8005: 8005; call; аргумент1, аргумент2, : , аргументN, количество аргументов, индекс функции в таблице функций (считается от нуля); результат функции.

Аргументов может не быть вообще, тогда количество их устанавливается в ноль. Индекс может быть указан как константа командой C001 XXXX XXXX или вычислен из имени функции командой 8028: 8028; @; указатель на строку - имя функции; индекс функции.

Указатель помещается командой 9001 XXXX XXXX и смещение считается от начала списка строк (а не идентификаторов).

Вызову функции предшествует помещение адреса возврата в стек возвратов. Пример:

Предположим, что адрес команды, следующей за вызовом функции, равен 15E6h. Функция не имеет аргументов и индекс ее равен 5. Тогда вызов функции записывается следующей последовательностью: C001 0000 15E6 800D C001 0000 0000 C001 0000 0005 8005

Большинство функций в скриптах используются скорее как процедуры, т.е. возвращают всегда нулевой результат, не используемый в дальнейшем. Для удаления такого результата из стека используется описанная выше команда 801A, следующая непосредственно за 8005.