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

demo

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

6. Состояние игры: хранение и вызов процедуры в Z-машине

Оглавление

6.1
"Состояние игры" определяется как следующее:
- содержимое динамической памяти; 
- содержимое стека; 
- значение счетчика программы (PC), и "вызов процедуры" (то есть, цепочка процедур, которые вызывали друг друга в определенной последовательности, передавая значения своих локальных переменных). Обратите внимание, что процедура «состояние вызова», стек и ПК должны быть сохранены за пределами карты памяти Z-машины, в собственной памяти интерпретатора.
 
6.1.1
Все состояние игры должны быть сохранены при сохранении игры.
6.1.1.1
Формат сохраненного файла игры не указан.
6.1.1.2
Внутреннее сохранение игры для "отката" целей (если таковой имеется) не является частью состояния игры. Это важно: если бы сохраненный файл игры также содержал внутреннее состояние игры во время сохранения, то было бы невозможно отменить акт восстановления. Оно также предотвращает рост размера внутреннего сохранения игр, поскольку они включают в себя своих предшественников.
6.1.1.3
Это неправильно сохранять игру (либо save или save_undo ) во время "обработки прерывания"( interrupt routine) (идущему через время ожидания ввода, прекращения звукового эффекта или новой строки прерываний). Поэтому сохраненным играм не нужно хранить информацию, способную восстанавливать такую позицию.
6.1.2
На "восстановление" или "отмена" (которые восстанавливают игру, записываются во внутреннюю память), полное состояние игры записывается обратно за исключением того, что «Флаги 2» в заголовке сохраняются. (Эта информация включает в себя ли игра быть расшифрованы на принтер и используется ли фиксированного шага шрифта.)
6.1.2.1
Перед тем, как "восстановить", интерпретатор должен проверить, что файл, который будет использоваться, был сохранен от той же самой игры. (См замечание ниже.)
6.1.2.2
После того, как "восстановить" или "отменить", интерпретатор должен сбросить значения заголовков отмеченные Rst в таблице заголовка S 11. (Не следует считать, что игра была сохранена одним и тем же интерпретатором.)
6.1.3
А "перезапуск" похож: все состояние восстанавливается из оригинальной истории файла, а стек опустошается; но «Флаги 2» сохраняются; и интерпретатор должен сбросить Rst части заголовка.
6.1.4
В версии 5 и более поздних версий, интерпретатор не мог сохранять состояние игры во внутреннюю память (для "отката" цели), поэтому необходимо было очистить бит 4 «Флаги 2» в заголовке.
6.2 Сохранение и глобальные переменные
Глобальные переменные (переменные числа $ 10 до $ FF ) хранятся в таблице в динамической памяти Z-машины, на байтовом адресе, указанный в слове 6 заголовка. Таблица состоит из 240 2-байтовых слов и начальные значения глобальных переменных являются значениями первоначально содержащиеся в таблице. (Программа совершает эти действия по стандарту, для изменения содержимого таблицы непосредственно в игре, хотя и не для того, чтобы изменить адрес таблицы.)
6.3 Стек
Запись в указатель стека (номер переменной $ 00 ) сдвигает значение в стек; чтение из него дает значение - выкл. Стек записи представляют собой 2-байтовые слова, как обычно.
6.3.1
Стек считается пустым в начале каждой процедуры: это неправильно, чтобы получить из него значения, если значения не были сначала сдвинуты.
6.3.2
Стек остается пустым в конце каждой процедуры: когда возврат происходит, любые значения, помещаемые во время выполнения подпрограммы выбрасываются.
6.3.3
Абсолютный минимальный стандарт для размера стека определяется следующим образом:
- пусть «использование» вызова процедуры будет 4 плюс число локальных переменных, которая она имеет. Во время игры вызывается, в общей сложности использований, для каждой подпрограммы в рекурсивной цепи подпрограмм, плюс собственное использование стека в игре, можно предположить, что значение стека никогда не достигнет 1024.
Однако более поздние игры требуют гораздо больший размер стека, чем это позволяет программа.
Два примера современных интерпретаторов с увеличенным размером стека для Windows  - Frotz с 32768 и nfrotz с 61440.
6.3.4
В семи опкодах , которые принимают косвенные ссылки на переменные (incdecinc_chkdec_chkloadstorepull), косвенную ссылку на указатель стека не сдвигать или перносить верхний элемент стека.
6.4 Вызовы процедуры
Обычные вызовы происходят в следующих случаях: когда один из вызовов ... опкоды выполняется; в версии 4 и позже, когда ввод с клавиатуры будет находиться под контролем; в версиях 5 и позже, когда заканчивается звуковой эффект; в версии 6, когда начинается игра (называтеся "основной" подпрограммой); в версии 6, когда "прерывание новой строки" происходит.
6.4.1
Вызов процедуры может иметь любое количество аргументов, от 0 до 3 (в версиях от 1 до 3) или от 0 до 7 (версии 4 и более поздних версий). Все подпрограммы возвращают значение (хотя иногда это значение отбрасывается после этого: например, опкодами в виде call_vn*).
6.4.2
Обычные вызовы сохраняют локальные переменные и стек (кроме случаев, когда возвращаемое значение сохраняется в локальной переменной или на вершине стека).
6.4.3
Вызов процедуры упакованной адрес 0 является правильным: он ничего не делает и возвращает ложь (0). В противном случае это неправильно, чтобы назвать упакованный адрес, где нет процедуры.
6.4.4
Когда процедура вызывается, ее локальные переменные создаются с исходными значениями, полученными из обычного заголовка (версии от 1 до 4) или с начальным значением 0 5 (версии и выше). Далее, аргументы записываются в локальных переменных (аргументов 1 на локальный 1 и так далее).
6.4.4.1
Это правильно, чтобы было больше аргументов, чем локальных переменных (любые запасные аргументы отбрасываются).
6.4.5
Возвращаемое значение подпрограммы может быть любой Z-номер машины. Возвращение «ложь» означает возвращение 0; возвращение «истина» означает возвращение числа 1.
6.5 Кадры стека
"Кадр стека"(stack frame) является индексом в состоянии обычного вызова (то есть вызов стека адресов возврата из подпрограмм в настоящее время, и значения локальных переменных внутри них). Этот индекс представляет собой число Z-машины. Интерпретатор должен быть в состоянии производить текущее значение и устанавливать значение далее вниз стека вызовов, чем текущая, фактически выбрасывая его недавнюю историю (см. catch и throw)
6.6 Пользовательский стек
В версии 6, Z-машина понимает, третий вид стека: "стек пользователя", который является таблицей слов в динамической памяти. Первое слово в этой таблице всегда содержит количество запасных слотов в стеке (поэтому начальное значение - емкость стека). Z-машина не делает проверку на стеке под потоком (т.е. отдавать больше значений, чем были сдвинуты).
 

Пред. След. »

Rate this item
(0 votes)
Login to post comments