mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 16:44:21 +03:00
655 lines
73 KiB
HTML
655 lines
73 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>S/gt</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html">compiler</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html"><b>extensions and kits</b></a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
/ul>
|
|
<h2>Extensions</h2>
|
|
<ul>
|
|
<li><a href="../basic_inform/index.html">Basic Inform</a></li>
|
|
<li><a href="../standard_rules/index.html">Standard Rules</a></li>
|
|
</ul>
|
|
<h2>Kits</h2>
|
|
<ul>
|
|
<li><a href="../BasicInformKit/index.html">BasicInformKit</a></li>
|
|
<li><a href="../BasicInformExtrasKit/index.html">BasicInformExtrasKit</a></li>
|
|
<li><a href="../CommandParserKit/index.html">CommandParserKit</a></li>
|
|
<li><a href="../EnglishLanguageKit/index.html">EnglishLanguageKit</a></li>
|
|
<li><a href="../WorldModelKit/index.html">WorldModelKit</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'S/zt' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">BasicInformKit</a></li><li><b>ZMachine Template</b></li></ul><p class="purpose">To provide routines handling low-level Z-machine facilities.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Begin Z-only matter</a></li><li><a href="#SP2">§2. Summary</a></li><li><a href="#SP3">§3. Variables and Arrays</a></li><li><a href="#SP4">§4. Enable Acceleration</a></li><li><a href="#SP5">§5. Release Number</a></li><li><a href="#SP6">§6. Keyboard Input</a></li><li><a href="#SP7">§7. Buffer Functions</a></li><li><a href="#SP8">§8. Dictionary Functions</a></li><li><a href="#SP9">§9. Command Tables</a></li><li><a href="#SP10">§10. SHOWVERB support</a></li><li><a href="#SP11">§11. RNG</a></li><li><a href="#SP12">§12. Memory Allocation</a></li><li><a href="#SP13">§13. Audiovisual Resources</a></li><li><a href="#SP14">§14. Typography</a></li><li><a href="#SP15">§15. Character Casing</a></li><li><a href="#SP16">§16. The Screen</a></li><li><a href="#SP17">§17. Window Colours</a></li><li><a href="#SP18">§18. Main Window</a></li><li><a href="#SP19">§19. Status Line</a></li><li><a href="#SP20">§20. Quotation Boxes</a></li><li><a href="#SP21">§21. Undo</a></li><li><a href="#SP22">§22. Veneer</a></li><li><a href="#SP23">§23. End Z-only matter</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Begin Z-only matter. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">TARGET_ZCODE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Summary. </b>This segment closely parallels "Glulx.i6t", which provides exactly
|
|
equivalent functionality (indeed, usually the same-named functions and in
|
|
the same order) for the Glulx VM. This is intended to make the rest of the
|
|
template code independent of the choice of VM, although that is more of an
|
|
ideal than a reality, because there are so many fiddly differences in some
|
|
of the grammar and dictionary tables that it is not really practical for
|
|
the parser (for instance) to call VM-neutral routines to get the data it
|
|
wants out of these arrays.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Variables and Arrays. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">top_object</span><span class="plain">; </span><span class="comment">! largest valid number of any tree object</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">xcommsdir</span><span class="plain">; </span><span class="comment">! true if command recording is on</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">transcript_mode</span><span class="plain">; </span><span class="comment">! true if game scripting is on</span>
|
|
|
|
<span class="reserved">Constant</span><span class="plain"> </span><span class="identifier">INPUT_BUFFER_LEN</span><span class="plain"> = </span><span class="constant">120</span><span class="plain">; </span><span class="comment">! Length of buffer array</span>
|
|
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain"> </span><span class="constant">-</span><span class="plain">> </span><span class="constant">123</span><span class="plain">; </span><span class="comment">! Buffer for parsing main line of input</span>
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">buffer2</span><span class="plain"> </span><span class="constant">-</span><span class="plain">> </span><span class="constant">123</span><span class="plain">; </span><span class="comment">! Buffers for supplementary questions</span>
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">buffer3</span><span class="plain"> </span><span class="constant">-</span><span class="plain">> </span><span class="constant">123</span><span class="plain">; </span><span class="comment">! Buffer retaining input for "again"</span>
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">parse</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain"> </span><span class="constant">63</span><span class="plain">; </span><span class="comment">! Parse table mirroring it</span>
|
|
<span class="reserved">Array</span><span class="plain"> </span><span class="identifier">parse2</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain"> </span><span class="constant">63</span><span class="plain">; </span><span class="comment">!</span>
|
|
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">dict_start</span><span class="plain">;</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">dict_entry_size</span><span class="plain">;</span>
|
|
<span class="identifier">Global</span><span class="plain"> </span><span class="identifier">dict_end</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Enable Acceleration. </b>This rule enables use of March 2009 extension to Glulx which optimises the speed
|
|
of Inform-compiled story files, so for the Z-machine it has no effect.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">ENABLE_GLULX_ACCEL_R</span><span class="plain">;</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Release Number. </b>Like all software, IF story files have release numbers to mark revised
|
|
versions being circulated: unlike most software, and partly for traditional
|
|
reasons, the version number is recorded not in some print statement or
|
|
variable but is branded on, so to speak, in a specific memory location
|
|
of the story file header.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_Describe_Release()</span></code> describes the release and is used as part of the
|
|
"banner", IF's equivalent to a title page.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_Describe_Release</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"Release "</span><span class="plain">, (</span><span class="identifier">HDR_GAMERELEASE</span><span class="plain">-->0) & </span><span class="constant">$03ff</span><span class="plain">, </span><span class="string">" / Serial number "</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0 : </span><span class="identifier">i</span><span class="plain"><6 : </span><span class="identifier">i</span><span class="plain">++) </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">char</span><span class="plain">) </span><span class="identifier">HDR_GAMESERIAL</span><span class="plain">-></span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Keyboard Input. </b>The VM must provide three routines for keyboard input:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) <code class="display"><span class="extract">VM_KeyChar()</span></code> waits for a key to be pressed and then returns the
|
|
character chosen as a ZSCII character.
|
|
</li><li>(b) <code class="display"><span class="extract">VM_KeyDelay(N)</span></code> waits up to N/10 seconds for a key to be pressed,
|
|
returning the ZSCII character if so, or 0 if not.
|
|
</li><li>(c) <code class="display"><span class="extract">VM_ReadKeyboard(b, t)</span></code> reads a whole newline-terminated command
|
|
into the buffer <code class="display"><span class="extract">b</span></code>, then parses it into a word stream in the table <code class="display"><span class="extract">t</span></code>.
|
|
</li></ul>
|
|
<p class="inwebparagraph">There are elaborations to due with mouse clicks, but this isn't the place
|
|
to document all of that.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_KeyChar</span><span class="plain"> </span><span class="identifier">win</span><span class="plain"> </span><span class="identifier">key</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">win</span><span class="plain">) @</span><span class="identifier">set_window</span><span class="plain"> </span><span class="identifier">win</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">read_char</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="constant">-</span><span class="plain">> </span><span class="identifier">key</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">key</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_KeyDelay</span><span class="plain"> </span><span class="identifier">tenths</span><span class="plain"> </span><span class="identifier">key</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">read_char</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="identifier">tenths</span><span class="plain"> </span><span class="identifier">VM_KeyDelay_Interrupt</span><span class="plain"> </span><span class="constant">-</span><span class="plain">> </span><span class="identifier">key</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">key</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">[ </span><span class="identifier">VM_KeyDelay_Interrupt</span><span class="plain">; </span><span class="reserved">rtrue</span><span class="plain">; ];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_ReadKeyboard</span><span class="plain"> </span><span class="identifier">a_buffer</span><span class="plain"> </span><span class="identifier">a_table</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">read</span><span class="plain"> </span><span class="identifier">a_buffer</span><span class="plain"> </span><span class="identifier">a_table</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEMPLATE_CONFIGURATION_BITMAP</span><span class="plain"> & </span><span class="identifier">ECHO_COMMANDS_TCBIT</span><span class="plain">) {</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"** "</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=2: </span><span class="identifier">i</span><span class="plain"><=(</span><span class="identifier">a_buffer</span><span class="plain">->1)+1: </span><span class="identifier">i</span><span class="plain">++) </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">char</span><span class="plain">) </span><span class="identifier">a_buffer</span><span class="plain">-></span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"^"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
|
|
typed from the keyboard; a "parse buffer" is an array which resolves this
|
|
into individual words, pointing to the relevant entries in the dictionary
|
|
structure. Because each VM has its own format for each of these arrays (not
|
|
to mention the dictionary), we have to provide some standard operations
|
|
needed by the rest of the template as routines for each VM.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The Z-machine buffer and parse buffer formats are documented in the DM4.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_CopyBuffer(to, from)</span></code> copies one buffer into another.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_Tokenise(buff, parse_buff)</span></code> takes the text in the buffer <code class="display"><span class="extract">buff</span></code> and
|
|
produces the corresponding data in the parse buffer <code class="display"><span class="extract">parse_buff</span></code> — this is
|
|
called tokenisation since the characters are divided into words: in traditional
|
|
computing jargon, such clumps of characters treated syntactically as units
|
|
are called tokens.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">LTI_Insert</span></code> is documented in the DM4 and the <code class="display"><span class="extract">LTI</span></code> prefix stands for
|
|
"Language To Informese": it's used only by translations into non-English
|
|
languages of play, and is not called in the template.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_CopyBuffer</span><span class="plain"> </span><span class="identifier">bto</span><span class="plain"> </span><span class="identifier">bfrom</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0: </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">INPUT_BUFFER_LEN</span><span class="plain">: </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">bto</span><span class="plain">-></span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">bfrom</span><span class="plain">-></span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_PrintToBuffer</span><span class="plain"> </span><span class="identifier">buf</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">output_stream</span><span class="plain"> </span><span class="constant">3</span><span class="plain"> </span><span class="identifier">buf</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="reserved">metaclass</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">)) {</span>
|
|
<span class="identifier">String</span><span class="plain">: </span><span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="identifier">Routine</span><span class="plain">: </span><span class="identifier">a</span><span class="plain">(</span><span class="identifier">b</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="identifier">Object</span><span class="plain">, </span><span class="identifier">Class</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">b</span><span class="plain">) </span><span class="identifier">PrintOrRun</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">, </span><span class="identifier">b</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">print</span><span class="plain"> (</span><span class="identifier">name</span><span class="plain">) </span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">@</span><span class="identifier">output_stream</span><span class="plain"> </span><span class="constant">-3</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buf</span><span class="plain">-->0 > </span><span class="identifier">len</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"Error: Overflow in VM_PrintToBuffer.^"</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">buf</span><span class="plain">-->0;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_Tokenise</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">b</span><span class="plain">->(2 + </span><span class="identifier">b</span><span class="plain">->1) = </span><span class="constant">0</span><span class="plain">; @</span><span class="identifier">tokenise</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> </span><span class="identifier">p</span><span class="plain">; ];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">LTI_Insert</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">ch</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">;</span>
|
|
<span class="comment">! Protect us from strict mode, as this isn't an array in quite the</span>
|
|
<span class="comment">! sense it expects</span>
|
|
<span class="identifier">b</span><span class="plain"> = </span><span class="identifier">buffer</span><span class="plain">;</span>
|
|
|
|
<span class="comment">! Insert character ch into buffer at point i.</span>
|
|
<span class="comment">! Being careful not to let the buffer possibly overflow:</span>
|
|
<span class="identifier">y</span><span class="plain"> = </span><span class="identifier">b</span><span class="plain">->1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">y</span><span class="plain"> > </span><span class="identifier">b</span><span class="plain">->0) </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">b</span><span class="plain">->0;</span>
|
|
|
|
<span class="comment">! Move the subsequent text along one character:</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">y</span><span class="plain">=</span><span class="identifier">y</span><span class="plain">+2 : </span><span class="identifier">y</span><span class="plain">></span><span class="identifier">i</span><span class="plain"> : </span><span class="identifier">y</span><span class="plain">--) </span><span class="identifier">b</span><span class="plain">-></span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">b</span><span class="plain">->(</span><span class="identifier">y</span><span class="plain">-1);</span>
|
|
<span class="identifier">b</span><span class="plain">-></span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">ch</span><span class="plain">;</span>
|
|
|
|
<span class="comment">! And the text is now one character longer:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">b</span><span class="plain">->1 < </span><span class="identifier">b</span><span class="plain">->0) (</span><span class="identifier">b</span><span class="plain">->1)++;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
|
|
This is a data structure containing, in compressed form, the text of all the
|
|
words to be recognised by tokenisation (above). In I6 for Z, a dictionary word
|
|
value is represented at run-time by its record number in the dictionary,
|
|
0, 1, 2, ..., in alphabetical order.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_InvalidDictionaryAddress(A)</span></code> tests whether <code class="display"><span class="extract">A</span></code> is a valid record address
|
|
in the dictionary data structure.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_DictionaryAddressToNumber(A)</span></code> and <code class="display"><span class="extract">VM_NumberToDictionaryAddress(N)</span></code>
|
|
convert between record numbers and dictionary addresses.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_InvalidDictionaryAddress</span><span class="plain"> </span><span class="identifier">addr</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">UnsignedCompare</span><span class="plain">(</span><span class="identifier">addr</span><span class="plain">, </span><span class="identifier">dict_start</span><span class="plain">) < </span><span class="constant">0</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">UnsignedCompare</span><span class="plain">(</span><span class="identifier">addr</span><span class="plain">, </span><span class="identifier">dict_end</span><span class="plain">) >= </span><span class="constant">0</span><span class="plain">) ||</span>
|
|
<span class="plain">((</span><span class="identifier">addr</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="identifier">dict_start</span><span class="plain">) % </span><span class="identifier">dict_entry_size</span><span class="plain"> ~= </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="reserved">rfalse</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_DictionaryAddressToNumber</span><span class="plain"> </span><span class="identifier">w</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain">-(</span><span class="identifier">HDR_DICTIONARY</span><span class="plain">-->0 + </span><span class="constant">7</span><span class="plain">))/9; ];</span>
|
|
<span class="plain">[ </span><span class="identifier">VM_NumberToDictionaryAddress</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">HDR_DICTIONARY</span><span class="plain">-->0 + </span><span class="constant">7</span><span class="plain"> + </span><span class="constant">9</span><span class="plain">*</span><span class="identifier">n</span><span class="plain">; ];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Command Tables. </b>The VM is also generated containing a data structure for the grammar
|
|
produced by I6's <code class="display"><span class="extract">Verb</span></code> and <code class="display"><span class="extract">Extend</span></code> directives: this is essentially a
|
|
list of command verbs such as DROP or PUSH, together with a list of
|
|
synonyms, and then the grammar for the subsequent commands to be
|
|
recognised by the parser.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_CommandTableAddress</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">HDR_STATICMEMORY</span><span class="plain">-->0)--></span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_PrintCommandWords</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> </span><span class="identifier">da</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">;</span>
|
|
<span class="identifier">da</span><span class="plain"> = </span><span class="identifier">HDR_DICTIONARY</span><span class="plain">-->0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=0 : </span><span class="identifier">j</span><span class="plain"><(</span><span class="identifier">da</span><span class="plain">+5)-->0 : </span><span class="identifier">j</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">da</span><span class="plain">->(</span><span class="identifier">j</span><span class="plain">*9 + </span><span class="constant">14</span><span class="plain">) == </span><span class="constant">$ff-</span><span class="identifier">i</span><span class="plain">)</span>
|
|
<span class="reserved">print</span><span class="plain"> </span><span class="string">"'"</span><span class="plain">, (</span><span class="identifier">address</span><span class="plain">) </span><span class="identifier">VM_NumberToDictionaryAddress</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">), </span><span class="string">"' "</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. SHOWVERB support. </b>Further VM-specific tables cover actions and attributes, and these are
|
|
used by the SHOWVERB testing command.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">#</span><span class="identifier">Ifdef</span><span class="plain"> </span><span class="identifier">DEBUG</span><span class="plain">;</span>
|
|
<span class="plain">[ </span><span class="identifier">DebugAction</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">anames</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain"> >= </span><span class="constant">4096</span><span class="plain">) { </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"<fake action "</span><span class="plain">, </span><span class="identifier">a</span><span class="plain">-4096, </span><span class="string">">"</span><span class="plain">; </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="identifier">anames</span><span class="plain"> = #</span><span class="identifier">identifiers_table</span><span class="plain">;</span>
|
|
<span class="identifier">anames</span><span class="plain"> = </span><span class="identifier">anames</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">*(</span><span class="identifier">anames</span><span class="plain">-->0) + </span><span class="constant">2</span><span class="plain">*48;</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">anames</span><span class="plain">--></span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">DebugAttribute</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">anames</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain"> < </span><span class="constant">0</span><span class="plain"> || </span><span class="identifier">a</span><span class="plain"> >= </span><span class="constant">48</span><span class="plain">) </span><span class="reserved">print</span><span class="plain"> </span><span class="string">"<invalid attribute "</span><span class="plain">, </span><span class="identifier">a</span><span class="plain">, </span><span class="string">">"</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">anames</span><span class="plain"> = #</span><span class="identifier">identifiers_table</span><span class="plain">; </span><span class="identifier">anames</span><span class="plain"> = </span><span class="identifier">anames</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">*(</span><span class="identifier">anames</span><span class="plain">-->0);</span>
|
|
<span class="reserved">print</span><span class="plain"> (</span><span class="reserved">string</span><span class="plain">) </span><span class="identifier">anames</span><span class="plain">--></span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. RNG. </b>No routine is needed for extracting a random number, since I6's built-in
|
|
<code class="display"><span class="extract">random</span></code> function does that, but it's useful to abstract the process of
|
|
seeding the RNG so that it produces a repeatable sequence of "random"
|
|
numbers from here on: the necessary opcodes are different for the two VMs.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_Seed_RNG</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">-</span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="reserved">random</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> </span><span class="constant">-</span><span class="plain">> </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Memory Allocation. </b>This is dynamic memory allocation: something which is never practicable in
|
|
the Z-machine, because the whole address range is already claimed, but which
|
|
is viable on recent revisions of Glulx.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_AllocateMemory</span><span class="plain"> </span><span class="identifier">amount</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_FreeMemory</span><span class="plain"> </span><span class="identifier">address</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Audiovisual Resources. </b>The Z-machine only barely supports figures and sound effects, and only in
|
|
version 6 of the Z-machine, which Inform 7 no longer supports. Sound effects
|
|
have a longer pedigree and Infocom used them on some version 5 and even some
|
|
version 3 works: really, though, from an Inform point of view we would prefer
|
|
that anyone needing figures and sounds use Glulx instead. (Inform 6 remains
|
|
available for those who really need to make audiovisual effects in these
|
|
long-gone formats.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_Picture</span><span class="plain"> </span><span class="identifier">resource_ID</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_SoundEffect</span><span class="plain"> </span><span class="identifier">resource_ID</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Typography. </b>Relatively few typographic effects are available on the Z-machine, so that
|
|
many of the semantic markups for text which would be distinguishable on
|
|
Glulx are indistinguishable here.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_Style</span><span class="plain"> </span><span class="identifier">sty</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">sty</span><span class="plain">) {</span>
|
|
<span class="identifier">NORMAL_VMSTY</span><span class="plain">, </span><span class="identifier">NOTE_VMSTY</span><span class="plain">: </span><span class="reserved">style</span><span class="plain"> </span><span class="identifier">roman</span><span class="plain">;</span>
|
|
<span class="identifier">HEADER_VMSTY</span><span class="plain">, </span><span class="identifier">SUBHEADER_VMSTY</span><span class="plain">, </span><span class="identifier">ALERT_VMSTY</span><span class="plain">: </span><span class="reserved">style</span><span class="plain"> </span><span class="identifier">bold</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Character Casing. </b>The following are the equivalent of <code class="display"><span class="extract">tolower</span></code> and <code class="display"><span class="extract">toupper</span></code>, the traditional
|
|
C library functions for forcing letters into lower and upper case form, for
|
|
the ZSCII character set.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_UpperToLowerCase</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="character">'A'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="character">'Z'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">32</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">158</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">160</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">167</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">168</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">175</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">180</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">6</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">186</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">190</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">5</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">196</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">200</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">5</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">202</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">204</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">208</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">210</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">212</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">214</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">217</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">218</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">221</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_LowerToUpperCase</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="character">'a'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="character">'z'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> </span><span class="constant">-</span><span class="plain"> </span><span class="constant">32</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">155</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">157</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">164</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">165</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">169</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">174</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">6</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">181</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">185</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">5</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">191</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">195</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">5</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">201</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">203</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> < </span><span class="constant">205</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="constant">207</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">211</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">213</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">215</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">216</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">220</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
|
|
to refer only to two of these, the main window and the status line, but
|
|
others may also exist from time to time. Windows have unique ID numbers:
|
|
the special window ID -1 means "all windows" or "the entire screen",
|
|
which usually amounts to the same thing.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Screen height and width are measured in characters, with respect to the
|
|
fixed-pitch font used for the status line. The main window normally contains
|
|
variable-pitch text which may even have been kerned, and character dimensions
|
|
make little sense there.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Clearing all windows (<code class="display"><span class="extract">WIN_ALL</span></code> here) has the side-effect of collapsing the
|
|
status line, so we need to ensure that <code class="display"><span class="extract">statuswin_cursize</span></code> is reduced to 0,
|
|
in order to keep it accurate.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_ClearScreen</span><span class="plain"> </span><span class="identifier">window</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">window</span><span class="plain">) {</span>
|
|
<span class="identifier">WIN_ALL</span><span class="plain">: @</span><span class="identifier">erase_window</span><span class="plain"> </span><span class="constant">-1</span><span class="plain">; </span><span class="identifier">statuswin_cursize</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">WIN_STATUS</span><span class="plain">: @</span><span class="identifier">erase_window</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">WIN_MAIN</span><span class="plain">: @</span><span class="identifier">erase_window</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_ScreenWidth</span><span class="plain"> </span><span class="identifier">width</span><span class="plain"> </span><span class="identifier">charw</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> (</span><span class="identifier">HDR_SCREENWCHARS</span><span class="plain">->0); ];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_ScreenHeight</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> (</span><span class="identifier">HDR_SCREENHLINES</span><span class="plain">->0); ];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Window Colours. </b>Each window can have its own foreground and background colours.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The colour of individual letters or words of type is not controllable in
|
|
Glulx, to the frustration of many, and so the template layer of I7 has no
|
|
framework for handling this (even though it is controllable on the Z-machine,
|
|
which is greatly superior in this respect).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_SetWindowColours</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> </span><span class="identifier">window</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clr_on</span><span class="plain"> && </span><span class="identifier">f</span><span class="plain"> && </span><span class="identifier">b</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">window</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="comment">! if setting both together, set reverse</span>
|
|
<span class="identifier">clr_fgstatus</span><span class="plain"> = </span><span class="identifier">b</span><span class="plain">;</span>
|
|
<span class="identifier">clr_bgstatus</span><span class="plain"> = </span><span class="identifier">f</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">window</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
|
|
<span class="identifier">clr_fgstatus</span><span class="plain"> = </span><span class="identifier">f</span><span class="plain">;</span>
|
|
<span class="identifier">clr_bgstatus</span><span class="plain"> = </span><span class="identifier">b</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">window</span><span class="plain"> == </span><span class="constant">0</span><span class="plain"> </span><span class="reserved">or</span><span class="plain"> </span><span class="constant">2</span><span class="plain">) {</span>
|
|
<span class="identifier">clr_fg</span><span class="plain"> = </span><span class="identifier">f</span><span class="plain">;</span>
|
|
<span class="identifier">clr_bg</span><span class="plain"> = </span><span class="identifier">b</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">statuswin_current</span><span class="plain">)</span>
|
|
<span class="plain">@</span><span class="identifier">set_colour</span><span class="plain"> </span><span class="identifier">clr_fgstatus</span><span class="plain"> </span><span class="identifier">clr_bgstatus</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="plain">@</span><span class="identifier">set_colour</span><span class="plain"> </span><span class="identifier">clr_fg</span><span class="plain"> </span><span class="identifier">clr_bg</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_RestoreWindowColours</span><span class="plain">; </span><span class="comment">! compare I6 library patch L61007</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clr_on</span><span class="plain">) { </span><span class="comment">! check colour has been used</span>
|
|
<span class="identifier">VM_SetWindowColours</span><span class="plain">(</span><span class="identifier">clr_fg</span><span class="plain">, </span><span class="identifier">clr_bg</span><span class="plain">, </span><span class="constant">2</span><span class="plain">); </span><span class="comment">! make sure both sets of variables are restored</span>
|
|
<span class="identifier">VM_SetWindowColours</span><span class="plain">(</span><span class="identifier">clr_fgstatus</span><span class="plain">, </span><span class="identifier">clr_bgstatus</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="reserved">true</span><span class="plain">);</span>
|
|
<span class="identifier">VM_ClearScreen</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Main Window. </b>The part of the screen on which commands and responses are printed, which
|
|
ordinarily occupies almost all of the screen area.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_MainWindow()</span></code> switches printing back from another window, usually the
|
|
status line, to the main window. Note that the Z-machine implementation
|
|
emulates the Glulx model of window rather than text colours.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_MainWindow</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">statuswin_current</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clr_on</span><span class="plain"> && </span><span class="identifier">clr_bgstatus</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) @</span><span class="identifier">set_colour</span><span class="plain"> </span><span class="identifier">clr_fg</span><span class="plain"> </span><span class="identifier">clr_bg</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">style</span><span class="plain"> </span><span class="identifier">roman</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">set_window</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">statuswin_current</span><span class="plain"> = </span><span class="reserved">false</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. Status Line. </b>Despite the name, the status line need not be a single line at the top of
|
|
the screen: that's only the conventional default arrangement. It can expand
|
|
to become the equivalent of an old-fashioned VT220 terminal, with menus
|
|
and grids and mazes displayed lovingly in character graphics, or it can
|
|
close up to invisibility.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_StatusLineHeight(n)</span></code> sets the status line to have a height of <code class="display"><span class="extract">n</span></code> lines
|
|
of type. (The width of the status line is always the width of the whole
|
|
screen, and the position is always at the top, so the height is the only
|
|
controllable aspect.) The n=0 case makes the status line disappear.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">VM_MoveCursorInStatusLine(x, y)</span></code> switches printing to the status line,
|
|
positioning the "cursor" — the position at which printing will begin —
|
|
at the given character grid position (x, y). Line 1 represents the top
|
|
line; line 2 is underneath, and so on; columns are similarly numbered from
|
|
1 at the left.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_MoveCursorInStatusLine</span><span class="plain"> </span><span class="identifier">line</span><span class="plain"> </span><span class="identifier">column</span><span class="plain">; </span><span class="comment">! 1-based position on text grid</span>
|
|
<span class="reserved">if</span><span class="plain"> (~~</span><span class="identifier">statuswin_current</span><span class="plain">) {</span>
|
|
<span class="plain">@</span><span class="identifier">set_window</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">clr_on</span><span class="plain"> && </span><span class="identifier">clr_bgstatus</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) @</span><span class="identifier">set_colour</span><span class="plain"> </span><span class="identifier">clr_fgstatus</span><span class="plain"> </span><span class="identifier">clr_bgstatus</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">style</span><span class="plain"> </span><span class="identifier">reverse</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">line</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">line</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">column</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">@</span><span class="identifier">set_cursor</span><span class="plain"> </span><span class="identifier">line</span><span class="plain"> </span><span class="identifier">column</span><span class="plain">;</span>
|
|
<span class="identifier">statuswin_current</span><span class="plain"> = </span><span class="reserved">true</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_StatusLineHeight</span><span class="plain"> </span><span class="identifier">height</span><span class="plain"> </span><span class="identifier">wx</span><span class="plain"> </span><span class="identifier">wy</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> </span><span class="identifier">charh</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">statuswin_cursize</span><span class="plain"> ~= </span><span class="identifier">height</span><span class="plain">)</span>
|
|
<span class="plain">@</span><span class="identifier">split_window</span><span class="plain"> </span><span class="identifier">height</span><span class="plain">;</span>
|
|
<span class="identifier">statuswin_cursize</span><span class="plain"> = </span><span class="identifier">height</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. Quotation Boxes. </b>No routine is needed to produce quotation boxes: the I6 <code class="display"><span class="extract">box</span></code> statement
|
|
generates the necessary Z-machine opcodes all by itself.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. Undo. </b>These simply wrap the relevant opcodes.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">VM_Undo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">restore_undo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">VM_Save_Undo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">save_undo</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">result_code</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. Veneer. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">[ </span><span class="identifier">Unsigned__Compare</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> </span><span class="identifier">u</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">je</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> ?</span><span class="reserved">rfalse</span><span class="plain">; </span><span class="comment">! i.e., return 0</span>
|
|
<span class="plain">@</span><span class="identifier">jl</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> ?</span><span class="identifier">XNegative</span><span class="plain">;</span>
|
|
<span class="comment">! So here x >= 0 and x ~= y</span>
|
|
<span class="plain">@</span><span class="identifier">jl</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> ?</span><span class="identifier">XPosYNeg</span><span class="plain">;</span>
|
|
|
|
<span class="comment">! Here x >=0, y >= 0, x ~= y</span>
|
|
|
|
<span class="plain">@</span><span class="identifier">jg</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> ?</span><span class="reserved">rtrue</span><span class="plain">; </span><span class="comment">! i.e., return 1</span>
|
|
<span class="plain">@</span><span class="identifier">ret</span><span class="plain"> </span><span class="constant">-1</span><span class="plain">;</span>
|
|
|
|
<span class="plain">.</span><span class="identifier">XPosYNeg</span><span class="plain">;</span>
|
|
<span class="comment">! Here x >= 0, y < 0, x ~= y</span>
|
|
<span class="plain">@</span><span class="identifier">ret</span><span class="plain"> </span><span class="constant">-1</span><span class="plain">;</span>
|
|
|
|
<span class="plain">.</span><span class="identifier">XNegative</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">jl</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> </span><span class="constant">0</span><span class="plain"> ?~</span><span class="reserved">rtrue</span><span class="plain">; </span><span class="comment">! if x < 0, y >= 0, return 1</span>
|
|
|
|
<span class="comment">! Here x < 0, y < 0, x ~= y</span>
|
|
<span class="plain">@</span><span class="identifier">jg</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> </span><span class="identifier">y</span><span class="plain"> ?</span><span class="reserved">rtrue</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">ret</span><span class="plain"> </span><span class="constant">-1</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
|
|
<span class="plain">[ </span><span class="identifier">RT__ChLDW</span><span class="plain"> </span><span class="identifier">base</span><span class="plain"> </span><span class="identifier">offset</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">loadw</span><span class="plain"> </span><span class="identifier">base</span><span class="plain"> </span><span class="identifier">offset</span><span class="plain"> </span><span class="constant">-</span><span class="plain">> </span><span class="identifier">sp</span><span class="plain">;</span>
|
|
<span class="plain">@</span><span class="identifier">ret</span><span class="plain"> </span><span class="identifier">sp</span><span class="plain">;</span>
|
|
<span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. End Z-only matter. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">#</span><span class="identifier">Endif</span><span class="plain">; </span><span class="comment">! TARGET_ZCODE</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="S-gt.html">Back to 'Glulx Template'</a></li><li><a href="S-prg.html">Continue with 'Paragraphing'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|