PageRenderTime 119ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/src/html/cellengine_8cpp-source.html

https://github.com/Plombo/micropolis
HTML | 5680 lines | 5679 code | 0 blank | 1 comment | 0 complexity | e4e0607d24ba5dd20d4b7aa0fe5661ea MD5 | raw file
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  3. <title>Micropolis: CellEngine/src/cellengine.cpp Source File</title>
  4. <link href="doxygen.css" rel="stylesheet" type="text/css">
  5. <link href="tabs.css" rel="stylesheet" type="text/css">
  6. </head><body>
  7. <!-- Generated by Doxygen 1.5.6 -->
  8. <div class="navigation" id="top">
  9. <div class="tabs">
  10. <ul>
  11. <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
  12. <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  13. <li><a href="namespaces.html"><span>Namespaces</span></a></li>
  14. <li><a href="annotated.html"><span>Classes</span></a></li>
  15. <li class="current"><a href="files.html"><span>Files</span></a></li>
  16. </ul>
  17. </div>
  18. <h1>CellEngine/src/cellengine.cpp</h1><a href="cellengine_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* cellengine.cpp</span>
  19. <a name="l00002"></a>00002 <span class="comment"> *</span>
  20. <a name="l00003"></a>00003 <span class="comment"> * Micropolis, Unix Version. This game was released for the Unix platform</span>
  21. <a name="l00004"></a>00004 <span class="comment"> * in or about 1990 and has been modified for inclusion in the One Laptop</span>
  22. <a name="l00005"></a>00005 <span class="comment"> * Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc. If</span>
  23. <a name="l00006"></a>00006 <span class="comment"> * you need assistance with this program, you may contact:</span>
  24. <a name="l00007"></a>00007 <span class="comment"> * http://wiki.laptop.org/go/Micropolis or email micropolis@laptop.org.</span>
  25. <a name="l00008"></a>00008 <span class="comment"> *</span>
  26. <a name="l00009"></a>00009 <span class="comment"> * This program is free software: you can redistribute it and/or modify</span>
  27. <a name="l00010"></a>00010 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
  28. <a name="l00011"></a>00011 <span class="comment"> * the Free Software Foundation, either version 3 of the License, or (at</span>
  29. <a name="l00012"></a>00012 <span class="comment"> * your option) any later version.</span>
  30. <a name="l00013"></a>00013 <span class="comment"> *</span>
  31. <a name="l00014"></a>00014 <span class="comment"> * This program is distributed in the hope that it will be useful, but</span>
  32. <a name="l00015"></a>00015 <span class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</span>
  33. <a name="l00016"></a>00016 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span>
  34. <a name="l00017"></a>00017 <span class="comment"> * General Public License for more details. You should have received a</span>
  35. <a name="l00018"></a>00018 <span class="comment"> * copy of the GNU General Public License along with this program. If</span>
  36. <a name="l00019"></a>00019 <span class="comment"> * not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
  37. <a name="l00020"></a>00020 <span class="comment"> *</span>
  38. <a name="l00021"></a>00021 <span class="comment"> * ADDITIONAL TERMS per GNU GPL Section 7</span>
  39. <a name="l00022"></a>00022 <span class="comment"> *</span>
  40. <a name="l00023"></a>00023 <span class="comment"> * No trademark or publicity rights are granted. This license does NOT</span>
  41. <a name="l00024"></a>00024 <span class="comment"> * give you any right, title or interest in the trademark SimCity or any</span>
  42. <a name="l00025"></a>00025 <span class="comment"> * other Electronic Arts trademark. You may not distribute any</span>
  43. <a name="l00026"></a>00026 <span class="comment"> * modification of this program using the trademark SimCity or claim any</span>
  44. <a name="l00027"></a>00027 <span class="comment"> * affliation or association with Electronic Arts Inc. or its employees.</span>
  45. <a name="l00028"></a>00028 <span class="comment"> *</span>
  46. <a name="l00029"></a>00029 <span class="comment"> * Any propagation or conveyance of this program must include this</span>
  47. <a name="l00030"></a>00030 <span class="comment"> * copyright notice and these terms.</span>
  48. <a name="l00031"></a>00031 <span class="comment"> *</span>
  49. <a name="l00032"></a>00032 <span class="comment"> * If you convey this program (or any modifications of it) and assume</span>
  50. <a name="l00033"></a>00033 <span class="comment"> * contractual liability for the program to recipients of it, you agree</span>
  51. <a name="l00034"></a>00034 <span class="comment"> * to indemnify Electronic Arts for any liability that those contractual</span>
  52. <a name="l00035"></a>00035 <span class="comment"> * assumptions impose on Electronic Arts.</span>
  53. <a name="l00036"></a>00036 <span class="comment"> *</span>
  54. <a name="l00037"></a>00037 <span class="comment"> * You may not misrepresent the origins of this program; modified</span>
  55. <a name="l00038"></a>00038 <span class="comment"> * versions of the program must be marked as such and not identified as</span>
  56. <a name="l00039"></a>00039 <span class="comment"> * the original program.</span>
  57. <a name="l00040"></a>00040 <span class="comment"> *</span>
  58. <a name="l00041"></a>00041 <span class="comment"> * This disclaimer supplements the one included in the General Public</span>
  59. <a name="l00042"></a>00042 <span class="comment"> * License. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS</span>
  60. <a name="l00043"></a>00043 <span class="comment"> * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY</span>
  61. <a name="l00044"></a>00044 <span class="comment"> * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF</span>
  62. <a name="l00045"></a>00045 <span class="comment"> * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU. ELECTRONIC ARTS</span>
  63. <a name="l00046"></a>00046 <span class="comment"> * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,</span>
  64. <a name="l00047"></a>00047 <span class="comment"> * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,</span>
  65. <a name="l00048"></a>00048 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY</span>
  66. <a name="l00049"></a>00049 <span class="comment"> * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,</span>
  67. <a name="l00050"></a>00050 <span class="comment"> * USAGE, OR TRADE PRACTICE. ELECTRONIC ARTS DOES NOT WARRANT AGAINST</span>
  68. <a name="l00051"></a>00051 <span class="comment"> * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL</span>
  69. <a name="l00052"></a>00052 <span class="comment"> * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE</span>
  70. <a name="l00053"></a>00053 <span class="comment"> * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE</span>
  71. <a name="l00054"></a>00054 <span class="comment"> * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE</span>
  72. <a name="l00055"></a>00055 <span class="comment"> * CORRECTED. NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR</span>
  73. <a name="l00056"></a>00056 <span class="comment"> * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME</span>
  74. <a name="l00057"></a>00057 <span class="comment"> * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED</span>
  75. <a name="l00058"></a>00058 <span class="comment"> * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A</span>
  76. <a name="l00059"></a>00059 <span class="comment"> * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY</span>
  77. <a name="l00060"></a>00060 <span class="comment"> * NOT APPLY TO YOU.</span>
  78. <a name="l00061"></a>00061 <span class="comment"> */</span>
  79. <a name="l00062"></a>00062
  80. <a name="l00063"></a>00063
  81. <a name="l00065"></a>00065
  82. <a name="l00071"></a>00071 <span class="preprocessor">#include "stdafx.h"</span>
  83. <a name="l00072"></a>00072
  84. <a name="l00073"></a>00073
  85. <a name="l00075"></a>00075
  86. <a name="l00076"></a>00076
  87. <a name="l00091"></a>00091
  88. <a name="l00092"></a>00092
  89. <a name="l00093"></a>00093
  90. <a name="l00094"></a>00094 <span class="keyword">extern</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>[];
  91. <a name="l00095"></a>00095 <span class="keyword">static</span> <span class="keywordtype">int</span> ruleCount = -1;
  92. <a name="l00096"></a>00096
  93. <a name="l00097"></a>00097
  94. <a name="l00099"></a>00099
  95. <a name="l00100"></a>00100
  96. <a name="l00101"></a>00101 <span class="preprocessor">#define RANDOMS_COUNT 256</span>
  97. <a name="l00102"></a>00102 <span class="preprocessor"></span>
  98. <a name="l00103"></a>00103 <span class="keyword">static</span> <span class="keywordtype">long</span> randomsPrimed = 0;
  99. <a name="l00104"></a>00104 <span class="keyword">static</span> <span class="keywordtype">long</span> randoms[RANDOMS_COUNT];
  100. <a name="l00105"></a>00105 <span class="keyword">static</span> <span class="keywordtype">long</span> randomRead = 0;
  101. <a name="l00106"></a>00106 <span class="keyword">static</span> <span class="keywordtype">long</span> randomWrite = 0;
  102. <a name="l00107"></a>00107
  103. <a name="l00108"></a>00108
  104. <a name="l00109"></a>00109 <span class="keywordtype">void</span> PrimeRandoms()
  105. <a name="l00110"></a>00110 {
  106. <a name="l00111"></a>00111 <span class="keywordflow">if</span> (randomsPrimed) {
  107. <a name="l00112"></a>00112 <span class="keywordflow">return</span>;
  108. <a name="l00113"></a>00113 } <span class="comment">// if</span>
  109. <a name="l00114"></a>00114
  110. <a name="l00115"></a>00115 randomsPrimed = 1;
  111. <a name="l00116"></a>00116
  112. <a name="l00117"></a>00117 <span class="keywordtype">long</span> i;
  113. <a name="l00118"></a>00118 <span class="keywordflow">for</span> (i = 0; i &lt; RANDOMS_COUNT; i++) {
  114. <a name="l00119"></a>00119 randoms[i] ^=
  115. <a name="l00120"></a>00120 <span class="preprocessor">#ifdef MACOS</span>
  116. <a name="l00121"></a>00121 <span class="preprocessor"></span> Random() ^
  117. <a name="l00122"></a>00122 (Random() &gt;&gt; 4) ^
  118. <a name="l00123"></a>00123 (Random() &lt;&lt; 4);
  119. <a name="l00124"></a>00124 <span class="preprocessor">#else</span>
  120. <a name="l00125"></a>00125 <span class="preprocessor"></span> rand() ^
  121. <a name="l00126"></a>00126 (rand() &gt;&gt; 4) ^
  122. <a name="l00127"></a>00127 (rand() &gt;&gt; 8) ^
  123. <a name="l00128"></a>00128 (rand() &lt;&lt; 4);
  124. <a name="l00129"></a>00129 <span class="preprocessor">#endif</span>
  125. <a name="l00130"></a>00130 <span class="preprocessor"></span> }
  126. <a name="l00131"></a>00131
  127. <a name="l00132"></a>00132 randomRead = 0;
  128. <a name="l00133"></a>00133 randomWrite = 0;
  129. <a name="l00134"></a>00134 }
  130. <a name="l00135"></a>00135
  131. <a name="l00136"></a>00136
  132. <a name="l00137"></a>00137 <span class="keywordtype">void</span> FeedRandom(
  133. <a name="l00138"></a>00138 <span class="keywordtype">long</span> food)
  134. <a name="l00139"></a>00139 {
  135. <a name="l00140"></a>00140 randomWrite--;
  136. <a name="l00141"></a>00141 <span class="keywordflow">if</span> (randomWrite &lt; 0) {
  137. <a name="l00142"></a>00142 randomWrite = RANDOMS_COUNT - 1;
  138. <a name="l00143"></a>00143 }
  139. <a name="l00144"></a>00144 randoms[randomWrite] ^= food;
  140. <a name="l00145"></a>00145 }
  141. <a name="l00146"></a>00146
  142. <a name="l00147"></a>00147
  143. <a name="l00148"></a>00148 <span class="keywordtype">long</span> Rand32()
  144. <a name="l00149"></a>00149 {
  145. <a name="l00150"></a>00150 PrimeRandoms();
  146. <a name="l00151"></a>00151
  147. <a name="l00152"></a>00152 randomRead++;
  148. <a name="l00153"></a>00153 <span class="keywordflow">if</span> (randomRead &gt;= RANDOMS_COUNT) {
  149. <a name="l00154"></a>00154 randomRead = 0;
  150. <a name="l00155"></a>00155 }
  151. <a name="l00156"></a>00156
  152. <a name="l00157"></a>00157 <span class="keywordtype">long</span> result = randoms[randomRead];
  153. <a name="l00158"></a>00158
  154. <a name="l00159"></a>00159 <span class="comment">// TODO: make a better hasher</span>
  155. <a name="l00160"></a>00160 <span class="preprocessor">#ifdef MACOS</span>
  156. <a name="l00161"></a>00161 <span class="preprocessor"></span> randoms[randomRead] ^= Random();
  157. <a name="l00162"></a>00162 <span class="preprocessor">#else</span>
  158. <a name="l00163"></a>00163 <span class="preprocessor"></span> <span class="keywordtype">int</span> r = rand() ^ (rand() &lt;&lt; 8);
  159. <a name="l00164"></a>00164 randoms[randomRead] ^= r;
  160. <a name="l00165"></a>00165 <span class="preprocessor">#endif</span>
  161. <a name="l00166"></a>00166 <span class="preprocessor"></span>
  162. <a name="l00167"></a>00167 <span class="keywordflow">return</span> result;
  163. <a name="l00168"></a>00168 }
  164. <a name="l00169"></a>00169
  165. <a name="l00170"></a>00170
  166. <a name="l00171"></a>00171 <span class="keywordtype">long</span> Rand16()
  167. <a name="l00172"></a>00172 {
  168. <a name="l00173"></a>00173 <span class="keywordflow">return</span> Rand32() &amp; 0xffff;
  169. <a name="l00174"></a>00174 }
  170. <a name="l00175"></a>00175
  171. <a name="l00176"></a>00176
  172. <a name="l00177"></a>00177 <span class="keywordtype">long</span> Rand8()
  173. <a name="l00178"></a>00178 {
  174. <a name="l00179"></a>00179 <span class="keywordflow">return</span> Rand32() &amp; 0xff;
  175. <a name="l00180"></a>00180 }
  176. <a name="l00181"></a>00181
  177. <a name="l00182"></a>00182
  178. <a name="l00184"></a>00184
  179. <a name="l00185"></a>00185
  180. <a name="l00186"></a>00186 <span class="preprocessor">#ifdef DOSOUND</span>
  181. <a name="l00187"></a>00187 <span class="preprocessor"></span>
  182. <a name="l00188"></a>00188 <span class="keyword">class </span>SoundEvent {
  183. <a name="l00189"></a>00189 <span class="keywordtype">long</span> x;
  184. <a name="l00190"></a>00190 <span class="keywordtype">long</span> y;
  185. <a name="l00191"></a>00191 <span class="keywordtype">long</span> w;
  186. <a name="l00192"></a>00192 <span class="keywordtype">long</span> h;
  187. <a name="l00193"></a>00193 <span class="keywordtype">long</span> s;
  188. <a name="l00194"></a>00194 <span class="keyword">static</span> std::vector&lt;SoundEvent&gt; queue;
  189. <a name="l00195"></a>00195
  190. <a name="l00196"></a>00196 <span class="keyword">public</span>:
  191. <a name="l00197"></a>00197
  192. <a name="l00198"></a>00198 SoundEvent(
  193. <a name="l00199"></a>00199 <span class="keywordtype">long</span> xx,
  194. <a name="l00200"></a>00200 <span class="keywordtype">long</span> yy,
  195. <a name="l00201"></a>00201 <span class="keywordtype">long</span> ww,
  196. <a name="l00202"></a>00202 <span class="keywordtype">long</span> hh,
  197. <a name="l00203"></a>00203 <span class="keywordtype">long</span> ss) :
  198. <a name="l00204"></a>00204 x(xx),
  199. <a name="l00205"></a>00205 y(yy),
  200. <a name="l00206"></a>00206 w(ww),
  201. <a name="l00207"></a>00207 h(hh),
  202. <a name="l00208"></a>00208 s(ss)
  203. <a name="l00209"></a>00209 {
  204. <a name="l00210"></a>00210 }
  205. <a name="l00211"></a>00211
  206. <a name="l00212"></a>00212 SoundEvent();
  207. <a name="l00213"></a>00213
  208. <a name="l00214"></a>00214 ~SoundEvent()
  209. <a name="l00215"></a>00215 {
  210. <a name="l00216"></a>00216 }
  211. <a name="l00217"></a>00217
  212. <a name="l00218"></a>00218 <span class="keyword">static</span> <span class="keywordtype">void</span> Queue(
  213. <a name="l00219"></a>00219 <span class="keywordtype">long</span> xx,
  214. <a name="l00220"></a>00220 <span class="keywordtype">long</span> yy,
  215. <a name="l00221"></a>00221 <span class="keywordtype">long</span> ww,
  216. <a name="l00222"></a>00222 <span class="keywordtype">long</span> hh,
  217. <a name="l00223"></a>00223 <span class="keywordtype">long</span> ss)
  218. <a name="l00224"></a>00224 {
  219. <a name="l00225"></a>00225 queue.push_back(
  220. <a name="l00226"></a>00226 SoundEvent(
  221. <a name="l00227"></a>00227 xx,
  222. <a name="l00228"></a>00228 yy,
  223. <a name="l00229"></a>00229 ww,
  224. <a name="l00230"></a>00230 hh,
  225. <a name="l00231"></a>00231 ss));
  226. <a name="l00232"></a>00232 }
  227. <a name="l00233"></a>00233
  228. <a name="l00234"></a>00234 <span class="keyword">static</span> <span class="keywordtype">void</span> ClearQueue()
  229. <a name="l00235"></a>00235 {
  230. <a name="l00236"></a>00236 queue.erase(
  231. <a name="l00237"></a>00237 queue.begin(),
  232. <a name="l00238"></a>00238 queue.end());
  233. <a name="l00239"></a>00239 }
  234. <a name="l00240"></a>00240
  235. <a name="l00241"></a>00241 <span class="keywordtype">void</span> Play(<span class="keywordtype">float</span> vol)
  236. <a name="l00242"></a>00242 {
  237. <a name="l00243"></a>00243 <span class="keywordtype">float</span> speed =
  238. <a name="l00244"></a>00244 (float)0.2 +
  239. <a name="l00245"></a>00245 (((<span class="keywordtype">float</span>)2.0 *
  240. <a name="l00246"></a>00246 (<span class="keywordtype">float</span>)(h - y) /
  241. <a name="l00247"></a>00247 (<span class="keywordtype">float</span>)h));
  242. <a name="l00248"></a>00248 <span class="keywordtype">float</span> pan = ((float)2.0 *
  243. <a name="l00249"></a>00249 (<span class="keywordtype">float</span>)x /
  244. <a name="l00250"></a>00250 (float)w) - (float)1.0;
  245. <a name="l00251"></a>00251 <span class="preprocessor">#ifdef TODO</span>
  246. <a name="l00252"></a>00252 <span class="preprocessor"></span> PlayWave(
  247. <a name="l00253"></a>00253 s, <span class="comment">// wave#</span>
  248. <a name="l00254"></a>00254 0, <span class="comment">// looping</span>
  249. <a name="l00255"></a>00255 speed,
  250. <a name="l00256"></a>00256 vol,
  251. <a name="l00257"></a>00257 pan);
  252. <a name="l00258"></a>00258 <span class="preprocessor">#endif</span>
  253. <a name="l00259"></a>00259 <span class="preprocessor"></span> }
  254. <a name="l00260"></a>00260
  255. <a name="l00261"></a>00261 <span class="keyword">static</span> <span class="keywordtype">void</span> PlayReverse(<span class="keywordtype">float</span> vol)
  256. <a name="l00262"></a>00262 {
  257. <a name="l00263"></a>00263 <span class="keywordtype">int</span> count = queue.size();
  258. <a name="l00264"></a>00264 <span class="keywordtype">int</span> i = count - 1;
  259. <a name="l00265"></a>00265 <span class="keywordflow">while</span> (i &gt;= 0) {
  260. <a name="l00266"></a>00266 <span class="keywordtype">long</span> r = Rand8();
  261. <a name="l00267"></a>00267 <span class="keywordflow">if</span> ((count &lt; 10) ||
  262. <a name="l00268"></a>00268 ((r = Rand8()) &lt; 50)) {
  263. <a name="l00269"></a>00269 <span class="keywordflow">if</span> ((count &lt; 50) ||
  264. <a name="l00270"></a>00270 (r &lt; 10)) {
  265. <a name="l00271"></a>00271 queue[i].Play(vol);
  266. <a name="l00272"></a>00272 } <span class="comment">// if</span>
  267. <a name="l00273"></a>00273 } <span class="comment">// if</span>
  268. <a name="l00274"></a>00274
  269. <a name="l00275"></a>00275 i--;
  270. <a name="l00276"></a>00276 } <span class="comment">// while</span>
  271. <a name="l00277"></a>00277
  272. <a name="l00278"></a>00278 }
  273. <a name="l00279"></a>00279
  274. <a name="l00280"></a>00280 <span class="keyword">static</span> <span class="keywordtype">void</span> PlayQueue()
  275. <a name="l00281"></a>00281 {
  276. <a name="l00282"></a>00282 <span class="keywordflow">if</span> (queue.size() &gt; 0) {
  277. <a name="l00283"></a>00283 <span class="keywordtype">float</span> vol = (float)0.75 +
  278. <a name="l00284"></a>00284 ((<span class="keywordtype">float</span>)0.25 *
  279. <a name="l00285"></a>00285 (float)sqrt((<span class="keywordtype">float</span>)1.0 / queue.size()));
  280. <a name="l00286"></a>00286 PlayReverse(vol);
  281. <a name="l00287"></a>00287 ClearQueue();
  282. <a name="l00288"></a>00288 }
  283. <a name="l00289"></a>00289 }
  284. <a name="l00290"></a>00290 };
  285. <a name="l00291"></a>00291
  286. <a name="l00292"></a>00292 std::vector&lt;SoundEvent&gt; SoundEvent::queue;
  287. <a name="l00293"></a>00293
  288. <a name="l00294"></a>00294 <span class="preprocessor">#endif</span>
  289. <a name="l00295"></a>00295 <span class="preprocessor"></span>
  290. <a name="l00296"></a>00296
  291. <a name="l00298"></a>00298
  292. <a name="l00299"></a>00299
  293. <a name="l00300"></a>00300 CellEngine::CellEngine()
  294. <a name="l00301"></a>00301 {
  295. <a name="l00302"></a>00302 Init();
  296. <a name="l00303"></a>00303 }
  297. <a name="l00304"></a>00304
  298. <a name="l00305"></a>00305
  299. <a name="l00306"></a>00306 <span class="keywordtype">void</span> CellEngine::Init()
  300. <a name="l00307"></a>00307 {
  301. <a name="l00308"></a>00308 name = <span class="stringliteral">""</span>;
  302. <a name="l00309"></a>00309 screenMem = NULL;
  303. <a name="l00310"></a>00310 screenWidth = 0;
  304. <a name="l00311"></a>00311 screenHeight = 0;
  305. <a name="l00312"></a>00312 screenRowBytes = 0;
  306. <a name="l00313"></a>00313 backMem = NULL;
  307. <a name="l00314"></a>00314 backSize = 0;
  308. <a name="l00315"></a>00315 backRowBytes = 0;
  309. <a name="l00316"></a>00316 backWidth = 0;
  310. <a name="l00317"></a>00317 backHeight = 0;
  311. <a name="l00318"></a>00318 backBorder = 2;
  312. <a name="l00319"></a>00319 frontMem = NULL;
  313. <a name="l00320"></a>00320 maskMem = NULL;
  314. <a name="l00321"></a>00321 maskRowBytes = 0;
  315. <a name="l00322"></a>00322 maskWidth = 0;
  316. <a name="l00323"></a>00323 maskHeight = 0;
  317. <a name="l00324"></a>00324 masked = 0;
  318. <a name="l00325"></a>00325 neighborhood = 33; <span class="comment">// garble</span>
  319. <a name="l00326"></a>00326 rule = NULL;
  320. <a name="l00327"></a>00327 ruleStatic = 0;
  321. <a name="l00328"></a>00328 ruleSize = 0;
  322. <a name="l00329"></a>00329 ruleName = NULL;
  323. <a name="l00330"></a>00330 x = 0;
  324. <a name="l00331"></a>00331 y = 0;
  325. <a name="l00332"></a>00332 dx = 0;
  326. <a name="l00333"></a>00333 dy = 0;
  327. <a name="l00334"></a>00334 width = 0;
  328. <a name="l00335"></a>00335 height = 0;
  329. <a name="l00336"></a>00336 idealWidth = 0;
  330. <a name="l00337"></a>00337 idealHeight = 0;
  331. <a name="l00338"></a>00338 phase = 0;
  332. <a name="l00339"></a>00339 ticks = 0;
  333. <a name="l00340"></a>00340 wrap = 5;
  334. <a name="l00341"></a>00341 steps = 1;
  335. <a name="l00342"></a>00342 frob = -1;
  336. <a name="l00343"></a>00343 rumble = 0;
  337. <a name="l00344"></a>00344 rumblemax = 0;
  338. <a name="l00345"></a>00345 hubba = 0;
  339. <a name="l00346"></a>00346 inflation = 0;
  340. <a name="l00347"></a>00347 high = 255;
  341. <a name="l00348"></a>00348 low = 0;
  342. <a name="l00349"></a>00349 maskClip = 0;
  343. <a name="l00350"></a>00350 moveImage = 0;
  344. <a name="l00351"></a>00351 numbera = 0;
  345. <a name="l00352"></a>00352 numberb = 0;
  346. <a name="l00353"></a>00353 numberc = 0;
  347. <a name="l00354"></a>00354 anglea = 0;
  348. <a name="l00355"></a>00355 angleb = 0;
  349. <a name="l00356"></a>00356 anglec = 0;
  350. <a name="l00357"></a>00357 pointax = 0;
  351. <a name="l00358"></a>00358 pointay = 0;
  352. <a name="l00359"></a>00359 pointbx = 0;
  353. <a name="l00360"></a>00360 pointby = 0;
  354. <a name="l00361"></a>00361 pointcx = 0;
  355. <a name="l00362"></a>00362 pointcy = 0;
  356. <a name="l00363"></a>00363 clipRects = 0;
  357. <a name="l00364"></a>00364 rectList = NULL;
  358. <a name="l00365"></a>00365 skips = 0;
  359. <a name="l00366"></a>00366 skip = 0;
  360. <a name="l00367"></a>00367 total = 0;
  361. <a name="l00368"></a>00368 tracking = 0;
  362. <a name="l00369"></a>00369 action = 8 + 2;
  363. <a name="l00370"></a>00370 downx = 0;
  364. <a name="l00371"></a>00371 downy = 0;
  365. <a name="l00372"></a>00372 grabx = 0;
  366. <a name="l00373"></a>00373 graby = 0;
  367. <a name="l00374"></a>00374 lastx = 0;
  368. <a name="l00375"></a>00375 lasty = 0;
  369. <a name="l00376"></a>00376 saveskips = 0;
  370. <a name="l00377"></a>00377 still = 0;
  371. <a name="l00378"></a>00378 gravx = 0;
  372. <a name="l00379"></a>00379 gravy = 0;
  373. <a name="l00380"></a>00380 grabbable = 1;
  374. <a name="l00381"></a>00381 data = NULL;
  375. <a name="l00382"></a>00382
  376. <a name="l00383"></a>00383 SetSize(16, 16);
  377. <a name="l00384"></a>00384 }
  378. <a name="l00385"></a>00385
  379. <a name="l00386"></a>00386
  380. <a name="l00387"></a>00387 CellEngine::~CellEngine()
  381. <a name="l00388"></a>00388 {
  382. <a name="l00389"></a>00389 <span class="keywordflow">if</span> (backMem != NULL) {
  383. <a name="l00390"></a>00390 <span class="keyword">delete</span> [] backMem;
  384. <a name="l00391"></a>00391 backMem = NULL;
  385. <a name="l00392"></a>00392 }
  386. <a name="l00393"></a>00393
  387. <a name="l00394"></a>00394 <span class="preprocessor">#if 0</span>
  388. <a name="l00395"></a>00395 <span class="preprocessor"></span> <span class="keywordflow">if</span> (maskMem != NULL) {
  389. <a name="l00396"></a>00396 <span class="keyword">delete</span> [] maskMem;
  390. <a name="l00397"></a>00397 maskMem = NULL;
  391. <a name="l00398"></a>00398 }
  392. <a name="l00399"></a>00399 <span class="preprocessor">#endif</span>
  393. <a name="l00400"></a>00400 <span class="preprocessor"></span>
  394. <a name="l00401"></a>00401 <span class="keywordflow">if</span> ((rule != NULL) &amp;&amp;
  395. <a name="l00402"></a>00402 (!ruleStatic)) {
  396. <a name="l00403"></a>00403 <span class="keyword">delete</span> [] rule;
  397. <a name="l00404"></a>00404 rule = NULL;
  398. <a name="l00405"></a>00405 }
  399. <a name="l00406"></a>00406
  400. <a name="l00407"></a>00407 <span class="keywordflow">if</span> (ruleName != NULL) {
  401. <a name="l00408"></a>00408 <span class="keyword">delete</span> [] ruleName;
  402. <a name="l00409"></a>00409 ruleName = NULL;
  403. <a name="l00410"></a>00410 }
  404. <a name="l00411"></a>00411
  405. <a name="l00412"></a>00412 <span class="keywordflow">if</span> (rectList != NULL) {
  406. <a name="l00413"></a>00413 <span class="keyword">delete</span> [] rectList;
  407. <a name="l00414"></a>00414 rectList = NULL;
  408. <a name="l00415"></a>00415 }
  409. <a name="l00416"></a>00416
  410. <a name="l00417"></a>00417 <span class="keywordflow">if</span> (screenMem != NULL) {
  411. <a name="l00418"></a>00418 <span class="keyword">delete</span> [] screenMem;
  412. <a name="l00419"></a>00419 screenMem = NULL;
  413. <a name="l00420"></a>00420 }
  414. <a name="l00421"></a>00421
  415. <a name="l00422"></a>00422 }
  416. <a name="l00423"></a>00423
  417. <a name="l00424"></a>00424
  418. <a name="l00425"></a>00425 <span class="keywordtype">void</span> CellEngine::InitScreen(
  419. <a name="l00426"></a>00426 <span class="keywordtype">long</span> ww,
  420. <a name="l00427"></a>00427 <span class="keywordtype">long</span> hh)
  421. <a name="l00428"></a>00428 {
  422. <a name="l00429"></a>00429 <span class="keywordflow">if</span> (screenMem != NULL) {
  423. <a name="l00430"></a>00430 <span class="keyword">delete</span> [] screenMem;
  424. <a name="l00431"></a>00431 }
  425. <a name="l00432"></a>00432
  426. <a name="l00433"></a>00433 screenWidth = ww;
  427. <a name="l00434"></a>00434 screenHeight = hh;
  428. <a name="l00435"></a>00435 screenRowBytes = (ww + 3) &amp; ~3;
  429. <a name="l00436"></a>00436 screenMem = <span class="keyword">new</span> Byte[screenRowBytes * screenHeight];
  430. <a name="l00437"></a>00437
  431. <a name="l00438"></a>00438 SetPos(0, 0);
  432. <a name="l00439"></a>00439 }
  433. <a name="l00440"></a>00440
  434. <a name="l00441"></a>00441
  435. <a name="l00442"></a>00442 <span class="keywordtype">void</span> CellEngine::SetRect(
  436. <a name="l00443"></a>00443 <span class="keywordtype">long</span> xx,
  437. <a name="l00444"></a>00444 <span class="keywordtype">long</span> yy,
  438. <a name="l00445"></a>00445 <span class="keywordtype">long</span> ww,
  439. <a name="l00446"></a>00446 <span class="keywordtype">long</span> hh)
  440. <a name="l00447"></a>00447 {
  441. <a name="l00448"></a>00448 <span class="keywordtype">long</span> w2;
  442. <a name="l00449"></a>00449 <span class="keywordtype">long</span> h2;
  443. <a name="l00450"></a>00450 <span class="keywordtype">long</span> rb;
  444. <a name="l00451"></a>00451 <span class="keywordtype">long</span> size;
  445. <a name="l00452"></a>00452
  446. <a name="l00453"></a>00453 idealWidth = ww;
  447. <a name="l00454"></a>00454 idealHeight = hh;
  448. <a name="l00455"></a>00455 ww = (ww + 3) &amp; ~3;
  449. <a name="l00456"></a>00456
  450. <a name="l00457"></a>00457 w2 = backBorder + ww + backBorder;
  451. <a name="l00458"></a>00458 h2 = backBorder + hh + backBorder;
  452. <a name="l00459"></a>00459 rb = (w2 + 3) &amp; (~3);
  453. <a name="l00460"></a>00460 size = (rb * h2);
  454. <a name="l00461"></a>00461
  455. <a name="l00462"></a>00462 <span class="keywordflow">if</span> ((backMem == NULL) ||
  456. <a name="l00463"></a>00463 (backSize &lt; size)) {
  457. <a name="l00464"></a>00464
  458. <a name="l00465"></a>00465 <span class="keywordflow">if</span> (backMem != NULL) {
  459. <a name="l00466"></a>00466 <span class="keyword">delete</span> [] backMem;
  460. <a name="l00467"></a>00467 }
  461. <a name="l00468"></a>00468
  462. <a name="l00469"></a>00469 <span class="comment">// inflate the size a bit if this isn't the first allocation</span>
  463. <a name="l00470"></a>00470 <span class="keywordflow">if</span> (backSize != 0) {
  464. <a name="l00471"></a>00471 size = (12 * size) / 10;
  465. <a name="l00472"></a>00472 }
  466. <a name="l00473"></a>00473
  467. <a name="l00474"></a>00474 backSize = size;
  468. <a name="l00475"></a>00475 backMem = <span class="keyword">new</span> Byte[size];
  469. <a name="l00476"></a>00476 }
  470. <a name="l00477"></a>00477
  471. <a name="l00478"></a>00478 width = ww;
  472. <a name="l00479"></a>00479 height = hh;
  473. <a name="l00480"></a>00480 backWidth = w2;
  474. <a name="l00481"></a>00481 backHeight = h2;
  475. <a name="l00482"></a>00482 backRowBytes = rb;
  476. <a name="l00483"></a>00483 SetPos(xx, yy);
  477. <a name="l00484"></a>00484 }
  478. <a name="l00485"></a>00485
  479. <a name="l00486"></a>00486
  480. <a name="l00487"></a>00487 <span class="keywordtype">void</span> CellEngine::SetPos(
  481. <a name="l00488"></a>00488 <span class="keywordtype">long</span> xx,
  482. <a name="l00489"></a>00489 <span class="keywordtype">long</span> yy)
  483. <a name="l00490"></a>00490 {
  484. <a name="l00491"></a>00491 x = xx;
  485. <a name="l00492"></a>00492 y = yy;
  486. <a name="l00493"></a>00493 frontMem =
  487. <a name="l00494"></a>00494 screenMem +
  488. <a name="l00495"></a>00495 xx +
  489. <a name="l00496"></a>00496 (screenRowBytes * yy);
  490. <a name="l00497"></a>00497 }
  491. <a name="l00498"></a>00498
  492. <a name="l00499"></a>00499
  493. <a name="l00500"></a>00500 <span class="keywordtype">void</span> CellEngine::SetSize(
  494. <a name="l00501"></a>00501 <span class="keywordtype">long</span> ww,
  495. <a name="l00502"></a>00502 <span class="keywordtype">long</span> hh)
  496. <a name="l00503"></a>00503 {
  497. <a name="l00504"></a>00504 SetRect(x, y, ww, hh);
  498. <a name="l00505"></a>00505 }
  499. <a name="l00506"></a>00506
  500. <a name="l00507"></a>00507
  501. <a name="l00508"></a>00508 <span class="keywordtype">void</span> CellEngine::ForceOnScreen()
  502. <a name="l00509"></a>00509 {
  503. <a name="l00510"></a>00510 <span class="keywordtype">int</span> hangout;
  504. <a name="l00511"></a>00511 <span class="keywordtype">int</span> xx = x;
  505. <a name="l00512"></a>00512 <span class="keywordtype">int</span> yy = y;
  506. <a name="l00513"></a>00513 <span class="keywordtype">int</span> ww = idealWidth;
  507. <a name="l00514"></a>00514 <span class="keywordtype">int</span> hh = idealHeight;
  508. <a name="l00515"></a>00515 <span class="keywordtype">int</span> ww2 = width;
  509. <a name="l00516"></a>00516 <span class="keywordtype">int</span> hh2 = height;
  510. <a name="l00517"></a>00517
  511. <a name="l00518"></a>00518 hangout = (xx + ww2) - screenWidth;
  512. <a name="l00519"></a>00519 <span class="keywordflow">if</span> (hangout &gt; 0) {
  513. <a name="l00520"></a>00520 xx -= hangout;
  514. <a name="l00521"></a>00521 }
  515. <a name="l00522"></a>00522 hangout = (yy + hh2) - screenHeight;
  516. <a name="l00523"></a>00523 <span class="keywordflow">if</span> (hangout &gt; 0) {
  517. <a name="l00524"></a>00524 yy -= hangout;
  518. <a name="l00525"></a>00525 }
  519. <a name="l00526"></a>00526 hangout = -xx;
  520. <a name="l00527"></a>00527 <span class="keywordflow">if</span> (hangout &gt; 0) {
  521. <a name="l00528"></a>00528 xx += hangout;
  522. <a name="l00529"></a>00529 }
  523. <a name="l00530"></a>00530 hangout = -yy;
  524. <a name="l00531"></a>00531 <span class="keywordflow">if</span> (hangout &gt; 0) {
  525. <a name="l00532"></a>00532 yy -= hangout;
  526. <a name="l00533"></a>00533 }
  527. <a name="l00534"></a>00534 <span class="keywordflow">if</span> ((xx + ww2) &gt; screenWidth) {
  528. <a name="l00535"></a>00535 ww = screenWidth - xx;
  529. <a name="l00536"></a>00536 }
  530. <a name="l00537"></a>00537 <span class="keywordflow">if</span> ((yy + hh2) &gt; screenHeight) {
  531. <a name="l00538"></a>00538 hh = screenHeight - yy;
  532. <a name="l00539"></a>00539 }
  533. <a name="l00540"></a>00540
  534. <a name="l00541"></a>00541 SetRect(xx, yy, ww, hh);
  535. <a name="l00542"></a>00542 }
  536. <a name="l00543"></a>00543
  537. <a name="l00544"></a>00544
  538. <a name="l00545"></a>00545 <span class="keywordtype">long</span> CellEngine::OnScreen()
  539. <a name="l00546"></a>00546 {
  540. <a name="l00547"></a>00547 <span class="keywordflow">return</span> ((screenMem != NULL) &amp;&amp;
  541. <a name="l00548"></a>00548 (x &gt;= 0) &amp;&amp;
  542. <a name="l00549"></a>00549 (y &gt;= 0) &amp;&amp;
  543. <a name="l00550"></a>00550 ((x + width) &lt;= screenWidth) &amp;&amp;
  544. <a name="l00551"></a>00551 ((y + height) &lt;= screenHeight));
  545. <a name="l00552"></a>00552 }
  546. <a name="l00553"></a>00553
  547. <a name="l00554"></a>00554
  548. <a name="l00555"></a>00555 <span class="keywordtype">void</span> CellEngine::Garble()
  549. <a name="l00556"></a>00556 {
  550. <a name="l00557"></a>00557
  551. <a name="l00558"></a>00558 <span class="keywordflow">if</span> (!OnScreen()) {
  552. <a name="l00559"></a>00559 <span class="keywordflow">return</span>;
  553. <a name="l00560"></a>00560 }
  554. <a name="l00561"></a>00561
  555. <a name="l00562"></a>00562 <span class="keywordtype">long</span> xx, yy;
  556. <a name="l00563"></a>00563 Byte *image = frontMem;
  557. <a name="l00564"></a>00564
  558. <a name="l00565"></a>00565 <span class="keywordflow">for</span> (yy = 0;
  559. <a name="l00566"></a>00566 yy &lt; height;
  560. <a name="l00567"></a>00567 yy++, image += screenRowBytes) {
  561. <a name="l00568"></a>00568 <span class="keywordflow">for</span> (xx = 0;
  562. <a name="l00569"></a>00569 xx &lt; width;
  563. <a name="l00570"></a>00570 xx++) {
  564. <a name="l00571"></a>00571 image[xx] ^= (char)(Rand16() &gt;&gt; 4);
  565. <a name="l00572"></a>00572 }
  566. <a name="l00573"></a>00573 }
  567. <a name="l00574"></a>00574 }
  568. <a name="l00575"></a>00575
  569. <a name="l00576"></a>00576
  570. <a name="l00577"></a>00577 <span class="keywordtype">void</span> CellEngine::GarbleRect(
  571. <a name="l00578"></a>00578 <span class="keywordtype">long</span> xx,
  572. <a name="l00579"></a>00579 <span class="keywordtype">long</span> yy,
  573. <a name="l00580"></a>00580 <span class="keywordtype">long</span> ww,
  574. <a name="l00581"></a>00581 <span class="keywordtype">long</span> hh)
  575. <a name="l00582"></a>00582 {
  576. <a name="l00583"></a>00583 Byte *image;
  577. <a name="l00584"></a>00584 <span class="keywordtype">long</span> x0, y0, x1, y1;
  578. <a name="l00585"></a>00585
  579. <a name="l00586"></a>00586 <span class="keywordflow">if</span> (!OnScreen()) {
  580. <a name="l00587"></a>00587 <span class="keywordflow">return</span>;
  581. <a name="l00588"></a>00588 }
  582. <a name="l00589"></a>00589
  583. <a name="l00590"></a>00590 <span class="keywordflow">if</span> (xx &lt; 0) x0 = 0; <span class="keywordflow">else</span> x0 = xx;
  584. <a name="l00591"></a>00591 <span class="keywordflow">if</span> (yy &lt; 0) y0 = 0; <span class="keywordflow">else</span> y0 = yy;
  585. <a name="l00592"></a>00592 <span class="keywordflow">if</span> (xx + ww &gt; width) x1 = width; <span class="keywordflow">else</span> x1 = xx + ww;
  586. <a name="l00593"></a>00593 <span class="keywordflow">if</span> (yy + hh &gt; height) y1 = height; <span class="keywordflow">else</span> y1 = yy + ww;
  587. <a name="l00594"></a>00594
  588. <a name="l00595"></a>00595 <span class="keywordflow">if</span> ((x0 &lt; x1) &amp;&amp; (y0 &lt; y1)) {
  589. <a name="l00596"></a>00596 image = frontMem;
  590. <a name="l00597"></a>00597
  591. <a name="l00598"></a>00598 <span class="keywordflow">for</span> (yy = y0;
  592. <a name="l00599"></a>00599 yy &lt; y1;
  593. <a name="l00600"></a>00600 yy++, image += screenRowBytes) {
  594. <a name="l00601"></a>00601 <span class="keywordflow">for</span> (xx = x0;
  595. <a name="l00602"></a>00602 xx &lt; x1;
  596. <a name="l00603"></a>00603 xx++) {
  597. <a name="l00604"></a>00604 image[xx] ^= (char)(Rand16() &gt;&gt; 4);
  598. <a name="l00605"></a>00605 }
  599. <a name="l00606"></a>00606 }
  600. <a name="l00607"></a>00607 }
  601. <a name="l00608"></a>00608 }
  602. <a name="l00609"></a>00609
  603. <a name="l00610"></a>00610
  604. <a name="l00611"></a>00611 <span class="keywordtype">void</span> CellEngine::Fill(
  605. <a name="l00612"></a>00612 Byte c)
  606. <a name="l00613"></a>00613 {
  607. <a name="l00614"></a>00614 <span class="keywordflow">if</span> (!OnScreen()) {
  608. <a name="l00615"></a>00615 <span class="keywordflow">return</span>;
  609. <a name="l00616"></a>00616 }
  610. <a name="l00617"></a>00617
  611. <a name="l00618"></a>00618 Byte *image = frontMem;
  612. <a name="l00619"></a>00619
  613. <a name="l00620"></a>00620 <span class="keywordtype">long</span> yy;
  614. <a name="l00621"></a>00621 <span class="keywordflow">for</span> (yy = 0;
  615. <a name="l00622"></a>00622 yy &lt; height;
  616. <a name="l00623"></a>00623 yy++, image += screenRowBytes) {
  617. <a name="l00624"></a>00624 <span class="keywordtype">long</span> xx;
  618. <a name="l00625"></a>00625 <span class="keywordflow">for</span> (xx = 0;
  619. <a name="l00626"></a>00626 xx &lt; width;
  620. <a name="l00627"></a>00627 xx++) {
  621. <a name="l00628"></a>00628 image[xx] = c;
  622. <a name="l00629"></a>00629 }
  623. <a name="l00630"></a>00630 }
  624. <a name="l00631"></a>00631 }
  625. <a name="l00632"></a>00632
  626. <a name="l00633"></a>00633
  627. <a name="l00634"></a>00634 <span class="keywordtype">void</span> CellEngine::FillRect(
  628. <a name="l00635"></a>00635 Byte c,
  629. <a name="l00636"></a>00636 <span class="keywordtype">long</span> xx,
  630. <a name="l00637"></a>00637 <span class="keywordtype">long</span> yy,
  631. <a name="l00638"></a>00638 <span class="keywordtype">long</span> ww,
  632. <a name="l00639"></a>00639 <span class="keywordtype">long</span> hh)
  633. <a name="l00640"></a>00640 {
  634. <a name="l00641"></a>00641 Byte *image;
  635. <a name="l00642"></a>00642 <span class="keywordtype">long</span> x0, y0, x1, y1;
  636. <a name="l00643"></a>00643
  637. <a name="l00644"></a>00644 <span class="keywordflow">if</span> (!OnScreen()) {
  638. <a name="l00645"></a>00645 <span class="keywordflow">return</span>;
  639. <a name="l00646"></a>00646 }
  640. <a name="l00647"></a>00647
  641. <a name="l00648"></a>00648 <span class="keywordflow">if</span> (xx &lt; 0) x0 = 0; <span class="keywordflow">else</span> x0 = xx;
  642. <a name="l00649"></a>00649 <span class="keywordflow">if</span> (yy &lt; 0) y0 = 0; <span class="keywordflow">else</span> y0 = yy;
  643. <a name="l00650"></a>00650 <span class="keywordflow">if</span> (xx + ww &gt; width) x1 = width; <span class="keywordflow">else</span> x1 = xx + ww;
  644. <a name="l00651"></a>00651 <span class="keywordflow">if</span> (yy + hh &gt; height) y1 = height; <span class="keywordflow">else</span> y1 = yy + ww;
  645. <a name="l00652"></a>00652
  646. <a name="l00653"></a>00653 <span class="keywordflow">if</span> ((x0 &lt; x1) &amp;&amp; (y0 &lt; y1)) {
  647. <a name="l00654"></a>00654 image = frontMem;
  648. <a name="l00655"></a>00655
  649. <a name="l00656"></a>00656 <span class="keywordflow">for</span> (yy = y0;
  650. <a name="l00657"></a>00657 yy &lt; y1;
  651. <a name="l00658"></a>00658 yy++, image += screenRowBytes) {
  652. <a name="l00659"></a>00659 <span class="keywordflow">for</span> (xx = x0;
  653. <a name="l00660"></a>00660 xx &lt; x1;
  654. <a name="l00661"></a>00661 xx++) {
  655. <a name="l00662"></a>00662 image[xx] = c;
  656. <a name="l00663"></a>00663 }
  657. <a name="l00664"></a>00664 }
  658. <a name="l00665"></a>00665 }
  659. <a name="l00666"></a>00666 }
  660. <a name="l00667"></a>00667
  661. <a name="l00668"></a>00668
  662. <a name="l00669"></a>00669 <span class="keywordtype">void</span> CellEngine::ResetMask()
  663. <a name="l00670"></a>00670 {
  664. <a name="l00671"></a>00671 <span class="keywordflow">if</span> (masked) {
  665. <a name="l00672"></a>00672 <span class="keywordflow">if</span> (maskMem != NULL) {
  666. <a name="l00673"></a>00673 maskMem = NULL;
  667. <a name="l00674"></a>00674 } <span class="comment">// if</span>
  668. <a name="l00675"></a>00675 maskWidth = 0;
  669. <a name="l00676"></a>00676 maskHeight = 0;
  670. <a name="l00677"></a>00677 maskRowBytes = 0;
  671. <a name="l00678"></a>00678 } <span class="comment">// if</span>
  672. <a name="l00679"></a>00679 masked = 0;
  673. <a name="l00680"></a>00680 UpdateClip();
  674. <a name="l00681"></a>00681 }
  675. <a name="l00682"></a>00682
  676. <a name="l00683"></a>00683
  677. <a name="l00684"></a>00684 <span class="keywordtype">void</span> CellEngine::SetMask(
  678. <a name="l00685"></a>00685 <span class="keywordtype">long</span> ww,
  679. <a name="l00686"></a>00686 <span class="keywordtype">long</span> hh,
  680. <a name="l00687"></a>00687 Byte *data,
  681. <a name="l00688"></a>00688 <span class="keywordtype">long</span> rb)
  682. <a name="l00689"></a>00689 {
  683. <a name="l00690"></a>00690 maskMem = data;
  684. <a name="l00691"></a>00691 maskRowBytes = rb;
  685. <a name="l00692"></a>00692 maskWidth = ww;
  686. <a name="l00693"></a>00693 maskHeight = hh;
  687. <a name="l00694"></a>00694 masked = 1;
  688. <a name="l00695"></a>00695 UpdateClip();
  689. <a name="l00696"></a>00696 }
  690. <a name="l00697"></a>00697
  691. <a name="l00698"></a>00698
  692. <a name="l00699"></a>00699 <span class="keywordtype">void</span> CellEngine::UpdateClip()
  693. <a name="l00700"></a>00700 {
  694. <a name="l00701"></a>00701 <span class="keywordflow">if</span> (rectList != NULL) {
  695. <a name="l00702"></a>00702 <span class="keyword">delete</span> [] rectList;
  696. <a name="l00703"></a>00703 rectList = NULL;
  697. <a name="l00704"></a>00704 clipRects = 0;
  698. <a name="l00705"></a>00705 } <span class="comment">// if</span>
  699. <a name="l00706"></a>00706
  700. <a name="l00707"></a>00707 <span class="keywordflow">if</span> (masked) {
  701. <a name="l00708"></a>00708 Byte *mem = maskMem;
  702. <a name="l00709"></a>00709 <span class="keywordtype">long</span> rectCount = 0;
  703. <a name="l00710"></a>00710 <span class="keywordtype">long</span> rectBufSize = 256;
  704. <a name="l00711"></a>00711 RECT *rects = <span class="keyword">new</span> RECT[rectBufSize];
  705. <a name="l00712"></a>00712 RECT *r = NULL;
  706. <a name="l00713"></a>00713 <span class="keywordtype">long</span> xx, yy;
  707. <a name="l00714"></a>00714 <span class="keywordtype">long</span> curRect = -1;
  708. <a name="l00715"></a>00715 <span class="keywordtype">long</span> aboveRect = -1;
  709. <a name="l00716"></a>00716 <span class="keywordflow">for</span> (yy = 0; yy &lt; maskHeight; yy++) {
  710. <a name="l00717"></a>00717 <span class="keywordtype">long</span> isInside = 0;
  711. <a name="l00718"></a>00718 <span class="keywordtype">long</span> wasInside = 0;
  712. <a name="l00719"></a>00719 <span class="keywordflow">for</span> (xx = 0; xx &lt; maskWidth; xx++) {
  713. <a name="l00720"></a>00720 <span class="keywordtype">long</span> pixel = mem[xx];
  714. <a name="l00721"></a>00721 isInside = pixel &gt; maskClip;
  715. <a name="l00722"></a>00722 <span class="keywordflow">if</span> (wasInside) {
  716. <a name="l00723"></a>00723 <span class="keywordflow">if</span> (! isInside) {
  717. <a name="l00724"></a>00724 r-&gt;right = xx;
  718. <a name="l00725"></a>00725 <span class="keywordflow">if</span> ((aboveRect != -1) &amp;&amp;
  719. <a name="l00726"></a>00726 (rects[aboveRect].right == xx)) {
  720. <a name="l00727"></a>00727 <span class="comment">// merge with rect above</span>
  721. <a name="l00728"></a>00728 rects[aboveRect].bottom = r-&gt;bottom;
  722. <a name="l00729"></a>00729 rectCount--;
  723. <a name="l00730"></a>00730 } <span class="comment">// if</span>
  724. <a name="l00731"></a>00731 wasInside = 0;
  725. <a name="l00732"></a>00732 curRect = -1;
  726. <a name="l00733"></a>00733 aboveRect = -1;
  727. <a name="l00734"></a>00734 } <span class="comment">// if (! isInside)</span>
  728. <a name="l00735"></a>00735 } <span class="keywordflow">else</span> { <span class="comment">// if (wasInside)</span>
  729. <a name="l00736"></a>00736 <span class="keywordflow">if</span> (isInside) {
  730. <a name="l00737"></a>00737 wasInside = 1;
  731. <a name="l00738"></a>00738
  732. <a name="l00739"></a>00739 curRect = rectCount++;
  733. <a name="l00740"></a>00740
  734. <a name="l00741"></a>00741 <span class="keywordflow">if</span> (rectCount &gt; rectBufSize) {
  735. <a name="l00742"></a>00742 <span class="keywordtype">long</span> i;
  736. <a name="l00743"></a>00743 RECT *newRects;
  737. <a name="l00744"></a>00744
  738. <a name="l00745"></a>00745 rectBufSize += 256;
  739. <a name="l00746"></a>00746 newRects = <span class="keyword">new</span> RECT[rectBufSize];
  740. <a name="l00747"></a>00747 <span class="keywordflow">for</span> (i = 0; i &lt; curRect; i++) {
  741. <a name="l00748"></a>00748 newRects[i] = rects[i];
  742. <a name="l00749"></a>00749 } <span class="comment">// for</span>
  743. <a name="l00750"></a>00750 <span class="keyword">delete</span> [] rects;
  744. <a name="l00751"></a>00751 rects = newRects;
  745. <a name="l00752"></a>00752 } <span class="comment">// if (rectCount &gt; rectBufSize)</span>
  746. <a name="l00753"></a>00753
  747. <a name="l00754"></a>00754 r = &amp;rects[curRect];
  748. <a name="l00755"></a>00755 r-&gt;left = xx;
  749. <a name="l00756"></a>00756 r-&gt;top = yy;
  750. <a name="l00757"></a>00757 r-&gt;right = xx + 1;
  751. <a name="l00758"></a>00758 r-&gt;bottom = yy + 1;
  752. <a name="l00759"></a>00759
  753. <a name="l00760"></a>00760 aboveRect = -1;
  754. <a name="l00761"></a>00761
  755. <a name="l00762"></a>00762 { <span class="keywordtype">long</span> i;
  756. <a name="l00763"></a>00763 <span class="keywordflow">for</span> (i = 0; i &lt; curRect; i++) {
  757. <a name="l00764"></a>00764 RECT *ra = &amp;rects[i];
  758. <a name="l00765"></a>00765 <span class="keywordflow">if</span> ((ra-&gt;left == xx) &amp;&amp;
  759. <a name="l00766"></a>00766 (ra-&gt;bottom == yy)) {
  760. <a name="l00767"></a>00767 aboveRect = i;
  761. <a name="l00768"></a>00768 <span class="keywordflow">break</span>;
  762. <a name="l00769"></a>00769 } <span class="comment">// if</span>
  763. <a name="l00770"></a>00770 } <span class="comment">// for i</span>
  764. <a name="l00771"></a>00771 }
  765. <a name="l00772"></a>00772 } <span class="comment">// if (isInside)</span>
  766. <a name="l00773"></a>00773 } <span class="comment">// if (wasInside)</span>
  767. <a name="l00774"></a>00774 } <span class="comment">// for xx</span>
  768. <a name="l00775"></a>00775
  769. <a name="l00776"></a>00776 <span class="keywordflow">if</span> (curRect != -1) {
  770. <a name="l00777"></a>00777 r-&gt;right = xx;
  771. <a name="l00778"></a>00778 <span class="keywordflow">if</span> ((aboveRect != -1) &amp;&amp;
  772. <a name="l00779"></a>00779 (rects[aboveRect].right == xx)) {
  773. <a name="l00780"></a>00780 <span class="comment">// merge with rect above</span>
  774. <a name="l00781"></a>00781 rects[aboveRect].bottom = r-&gt;bottom;
  775. <a name="l00782"></a>00782 rectCount--;
  776. <a name="l00783"></a>00783 } <span class="comment">// if</span>
  777. <a name="l00784"></a>00784 } <span class="comment">// if (curRect != -1)</span>
  778. <a name="l00785"></a>00785
  779. <a name="l00786"></a>00786 curRect = -1;
  780. <a name="l00787"></a>00787 aboveRect = -1;
  781. <a name="l00788"></a>00788 mem += maskRowBytes;
  782. <a name="l00789"></a>00789
  783. <a name="l00790"></a>00790 } <span class="comment">// for yy</span>
  784. <a name="l00791"></a>00791
  785. <a name="l00792"></a>00792 {
  786. <a name="l00793"></a>00793 <span class="keywordtype">long</span> i;
  787. <a name="l00794"></a>00794 RECT *newRects = <span class="keyword">new</span> RECT[rectCount];
  788. <a name="l00795"></a>00795
  789. <a name="l00796"></a>00796 clipRects = rectCount;
  790. <a name="l00797"></a>00797 rectList = newRects;
  791. <a name="l00798"></a>00798 <span class="keywordflow">for</span> (i = 0; i &lt; rectCount; i++) {
  792. <a name="l00799"></a>00799 newRects[i] = rects[i];
  793. <a name="l00800"></a>00800 } <span class="comment">// for</span>
  794. <a name="l00801"></a>00801 <span class="keyword">delete</span> [] rects;
  795. <a name="l00802"></a>00802 }
  796. <a name="l00803"></a>00803 } <span class="comment">// if (masked)</span>
  797. <a name="l00804"></a>00804 }
  798. <a name="l00805"></a>00805
  799. <a name="l00806"></a>00806
  800. <a name="l00807"></a>00807 <span class="keywordtype">void</span> CellEngine::LoadRule(
  801. <a name="l00808"></a>00808 <span class="keyword">const</span> <span class="keywordtype">char</span> *name)
  802. <a name="l00809"></a>00809 {
  803. <a name="l00810"></a>00810 <span class="keywordflow">if</span> (ruleName != NULL) {
  804. <a name="l00811"></a>00811 <span class="keyword">delete</span> [] ruleName;
  805. <a name="l00812"></a>00812 }
  806. <a name="l00813"></a>00813
  807. <a name="l00814"></a>00814 ruleName = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(name) + 1];
  808. <a name="l00815"></a>00815
  809. <a name="l00816"></a>00816 strcpy(ruleName, name);
  810. <a name="l00817"></a>00817
  811. <a name="l00818"></a>00818 <span class="keyword">const</span> <span class="keywordtype">char</span> *stream =
  812. <a name="l00819"></a>00819 NULL;
  813. <a name="l00820"></a>00820
  814. <a name="l00821"></a>00821 <span class="keyword">const</span> <span class="keywordtype">char</span> **pstr =
  815. <a name="l00822"></a>00822 <a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>;
  816. <a name="l00823"></a>00823
  817. <a name="l00824"></a>00824 <span class="keywordflow">while</span> (pstr[0] != NULL) {
  818. <a name="l00825"></a>00825 <span class="keywordflow">if</span> (stricmp(
  819. <a name="l00826"></a>00826 name,
  820. <a name="l00827"></a>00827 pstr[0]) == 0) {
  821. <a name="l00828"></a>00828 stream =
  822. <a name="l00829"></a>00829 pstr[1];
  823. <a name="l00830"></a>00830 <span class="keywordflow">break</span>;
  824. <a name="l00831"></a>00831 } <span class="comment">// if</span>
  825. <a name="l00832"></a>00832 pstr += 2;
  826. <a name="l00833"></a>00833 } <span class="comment">// while</span>
  827. <a name="l00834"></a>00834
  828. <a name="l00835"></a>00835 <span class="keywordflow">if</span> (stream != NULL) {
  829. <a name="l00836"></a>00836 LoadRuleData(stream);
  830. <a name="l00837"></a>00837 } <span class="comment">// if</span>
  831. <a name="l00838"></a>00838 }
  832. <a name="l00839"></a>00839
  833. <a name="l00840"></a>00840
  834. <a name="l00841"></a>00841 <span class="keywordtype">void</span> CellEngine::LoadRuleData(
  835. <a name="l00842"></a>00842 <span class="keyword">const</span> <span class="keywordtype">char</span> *stream)
  836. <a name="l00843"></a>00843 {
  837. <a name="l00844"></a>00844 QUAD magic;
  838. <a name="l00845"></a>00845
  839. <a name="l00846"></a>00846 <span class="keywordflow">if</span> (stream == NULL) {
  840. <a name="l00847"></a>00847 ruleSize = 0;
  841. <a name="l00848"></a>00848 neighborhood = 0;
  842. <a name="l00849"></a>00849 } <span class="keywordflow">else</span> {
  843. <a name="l00850"></a>00850
  844. <a name="l00851"></a>00851 <span class="comment">// XXX: Make this byte order independent!!!</span>
  845. <a name="l00852"></a>00852
  846. <a name="l00853"></a>00853 magic = *(<span class="keywordtype">long</span> *)stream;
  847. <a name="l00854"></a>00854 magic = SWAPLONG(magic);
  848. <a name="l00855"></a>00855 <span class="keywordflow">if</span> (magic != (QUAD)0xCAC0CAC0) <span class="keywordflow">return</span>;
  849. <a name="l00856"></a>00856 stream += <span class="keyword">sizeof</span>(long);
  850. <a name="l00857"></a>00857
  851. <a name="l00858"></a>00858 neighborhood = *(<span class="keywordtype">long</span> *)stream;
  852. <a name="l00859"></a>00859 neighborhood = SWAPLONG(neighborhood);
  853. <a name="l00860"></a>00860 stream += <span class="keyword">sizeof</span>(long);
  854. <a name="l00861"></a>00861
  855. <a name="l00862"></a>00862 ruleSize = *(<span class="keywordtype">long</span> *)stream;
  856. <a name="l00863"></a>00863 ruleSize = SWAPLONG(ruleSize);
  857. <a name="l00864"></a>00864 stream += <span class="keyword">sizeof</span>(long);
  858. <a name="l00865"></a>00865 }
  859. <a name="l00866"></a>00866
  860. <a name="l00867"></a>00867 <span class="keywordflow">if</span> ((rule != NULL) &amp;&amp;
  861. <a name="l00868"></a>00868 (!ruleStatic)) {
  862. <a name="l00869"></a>00869 <span class="keyword">delete</span> [] rule;
  863. <a name="l00870"></a>00870 rule = NULL;
  864. <a name="l00871"></a>00871 ruleStatic = 0;
  865. <a name="l00872"></a>00872 } <span class="comment">// if</span>
  866. <a name="l00873"></a>00873
  867. <a name="l00874"></a>00874 <span class="keywordflow">if</span> (ruleSize != 0) {
  868. <a name="l00875"></a>00875 rule = <span class="keyword">new</span> Byte[ruleSize];
  869. <a name="l00876"></a>00876 memcpy(rule, stream, ruleSize);
  870. <a name="l00877"></a>00877 ruleStatic = 0;
  871. <a name="l00878"></a>00878 } <span class="comment">// if</span>
  872. <a name="l00879"></a>00879 }
  873. <a name="l00880"></a>00880
  874. <a name="l00881"></a>00881
  875. <a name="l00882"></a>00882 <span class="keywordtype">void</span> CellEngine::LoadStaticRuleData(
  876. <a name="l00883"></a>00883 <span class="keyword">const</span> <span class="keywordtype">char</span> *stream)
  877. <a name="l00884"></a>00884 {
  878. <a name="l00885"></a>00885 QUAD magic;
  879. <a name="l00886"></a>00886
  880. <a name="l00887"></a>00887 <span class="keywordflow">if</span> (stream == NULL) {
  881. <a name="l00888"></a>00888 ruleSize = 0;
  882. <a name="l00889"></a>00889 neighborhood = 0;
  883. <a name="l00890"></a>00890 } <span class="keywordflow">else</span> {
  884. <a name="l00891"></a>00891
  885. <a name="l00892"></a>00892 <span class="comment">// XXX: Make this byte order independent!!!</span>
  886. <a name="l00893"></a>00893
  887. <a name="l00894"></a>00894 magic = *(<span class="keywordtype">long</span> *)stream;
  888. <a name="l00895"></a>00895 magic = SWAPLONG(magic);
  889. <a name="l00896"></a>00896 <span class="keywordflow">if</span> (magic != (LONG)0xCAC0CAC0) <span class="keywordflow">return</span>;
  890. <a name="l00897"></a>00897 stream += <span class="keyword">sizeof</span>(long);
  891. <a name="l00898"></a>00898
  892. <a name="l00899"></a>00899 neighborhood = *(<span class="keywordtype">long</span> *)stream;
  893. <a name="l00900"></a>00900 neighborhood = SWAPLONG(neighborhood);
  894. <a name="l00901"></a>00901 stream += <span class="keyword">sizeof</span>(long);
  895. <a name="l00902"></a>00902
  896. <a name="l00903"></a>00903 ruleSize = *(<span class="keywordtype">long</span> *)stream;
  897. <a name="l00904"></a>00904 ruleSize = SWAPLONG(ruleSize);
  898. <a name="l00905"></a>00905 stream += <span class="keyword">sizeof</span>(long);
  899. <a name="l00906"></a>00906 }
  900. <a name="l00907"></a>00907
  901. <a name="l00908"></a>00908 rule = (Byte *)stream;
  902. <a name="l00909"></a>00909 ruleStatic = 1;
  903. <a name="l00910"></a>00910 }
  904. <a name="l00911"></a>00911
  905. <a name="l00912"></a>00912
  906. <a name="l00913"></a>00913 <span class="keywordtype">void</span> CellEngine::SetRuleTable(
  907. <a name="l00914"></a>00914 <span class="keyword">const</span> <span class="keywordtype">char</span> *table,
  908. <a name="l00915"></a>00915 <span class="keywordtype">int</span> ruleSize,
  909. <a name="l00916"></a>00916 <span class="keywordtype">int</span> neigh)
  910. <a name="l00917"></a>00917 {
  911. <a name="l00918"></a>00918 neighborhood = neigh;
  912. <a name="l00919"></a>00919 <span class="keywordflow">if</span> (rule != NULL) {
  913. <a name="l00920"></a>00920 <span class="keyword">delete</span> [] rule;
  914. <a name="l00921"></a>00921 rule = NULL;
  915. <a name="l00922"></a>00922 } <span class="comment">// if</span>
  916. <a name="l00923"></a>00923
  917. <a name="l00924"></a>00924 <span class="keywordflow">if</span> (ruleSize != 0) {
  918. <a name="l00925"></a>00925 rule = <span class="keyword">new</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>[ruleSize];
  919. <a name="l00926"></a>00926 memcpy(rule, table, ruleSize);
  920. <a name="l00927"></a>00927 ruleStatic = 0;
  921. <a name="l00928"></a>00928 } <span class="comment">// if</span>
  922. <a name="l00929"></a>00929 }
  923. <a name="l00930"></a>00930
  924. <a name="l00931"></a>00931
  925. <a name="l00932"></a>00932 <span class="keywordtype">int</span> CellEngine::CountRules()
  926. <a name="l00933"></a>00933 {
  927. <a name="l00934"></a>00934 <span class="keywordflow">if</span> (ruleCount &lt; 0) {
  928. <a name="l00935"></a>00935 ruleCount = 0;
  929. <a name="l00936"></a>00936 <span class="keywordflow">while</span> (<a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>[ruleCount &lt;&lt; 1] != NULL) {
  930. <a name="l00937"></a>00937 ruleCount++;
  931. <a name="l00938"></a>00938 } <span class="comment">// while</span>
  932. <a name="l00939"></a>00939 } <span class="comment">// if</span>
  933. <a name="l00940"></a>00940
  934. <a name="l00941"></a>00941 <span class="keywordflow">return</span> ruleCount;
  935. <a name="l00942"></a>00942 }
  936. <a name="l00943"></a>00943
  937. <a name="l00944"></a>00944
  938. <a name="l00945"></a>00945 <span class="keyword">const</span> <span class="keywordtype">char</span> *CellEngine::GetRuleName(
  939. <a name="l00946"></a>00946 <span class="keywordtype">int</span> i)
  940. <a name="l00947"></a>00947 {
  941. <a name="l00948"></a>00948 <span class="keywordflow">if</span> ((i &lt; 0) ||
  942. <a name="l00949"></a>00949 (i &gt;= CountRules())) {
  943. <a name="l00950"></a>00950 <span class="keywordflow">return</span> NULL;
  944. <a name="l00951"></a>00951 } <span class="comment">// if</span>
  945. <a name="l00952"></a>00952
  946. <a name="l00953"></a>00953 <span class="keywordflow">return</span> <a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>[i &lt;&lt; 1];
  947. <a name="l00954"></a>00954 }
  948. <a name="l00955"></a>00955
  949. <a name="l00956"></a>00956
  950. <a name="l00957"></a>00957 <span class="keyword">const</span> <span class="keywordtype">char</span> *CellEngine::GetRuleData(
  951. <a name="l00958"></a>00958 <span class="keywordtype">int</span> i)
  952. <a name="l00959"></a>00959 {
  953. <a name="l00960"></a>00960 <span class="keywordflow">if</span> ((i &lt; 0) ||
  954. <a name="l00961"></a>00961 (i &gt;= CountRules())) {
  955. <a name="l00962"></a>00962 <span class="keywordflow">return</span> NULL;
  956. <a name="l00963"></a>00963 } <span class="comment">// if</span>
  957. <a name="l00964"></a>00964
  958. <a name="l00965"></a>00965 <span class="keywordflow">return</span> <a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>[(i &lt;&lt; 1) + 1];
  959. <a name="l00966"></a>00966 }
  960. <a name="l00967"></a>00967
  961. <a name="l00968"></a>00968
  962. <a name="l00969"></a>00969 <span class="keywordtype">long</span> CellEngine::DoPhysics()
  963. <a name="l00970"></a>00970 {
  964. <a name="l00971"></a>00971 <span class="keywordtype">long</span> xx = x;
  965. <a name="l00972"></a>00972 <span class="keywordtype">long</span> yy = y;
  966. <a name="l00973"></a>00973 <span class="keywordtype">long</span> oldx = xx;
  967. <a name="l00974"></a>00974 <span class="keywordtype">long</span> oldy = yy;
  968. <a name="l00975"></a>00975 <span class="keywordtype">long</span> dxx = dx;
  969. <a name="l00976"></a>00976 <span class="keywordtype">long</span> dyy = dy;
  970. <a name="l00977"></a>00977 <span class="keywordtype">long</span> events = 0;
  971. <a name="l00978"></a>00978
  972. <a name="l00979"></a>00979 <span class="keywordflow">if</span> (tracking) {
  973. <a name="l00980"></a>00980 dxx = dyy = 0;
  974. <a name="l00981"></a>00981 } <span class="comment">// if</span>
  975. <a name="l00982"></a>00982
  976. <a name="l00983"></a>00983 xx = xx + dxx;
  977. <a name="l00984"></a>00984 <span class="keywordflow">if</span> (xx &lt; 0) {
  978. <a name="l00985"></a>00985 xx = 0;
  979. <a name="l00986"></a>00986 <span class="keywordflow">if</span> (dxx &lt; 0) dxx = -dxx;
  980. <a name="l00987"></a>00987 events |= EVENT_BOUNCE_LEFT;
  981. <a name="l00988"></a>00988 } <span class="keywordflow">else</span> {
  982. <a name="l00989"></a>00989 <span class="keywordflow">if</span> ((xx + width) &gt; screenWidth) {
  983. <a name="l00990"></a>00990 xx = screenWidth - width;
  984. <a name="l00991"></a>00991 <span class="keywordflow">if</span> (xx &lt; 0) xx = 0;
  985. <a name="l00992"></a>00992 <span class="keywordflow">if</span> (dxx &gt; 0) dxx = -dxx;
  986. <a name="l00993"></a>00993 events |= EVENT_BOUNCE_RIGHT;
  987. <a name="l00994"></a>00994 } <span class="comment">// if</span>
  988. <a name="l00995"></a>00995 } <span class="comment">// if</span>
  989. <a name="l00996"></a>00996
  990. <a name="l00997"></a>00997 yy = yy + dyy;
  991. <a name="l00998"></a>00998 <span class="keywordflow">if</span> (yy &lt; 0) {
  992. <a name="l00999"></a>00999 yy = 0;
  993. <a name="l01000"></a>01000 <span class="keywordflow">if</span> (dyy &lt; 0) {
  994. <a name="l01001"></a>01001 dyy = -dyy;
  995. <a name="l01002"></a>01002 } <span class="comment">// if</span>
  996. <a name="l01003"></a>01003 events |= EVENT_BOUNCE_TOP;
  997. <a name="l01004"></a>01004 } <span class="keywordflow">else</span> {
  998. <a name="l01005"></a>01005 <span class="keywordflow">if</span> ((yy + height) &gt; screenHeight) {
  999. <a name="l01006"></a>01006 yy = screenHeight - height;
  1000. <a name="l01007"></a>01007 <span class="keywordflow">if</span> (yy &lt; 0) yy = 0;
  1001. <a name="l01008"></a>01008 <span class="keywordflow">if</span> (dyy &gt; 0) {
  1002. <a name="l01009"></a>01009 dyy = -dyy;
  1003. <a name="l01010"></a>01010 } <span class="comment">// if</span>
  1004. <a name="l01011"></a>01011 events |= EVENT_BOUNCE_BOTTOM;
  1005. <a name="l01012"></a>01012 } <span class="comment">// if</span>
  1006. <a name="l01013"></a>01013 } <span class="comment">// if</span>
  1007. <a name="l01014"></a>01014
  1008. <a name="l01015"></a>01015 <span class="keywordflow">if</span> ((!tracking) &amp;&amp; events) {
  1009. <a name="l01016"></a>01016 <span class="keywordflow">if</span> (hubba) {
  1010. <a name="l01017"></a>01017 frob += (Rand16() % ((2 * hubba) + 1)) - hubba;
  1011. <a name="l01018"></a>01018 <span class="keywordflow">if</span> (frob &gt; hubba) frob = hubba;
  1012. <a name="l01019"></a>01019 <span class="keywordflow">if</span> (frob &lt; -hubba) frob = -hubba;
  1013. <a name="l01020"></a>01020 } <span class="comment">// if</span>
  1014. <a name="l01021"></a>01021 <span class="keywordflow">if</span> (rumble) {
  1015. <a name="l01022"></a>01022 <span class="keywordflow">do</span> {
  1016. <a name="l01023"></a>01023 <span class="keywordflow">if</span> (rumble &gt; 0) {
  1017. <a name="l01024"></a>01024 <span class="keywordflow">if</span> (events &amp; (EVENT_BOUNCE_LEFT |
  1018. <a name="l01025"></a>01025 EVENT_BOUNCE_RIGHT |
  1019. <a name="l01026"></a>01026 EVENT_BOUNCE_TOP |
  1020. <a name="l01027"></a>01027 EVENT_BOUNCE_BOTTOM)) {
  1021. <a name="l01028"></a>01028 dxx += (Rand16() % ((2 * rumble) + 1)) - rumble;
  1022. <a name="l01029"></a>01029 dyy += (Rand16() % ((2 * rumble) + 1)) - rumble;
  1023. <a name="l01030"></a>01030 <span class="keywordflow">if</span> (rumblemax) {
  1024. <a name="l01031"></a>01031 <span class="keywordflow">if</span> (dxx &gt; rumblemax) dxx = rumblemax;
  1025. <a name="l01032"></a>01032 <span class="keywordflow">if</span> (dxx &lt; -rumblemax) dxx = -rumblemax;
  1026. <a name="l01033"></a>01033 <span class="keywordflow">if</span> (dyy &gt; rumblemax) dyy = rumblemax;
  1027. <a name="l01034"></a>01034 <span class="keywordflow">if</span> (dyy &lt; -rumblemax) dyy = -rumblemax;
  1028. <a name="l01035"></a>01035 } <span class="comment">// if</span>
  1029. <a name="l01036"></a>01036 } <span class="comment">// if</span>
  1030. <a name="l01037"></a>01037 } <span class="keywordflow">else</span> {
  1031. <a name="l01038"></a>01038 <span class="keywordflow">if</span> (events &amp; (EVENT_BOUNCE_LEFT |
  1032. <a name="l01039"></a>01039 EVENT_BOUNCE_RIGHT)) {
  1033. <a name="l01040"></a>01040 dxx += (Rand16() % ((-2 * rumble) + 1)) + rumble;
  1034. <a name="l01041"></a>01041 } <span class="comment">// if</span>
  1035. <a name="l01042"></a>01042 <span class="keywordflow">if</span> (events &amp; (EVENT_BOUNCE_TOP |
  1036. <a name="l01043"></a>01043 EVENT_BOUNCE_BOTTOM)) {
  1037. <a name="l01044"></a>01044 dyy += (Rand16() % ((-2 * rumble) + 1)) + rumble;
  1038. <a name="l01045"></a>01045 } <span class="comment">// if</span>
  1039. <a name="l01046"></a>01046 } <span class="comment">// if</span>
  1040. <a name="l01047"></a>01047 } <span class="keywordflow">while</span> ((dxx == 0) &amp;&amp; (dyy == 0));
  1041. <a name="l01048"></a>01048 } <span class="comment">// if</span>
  1042. <a name="l01049"></a>01049 } <span class="comment">// if</span>
  1043. <a name="l01050"></a>01050
  1044. <a name="l01051"></a>01051 dx = dxx + gravx;
  1045. <a name="l01052"></a>01052 dy = dyy + gravy;
  1046. <a name="l01053"></a>01053
  1047. <a name="l01054"></a>01054 <span class="keywordflow">if</span> ((oldx != xx) || (oldy != yy)) {
  1048. <a name="l01055"></a>01055 SetPos(xx, yy);
  1049. <a name="l01056"></a>01056 ForceOnScreen();
  1050. <a name="l01057"></a>01057 events |= EVENT_MOVE;
  1051. <a name="l01058"></a>01058 } <span class="comment">// if</span>
  1052. <a name="l01059"></a>01059
  1053. <a name="l01060"></a>01060 <span class="keywordflow">return</span> events;
  1054. <a name="l01061"></a>01061 }
  1055. <a name="l01062"></a>01062
  1056. <a name="l01063"></a>01063
  1057. <a name="l01064"></a>01064 <span class="keywordtype">long</span> CellEngine::DoRule()
  1058. <a name="l01065"></a>01065 {
  1059. <a name="l01066"></a>01066 <span class="keywordtype">int</span> step = 0;
  1060. <a name="l01067"></a>01067
  1061. <a name="l01068"></a>01068 <span class="keywordflow">if</span> (!moveImage) {
  1062. <a name="l01069"></a>01069 DoPhysics();
  1063. <a name="l01070"></a>01070 }
  1064. <a name="l01071"></a>01071
  1065. <a name="l01072"></a>01072 <span class="keywordflow">if</span> (skips &gt; 0) {
  1066. <a name="l01073"></a>01073 <span class="keywordflow">if</span> (skip &gt; 0) {
  1067. <a name="l01074"></a>01074 skip--;
  1068. <a name="l01075"></a>01075 done:
  1069. <a name="l01076"></a>01076 <span class="keywordflow">if</span> (moveImage) {
  1070. <a name="l01077"></a>01077 DoPhysics();
  1071. <a name="l01078"></a>01078 }
  1072. <a name="l01079"></a>01079 <span class="keywordflow">return</span> step;
  1073. <a name="l01080"></a>01080 } <span class="comment">// if</span>
  1074. <a name="l01081"></a>01081 skip = skips;
  1075. <a name="l01082"></a>01082 } <span class="comment">// if</span>
  1076. <a name="l01083"></a>01083
  1077. <a name="l01084"></a>01084 <span class="keywordflow">if</span> (!OnScreen()) <span class="keywordflow">goto</span> done;
  1078. <a name="l01085"></a>01085
  1079. <a name="l01086"></a>01086 <span class="keywordflow">for</span> (step = 0;
  1080. <a name="l01087"></a>01087 step &lt; steps;
  1081. <a name="l01088"></a>01088 step++) {
  1082. <a name="l01089"></a>01089
  1083. <a name="l01090"></a>01090 CopyToBack();
  1084. <a name="l01091"></a>01091
  1085. <a name="l01092"></a>01092 <span class="keywordflow">if</span> (moveImage &amp;&amp;
  1086. <a name="l01093"></a>01093 (step == 0)) {
  1087. <a name="l01094"></a>01094 DoPhysics();
  1088. <a name="l01095"></a>01095 }
  1089. <a name="l01096"></a>01096
  1090. <a name="l01097"></a>01097 PumpToFront();
  1091. <a name="l01098"></a>01098
  1092. <a name="l01099"></a>01099 } <span class="comment">// for step</span>
  1093. <a name="l01100"></a>01100
  1094. <a name="l01101"></a>01101 <span class="keywordflow">return</span> step;
  1095. <a name="l01102"></a>01102 }
  1096. <a name="l01103"></a>01103
  1097. <a name="l01104"></a>01104
  1098. <a name="l01105"></a>01105 <span class="keywordtype">void</span> CellEngine::PostRule()
  1099. <a name="l01106"></a>01106 {
  1100. <a name="l01107"></a>01107 }
  1101. <a name="l01108"></a>01108
  1102. <a name="l01109"></a>01109
  1103. <a name="l01111"></a>01111 <span class="comment">//</span>
  1104. <a name="l01112"></a>01112 <span class="comment">// Before applying a rule, we copy the front buffer to the back buffer.</span>
  1105. <a name="l01113"></a>01113 <span class="comment">// The back buffer is two pixels wider and taller than the front buffer,</span>
  1106. <a name="l01114"></a>01114 <span class="comment">// so that we can handle the edge conditions efficiently.</span>
  1107. <a name="l01115"></a>01115 <span class="comment">// The main cellular automata loops do not need to worry about the special case</span>
  1108. <a name="l01116"></a>01116 <span class="comment">// at the edges, because we pre-wrap a one pixel wide perimeter around the back</span>
  1109. <a name="l01117"></a>01117 <span class="comment">// buffer before applying the rule.</span>
  1110. <a name="l01118"></a>01118 <span class="comment">//</span>
  1111. <a name="l01119"></a>01119 <span class="comment">// 0 ff f0 f1 ... fe ff f0</span>
  1112. <a name="l01120"></a>01120 <span class="comment">//</span>
  1113. <a name="l01121"></a>01121 <span class="comment">// 1 0f aa bb ... ee ee 00</span>
  1114. <a name="l01122"></a>01122 <span class="comment">// 2 1f 10 11 ... ee ff 10</span>
  1115. <a name="l01123"></a>01123 <span class="comment">// .. .. .. .. .. ..</span>
  1116. <a name="l01124"></a>01124 <span class="comment">// ef e0 e1 ... ee ff e0</span>
  1117. <a name="l01125"></a>01125 <span class="comment">// h ff f0 f1 ... ee ff f0</span>
  1118. <a name="l01126"></a>01126 <span class="comment">//</span>
  1119. <a name="l01127"></a>01127 <span class="comment">// h+1 0f 00 01 ... 0e 0f 00</span>
  1120. <a name="l01128"></a>01128 <span class="comment">//</span>
  1121. <a name="l01129"></a>01129 <span class="comment">//</span>
  1122. <a name="l01130"></a>01130 <span class="comment">// There are several "wrap" modes to handle the edge conditions.</span>
  1123. <a name="l01131"></a>01131 <span class="comment">// Initially:</span>
  1124. <a name="l01132"></a>01132 <span class="comment">// BACK FRONT</span>
  1125. <a name="l01133"></a>01133 <span class="comment">// ---- -----</span>
  1126. <a name="l01134"></a>01134 <span class="comment">// abcd 0123</span>
  1127. <a name="l01135"></a>01135 <span class="comment">// eFGh 4567</span>
  1128. <a name="l01136"></a>01136 <span class="comment">// iJKl 8901</span>
  1129. <a name="l01137"></a>01137 <span class="comment">// mnop 2345</span>
  1130. <a name="l01138"></a>01138 <span class="comment">//</span>
  1131. <a name="l01139"></a>01139 <span class="comment">// Legend:</span>
  1132. <a name="l01140"></a>01140 <span class="comment">// aBCd=&gt; 0AB3 Copy back to front.</span>
  1133. <a name="l01141"></a>01141 <span class="comment">// Upper case source letters are copied.</span>
  1134. <a name="l01142"></a>01142 <span class="comment">// &lt;2121&gt; Wrap from opposite edges (vertical and horizontal).</span>
  1135. <a name="l01143"></a>01143 <span class="comment">// |1122| Truncate from same edges (vertical and horizontal).</span>
  1136. <a name="l01144"></a>01144 <span class="comment">//</span>
  1137. <a name="l01145"></a>01145 <span class="comment">// WRAP EFFECT</span>
  1138. <a name="l01146"></a>01146 <span class="comment">// ---- ------</span>
  1139. <a name="l01147"></a>01147 <span class="comment">// 0 no effect, don't change back</span>
  1140. <a name="l01148"></a>01148 <span class="comment">// abcd 0123</span>
  1141. <a name="l01149"></a>01149 <span class="comment">// efgh 4567</span>
  1142. <a name="l01150"></a>01150 <span class="comment">// ijkl 8901</span>
  1143. <a name="l01151"></a>01151 <span class="comment">// mnop 2345</span>
  1144. <a name="l01152"></a>01152 <span class="comment">// 1 copy front to back, no wrap, don't change back perimeter</span>
  1145. <a name="l01153"></a>01153 <span class="comment">// abcd 0123</span>
  1146. <a name="l01154"></a>01154 <span class="comment">// eFGh=&gt; 4FG7</span>
  1147. <a name="l01155"></a>01155 <span class="comment">// iJKl=&gt; 8JK1</span>
  1148. <a name="l01156"></a>01156 <span class="comment">// mnop 2345</span>
  1149. <a name="l01157"></a>01157 <span class="comment">// 2 don't copy front to back, just wrap edges</span>
  1150. <a name="l01158"></a>01158 <span class="comment">// abcd 0909</span>
  1151. <a name="l01159"></a>01159 <span class="comment">// eFGh &lt;6565&gt;</span>
  1152. <a name="l01160"></a>01160 <span class="comment">// iJKl &lt;0909&gt;</span>
  1153. <a name="l01161"></a>01161 <span class="comment">// mnop 6565</span>
  1154. <a name="l01162"></a>01162 <span class="comment">// 3 copy front to back, and wrap edges</span>
  1155. <a name="l01163"></a>01163 <span class="comment">// abcd KJKJ</span>
  1156. <a name="l01164"></a>01164 <span class="comment">// eFGh=&gt; &lt;GFGF&gt;</span>
  1157. <a name="l01165"></a>01165 <span class="comment">// iJKl=&gt; &lt;KJKJ&gt;</span>
  1158. <a name="l01166"></a>01166 <span class="comment">// mnop GFGF</span>
  1159. <a name="l01167"></a>01167 <span class="comment">// 4 copy front to back, truncate edges</span>
  1160. <a name="l01168"></a>01168 <span class="comment">// abcd FFGG</span>
  1161. <a name="l01169"></a>01169 <span class="comment">// eFGh=&gt; |FFGG|</span>
  1162. <a name="l01170"></a>01170 <span class="comment">// iJKl=&gt; |JJKK|</span>
  1163. <a name="l01171"></a>01171 <span class="comment">// mnop JJKK</span>
  1164. <a name="l01172"></a>01172 <span class="comment">// 5 copy edges from screen, don't wrap</span>
  1165. <a name="l01173"></a>01173 <span class="comment">// ABCD=&gt; ABCD</span>
  1166. <a name="l01174"></a>01174 <span class="comment">// EFGH=&gt; EFGH</span>
  1167. <a name="l01175"></a>01175 <span class="comment">// IJKL=&gt; IJKL</span>
  1168. <a name="l01176"></a>01176 <span class="comment">// MNOP=&gt; MNOP</span>
  1169. <a name="l01177"></a>01177 <span class="comment">//</span>
  1170. <a name="l01178"></a>01178
  1171. <a name="l01179"></a>01179 <span class="keywordtype">void</span> CellEngine::CopyToBack()
  1172. <a name="l01180"></a>01180 {
  1173. <a name="l01181"></a>01181 <span class="keywordtype">long</span> yy;
  1174. <a name="l01182"></a>01182 Byte *f = frontMem;
  1175. <a name="l01183"></a>01183 Byte *p = backMem +
  1176. <a name="l01184"></a>01184 backBorder +
  1177. <a name="l01185"></a>01185 (backBorder * backRowBytes);
  1178. <a name="l01186"></a>01186
  1179. <a name="l01187"></a>01187 <span class="keywordflow">switch</span> (wrap) {
  1180. <a name="l01188"></a>01188
  1181. <a name="l01189"></a>01189 <span class="keywordflow">case</span> 0:
  1182. <a name="l01190"></a>01190 <span class="comment">// no effect, don't change back</span>
  1183. <a name="l01191"></a>01191 <span class="keywordflow">break</span>;
  1184. <a name="l01192"></a>01192
  1185. <a name="l01193"></a>01193 <span class="keywordflow">case</span> 1:
  1186. <a name="l01194"></a>01194 <span class="comment">// copy front to back, no wrap,</span>
  1187. <a name="l01195"></a>01195 <span class="comment">// don't change back perimeter</span>
  1188. <a name="l01196"></a>01196 <span class="keywordflow">for</span> (yy = 0; yy &lt; height; yy++) {
  1189. <a name="l01197"></a>01197 memcpy(p, f, width);
  1190. <a name="l01198"></a>01198 p += backRowBytes;
  1191. <a name="l01199"></a>01199 f += screenRowBytes;
  1192. <a name="l01200"></a>01200 }
  1193. <a name="l01201"></a>01201 <span class="keywordflow">break</span>;
  1194. <a name="l01202"></a>01202
  1195. <a name="l01203"></a>01203 <span class="keywordflow">case</span> 2:
  1196. <a name="l01204"></a>01204 <span class="comment">// don't copy front to back, just wrap 1 pixel edges</span>
  1197. <a name="l01205"></a>01205 <span class="keywordflow">for</span> (yy = 0; yy &lt; height; yy++) {
  1198. <a name="l01206"></a>01206 p[-1] = p[width - 1];
  1199. <a name="l01207"></a>01207 p[width] = p[0];
  1200. <a name="l01208"></a>01208 p += backRowBytes;
  1201. <a name="l01209"></a>01209 f += screenRowBytes;
  1202. <a name="l01210"></a>01210 } <span class="comment">// for</span>
  1203. <a name="l01211"></a>01211 f = frontMem;
  1204. <a name="l01212"></a>01212 p = backMem +
  1205. <a name="l01213"></a>01213 backBorder +
  1206. <a name="l01214"></a>01214 (backBorder * backRowBytes);
  1207. <a name="l01215"></a>01215 memcpy(&amp;p[(-1 * backRowBytes) - 1],
  1208. <a name="l01216"></a>01216 &amp;p[((height - 1) * backRowBytes) - 1],
  1209. <a name="l01217"></a>01217 width + 2);
  1210. <a name="l01218"></a>01218 memcpy(&amp;p[(height * backRowBytes) - 1],
  1211. <a name="l01219"></a>01219 &amp;p[-1],
  1212. <a name="l01220"></a>01220 width + 2);
  1213. <a name="l01221"></a>01221 <span class="keywordflow">break</span>;
  1214. <a name="l01222"></a>01222
  1215. <a name="l01223"></a>01223 <span class="keywordflow">case</span> 3:
  1216. <a name="l01224"></a>01224 <span class="comment">// copy front to back, and wrap 1 pixel edges</span>
  1217. <a name="l01225"></a>01225 <span class="keywordflow">for</span> (yy = 0; yy &lt; height; yy++) {
  1218. <a name="l01226"></a>01226 memcpy(p, f, width);
  1219. <a name="l01227"></a>01227 p[-1] = p[width - 1];
  1220. <a name="l01228"></a>01228 p[width] = p[0];
  1221. <a name="l01229"></a>01229 p += backRowBytes;
  1222. <a name="l01230"></a>01230 f += screenRowBytes;
  1223. <a name="l01231"></a>01231 } <span class="comment">// for</span>
  1224. <a name="l01232"></a>01232 f = frontMem;
  1225. <a name="l01233"></a>01233 p = backMem +
  1226. <a name="l01234"></a>01234 backBorder +
  1227. <a name="l01235"></a>01235 (backBorder * backRowBytes);
  1228. <a name="l01236"></a>01236 memcpy(&amp;p[(-1 * backRowBytes) - 1],
  1229. <a name="l01237"></a>01237 &amp;p[((height - 1) * backRowBytes) - 1],
  1230. <a name="l01238"></a>01238 width + 2);
  1231. <a name="l01239"></a>01239 memcpy(&amp;p[(height * backRowBytes) - 1],
  1232. <a name="l01240"></a>01240 &amp;p[-1],
  1233. <a name="l01241"></a>01241 width + 2);
  1234. <a name="l01242"></a>01242 <span class="keywordflow">break</span>;
  1235. <a name="l01243"></a>01243
  1236. <a name="l01244"></a>01244 <span class="keywordflow">case</span> 4:
  1237. <a name="l01245"></a>01245 <span class="comment">// copy front to back, truncate edges</span>
  1238. <a name="l01246"></a>01246 <span class="keywordflow">for</span> (yy = 0; yy &lt; height; yy++) {
  1239. <a name="l01247"></a>01247 memcpy(p, f, width);
  1240. <a name="l01248"></a>01248 p[-1] = p[0];
  1241. <a name="l01249"></a>01249 p[width] = p[width - 1];
  1242. <a name="l01250"></a>01250 p += backRowBytes;
  1243. <a name="l01251"></a>01251 f += screenRowBytes;
  1244. <a name="l01252"></a>01252 } <span class="comment">// for</span>
  1245. <a name="l01253"></a>01253 f = frontMem;
  1246. <a name="l01254"></a>01254 p = backMem +
  1247. <a name="l01255"></a>01255 backBorder +
  1248. <a name="l01256"></a>01256 (backBorder * backRowBytes);
  1249. <a name="l01257"></a>01257 memcpy(&amp;p[(-1 * backRowBytes) - 1],
  1250. <a name="l01258"></a>01258 &amp;p[-1],
  1251. <a name="l01259"></a>01259 width + 2);
  1252. <a name="l01260"></a>01260 memcpy(&amp;p[(height * backRowBytes) - 1],
  1253. <a name="l01261"></a>01261 &amp;p[((height - 1) * backRowBytes) - 1],
  1254. <a name="l01262"></a>01262 width + 2);
  1255. <a name="l01263"></a>01263 <span class="keywordflow">break</span>;
  1256. <a name="l01264"></a>01264
  1257. <a name="l01265"></a>01265 <span class="keywordflow">case</span> 5:
  1258. <a name="l01266"></a>01266 {
  1259. <a name="l01267"></a>01267 <span class="comment">// copy edges from screen, don't wrap</span>
  1260. <a name="l01268"></a>01268 <span class="comment">// Mind those screen edge conditions!</span>
  1261. <a name="l01269"></a>01269 <span class="keywordtype">long</span> left = (x == 0);
  1262. <a name="l01270"></a>01270 <span class="keywordtype">long</span> right = (x + width == screenWidth);
  1263. <a name="l01271"></a>01271 <span class="keywordtype">long</span> top = (y == 0);
  1264. <a name="l01272"></a>01272 <span class="keywordtype">long</span> bottom = (y + height == screenHeight);
  1265. <a name="l01273"></a>01273
  1266. <a name="l01274"></a>01274 <span class="keywordflow">if</span> (!left &amp;&amp; !right &amp;&amp; !top &amp;&amp; !bottom) {
  1267. <a name="l01275"></a>01275 p -= backRowBytes + 1;
  1268. <a name="l01276"></a>01276 f -= screenRowBytes + 1;
  1269. <a name="l01277"></a>01277
  1270. <a name="l01278"></a>01278 <span class="keywordflow">for</span> (yy = -1; yy &lt;= height; yy++) {
  1271. <a name="l01279"></a>01279 memcpy(p, f, width + 2);
  1272. <a name="l01280"></a>01280 p += backRowBytes;
  1273. <a name="l01281"></a>01281 f += screenRowBytes;
  1274. <a name="l01282"></a>01282 } <span class="comment">// for</span>
  1275. <a name="l01283"></a>01283 } <span class="keywordflow">else</span> {
  1276. <a name="l01284"></a>01284 left = left
  1277. <a name="l01285"></a>01285 ? (0)
  1278. <a name="l01286"></a>01286 : (-1);
  1279. <a name="l01287"></a>01287 right = right
  1280. <a name="l01288"></a>01288 ? (width - 1)
  1281. <a name="l01289"></a>01289 : (width);
  1282. <a name="l01290"></a>01290 top = top
  1283. <a name="l01291"></a>01291 ? (0)
  1284. <a name="l01292"></a>01292 : (-screenRowBytes);
  1285. <a name="l01293"></a>01293 bottom = bottom
  1286. <a name="l01294"></a>01294 ? ((height - 1) * screenRowBytes)
  1287. <a name="l01295"></a>01295 : (height * screenRowBytes);
  1288. <a name="l01296"></a>01296
  1289. <a name="l01297"></a>01297 p[-backRowBytes - 1] =
  1290. <a name="l01298"></a>01298 f[left + top];
  1291. <a name="l01299"></a>01299
  1292. <a name="l01300"></a>01300 memcpy(p - backRowBytes,
  1293. <a name="l01301"></a>01301 f + top,
  1294. <a name="l01302"></a>01302 width);
  1295. <a name="l01303"></a>01303
  1296. <a name="l01304"></a>01304 p[-backRowBytes + width] =
  1297. <a name="l01305"></a>01305 f[right + top];
  1298. <a name="l01306"></a>01306
  1299. <a name="l01307"></a>01307 p[(height * backRowBytes) - 1] =
  1300. <a name="l01308"></a>01308 f[left + bottom];
  1301. <a name="l01309"></a>01309
  1302. <a name="l01310"></a>01310 memcpy(p + (height * backRowBytes),
  1303. <a name="l01311"></a>01311 f + bottom,
  1304. <a name="l01312"></a>01312 width);
  1305. <a name="l01313"></a>01313
  1306. <a name="l01314"></a>01314 p[(height * backRowBytes) + width] =
  1307. <a name="l01315"></a>01315 f[right + bottom];
  1308. <a name="l01316"></a>01316
  1309. <a name="l01317"></a>01317 <span class="keywordflow">for</span> (yy = 0; yy &lt; height; yy++) {
  1310. <a name="l01318"></a>01318 p[-1] = f[left];
  1311. <a name="l01319"></a>01319 memcpy(p, f, width);
  1312. <a name="l01320"></a>01320 p[width] = f[right];
  1313. <a name="l01321"></a>01321 p += backRowBytes;
  1314. <a name="l01322"></a>01322 f += screenRowBytes;
  1315. <a name="l01323"></a>01323 } <span class="comment">// for</span>
  1316. <a name="l01324"></a>01324 } <span class="comment">// if</span>
  1317. <a name="l01325"></a>01325 }
  1318. <a name="l01326"></a>01326 <span class="keywordflow">break</span>;
  1319. <a name="l01327"></a>01327
  1320. <a name="l01328"></a>01328 <span class="keywordflow">case</span> 6:
  1321. <a name="l01329"></a>01329 <span class="comment">// copy front to back, and wrap 2 pixel edges</span>
  1322. <a name="l01330"></a>01330 <span class="keywordflow">for</span> (yy = 0; yy &lt; height; yy++) {
  1323. <a name="l01331"></a>01331 memcpy(p, f, width);
  1324. <a name="l01332"></a>01332 p[-1] = p[width - 1];
  1325. <a name="l01333"></a>01333 p[-2] = p[width - 2];
  1326. <a name="l01334"></a>01334 p[width] = p[0];
  1327. <a name="l01335"></a>01335 p[width + 1] = p[1];
  1328. <a name="l01336"></a>01336 p += backRowBytes;
  1329. <a name="l01337"></a>01337 f += screenRowBytes;
  1330. <a name="l01338"></a>01338 } <span class="comment">// for</span>
  1331. <a name="l01339"></a>01339 f = frontMem;
  1332. <a name="l01340"></a>01340 p = backMem +
  1333. <a name="l01341"></a>01341 backBorder +
  1334. <a name="l01342"></a>01342 (backBorder * backRowBytes);
  1335. <a name="l01343"></a>01343 memcpy(&amp;p[(-1 * backRowBytes) - 2],
  1336. <a name="l01344"></a>01344 &amp;p[((height - 1) * backRowBytes) - 2],
  1337. <a name="l01345"></a>01345 width + 4);
  1338. <a name="l01346"></a>01346 memcpy(&amp;p[(-2 * backRowBytes) - 2],
  1339. <a name="l01347"></a>01347 &amp;p[((height - 2) * backRowBytes) - 2],
  1340. <a name="l01348"></a>01348 width + 4);
  1341. <a name="l01349"></a>01349 memcpy(&amp;p[(height * backRowBytes) - 2],
  1342. <a name="l01350"></a>01350 &amp;p[-2],
  1343. <a name="l01351"></a>01351 width + 4);
  1344. <a name="l01352"></a>01352 memcpy(&amp;p[((height + 1) * backRowBytes) - 2],
  1345. <a name="l01353"></a>01353 &amp;p[-2 + backRowBytes],
  1346. <a name="l01354"></a>01354 width + 4);
  1347. <a name="l01355"></a>01355 <span class="keywordflow">break</span>;
  1348. <a name="l01356"></a>01356
  1349. <a name="l01357"></a>01357 } <span class="comment">// switch wrap</span>
  1350. <a name="l01358"></a>01358 }
  1351. <a name="l01359"></a>01359
  1352. <a name="l01360"></a>01360
  1353. <a name="l01361"></a>01361 <span class="keywordtype">void</span> CellEngine::PumpToFront()
  1354. <a name="l01362"></a>01362 {
  1355. <a name="l01363"></a>01363 <span class="keywordflow">switch</span> (neighborhood) {
  1356. <a name="l01364"></a>01364 <span class="keywordflow">case</span> -1:
  1357. <a name="l01365"></a>01365 <span class="keywordflow">break</span>;
  1358. <a name="l01366"></a>01366 <span class="keywordflow">case</span> 0:
  1359. <a name="l01367"></a>01367 <span class="keywordflow">case</span> 1:
  1360. <a name="l01368"></a>01368 n_moore_a();
  1361. <a name="l01369"></a>01369 <span class="keywordflow">break</span>;
  1362. <a name="l01370"></a>01370 <span class="keywordflow">case</span> 2:
  1363. <a name="l01371"></a>01371 n_moore_ab();
  1364. <a name="l01372"></a>01372 <span class="keywordflow">break</span>;
  1365. <a name="l01373"></a>01373 <span class="keywordflow">case</span> 3:
  1366. <a name="l01374"></a>01374 n_vonn_neumann();
  1367. <a name="l01375"></a>01375 <span class="keywordflow">break</span>;
  1368. <a name="l01376"></a>01376 <span class="keywordflow">case</span> 4:
  1369. <a name="l01377"></a>01377 n_margolis();
  1370. <a name="l01378"></a>01378 <span class="keywordflow">break</span>;
  1371. <a name="l01379"></a>01379 <span class="keywordflow">case</span> 5:
  1372. <a name="l01380"></a>01380 n_margolis_ph();
  1373. <a name="l01381"></a>01381 <span class="keywordflow">break</span>;
  1374. <a name="l01382"></a>01382 <span class="keywordflow">case</span> 6:
  1375. <a name="l01383"></a>01383 n_margolis_hv();
  1376. <a name="l01384"></a>01384 <span class="keywordflow">break</span>;
  1377. <a name="l01385"></a>01385 <span class="keywordflow">case</span> 7:
  1378. <a name="l01386"></a>01386 n_life();
  1379. <a name="l01387"></a>01387 <span class="keywordflow">break</span>;
  1380. <a name="l01388"></a>01388 <span class="keywordflow">case</span> 8:
  1381. <a name="l01389"></a>01389 n_brain();
  1382. <a name="l01390"></a>01390 <span class="keywordflow">break</span>;
  1383. <a name="l01391"></a>01391 <span class="keywordflow">case</span> 9:
  1384. <a name="l01392"></a>01392 n_heat();
  1385. <a name="l01393"></a>01393 <span class="keywordflow">break</span>;
  1386. <a name="l01394"></a>01394 <span class="keywordflow">case</span> 10:
  1387. <a name="l01395"></a>01395 n_dheat();
  1388. <a name="l01396"></a>01396 <span class="keywordflow">break</span>;
  1389. <a name="l01397"></a>01397 <span class="keywordflow">case</span> 11:
  1390. <a name="l01398"></a>01398 n_lheat();
  1391. <a name="l01399"></a>01399 <span class="keywordflow">break</span>;
  1392. <a name="l01400"></a>01400 <span class="keywordflow">case</span> 12:
  1393. <a name="l01401"></a>01401 n_ldheat();
  1394. <a name="l01402"></a>01402 <span class="keywordflow">break</span>;
  1395. <a name="l01403"></a>01403 <span class="keywordflow">case</span> 13:
  1396. <a name="l01404"></a>01404 n_ranch();
  1397. <a name="l01405"></a>01405 <span class="keywordflow">break</span>;
  1398. <a name="l01406"></a>01406 <span class="keywordflow">case</span> 14:
  1399. <a name="l01407"></a>01407 n_anneal();
  1400. <a name="l01408"></a>01408 <span class="keywordflow">break</span>;
  1401. <a name="l01409"></a>01409 <span class="keywordflow">case</span> 15:
  1402. <a name="l01410"></a>01410 n_anneal4();
  1403. <a name="l01411"></a>01411 <span class="keywordflow">break</span>;
  1404. <a name="l01412"></a>01412 <span class="keywordflow">case</span> 16:
  1405. <a name="l01413"></a>01413 n_anneal8();
  1406. <a name="l01414"></a>01414 <span class="keywordflow">break</span>;
  1407. <a name="l01415"></a>01415 <span class="keywordflow">case</span> 17:
  1408. <a name="l01416"></a>01416 n_eco();
  1409. <a name="l01417"></a>01417 <span class="keywordflow">break</span>;
  1410. <a name="l01418"></a>01418 <span class="keywordflow">case</span> 18:
  1411. <a name="l01419"></a>01419 n_abdheat();
  1412. <a name="l01420"></a>01420 <span class="keywordflow">break</span>;
  1413. <a name="l01421"></a>01421 <span class="keywordflow">case</span> 19:
  1414. <a name="l01422"></a>01422 n_edheat();
  1415. <a name="l01423"></a>01423 <span class="keywordflow">break</span>;
  1416. <a name="l01424"></a>01424 <span class="keywordflow">case</span> 20:
  1417. <a name="l01425"></a>01425 n_abcdheat();
  1418. <a name="l01426"></a>01426 <span class="keywordflow">break</span>;
  1419. <a name="l01427"></a>01427 <span class="keywordflow">case</span> 21:
  1420. <a name="l01428"></a>01428 n_torben();
  1421. <a name="l01429"></a>01429 <span class="keywordflow">break</span>;
  1422. <a name="l01430"></a>01430 <span class="keywordflow">case</span> 22:
  1423. <a name="l01431"></a>01431 n_torben2();
  1424. <a name="l01432"></a>01432 <span class="keywordflow">break</span>;
  1425. <a name="l01433"></a>01433 <span class="keywordflow">case</span> 23:
  1426. <a name="l01434"></a>01434 n_torben3();
  1427. <a name="l01435"></a>01435 <span class="keywordflow">break</span>;
  1428. <a name="l01436"></a>01436 <span class="keywordflow">case</span> 24:
  1429. <a name="l01437"></a>01437 n_torben4();
  1430. <a name="l01438"></a>01438 <span class="keywordflow">break</span>;
  1431. <a name="l01439"></a>01439 <span class="keywordflow">case</span> 25:
  1432. <a name="l01440"></a>01440 n_ball();
  1433. <a name="l01441"></a>01441 <span class="keywordflow">break</span>;
  1434. <a name="l01442"></a>01442 <span class="keywordflow">case</span> 26:
  1435. <a name="l01443"></a>01443 n_fdheat();
  1436. <a name="l01444"></a>01444 <span class="keywordflow">break</span>;
  1437. <a name="l01445"></a>01445 <span class="keywordflow">case</span> 27:
  1438. <a name="l01446"></a>01446 n_fabcdheat();
  1439. <a name="l01447"></a>01447 <span class="keywordflow">break</span>;
  1440. <a name="l01448"></a>01448 <span class="keywordflow">case</span> 28:
  1441. <a name="l01449"></a>01449 n_risca();
  1442. <a name="l01450"></a>01450 <span class="keywordflow">break</span>;
  1443. <a name="l01451"></a>01451 <span class="keywordflow">case</span> 29:
  1444. <a name="l01452"></a>01452 n_insert();
  1445. <a name="l01453"></a>01453 <span class="keywordflow">break</span>;
  1446. <a name="l01454"></a>01454 <span class="keywordflow">case</span> 30:
  1447. <a name="l01455"></a>01455 n_heaco();
  1448. <a name="l01456"></a>01456 <span class="keywordflow">break</span>;
  1449. <a name="l01457"></a>01457 <span class="keywordflow">case</span> 31:
  1450. <a name="l01458"></a>01458 n_marble();
  1451. <a name="l01459"></a>01459 <span class="keywordflow">break</span>;
  1452. <a name="l01460"></a>01460 <span class="keywordflow">case</span> 32:
  1453. <a name="l01461"></a>01461 n_smarble();
  1454. <a name="l01462"></a>01462 <span class="keywordflow">break</span>;
  1455. <a name="l01463"></a>01463 <span class="keywordflow">case</span> 33:
  1456. <a name="l01464"></a>01464 n_farble();
  1457. <a name="l01465"></a>01465 <span class="keywordflow">break</span>;
  1458. <a name="l01466"></a>01466 <span class="keywordflow">case</span> 34:
  1459. <a name="l01467"></a>01467 n_garblebug();
  1460. <a name="l01468"></a>01468 <span class="keywordflow">break</span>;
  1461. <a name="l01469"></a>01469 <span class="keywordflow">case</span> 35:
  1462. <a name="l01470"></a>01470 n_twoheats();
  1463. <a name="l01471"></a>01471 <span class="keywordflow">break</span>;
  1464. <a name="l01472"></a>01472 <span class="keywordflow">case</span> 36:
  1465. <a name="l01473"></a>01473 n_spin();
  1466. <a name="l01474"></a>01474 <span class="keywordflow">break</span>;
  1467. <a name="l01475"></a>01475 <span class="keywordflow">case</span> 37:
  1468. <a name="l01476"></a>01476 n_driven();
  1469. <a name="l01477"></a>01477 <span class="keywordflow">break</span>;
  1470. <a name="l01478"></a>01478 <span class="keywordflow">case</span> 38:
  1471. <a name="l01479"></a>01479 n_daft();
  1472. <a name="l01480"></a>01480 <span class="keywordflow">break</span>;
  1473. <a name="l01481"></a>01481 <span class="keywordflow">case</span> 39:
  1474. <a name="l01482"></a>01482 n_spinsonly();
  1475. <a name="l01483"></a>01483 <span class="keywordflow">break</span>;
  1476. <a name="l01484"></a>01484 <span class="keywordflow">case</span> 40:
  1477. <a name="l01485"></a>01485 n_spinsbank();
  1478. <a name="l01486"></a>01486 <span class="keywordflow">break</span>;
  1479. <a name="l01487"></a>01487 <span class="keywordflow">case</span> 41:
  1480. <a name="l01488"></a>01488 n_spinsheat();
  1481. <a name="l01489"></a>01489 <span class="keywordflow">break</span>;
  1482. <a name="l01490"></a>01490 <span class="keywordflow">case</span> 42:
  1483. <a name="l01491"></a>01491 n_spinglass();
  1484. <a name="l01492"></a>01492 <span class="keywordflow">break</span>;
  1485. <a name="l01493"></a>01493 <span class="keywordflow">case</span> 43:
  1486. <a name="l01494"></a>01494 n_glassbonds();
  1487. <a name="l01495"></a>01495 <span class="keywordflow">break</span>;
  1488. <a name="l01496"></a>01496 <span class="keywordflow">case</span> 44:
  1489. <a name="l01497"></a>01497 n_glassheat();
  1490. <a name="l01498"></a>01498 <span class="keywordflow">break</span>;
  1491. <a name="l01499"></a>01499 <span class="keywordflow">case</span> 45:
  1492. <a name="l01500"></a>01500 n_faders();
  1493. <a name="l01501"></a>01501 <span class="keywordflow">break</span>;
  1494. <a name="l01502"></a>01502 <span class="keywordflow">case</span> 46:
  1495. <a name="l01503"></a>01503 n_harble();
  1496. <a name="l01504"></a>01504 <span class="keywordflow">break</span>;
  1497. <a name="l01505"></a>01505 <span class="keywordflow">case</span> 47:
  1498. <a name="l01506"></a>01506 n_perlin();
  1499. <a name="l01507"></a>01507 <span class="keywordflow">break</span>;
  1500. <a name="l01508"></a>01508 <span class="keywordflow">case</span> 48:
  1501. <a name="l01509"></a>01509 n_dendrite();
  1502. <a name="l01510"></a>01510 <span class="keywordflow">break</span>;
  1503. <a name="l01511"></a>01511 <span class="keywordflow">case</span> 49:
  1504. <a name="l01512"></a>01512 n_vanneal();
  1505. <a name="l01513"></a>01513 <span class="keywordflow">break</span>;
  1506. <a name="l01514"></a>01514 <span class="keywordflow">case</span> 50:
  1507. <a name="l01515"></a>01515 n_vanneal8();
  1508. <a name="l01516"></a>01516 <span class="keywordflow">break</span>;
  1509. <a name="l01517"></a>01517 <span class="keywordflow">case</span> 51:
  1510. <a name="l01518"></a>01518 n_garble();
  1511. <a name="l01519"></a>01519 <span class="keywordflow">break</span>;
  1512. <a name="l01520"></a>01520 <span class="keywordflow">case</span> 52:
  1513. <a name="l01521"></a>01521 n_jvn29();
  1514. <a name="l01522"></a>01522 <span class="keywordflow">break</span>;
  1515. <a name="l01523"></a>01523 <span class="keywordflow">default</span>:
  1516. <a name="l01524"></a>01524 <span class="keywordflow">break</span>;
  1517. <a name="l01525"></a>01525 } <span class="comment">// switch neighborhood</span>
  1518. <a name="l01526"></a>01526
  1519. <a name="l01527"></a>01527 phase = !phase;
  1520. <a name="l01528"></a>01528 ticks++;
  1521. <a name="l01529"></a>01529 }
  1522. <a name="l01530"></a>01530
  1523. <a name="l01531"></a>01531
  1524. <a name="l01532"></a>01532 Byte CellEngine::GetCell(
  1525. <a name="l01533"></a>01533 <span class="keywordtype">int</span> col,
  1526. <a name="l01534"></a>01534 <span class="keywordtype">int</span> row)
  1527. <a name="l01535"></a>01535 {
  1528. <a name="l01536"></a>01536 <span class="keywordflow">if</span> ((col &lt; 0) ||
  1529. <a name="l01537"></a>01537 (col &gt;= width) ||
  1530. <a name="l01538"></a>01538 (row &lt; 0) ||
  1531. <a name="l01539"></a>01539 (row &gt;= height) ||
  1532. <a name="l01540"></a>01540 (frontMem == NULL)) {
  1533. <a name="l01541"></a>01541 <span class="keywordflow">return</span> 0;
  1534. <a name="l01542"></a>01542 }
  1535. <a name="l01543"></a>01543
  1536. <a name="l01544"></a>01544 Byte cell =
  1537. <a name="l01545"></a>01545 frontMem[col + (row * screenRowBytes)];
  1538. <a name="l01546"></a>01546
  1539. <a name="l01547"></a>01547 <span class="keywordflow">return</span> cell;
  1540. <a name="l01548"></a>01548 }
  1541. <a name="l01549"></a>01549
  1542. <a name="l01550"></a>01550
  1543. <a name="l01551"></a>01551 <span class="keywordtype">void</span> CellEngine::SetCell(
  1544. <a name="l01552"></a>01552 <span class="keywordtype">int</span> col,
  1545. <a name="l01553"></a>01553 <span class="keywordtype">int</span> row,
  1546. <a name="l01554"></a>01554 Byte cell)
  1547. <a name="l01555"></a>01555 {
  1548. <a name="l01556"></a>01556 <span class="keywordflow">if</span> ((col &lt; 0) ||
  1549. <a name="l01557"></a>01557 (col &gt;= width) ||
  1550. <a name="l01558"></a>01558 (row &lt; 0) ||
  1551. <a name="l01559"></a>01559 (row &gt;= height) ||
  1552. <a name="l01560"></a>01560 (frontMem == NULL)) {
  1553. <a name="l01561"></a>01561 <span class="keywordflow">return</span>;
  1554. <a name="l01562"></a>01562 }
  1555. <a name="l01563"></a>01563
  1556. <a name="l01564"></a>01564 frontMem[col + (row * screenRowBytes)] =
  1557. <a name="l01565"></a>01565 cell;
  1558. <a name="l01566"></a>01566 }
  1559. <a name="l01567"></a>01567
  1560. <a name="l01568"></a>01568
  1561. <a name="l01569"></a>01569 <span class="keywordtype">void</span> *CellEngine::GetCellBuffer()
  1562. <a name="l01570"></a>01570 {
  1563. <a name="l01571"></a>01571 <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)frontMem;
  1564. <a name="l01572"></a>01572 }
  1565. <a name="l01573"></a>01573
  1566. <a name="l01574"></a>01574
  1567. <a name="l01575"></a>01575 <span class="keywordtype">void</span> CellEngine::n_moore_a()
  1568. <a name="l01576"></a>01576 {
  1569. <a name="l01577"></a>01577 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
  1570. <a name="l01578"></a>01578
  1571. <a name="l01579"></a>01579 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
  1572. <a name="l01580"></a>01580 <span class="comment">// c c' se sw ne nw e w s n</span>
  1573. <a name="l01581"></a>01581 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
  1574. <a name="l01582"></a>01582
  1575. <a name="l01583"></a>01583 <span class="preprocessor">#define MOORE_A ( \</span>
  1576. <a name="l01584"></a>01584 <span class="preprocessor"> ((nw &amp; 1) &lt;&lt; 5) | \</span>
  1577. <a name="l01585"></a>01585 <span class="preprocessor"> ((n &amp; 1) &lt;&lt; 9) | \</span>
  1578. <a name="l01586"></a>01586 <span class="preprocessor"> ((ne &amp; 1) &lt;&lt; 4) | \</span>
  1579. <a name="l01587"></a>01587 <span class="preprocessor"> ((w &amp; 1) &lt;&lt; 7) | \</span>
  1580. <a name="l01588"></a>01588 <span class="preprocessor"> ((c &amp; 3) &lt;&lt; 0) | \</span>
  1581. <a name="l01589"></a>01589 <span class="preprocessor"> ((e &amp; 1) &lt;&lt; 6) | \</span>
  1582. <a name="l01590"></a>01590 <span class="preprocessor"> ((sw &amp; 1) &lt;&lt; 3) | \</span>
  1583. <a name="l01591"></a>01591 <span class="preprocessor"> ((s &amp; 1) &lt;&lt; 8) | \</span>
  1584. <a name="l01592"></a>01592 <span class="preprocessor"> ((se &amp; 1) &lt;&lt; 2))</span>
  1585. <a name="l01593"></a>01593 <span class="preprocessor"></span>
  1586. <a name="l01594"></a>01594 <span class="keywordflow">if</span> (inflation) {
  1587. <a name="l01595"></a>01595 <span class="keywordtype">int</span> last = 0;
  1588. <a name="l01596"></a>01596 <span class="keywordtype">int</span> heat = 0;
  1589. <a name="l01597"></a>01597
  1590. <a name="l01598"></a>01598 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MOORE_A)
  1591. <a name="l01599"></a>01599 } <span class="keywordflow">else</span> {
  1592. <a name="l01600"></a>01600 CAM_MASKED_REG_TABLE_LOOP(MOORE_A)
  1593. <a name="l01601"></a>01601 } <span class="comment">// if</span>
  1594. <a name="l01602"></a>01602 }
  1595. <a name="l01603"></a>01603
  1596. <a name="l01604"></a>01604
  1597. <a name="l01605"></a>01605 <span class="keywordtype">void</span> CellEngine::n_moore_ab()
  1598. <a name="l01606"></a>01606 {
  1599. <a name="l01607"></a>01607 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
  1600. <a name="l01608"></a>01608
  1601. <a name="l01609"></a>01609 <span class="comment">// 0 1 2 3 4 5 6 7 8 9 10 11</span>
  1602. <a name="l01610"></a>01610 <span class="comment">// c c' se sw ne nw e w s n &amp;c &amp;c'</span>
  1603. <a name="l01611"></a>01611 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200 0x400 0x800</span>
  1604. <a name="l01612"></a>01612
  1605. <a name="l01613"></a>01613 <span class="preprocessor">#define MOORE_AB ( \</span>
  1606. <a name="l01614"></a>01614 <span class="preprocessor"> MOORE_A | \</span>
  1607. <a name="l01615"></a>01615 <span class="preprocessor"> ((c &amp; 0x0c) &lt;&lt; 8))</span>
  1608. <a name="l01616"></a>01616 <span class="preprocessor"></span>
  1609. <a name="l01617"></a>01617 <span class="keywordflow">if</span> (inflation) {
  1610. <a name="l01618"></a>01618 <span class="keywordtype">int</span> last = 0;
  1611. <a name="l01619"></a>01619 <span class="keywordtype">int</span> heat = 0;
  1612. <a name="l01620"></a>01620
  1613. <a name="l01621"></a>01621 CAM_MASKED_REG_TABLE_HEAT4_LOOP(MOORE_AB)
  1614. <a name="l01622"></a>01622 } <span class="keywordflow">else</span> {
  1615. <a name="l01623"></a>01623 CAM_MASKED_REG_TABLE_LOOP(MOORE_AB)
  1616. <a name="l01624"></a>01624 } <span class="comment">// if</span>
  1617. <a name="l01625"></a>01625 }
  1618. <a name="l01626"></a>01626
  1619. <a name="l01627"></a>01627
  1620. <a name="l01628"></a>01628 <span class="keywordtype">void</span> CellEngine::n_vonn_neumann()
  1621. <a name="l01629"></a>01629 {
  1622. <a name="l01630"></a>01630 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
  1623. <a name="l01631"></a>01631
  1624. <a name="l01632"></a>01632 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
  1625. <a name="l01633"></a>01633 <span class="comment">// c c' e' w' s' n' e w s n</span>
  1626. <a name="l01634"></a>01634 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
  1627. <a name="l01635"></a>01635
  1628. <a name="l01636"></a>01636 <span class="preprocessor">#define VON_NEUMANN ( \</span>
  1629. <a name="l01637"></a>01637 <span class="preprocessor"> ((c &amp; 3) &lt;&lt; 0) | \</span>
  1630. <a name="l01638"></a>01638 <span class="preprocessor"> ((e &amp; 1) &lt;&lt; 6) | \</span>
  1631. <a name="l01639"></a>01639 <span class="preprocessor"> ((e &amp; 2) &lt;&lt; 1) | \</span>
  1632. <a name="l01640"></a>01640 <span class="preprocessor"> ((w &amp; 1) &lt;&lt; 7) | \</span>
  1633. <a name="l01641"></a>01641 <span class="preprocessor"> ((w &amp; 2) &lt;&lt; 2) | \</span>
  1634. <a name="l01642"></a>01642 <span class="preprocessor"> ((s &amp; 1) &lt;&lt; 8) | \</span>
  1635. <a name="l01643"></a>01643 <span class="preprocessor"> ((s &amp; 2) &lt;&lt; 3) | \</span>
  1636. <a name="l01644"></a>01644 <span class="preprocessor"> ((n &amp; 1) &lt;&lt; 9) | \</span>
  1637. <a name="l01645"></a>01645 <span class="preprocessor"> ((n &amp; 2) &lt;&lt; 4))</span>
  1638. <a name="l01646"></a>01646 <span class="preprocessor"></span>
  1639. <a name="l01647"></a>01647 <span class="keywordflow">if</span> (inflation) {
  1640. <a name="l01648"></a>01648 <span class="keywordtype">int</span> last = 0;
  1641. <a name="l01649"></a>01649 <span class="keywordtype">int</span> heat = 0;
  1642. <a name="l01650"></a>01650
  1643. <a name="l01651"></a>01651 CAM_MASKED_REG_TABLE_HEAT6_LOOP(VON_NEUMANN)
  1644. <a name="l01652"></a>01652 } <span class="keywordflow">else</span> {
  1645. <a name="l01653"></a>01653 CAM_MASKED_REG_TABLE_LOOP(VON_NEUMANN)
  1646. <a name="l01654"></a>01654 }
  1647. <a name="l01655"></a>01655 }
  1648. <a name="l01656"></a>01656
  1649. <a name="l01657"></a>01657
  1650. <a name="l01658"></a>01658 <span class="keywordtype">void</span> CellEngine::n_margolis()
  1651. <a name="l01659"></a>01659 {
  1652. <a name="l01660"></a>01660 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
  1653. <a name="l01661"></a>01661
  1654. <a name="l01662"></a>01662 <span class="keyword">register</span> Byte i;
  1655. <a name="l01663"></a>01663
  1656. <a name="l01664"></a>01664 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
  1657. <a name="l01665"></a>01665 <span class="comment">// c c' cw ccw opp cw' ccw' opp'</span>
  1658. <a name="l01666"></a>01666 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
  1659. <a name="l01667"></a>01667
  1660. <a name="l01668"></a>01668 <span class="preprocessor">#define MARGOLIS_ODD ( \</span>
  1661. <a name="l01669"></a>01669 <span class="preprocessor"> </span><span class="comment">/* c c' */</span> \
  1662. <a name="l01670"></a>01670 (c &amp; 3) | \
  1663. <a name="l01671"></a>01671 <span class="comment">/* cw cw' */</span> \
  1664. <a name="l01672"></a>01672 (i = ((xx &amp; 1) ? ((yy &amp; 1) ? (e &amp; 3) : (n &amp; 3)) \
  1665. <a name="l01673"></a>01673 : ((yy &amp; 1) ? (s &amp; 3) : (w &amp; 3))), \
  1666. <a name="l01674"></a>01674 (((i &amp; 1) &lt;&lt; 2) | ((i &amp; 2) &lt;&lt; 4))) | \
  1667. <a name="l01675"></a>01675 <span class="comment">/* ccw ccw' */</span> \
  1668. <a name="l01676"></a>01676 (i = ((xx &amp; 1) ? ((yy &amp; 1) ? (s &amp; 3) : (e &amp; 3)) \
  1669. <a name="l01677"></a>01677 : ((yy &amp; 1) ? (w &amp; 3) : (n &amp; 3))), \
  1670. <a name="l01678"></a>01678 (((i &amp; 1) &lt;&lt; 3) | ((i &amp; 2) &lt;&lt; 5))) | \
  1671. <a name="l01679"></a>01679 <span class="comment">/* opp opp' */</span> \
  1672. <a name="l01680"></a>01680 (i = ((xx &amp; 1) ? ((yy &amp; 1) ? (se &amp; 3) : (ne &amp; 3)) \
  1673. <a name="l01681"></a>01681 : ((yy &amp; 1) ? (sw &amp; 3) : (nw &amp; 3))), \
  1674. <a name="l01682"></a>01682 (((i &amp; 1) &lt;&lt; 4) | ((i &amp; 2) &lt;&lt; 6))))
  1675. <a name="l01683"></a>01683
  1676. <a name="l01684"></a>01684 <span class="preprocessor">#define MARGOLIS_EVEN ( \</span>
  1677. <a name="l01685"></a>01685 <span class="preprocessor"> </span><span class="comment">/* c c' */</span> \
  1678. <a name="l01686"></a>01686 (c &amp; 3) | \
  1679. <a name="l01687"></a>01687 <span class="comment">/* cw cw' */</span> \
  1680. <a name="l01688"></a>01688 (i = ((xx &amp; 1) ? ((yy &amp; 1) ? (w &amp; 3) : (s &amp; 3)) \
  1681. <a name="l01689"></a>01689 : ((yy &amp; 1) ? (n &amp; 3) : (e &amp; 3))), \
  1682. <a name="l01690"></a>01690 (((i &amp; 1) &lt;&lt; 2) | ((i &amp; 2) &lt;&lt; 4))) | \
  1683. <a name="l01691"></a>01691 <span class="comment">/* ccw ccw' */</span> \
  1684. <a name="l01692"></a>01692 (i = ((xx &amp; 1) ? ((yy &amp; 1) ? (n &amp; 3) : (w &amp; 3)) \
  1685. <a name="l01693"></a>01693 : ((yy &amp; 1) ? (e &amp; 3) : (s &amp; 3))), \
  1686. <a name="l01694"></a>01694 (((i &amp; 1) &lt;&lt; 3) | ((i &amp; 2) &lt;&lt; 5))) | \
  1687. <a name="l01695"></a>01695 <span class="comment">/* opp opp' */</span> \
  1688. <a name="l01696"></a>01696 (i = ((xx &amp; 1) ? ((yy &amp; 1) ? (nw &amp; 3) : (sw &amp; 3)) \
  1689. <a name="l01697"></a>01697 : ((yy &amp; 1) ? (ne &amp; 3) : (se &amp; 3))), \
  1690. <a name="l01698"></a>01698 (((i &amp; 1) &lt;&lt; 4) | ((i &amp; 2) &lt;&lt; 6))))
  1691. <a name="l01699"></a>01699
  1692. <a name="l01700"></a>01700 <span class="keywordflow">if</span> (inflation) {
  1693. <a name="l01701"></a>01701 <span class="keywordtype">int</span> last = 0;
  1694. <a name="l01702"></a>01702 <span class="keywordtype">int</span> heat = 0;
  1695. <a name="l01703"></a>01703
  1696. <a name="l01704"></a>01704 <span class="keywordflow">if</span> (phase) {
  1697. <a name="l01705"></a>01705 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_ODD)
  1698. <a name="l01706"></a>01706 } <span class="keywordflow">else</span> {
  1699. <a name="l01707"></a>01707 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_EVEN)
  1700. <a name="l01708"></a>01708 }
  1701. <a name="l01709"></a>01709 } <span class="keywordflow">else</span> {
  1702. <a name="l01710"></a>01710 <span class="keywordflow">if</span> (phase) {
  1703. <a name="l01711"></a>01711 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_ODD)
  1704. <a name="l01712"></a>01712 } <span class="keywordflow">else</span> {
  1705. <a name="l01713"></a>01713 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_EVEN)
  1706. <a name="l01714"></a>01714 }
  1707. <a name="l01715"></a>01715 }
  1708. <a name="l01716"></a>01716 }
  1709. <a name="l01717"></a>01717
  1710. <a name="l01718"></a>01718
  1711. <a name="l01719"></a>01719 <span class="keywordtype">void</span> CellEngine::n_margolis_ph()
  1712. <a name="l01720"></a>01720 {
  1713. <a name="l01721"></a>01721 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
  1714. <a name="l01722"></a>01722
  1715. <a name="l01723"></a>01723 <span class="keyword">register</span> Byte i;
  1716. <a name="l01724"></a>01724
  1717. <a name="l01725"></a>01725 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
  1718. <a name="l01726"></a>01726 <span class="comment">// c c' cw ccw opp cw' ccw' opp' pha pha'</span>
  1719. <a name="l01727"></a>01727 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
  1720. <a name="l01728"></a>01728
  1721. <a name="l01729"></a>01729 <span class="preprocessor">#define MARGOLIS_ODD_PH ( \</span>
  1722. <a name="l01730"></a>01730 <span class="preprocessor"> MARGOLIS_ODD | \</span>
  1723. <a name="l01731"></a>01731 <span class="preprocessor"> 0x100)</span>
  1724. <a name="l01732"></a>01732 <span class="preprocessor"></span>
  1725. <a name="l01733"></a>01733 <span class="preprocessor">#define MARGOLIS_EVEN_PH ( \</span>
  1726. <a name="l01734"></a>01734 <span class="preprocessor"> MARGOLIS_EVEN | \</span>
  1727. <a name="l01735"></a>01735 <span class="preprocessor"> 0x200)</span>
  1728. <a name="l01736"></a>01736 <span class="preprocessor"></span>
  1729. <a name="l01737"></a>01737 <span class="keywordflow">if</span> (inflation) {
  1730. <a name="l01738"></a>01738 <span class="keywordtype">int</span> last = 0;
  1731. <a name="l01739"></a>01739 <span class="keywordtype">int</span> heat = 0;
  1732. <a name="l01740"></a>01740
  1733. <a name="l01741"></a>01741 <span class="keywordflow">if</span> (phase) {
  1734. <a name="l01742"></a>01742 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_ODD_PH)
  1735. <a name="l01743"></a>01743 } <span class="keywordflow">else</span> {
  1736. <a name="l01744"></a>01744 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_EVEN_PH)
  1737. <a name="l01745"></a>01745 }
  1738. <a name="l01746"></a>01746 } <span class="keywordflow">else</span> {
  1739. <a name="l01747"></a>01747 <span class="keywordflow">if</span> (phase) {
  1740. <a name="l01748"></a>01748 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_ODD_PH)
  1741. <a name="l01749"></a>01749 } <span class="keywordflow">else</span> {
  1742. <a name="l01750"></a>01750 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_EVEN_PH)
  1743. <a name="l01751"></a>01751 }
  1744. <a name="l01752"></a>01752 }
  1745. <a name="l01753"></a>01753 }
  1746. <a name="l01754"></a>01754
  1747. <a name="l01755"></a>01755
  1748. <a name="l01756"></a>01756 <span class="keywordtype">void</span> CellEngine::n_margolis_hv()
  1749. <a name="l01757"></a>01757 {
  1750. <a name="l01758"></a>01758 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
  1751. <a name="l01759"></a>01759
  1752. <a name="l01760"></a>01760 <span class="keyword">register</span> Byte i;
  1753. <a name="l01761"></a>01761
  1754. <a name="l01762"></a>01762 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
  1755. <a name="l01763"></a>01763 <span class="comment">// c c' cw ccw opp cw' ccw' opp' horz vert</span>
  1756. <a name="l01764"></a>01764 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
  1757. <a name="l01765"></a>01765
  1758. <a name="l01766"></a>01766 <span class="preprocessor">#define MARGOLIS_ODD_HV ( \</span>
  1759. <a name="l01767"></a>01767 <span class="preprocessor"> MARGOLIS_ODD | \</span>
  1760. <a name="l01768"></a>01768 <span class="preprocessor"> ((xx &amp; 1) &lt;&lt; 8) | \</span>
  1761. <a name="l01769"></a>01769 <span class="preprocessor"> ((yy &amp; 1) &lt;&lt; 9))</span>
  1762. <a name="l01770"></a>01770 <span class="preprocessor"></span>
  1763. <a name="l01771"></a>01771 <span class="preprocessor">#define MARGOLIS_EVEN_HV ( \</span>
  1764. <a name="l01772"></a>01772 <span class="preprocessor"> MARGOLIS_EVEN | \</span>
  1765. <a name="l01773"></a>01773 <span class="preprocessor"> ((xx &amp; 1) &lt;&lt; 8) | \</span>
  1766. <a name="l01774"></a>01774 <span class="preprocessor"> ((yy &amp; 1) &lt;&lt; 9))</span>
  1767. <a name="l01775"></a>01775 <span class="preprocessor"></span>
  1768. <a name="l01776"></a>01776 <span class="keywordflow">if</span> (inflation) {
  1769. <a name="l01777"></a>01777 <span class="keywordtype">int</span> last = 0;
  1770. <a name="l01778"></a>01778 <span class="keywordtype">int</span> heat = 0;
  1771. <a name="l01779"></a>01779
  1772. <a name="l01780"></a>01780 <span class="keywordflow">if</span> (phase) {
  1773. <a name="l01781"></a>01781 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_ODD_HV)
  1774. <a name="l01782"></a>01782 } <span class="keywordflow">else</span> {
  1775. <a name="l01783"></a>01783 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_EVEN_HV)
  1776. <a name="l01784"></a>01784 }
  1777. <a name="l01785"></a>01785 } <span class="keywordflow">else</span> {
  1778. <a name="l01786"></a>01786 <span class="keywordflow">if</span> (phase) {
  1779. <a name="l01787"></a>01787 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_ODD_HV)
  1780. <a name="l01788"></a>01788 } <span class="keywordflow">else</span> {
  1781. <a name="l01789"></a>01789 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_EVEN_HV)
  1782. <a name="l01790"></a>01790 }
  1783. <a name="l01791"></a>01791 }
  1784. <a name="l01792"></a>01792 }
  1785. <a name="l01793"></a>01793
  1786. <a name="l01794"></a>01794
  1787. <a name="l01795"></a>01795 <span class="keywordtype">void</span> CellEngine::n_life()
  1788. <a name="l01796"></a>01796 {
  1789. <a name="l01797"></a>01797 <span class="keywordtype">long</span> sum;
  1790. <a name="l01798"></a>01798
  1791. <a name="l01799"></a>01799 <span class="preprocessor">#define LIFE ( \</span>
  1792. <a name="l01800"></a>01800 <span class="preprocessor"> ((c &amp; 1) \</span>
  1793. <a name="l01801"></a>01801 <span class="preprocessor"> ? (((sum = SUM8REG(1)) == 2) || \</span>
  1794. <a name="l01802"></a>01802 <span class="preprocessor"> (sum == 3)) \</span>
  1795. <a name="l01803"></a>01803 <span class="preprocessor"> : ((SUM8REG(1) == 3) ? 1 : 0)) | \</span>
  1796. <a name="l01804"></a>01804 <span class="preprocessor"> ((c &amp; 0x7f) &lt;&lt; 1))</span>
  1797. <a name="l01805"></a>01805 <span class="preprocessor"></span>
  1798. <a name="l01806"></a>01806 <span class="keywordflow">if</span> (inflation) {
  1799. <a name="l01807"></a>01807 <span class="keywordtype">int</span> last = 0;
  1800. <a name="l01808"></a>01808 <span class="keywordtype">int</span> heat = 0;
  1801. <a name="l01809"></a>01809
  1802. <a name="l01810"></a>01810 CAM_MASKED_REG_HEAT6_LOOP(LIFE)
  1803. <a name="l01811"></a>01811 } <span class="keywordflow">else</span> {
  1804. <a name="l01812"></a>01812 CAM_MASKED_REG_LOOP(LIFE)
  1805. <a name="l01813"></a>01813 }
  1806. <a name="l01814"></a>01814 }
  1807. <a name="l01815"></a>01815
  1808. <a name="l01816"></a>01816
  1809. <a name="l01817"></a>01817 <span class="keywordtype">void</span> CellEngine::n_brain()
  1810. <a name="l01818"></a>01818 {
  1811. <a name="l01819"></a>01819
  1812. <a name="l01820"></a>01820 <span class="preprocessor">#define BRAIN ( \</span>
  1813. <a name="l01821"></a>01821 <span class="preprocessor"> (((c &amp; 0x03) == 0) \</span>
  1814. <a name="l01822"></a>01822 <span class="preprocessor"> ? ((SUM8REG(1) == 2) ? 1 : 0) \</span>
  1815. <a name="l01823"></a>01823 <span class="preprocessor"> : 0) | \</span>
  1816. <a name="l01824"></a>01824 <span class="preprocessor"> ((c &lt;&lt; 1) &amp; 0xfe))</span>
  1817. <a name="l01825"></a>01825 <span class="preprocessor"></span>
  1818. <a name="l01826"></a>01826 <span class="keywordflow">if</span> (inflation) {
  1819. <a name="l01827"></a>01827 <span class="keywordtype">int</span> last = 0;
  1820. <a name="l01828"></a>01828 <span class="keywordtype">int</span> heat = 0;
  1821. <a name="l01829"></a>01829
  1822. <a name="l01830"></a>01830 CAM_MASKED_REG_HEAT6_LOOP(BRAIN)
  1823. <a name="l01831"></a>01831 } <span class="keywordflow">else</span> {
  1824. <a name="l01832"></a>01832 CAM_MASKED_REG_LOOP(BRAIN)
  1825. <a name="l01833"></a>01833 }
  1826. <a name="l01834"></a>01834 }
  1827. <a name="l01835"></a>01835
  1828. <a name="l01836"></a>01836
  1829. <a name="l01837"></a>01837 <span class="keywordtype">void</span> CellEngine::n_heat()
  1830. <a name="l01838"></a>01838 {
  1831. <a name="l01839"></a>01839 <span class="preprocessor">#define HEAT ( \</span>
  1832. <a name="l01840"></a>01840 <span class="preprocessor"> (nw + n + ne + w + frob + e + sw + s + se) &gt;&gt; 3)</span>
  1833. <a name="l01841"></a>01841 <span class="preprocessor"></span>
  1834. <a name="l01842"></a>01842 CAM_MASKED_REG_LOOP(HEAT)
  1835. <a name="l01843"></a>01843 }
  1836. <a name="l01844"></a>01844
  1837. <a name="l01845"></a>01845
  1838. <a name="l01846"></a>01846 <span class="keywordtype">void</span> CellEngine::n_dheat()
  1839. <a name="l01847"></a>01847 {
  1840. <a name="l01848"></a>01848 <span class="keywordtype">long</span> last = 0;
  1841. <a name="l01849"></a>01849
  1842. <a name="l01850"></a>01850 <span class="preprocessor">#define DHEAT \</span>
  1843. <a name="l01851"></a>01851 <span class="preprocessor"> last += (nw + n + ne + w + frob + e + sw + s + se); \</span>
  1844. <a name="l01852"></a>01852 <span class="preprocessor"> *front = (Byte)last &gt;&gt; 3; \</span>
  1845. <a name="l01853"></a>01853 <span class="preprocessor"> last &amp;= 7;</span>
  1846. <a name="l01854"></a>01854 <span class="preprocessor"></span>
  1847. <a name="l01855"></a>01855 CAM_MASKED_REG_LOOP_BODY(DHEAT)
  1848. <a name="l01856"></a>01856 }
  1849. <a name="l01857"></a>01857
  1850. <a name="l01858"></a>01858
  1851. <a name="l01859"></a>01859 <span class="keywordtype">void</span> CellEngine::n_lheat()
  1852. <a name="l01860"></a>01860 {
  1853. <a name="l01861"></a>01861 <span class="preprocessor">#define LHEAT \</span>
  1854. <a name="l01862"></a>01862 <span class="preprocessor"> (Byte)((n + w + e + s + frob) &gt;&gt; 2)</span>
  1855. <a name="l01863"></a>01863 <span class="preprocessor"></span>
  1856. <a name="l01864"></a>01864 CAM_MASKED_REG_LOOP(LHEAT)
  1857. <a name="l01865"></a>01865 }
  1858. <a name="l01866"></a>01866
  1859. <a name="l01867"></a>01867
  1860. <a name="l01868"></a>01868 <span class="keywordtype">void</span> CellEngine::n_ldheat()
  1861. <a name="l01869"></a>01869 {
  1862. <a name="l01870"></a>01870 <span class="keywordtype">long</span> last = 0;
  1863. <a name="l01871"></a>01871
  1864. <a name="l01872"></a>01872 <span class="preprocessor">#define LDHEAT \</span>
  1865. <a name="l01873"></a>01873 <span class="preprocessor"> (Byte)((last = (n + w + e + s + frob + (last &amp; 3))), (last &gt;&gt; 2))</span>
  1866. <a name="l01874"></a>01874 <span class="preprocessor"></span>
  1867. <a name="l01875"></a>01875 CAM_MASKED_REG_LOOP(LDHEAT)
  1868. <a name="l01876"></a>01876 }
  1869. <a name="l01877"></a>01877
  1870. <a name="l01878"></a>01878
  1871. <a name="l01879"></a>01879 <span class="keywordtype">void</span> CellEngine::n_abdheat()
  1872. <a name="l01880"></a>01880 {
  1873. <a name="l01881"></a>01881 <span class="comment">//long last = 0;</span>
  1874. <a name="l01882"></a>01882
  1875. <a name="l01883"></a>01883 <span class="preprocessor">#define ABDHEAT \</span>
  1876. <a name="l01884"></a>01884 <span class="preprocessor"> (Byte)(((n + w + e + s + \</span>
  1877. <a name="l01885"></a>01885 <span class="preprocessor"> (((xx^yy^phase)&amp;1) ? frob : -frob)) &gt;&gt; 2))</span>
  1878. <a name="l01886"></a>01886 <span class="preprocessor"></span>
  1879. <a name="l01887"></a>01887 CAM_MASKED_REG_LOOP(ABDHEAT)
  1880. <a name="l01888"></a>01888 }
  1881. <a name="l01889"></a>01889
  1882. <a name="l01890"></a>01890
  1883. <a name="l01891"></a>01891 <span class="keywordtype">void</span> CellEngine::n_abcdheat()
  1884. <a name="l01892"></a>01892 {
  1885. <a name="l01893"></a>01893 <span class="keywordtype">long</span> last = 0;
  1886. <a name="l01894"></a>01894
  1887. <a name="l01895"></a>01895 <span class="preprocessor">#define ABCDHEAT \</span>
  1888. <a name="l01896"></a>01896 <span class="preprocessor"> (Byte)((last = (n + w + e + s + \</span>
  1889. <a name="l01897"></a>01897 <span class="preprocessor"> (((xx^yy^phase)&amp;1) ? frob : -frob) + \</span>
  1890. <a name="l01898"></a>01898 <span class="preprocessor"> (last &amp; 3)), \</span>
  1891. <a name="l01899"></a>01899 <span class="preprocessor"> (last &gt;&gt; 2)))</span>
  1892. <a name="l01900"></a>01900 <span class="preprocessor"></span>
  1893. <a name="l01901"></a>01901 CAM_MASKED_REG_LOOP(ABCDHEAT)
  1894. <a name="l01902"></a>01902 }
  1895. <a name="l01903"></a>01903
  1896. <a name="l01904"></a>01904
  1897. <a name="l01905"></a>01905 <span class="keywordtype">void</span> CellEngine::n_edheat()
  1898. <a name="l01906"></a>01906 {
  1899. <a name="l01907"></a>01907 <span class="comment">//long last = 0;</span>
  1900. <a name="l01908"></a>01908
  1901. <a name="l01909"></a>01909 CAM_MASKED_REG_LOOP(HEAT)
  1902. <a name="l01910"></a>01910 }
  1903. <a name="l01911"></a>01911
  1904. <a name="l01912"></a>01912
  1905. <a name="l01913"></a>01913 <span class="preprocessor">#define RANCH(nw, n, ne, w, c, e, sw, s, se) \</span>
  1906. <a name="l01914"></a>01914 <span class="preprocessor"> (Byte)(n ^ w ^ e ^ s)</span>
  1907. <a name="l01915"></a>01915 <span class="preprocessor"></span>
  1908. <a name="l01916"></a>01916 <span class="keywordtype">void</span> CellEngine::n_ranch()
  1909. <a name="l01917"></a>01917 {
  1910. <a name="l01918"></a>01918 <span class="preprocessor">#define XRANCH (n ^ s ^ e ^ w)</span>
  1911. <a name="l01919"></a>01919 <span class="preprocessor"></span>
  1912. <a name="l01920"></a>01920 CAM_MASKED_REG_LOOP(XRANCH)
  1913. <a name="l01921"></a>01921 }
  1914. <a name="l01922"></a>01922
  1915. <a name="l01923"></a>01923
  1916. <a name="l01924"></a>01924 <span class="keywordtype">void</span> CellEngine::n_anneal()
  1917. <a name="l01925"></a>01925 {
  1918. <a name="l01926"></a>01926 <span class="keywordtype">long</span> sum;
  1919. <a name="l01927"></a>01927
  1920. <a name="l01928"></a>01928 <span class="preprocessor">#define ANNEAL ( \</span>
  1921. <a name="l01929"></a>01929 <span class="preprocessor"> (((sum = SUM9REG(1)) &gt; 5) || (sum == 4)) | \</span>
  1922. <a name="l01930"></a>01930 <span class="preprocessor"> ((c&amp;0x7f) &lt;&lt; 1))</span>
  1923. <a name="l01931"></a>01931 <span class="preprocessor"></span>
  1924. <a name="l01932"></a>01932 CAM_MASKED_REG_LOOP(ANNEAL)
  1925. <a name="l01933"></a>01933 }
  1926. <a name="l01934"></a>01934
  1927. <a name="l01935"></a>01935
  1928. <a name="l01936"></a>01936 <span class="keywordtype">void</span> CellEngine::n_anneal4()
  1929. <a name="l01937"></a>01937 {
  1930. <a name="l01938"></a>01938 <span class="keywordtype">long</span> sum0 = 0;
  1931. <a name="l01939"></a>01939 <span class="keywordtype">long</span> sum1 = 0;
  1932. <a name="l01940"></a>01940 <span class="keywordtype">long</span> sum2 = 0;
  1933. <a name="l01941"></a>01941 <span class="keywordtype">long</span> sum3 = 0;
  1934. <a name="l01942"></a>01942
  1935. <a name="l01943"></a>01943 <span class="preprocessor">#define ANNEAL4 ( \</span>
  1936. <a name="l01944"></a>01944 <span class="preprocessor"> ((((sum0 = (SUM9REG(1) &gt;&gt; 0)) &gt; 5) || (sum0 == 4)) ? 1 : 0) | \</span>
  1937. <a name="l01945"></a>01945 <span class="preprocessor"> ((((sum1 = (SUM9REG(2) &gt;&gt; 1)) &gt; 5) || (sum1 == 4)) ? 2 : 0) | \</span>
  1938. <a name="l01946"></a>01946 <span class="preprocessor"> ((((sum2 = (SUM9REG(4) &gt;&gt; 2)) &gt; 5) || (sum2 == 4)) ? 4 : 0) | \</span>
  1939. <a name="l01947"></a>01947 <span class="preprocessor"> ((((sum3 = (SUM9REG(8) &gt;&gt; 3)) &gt; 5) || (sum3 == 4)) ? 8 : 0) | \</span>
  1940. <a name="l01948"></a>01948 <span class="preprocessor"> ((c &amp; 0x0f) &lt;&lt; 4))</span>
  1941. <a name="l01949"></a>01949 <span class="preprocessor"></span>
  1942. <a name="l01950"></a>01950 CAM_MASKED_REG_LOOP(ANNEAL4)
  1943. <a name="l01951"></a>01951 }
  1944. <a name="l01952"></a>01952
  1945. <a name="l01953"></a>01953
  1946. <a name="l01954"></a>01954 <span class="keywordtype">void</span> CellEngine::n_anneal8()
  1947. <a name="l01955"></a>01955 {
  1948. <a name="l01956"></a>01956 <span class="keywordtype">long</span> sum0 = 0;
  1949. <a name="l01957"></a>01957 <span class="keywordtype">long</span> sum1 = 0;
  1950. <a name="l01958"></a>01958 <span class="keywordtype">long</span> sum2 = 0;
  1951. <a name="l01959"></a>01959 <span class="keywordtype">long</span> sum3 = 0;
  1952. <a name="l01960"></a>01960 <span class="keywordtype">long</span> sum4 = 0;
  1953. <a name="l01961"></a>01961 <span class="keywordtype">long</span> sum5 = 0;
  1954. <a name="l01962"></a>01962 <span class="keywordtype">long</span> sum6 = 0;
  1955. <a name="l01963"></a>01963 <span class="keywordtype">long</span> sum7 = 0;
  1956. <a name="l01964"></a>01964
  1957. <a name="l01965"></a>01965 <span class="preprocessor">#define ANNEAL8 ( \</span>
  1958. <a name="l01966"></a>01966 <span class="preprocessor"> ((((sum0 = (SUM9REG(1) &gt;&gt; 0)) &gt; 5) || (sum0 == 4)) ? 1 : 0) | \</span>
  1959. <a name="l01967"></a>01967 <span class="preprocessor"> ((((sum1 = (SUM9REG(2) &gt;&gt; 1)) &gt; 5) || (sum1 == 4)) ? 2 : 0) | \</span>
  1960. <a name="l01968"></a>01968 <span class="preprocessor"> ((((sum2 = (SUM9REG(4) &gt;&gt; 2)) &gt; 5) || (sum2 == 4)) ? 4 : 0) | \</span>
  1961. <a name="l01969"></a>01969 <span class="preprocessor"> ((((sum3 = (SUM9REG(8) &gt;&gt; 3)) &gt; 5) || (sum3 == 4)) ? 8 : 0) | \</span>
  1962. <a name="l01970"></a>01970 <span class="preprocessor"> ((((sum4 = (SUM9REG(16) &gt;&gt; 4)) &gt; 5) || (sum4 == 4)) ? 16 : 0) | \</span>
  1963. <a name="l01971"></a>01971 <span class="preprocessor"> ((((sum5 = (SUM9REG(32) &gt;&gt; 5)) &gt; 5) || (sum5 == 4)) ? 32 : 0) | \</span>
  1964. <a name="l01972"></a>01972 <span class="preprocessor"> ((((sum6 = (SUM9REG(64) &gt;&gt; 6)) &gt; 5) || (sum6 == 4)) ? 64 : 0) | \</span>
  1965. <a name="l01973"></a>01973 <span class="preprocessor"> ((((sum7 = (SUM9REG(128) &gt;&gt; 7)) &gt; 5) || (sum7 == 4)) ? 128 : 0))</span>
  1966. <a name="l01974"></a>01974 <span class="preprocessor"></span>
  1967. <a name="l01975"></a>01975 CAM_MASKED_REG_LOOP(ANNEAL8)
  1968. <a name="l01976"></a>01976 }
  1969. <a name="l01977"></a>01977
  1970. <a name="l01978"></a>01978
  1971. <a name="l01979"></a>01979 <span class="keywordtype">void</span> CellEngine::n_eco()
  1972. <a name="l01980"></a>01980 {
  1973. <a name="l01981"></a>01981 <span class="keywordtype">long</span> sum;
  1974. <a name="l01982"></a>01982
  1975. <a name="l01983"></a>01983 <span class="preprocessor">#define ANTILIFE ( \</span>
  1976. <a name="l01984"></a>01984 <span class="preprocessor"> ((sum = SUM8REG(1)), \</span>
  1977. <a name="l01985"></a>01985 <span class="preprocessor"> (((c&amp;1) ? (sum != 5) : (((sum != 5) &amp;&amp; (sum != 6)) ? 1 : 0)) | \</span>
  1978. <a name="l01986"></a>01986 <span class="preprocessor"> ((c&amp;0x7f) &lt;&lt; 1))))</span>
  1979. <a name="l01987"></a>01987 <span class="preprocessor"></span>
  1980. <a name="l01988"></a>01988 <span class="preprocessor">#define ECO ( \</span>
  1981. <a name="l01989"></a>01989 <span class="preprocessor"> ((((sum = (SUM9REG(128) &gt;&gt; 7)) &gt; 5) || (sum == 4)) \</span>
  1982. <a name="l01990"></a>01990 <span class="preprocessor"> ? ((ANTILIFE &amp; 127) | 128) \</span>
  1983. <a name="l01991"></a>01991 <span class="preprocessor"> : (BRAIN &amp; 127)))</span>
  1984. <a name="l01992"></a>01992 <span class="preprocessor"></span>
  1985. <a name="l01993"></a>01993 <span class="keywordflow">if</span> (inflation) {
  1986. <a name="l01994"></a>01994 <span class="keywordtype">int</span> last = 0;
  1987. <a name="l01995"></a>01995 <span class="keywordtype">int</span> heat = 0;
  1988. <a name="l01996"></a>01996
  1989. <a name="l01997"></a>01997 CAM_MASKED_REG_HEAT4_LOOP(ECO)
  1990. <a name="l01998"></a>01998 } <span class="keywordflow">else</span> {
  1991. <a name="l01999"></a>01999 CAM_MASKED_REG_LOOP(ECO)
  1992. <a name="l02000"></a>02000 }
  1993. <a name="l02001"></a>02001 }
  1994. <a name="l02002"></a>02002
  1995. <a name="l02003"></a>02003
  1996. <a name="l02004"></a>02004 <span class="keywordtype">void</span> CellEngine::n_torben()
  1997. <a name="l02005"></a>02005 {
  1998. <a name="l02006"></a>02006 <span class="keywordtype">long</span> sum1;
  1999. <a name="l02007"></a>02007
  2000. <a name="l02008"></a>02008 <span class="comment">// 0 0 0 1 0 1 0 1 1 1</span>
  2001. <a name="l02009"></a>02009
  2002. <a name="l02010"></a>02010 <span class="preprocessor">#define TORBEN ( \</span>
  2003. <a name="l02011"></a>02011 <span class="preprocessor"> ((((sum1 = SUM9REG(1)) &gt; 6) || (sum1 == 5) || (sum1 == 3)) ? 1 : 0) | \</span>
  2004. <a name="l02012"></a>02012 <span class="preprocessor"> ((c &amp; 0x7f) &lt;&lt; 1))</span>
  2005. <a name="l02013"></a>02013 <span class="preprocessor"></span>
  2006. <a name="l02014"></a>02014 CAM_MASKED_REG_LOOP(TORBEN)
  2007. <a name="l02015"></a>02015 }
  2008. <a name="l02016"></a>02016
  2009. <a name="l02017"></a>02017
  2010. <a name="l02018"></a>02018 <span class="keywordtype">void</span> CellEngine::n_torben2()
  2011. <a name="l02019"></a>02019 {
  2012. <a name="l02020"></a>02020 <span class="keywordtype">long</span> sum2;
  2013. <a name="l02021"></a>02021
  2014. <a name="l02022"></a>02022 <span class="comment">// 0 0 0 1 0 1 0 1 1 1</span>
  2015. <a name="l02023"></a>02023 <span class="comment">// 0 0 1 0 1 0 1 0 1 1</span>
  2016. <a name="l02024"></a>02024
  2017. <a name="l02025"></a>02025 <span class="preprocessor">#define TORBEN2 ( \</span>
  2018. <a name="l02026"></a>02026 <span class="preprocessor"> ((((sum2 = SUM9REG(1)) &gt; 6) || (sum2 == 3) || (sum2 == 4)) ? 1 : 0) | \</span>
  2019. <a name="l02027"></a>02027 <span class="preprocessor"> ((c &amp; 0x7f) &lt;&lt; 1))</span>
  2020. <a name="l02028"></a>02028 <span class="preprocessor"></span>
  2021. <a name="l02029"></a>02029 CAM_MASKED_REG_LOOP(TORBEN2)
  2022. <a name="l02030"></a>02030 }
  2023. <a name="l02031"></a>02031
  2024. <a name="l02032"></a>02032
  2025. <a name="l02033"></a>02033 <span class="keywordtype">void</span> CellEngine::n_torben3()
  2026. <a name="l02034"></a>02034 {
  2027. <a name="l02035"></a>02035 <span class="keywordtype">long</span> sum1;
  2028. <a name="l02036"></a>02036 <span class="keywordtype">long</span> sum2;
  2029. <a name="l02037"></a>02037
  2030. <a name="l02038"></a>02038 <span class="comment">// 0 0 0 1 1 0 0 1 1 1</span>
  2031. <a name="l02039"></a>02039
  2032. <a name="l02040"></a>02040 <span class="preprocessor">#define TORBEN3 ((TORBEN) ^ (TORBEN2))</span>
  2033. <a name="l02041"></a>02041 <span class="preprocessor"></span>
  2034. <a name="l02042"></a>02042 CAM_MASKED_REG_LOOP(TORBEN3)
  2035. <a name="l02043"></a>02043 }
  2036. <a name="l02044"></a>02044
  2037. <a name="l02045"></a>02045
  2038. <a name="l02046"></a>02046 <span class="keywordtype">void</span> CellEngine::n_torben4()
  2039. <a name="l02047"></a>02047 {
  2040. <a name="l02048"></a>02048 <span class="keywordtype">long</span> sum;
  2041. <a name="l02049"></a>02049
  2042. <a name="l02050"></a>02050 <span class="comment">// 1 0 0 0 1 0 1 1 1 0</span>
  2043. <a name="l02051"></a>02051
  2044. <a name="l02052"></a>02052 <span class="preprocessor">#define TORBEN4 ( \</span>
  2045. <a name="l02053"></a>02053 <span class="preprocessor"> ((((sum = SUM9REG(1)) == 0) || \</span>
  2046. <a name="l02054"></a>02054 <span class="preprocessor"> (sum == 4) || \</span>
  2047. <a name="l02055"></a>02055 <span class="preprocessor"> (sum == 6) || \</span>
  2048. <a name="l02056"></a>02056 <span class="preprocessor"> (sum == 7) || \</span>
  2049. <a name="l02057"></a>02057 <span class="preprocessor"> (sum == 8)) ? 1 : 0) | \</span>
  2050. <a name="l02058"></a>02058 <span class="preprocessor"> ((c&amp;0x7f) &lt;&lt; 1))</span>
  2051. <a name="l02059"></a>02059 <span class="preprocessor"></span>
  2052. <a name="l02060"></a>02060 CAM_MASKED_REG_LOOP(TORBEN4)
  2053. <a name="l02061"></a>02061 }
  2054. <a name="l02062"></a>02062
  2055. <a name="l02063"></a>02063
  2056. <a name="l02064"></a>02064 <span class="keywordtype">void</span> CellEngine::n_ball()
  2057. <a name="l02065"></a>02065 {
  2058. <a name="l02066"></a>02066 <span class="comment">// This spatio temporal phase synchronization is busted.</span>
  2059. <a name="l02067"></a>02067 <span class="comment">// It stays in synch for vertical and horizontal movement,</span>
  2060. <a name="l02068"></a>02068 <span class="comment">// but gets out of phase for diagonal movement,</span>
  2061. <a name="l02069"></a>02069 <span class="comment">// and I can't figure out how to keep it in phase</span>
  2062. <a name="l02070"></a>02070 <span class="comment">// regardless of position.</span>
  2063. <a name="l02071"></a>02071 <span class="keywordtype">char</span> p = ((phase ^ x ^ y) &amp; 1);
  2064. <a name="l02072"></a>02072 <span class="keywordtype">long</span> xx, yy, r = Rand16();
  2065. <a name="l02073"></a>02073 Byte *front = frontMem;
  2066. <a name="l02074"></a>02074 Byte *back = backMem +
  2067. <a name="l02075"></a>02075 (backBorder - 1) +
  2068. <a name="l02076"></a>02076 ((backBorder - 1) * backRowBytes);
  2069. <a name="l02077"></a>02077
  2070. <a name="l02078"></a>02078 <span class="keywordflow">if</span> (!p) {
  2071. <a name="l02079"></a>02079 back += 1 + backRowBytes;
  2072. <a name="l02080"></a>02080 }
  2073. <a name="l02081"></a>02081
  2074. <a name="l02082"></a>02082 <span class="keywordflow">for</span> (yy = p + (height &gt;&gt;1);
  2075. <a name="l02083"></a>02083 yy &gt; 0;
  2076. <a name="l02084"></a>02084 yy--) {
  2077. <a name="l02085"></a>02085 <span class="keywordflow">for</span> (xx = p + (width &gt;&gt;1);
  2078. <a name="l02086"></a>02086 xx &gt; 0;
  2079. <a name="l02087"></a>02087 xx--) {
  2080. <a name="l02088"></a>02088 Byte nw = back[0], nw0 = nw &gt;&gt; 6,
  2081. <a name="l02089"></a>02089 ne = back[1], ne0 = ne &gt;&gt; 6,
  2082. <a name="l02090"></a>02090 sw = back[backRowBytes], sw0 = sw &gt;&gt; 6,
  2083. <a name="l02091"></a>02091 se = back[backRowBytes+1], se0 = se &gt;&gt; 6;
  2084. <a name="l02092"></a>02092
  2085. <a name="l02093"></a>02093 <span class="comment">// r += nw + ne + sw + sw; r &gt;&gt;= 1;</span>
  2086. <a name="l02094"></a>02094 r += (nw0&amp;1) + (ne0&amp;1) + (sw0&amp;1) + (se0&amp;1); r &gt;&gt;= 1;
  2087. <a name="l02095"></a>02095
  2088. <a name="l02096"></a>02096 <span class="keywordflow">if</span> ((nw0 | ne0 | sw0 | se0) &amp; 2) {
  2089. <a name="l02097"></a>02097 <span class="keywordflow">if</span> (nw0 == 1) {
  2090. <a name="l02098"></a>02098 back[0] |= 128;
  2091. <a name="l02099"></a>02099 }
  2092. <a name="l02100"></a>02100 <span class="keywordflow">if</span> (ne0 == 1) {
  2093. <a name="l02101"></a>02101 back[1] |= 128;
  2094. <a name="l02102"></a>02102 }
  2095. <a name="l02103"></a>02103 <span class="keywordflow">if</span> (sw0 == 1) {
  2096. <a name="l02104"></a>02104 back[backRowBytes] |= 128;
  2097. <a name="l02105"></a>02105 }
  2098. <a name="l02106"></a>02106 <span class="keywordflow">if</span> (se0 == 1) {
  2099. <a name="l02107"></a>02107 back[backRowBytes+1] |= 128;
  2100. <a name="l02108"></a>02108 }
  2101. <a name="l02109"></a>02109 } <span class="keywordflow">else</span> {
  2102. <a name="l02110"></a>02110
  2103. <a name="l02111"></a>02111 <span class="keywordflow">switch</span> ((nw0&amp;1) + (ne0&amp;1) + (sw0&amp;1) + (se0&amp;1)) {
  2104. <a name="l02112"></a>02112
  2105. <a name="l02113"></a>02113 <span class="keywordflow">case</span> 0:
  2106. <a name="l02114"></a>02114 <span class="keywordflow">case</span> 3:
  2107. <a name="l02115"></a>02115 <span class="keywordflow">case</span> 4:
  2108. <a name="l02116"></a>02116 <span class="comment">// same</span>
  2109. <a name="l02117"></a>02117 back[0] = nw; back[1] = ne;
  2110. <a name="l02118"></a>02118 back[backRowBytes] = sw;
  2111. <a name="l02119"></a>02119 back[backRowBytes+1] = se;
  2112. <a name="l02120"></a>02120 <span class="keywordflow">break</span>;
  2113. <a name="l02121"></a>02121
  2114. <a name="l02122"></a>02122 <span class="keywordflow">case</span> 1:
  2115. <a name="l02123"></a>02123 <span class="comment">// reflect</span>
  2116. <a name="l02124"></a>02124 back[0] = se; back[1] = sw;
  2117. <a name="l02125"></a>02125 back[backRowBytes] = ne;
  2118. <a name="l02126"></a>02126 back[backRowBytes+1] = nw;
  2119. <a name="l02127"></a>02127 <span class="keywordflow">break</span>;
  2120. <a name="l02128"></a>02128
  2121. <a name="l02129"></a>02129 <span class="keywordflow">case</span> 2:
  2122. <a name="l02130"></a>02130 <span class="comment">// turn</span>
  2123. <a name="l02131"></a>02131 <span class="keywordflow">switch</span> (((nw0&amp;1) &lt;&lt;3) |
  2124. <a name="l02132"></a>02132 ((ne0&amp;1) &lt;&lt;2) |
  2125. <a name="l02133"></a>02133 ((sw0&amp;1) &lt;&lt;1) |
  2126. <a name="l02134"></a>02134 (se0&amp;1)) {
  2127. <a name="l02135"></a>02135
  2128. <a name="l02136"></a>02136 <span class="keywordflow">case</span> 6:
  2129. <a name="l02137"></a>02137 <span class="keywordflow">case</span> 9:
  2130. <a name="l02138"></a>02138 <span class="keywordflow">if</span> (r&amp;1) {
  2131. <a name="l02139"></a>02139 <span class="comment">// clockwise</span>
  2132. <a name="l02140"></a>02140 back[0] = sw; back[1] = nw;
  2133. <a name="l02141"></a>02141 back[backRowBytes] = se;
  2134. <a name="l02142"></a>02142 back[backRowBytes+1] = ne;
  2135. <a name="l02143"></a>02143 } <span class="keywordflow">else</span> {
  2136. <a name="l02144"></a>02144 <span class="comment">// counterclockwise</span>
  2137. <a name="l02145"></a>02145 back[0] = ne; back[1] = se;
  2138. <a name="l02146"></a>02146 back[backRowBytes] = nw;
  2139. <a name="l02147"></a>02147 back[backRowBytes+1] = sw;
  2140. <a name="l02148"></a>02148 }
  2141. <a name="l02149"></a>02149 <span class="keywordflow">break</span>;
  2142. <a name="l02150"></a>02150
  2143. <a name="l02151"></a>02151 <span class="keywordflow">default</span>:
  2144. <a name="l02152"></a>02152 back[0] = nw; back[1] = ne;
  2145. <a name="l02153"></a>02153 back[backRowBytes] = sw;
  2146. <a name="l02154"></a>02154 back[backRowBytes+1] = se;
  2147. <a name="l02155"></a>02155 <span class="keywordflow">break</span>;
  2148. <a name="l02156"></a>02156
  2149. <a name="l02157"></a>02157 } <span class="comment">// switch</span>
  2150. <a name="l02158"></a>02158
  2151. <a name="l02159"></a>02159 <span class="keywordflow">break</span>;
  2152. <a name="l02160"></a>02160
  2153. <a name="l02161"></a>02161 } <span class="comment">// switch</span>
  2154. <a name="l02162"></a>02162 } <span class="comment">// if</span>
  2155. <a name="l02163"></a>02163
  2156. <a name="l02164"></a>02164 back += 2;
  2157. <a name="l02165"></a>02165 }
  2158. <a name="l02166"></a>02166 back += (backRowBytes * 2) - width - (p * 2);
  2159. <a name="l02167"></a>02167 }
  2160. <a name="l02168"></a>02168
  2161. <a name="l02169"></a>02169 back = backMem +
  2162. <a name="l02170"></a>02170 backBorder +
  2163. <a name="l02171"></a>02171 (backBorder * backRowBytes);
  2164. <a name="l02172"></a>02172 front = frontMem;
  2165. <a name="l02173"></a>02173
  2166. <a name="l02174"></a>02174 <span class="keywordflow">for</span> (yy = height;
  2167. <a name="l02175"></a>02175 yy &gt; 0;
  2168. <a name="l02176"></a>02176 yy--) {
  2169. <a name="l02177"></a>02177 memcpy(front, back, width);
  2170. <a name="l02178"></a>02178 back += backRowBytes;
  2171. <a name="l02179"></a>02179 front += screenRowBytes;
  2172. <a name="l02180"></a>02180 }
  2173. <a name="l02181"></a>02181 }
  2174. <a name="l02182"></a>02182
  2175. <a name="l02183"></a>02183
  2176. <a name="l02184"></a>02184 <span class="preprocessor">#define FDHEAT(nw, n, ne, w, c, e, sw, s, se) \</span>
  2177. <a name="l02185"></a>02185 <span class="preprocessor"> error += (nw + n + ne + w + frob + e + sw + s + se); \</span>
  2178. <a name="l02186"></a>02186 <span class="preprocessor"> result = error &gt;&gt; 3; \</span>
  2179. <a name="l02187"></a>02187 <span class="preprocessor"> error &amp;= 7;</span>
  2180. <a name="l02188"></a>02188 <span class="preprocessor"></span>
  2181. <a name="l02189"></a>02189
  2182. <a name="l02190"></a>02190 <span class="preprocessor">#ifndef _WIN32</span>
  2183. <a name="l02191"></a>02191 <span class="preprocessor"></span>
  2184. <a name="l02192"></a>02192
  2185. <a name="l02193"></a>02193 <span class="keywordtype">void</span> CellEngine::n_fdheat()
  2186. <a name="l02194"></a>02194 {
  2187. <a name="l02195"></a>02195 QUAD *front = (QUAD *)frontMem;
  2188. <a name="l02196"></a>02196 QUAD *back = (QUAD *)(backMem +
  2189. <a name="l02197"></a>02197 (backBorder - 1) +
  2190. <a name="l02198"></a>02198 ((backBorder - 1) * backRowBytes));
  2191. <a name="l02199"></a>02199 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  2192. <a name="l02200"></a>02200 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  2193. <a name="l02201"></a>02201 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  2194. <a name="l02202"></a>02202 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  2195. <a name="l02203"></a>02203 <span class="keywordtype">long</span> yy;
  2196. <a name="l02204"></a>02204
  2197. <a name="l02205"></a>02205 total = 0;
  2198. <a name="l02206"></a>02206
  2199. <a name="l02207"></a>02207 <span class="keywordflow">for</span> (yy = height;
  2200. <a name="l02208"></a>02208 yy &gt; 0;
  2201. <a name="l02209"></a>02209 back += backstride,
  2202. <a name="l02210"></a>02210 front += frontstride,
  2203. <a name="l02211"></a>02211 yy--) {
  2204. <a name="l02212"></a>02212 <span class="keyword">register</span> QUAD b1, b2;
  2205. <a name="l02213"></a>02213 <span class="keyword">register</span> QUAD c1, c2;
  2206. <a name="l02214"></a>02214 <span class="keyword">register</span> QUAD d1, d2;
  2207. <a name="l02215"></a>02215 <span class="keywordtype">long</span> error = 0;
  2208. <a name="l02216"></a>02216 <span class="keywordtype">long</span> xx;
  2209. <a name="l02217"></a>02217
  2210. <a name="l02218"></a>02218 b2 = back[0];
  2211. <a name="l02219"></a>02219 c2 = back[backline];
  2212. <a name="l02220"></a>02220 d2 = back[backline &lt;&lt; 1];
  2213. <a name="l02221"></a>02221 back++;
  2214. <a name="l02222"></a>02222
  2215. <a name="l02223"></a>02223 <span class="keywordflow">for</span> (xx = xsteps;
  2216. <a name="l02224"></a>02224 xx &gt; 0;
  2217. <a name="l02225"></a>02225 xx--) {
  2218. <a name="l02226"></a>02226 <span class="keywordtype">long</span> result, cells = 0;
  2219. <a name="l02227"></a>02227
  2220. <a name="l02228"></a>02228 b1 = b2; b2 = back[0];
  2221. <a name="l02229"></a>02229 c1 = c2; c2 = back[backline];
  2222. <a name="l02230"></a>02230 d1 = d2; d2 = back[backline &lt;&lt; 1];
  2223. <a name="l02231"></a>02231 back++;
  2224. <a name="l02232"></a>02232
  2225. <a name="l02233"></a>02233 FDHEAT( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  2226. <a name="l02234"></a>02234 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  2227. <a name="l02235"></a>02235 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  2228. <a name="l02236"></a>02236 total += result;
  2229. <a name="l02237"></a>02237 SETBYTE0(cells, result);
  2230. <a name="l02238"></a>02238
  2231. <a name="l02239"></a>02239 FDHEAT( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  2232. <a name="l02240"></a>02240 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  2233. <a name="l02241"></a>02241 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  2234. <a name="l02242"></a>02242 total += result;
  2235. <a name="l02243"></a>02243 SETBYTE1(cells, result);
  2236. <a name="l02244"></a>02244
  2237. <a name="l02245"></a>02245 FDHEAT( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  2238. <a name="l02246"></a>02246 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  2239. <a name="l02247"></a>02247 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  2240. <a name="l02248"></a>02248 total += result;
  2241. <a name="l02249"></a>02249 SETBYTE2(cells, result);
  2242. <a name="l02250"></a>02250
  2243. <a name="l02251"></a>02251 FDHEAT( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  2244. <a name="l02252"></a>02252 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  2245. <a name="l02253"></a>02253 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  2246. <a name="l02254"></a>02254 total += result;
  2247. <a name="l02255"></a>02255 SETBYTE3(cells, result);
  2248. <a name="l02256"></a>02256
  2249. <a name="l02257"></a>02257 *front = cells;
  2250. <a name="l02258"></a>02258 front++;
  2251. <a name="l02259"></a>02259 }
  2252. <a name="l02260"></a>02260 }
  2253. <a name="l02261"></a>02261 }
  2254. <a name="l02262"></a>02262
  2255. <a name="l02263"></a>02263
  2256. <a name="l02264"></a>02264 <span class="preprocessor">#else</span>
  2257. <a name="l02265"></a>02265 <span class="preprocessor"></span>
  2258. <a name="l02266"></a>02266
  2259. <a name="l02267"></a>02267 <span class="keyword">class </span>CellEngine *cellEngine = NULL; <span class="comment">// to fool the assembler</span>
  2260. <a name="l02268"></a>02268
  2261. <a name="l02269"></a>02269 <span class="keywordtype">void</span> CellEngine::n_fdheat()
  2262. <a name="l02270"></a>02270 {
  2263. <a name="l02271"></a>02271 <span class="keywordtype">long</span> nextbackline;
  2264. <a name="l02272"></a>02272 <span class="keywordtype">long</span> frontstride;
  2265. <a name="l02273"></a>02273 <span class="keywordtype">char</span> *back;
  2266. <a name="l02274"></a>02274 <span class="keywordtype">char</span> *front;
  2267. <a name="l02275"></a>02275 <span class="keywordtype">long</span> yy;
  2268. <a name="l02276"></a>02276 <span class="keywordtype">long</span> xsteps;
  2269. <a name="l02277"></a>02277 <span class="keywordtype">long</span> backline;
  2270. <a name="l02278"></a>02278 <span class="keywordtype">long</span> backstride;
  2271. <a name="l02279"></a>02279 <span class="keywordtype">long</span> b2;
  2272. <a name="l02280"></a>02280 <span class="keywordtype">long</span> c1;
  2273. <a name="l02281"></a>02281 <span class="keywordtype">long</span> c2;
  2274. <a name="l02282"></a>02282 <span class="keywordtype">long</span> d1;
  2275. <a name="l02283"></a>02283 <span class="keywordtype">long</span> d2;
  2276. <a name="l02284"></a>02284 <span class="keywordtype">long</span> error;
  2277. <a name="l02285"></a>02285 <span class="keywordtype">long</span> xx;
  2278. <a name="l02286"></a>02286 <span class="keywordtype">long</span> b1;
  2279. <a name="l02287"></a>02287 <span class="keywordtype">long</span> result;
  2280. <a name="l02288"></a>02288 <span class="keywordtype">long</span> cells;
  2281. <a name="l02289"></a>02289 <span class="keywordtype">long</span> frob;
  2282. <a name="l02290"></a>02290 <span class="keywordtype">long</span> total;
  2283. <a name="l02291"></a>02291
  2284. <a name="l02292"></a>02292 __asm {
  2285. <a name="l02293"></a>02293
  2286. <a name="l02294"></a>02294 <span class="comment">// 1846 : QUAD *front = (QUAD *)frontMem;</span>
  2287. <a name="l02295"></a>02295
  2288. <a name="l02296"></a>02296 mov ecx, DWORD PTR [<span class="keyword">this</span>]
  2289. <a name="l02297"></a>02297 mov eax, DWORD PTR [ecx].frontMem
  2290. <a name="l02298"></a>02298 mov DWORD PTR [front], eax
  2291. <a name="l02299"></a>02299
  2292. <a name="l02300"></a>02300 <span class="comment">// 1847 : QUAD *back = (QUAD *)(backMem +</span>
  2293. <a name="l02301"></a>02301 <span class="comment">// 1848 : (backBorder - 1) +</span>
  2294. <a name="l02302"></a>02302 <span class="comment">// 1849 : ((backBorder - 1) * backRowBytes));</span>
  2295. <a name="l02303"></a>02303
  2296. <a name="l02304"></a>02304 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2297. <a name="l02305"></a>02305 mov eax, DWORD PTR [ecx].backBorder
  2298. <a name="l02306"></a>02306 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2299. <a name="l02307"></a>02307 mov edx, DWORD PTR [ecx].backMem
  2300. <a name="l02308"></a>02308 lea eax, DWORD PTR [edx+eax-1]
  2301. <a name="l02309"></a>02309 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2302. <a name="l02310"></a>02310 mov edx, DWORD PTR [ecx].backBorder
  2303. <a name="l02311"></a>02311 sub edx, 1
  2304. <a name="l02312"></a>02312 mov ecx, DWORD PTR [<span class="keyword">this</span>]
  2305. <a name="l02313"></a>02313 imul edx, DWORD PTR [ecx].backRowBytes
  2306. <a name="l02314"></a>02314 <span class="keyword">add</span> eax, edx
  2307. <a name="l02315"></a>02315 mov DWORD PTR [back], eax
  2308. <a name="l02316"></a>02316
  2309. <a name="l02317"></a>02317 <span class="comment">// 1850 : long backline = backRowBytes &gt;&gt; 2;</span>
  2310. <a name="l02318"></a>02318
  2311. <a name="l02319"></a>02319 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2312. <a name="l02320"></a>02320 mov eax, DWORD PTR [ecx].backRowBytes
  2313. <a name="l02321"></a>02321 sar eax, 2
  2314. <a name="l02322"></a>02322 mov DWORD PTR [backline], eax
  2315. <a name="l02323"></a>02323
  2316. <a name="l02324"></a>02324 <span class="comment">// 1851 : long nextbackline = backline &lt;&lt; 1;</span>
  2317. <a name="l02325"></a>02325
  2318. <a name="l02326"></a>02326 mov eax, DWORD PTR [backline]
  2319. <a name="l02327"></a>02327 shl eax, 1
  2320. <a name="l02328"></a>02328 mov DWORD PTR [nextbackline], eax
  2321. <a name="l02329"></a>02329
  2322. <a name="l02330"></a>02330 <span class="comment">// 1852 : long backstride = backline - ((width &gt;&gt; 2) + 1);</span>
  2323. <a name="l02331"></a>02331
  2324. <a name="l02332"></a>02332 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2325. <a name="l02333"></a>02333 mov eax, DWORD PTR [ecx]cellEngine.width
  2326. <a name="l02334"></a>02334 sar eax, 2
  2327. <a name="l02335"></a>02335 <span class="keyword">add</span> eax, 1
  2328. <a name="l02336"></a>02336 mov edx, DWORD PTR [backline]
  2329. <a name="l02337"></a>02337 sub edx, eax
  2330. <a name="l02338"></a>02338 mov DWORD PTR [backstride], edx
  2331. <a name="l02339"></a>02339
  2332. <a name="l02340"></a>02340 <span class="comment">// 1853 : long frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);</span>
  2333. <a name="l02341"></a>02341
  2334. <a name="l02342"></a>02342 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2335. <a name="l02343"></a>02343 mov eax, DWORD PTR [ecx].screenRowBytes
  2336. <a name="l02344"></a>02344 sar eax, 2
  2337. <a name="l02345"></a>02345 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2338. <a name="l02346"></a>02346 mov edx, DWORD PTR [ecx]cellEngine.width
  2339. <a name="l02347"></a>02347 sar edx, 2
  2340. <a name="l02348"></a>02348 sub eax, edx
  2341. <a name="l02349"></a>02349 mov DWORD PTR [frontstride], eax
  2342. <a name="l02350"></a>02350
  2343. <a name="l02351"></a>02351 <span class="comment">// 1854 : long xsteps = width &gt;&gt; 2;</span>
  2344. <a name="l02352"></a>02352
  2345. <a name="l02353"></a>02353 <span class="comment">// mov eax, DWORD PTR [this]</span>
  2346. <a name="l02354"></a>02354 mov edx, DWORD PTR [ecx]cellEngine.width
  2347. <a name="l02355"></a>02355 sar edx, 2
  2348. <a name="l02356"></a>02356 mov DWORD PTR [xsteps], edx
  2349. <a name="l02357"></a>02357
  2350. <a name="l02358"></a>02358 <span class="comment">// 1855 : long yy;</span>
  2351. <a name="l02359"></a>02359 <span class="comment">// 1856 :</span>
  2352. <a name="l02360"></a>02360 <span class="comment">// 1857 : total = 0;</span>
  2353. <a name="l02361"></a>02361
  2354. <a name="l02362"></a>02362 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2355. <a name="l02363"></a>02363 mov DWORD PTR [total], 0
  2356. <a name="l02364"></a>02364
  2357. <a name="l02365"></a>02365 <span class="comment">// long frob = this-&gt;frob;</span>
  2358. <a name="l02366"></a>02366 mov eax, DWORD PTR [ecx].frob
  2359. <a name="l02367"></a>02367 mov [frob], eax
  2360. <a name="l02368"></a>02368
  2361. <a name="l02369"></a>02369 <span class="comment">// 1858 :</span>
  2362. <a name="l02370"></a>02370 <span class="comment">// 1859 : for (yy = height;</span>
  2363. <a name="l02371"></a>02371
  2364. <a name="l02372"></a>02372 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2365. <a name="l02373"></a>02373 mov eax, DWORD PTR [ecx]cellEngine.height
  2366. <a name="l02374"></a>02374 mov DWORD PTR [yy], eax
  2367. <a name="l02375"></a>02375
  2368. <a name="l02376"></a>02376 <span class="comment">// 1860 : yy &gt; 0;</span>
  2369. <a name="l02377"></a>02377 <span class="comment">// 1861 : back += backstride,</span>
  2370. <a name="l02378"></a>02378 <span class="comment">// 1862 : front += frontstride,</span>
  2371. <a name="l02379"></a>02379 <span class="comment">// 1863 : yy--) {</span>
  2372. <a name="l02380"></a>02380
  2373. <a name="l02381"></a>02381 jmp SHORT _L76116
  2374. <a name="l02382"></a>02382
  2375. <a name="l02383"></a>02383 _L76117:
  2376. <a name="l02384"></a>02384 mov edx, DWORD PTR [backstride]
  2377. <a name="l02385"></a>02385 mov eax, DWORD PTR [back]
  2378. <a name="l02386"></a>02386 lea ecx, DWORD PTR [eax+edx*4]
  2379. <a name="l02387"></a>02387 mov DWORD PTR [back], ecx
  2380. <a name="l02388"></a>02388 mov edx, DWORD PTR [frontstride]
  2381. <a name="l02389"></a>02389 mov eax, DWORD PTR [front]
  2382. <a name="l02390"></a>02390 lea ecx, DWORD PTR [eax+edx*4]
  2383. <a name="l02391"></a>02391 mov DWORD PTR [front], ecx
  2384. <a name="l02392"></a>02392 mov edx, DWORD PTR [yy]
  2385. <a name="l02393"></a>02393 sub edx, 1
  2386. <a name="l02394"></a>02394 mov DWORD PTR [yy], edx
  2387. <a name="l02395"></a>02395
  2388. <a name="l02396"></a>02396 _L76116:
  2389. <a name="l02397"></a>02397 cmp DWORD PTR [yy], 0
  2390. <a name="l02398"></a>02398 jle _L76118
  2391. <a name="l02399"></a>02399
  2392. <a name="l02400"></a>02400 <span class="comment">// 1864 : register QUAD b1, b2;</span>
  2393. <a name="l02401"></a>02401 <span class="comment">// 1865 : register QUAD c1, c2;</span>
  2394. <a name="l02402"></a>02402 <span class="comment">// 1866 : register QUAD d1, d2;</span>
  2395. <a name="l02403"></a>02403 <span class="comment">// 1867 : long error = 0;</span>
  2396. <a name="l02404"></a>02404
  2397. <a name="l02405"></a>02405 mov DWORD PTR [error], 0
  2398. <a name="l02406"></a>02406
  2399. <a name="l02407"></a>02407 <span class="comment">// 1868 : long xx;</span>
  2400. <a name="l02408"></a>02408 <span class="comment">// 1869 :</span>
  2401. <a name="l02409"></a>02409 <span class="comment">// 1870 : b2 = back[0];</span>
  2402. <a name="l02410"></a>02410
  2403. <a name="l02411"></a>02411 mov eax, DWORD PTR [back]
  2404. <a name="l02412"></a>02412 mov ecx, DWORD PTR [eax]
  2405. <a name="l02413"></a>02413 mov DWORD PTR [b2], ecx
  2406. <a name="l02414"></a>02414
  2407. <a name="l02415"></a>02415 <span class="comment">// 1871 : c2 = back[backline];</span>
  2408. <a name="l02416"></a>02416
  2409. <a name="l02417"></a>02417 mov edx, DWORD PTR [backline]
  2410. <a name="l02418"></a>02418 <span class="comment">// mov eax, DWORD PTR [back] // redundant</span>
  2411. <a name="l02419"></a>02419 mov ecx, DWORD PTR [eax+edx*4]
  2412. <a name="l02420"></a>02420 mov DWORD PTR [c2], ecx
  2413. <a name="l02421"></a>02421
  2414. <a name="l02422"></a>02422 <span class="comment">// 1872 : d2 = back[backline &lt;&lt; 1];</span>
  2415. <a name="l02423"></a>02423
  2416. <a name="l02424"></a>02424 <span class="comment">// mov edx, DWORD PTR [backline] // redundant</span>
  2417. <a name="l02425"></a>02425 shl edx, 1
  2418. <a name="l02426"></a>02426 <span class="comment">// mov eax, DWORD PTR [back] // redundant</span>
  2419. <a name="l02427"></a>02427 mov ecx, DWORD PTR [eax+edx*4]
  2420. <a name="l02428"></a>02428 mov DWORD PTR [d2], ecx
  2421. <a name="l02429"></a>02429
  2422. <a name="l02430"></a>02430 <span class="comment">// 1873 : back++;</span>
  2423. <a name="l02431"></a>02431
  2424. <a name="l02432"></a>02432 <span class="comment">// mov edx, DWORD PTR [back] // redundant</span>
  2425. <a name="l02433"></a>02433 <span class="comment">// add edx, 4 // redundant</span>
  2426. <a name="l02434"></a>02434 <span class="comment">// mov DWORD PTR [back], edx // redundant</span>
  2427. <a name="l02435"></a>02435 <span class="keyword">add</span> eax, 4
  2428. <a name="l02436"></a>02436 mov DWORD PTR [back], eax
  2429. <a name="l02437"></a>02437
  2430. <a name="l02438"></a>02438 <span class="comment">// 1874 :</span>
  2431. <a name="l02439"></a>02439 <span class="comment">// 1875 : for (xx = xsteps;</span>
  2432. <a name="l02440"></a>02440
  2433. <a name="l02441"></a>02441 mov eax, DWORD PTR [xsteps]
  2434. <a name="l02442"></a>02442 mov DWORD PTR [xx], eax
  2435. <a name="l02443"></a>02443
  2436. <a name="l02444"></a>02444 <span class="comment">// 1876 : xx &gt; 0;</span>
  2437. <a name="l02445"></a>02445 <span class="comment">// 1877 : xx--) {</span>
  2438. <a name="l02446"></a>02446
  2439. <a name="l02447"></a>02447 jmp SHORT _L76127
  2440. <a name="l02448"></a>02448
  2441. <a name="l02449"></a>02449 _L76128:
  2442. <a name="l02450"></a>02450 mov ecx, DWORD PTR [xx]
  2443. <a name="l02451"></a>02451 sub ecx, 1
  2444. <a name="l02452"></a>02452 mov DWORD PTR [xx], ecx
  2445. <a name="l02453"></a>02453
  2446. <a name="l02454"></a>02454 _L76127:
  2447. <a name="l02455"></a>02455 cmp DWORD PTR [xx], 0
  2448. <a name="l02456"></a>02456 jle _L76129
  2449. <a name="l02457"></a>02457
  2450. <a name="l02458"></a>02458 <span class="comment">// 1878 : long result, cells = 0;</span>
  2451. <a name="l02459"></a>02459
  2452. <a name="l02460"></a>02460 mov DWORD PTR [cells], 0
  2453. <a name="l02461"></a>02461
  2454. <a name="l02462"></a>02462 <span class="comment">// 1879 :</span>
  2455. <a name="l02463"></a>02463 <span class="comment">// 1880 : b1 = b2; b2 = back[0];</span>
  2456. <a name="l02464"></a>02464
  2457. <a name="l02465"></a>02465 mov edx, DWORD PTR [b2]
  2458. <a name="l02466"></a>02466 mov DWORD PTR [b1], edx
  2459. <a name="l02467"></a>02467 mov eax, DWORD PTR [back]
  2460. <a name="l02468"></a>02468 mov ecx, DWORD PTR [eax]
  2461. <a name="l02469"></a>02469 mov DWORD PTR [b2], ecx
  2462. <a name="l02470"></a>02470
  2463. <a name="l02471"></a>02471 <span class="comment">// 1881 : c1 = c2; c2 = back[backline];</span>
  2464. <a name="l02472"></a>02472
  2465. <a name="l02473"></a>02473 mov edx, DWORD PTR [c2]
  2466. <a name="l02474"></a>02474 mov DWORD PTR [c1], edx
  2467. <a name="l02475"></a>02475 mov ecx, DWORD PTR [backline]
  2468. <a name="l02476"></a>02476 <span class="comment">// mov eax, DWORD PTR [back]</span>
  2469. <a name="l02477"></a>02477 mov edx, DWORD PTR [eax+ecx*4]
  2470. <a name="l02478"></a>02478 mov DWORD PTR [c2], edx
  2471. <a name="l02479"></a>02479
  2472. <a name="l02480"></a>02480 <span class="comment">// 1882 : d1 = d2; d2 = back[backline &lt;&lt; 1];</span>
  2473. <a name="l02481"></a>02481
  2474. <a name="l02482"></a>02482 mov edx, DWORD PTR [d2]
  2475. <a name="l02483"></a>02483 mov DWORD PTR [d1], edx
  2476. <a name="l02484"></a>02484 <span class="comment">// mov ecx, DWORD PTR [backline]</span>
  2477. <a name="l02485"></a>02485 shl ecx, 1
  2478. <a name="l02486"></a>02486 <span class="comment">// mov eax, DWORD PTR [back]</span>
  2479. <a name="l02487"></a>02487 mov edx, DWORD PTR [eax+ecx*4]
  2480. <a name="l02488"></a>02488 mov DWORD PTR [d2], edx
  2481. <a name="l02489"></a>02489
  2482. <a name="l02490"></a>02490 <span class="comment">// 1883 : back++;</span>
  2483. <a name="l02491"></a>02491
  2484. <a name="l02492"></a>02492 <span class="comment">// mov eax, DWORD PTR [back]</span>
  2485. <a name="l02493"></a>02493 <span class="keyword">add</span> eax, 4
  2486. <a name="l02494"></a>02494 mov DWORD PTR [back], eax
  2487. <a name="l02495"></a>02495
  2488. <a name="l02496"></a>02496 <span class="comment">// 1884 :</span>
  2489. <a name="l02497"></a>02497 <span class="comment">// 1885 : FDHEAT( BYTE0(b1), BYTE1(b1), BYTE2(b1),</span>
  2490. <a name="l02498"></a>02498 <span class="comment">// 1886 : BYTE0(c1), BYTE1(c1), BYTE2(c1),</span>
  2491. <a name="l02499"></a>02499 <span class="comment">// 1887 : BYTE0(d1), BYTE1(d1), BYTE2(d1) );</span>
  2492. <a name="l02500"></a>02500
  2493. <a name="l02501"></a>02501 mov edx, DWORD PTR [b1]
  2494. <a name="l02502"></a>02502 and edx, 255 ; 000000ffH
  2495. <a name="l02503"></a>02503 mov eax, DWORD PTR [b1]
  2496. <a name="l02504"></a>02504 sar eax, 8
  2497. <a name="l02505"></a>02505 and eax, 255 ; 000000ffH
  2498. <a name="l02506"></a>02506 <span class="keyword">add</span> edx, eax
  2499. <a name="l02507"></a>02507 mov ecx, DWORD PTR [b1]
  2500. <a name="l02508"></a>02508 sar ecx, 16 ; 00000010H
  2501. <a name="l02509"></a>02509 and ecx, 255 ; 000000ffH
  2502. <a name="l02510"></a>02510 <span class="keyword">add</span> edx, ecx
  2503. <a name="l02511"></a>02511 mov eax, DWORD PTR [c1]
  2504. <a name="l02512"></a>02512 and eax, 255 ; 000000ffH
  2505. <a name="l02513"></a>02513 <span class="keyword">add</span> edx, eax
  2506. <a name="l02514"></a>02514 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2507. <a name="l02515"></a>02515 <span class="keyword">add</span> edx, DWORD PTR [frob]
  2508. <a name="l02516"></a>02516 mov eax, DWORD PTR [c1]
  2509. <a name="l02517"></a>02517 sar eax, 16 ; 00000010H
  2510. <a name="l02518"></a>02518 and eax, 255 ; 000000ffH
  2511. <a name="l02519"></a>02519 <span class="keyword">add</span> edx, eax
  2512. <a name="l02520"></a>02520 mov ecx, DWORD PTR [d1]
  2513. <a name="l02521"></a>02521 and ecx, 255 ; 000000ffH
  2514. <a name="l02522"></a>02522 <span class="keyword">add</span> edx, ecx
  2515. <a name="l02523"></a>02523 mov eax, DWORD PTR [d1]
  2516. <a name="l02524"></a>02524 sar eax, 8
  2517. <a name="l02525"></a>02525 and eax, 255 ; 000000ffH
  2518. <a name="l02526"></a>02526 <span class="keyword">add</span> edx, eax
  2519. <a name="l02527"></a>02527 mov ecx, DWORD PTR [d1]
  2520. <a name="l02528"></a>02528 sar ecx, 16 ; 00000010H
  2521. <a name="l02529"></a>02529 and ecx, 255 ; 000000ffH
  2522. <a name="l02530"></a>02530 <span class="keyword">add</span> ecx, DWORD PTR [error]
  2523. <a name="l02531"></a>02531 <span class="keyword">add</span> ecx, edx
  2524. <a name="l02532"></a>02532 mov DWORD PTR [error], ecx
  2525. <a name="l02533"></a>02533 mov edx, DWORD PTR [error]
  2526. <a name="l02534"></a>02534 sar edx, 3
  2527. <a name="l02535"></a>02535 mov DWORD PTR [result], edx
  2528. <a name="l02536"></a>02536 mov eax, DWORD PTR [error]
  2529. <a name="l02537"></a>02537 and eax, 7
  2530. <a name="l02538"></a>02538 mov DWORD PTR [error], eax
  2531. <a name="l02539"></a>02539
  2532. <a name="l02540"></a>02540 <span class="comment">// 1888 : total += result;</span>
  2533. <a name="l02541"></a>02541
  2534. <a name="l02542"></a>02542 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2535. <a name="l02543"></a>02543 mov edx, DWORD PTR [total]
  2536. <a name="l02544"></a>02544 <span class="keyword">add</span> edx, DWORD PTR [result]
  2537. <a name="l02545"></a>02545 <span class="comment">// mov eax, DWORD PTR [this]</span>
  2538. <a name="l02546"></a>02546 mov DWORD PTR [total], edx
  2539. <a name="l02547"></a>02547
  2540. <a name="l02548"></a>02548 <span class="comment">// 1889 : SETBYTE0(cells, result);</span>
  2541. <a name="l02549"></a>02549
  2542. <a name="l02550"></a>02550 mov ecx, DWORD PTR [cells]
  2543. <a name="l02551"></a>02551 and ecx, -256 ; ffffff00H
  2544. <a name="l02552"></a>02552 mov edx, DWORD PTR [result]
  2545. <a name="l02553"></a>02553 and edx, 255 ; 000000ffH
  2546. <a name="l02554"></a>02554 or ecx, edx
  2547. <a name="l02555"></a>02555 mov DWORD PTR [cells], ecx
  2548. <a name="l02556"></a>02556
  2549. <a name="l02557"></a>02557 <span class="comment">// 1890 :</span>
  2550. <a name="l02558"></a>02558 <span class="comment">// 1891 : FDHEAT( BYTE1(b1), BYTE2(b1), BYTE3(b1),</span>
  2551. <a name="l02559"></a>02559 <span class="comment">// 1892 : BYTE1(c1), BYTE2(c1), BYTE3(c1),</span>
  2552. <a name="l02560"></a>02560 <span class="comment">// 1893 : BYTE1(d1), BYTE2(d1), BYTE3(d1) );</span>
  2553. <a name="l02561"></a>02561
  2554. <a name="l02562"></a>02562 mov eax, DWORD PTR [b1]
  2555. <a name="l02563"></a>02563 sar eax, 8
  2556. <a name="l02564"></a>02564 and eax, 255 ; 000000ffH
  2557. <a name="l02565"></a>02565 mov ecx, DWORD PTR [b1]
  2558. <a name="l02566"></a>02566 sar ecx, 16 ; 00000010H
  2559. <a name="l02567"></a>02567 and ecx, 255 ; 000000ffH
  2560. <a name="l02568"></a>02568 <span class="keyword">add</span> eax, ecx
  2561. <a name="l02569"></a>02569 mov edx, DWORD PTR [b1]
  2562. <a name="l02570"></a>02570 sar edx, 24 ; 00000018H
  2563. <a name="l02571"></a>02571 and edx, 255 ; 000000ffH
  2564. <a name="l02572"></a>02572 <span class="keyword">add</span> eax, edx
  2565. <a name="l02573"></a>02573 mov ecx, DWORD PTR [c1]
  2566. <a name="l02574"></a>02574 sar ecx, 8
  2567. <a name="l02575"></a>02575 and ecx, 255 ; 000000ffH
  2568. <a name="l02576"></a>02576 <span class="keyword">add</span> eax, ecx
  2569. <a name="l02577"></a>02577 <span class="comment">// mov edx, DWORD PTR [this]</span>
  2570. <a name="l02578"></a>02578 <span class="keyword">add</span> eax, DWORD PTR [frob]
  2571. <a name="l02579"></a>02579 mov ecx, DWORD PTR [c1]
  2572. <a name="l02580"></a>02580 sar ecx, 24 ; 00000018H
  2573. <a name="l02581"></a>02581 and ecx, 255 ; 000000ffH
  2574. <a name="l02582"></a>02582 <span class="keyword">add</span> eax, ecx
  2575. <a name="l02583"></a>02583 mov edx, DWORD PTR [d1]
  2576. <a name="l02584"></a>02584 sar edx, 8
  2577. <a name="l02585"></a>02585 and edx, 255 ; 000000ffH
  2578. <a name="l02586"></a>02586 <span class="keyword">add</span> eax, edx
  2579. <a name="l02587"></a>02587 mov ecx, DWORD PTR [d1]
  2580. <a name="l02588"></a>02588 sar ecx, 16 ; 00000010H
  2581. <a name="l02589"></a>02589 and ecx, 255 ; 000000ffH
  2582. <a name="l02590"></a>02590 <span class="keyword">add</span> eax, ecx
  2583. <a name="l02591"></a>02591 mov edx, DWORD PTR [d1]
  2584. <a name="l02592"></a>02592 sar edx, 24 ; 00000018H
  2585. <a name="l02593"></a>02593 and edx, 255 ; 000000ffH
  2586. <a name="l02594"></a>02594 <span class="keyword">add</span> edx, DWORD PTR [error]
  2587. <a name="l02595"></a>02595 <span class="keyword">add</span> edx, eax
  2588. <a name="l02596"></a>02596 mov DWORD PTR [error], edx
  2589. <a name="l02597"></a>02597 <span class="comment">// mov eax, DWORD PTR [error]</span>
  2590. <a name="l02598"></a>02598 mov eax, edx
  2591. <a name="l02599"></a>02599 sar eax, 3
  2592. <a name="l02600"></a>02600 mov DWORD PTR [result], eax
  2593. <a name="l02601"></a>02601 <span class="comment">// mov ecx, DWORD PTR [error]</span>
  2594. <a name="l02602"></a>02602 and edx, 7
  2595. <a name="l02603"></a>02603 mov DWORD PTR [error], edx
  2596. <a name="l02604"></a>02604
  2597. <a name="l02605"></a>02605 <span class="comment">// 1894 : total += result;</span>
  2598. <a name="l02606"></a>02606
  2599. <a name="l02607"></a>02607 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2600. <a name="l02608"></a>02608 mov edx, DWORD PTR [total]
  2601. <a name="l02609"></a>02609 <span class="keyword">add</span> edx, DWORD PTR [result]
  2602. <a name="l02610"></a>02610 <span class="comment">// mov eax, DWORD PTR [this]</span>
  2603. <a name="l02611"></a>02611 mov DWORD PTR [total], edx
  2604. <a name="l02612"></a>02612
  2605. <a name="l02613"></a>02613 <span class="comment">// 1895 : SETBYTE1(cells, result);</span>
  2606. <a name="l02614"></a>02614
  2607. <a name="l02615"></a>02615 mov edx, DWORD PTR [cells]
  2608. <a name="l02616"></a>02616 and edx, -65281 ; ffff00ffH
  2609. <a name="l02617"></a>02617 mov eax, DWORD PTR [result]
  2610. <a name="l02618"></a>02618 shl eax, 8
  2611. <a name="l02619"></a>02619 and eax, 65280 ; 0000ff00H
  2612. <a name="l02620"></a>02620 or edx, eax
  2613. <a name="l02621"></a>02621 mov DWORD PTR [cells], edx
  2614. <a name="l02622"></a>02622
  2615. <a name="l02623"></a>02623 <span class="comment">// 1896 :</span>
  2616. <a name="l02624"></a>02624 <span class="comment">// 1897 : FDHEAT( BYTE2(b1), BYTE3(b1), BYTE0(b2),</span>
  2617. <a name="l02625"></a>02625 <span class="comment">// 1898 : BYTE2(c1), BYTE3(c1), BYTE0(c2),</span>
  2618. <a name="l02626"></a>02626 <span class="comment">// 1899 : BYTE2(d1), BYTE3(d1), BYTE0(d2) );</span>
  2619. <a name="l02627"></a>02627
  2620. <a name="l02628"></a>02628 mov ecx, DWORD PTR [b1]
  2621. <a name="l02629"></a>02629 sar ecx, 16 ; 00000010H
  2622. <a name="l02630"></a>02630 and ecx, 255 ; 000000ffH
  2623. <a name="l02631"></a>02631 mov edx, DWORD PTR [b1]
  2624. <a name="l02632"></a>02632 sar edx, 24 ; 00000018H
  2625. <a name="l02633"></a>02633 and edx, 255 ; 000000ffH
  2626. <a name="l02634"></a>02634 <span class="keyword">add</span> ecx, edx
  2627. <a name="l02635"></a>02635 mov eax, DWORD PTR [b2]
  2628. <a name="l02636"></a>02636 and eax, 255 ; 000000ffH
  2629. <a name="l02637"></a>02637 <span class="keyword">add</span> ecx, eax
  2630. <a name="l02638"></a>02638 mov edx, DWORD PTR [c1]
  2631. <a name="l02639"></a>02639 sar edx, 16 ; 00000010H
  2632. <a name="l02640"></a>02640 and edx, 255 ; 000000ffH
  2633. <a name="l02641"></a>02641 <span class="keyword">add</span> ecx, edx
  2634. <a name="l02642"></a>02642 <span class="comment">// mov eax, DWORD PTR [this]</span>
  2635. <a name="l02643"></a>02643 <span class="keyword">add</span> ecx, DWORD PTR [frob]
  2636. <a name="l02644"></a>02644 mov edx, DWORD PTR [c2]
  2637. <a name="l02645"></a>02645 and edx, 255 ; 000000ffH
  2638. <a name="l02646"></a>02646 <span class="keyword">add</span> ecx, edx
  2639. <a name="l02647"></a>02647 mov eax, DWORD PTR [d1]
  2640. <a name="l02648"></a>02648 sar eax, 16 ; 00000010H
  2641. <a name="l02649"></a>02649 and eax, 255 ; 000000ffH
  2642. <a name="l02650"></a>02650 <span class="keyword">add</span> ecx, eax
  2643. <a name="l02651"></a>02651 mov edx, DWORD PTR [d1]
  2644. <a name="l02652"></a>02652 sar edx, 24 ; 00000018H
  2645. <a name="l02653"></a>02653 and edx, 255 ; 000000ffH
  2646. <a name="l02654"></a>02654 <span class="keyword">add</span> ecx, edx
  2647. <a name="l02655"></a>02655 mov eax, DWORD PTR [d2]
  2648. <a name="l02656"></a>02656 and eax, 255 ; 000000ffH
  2649. <a name="l02657"></a>02657 <span class="keyword">add</span> eax, DWORD PTR [error]
  2650. <a name="l02658"></a>02658 <span class="keyword">add</span> eax, ecx
  2651. <a name="l02659"></a>02659 mov DWORD PTR [error], eax
  2652. <a name="l02660"></a>02660 <span class="comment">// mov ecx, DWORD PTR [error]</span>
  2653. <a name="l02661"></a>02661 mov ecx, eax
  2654. <a name="l02662"></a>02662 sar ecx, 3
  2655. <a name="l02663"></a>02663 mov DWORD PTR [result], ecx
  2656. <a name="l02664"></a>02664 <span class="comment">// mov edx, DWORD PTR [error]</span>
  2657. <a name="l02665"></a>02665 and eax, 7
  2658. <a name="l02666"></a>02666 mov DWORD PTR [error], eax
  2659. <a name="l02667"></a>02667
  2660. <a name="l02668"></a>02668 <span class="comment">// 1900 : total += result;</span>
  2661. <a name="l02669"></a>02669
  2662. <a name="l02670"></a>02670 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2663. <a name="l02671"></a>02671 mov edx, DWORD PTR [total]
  2664. <a name="l02672"></a>02672 <span class="keyword">add</span> edx, DWORD PTR [result]
  2665. <a name="l02673"></a>02673 <span class="comment">// mov eax, DWORD PTR [this]</span>
  2666. <a name="l02674"></a>02674 mov DWORD PTR [total], edx
  2667. <a name="l02675"></a>02675
  2668. <a name="l02676"></a>02676 <span class="comment">// 1901 : SETBYTE2(cells, result);</span>
  2669. <a name="l02677"></a>02677
  2670. <a name="l02678"></a>02678 mov eax, DWORD PTR [cells]
  2671. <a name="l02679"></a>02679 and eax, -16711681 ; ff00ffffH
  2672. <a name="l02680"></a>02680 mov ecx, DWORD PTR [result]
  2673. <a name="l02681"></a>02681 shl ecx, 16 ; 00000010H
  2674. <a name="l02682"></a>02682 and ecx, 16711680 ; 00ff0000H
  2675. <a name="l02683"></a>02683 or eax, ecx
  2676. <a name="l02684"></a>02684 mov DWORD PTR [cells], eax
  2677. <a name="l02685"></a>02685
  2678. <a name="l02686"></a>02686 <span class="comment">// 1902 :</span>
  2679. <a name="l02687"></a>02687 <span class="comment">// 1903 : FDHEAT( BYTE3(b1), BYTE0(b2), BYTE1(b2),</span>
  2680. <a name="l02688"></a>02688 <span class="comment">// 1904 : BYTE3(c1), BYTE0(c2), BYTE1(c2),</span>
  2681. <a name="l02689"></a>02689 <span class="comment">// 1905 : BYTE3(d1), BYTE0(d2), BYTE1(d2) );</span>
  2682. <a name="l02690"></a>02690
  2683. <a name="l02691"></a>02691 mov edx, DWORD PTR [b1]
  2684. <a name="l02692"></a>02692 sar edx, 24 ; 00000018H
  2685. <a name="l02693"></a>02693 and edx, 255 ; 000000ffH
  2686. <a name="l02694"></a>02694 mov eax, DWORD PTR [b2]
  2687. <a name="l02695"></a>02695 and eax, 255 ; 000000ffH
  2688. <a name="l02696"></a>02696 <span class="keyword">add</span> edx, eax
  2689. <a name="l02697"></a>02697 mov ecx, DWORD PTR [b2]
  2690. <a name="l02698"></a>02698 sar ecx, 8
  2691. <a name="l02699"></a>02699 and ecx, 255 ; 000000ffH
  2692. <a name="l02700"></a>02700 <span class="keyword">add</span> edx, ecx
  2693. <a name="l02701"></a>02701 mov eax, DWORD PTR [c1]
  2694. <a name="l02702"></a>02702 sar eax, 24 ; 00000018H
  2695. <a name="l02703"></a>02703 and eax, 255 ; 000000ffH
  2696. <a name="l02704"></a>02704 <span class="keyword">add</span> edx, eax
  2697. <a name="l02705"></a>02705 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2698. <a name="l02706"></a>02706 <span class="keyword">add</span> edx, DWORD PTR [frob]
  2699. <a name="l02707"></a>02707 mov eax, DWORD PTR [c2]
  2700. <a name="l02708"></a>02708 sar eax, 8
  2701. <a name="l02709"></a>02709 and eax, 255 ; 000000ffH
  2702. <a name="l02710"></a>02710 <span class="keyword">add</span> edx, eax
  2703. <a name="l02711"></a>02711 mov ecx, DWORD PTR [d1]
  2704. <a name="l02712"></a>02712 sar ecx, 24 ; 00000018H
  2705. <a name="l02713"></a>02713 and ecx, 255 ; 000000ffH
  2706. <a name="l02714"></a>02714 <span class="keyword">add</span> edx, ecx
  2707. <a name="l02715"></a>02715 mov eax, DWORD PTR [d2]
  2708. <a name="l02716"></a>02716 and eax, 255 ; 000000ffH
  2709. <a name="l02717"></a>02717 <span class="keyword">add</span> edx, eax
  2710. <a name="l02718"></a>02718 mov ecx, DWORD PTR [d2]
  2711. <a name="l02719"></a>02719 sar ecx, 8
  2712. <a name="l02720"></a>02720 and ecx, 255 ; 000000ffH
  2713. <a name="l02721"></a>02721 <span class="keyword">add</span> ecx, DWORD PTR [error]
  2714. <a name="l02722"></a>02722 <span class="keyword">add</span> ecx, edx
  2715. <a name="l02723"></a>02723 mov DWORD PTR [error], ecx
  2716. <a name="l02724"></a>02724 <span class="comment">// mov edx, DWORD PTR [error]</span>
  2717. <a name="l02725"></a>02725 mov edx, ecx
  2718. <a name="l02726"></a>02726 sar edx, 3
  2719. <a name="l02727"></a>02727 mov DWORD PTR [result], edx
  2720. <a name="l02728"></a>02728 <span class="comment">// mov eax, DWORD PTR [error]</span>
  2721. <a name="l02729"></a>02729 and ecx, 7
  2722. <a name="l02730"></a>02730 mov DWORD PTR [error], ecx
  2723. <a name="l02731"></a>02731
  2724. <a name="l02732"></a>02732 <span class="comment">// 1906 : total += result;</span>
  2725. <a name="l02733"></a>02733
  2726. <a name="l02734"></a>02734 <span class="comment">// mov ecx, DWORD PTR [this]</span>
  2727. <a name="l02735"></a>02735 mov edx, DWORD PTR [total]
  2728. <a name="l02736"></a>02736 <span class="keyword">add</span> edx, DWORD PTR [result]
  2729. <a name="l02737"></a>02737 <span class="comment">// mov eax, DWORD PTR [this]</span>
  2730. <a name="l02738"></a>02738 mov DWORD PTR [total], edx
  2731. <a name="l02739"></a>02739
  2732. <a name="l02740"></a>02740 <span class="comment">// 1907 : SETBYTE3(cells, result);</span>
  2733. <a name="l02741"></a>02741
  2734. <a name="l02742"></a>02742 mov ecx, DWORD PTR [cells]
  2735. <a name="l02743"></a>02743 and ecx, 16777215 ; 00ffffffH
  2736. <a name="l02744"></a>02744 mov edx, DWORD PTR [result]
  2737. <a name="l02745"></a>02745 shl edx, 24 ; 00000018H
  2738. <a name="l02746"></a>02746 and edx, -16777216 ; ff000000H
  2739. <a name="l02747"></a>02747 or ecx, edx
  2740. <a name="l02748"></a>02748 mov DWORD PTR [cells], ecx
  2741. <a name="l02749"></a>02749
  2742. <a name="l02750"></a>02750 <span class="comment">// 1908 :</span>
  2743. <a name="l02751"></a>02751 <span class="comment">// 1909 : *front = cells;</span>
  2744. <a name="l02752"></a>02752
  2745. <a name="l02753"></a>02753 mov eax, DWORD PTR [front]
  2746. <a name="l02754"></a>02754 mov ecx, DWORD PTR [cells]
  2747. <a name="l02755"></a>02755 mov DWORD PTR [eax], ecx
  2748. <a name="l02756"></a>02756
  2749. <a name="l02757"></a>02757 <span class="comment">// 1910 : front++;</span>
  2750. <a name="l02758"></a>02758
  2751. <a name="l02759"></a>02759 <span class="comment">// mov eax, DWORD PTR [front]</span>
  2752. <a name="l02760"></a>02760 <span class="keyword">add</span> eax, 4
  2753. <a name="l02761"></a>02761 mov DWORD PTR [front], eax
  2754. <a name="l02762"></a>02762
  2755. <a name="l02763"></a>02763 <span class="comment">// 1911 : } // for xx</span>
  2756. <a name="l02764"></a>02764
  2757. <a name="l02765"></a>02765 jmp _L76128
  2758. <a name="l02766"></a>02766
  2759. <a name="l02767"></a>02767 _L76129:
  2760. <a name="l02768"></a>02768
  2761. <a name="l02769"></a>02769 <span class="comment">// 1912 : } // for yy</span>
  2762. <a name="l02770"></a>02770
  2763. <a name="l02771"></a>02771 jmp _L76117
  2764. <a name="l02772"></a>02772
  2765. <a name="l02773"></a>02773 _L76118:
  2766. <a name="l02774"></a>02774 mov ecx, DWORD PTR [<span class="keyword">this</span>]
  2767. <a name="l02775"></a>02775 mov eax, DWORD PTR [total]
  2768. <a name="l02776"></a>02776 mov DWORD PTR [ecx].total, eax
  2769. <a name="l02777"></a>02777
  2770. <a name="l02778"></a>02778 } <span class="comment">// asm</span>
  2771. <a name="l02779"></a>02779 }
  2772. <a name="l02780"></a>02780
  2773. <a name="l02781"></a>02781
  2774. <a name="l02782"></a>02782 <span class="preprocessor">#endif</span>
  2775. <a name="l02783"></a>02783 <span class="preprocessor"></span>
  2776. <a name="l02784"></a>02784
  2777. <a name="l02785"></a>02785
  2778. <a name="l02786"></a>02786 <span class="preprocessor">#define FABCDHEAT(nw, n, ne, w, c, e, sw, s, se) \</span>
  2779. <a name="l02787"></a>02787 <span class="preprocessor"> error += (n + s + w + e + frobby); \</span>
  2780. <a name="l02788"></a>02788 <span class="preprocessor"> result = error &gt;&gt; 2; \</span>
  2781. <a name="l02789"></a>02789 <span class="preprocessor"> error &amp;= 3; \</span>
  2782. <a name="l02790"></a>02790 <span class="preprocessor"> frobby = -frobby;</span>
  2783. <a name="l02791"></a>02791 <span class="preprocessor"></span>
  2784. <a name="l02792"></a>02792 <span class="keywordtype">void</span> CellEngine::n_fabcdheat()
  2785. <a name="l02793"></a>02793 {
  2786. <a name="l02794"></a>02794 QUAD *front = (QUAD *)frontMem;
  2787. <a name="l02795"></a>02795 QUAD *back = (QUAD *)(backMem +
  2788. <a name="l02796"></a>02796 (backBorder - 1) +
  2789. <a name="l02797"></a>02797 ((backBorder - 1) * backRowBytes));
  2790. <a name="l02798"></a>02798 <span class="keywordtype">long</span> frobby = frob;
  2791. <a name="l02799"></a>02799 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  2792. <a name="l02800"></a>02800 <span class="keywordtype">long</span> nextbackline = backline &lt;&lt; 1;
  2793. <a name="l02801"></a>02801 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  2794. <a name="l02802"></a>02802 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  2795. <a name="l02803"></a>02803 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  2796. <a name="l02804"></a>02804 <span class="keywordtype">long</span> yy;
  2797. <a name="l02805"></a>02805
  2798. <a name="l02806"></a>02806 total = 0;
  2799. <a name="l02807"></a>02807
  2800. <a name="l02808"></a>02808 <span class="comment">// flip frob with the spatio-temporal phase,</span>
  2801. <a name="l02809"></a>02809 <span class="comment">// since interlaced checkerboards</span>
  2802. <a name="l02810"></a>02810 <span class="comment">// exchange places each step.</span>
  2803. <a name="l02811"></a>02811 <span class="keywordflow">if</span> ((phase ^ x ^ y) &amp; 1) {
  2804. <a name="l02812"></a>02812 frobby = -frobby;
  2805. <a name="l02813"></a>02813 }
  2806. <a name="l02814"></a>02814
  2807. <a name="l02815"></a>02815 <span class="keywordflow">for</span> (yy = height;
  2808. <a name="l02816"></a>02816 yy &gt; 0;
  2809. <a name="l02817"></a>02817 back += backstride,
  2810. <a name="l02818"></a>02818 front += frontstride,
  2811. <a name="l02819"></a>02819 yy--) {
  2812. <a name="l02820"></a>02820 <span class="keyword">register</span> QUAD b1, b2;
  2813. <a name="l02821"></a>02821 <span class="keyword">register</span> QUAD c1, c2;
  2814. <a name="l02822"></a>02822 <span class="keyword">register</span> QUAD d1, d2;
  2815. <a name="l02823"></a>02823 <span class="keywordtype">long</span> error = 0;
  2816. <a name="l02824"></a>02824 <span class="keywordtype">long</span> xx;
  2817. <a name="l02825"></a>02825
  2818. <a name="l02826"></a>02826 <span class="comment">// Flip frob each y line, to apply opposite frobs</span>
  2819. <a name="l02827"></a>02827 <span class="comment">// to each spatial phase of the checkerboard.</span>
  2820. <a name="l02828"></a>02828 <span class="comment">// This works because the width must be divisible by 4.</span>
  2821. <a name="l02829"></a>02829 frobby = -frobby;
  2822. <a name="l02830"></a>02830
  2823. <a name="l02831"></a>02831 b2 = back[0];
  2824. <a name="l02832"></a>02832 c2 = back[backline];
  2825. <a name="l02833"></a>02833 d2 = back[nextbackline];
  2826. <a name="l02834"></a>02834 back++;
  2827. <a name="l02835"></a>02835
  2828. <a name="l02836"></a>02836 <span class="keywordflow">for</span> (xx = xsteps;
  2829. <a name="l02837"></a>02837 xx &gt; 0;
  2830. <a name="l02838"></a>02838 xx--) {
  2831. <a name="l02839"></a>02839 <span class="keywordtype">long</span> result, cells = 0;
  2832. <a name="l02840"></a>02840
  2833. <a name="l02841"></a>02841 b1 = b2; b2 = back[0];
  2834. <a name="l02842"></a>02842 c1 = c2; c2 = back[backline];
  2835. <a name="l02843"></a>02843 d1 = d2; d2 = back[nextbackline];
  2836. <a name="l02844"></a>02844 back++;
  2837. <a name="l02845"></a>02845
  2838. <a name="l02846"></a>02846 FABCDHEAT( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  2839. <a name="l02847"></a>02847 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  2840. <a name="l02848"></a>02848 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  2841. <a name="l02849"></a>02849 SETBYTE0(cells, result);
  2842. <a name="l02850"></a>02850 total += result;
  2843. <a name="l02851"></a>02851
  2844. <a name="l02852"></a>02852 FABCDHEAT( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  2845. <a name="l02853"></a>02853 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  2846. <a name="l02854"></a>02854 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  2847. <a name="l02855"></a>02855 SETBYTE1(cells, result);
  2848. <a name="l02856"></a>02856 total += result;
  2849. <a name="l02857"></a>02857
  2850. <a name="l02858"></a>02858 FABCDHEAT( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  2851. <a name="l02859"></a>02859 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  2852. <a name="l02860"></a>02860 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  2853. <a name="l02861"></a>02861 SETBYTE2(cells, result);
  2854. <a name="l02862"></a>02862 total += result;
  2855. <a name="l02863"></a>02863
  2856. <a name="l02864"></a>02864 FABCDHEAT( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  2857. <a name="l02865"></a>02865 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  2858. <a name="l02866"></a>02866 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  2859. <a name="l02867"></a>02867 SETBYTE3(cells, result);
  2860. <a name="l02868"></a>02868 total += result;
  2861. <a name="l02869"></a>02869
  2862. <a name="l02870"></a>02870 front++;
  2863. <a name="l02871"></a>02871 *front = cells;
  2864. <a name="l02872"></a>02872 }
  2865. <a name="l02873"></a>02873 }
  2866. <a name="l02874"></a>02874 }
  2867. <a name="l02875"></a>02875
  2868. <a name="l02876"></a>02876
  2869. <a name="l02877"></a>02877 <span class="preprocessor">#define SUM8R(m, nw, n, ne, w, c, e, sw, s, se) \</span>
  2870. <a name="l02878"></a>02878 <span class="preprocessor"> (((nw&amp;m) + (n&amp;m) + (ne&amp;m) + (w&amp;m) + (e&amp;m) + (sw&amp;m) + (s&amp;m) + (se&amp;m)))</span>
  2871. <a name="l02879"></a>02879 <span class="preprocessor"></span>
  2872. <a name="l02880"></a>02880 <span class="preprocessor">#define SUM9R(m, nw, n, ne, w, c, e, sw, s, se) \</span>
  2873. <a name="l02881"></a>02881 <span class="preprocessor"> (((nw&amp;m) + (n&amp;m) + (ne&amp;m) + (w&amp;m) + (c&amp;m) + (e&amp;m) + (sw&amp;m) + (s&amp;m) + (se&amp;m)))</span>
  2874. <a name="l02882"></a>02882 <span class="preprocessor"></span>
  2875. <a name="l02883"></a>02883 <span class="preprocessor">#define RISCA(nw, n, ne, w, c, e, sw, s, se) \</span>
  2876. <a name="l02884"></a>02884 <span class="preprocessor"> result = c &amp; 0xf0; \</span>
  2877. <a name="l02885"></a>02885 <span class="preprocessor"> switch (result) { \</span>
  2878. <a name="l02886"></a>02886 <span class="preprocessor"> case 0x00: </span><span class="comment">/* c */</span> \
  2879. <a name="l02887"></a>02887 result |= (c &amp; 0x0f) ; \
  2880. <a name="l02888"></a>02888 break; \
  2881. <a name="l02889"></a>02889 case 0x10: <span class="comment">/* life */</span> \
  2882. <a name="l02890"></a>02890 sum = (SUM8R(8, nw, n, ne, w, c, e, sw, s, se) &gt;&gt; 3); \
  2883. <a name="l02891"></a>02891 result |= ((c &amp; 0x0e) &gt;&gt; 1) | \
  2884. <a name="l02892"></a>02892 ((((c &amp; 1) &amp;&amp; ((sum == 2) || (sum == 3))) || \
  2885. <a name="l02893"></a>02893 (sum == 3)) &lt;&lt; 3); \
  2886. <a name="l02894"></a>02894 break; \
  2887. <a name="l02895"></a>02895 case 0x20: <span class="comment">/* brain */</span> \
  2888. <a name="l02896"></a>02896 result |= ((c &amp; 0x0e) &gt;&gt; 1) | \
  2889. <a name="l02897"></a>02897 ((((c &amp; 0x03) == 0) &amp;&amp; \
  2890. <a name="l02898"></a>02898 ((SUM8R(8, nw, n, ne, w, c, e, sw, s, se) &gt;&gt; 3) == 2)) &lt;&lt; 3); \
  2891. <a name="l02899"></a>02899 break; \
  2892. <a name="l02900"></a>02900 case 0x30: <span class="comment">/* torben */</span> \
  2893. <a name="l02901"></a>02901 sum = (SUM9R(8, nw, n, ne, w, c, e, sw, s, se) &gt;&gt; 3); \
  2894. <a name="l02902"></a>02902 result |= ((c &amp; 0x0e) &gt;&gt; 1) | \
  2895. <a name="l02903"></a>02903 (((sum &gt; 6) || (sum == 5) || (sum == 3)) &lt;&lt; 3); \
  2896. <a name="l02904"></a>02904 break; \
  2897. <a name="l02905"></a>02905 case 0x40: <span class="comment">/* anneal */</span> \
  2898. <a name="l02906"></a>02906 sum = (SUM9R(8, nw, n, ne, w, c, e, sw, s, se) &gt;&gt; 3); \
  2899. <a name="l02907"></a>02907 result |= ((c &amp; 0x0e) &gt;&gt; 1) | \
  2900. <a name="l02908"></a>02908 (((sum &gt; 5) || (sum == 4)) &lt;&lt; 3); \
  2901. <a name="l02909"></a>02909 break; \
  2902. <a name="l02910"></a>02910 case 0x50: <span class="comment">/* ditto */</span> \
  2903. <a name="l02911"></a>02911 sum = (SUM9R(8, nw, n, ne, w, c, e, sw, s, se) &gt;&gt; 3); \
  2904. <a name="l02912"></a>02912 result |= ((c &amp; 0x0e) &gt;&gt; 1) | \
  2905. <a name="l02913"></a>02913 ((sum &gt; 5) &lt;&lt; 3); \
  2906. <a name="l02914"></a>02914 break; \
  2907. <a name="l02915"></a>02915 case 0x60: <span class="comment">/* logic */</span> \
  2908. <a name="l02916"></a>02916 { result |= (c &amp; 0x07); \
  2909. <a name="l02917"></a>02917 switch (c &amp; 0x0f) { \
  2910. <a name="l02918"></a>02918 case 0x00: <span class="comment">/* and */</span> \
  2911. <a name="l02919"></a>02919 case 0x08: \
  2912. <a name="l02920"></a>02920 result |= (nw &amp; w) &amp; 8; \
  2913. <a name="l02921"></a>02921 break; \
  2914. <a name="l02922"></a>02922 case 0x01: <span class="comment">/* or */</span> \
  2915. <a name="l02923"></a>02923 case 0x09: \
  2916. <a name="l02924"></a>02924 result |= (nw | w) &amp; 8; \
  2917. <a name="l02925"></a>02925 break; \
  2918. <a name="l02926"></a>02926 case 0x02: <span class="comment">/* xor */</span> \
  2919. <a name="l02927"></a>02927 case 0x0a: \
  2920. <a name="l02928"></a>02928 result |= (nw ^ w) &amp; 8; \
  2921. <a name="l02929"></a>02929 break; \
  2922. <a name="l02930"></a>02930 case 0x03: <span class="comment">/* nand */</span> \
  2923. <a name="l02931"></a>02931 case 0x0b: \
  2924. <a name="l02932"></a>02932 result |= (~(nw &amp; w)) &amp; 8; \
  2925. <a name="l02933"></a>02933 break; \
  2926. <a name="l02934"></a>02934 case 0x04: <span class="comment">/* nor */</span> \
  2927. <a name="l02935"></a>02935 case 0x0c: \
  2928. <a name="l02936"></a>02936 result |= (~(nw | w)) &amp; 8; \
  2929. <a name="l02937"></a>02937 break; \
  2930. <a name="l02938"></a>02938 case 0x05: <span class="comment">/* equiv */</span> \
  2931. <a name="l02939"></a>02939 case 0x0d: \
  2932. <a name="l02940"></a>02940 result |= (~(nw ^ w)) &amp; 8; \
  2933. <a name="l02941"></a>02941 break; \
  2934. <a name="l02942"></a>02942 case 0x06: <span class="comment">/* flip state 0 */</span> \
  2935. <a name="l02943"></a>02943 result |= (nw &amp; 8); \
  2936. <a name="l02944"></a>02944 break; \
  2937. <a name="l02945"></a>02945 case 0x0e: <span class="comment">/* flop state 1 */</span> \
  2938. <a name="l02946"></a>02946 result |= ((~w) &amp; 8); \
  2939. <a name="l02947"></a>02947 break; \
  2940. <a name="l02948"></a>02948 case 0x07: <span class="comment">/* relay */</span> \
  2941. <a name="l02949"></a>02949 case 0x0f: \
  2942. <a name="l02950"></a>02950 result |= ((w &amp; 8) ? sw : nw) &amp; 8; \
  2943. <a name="l02951"></a>02951 break; \
  2944. <a name="l02952"></a>02952 } \
  2945. <a name="l02953"></a>02953 } \
  2946. <a name="l02954"></a>02954 break; \
  2947. <a name="l02955"></a>02955 case 0x70: <span class="comment">/* n */</span> \
  2948. <a name="l02956"></a>02956 result |= (n &amp; 0x0f) ; \
  2949. <a name="l02957"></a>02957 break; \
  2950. <a name="l02958"></a>02958 case 0x80: <span class="comment">/* nw */</span> \
  2951. <a name="l02959"></a>02959 result |= (nw &amp; 0x0f) ; \
  2952. <a name="l02960"></a>02960 break; \
  2953. <a name="l02961"></a>02961 case 0x90: <span class="comment">/* w */</span> \
  2954. <a name="l02962"></a>02962 result |= (w &amp; 0x0f) ; \
  2955. <a name="l02963"></a>02963 break; \
  2956. <a name="l02964"></a>02964 case 0xa0: <span class="comment">/* sw */</span> \
  2957. <a name="l02965"></a>02965 result |= (sw &amp; 0x0f) ; \
  2958. <a name="l02966"></a>02966 break; \
  2959. <a name="l02967"></a>02967 case 0xb0: <span class="comment">/* s */</span> \
  2960. <a name="l02968"></a>02968 result |= (s &amp; 0x0f) ; \
  2961. <a name="l02969"></a>02969 break; \
  2962. <a name="l02970"></a>02970 case 0xc0: <span class="comment">/* se */</span> \
  2963. <a name="l02971"></a>02971 result |= (se &amp; 0x0f) ; \
  2964. <a name="l02972"></a>02972 break; \
  2965. <a name="l02973"></a>02973 case 0xd0: <span class="comment">/* e */</span> \
  2966. <a name="l02974"></a>02974 result |= (e &amp; 0x0f) ; \
  2967. <a name="l02975"></a>02975 break; \
  2968. <a name="l02976"></a>02976 case 0xe0: <span class="comment">/* ne */</span> \
  2969. <a name="l02977"></a>02977 result |= (ne &amp; 0x0f) ; \
  2970. <a name="l02978"></a>02978 break; \
  2971. <a name="l02979"></a>02979 case 0xf0: <span class="comment">/* heat */</span> \
  2972. <a name="l02980"></a>02980 leftover += nw + n + ne + w + e + sw + s + se + frob; \
  2973. <a name="l02981"></a>02981 result |= ((leftover &gt;&gt; 3) &amp; 15); \
  2974. <a name="l02982"></a>02982 leftover &amp;= 7; \
  2975. <a name="l02983"></a>02983 break; \
  2976. <a name="l02984"></a>02984 }
  2977. <a name="l02985"></a>02985
  2978. <a name="l02986"></a>02986
  2979. <a name="l02987"></a>02987 <span class="keywordtype">void</span> CellEngine::n_risca()
  2980. <a name="l02988"></a>02988 {
  2981. <a name="l02989"></a>02989 QUAD *front = (QUAD *)frontMem;
  2982. <a name="l02990"></a>02990 QUAD *back = (QUAD *)(backMem +
  2983. <a name="l02991"></a>02991 (backBorder - 1) +
  2984. <a name="l02992"></a>02992 ((backBorder - 1) * backRowBytes));
  2985. <a name="l02993"></a>02993 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  2986. <a name="l02994"></a>02994 <span class="keywordtype">long</span> nextbackline = backline &lt;&lt; 1;
  2987. <a name="l02995"></a>02995 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  2988. <a name="l02996"></a>02996 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  2989. <a name="l02997"></a>02997 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  2990. <a name="l02998"></a>02998 <span class="keywordtype">long</span> yy;
  2991. <a name="l02999"></a>02999 <span class="keywordtype">long</span> leftover = 0;
  2992. <a name="l03000"></a>03000
  2993. <a name="l03001"></a>03001 <span class="keywordflow">for</span> (yy = height;
  2994. <a name="l03002"></a>03002 yy &gt; 0;
  2995. <a name="l03003"></a>03003 back += backstride,
  2996. <a name="l03004"></a>03004 front += frontstride,
  2997. <a name="l03005"></a>03005 yy--) {
  2998. <a name="l03006"></a>03006 <span class="keyword">register</span> QUAD b1, b2;
  2999. <a name="l03007"></a>03007 <span class="keyword">register</span> QUAD c1, c2;
  3000. <a name="l03008"></a>03008 <span class="keyword">register</span> QUAD d1, d2;
  3001. <a name="l03009"></a>03009
  3002. <a name="l03010"></a>03010 b2 = back[0];
  3003. <a name="l03011"></a>03011 c2 = back[backline];
  3004. <a name="l03012"></a>03012 d2 = back[nextbackline];
  3005. <a name="l03013"></a>03013 back++;
  3006. <a name="l03014"></a>03014
  3007. <a name="l03015"></a>03015 <span class="keywordtype">long</span> xx;
  3008. <a name="l03016"></a>03016 <span class="keywordflow">for</span> (xx = xsteps;
  3009. <a name="l03017"></a>03017 xx &gt; 0;
  3010. <a name="l03018"></a>03018 xx--) {
  3011. <a name="l03019"></a>03019 <span class="keywordtype">long</span> result, sum, cells = 0;
  3012. <a name="l03020"></a>03020
  3013. <a name="l03021"></a>03021 b1 = b2; b2 = back[0];
  3014. <a name="l03022"></a>03022 c1 = c2; c2 = back[backline];
  3015. <a name="l03023"></a>03023 d1 = d2; d2 = back[nextbackline];
  3016. <a name="l03024"></a>03024 back++;
  3017. <a name="l03025"></a>03025
  3018. <a name="l03026"></a>03026 RISCA( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  3019. <a name="l03027"></a>03027 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  3020. <a name="l03028"></a>03028 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  3021. <a name="l03029"></a>03029 SETBYTE0(cells, result);
  3022. <a name="l03030"></a>03030
  3023. <a name="l03031"></a>03031 RISCA( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  3024. <a name="l03032"></a>03032 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  3025. <a name="l03033"></a>03033 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  3026. <a name="l03034"></a>03034 SETBYTE1(cells, result);
  3027. <a name="l03035"></a>03035
  3028. <a name="l03036"></a>03036 RISCA( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  3029. <a name="l03037"></a>03037 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  3030. <a name="l03038"></a>03038 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  3031. <a name="l03039"></a>03039 SETBYTE2(cells, result);
  3032. <a name="l03040"></a>03040
  3033. <a name="l03041"></a>03041 RISCA( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  3034. <a name="l03042"></a>03042 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  3035. <a name="l03043"></a>03043 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  3036. <a name="l03044"></a>03044 SETBYTE3(cells, result);
  3037. <a name="l03045"></a>03045
  3038. <a name="l03046"></a>03046 *front = cells;
  3039. <a name="l03047"></a>03047 front++;
  3040. <a name="l03048"></a>03048 }
  3041. <a name="l03049"></a>03049 }
  3042. <a name="l03050"></a>03050 }
  3043. <a name="l03051"></a>03051
  3044. <a name="l03052"></a>03052
  3045. <a name="l03053"></a>03053 <span class="keywordtype">void</span> CellEngine::n_insert()
  3046. <a name="l03054"></a>03054 {
  3047. <a name="l03055"></a>03055 <span class="keywordtype">long</span> mask = (frob &gt;&gt; 8) &amp; 0xff;
  3048. <a name="l03056"></a>03056 <span class="keywordtype">long</span> val = frob &amp; 0xff;
  3049. <a name="l03057"></a>03057
  3050. <a name="l03058"></a>03058 <span class="preprocessor">#define INSERT (Byte)((c &amp; mask) | val)</span>
  3051. <a name="l03059"></a>03059 <span class="preprocessor"></span>
  3052. <a name="l03060"></a>03060 CAM_MASKED_REG_LOOP(INSERT)
  3053. <a name="l03061"></a>03061 }
  3054. <a name="l03062"></a>03062
  3055. <a name="l03063"></a>03063
  3056. <a name="l03064"></a>03064 <span class="keywordtype">void</span> CellEngine::n_heaco()
  3057. <a name="l03065"></a>03065 {
  3058. <a name="l03066"></a>03066 <span class="keywordtype">long</span> sum;
  3059. <a name="l03067"></a>03067 <span class="keywordtype">long</span> last = 0;
  3060. <a name="l03068"></a>03068
  3061. <a name="l03069"></a>03069 <span class="preprocessor">#define HEACO \</span>
  3062. <a name="l03070"></a>03070 <span class="preprocessor"> (Byte)( \</span>
  3063. <a name="l03071"></a>03071 <span class="preprocessor"> (sum = nw + n + ne + w + e + sw + s + se + frob + last), \</span>
  3064. <a name="l03072"></a>03072 <span class="preprocessor"> (last = sum &amp; 31), \</span>
  3065. <a name="l03073"></a>03073 <span class="preprocessor"> (sum = (sum &gt;&gt; 3) &amp; (~3)), \</span>
  3066. <a name="l03074"></a>03074 <span class="preprocessor"> (sum | ((c&amp;1) &lt;&lt; 1) | \</span>
  3067. <a name="l03075"></a>03075 <span class="preprocessor"> (((c&amp;3) == 0) &amp;&amp; \</span>
  3068. <a name="l03076"></a>03076 <span class="preprocessor"> (SUM8REG(1) == 2))))</span>
  3069. <a name="l03077"></a>03077 <span class="preprocessor"></span>
  3070. <a name="l03078"></a>03078 CAM_MASKED_REG_LOOP(HEACO)
  3071. <a name="l03079"></a>03079 }
  3072. <a name="l03080"></a>03080
  3073. <a name="l03081"></a>03081
  3074. <a name="l03082"></a>03082 <span class="comment">// This is a thicker version of dithered heat diffusion,</span>
  3075. <a name="l03083"></a>03083 <span class="comment">// that exhibits this wonderful marbling behavior when the</span>
  3076. <a name="l03084"></a>03084 <span class="comment">// frob is 1, -1, 2, or -2. It averages the center cell</span>
  3077. <a name="l03085"></a>03085 <span class="comment">// with the average of the 8 neighbors, so it's thicker</span>
  3078. <a name="l03086"></a>03086 <span class="comment">// than dheat, which does not look at the center cell,</span>
  3079. <a name="l03087"></a>03087 <span class="comment">// just the average of the 8 neighbors.</span>
  3080. <a name="l03088"></a>03088
  3081. <a name="l03089"></a>03089 <span class="preprocessor">#define MARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
  3082. <a name="l03090"></a>03090 <span class="preprocessor"> error += ((c &lt;&lt; 3) + nw + n + ne + w + frob + e + sw + s + se); \</span>
  3083. <a name="l03091"></a>03091 <span class="preprocessor"> result = error &gt;&gt; 4; \</span>
  3084. <a name="l03092"></a>03092 <span class="preprocessor"> error &amp;= 0x0f;</span>
  3085. <a name="l03093"></a>03093 <span class="preprocessor"></span>
  3086. <a name="l03094"></a>03094 <span class="keywordtype">void</span> CellEngine::n_marble()
  3087. <a name="l03095"></a>03095 {
  3088. <a name="l03096"></a>03096 QUAD *front = (QUAD *)frontMem;
  3089. <a name="l03097"></a>03097 QUAD *back = (QUAD *)(backMem +
  3090. <a name="l03098"></a>03098 (backBorder - 1) +
  3091. <a name="l03099"></a>03099 ((backBorder - 1) * backRowBytes));
  3092. <a name="l03100"></a>03100 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  3093. <a name="l03101"></a>03101 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  3094. <a name="l03102"></a>03102 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  3095. <a name="l03103"></a>03103 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  3096. <a name="l03104"></a>03104 <span class="keywordtype">long</span> yy;
  3097. <a name="l03105"></a>03105
  3098. <a name="l03106"></a>03106 total = 0;
  3099. <a name="l03107"></a>03107
  3100. <a name="l03108"></a>03108 <span class="keywordflow">for</span> (yy = height; yy &gt; 0;
  3101. <a name="l03109"></a>03109 back += backstride,
  3102. <a name="l03110"></a>03110 front += frontstride,
  3103. <a name="l03111"></a>03111 yy--) {
  3104. <a name="l03112"></a>03112 <span class="keyword">register</span> QUAD b1, b2;
  3105. <a name="l03113"></a>03113 <span class="keyword">register</span> QUAD c1, c2;
  3106. <a name="l03114"></a>03114 <span class="keyword">register</span> QUAD d1, d2;
  3107. <a name="l03115"></a>03115 <span class="keywordtype">long</span> error = 0;
  3108. <a name="l03116"></a>03116 <span class="keywordtype">long</span> xx;
  3109. <a name="l03117"></a>03117
  3110. <a name="l03118"></a>03118 b2 = back[0];
  3111. <a name="l03119"></a>03119 c2 = back[backline];
  3112. <a name="l03120"></a>03120 d2 = back[backline &lt;&lt; 1];
  3113. <a name="l03121"></a>03121 back++;
  3114. <a name="l03122"></a>03122
  3115. <a name="l03123"></a>03123 <span class="keywordflow">for</span> (xx = xsteps;
  3116. <a name="l03124"></a>03124 xx &gt; 0;
  3117. <a name="l03125"></a>03125 xx--) {
  3118. <a name="l03126"></a>03126 <span class="keywordtype">long</span> result, cells = 0;
  3119. <a name="l03127"></a>03127
  3120. <a name="l03128"></a>03128 b1 = b2; b2 = back[0];
  3121. <a name="l03129"></a>03129 c1 = c2; c2 = back[backline];
  3122. <a name="l03130"></a>03130 d1 = d2; d2 = back[backline &lt;&lt; 1];
  3123. <a name="l03131"></a>03131 back++;
  3124. <a name="l03132"></a>03132
  3125. <a name="l03133"></a>03133 MARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  3126. <a name="l03134"></a>03134 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  3127. <a name="l03135"></a>03135 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  3128. <a name="l03136"></a>03136 total += result;
  3129. <a name="l03137"></a>03137 SETBYTE0(cells, result);
  3130. <a name="l03138"></a>03138
  3131. <a name="l03139"></a>03139 MARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  3132. <a name="l03140"></a>03140 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  3133. <a name="l03141"></a>03141 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  3134. <a name="l03142"></a>03142 total += result;
  3135. <a name="l03143"></a>03143 SETBYTE1(cells, result);
  3136. <a name="l03144"></a>03144
  3137. <a name="l03145"></a>03145 MARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  3138. <a name="l03146"></a>03146 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  3139. <a name="l03147"></a>03147 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  3140. <a name="l03148"></a>03148 total += result;
  3141. <a name="l03149"></a>03149 SETBYTE2(cells, result);
  3142. <a name="l03150"></a>03150
  3143. <a name="l03151"></a>03151 MARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  3144. <a name="l03152"></a>03152 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  3145. <a name="l03153"></a>03153 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  3146. <a name="l03154"></a>03154 total += result;
  3147. <a name="l03155"></a>03155 SETBYTE3(cells, result);
  3148. <a name="l03156"></a>03156
  3149. <a name="l03157"></a>03157 *front = cells;
  3150. <a name="l03158"></a>03158 front++;
  3151. <a name="l03159"></a>03159 }
  3152. <a name="l03160"></a>03160 }
  3153. <a name="l03161"></a>03161 }
  3154. <a name="l03162"></a>03162
  3155. <a name="l03163"></a>03163
  3156. <a name="l03164"></a>03164 <span class="comment">// This is the smooth, undithered version of marble.</span>
  3157. <a name="l03165"></a>03165 <span class="comment">// It does not exhibit the marbling behavior, which</span>
  3158. <a name="l03166"></a>03166 <span class="comment">// seems to be dampened out because of the accuracy</span>
  3159. <a name="l03167"></a>03167 <span class="comment">// lost by not dithering the leftover fractional heat.</span>
  3160. <a name="l03168"></a>03168 <span class="comment">// It's still interesting as a thick version of the</span>
  3161. <a name="l03169"></a>03169 <span class="comment">// smooth angular undithered heat diffusion.</span>
  3162. <a name="l03170"></a>03170
  3163. <a name="l03171"></a>03171 <span class="preprocessor">#define SMARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
  3164. <a name="l03172"></a>03172 <span class="preprocessor"> result = ((c &lt;&lt; 3) + nw + n + ne + w + frob + e + sw + s + se) &gt;&gt; 4;</span>
  3165. <a name="l03173"></a>03173 <span class="preprocessor"></span>
  3166. <a name="l03174"></a>03174 <span class="keywordtype">void</span> CellEngine::n_smarble()
  3167. <a name="l03175"></a>03175 {
  3168. <a name="l03176"></a>03176 QUAD *front = (QUAD *)frontMem;
  3169. <a name="l03177"></a>03177 QUAD *back = (QUAD *)(backMem +
  3170. <a name="l03178"></a>03178 (backBorder - 1) +
  3171. <a name="l03179"></a>03179 ((backBorder - 1) * backRowBytes));
  3172. <a name="l03180"></a>03180 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  3173. <a name="l03181"></a>03181 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  3174. <a name="l03182"></a>03182 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  3175. <a name="l03183"></a>03183 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  3176. <a name="l03184"></a>03184 <span class="keywordtype">long</span> yy;
  3177. <a name="l03185"></a>03185
  3178. <a name="l03186"></a>03186 total = 0;
  3179. <a name="l03187"></a>03187
  3180. <a name="l03188"></a>03188 <span class="keywordflow">for</span> (yy = height;
  3181. <a name="l03189"></a>03189 yy &gt; 0;
  3182. <a name="l03190"></a>03190 back += backstride,
  3183. <a name="l03191"></a>03191 front += frontstride,
  3184. <a name="l03192"></a>03192 yy--) {
  3185. <a name="l03193"></a>03193 <span class="keyword">register</span> QUAD b1, b2;
  3186. <a name="l03194"></a>03194 <span class="keyword">register</span> QUAD c1, c2;
  3187. <a name="l03195"></a>03195 <span class="keyword">register</span> QUAD d1, d2;
  3188. <a name="l03196"></a>03196 <span class="keywordtype">long</span> xx;
  3189. <a name="l03197"></a>03197
  3190. <a name="l03198"></a>03198 b2 = back[0];
  3191. <a name="l03199"></a>03199 c2 = back[backline];
  3192. <a name="l03200"></a>03200 d2 = back[backline &lt;&lt; 1];
  3193. <a name="l03201"></a>03201 back++;
  3194. <a name="l03202"></a>03202
  3195. <a name="l03203"></a>03203 <span class="keywordflow">for</span> (xx = xsteps;
  3196. <a name="l03204"></a>03204 xx &gt; 0;
  3197. <a name="l03205"></a>03205 xx--) {
  3198. <a name="l03206"></a>03206 <span class="keywordtype">long</span> result, cells = 0;
  3199. <a name="l03207"></a>03207
  3200. <a name="l03208"></a>03208 b1 = b2; b2 = back[0];
  3201. <a name="l03209"></a>03209 c1 = c2; c2 = back[backline];
  3202. <a name="l03210"></a>03210 d1 = d2; d2 = back[backline &lt;&lt; 1];
  3203. <a name="l03211"></a>03211 back++;
  3204. <a name="l03212"></a>03212
  3205. <a name="l03213"></a>03213 SMARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  3206. <a name="l03214"></a>03214 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  3207. <a name="l03215"></a>03215 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  3208. <a name="l03216"></a>03216 total += result;
  3209. <a name="l03217"></a>03217 SETBYTE0(cells, result);
  3210. <a name="l03218"></a>03218
  3211. <a name="l03219"></a>03219 SMARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  3212. <a name="l03220"></a>03220 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  3213. <a name="l03221"></a>03221 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  3214. <a name="l03222"></a>03222 total += result;
  3215. <a name="l03223"></a>03223 SETBYTE1(cells, result);
  3216. <a name="l03224"></a>03224
  3217. <a name="l03225"></a>03225 SMARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  3218. <a name="l03226"></a>03226 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  3219. <a name="l03227"></a>03227 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  3220. <a name="l03228"></a>03228 total += result;
  3221. <a name="l03229"></a>03229 SETBYTE2(cells, result);
  3222. <a name="l03230"></a>03230
  3223. <a name="l03231"></a>03231 SMARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  3224. <a name="l03232"></a>03232 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  3225. <a name="l03233"></a>03233 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  3226. <a name="l03234"></a>03234 total += result;
  3227. <a name="l03235"></a>03235 SETBYTE3(cells, result);
  3228. <a name="l03236"></a>03236
  3229. <a name="l03237"></a>03237 *front = cells;
  3230. <a name="l03238"></a>03238 front++;
  3231. <a name="l03239"></a>03239 }
  3232. <a name="l03240"></a>03240 }
  3233. <a name="l03241"></a>03241 }
  3234. <a name="l03242"></a>03242
  3235. <a name="l03243"></a>03243
  3236. <a name="l03244"></a>03244 <span class="comment">// This is a flaming version of marble, which diffuses</span>
  3237. <a name="l03245"></a>03245 <span class="comment">// heat upward so it looks like a flame. Think of heat</span>
  3238. <a name="l03246"></a>03246 <span class="comment">// diffusion as repeated bluring, or an iterative</span>
  3239. <a name="l03247"></a>03247 <span class="comment">// convulution kernel. Normally, all the neighbors are</span>
  3240. <a name="l03248"></a>03248 <span class="comment">// averaged with equal weights. In this case, we ignore</span>
  3241. <a name="l03249"></a>03249 <span class="comment">// the nw, n, and ne neighbors, and look at the sw, s,</span>
  3242. <a name="l03250"></a>03250 <span class="comment">// and se neighbors twice, so heat flows to the north.</span>
  3243. <a name="l03251"></a>03251
  3244. <a name="l03252"></a>03252 <span class="preprocessor">#define FARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
  3245. <a name="l03253"></a>03253 <span class="preprocessor"> error += ((c &lt;&lt; 3) + sw + se + w + frob + e + sw + s + s + se); \</span>
  3246. <a name="l03254"></a>03254 <span class="preprocessor"> result = error &gt;&gt; 4; \</span>
  3247. <a name="l03255"></a>03255 <span class="preprocessor"> error &amp;= 0x0f;</span>
  3248. <a name="l03256"></a>03256 <span class="preprocessor"></span>
  3249. <a name="l03257"></a>03257 <span class="keywordtype">void</span> CellEngine::n_farble()
  3250. <a name="l03258"></a>03258 {
  3251. <a name="l03259"></a>03259 QUAD *front = (QUAD *)frontMem;
  3252. <a name="l03260"></a>03260 QUAD *back = (QUAD *)(backMem +
  3253. <a name="l03261"></a>03261 (backBorder - 1) +
  3254. <a name="l03262"></a>03262 ((backBorder - 1) * backRowBytes));
  3255. <a name="l03263"></a>03263 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  3256. <a name="l03264"></a>03264 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  3257. <a name="l03265"></a>03265 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  3258. <a name="l03266"></a>03266 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  3259. <a name="l03267"></a>03267 <span class="keywordtype">long</span> yy;
  3260. <a name="l03268"></a>03268
  3261. <a name="l03269"></a>03269 total = 0;
  3262. <a name="l03270"></a>03270
  3263. <a name="l03271"></a>03271 <span class="keywordflow">for</span> (yy = height;
  3264. <a name="l03272"></a>03272 yy &gt; 0;
  3265. <a name="l03273"></a>03273 back += backstride,
  3266. <a name="l03274"></a>03274 front += frontstride,
  3267. <a name="l03275"></a>03275 yy--) {
  3268. <a name="l03276"></a>03276 <span class="keyword">register</span> QUAD b1, b2;
  3269. <a name="l03277"></a>03277 <span class="keyword">register</span> QUAD c1, c2;
  3270. <a name="l03278"></a>03278 <span class="keyword">register</span> QUAD d1, d2;
  3271. <a name="l03279"></a>03279 <span class="keywordtype">long</span> error = 0;
  3272. <a name="l03280"></a>03280 <span class="keywordtype">long</span> xx;
  3273. <a name="l03281"></a>03281
  3274. <a name="l03282"></a>03282 b2 = back[0];
  3275. <a name="l03283"></a>03283 c2 = back[backline];
  3276. <a name="l03284"></a>03284 d2 = back[backline &lt;&lt; 1];
  3277. <a name="l03285"></a>03285 back++;
  3278. <a name="l03286"></a>03286
  3279. <a name="l03287"></a>03287 <span class="keywordflow">for</span> (xx = xsteps;
  3280. <a name="l03288"></a>03288 xx &gt; 0;
  3281. <a name="l03289"></a>03289 xx--) {
  3282. <a name="l03290"></a>03290 <span class="keywordtype">long</span> result, cells = 0;
  3283. <a name="l03291"></a>03291
  3284. <a name="l03292"></a>03292 b1 = b2; b2 = back[0];
  3285. <a name="l03293"></a>03293 c1 = c2; c2 = back[backline];
  3286. <a name="l03294"></a>03294 d1 = d2; d2 = back[backline &lt;&lt; 1];
  3287. <a name="l03295"></a>03295 back++;
  3288. <a name="l03296"></a>03296
  3289. <a name="l03297"></a>03297 FARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  3290. <a name="l03298"></a>03298 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  3291. <a name="l03299"></a>03299 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  3292. <a name="l03300"></a>03300 total += result;
  3293. <a name="l03301"></a>03301 SETBYTE0(cells, result);
  3294. <a name="l03302"></a>03302
  3295. <a name="l03303"></a>03303 FARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  3296. <a name="l03304"></a>03304 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  3297. <a name="l03305"></a>03305 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  3298. <a name="l03306"></a>03306 total += result;
  3299. <a name="l03307"></a>03307 SETBYTE1(cells, result);
  3300. <a name="l03308"></a>03308
  3301. <a name="l03309"></a>03309 FARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  3302. <a name="l03310"></a>03310 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  3303. <a name="l03311"></a>03311 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  3304. <a name="l03312"></a>03312 total += result;
  3305. <a name="l03313"></a>03313 SETBYTE2(cells, result);
  3306. <a name="l03314"></a>03314
  3307. <a name="l03315"></a>03315 FARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  3308. <a name="l03316"></a>03316 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  3309. <a name="l03317"></a>03317 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  3310. <a name="l03318"></a>03318 total += result;
  3311. <a name="l03319"></a>03319 SETBYTE3(cells, result);
  3312. <a name="l03320"></a>03320
  3313. <a name="l03321"></a>03321 *front = cells;
  3314. <a name="l03322"></a>03322 front++;
  3315. <a name="l03323"></a>03323 }
  3316. <a name="l03324"></a>03324 }
  3317. <a name="l03325"></a>03325 }
  3318. <a name="l03326"></a>03326
  3319. <a name="l03327"></a>03327
  3320. <a name="l03328"></a>03328 <span class="comment">// This is a wavy version of flaming marble.</span>
  3321. <a name="l03329"></a>03329 <span class="comment">// We define four different convolution kernels, that diffuse</span>
  3322. <a name="l03330"></a>03330 <span class="comment">// the heat in different directions (nw, n, ne, and side to side),</span>
  3323. <a name="l03331"></a>03331 <span class="comment">// and select between then based on the phase (0 to 3).</span>
  3324. <a name="l03332"></a>03332 <span class="comment">// What defines the phase?</span>
  3325. <a name="l03333"></a>03333 <span class="comment">// There are several interesting defintions.</span>
  3326. <a name="l03334"></a>03334 <span class="comment">// Generally, we don't want to change phase too often, and we</span>
  3327. <a name="l03335"></a>03335 <span class="comment">// want to do it in interesting patterns so the heat flows nicely.</span>
  3328. <a name="l03336"></a>03336 <span class="comment">// The right shifting lowers the frequency of the phase changes.</span>
  3329. <a name="l03337"></a>03337 <span class="comment">// The anding with 3 is because there are only 4 phases.</span>
  3330. <a name="l03338"></a>03338 <span class="comment">// (y &gt;&gt; 2) &amp; 3:</span>
  3331. <a name="l03339"></a>03339 <span class="comment">// Vertically driven phase.</span>
  3332. <a name="l03340"></a>03340 <span class="comment">// Horizontally synchronized vertical waves.</span>
  3333. <a name="l03341"></a>03341 <span class="comment">// ((x + y) &gt;&gt; 2) &amp; 3:</span>
  3334. <a name="l03342"></a>03342 <span class="comment">// Vertically and horizontally driven phase.</span>
  3335. <a name="l03343"></a>03343 <span class="comment">// Sheared diamond synchronized waves.</span>
  3336. <a name="l03344"></a>03344 <span class="comment">// ((x + y + c) &gt;&gt; 2) &amp; 3:</span>
  3337. <a name="l03345"></a>03345 <span class="comment">// Vertically, horizontally, and smoothly varying</span>
  3338. <a name="l03346"></a>03346 <span class="comment">// temperature driven phase.</span>
  3339. <a name="l03347"></a>03347 <span class="comment">// Diamonds smoothly shifting phase with the heat contours.</span>
  3340. <a name="l03348"></a>03348 <span class="comment">// Interesting feedback driving heat flow direction by heat.</span>
  3341. <a name="l03349"></a>03349 <span class="comment">//</span>
  3342. <a name="l03350"></a>03350 <span class="comment">// OOPS: There's a bug in the following code that I'm preserving</span>
  3343. <a name="l03351"></a>03351 <span class="comment">// since it still looks nice. I meant to type "xx" instead of "x",</span>
  3344. <a name="l03352"></a>03352 <span class="comment">// and "yy" instead of "y", because x and y are the position of the</span>
  3345. <a name="l03353"></a>03353 <span class="comment">// upper left corner, not the cell. GARBLEBUG is the old buggy one,</span>
  3346. <a name="l03354"></a>03354 <span class="comment">// and GARBLE is the fixed version that is described above.</span>
  3347. <a name="l03355"></a>03355
  3348. <a name="l03356"></a>03356 <span class="preprocessor">#define GARBLEBUG(nw, n, ne, w, c, e, sw, s, se) \</span>
  3349. <a name="l03357"></a>03357 <span class="preprocessor"> switch (((y + x + c) &gt;&gt; 2) &amp; 3) { \</span>
  3350. <a name="l03358"></a>03358 <span class="preprocessor"> case 0: \</span>
  3351. <a name="l03359"></a>03359 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + sw + sw + s + s + se + se + e); \</span>
  3352. <a name="l03360"></a>03360 <span class="preprocessor"> break; \</span>
  3353. <a name="l03361"></a>03361 <span class="preprocessor"> case 1: \</span>
  3354. <a name="l03362"></a>03362 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + w + w + sw + sw + s + se + e); \</span>
  3355. <a name="l03363"></a>03363 <span class="preprocessor"> break; \</span>
  3356. <a name="l03364"></a>03364 <span class="preprocessor"> case 2: \</span>
  3357. <a name="l03365"></a>03365 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + w + sw + sw + se + se + e + e); \</span>
  3358. <a name="l03366"></a>03366 <span class="preprocessor"> break; \</span>
  3359. <a name="l03367"></a>03367 <span class="preprocessor"> case 3: \</span>
  3360. <a name="l03368"></a>03368 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + sw + s + se + se + e + e + e); \</span>
  3361. <a name="l03369"></a>03369 <span class="preprocessor"> break; \</span>
  3362. <a name="l03370"></a>03370 <span class="preprocessor"> } \</span>
  3363. <a name="l03371"></a>03371 <span class="preprocessor"> result = error &gt;&gt; 4; \</span>
  3364. <a name="l03372"></a>03372 <span class="preprocessor"> error &amp;= 0x0f;</span>
  3365. <a name="l03373"></a>03373 <span class="preprocessor"></span>
  3366. <a name="l03374"></a>03374 <span class="keywordtype">void</span> CellEngine::n_garblebug()
  3367. <a name="l03375"></a>03375 {
  3368. <a name="l03376"></a>03376 QUAD *front = (QUAD *)frontMem;
  3369. <a name="l03377"></a>03377 QUAD *back = (QUAD *)(backMem +
  3370. <a name="l03378"></a>03378 (backBorder - 1) +
  3371. <a name="l03379"></a>03379 ((backBorder - 1) * backRowBytes));
  3372. <a name="l03380"></a>03380 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  3373. <a name="l03381"></a>03381 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  3374. <a name="l03382"></a>03382 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  3375. <a name="l03383"></a>03383 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  3376. <a name="l03384"></a>03384 <span class="keywordtype">long</span> yy;
  3377. <a name="l03385"></a>03385
  3378. <a name="l03386"></a>03386 total = 0;
  3379. <a name="l03387"></a>03387
  3380. <a name="l03388"></a>03388 <span class="keywordflow">for</span> (yy = height;
  3381. <a name="l03389"></a>03389 yy &gt; 0;
  3382. <a name="l03390"></a>03390 back += backstride,
  3383. <a name="l03391"></a>03391 front += frontstride,
  3384. <a name="l03392"></a>03392 yy--) {
  3385. <a name="l03393"></a>03393 <span class="keyword">register</span> QUAD b1, b2;
  3386. <a name="l03394"></a>03394 <span class="keyword">register</span> QUAD c1, c2;
  3387. <a name="l03395"></a>03395 <span class="keyword">register</span> QUAD d1, d2;
  3388. <a name="l03396"></a>03396 <span class="keywordtype">long</span> error = 0;
  3389. <a name="l03397"></a>03397 <span class="keywordtype">long</span> xx;
  3390. <a name="l03398"></a>03398
  3391. <a name="l03399"></a>03399 b2 = back[0];
  3392. <a name="l03400"></a>03400 c2 = back[backline];
  3393. <a name="l03401"></a>03401 d2 = back[backline &lt;&lt; 1];
  3394. <a name="l03402"></a>03402 back++;
  3395. <a name="l03403"></a>03403
  3396. <a name="l03404"></a>03404 <span class="keywordflow">for</span> (xx = xsteps;
  3397. <a name="l03405"></a>03405 xx &gt; 0;
  3398. <a name="l03406"></a>03406 xx--) {
  3399. <a name="l03407"></a>03407 <span class="keywordtype">long</span> result, cells = 0;
  3400. <a name="l03408"></a>03408
  3401. <a name="l03409"></a>03409 b1 = b2; b2 = back[0];
  3402. <a name="l03410"></a>03410 c1 = c2; c2 = back[backline];
  3403. <a name="l03411"></a>03411 d1 = d2; d2 = back[backline &lt;&lt; 1];
  3404. <a name="l03412"></a>03412 back++;
  3405. <a name="l03413"></a>03413
  3406. <a name="l03414"></a>03414 GARBLEBUG( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  3407. <a name="l03415"></a>03415 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  3408. <a name="l03416"></a>03416 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  3409. <a name="l03417"></a>03417 total += result;
  3410. <a name="l03418"></a>03418 SETBYTE0(cells, result);
  3411. <a name="l03419"></a>03419
  3412. <a name="l03420"></a>03420 GARBLEBUG( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  3413. <a name="l03421"></a>03421 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  3414. <a name="l03422"></a>03422 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  3415. <a name="l03423"></a>03423 total += result;
  3416. <a name="l03424"></a>03424 SETBYTE1(cells, result);
  3417. <a name="l03425"></a>03425
  3418. <a name="l03426"></a>03426 GARBLEBUG( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  3419. <a name="l03427"></a>03427 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  3420. <a name="l03428"></a>03428 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  3421. <a name="l03429"></a>03429 total += result;
  3422. <a name="l03430"></a>03430 SETBYTE2(cells, result);
  3423. <a name="l03431"></a>03431
  3424. <a name="l03432"></a>03432 GARBLEBUG( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  3425. <a name="l03433"></a>03433 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  3426. <a name="l03434"></a>03434 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  3427. <a name="l03435"></a>03435 total += result;
  3428. <a name="l03436"></a>03436 SETBYTE3(cells, result);
  3429. <a name="l03437"></a>03437
  3430. <a name="l03438"></a>03438 *front = cells;
  3431. <a name="l03439"></a>03439 front++;
  3432. <a name="l03440"></a>03440 }
  3433. <a name="l03441"></a>03441 }
  3434. <a name="l03442"></a>03442 }
  3435. <a name="l03443"></a>03443
  3436. <a name="l03444"></a>03444
  3437. <a name="l03445"></a>03445 <span class="preprocessor">#define GARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
  3438. <a name="l03446"></a>03446 <span class="preprocessor"> switch (((yy + xx + c) &gt;&gt; 2) &amp; 3) { \</span>
  3439. <a name="l03447"></a>03447 <span class="preprocessor"> case 0: \</span>
  3440. <a name="l03448"></a>03448 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + sw + sw + s + s + se + se + e); \</span>
  3441. <a name="l03449"></a>03449 <span class="preprocessor"> break; \</span>
  3442. <a name="l03450"></a>03450 <span class="preprocessor"> case 1: \</span>
  3443. <a name="l03451"></a>03451 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + w + w + sw + sw + s + se + e); \</span>
  3444. <a name="l03452"></a>03452 <span class="preprocessor"> break; \</span>
  3445. <a name="l03453"></a>03453 <span class="preprocessor"> case 2: \</span>
  3446. <a name="l03454"></a>03454 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + w + sw + sw + se + se + e + e); \</span>
  3447. <a name="l03455"></a>03455 <span class="preprocessor"> break; \</span>
  3448. <a name="l03456"></a>03456 <span class="preprocessor"> case 3: \</span>
  3449. <a name="l03457"></a>03457 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + sw + s + se + se + e + e + e); \</span>
  3450. <a name="l03458"></a>03458 <span class="preprocessor"> break; \</span>
  3451. <a name="l03459"></a>03459 <span class="preprocessor"> } \</span>
  3452. <a name="l03460"></a>03460 <span class="preprocessor"> result = error &gt;&gt; 4; \</span>
  3453. <a name="l03461"></a>03461 <span class="preprocessor"> error &amp;= 0x0f;</span>
  3454. <a name="l03462"></a>03462 <span class="preprocessor"></span>
  3455. <a name="l03463"></a>03463 <span class="keywordtype">void</span> CellEngine::n_garble()
  3456. <a name="l03464"></a>03464 {
  3457. <a name="l03465"></a>03465 QUAD *front = (QUAD *)frontMem;
  3458. <a name="l03466"></a>03466 QUAD *back = (QUAD *)(backMem +
  3459. <a name="l03467"></a>03467 (backBorder - 1) +
  3460. <a name="l03468"></a>03468 ((backBorder - 1) * backRowBytes));
  3461. <a name="l03469"></a>03469 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  3462. <a name="l03470"></a>03470 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  3463. <a name="l03471"></a>03471 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  3464. <a name="l03472"></a>03472 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  3465. <a name="l03473"></a>03473 <span class="keywordtype">long</span> yy;
  3466. <a name="l03474"></a>03474
  3467. <a name="l03475"></a>03475 total = 0;
  3468. <a name="l03476"></a>03476
  3469. <a name="l03477"></a>03477 <span class="keywordflow">for</span> (yy = height;
  3470. <a name="l03478"></a>03478 yy &gt; 0;
  3471. <a name="l03479"></a>03479 back += backstride,
  3472. <a name="l03480"></a>03480 front += frontstride,
  3473. <a name="l03481"></a>03481 yy--) {
  3474. <a name="l03482"></a>03482 <span class="keyword">register</span> QUAD b1, b2;
  3475. <a name="l03483"></a>03483 <span class="keyword">register</span> QUAD c1, c2;
  3476. <a name="l03484"></a>03484 <span class="keyword">register</span> QUAD d1, d2;
  3477. <a name="l03485"></a>03485 <span class="keywordtype">long</span> error = 0;
  3478. <a name="l03486"></a>03486 <span class="keywordtype">long</span> xx;
  3479. <a name="l03487"></a>03487
  3480. <a name="l03488"></a>03488 b2 = back[0];
  3481. <a name="l03489"></a>03489 c2 = back[backline];
  3482. <a name="l03490"></a>03490 d2 = back[backline &lt;&lt; 1];
  3483. <a name="l03491"></a>03491 back++;
  3484. <a name="l03492"></a>03492
  3485. <a name="l03493"></a>03493 <span class="keywordflow">for</span> (xx = xsteps;
  3486. <a name="l03494"></a>03494 xx &gt; 0;
  3487. <a name="l03495"></a>03495 xx--) {
  3488. <a name="l03496"></a>03496 <span class="keywordtype">long</span> result, cells = 0;
  3489. <a name="l03497"></a>03497
  3490. <a name="l03498"></a>03498 b1 = b2; b2 = back[0];
  3491. <a name="l03499"></a>03499 c1 = c2; c2 = back[backline];
  3492. <a name="l03500"></a>03500 d1 = d2; d2 = back[backline &lt;&lt; 1];
  3493. <a name="l03501"></a>03501 back++;
  3494. <a name="l03502"></a>03502
  3495. <a name="l03503"></a>03503 GARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  3496. <a name="l03504"></a>03504 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  3497. <a name="l03505"></a>03505 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  3498. <a name="l03506"></a>03506 total += result;
  3499. <a name="l03507"></a>03507 SETBYTE0(cells, result);
  3500. <a name="l03508"></a>03508
  3501. <a name="l03509"></a>03509 GARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  3502. <a name="l03510"></a>03510 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  3503. <a name="l03511"></a>03511 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  3504. <a name="l03512"></a>03512 total += result;
  3505. <a name="l03513"></a>03513 SETBYTE1(cells, result);
  3506. <a name="l03514"></a>03514
  3507. <a name="l03515"></a>03515 GARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  3508. <a name="l03516"></a>03516 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  3509. <a name="l03517"></a>03517 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  3510. <a name="l03518"></a>03518 total += result;
  3511. <a name="l03519"></a>03519 SETBYTE2(cells, result);
  3512. <a name="l03520"></a>03520
  3513. <a name="l03521"></a>03521 GARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  3514. <a name="l03522"></a>03522 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  3515. <a name="l03523"></a>03523 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  3516. <a name="l03524"></a>03524 total += result;
  3517. <a name="l03525"></a>03525 SETBYTE3(cells, result);
  3518. <a name="l03526"></a>03526
  3519. <a name="l03527"></a>03527 *front = cells;
  3520. <a name="l03528"></a>03528 front++;
  3521. <a name="l03529"></a>03529 }
  3522. <a name="l03530"></a>03530 }
  3523. <a name="l03531"></a>03531 }
  3524. <a name="l03532"></a>03532
  3525. <a name="l03533"></a>03533
  3526. <a name="l03534"></a>03534 <span class="preprocessor">#define TWOHEATS(nw, n, ne, w, c, e, sw, s, se) \</span>
  3527. <a name="l03535"></a>03535 <span class="preprocessor"> error += ((nw&amp;0x0f) + (n&amp;0x0f) + (ne&amp;0x0f) + (w&amp;0x0f) + (frob&amp;0x0f) + (e&amp;0x0f) + (sw&amp;0x0f) + (s&amp;0x0f) + (se&amp;0x0f)); \</span>
  3528. <a name="l03536"></a>03536 <span class="preprocessor"> result = (error &gt;&gt; 3) &amp; 0x0f; \</span>
  3529. <a name="l03537"></a>03537 <span class="preprocessor"> error &amp;= 7; \</span>
  3530. <a name="l03538"></a>03538 <span class="preprocessor"> error += ((nw&gt;&gt;4) + (n&gt;&gt;4) + (ne&gt;&gt;4) + (w&gt;&gt;4) + ((frob&gt;&gt;1)&amp;0x0f) + (e&gt;&gt;4) + (sw&gt;&gt;4) + (s&gt;&gt;4) + (se&gt;&gt;4)); \</span>
  3531. <a name="l03539"></a>03539 <span class="preprocessor"> result |= (error&lt;&lt;1) &amp; 0xf0; \</span>
  3532. <a name="l03540"></a>03540 <span class="preprocessor"> error &amp;= 7;</span>
  3533. <a name="l03541"></a>03541 <span class="preprocessor"></span>
  3534. <a name="l03542"></a>03542 <span class="keywordtype">void</span> CellEngine::n_twoheats()
  3535. <a name="l03543"></a>03543 {
  3536. <a name="l03544"></a>03544 QUAD *front = (QUAD *)frontMem;
  3537. <a name="l03545"></a>03545 QUAD *back = (QUAD *)(backMem +
  3538. <a name="l03546"></a>03546 (backBorder - 1) +
  3539. <a name="l03547"></a>03547 ((backBorder - 1) * backRowBytes));
  3540. <a name="l03548"></a>03548 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  3541. <a name="l03549"></a>03549 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  3542. <a name="l03550"></a>03550 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  3543. <a name="l03551"></a>03551 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  3544. <a name="l03552"></a>03552 <span class="keywordtype">long</span> yy;
  3545. <a name="l03553"></a>03553
  3546. <a name="l03554"></a>03554 total = 0;
  3547. <a name="l03555"></a>03555
  3548. <a name="l03556"></a>03556 <span class="keywordflow">for</span> (yy = height;
  3549. <a name="l03557"></a>03557 yy &gt; 0;
  3550. <a name="l03558"></a>03558 back += backstride,
  3551. <a name="l03559"></a>03559 front += frontstride,
  3552. <a name="l03560"></a>03560 yy--) {
  3553. <a name="l03561"></a>03561 <span class="keyword">register</span> QUAD b1, b2;
  3554. <a name="l03562"></a>03562 <span class="keyword">register</span> QUAD c1, c2;
  3555. <a name="l03563"></a>03563 <span class="keyword">register</span> QUAD d1, d2;
  3556. <a name="l03564"></a>03564 <span class="keywordtype">long</span> error = 0;
  3557. <a name="l03565"></a>03565 <span class="keywordtype">long</span> xx;
  3558. <a name="l03566"></a>03566
  3559. <a name="l03567"></a>03567 b2 = back[0];
  3560. <a name="l03568"></a>03568 c2 = back[backline];
  3561. <a name="l03569"></a>03569 d2 = back[backline &lt;&lt; 1];
  3562. <a name="l03570"></a>03570 back++;
  3563. <a name="l03571"></a>03571
  3564. <a name="l03572"></a>03572 <span class="keywordflow">for</span> (xx = xsteps;
  3565. <a name="l03573"></a>03573 xx &gt; 0;
  3566. <a name="l03574"></a>03574 xx--) {
  3567. <a name="l03575"></a>03575 <span class="keywordtype">long</span> result, cells = 0;
  3568. <a name="l03576"></a>03576
  3569. <a name="l03577"></a>03577 b1 = b2; b2 = back[0];
  3570. <a name="l03578"></a>03578 c1 = c2; c2 = back[backline];
  3571. <a name="l03579"></a>03579 d1 = d2; d2 = back[backline &lt;&lt; 1];
  3572. <a name="l03580"></a>03580 back++;
  3573. <a name="l03581"></a>03581
  3574. <a name="l03582"></a>03582 TWOHEATS( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  3575. <a name="l03583"></a>03583 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  3576. <a name="l03584"></a>03584 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  3577. <a name="l03585"></a>03585 total += result;
  3578. <a name="l03586"></a>03586 SETBYTE0(cells, result);
  3579. <a name="l03587"></a>03587
  3580. <a name="l03588"></a>03588 TWOHEATS( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  3581. <a name="l03589"></a>03589 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  3582. <a name="l03590"></a>03590 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  3583. <a name="l03591"></a>03591 total += result;
  3584. <a name="l03592"></a>03592 SETBYTE1(cells, result);
  3585. <a name="l03593"></a>03593
  3586. <a name="l03594"></a>03594 TWOHEATS( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  3587. <a name="l03595"></a>03595 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  3588. <a name="l03596"></a>03596 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  3589. <a name="l03597"></a>03597 total += result;
  3590. <a name="l03598"></a>03598 SETBYTE2(cells, result);
  3591. <a name="l03599"></a>03599
  3592. <a name="l03600"></a>03600 TWOHEATS( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  3593. <a name="l03601"></a>03601 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  3594. <a name="l03602"></a>03602 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  3595. <a name="l03603"></a>03603 total += result;
  3596. <a name="l03604"></a>03604 SETBYTE3(cells, result);
  3597. <a name="l03605"></a>03605
  3598. <a name="l03606"></a>03606 *front = cells;
  3599. <a name="l03607"></a>03607 front++;
  3600. <a name="l03608"></a>03608 }
  3601. <a name="l03609"></a>03609 }
  3602. <a name="l03610"></a>03610 }
  3603. <a name="l03611"></a>03611
  3604. <a name="l03612"></a>03612
  3605. <a name="l03613"></a>03613 <span class="keywordtype">void</span> CellEngine::n_spin()
  3606. <a name="l03614"></a>03614 {
  3607. <a name="l03615"></a>03615 Byte *front = frontMem;
  3608. <a name="l03616"></a>03616 Byte *back = backMem +
  3609. <a name="l03617"></a>03617 (backBorder - 1) +
  3610. <a name="l03618"></a>03618 ((backBorder - 1) * backRowBytes);
  3611. <a name="l03619"></a>03619 Byte *f = front;
  3612. <a name="l03620"></a>03620 <span class="keywordtype">long</span> xx, yy;
  3613. <a name="l03621"></a>03621 <span class="comment">// float jitter = ((float)1.0 * ((float)Rand8() / (float)255.0));</span>
  3614. <a name="l03622"></a>03622 <span class="keywordtype">float</span> jitter = 0.0;
  3615. <a name="l03623"></a>03623 <span class="keywordtype">float</span> angle = ((float)8.0 * (<span class="keywordtype">float</span>)frob) + jitter;
  3616. <a name="l03624"></a>03624 angle += ((float) hubba) * (float)-0.3;
  3617. <a name="l03625"></a>03625 <span class="keywordtype">float</span> rad = (-angle) / (<span class="keywordtype">float</span>)(180.0 / 3.14152973);
  3618. <a name="l03626"></a>03626 <span class="keywordtype">float</span> dy = (float)sin(rad);
  3619. <a name="l03627"></a>03627 <span class="keywordtype">float</span> dx = (float)cos(rad);
  3620. <a name="l03628"></a>03628 <span class="keywordtype">float</span> cx = (float)width / (<span class="keywordtype">float</span>)2.0;
  3621. <a name="l03629"></a>03629 <span class="keywordtype">float</span> cy = (float)height / (<span class="keywordtype">float</span>)2.0;
  3622. <a name="l03630"></a>03630
  3623. <a name="l03631"></a>03631 <span class="keywordflow">for</span> (yy = 0;
  3624. <a name="l03632"></a>03632 yy &lt; height;
  3625. <a name="l03633"></a>03633 f += screenRowBytes,
  3626. <a name="l03634"></a>03634 yy++) {
  3627. <a name="l03635"></a>03635 <span class="keywordflow">for</span> (xx = 0;
  3628. <a name="l03636"></a>03636 xx &lt; width;
  3629. <a name="l03637"></a>03637 xx++) {
  3630. <a name="l03638"></a>03638 <span class="keywordtype">float</span> x1, y1;
  3631. <a name="l03639"></a>03639 <span class="keywordtype">long</span> x2, y2;
  3632. <a name="l03640"></a>03640
  3633. <a name="l03641"></a>03641 x1 = (float)xx - cx;
  3634. <a name="l03642"></a>03642 y1 = (float)yy - cy;
  3635. <a name="l03643"></a>03643
  3636. <a name="l03644"></a>03644 x2 = (long)floor(1.5 + (x1 * dx) + (y1 * dy) + cx);
  3637. <a name="l03645"></a>03645 y2 = (long)floor(1.5 + (y1 * dx) - (x1 * dy) + cy);
  3638. <a name="l03646"></a>03646
  3639. <a name="l03647"></a>03647 <span class="keywordflow">if</span> ((x2 &gt;= 0) &amp;&amp;
  3640. <a name="l03648"></a>03648 (x2 &lt; width) &amp;&amp;
  3641. <a name="l03649"></a>03649 (y2 &gt;= 0) &amp;&amp;
  3642. <a name="l03650"></a>03650 (y2 &lt; height)) {
  3643. <a name="l03651"></a>03651
  3644. <a name="l03652"></a>03652 f[xx] = back[(y2 * backRowBytes) + x2];
  3645. <a name="l03653"></a>03653 }
  3646. <a name="l03654"></a>03654 }
  3647. <a name="l03655"></a>03655 }
  3648. <a name="l03656"></a>03656 }
  3649. <a name="l03657"></a>03657
  3650. <a name="l03658"></a>03658
  3651. <a name="l03659"></a>03659 <span class="comment">// Driven Diffusion by Two Species</span>
  3652. <a name="l03660"></a>03660 <span class="comment">// by Richard J. Gaylord and Kazume Nishidate</span>
  3653. <a name="l03661"></a>03661 <span class="comment">// Mathematica in Education Research</span>
  3654. <a name="l03662"></a>03662 <span class="comment">// Volume 6, Number 2, Spring 1997</span>
  3655. <a name="l03663"></a>03663
  3656. <a name="l03664"></a>03664 <span class="comment">// 00 000_____ : empty</span>
  3657. <a name="l03665"></a>03665 <span class="comment">// 20 001_____ : empty</span>
  3658. <a name="l03666"></a>03666 <span class="comment">// 40 010_____ : wall</span>
  3659. <a name="l03667"></a>03667 <span class="comment">// 60 011_____ : mirror</span>
  3660. <a name="l03668"></a>03668 <span class="comment">// 80 100_____ : A particle</span>
  3661. <a name="l03669"></a>03669 <span class="comment">// a0 101_____ : B particle</span>
  3662. <a name="l03670"></a>03670 <span class="comment">// c0 110_____ : C particle</span>
  3663. <a name="l03671"></a>03671 <span class="comment">// e0 111_____ : D particle</span>
  3664. <a name="l03672"></a>03672
  3665. <a name="l03673"></a>03673 <span class="preprocessor">#define PART_MASK 0xe0</span>
  3666. <a name="l03674"></a>03674 <span class="preprocessor"></span><span class="preprocessor">#define ABCD_MASK 0x60</span>
  3667. <a name="l03675"></a>03675 <span class="preprocessor"></span><span class="preprocessor">#define PART(x) ((x) &amp; PART_MASK)</span>
  3668. <a name="l03676"></a>03676 <span class="preprocessor"></span><span class="preprocessor">#define ABCD(x) (((x) &amp; ABCD_MASK) | 0x80)</span>
  3669. <a name="l03677"></a>03677 <span class="preprocessor"></span><span class="preprocessor">#define PART_EMPTY 0x00</span>
  3670. <a name="l03678"></a>03678 <span class="preprocessor"></span><span class="preprocessor">#define PART_PLASMA 0x20</span>
  3671. <a name="l03679"></a>03679 <span class="preprocessor"></span><span class="preprocessor">#define PART_WALL 0x40</span>
  3672. <a name="l03680"></a>03680 <span class="preprocessor"></span><span class="preprocessor">#define PART_MIRROR 0x60</span>
  3673. <a name="l03681"></a>03681 <span class="preprocessor"></span><span class="preprocessor">#define PART_A 0x80</span>
  3674. <a name="l03682"></a>03682 <span class="preprocessor"></span><span class="preprocessor">#define PART_B 0xa0</span>
  3675. <a name="l03683"></a>03683 <span class="preprocessor"></span><span class="preprocessor">#define PART_C 0xc0</span>
  3676. <a name="l03684"></a>03684 <span class="preprocessor"></span><span class="preprocessor">#define PART_D 0xe0</span>
  3677. <a name="l03685"></a>03685 <span class="preprocessor"></span><span class="preprocessor">#define ISPLASMA(x) (PART(x) == PART_PLASMA)</span>
  3678. <a name="l03686"></a>03686 <span class="preprocessor"></span><span class="preprocessor">#define ISWALL(x) (PART(x) == PART_WALL)</span>
  3679. <a name="l03687"></a>03687 <span class="preprocessor"></span><span class="preprocessor">#define ISMIRROR(x) (PART(x) == PART_MIRROR)</span>
  3680. <a name="l03688"></a>03688 <span class="preprocessor"></span><span class="preprocessor">#define ISA(x) (PART(x) == PART_A)</span>
  3681. <a name="l03689"></a>03689 <span class="preprocessor"></span><span class="preprocessor">#define ISB(x) (PART(x) == PART_B)</span>
  3682. <a name="l03690"></a>03690 <span class="preprocessor"></span><span class="preprocessor">#define ISC(x) (PART(x) == PART_C)</span>
  3683. <a name="l03691"></a>03691 <span class="preprocessor"></span><span class="preprocessor">#define ISD(x) (PART(x) == PART_D)</span>
  3684. <a name="l03692"></a>03692 <span class="preprocessor"></span><span class="preprocessor">#define ISABCD(x) ((x) &amp; 0x80)</span>
  3685. <a name="l03693"></a>03693 <span class="preprocessor"></span><span class="comment">//#define ISEMPTY(x) (((x) &amp; 0xc0) == PART_EMPTY)</span>
  3686. <a name="l03694"></a>03694 <span class="preprocessor">#define ISEMPTY(x) (PART(x) == PART_EMPTY)</span>
  3687. <a name="l03695"></a>03695 <span class="preprocessor"></span>
  3688. <a name="l03696"></a>03696 <span class="comment">// __XXXX__ : payload</span>
  3689. <a name="l03697"></a>03697
  3690. <a name="l03698"></a>03698 <span class="preprocessor">#define PAYLOAD_MASK 0x1c</span>
  3691. <a name="l03699"></a>03699 <span class="preprocessor"></span><span class="preprocessor">#define PAYLOAD(x) ((x) &amp; PAYLOAD_MASK)</span>
  3692. <a name="l03700"></a>03700 <span class="preprocessor"></span>
  3693. <a name="l03701"></a>03701 <span class="comment">// 0</span>
  3694. <a name="l03702"></a>03702 <span class="comment">// 3 1</span>
  3695. <a name="l03703"></a>03703 <span class="comment">// 2</span>
  3696. <a name="l03704"></a>03704 <span class="comment">//</span>
  3697. <a name="l03705"></a>03705 <span class="comment">// ______00 : north</span>
  3698. <a name="l03706"></a>03706 <span class="comment">// ______01 : east</span>
  3699. <a name="l03707"></a>03707 <span class="comment">// ______10 : south</span>
  3700. <a name="l03708"></a>03708 <span class="comment">// ______11 : west</span>
  3701. <a name="l03709"></a>03709
  3702. <a name="l03710"></a>03710 <span class="preprocessor">#define DIR_MASK 0x03</span>
  3703. <a name="l03711"></a>03711 <span class="preprocessor"></span><span class="preprocessor">#define DIR(x) ((x) &amp; DIR_MASK)</span>
  3704. <a name="l03712"></a>03712 <span class="preprocessor"></span><span class="preprocessor">#define DIR_N 0x00</span>
  3705. <a name="l03713"></a>03713 <span class="preprocessor"></span><span class="preprocessor">#define DIR_E 0x01</span>
  3706. <a name="l03714"></a>03714 <span class="preprocessor"></span><span class="preprocessor">#define DIR_S 0x02</span>
  3707. <a name="l03715"></a>03715 <span class="preprocessor"></span><span class="preprocessor">#define DIR_W 0x03</span>
  3708. <a name="l03716"></a>03716 <span class="preprocessor"></span>
  3709. <a name="l03717"></a>03717 <span class="preprocessor">#define NOTPART_MASK (PAYLOAD_MASK | DIR_MASK)</span>
  3710. <a name="l03718"></a>03718 <span class="preprocessor"></span><span class="preprocessor">#define NOTPART(x) ((x) &amp; NOTPART_MASK)</span>
  3711. <a name="l03719"></a>03719 <span class="preprocessor"></span>
  3712. <a name="l03720"></a>03720
  3713. <a name="l03721"></a>03721 Byte RandDir(Byte x);
  3714. <a name="l03722"></a>03722
  3715. <a name="l03723"></a>03723 Byte RandDir(Byte x)
  3716. <a name="l03724"></a>03724 {
  3717. <a name="l03725"></a>03725 <span class="keywordtype">long</span> b = Rand8() &lt; 128;
  3718. <a name="l03726"></a>03726 Byte result = 0;
  3719. <a name="l03727"></a>03727
  3720. <a name="l03728"></a>03728 <span class="keywordflow">switch</span> (ABCD(x)) {
  3721. <a name="l03729"></a>03729
  3722. <a name="l03730"></a>03730 <span class="keywordflow">case</span> PART_A:
  3723. <a name="l03731"></a>03731 result = b ? DIR_N : DIR_W;
  3724. <a name="l03732"></a>03732 <span class="keywordflow">break</span>;
  3725. <a name="l03733"></a>03733
  3726. <a name="l03734"></a>03734 <span class="keywordflow">case</span> PART_B:
  3727. <a name="l03735"></a>03735 result = b ? DIR_W : DIR_S;
  3728. <a name="l03736"></a>03736 <span class="keywordflow">break</span>;
  3729. <a name="l03737"></a>03737
  3730. <a name="l03738"></a>03738 <span class="keywordflow">case</span> PART_C:
  3731. <a name="l03739"></a>03739 result = b ? DIR_S : DIR_E;
  3732. <a name="l03740"></a>03740 <span class="keywordflow">break</span>;
  3733. <a name="l03741"></a>03741
  3734. <a name="l03742"></a>03742 <span class="keywordflow">case</span> PART_D:
  3735. <a name="l03743"></a>03743 result = b ? DIR_E : DIR_N;
  3736. <a name="l03744"></a>03744 <span class="keywordflow">break</span>;
  3737. <a name="l03745"></a>03745
  3738. <a name="l03746"></a>03746 }
  3739. <a name="l03747"></a>03747
  3740. <a name="l03748"></a>03748 <span class="keywordflow">return</span> PART(x) | result | PAYLOAD(x);
  3741. <a name="l03749"></a>03749 }
  3742. <a name="l03750"></a>03750
  3743. <a name="l03751"></a>03751
  3744. <a name="l03752"></a>03752 <span class="keywordtype">void</span> CellEngine::n_driven()
  3745. <a name="l03753"></a>03753 {
  3746. <a name="l03754"></a>03754 Byte *front = frontMem;
  3747. <a name="l03755"></a>03755 Byte *back = backMem +
  3748. <a name="l03756"></a>03756 backBorder +
  3749. <a name="l03757"></a>03757 (backBorder * backRowBytes);
  3750. <a name="l03758"></a>03758 Byte *f = front, *b = back;
  3751. <a name="l03759"></a>03759 <span class="keywordtype">long</span> xx, yy;
  3752. <a name="l03760"></a>03760 <span class="keywordtype">long</span> heat = 0;
  3753. <a name="l03761"></a>03761 Byte nw, n, ne;
  3754. <a name="l03762"></a>03762 Byte ww, w, c, e, ee;
  3755. <a name="l03763"></a>03763 Byte sw, s, se;
  3756. <a name="l03764"></a>03764
  3757. <a name="l03765"></a>03765 <span class="keywordflow">for</span> (yy = 0;
  3758. <a name="l03766"></a>03766 yy &lt; height;
  3759. <a name="l03767"></a>03767 f += screenRowBytes,
  3760. <a name="l03768"></a>03768 b += backRowBytes,
  3761. <a name="l03769"></a>03769 yy++) {
  3762. <a name="l03770"></a>03770
  3763. <a name="l03771"></a>03771 <span class="comment">// .. __ .. .. ..</span>
  3764. <a name="l03772"></a>03772 <span class="comment">// __ n ne .. ..</span>
  3765. <a name="l03773"></a>03773 <span class="comment">// w c e ee ..</span>
  3766. <a name="l03774"></a>03774 <span class="comment">// __ s se .. ..</span>
  3767. <a name="l03775"></a>03775 <span class="comment">// .. __ .. .. ..</span>
  3768. <a name="l03776"></a>03776
  3769. <a name="l03777"></a>03777 n = b[-1 + -backRowBytes];
  3770. <a name="l03778"></a>03778 ne = b[-backRowBytes];
  3771. <a name="l03779"></a>03779 w = b[-2];
  3772. <a name="l03780"></a>03780 c = b[-1];
  3773. <a name="l03781"></a>03781 e = b[0];
  3774. <a name="l03782"></a>03782 ee = b[1];
  3775. <a name="l03783"></a>03783 s = b[-1 + backRowBytes];
  3776. <a name="l03784"></a>03784 se = b[backRowBytes];
  3777. <a name="l03785"></a>03785
  3778. <a name="l03786"></a>03786 <span class="keywordflow">for</span> (xx = 0;
  3779. <a name="l03787"></a>03787 xx &lt; width;
  3780. <a name="l03788"></a>03788 xx++) {
  3781. <a name="l03789"></a>03789 <span class="comment">// .. .. NN .. ..</span>
  3782. <a name="l03790"></a>03790 <span class="comment">// .. nw n NE ..</span>
  3783. <a name="l03791"></a>03791 <span class="comment">// ww w c e EE</span>
  3784. <a name="l03792"></a>03792 <span class="comment">// .. sw s SE ..</span>
  3785. <a name="l03793"></a>03793 <span class="comment">// .. .. SS .. ..</span>
  3786. <a name="l03794"></a>03794
  3787. <a name="l03795"></a>03795 nw = n;
  3788. <a name="l03796"></a>03796 n = ne;
  3789. <a name="l03797"></a>03797 ne = b[xx + 1 + -backRowBytes];
  3790. <a name="l03798"></a>03798 ww = w;
  3791. <a name="l03799"></a>03799 w = c;
  3792. <a name="l03800"></a>03800 c = e;
  3793. <a name="l03801"></a>03801 e = ee;
  3794. <a name="l03802"></a>03802 ee = b[xx + 2];
  3795. <a name="l03803"></a>03803 sw = s;
  3796. <a name="l03804"></a>03804 s = se;
  3797. <a name="l03805"></a>03805 se = b[xx + 1 + backRowBytes];
  3798. <a name="l03806"></a>03806
  3799. <a name="l03807"></a>03807 <span class="keywordflow">if</span> (ISEMPTY(c)) {
  3800. <a name="l03808"></a>03808
  3801. <a name="l03809"></a>03809 <span class="keywordflow">switch</span> (((ISABCD(n) &amp;&amp; (DIR(n) == DIR_S)) ? 1 : 0) +
  3802. <a name="l03810"></a>03810 ((ISABCD(e) &amp;&amp; (DIR(e) == DIR_W)) ? 2 : 0) +
  3803. <a name="l03811"></a>03811 ((ISABCD(s) &amp;&amp; (DIR(s) == DIR_N)) ? 4 : 0) +
  3804. <a name="l03812"></a>03812 ((ISABCD(w) &amp;&amp; (DIR(w) == DIR_E)) ? 8 : 0)) {
  3805. <a name="l03813"></a>03813
  3806. <a name="l03814"></a>03814 <span class="keywordflow">case</span> 1:
  3807. <a name="l03815"></a>03815 f[xx] = RandDir(n);
  3808. <a name="l03816"></a>03816 <span class="keywordflow">break</span>;
  3809. <a name="l03817"></a>03817
  3810. <a name="l03818"></a>03818 <span class="keywordflow">case</span> 2:
  3811. <a name="l03819"></a>03819 f[xx] = RandDir(e);
  3812. <a name="l03820"></a>03820 <span class="keywordflow">break</span>;
  3813. <a name="l03821"></a>03821
  3814. <a name="l03822"></a>03822 <span class="keywordflow">case</span> 4:
  3815. <a name="l03823"></a>03823 f[xx] = RandDir(s);
  3816. <a name="l03824"></a>03824 <span class="keywordflow">break</span>;
  3817. <a name="l03825"></a>03825
  3818. <a name="l03826"></a>03826 <span class="keywordflow">case</span> 8:
  3819. <a name="l03827"></a>03827 f[xx] = RandDir(w);
  3820. <a name="l03828"></a>03828 <span class="keywordflow">break</span>;
  3821. <a name="l03829"></a>03829
  3822. <a name="l03830"></a>03830 <span class="keywordflow">default</span>:
  3823. <a name="l03831"></a>03831 <span class="comment">// stay the same</span>
  3824. <a name="l03832"></a>03832 <span class="keywordflow">break</span>;
  3825. <a name="l03833"></a>03833
  3826. <a name="l03834"></a>03834 }
  3827. <a name="l03835"></a>03835 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ISPLASMA(c)) {
  3828. <a name="l03836"></a>03836 heat += (Byte)frob;
  3829. <a name="l03837"></a>03837 heat += ISEMPTY(nw) ? c : nw;
  3830. <a name="l03838"></a>03838 heat += ISEMPTY(n) ? c : n;
  3831. <a name="l03839"></a>03839 heat += ISEMPTY(ne) ? c : ne;
  3832. <a name="l03840"></a>03840 heat += ISEMPTY(w) ? c : w;
  3833. <a name="l03841"></a>03841 heat += ISEMPTY(e) ? c : e;
  3834. <a name="l03842"></a>03842 heat += ISEMPTY(sw) ? c : sw;
  3835. <a name="l03843"></a>03843 heat += ISEMPTY(s) ? c : s;
  3836. <a name="l03844"></a>03844 heat += ISEMPTY(se) ? c : se;
  3837. <a name="l03845"></a>03845 f[xx] = PART_PLASMA | NOTPART(heat &gt;&gt; 3);
  3838. <a name="l03846"></a>03846 heat &amp;= 7;
  3839. <a name="l03847"></a>03847 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ISWALL(c)) {
  3840. <a name="l03848"></a>03848 <span class="comment">// stay the same</span>
  3841. <a name="l03849"></a>03849 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ISMIRROR(c)) {
  3842. <a name="l03850"></a>03850 <span class="comment">// stay the same</span>
  3843. <a name="l03851"></a>03851 } <span class="keywordflow">else</span> {
  3844. <a name="l03852"></a>03852 <span class="keywordflow">switch</span> (DIR(c)) {
  3845. <a name="l03853"></a>03853
  3846. <a name="l03854"></a>03854 <span class="keywordflow">case</span> DIR_N:
  3847. <a name="l03855"></a>03855 {
  3848. <a name="l03856"></a>03856 Byte nn;
  3849. <a name="l03857"></a>03857
  3850. <a name="l03858"></a>03858 <span class="keywordflow">if</span> (ISMIRROR(n) || ISPLASMA(n)) {
  3851. <a name="l03859"></a>03859 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
  3852. <a name="l03860"></a>03860 <span class="preprocessor">#ifdef DOSOUND</span>
  3853. <a name="l03861"></a>03861 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
  3854. <a name="l03862"></a>03862 ((c &gt;&gt; 2) &amp; 0x0f) |
  3855. <a name="l03863"></a>03863 ((n &amp; 3) &lt;&lt; 4));
  3856. <a name="l03864"></a>03864 <span class="preprocessor">#endif</span>
  3857. <a name="l03865"></a>03865 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(n)) ||
  3858. <a name="l03866"></a>03866 (ISABCD(nw) &amp;&amp; (DIR(nw) == DIR_E)) ||
  3859. <a name="l03867"></a>03867 (ISABCD(ne) &amp;&amp; (DIR(ne) == DIR_W)) ||
  3860. <a name="l03868"></a>03868 ((nn = b[xx + (-2 * backRowBytes)]),
  3861. <a name="l03869"></a>03869 (ISABCD(nn) &amp;&amp; (DIR(nn) == DIR_S)))) {
  3862. <a name="l03870"></a>03870 <span class="comment">// stay the same</span>
  3863. <a name="l03871"></a>03871 f[xx] = RandDir(c);
  3864. <a name="l03872"></a>03872 } <span class="keywordflow">else</span> {
  3865. <a name="l03873"></a>03873 <span class="comment">// move north</span>
  3866. <a name="l03874"></a>03874 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
  3867. <a name="l03875"></a>03875 }
  3868. <a name="l03876"></a>03876 <span class="keywordflow">break</span>;
  3869. <a name="l03877"></a>03877 }
  3870. <a name="l03878"></a>03878
  3871. <a name="l03879"></a>03879 <span class="keywordflow">case</span> DIR_S:
  3872. <a name="l03880"></a>03880 {
  3873. <a name="l03881"></a>03881 Byte ss;
  3874. <a name="l03882"></a>03882
  3875. <a name="l03883"></a>03883 <span class="keywordflow">if</span> (ISMIRROR(s) || ISPLASMA(s)) {
  3876. <a name="l03884"></a>03884 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
  3877. <a name="l03885"></a>03885 <span class="preprocessor">#ifdef DOSOUND</span>
  3878. <a name="l03886"></a>03886 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
  3879. <a name="l03887"></a>03887 ((c &gt;&gt; 2) &amp; 0x0f) |
  3880. <a name="l03888"></a>03888 ((s &amp; 3) &lt;&lt; 4));
  3881. <a name="l03889"></a>03889 <span class="preprocessor">#endif</span>
  3882. <a name="l03890"></a>03890 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(s)) ||
  3883. <a name="l03891"></a>03891 (ISABCD(sw) &amp;&amp; (DIR(sw) == DIR_E)) ||
  3884. <a name="l03892"></a>03892 (ISABCD(se) &amp;&amp; (DIR(se) == DIR_W)) ||
  3885. <a name="l03893"></a>03893 ((ss = b[xx + (2 * backRowBytes)]),
  3886. <a name="l03894"></a>03894 (ISABCD(ss) &amp;&amp; (DIR(ss) == DIR_N)))) {
  3887. <a name="l03895"></a>03895 <span class="comment">// stay the same</span>
  3888. <a name="l03896"></a>03896 f[xx] = RandDir(c);
  3889. <a name="l03897"></a>03897 } <span class="keywordflow">else</span> {
  3890. <a name="l03898"></a>03898 <span class="comment">// move south</span>
  3891. <a name="l03899"></a>03899 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
  3892. <a name="l03900"></a>03900 }
  3893. <a name="l03901"></a>03901 <span class="keywordflow">break</span>;
  3894. <a name="l03902"></a>03902 }
  3895. <a name="l03903"></a>03903
  3896. <a name="l03904"></a>03904 <span class="keywordflow">case</span> DIR_W:
  3897. <a name="l03905"></a>03905 {
  3898. <a name="l03906"></a>03906 <span class="keywordflow">if</span> (ISMIRROR(w) || ISPLASMA(w)) {
  3899. <a name="l03907"></a>03907 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
  3900. <a name="l03908"></a>03908 <span class="preprocessor">#ifdef DOSOUND</span>
  3901. <a name="l03909"></a>03909 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
  3902. <a name="l03910"></a>03910 ((c &gt;&gt; 2) &amp; 0x0f) |
  3903. <a name="l03911"></a>03911 ((w &amp; 3) &lt;&lt; 4));
  3904. <a name="l03912"></a>03912 <span class="preprocessor">#endif</span>
  3905. <a name="l03913"></a>03913 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(w)) ||
  3906. <a name="l03914"></a>03914 (ISABCD(ww) &amp;&amp; (DIR(ww) == DIR_E)) ||
  3907. <a name="l03915"></a>03915 (ISABCD(nw) &amp;&amp; (DIR(nw) == DIR_S)) ||
  3908. <a name="l03916"></a>03916 (ISABCD(sw) &amp;&amp; (DIR(sw) == DIR_N))) {
  3909. <a name="l03917"></a>03917 <span class="comment">// stay the same</span>
  3910. <a name="l03918"></a>03918 f[xx] = RandDir(c);
  3911. <a name="l03919"></a>03919 } <span class="keywordflow">else</span> {
  3912. <a name="l03920"></a>03920 <span class="comment">// move west</span>
  3913. <a name="l03921"></a>03921 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
  3914. <a name="l03922"></a>03922 }
  3915. <a name="l03923"></a>03923 <span class="keywordflow">break</span>;
  3916. <a name="l03924"></a>03924 }
  3917. <a name="l03925"></a>03925
  3918. <a name="l03926"></a>03926 <span class="keywordflow">case</span> DIR_E:
  3919. <a name="l03927"></a>03927 {
  3920. <a name="l03928"></a>03928 <span class="keywordflow">if</span> (ISMIRROR(e) || ISPLASMA(e)) {
  3921. <a name="l03929"></a>03929 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
  3922. <a name="l03930"></a>03930 <span class="preprocessor">#ifdef DOSOUND</span>
  3923. <a name="l03931"></a>03931 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
  3924. <a name="l03932"></a>03932 ((c &gt;&gt; 2) &amp; 0x0f) |
  3925. <a name="l03933"></a>03933 ((e &amp; 3) &lt;&lt; 4));
  3926. <a name="l03934"></a>03934 <span class="preprocessor">#endif</span>
  3927. <a name="l03935"></a>03935 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(e)) ||
  3928. <a name="l03936"></a>03936 (ISABCD(ee) &amp;&amp; (DIR(ee) == DIR_W)) ||
  3929. <a name="l03937"></a>03937 (ISABCD(ne) &amp;&amp; (DIR(ne) == DIR_S)) ||
  3930. <a name="l03938"></a>03938 (ISABCD(se) &amp;&amp; (DIR(se) == DIR_N))) {
  3931. <a name="l03939"></a>03939 <span class="comment">// stay the same</span>
  3932. <a name="l03940"></a>03940 f[xx] = RandDir(c);
  3933. <a name="l03941"></a>03941 } <span class="keywordflow">else</span> {
  3934. <a name="l03942"></a>03942 <span class="comment">// move east</span>
  3935. <a name="l03943"></a>03943 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
  3936. <a name="l03944"></a>03944 }
  3937. <a name="l03945"></a>03945 <span class="keywordflow">break</span>;
  3938. <a name="l03946"></a>03946 }
  3939. <a name="l03947"></a>03947 }
  3940. <a name="l03948"></a>03948 }
  3941. <a name="l03949"></a>03949 }
  3942. <a name="l03950"></a>03950 }
  3943. <a name="l03951"></a>03951
  3944. <a name="l03952"></a>03952 <span class="preprocessor">#ifdef DOSOUND</span>
  3945. <a name="l03953"></a>03953 <span class="preprocessor"></span> SoundEvent::PlayQueue(gui);
  3946. <a name="l03954"></a>03954 <span class="preprocessor">#endif</span>
  3947. <a name="l03955"></a>03955 <span class="preprocessor"></span>}
  3948. <a name="l03956"></a>03956
  3949. <a name="l03957"></a>03957
  3950. <a name="l03959"></a>03959 <span class="comment">// daft</span>
  3951. <a name="l03960"></a>03960
  3952. <a name="l03961"></a>03961 <span class="comment">// 0</span>
  3953. <a name="l03962"></a>03962 <span class="comment">// 3 1</span>
  3954. <a name="l03963"></a>03963 <span class="comment">// 2</span>
  3955. <a name="l03964"></a>03964
  3956. <a name="l03965"></a>03965 <span class="comment">// 00 0000____ : north</span>
  3957. <a name="l03966"></a>03966 <span class="comment">// 10 0001____ : east</span>
  3958. <a name="l03967"></a>03967 <span class="comment">// 20 0010____ : south</span>
  3959. <a name="l03968"></a>03968 <span class="comment">// 30 0011____ : west</span>
  3960. <a name="l03969"></a>03969 <span class="comment">// 40 0100____ : north mirror</span>
  3961. <a name="l03970"></a>03970 <span class="comment">// 50 0101____ : east mirror</span>
  3962. <a name="l03971"></a>03971 <span class="comment">// 60 0110____ : south mirror</span>
  3963. <a name="l03972"></a>03972 <span class="comment">// 70 0111____ : west mirror</span>
  3964. <a name="l03973"></a>03973 <span class="comment">// 80 1000____ : space</span>
  3965. <a name="l03974"></a>03974 <span class="comment">// 90 0001____ : magic</span>
  3966. <a name="l03975"></a>03975 <span class="comment">// a0 1010____ : metal</span>
  3967. <a name="l03976"></a>03976 <span class="comment">// b0 1011____ : microphone</span>
  3968. <a name="l03977"></a>03977 <span class="comment">// c0 1100____ : speaker</span>
  3969. <a name="l03978"></a>03978 <span class="comment">// d0 1101____ : input</span>
  3970. <a name="l03979"></a>03979 <span class="comment">// e0 1110____ : output</span>
  3971. <a name="l03980"></a>03980 <span class="comment">// f0 1111____ : random</span>
  3972. <a name="l03981"></a>03981
  3973. <a name="l03982"></a>03982 <span class="preprocessor">#define OPCODE_MASK 0xf0</span>
  3974. <a name="l03983"></a>03983 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE(x) ((x) &amp; OPCODE_MASK)</span>
  3975. <a name="l03984"></a>03984 <span class="preprocessor"></span>
  3976. <a name="l03985"></a>03985 <span class="preprocessor">#define OPCODE_NORTH 0x00</span>
  3977. <a name="l03986"></a>03986 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_EAST 0x10</span>
  3978. <a name="l03987"></a>03987 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SOUTH 0x20</span>
  3979. <a name="l03988"></a>03988 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_WEST 0x30</span>
  3980. <a name="l03989"></a>03989 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_NORTHMIRROR 0x40</span>
  3981. <a name="l03990"></a>03990 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_EASTMIRROR 0x50</span>
  3982. <a name="l03991"></a>03991 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SOUTHMIRROR 0x60</span>
  3983. <a name="l03992"></a>03992 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_WESTMIRROR 0x70</span>
  3984. <a name="l03993"></a>03993 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SPACE 0x80</span>
  3985. <a name="l03994"></a>03994 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_MAGIC 0x90</span>
  3986. <a name="l03995"></a>03995 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_METAL 0xa0</span>
  3987. <a name="l03996"></a>03996 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_MICROPHONE 0xb0</span>
  3988. <a name="l03997"></a>03997 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SPEAKER 0xc0</span>
  3989. <a name="l03998"></a>03998 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_INPUT 0xd0</span>
  3990. <a name="l03999"></a>03999 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_OUTPUT 0xe0</span>
  3991. <a name="l04000"></a>04000 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_RANDOM 0xf0</span>
  3992. <a name="l04001"></a>04001 <span class="preprocessor"></span>
  3993. <a name="l04002"></a>04002 <span class="preprocessor">#define FLOW_MASK 0x70</span>
  3994. <a name="l04003"></a>04003 <span class="preprocessor"></span><span class="preprocessor">#define FLOW(x) ((x) &amp; FLOW_MASK)</span>
  3995. <a name="l04004"></a>04004 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_N 0x00</span>
  3996. <a name="l04005"></a>04005 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_E 0x10</span>
  3997. <a name="l04006"></a>04006 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_S 0x20</span>
  3998. <a name="l04007"></a>04007 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_W 0x30</span>
  3999. <a name="l04008"></a>04008 <span class="preprocessor"></span>
  4000. <a name="l04009"></a>04009 <span class="preprocessor">#define IS_FLOWING(x) ((x) &lt; OPCODE_MAGIC)</span>
  4001. <a name="l04010"></a>04010 <span class="preprocessor"></span>
  4002. <a name="l04011"></a>04011 <span class="preprocessor">#define OPERAND_MASK 0x0f</span>
  4003. <a name="l04012"></a>04012 <span class="preprocessor"></span><span class="preprocessor">#define OPERAND(x) ((x) &amp; OPERAND_MASK)</span>
  4004. <a name="l04013"></a>04013 <span class="preprocessor"></span>
  4005. <a name="l04014"></a>04014 <span class="keywordtype">void</span> CellEngine::n_daft()
  4006. <a name="l04015"></a>04015 {
  4007. <a name="l04016"></a>04016 Byte *front = frontMem;
  4008. <a name="l04017"></a>04017 Byte *back = backMem +
  4009. <a name="l04018"></a>04018 backBorder +
  4010. <a name="l04019"></a>04019 (backBorder * backRowBytes);
  4011. <a name="l04020"></a>04020 Byte *f = front, *b = back;
  4012. <a name="l04021"></a>04021 <span class="keywordtype">long</span> xx, yy;
  4013. <a name="l04022"></a>04022
  4014. <a name="l04023"></a>04023 Byte nw, n, ne;
  4015. <a name="l04024"></a>04024 Byte ww, w, c, e, ee;
  4016. <a name="l04025"></a>04025 Byte sw, s, se;
  4017. <a name="l04026"></a>04026 <span class="keywordflow">for</span> (yy = 0;
  4018. <a name="l04027"></a>04027 yy &lt; height;
  4019. <a name="l04028"></a>04028 f += screenRowBytes,
  4020. <a name="l04029"></a>04029 b += backRowBytes,
  4021. <a name="l04030"></a>04030 yy++) {
  4022. <a name="l04031"></a>04031
  4023. <a name="l04032"></a>04032 <span class="comment">// .. __ .. .. ..</span>
  4024. <a name="l04033"></a>04033 <span class="comment">// __ n ne .. ..</span>
  4025. <a name="l04034"></a>04034 <span class="comment">// w c e ee ..</span>
  4026. <a name="l04035"></a>04035 <span class="comment">// __ s se .. ..</span>
  4027. <a name="l04036"></a>04036 <span class="comment">// .. __ .. .. ..</span>
  4028. <a name="l04037"></a>04037
  4029. <a name="l04038"></a>04038 n = b[-1 + -backRowBytes];
  4030. <a name="l04039"></a>04039 ne = b[-backRowBytes];
  4031. <a name="l04040"></a>04040 w = b[-2];
  4032. <a name="l04041"></a>04041 c = b[-1];
  4033. <a name="l04042"></a>04042 e = b[0];
  4034. <a name="l04043"></a>04043 ee = b[1];
  4035. <a name="l04044"></a>04044 s = b[-1 + backRowBytes];
  4036. <a name="l04045"></a>04045 se = b[backRowBytes];
  4037. <a name="l04046"></a>04046
  4038. <a name="l04047"></a>04047 <span class="keywordflow">for</span> (xx = 0;
  4039. <a name="l04048"></a>04048 xx &lt; width;
  4040. <a name="l04049"></a>04049 xx++) {
  4041. <a name="l04050"></a>04050 <span class="comment">// .. .. NN .. ..</span>
  4042. <a name="l04051"></a>04051 <span class="comment">// .. nw n NE ..</span>
  4043. <a name="l04052"></a>04052 <span class="comment">// ww w c e EE</span>
  4044. <a name="l04053"></a>04053 <span class="comment">// .. sw s SE ..</span>
  4045. <a name="l04054"></a>04054 <span class="comment">// .. .. SS .. ..</span>
  4046. <a name="l04055"></a>04055
  4047. <a name="l04056"></a>04056 nw = n;
  4048. <a name="l04057"></a>04057 n = ne;
  4049. <a name="l04058"></a>04058 ne = b[xx + 1 + -backRowBytes];
  4050. <a name="l04059"></a>04059 ww = w;
  4051. <a name="l04060"></a>04060 w = c;
  4052. <a name="l04061"></a>04061 c = e;
  4053. <a name="l04062"></a>04062 e = ee;
  4054. <a name="l04063"></a>04063 ee = b[xx + 2];
  4055. <a name="l04064"></a>04064 sw = s;
  4056. <a name="l04065"></a>04065 s = se;
  4057. <a name="l04066"></a>04066 se = b[xx + 1 + backRowBytes];
  4058. <a name="l04067"></a>04067
  4059. <a name="l04068"></a>04068 <span class="keywordflow">switch</span> (OPCODE(c)) {
  4060. <a name="l04069"></a>04069 <span class="keywordflow">case</span> OPCODE_NORTH:
  4061. <a name="l04070"></a>04070 <span class="keywordflow">break</span>;
  4062. <a name="l04071"></a>04071 <span class="keywordflow">case</span> OPCODE_EAST:
  4063. <a name="l04072"></a>04072 <span class="keywordflow">break</span>;
  4064. <a name="l04073"></a>04073 <span class="keywordflow">case</span> OPCODE_SOUTH:
  4065. <a name="l04074"></a>04074 <span class="keywordflow">break</span>;
  4066. <a name="l04075"></a>04075 <span class="keywordflow">case</span> OPCODE_WEST:
  4067. <a name="l04076"></a>04076 <span class="keywordflow">break</span>;
  4068. <a name="l04077"></a>04077 <span class="keywordflow">case</span> OPCODE_NORTHMIRROR:
  4069. <a name="l04078"></a>04078 <span class="keywordflow">break</span>;
  4070. <a name="l04079"></a>04079 <span class="keywordflow">case</span> OPCODE_EASTMIRROR:
  4071. <a name="l04080"></a>04080 <span class="keywordflow">break</span>;
  4072. <a name="l04081"></a>04081 <span class="keywordflow">case</span> OPCODE_SOUTHMIRROR:
  4073. <a name="l04082"></a>04082 <span class="keywordflow">break</span>;
  4074. <a name="l04083"></a>04083 <span class="keywordflow">case</span> OPCODE_WESTMIRROR:
  4075. <a name="l04084"></a>04084 <span class="keywordflow">break</span>;
  4076. <a name="l04085"></a>04085 <span class="keywordflow">case</span> OPCODE_SPACE:
  4077. <a name="l04086"></a>04086 <span class="keywordflow">break</span>;
  4078. <a name="l04087"></a>04087 <span class="keywordflow">case</span> OPCODE_MAGIC:
  4079. <a name="l04088"></a>04088 <span class="keywordflow">break</span>;
  4080. <a name="l04089"></a>04089 <span class="keywordflow">case</span> OPCODE_METAL:
  4081. <a name="l04090"></a>04090 <span class="keywordflow">break</span>;
  4082. <a name="l04091"></a>04091 <span class="keywordflow">case</span> OPCODE_MICROPHONE:
  4083. <a name="l04092"></a>04092 <span class="keywordflow">break</span>;
  4084. <a name="l04093"></a>04093 <span class="keywordflow">case</span> OPCODE_SPEAKER:
  4085. <a name="l04094"></a>04094 <span class="keywordflow">break</span>;
  4086. <a name="l04095"></a>04095 <span class="keywordflow">case</span> OPCODE_INPUT:
  4087. <a name="l04096"></a>04096 <span class="keywordflow">break</span>;
  4088. <a name="l04097"></a>04097 <span class="keywordflow">case</span> OPCODE_OUTPUT:
  4089. <a name="l04098"></a>04098 <span class="keywordflow">break</span>;
  4090. <a name="l04099"></a>04099 <span class="keywordflow">case</span> OPCODE_RANDOM:
  4091. <a name="l04100"></a>04100 <span class="keywordflow">break</span>;
  4092. <a name="l04101"></a>04101 }
  4093. <a name="l04102"></a>04102 }
  4094. <a name="l04103"></a>04103 }
  4095. <a name="l04104"></a>04104
  4096. <a name="l04105"></a>04105 <span class="preprocessor">#ifdef DOSOUND</span>
  4097. <a name="l04106"></a>04106 <span class="preprocessor"></span> SoundEvent::PlayQueue(gui);
  4098. <a name="l04107"></a>04107 <span class="preprocessor">#endif</span>
  4099. <a name="l04108"></a>04108 <span class="preprocessor"></span>}
  4100. <a name="l04109"></a>04109
  4101. <a name="l04110"></a>04110
  4102. <a name="l04111"></a>04111 <span class="keywordtype">void</span> CellEngine::n_spinsonly()
  4103. <a name="l04112"></a>04112 {
  4104. <a name="l04113"></a>04113
  4105. <a name="l04114"></a>04114 <span class="preprocessor">#define SPINSONLY ( \</span>
  4106. <a name="l04115"></a>04115 <span class="preprocessor"> ((((xx + x) ^ (yy + y) ^ phase) &amp; 1) </span><span class="comment">/* spatio-temporal phase */</span> \
  4107. <a name="l04116"></a>04116 ? c <span class="comment">/* stay the same if true */</span> \
  4108. <a name="l04117"></a>04117 : (((SUM4REG(1) != 2) <span class="comment">/* can we not flip? */</span> \
  4109. <a name="l04118"></a>04118 ? (c &amp; 1) <span class="comment">/* no flip */</span> \
  4110. <a name="l04119"></a>04119 : ((c ^ 1) &amp; 1) <span class="comment">/* do flip */</span> \
  4111. <a name="l04120"></a>04120 ) \
  4112. <a name="l04121"></a>04121 ) \
  4113. <a name="l04122"></a>04122 ) \
  4114. <a name="l04123"></a>04123 )
  4115. <a name="l04124"></a>04124
  4116. <a name="l04125"></a>04125 CAM_MASKED_REG_LOOP(SPINSONLY)
  4117. <a name="l04126"></a>04126 }
  4118. <a name="l04127"></a>04127
  4119. <a name="l04128"></a>04128
  4120. <a name="l04129"></a>04129 <span class="keywordtype">void</span> CellEngine::n_spinsbank()
  4121. <a name="l04130"></a>04130 {
  4122. <a name="l04131"></a>04131 <span class="keywordtype">long</span> bonds;
  4123. <a name="l04132"></a>04132
  4124. <a name="l04133"></a>04133 <span class="preprocessor">#define SPINSBANK ( \</span>
  4125. <a name="l04134"></a>04134 <span class="preprocessor"> ((((xx + x) ^ (yy + y) ^ phase) &amp; 1) </span><span class="comment">/* spatio-temporal phase */</span> \
  4126. <a name="l04135"></a>04135 ? c <span class="comment">/* stay the same if true */</span> \
  4127. <a name="l04136"></a>04136 : (((c &amp; 3) ^ <span class="comment">/* else xor center with the following */</span> \
  4128. <a name="l04137"></a>04137 ((bonds = SUM4REG(1)), \
  4129. <a name="l04138"></a>04138 (bonds = ((c &amp; 1) <span class="comment">/* if center then subtract from 4 */</span> \
  4130. <a name="l04139"></a>04139 ? (4 - bonds) \
  4131. <a name="l04140"></a>04140 : (bonds))), \
  4132. <a name="l04141"></a>04141 (((bonds == 0) || <span class="comment">/* case 0, 4 */</span> \
  4133. <a name="l04142"></a>04142 (bonds == 4)) \
  4134. <a name="l04143"></a>04143 ? 0 <span class="comment">/* xor with 0 */</span> \
  4135. <a name="l04144"></a>04144 : ((bonds == 2) <span class="comment">/* case 2 */</span> \
  4136. <a name="l04145"></a>04145 ? 1 <span class="comment">/* xor with 1 */</span> \
  4137. <a name="l04146"></a>04146 : ((bonds == 1) <span class="comment">/* case 1 */</span> \
  4138. <a name="l04147"></a>04147 ? ((c &amp; 2) <span class="comment">/* can we get from bank? */</span> \
  4139. <a name="l04148"></a>04148 ? 0 <span class="comment">/* xor with 0 */</span> \
  4140. <a name="l04149"></a>04149 : 3 <span class="comment">/* xor with 3 */</span> \
  4141. <a name="l04150"></a>04150 ) \
  4142. <a name="l04151"></a>04151 : ((c &amp; 2) <span class="comment">/* can we put to bank? */</span> \
  4143. <a name="l04152"></a>04152 ? 3 <span class="comment">/* xor with 3 */</span> \
  4144. <a name="l04153"></a>04153 : 0 <span class="comment">/* xor with 0 */</span> \
  4145. <a name="l04154"></a>04154 ) \
  4146. <a name="l04155"></a>04155 ) \
  4147. <a name="l04156"></a>04156 ) \
  4148. <a name="l04157"></a>04157 ) \
  4149. <a name="l04158"></a>04158 ) \
  4150. <a name="l04159"></a>04159 ) \
  4151. <a name="l04160"></a>04160 ) \
  4152. <a name="l04161"></a>04161 ) \
  4153. <a name="l04162"></a>04162 )
  4154. <a name="l04163"></a>04163
  4155. <a name="l04164"></a>04164 CAM_MASKED_REG_LOOP(SPINSBANK)
  4156. <a name="l04165"></a>04165 }
  4157. <a name="l04166"></a>04166
  4158. <a name="l04167"></a>04167
  4159. <a name="l04168"></a>04168
  4160. <a name="l04169"></a>04169 <span class="keywordtype">void</span> CellEngine::n_spinsheat()
  4161. <a name="l04170"></a>04170 {
  4162. <a name="l04171"></a>04171 <span class="keywordtype">long</span> bonds;
  4163. <a name="l04172"></a>04172 <span class="keywordtype">long</span> heat;
  4164. <a name="l04173"></a>04173 <span class="keywordtype">long</span> error = 0;
  4165. <a name="l04174"></a>04174
  4166. <a name="l04175"></a>04175 <span class="preprocessor">#define SPINSHEAT ( \</span>
  4167. <a name="l04176"></a>04176 <span class="preprocessor"> (error += SUM8REG(0x7f) + frob), \</span>
  4168. <a name="l04177"></a>04177 <span class="preprocessor"> (error = ((error &lt; 0) \</span>
  4169. <a name="l04178"></a>04178 <span class="preprocessor"> ? 0 \</span>
  4170. <a name="l04179"></a>04179 <span class="preprocessor"> : ((error &gt; (0x7f &lt;&lt; 3)) \</span>
  4171. <a name="l04180"></a>04180 <span class="preprocessor"> ? (0x7f &lt;&lt; 3) \</span>
  4172. <a name="l04181"></a>04181 <span class="preprocessor"> : error))), \</span>
  4173. <a name="l04182"></a>04182 <span class="preprocessor"> (c = (((error &gt;&gt; 3) &amp; 0x7f) | (c &amp; 0x80))), \</span>
  4174. <a name="l04183"></a>04183 <span class="preprocessor"> (error &amp;= 0x07), \</span>
  4175. <a name="l04184"></a>04184 <span class="preprocessor"> (unsigned char)((((xx + x) ^ (yy + y) ^ phase) &amp; 1) </span><span class="comment">/* spatio-temporal phase */</span> \
  4176. <a name="l04185"></a>04185 ? c <span class="comment">/* stay the same if true */</span> \
  4177. <a name="l04186"></a>04186 : ((bonds = (SUM4REG(0x80) &gt;&gt; 7)), \
  4178. <a name="l04187"></a>04187 (bonds = ((c &amp; 0x80) <span class="comment">/* if center then subtract from 4 */</span> \
  4179. <a name="l04188"></a>04188 ? (4 - bonds) \
  4180. <a name="l04189"></a>04189 : (bonds))), \
  4181. <a name="l04190"></a>04190 (heat = (c &amp; 0x7f)), \
  4182. <a name="l04191"></a>04191 (((bonds == 0) || <span class="comment">/* case 0, 4 */</span> \
  4183. <a name="l04192"></a>04192 (bonds == 4)) \
  4184. <a name="l04193"></a>04193 ? c <span class="comment">/* xor with 0 */</span> \
  4185. <a name="l04194"></a>04194 : ((bonds == 2) <span class="comment">/* case 2 */</span> \
  4186. <a name="l04195"></a>04195 ? (c ^ 0x80) <span class="comment">/* xor with 1 */</span> \
  4187. <a name="l04196"></a>04196 : ((bonds == 1) <span class="comment">/* case 1 */</span> \
  4188. <a name="l04197"></a>04197 ? (((heat &gt;= low) &amp;&amp; \
  4189. <a name="l04198"></a>04198 (heat &gt;= inflation)) <span class="comment">/* can we get from bank? */</span> \
  4190. <a name="l04199"></a>04199 ? c <span class="comment">/* xor with 0 */</span> \
  4191. <a name="l04200"></a>04200 : ((c ^ 0x80) - inflation) <span class="comment">/* flip and debit */</span> \
  4192. <a name="l04201"></a>04201 ) \
  4193. <a name="l04202"></a>04202 : (((heat &lt;= high) &amp;&amp; \
  4194. <a name="l04203"></a>04203 (heat &lt; 0x80 - inflation)) <span class="comment">/* can we put to bank? */</span> \
  4195. <a name="l04204"></a>04204 ? ((c ^ 0x80) + inflation) <span class="comment">/* flip and credit */</span> \
  4196. <a name="l04205"></a>04205 : c <span class="comment">/* xor with 0 */</span> \
  4197. <a name="l04206"></a>04206 ) \
  4198. <a name="l04207"></a>04207 ) \
  4199. <a name="l04208"></a>04208 ) \
  4200. <a name="l04209"></a>04209 ) \
  4201. <a name="l04210"></a>04210 ) \
  4202. <a name="l04211"></a>04211 ) \
  4203. <a name="l04212"></a>04212 )
  4204. <a name="l04213"></a>04213
  4205. <a name="l04214"></a>04214 CAM_MASKED_REG_LOOP(SPINSHEAT)
  4206. <a name="l04215"></a>04215 }
  4207. <a name="l04216"></a>04216
  4208. <a name="l04217"></a>04217
  4209. <a name="l04218"></a>04218 <span class="keywordtype">void</span> CellEngine::n_spinglass()
  4210. <a name="l04219"></a>04219 {
  4211. <a name="l04220"></a>04220
  4212. <a name="l04221"></a>04221 <span class="preprocessor">#define SPINGLASS ( \</span>
  4213. <a name="l04222"></a>04222 <span class="preprocessor"> ((((xx + x) ^ (yy + y) ^ phase) &amp; 1) </span><span class="comment">/* spatio-temporal phase */</span> \
  4214. <a name="l04223"></a>04223 ? c <span class="comment">/* stay the same if true */</span> \
  4215. <a name="l04224"></a>04224 : (((((((n &gt;&gt; 7) ^ (c &gt;&gt; 0)) &amp; 1) + \
  4216. <a name="l04225"></a>04225 (((w &gt;&gt; 7) ^ (c &gt;&gt; 1)) &amp; 1) + \
  4217. <a name="l04226"></a>04226 (((s &gt;&gt; 7) ^ (s &gt;&gt; 0)) &amp; 1) + \
  4218. <a name="l04227"></a>04227 (((e &gt;&gt; 7) ^ (e &gt;&gt; 1)) &amp; 1)) != 2) \
  4219. <a name="l04228"></a>04228 ? (c &amp; 1) <span class="comment">/* stay the same if energy != 2 */</span> \
  4220. <a name="l04229"></a>04229 : ((c &amp; 1) ^ 0x80) <span class="comment">/* flip if energy == 2 */</span> \
  4221. <a name="l04230"></a>04230 ) \
  4222. <a name="l04231"></a>04231 ) \
  4223. <a name="l04232"></a>04232 ) \
  4224. <a name="l04233"></a>04233 )
  4225. <a name="l04234"></a>04234
  4226. <a name="l04235"></a>04235 CAM_MASKED_REG_LOOP(SPINGLASS)
  4227. <a name="l04236"></a>04236 }
  4228. <a name="l04237"></a>04237
  4229. <a name="l04238"></a>04238
  4230. <a name="l04239"></a>04239 <span class="keyword">static</span> Byte GlassBondsTable[16] = {
  4231. <a name="l04240"></a>04240 0x00, <span class="comment">// 00 -\ 00</span>
  4232. <a name="l04241"></a>04241 <span class="comment">// 00 -/ 00</span>
  4233. <a name="l04242"></a>04242
  4234. <a name="l04243"></a>04243 0x01, <span class="comment">// 00 -\ 00</span>
  4235. <a name="l04244"></a>04244 <span class="comment">// 10 -/ 10</span>
  4236. <a name="l04245"></a>04245
  4237. <a name="l04246"></a>04246 0x02, <span class="comment">// 10 -\ 10</span>
  4238. <a name="l04247"></a>04247 <span class="comment">// 00 -/ 00</span>
  4239. <a name="l04248"></a>04248
  4240. <a name="l04249"></a>04249 0x0c, <span class="comment">// 10 -\ 01</span>
  4241. <a name="l04250"></a>04250 <span class="comment">// 10 -/ 01</span>
  4242. <a name="l04251"></a>04251
  4243. <a name="l04252"></a>04252 0x04, <span class="comment">// 00 -\ 00</span>
  4244. <a name="l04253"></a>04253 <span class="comment">// 01 -/ 01</span>
  4245. <a name="l04254"></a>04254
  4246. <a name="l04255"></a>04255 0x0a, <span class="comment">// 00 -\ 11</span>
  4247. <a name="l04256"></a>04256 <span class="comment">// 11 -/ 00</span>
  4248. <a name="l04257"></a>04257
  4249. <a name="l04258"></a>04258 0x09, <span class="comment">// 10 -\ 01</span>
  4250. <a name="l04259"></a>04259 <span class="comment">// 01 -/ 10</span>
  4251. <a name="l04260"></a>04260
  4252. <a name="l04261"></a>04261 0x07, <span class="comment">// 10 -\ 10</span>
  4253. <a name="l04262"></a>04262 <span class="comment">// 11 -/ 11</span>
  4254. <a name="l04263"></a>04263
  4255. <a name="l04264"></a>04264 0x08, <span class="comment">// 01 -\ 01</span>
  4256. <a name="l04265"></a>04265 <span class="comment">// 00 -/ 00</span>
  4257. <a name="l04266"></a>04266
  4258. <a name="l04267"></a>04267 0x06, <span class="comment">// 01 -\ 10</span>
  4259. <a name="l04268"></a>04268 <span class="comment">// 10 -/ 01</span>
  4260. <a name="l04269"></a>04269
  4261. <a name="l04270"></a>04270 0x05, <span class="comment">// 11 -\ 00</span>
  4262. <a name="l04271"></a>04271 <span class="comment">// 00 -/ 11</span>
  4263. <a name="l04272"></a>04272
  4264. <a name="l04273"></a>04273 0x0b, <span class="comment">// 11 -\ 11</span>
  4265. <a name="l04274"></a>04274 <span class="comment">// 10 -/ 10</span>
  4266. <a name="l04275"></a>04275
  4267. <a name="l04276"></a>04276 0x03, <span class="comment">// 01 -\ 10</span>
  4268. <a name="l04277"></a>04277 <span class="comment">// 01 -/ 10</span>
  4269. <a name="l04278"></a>04278
  4270. <a name="l04279"></a>04279 0x0d, <span class="comment">// 01 -\ 01</span>
  4271. <a name="l04280"></a>04280 <span class="comment">// 11 -/ 11</span>
  4272. <a name="l04281"></a>04281
  4273. <a name="l04282"></a>04282 0x0e, <span class="comment">// 11 -\ 11</span>
  4274. <a name="l04283"></a>04283 <span class="comment">// 01 -/ 01</span>
  4275. <a name="l04284"></a>04284
  4276. <a name="l04285"></a>04285 0x0f <span class="comment">// 11 -\ 11</span>
  4277. <a name="l04286"></a>04286 <span class="comment">// 11 -/ 11</span>
  4278. <a name="l04287"></a>04287
  4279. <a name="l04288"></a>04288 };
  4280. <a name="l04289"></a>04289
  4281. <a name="l04290"></a>04290
  4282. <a name="l04291"></a>04291 <span class="keywordtype">void</span> CellEngine::n_glassbonds()
  4283. <a name="l04292"></a>04292 {
  4284. <a name="l04293"></a>04293
  4285. <a name="l04294"></a>04294 <span class="comment">// 0 1 2 3</span>
  4286. <a name="l04295"></a>04295 <span class="comment">// c cw ccw opp</span>
  4287. <a name="l04296"></a>04296 <span class="comment">// 0x1 0x2 0x4 0x8</span>
  4288. <a name="l04297"></a>04297
  4289. <a name="l04298"></a>04298 <span class="preprocessor">#define MARG \</span>
  4290. <a name="l04299"></a>04299 <span class="preprocessor"> (phase \</span>
  4291. <a name="l04300"></a>04300 <span class="preprocessor"> ? (((xx + x) &amp; 1) \</span>
  4292. <a name="l04301"></a>04301 <span class="preprocessor"> ? (((yy + y) &amp; 1) \</span>
  4293. <a name="l04302"></a>04302 <span class="preprocessor"> ? ( </span><span class="comment">/* p1 x1 y1 = c e s se */</span> \
  4294. <a name="l04303"></a>04303 ((c &amp; 0x80) &gt;&gt; 7) | \
  4295. <a name="l04304"></a>04304 ((e &amp; 0x80) &gt;&gt; 6) | \
  4296. <a name="l04305"></a>04305 ((s &amp; 0x80) &gt;&gt; 5) | \
  4297. <a name="l04306"></a>04306 ((se &amp; 0x80) &gt;&gt; 4) \
  4298. <a name="l04307"></a>04307 ) \
  4299. <a name="l04308"></a>04308 : ( <span class="comment">/* p1 x1 y0 = c n e ne */</span> \
  4300. <a name="l04309"></a>04309 ((c &amp; 0x80) &gt;&gt; 7) | \
  4301. <a name="l04310"></a>04310 ((n &amp; 0x80) &gt;&gt; 6) | \
  4302. <a name="l04311"></a>04311 ((e &amp; 0x80)&gt;&gt; 5) | \
  4303. <a name="l04312"></a>04312 ((ne &amp; 0x80) &gt;&gt; 4) \
  4304. <a name="l04313"></a>04313 ) \
  4305. <a name="l04314"></a>04314 ) \
  4306. <a name="l04315"></a>04315 : (((yy + y) &amp; 1) \
  4307. <a name="l04316"></a>04316 ? ( <span class="comment">/* p1 x0 y1 = c s w sw */</span> \
  4308. <a name="l04317"></a>04317 ((c &amp; 0x80) &gt;&gt; 7) | \
  4309. <a name="l04318"></a>04318 ((s &amp; 0x80) &gt;&gt; 6) | \
  4310. <a name="l04319"></a>04319 ((w &amp; 0x80) &gt;&gt; 5) | \
  4311. <a name="l04320"></a>04320 ((sw &amp; 0x80) &gt;&gt; 4) \
  4312. <a name="l04321"></a>04321 ) \
  4313. <a name="l04322"></a>04322 : ( <span class="comment">/* p1 x0 y0 = c w n nw */</span> \
  4314. <a name="l04323"></a>04323 ((c &amp; 0x80) &gt;&gt; 7) | \
  4315. <a name="l04324"></a>04324 ((w &amp; 0x80) &gt;&gt; 6) | \
  4316. <a name="l04325"></a>04325 ((n &amp; 0x80) &gt;&gt; 5) | \
  4317. <a name="l04326"></a>04326 ((nw &amp; 0x80) &gt;&gt; 4) \
  4318. <a name="l04327"></a>04327 ) \
  4319. <a name="l04328"></a>04328 ) \
  4320. <a name="l04329"></a>04329 ) \
  4321. <a name="l04330"></a>04330 : (((xx + x) &amp; 1) \
  4322. <a name="l04331"></a>04331 ? (((yy + y) &amp; 1) \
  4323. <a name="l04332"></a>04332 ? ( <span class="comment">/* p0 x1 y1 = c w n nw */</span> \
  4324. <a name="l04333"></a>04333 ((c &amp; 0x80) &gt;&gt; 7) | \
  4325. <a name="l04334"></a>04334 ((w &amp; 0x80) &gt;&gt; 6) | \
  4326. <a name="l04335"></a>04335 ((n &amp; 0x80) &gt;&gt; 5) | \
  4327. <a name="l04336"></a>04336 ((nw &amp; 0x80) &gt;&gt; 4) \
  4328. <a name="l04337"></a>04337 ) \
  4329. <a name="l04338"></a>04338 : ( <span class="comment">/* p0 x1 y0 = c s w sw */</span> \
  4330. <a name="l04339"></a>04339 ((c &amp; 0x80) &gt;&gt; 7) | \
  4331. <a name="l04340"></a>04340 ((s &amp; 0x80) &gt;&gt; 6) | \
  4332. <a name="l04341"></a>04341 ((w &amp; 0x80) &gt;&gt; 5) | \
  4333. <a name="l04342"></a>04342 ((sw &amp; 0x80) &gt;&gt; 4) \
  4334. <a name="l04343"></a>04343 ) \
  4335. <a name="l04344"></a>04344 ) \
  4336. <a name="l04345"></a>04345 : (((yy + y) &amp; 1) \
  4337. <a name="l04346"></a>04346 ? ( <span class="comment">/* p0 x0 y1 = c n e ne */</span> \
  4338. <a name="l04347"></a>04347 ((c &amp; 0x80) &gt;&gt; 7) | \
  4339. <a name="l04348"></a>04348 ((n &amp; 0x80) &gt;&gt; 6) | \
  4340. <a name="l04349"></a>04349 ((e &amp; 0x80) &gt;&gt; 5) | \
  4341. <a name="l04350"></a>04350 ((ne &amp; 0x80) &gt;&gt; 4) \
  4342. <a name="l04351"></a>04351 ) \
  4343. <a name="l04352"></a>04352 : ( <span class="comment">/* p0 x0 y0 = c e s se */</span> \
  4344. <a name="l04353"></a>04353 ((c &amp; 0x80) &gt;&gt; 7) | \
  4345. <a name="l04354"></a>04354 ((e &amp; 0x80) &gt;&gt; 6) | \
  4346. <a name="l04355"></a>04355 ((s &amp; 0x80) &gt;&gt; 5) | \
  4347. <a name="l04356"></a>04356 ((se &amp; 0x80) &gt;&gt; 4) \
  4348. <a name="l04357"></a>04357 ) \
  4349. <a name="l04358"></a>04358 ) \
  4350. <a name="l04359"></a>04359 ) \
  4351. <a name="l04360"></a>04360 )
  4352. <a name="l04361"></a>04361
  4353. <a name="l04362"></a>04362 <span class="preprocessor">#define GLASSBONDS ( \</span>
  4354. <a name="l04363"></a>04363 <span class="preprocessor"> ((c </span><span class="comment">/* &gt;&gt; 1*/</span> ) &amp; 0x7f) | \
  4355. <a name="l04364"></a>04364 ((GlassBondsTable[MARG] &amp; 1) &lt;&lt; 7) \
  4356. <a name="l04365"></a>04365 )
  4357. <a name="l04366"></a>04366
  4358. <a name="l04367"></a>04367 CAM_MASKED_REG_LOOP(GLASSBONDS)
  4359. <a name="l04368"></a>04368
  4360. <a name="l04369"></a>04369 }
  4361. <a name="l04370"></a>04370
  4362. <a name="l04371"></a>04371
  4363. <a name="l04372"></a>04372 <span class="comment">// 0 1 2 3</span>
  4364. <a name="l04373"></a>04373 <span class="comment">// c cw ccw opp</span>
  4365. <a name="l04374"></a>04374 <span class="comment">// 0x1 0x2 0x4 0x8</span>
  4366. <a name="l04375"></a>04375
  4367. <a name="l04376"></a>04376 <span class="comment">// cw opp 2 8</span>
  4368. <a name="l04377"></a>04377 <span class="comment">// c ccw 1 4</span>
  4369. <a name="l04378"></a>04378
  4370. <a name="l04379"></a>04379 <span class="keyword">static</span> Byte GlassHeatTable[16] = {
  4371. <a name="l04380"></a>04380
  4372. <a name="l04381"></a>04381 0x00, <span class="comment">// 00 -\ 00</span>
  4373. <a name="l04382"></a>04382 <span class="comment">// 00 -/ 00</span>
  4374. <a name="l04383"></a>04383
  4375. <a name="l04384"></a>04384 0x03, <span class="comment">// 00 -\ 00 00</span>
  4376. <a name="l04385"></a>04385 <span class="comment">// 10 -/ 10 ? 00</span>
  4377. <a name="l04386"></a>04386
  4378. <a name="l04387"></a>04387 0x00, <span class="comment">// 10 -\ 10</span>
  4379. <a name="l04388"></a>04388 <span class="comment">// 00 -/ 00</span>
  4380. <a name="l04389"></a>04389
  4381. <a name="l04390"></a>04390 0x00, <span class="comment">// 10 -\ 01</span>
  4382. <a name="l04391"></a>04391 <span class="comment">// 10 -/ 01</span>
  4383. <a name="l04392"></a>04392
  4384. <a name="l04393"></a>04393 0x00, <span class="comment">// 00 -\ 00</span>
  4385. <a name="l04394"></a>04394 <span class="comment">// 01 -/ 01</span>
  4386. <a name="l04395"></a>04395
  4387. <a name="l04396"></a>04396 0x00, <span class="comment">// 00 -\ 11</span>
  4388. <a name="l04397"></a>04397 <span class="comment">// 11 -/ 00</span>
  4389. <a name="l04398"></a>04398
  4390. <a name="l04399"></a>04399 0x01, <span class="comment">// 10 -\ 01</span>
  4391. <a name="l04400"></a>04400 <span class="comment">// 01 -/ 10</span>
  4392. <a name="l04401"></a>04401
  4393. <a name="l04402"></a>04402 0x01, <span class="comment">// 10 -\ 10</span>
  4394. <a name="l04403"></a>04403 <span class="comment">// 11 -/ 11</span>
  4395. <a name="l04404"></a>04404
  4396. <a name="l04405"></a>04405 0x00, <span class="comment">// 01 -\ 01</span>
  4397. <a name="l04406"></a>04406 <span class="comment">// 00 -/ 00</span>
  4398. <a name="l04407"></a>04407
  4399. <a name="l04408"></a>04408 0x00, <span class="comment">// 01 -\ 10</span>
  4400. <a name="l04409"></a>04409 <span class="comment">// 10 -/ 01</span>
  4401. <a name="l04410"></a>04410
  4402. <a name="l04411"></a>04411 0x01, <span class="comment">// 11 -\ 00</span>
  4403. <a name="l04412"></a>04412 <span class="comment">// 00 -/ 11</span>
  4404. <a name="l04413"></a>04413
  4405. <a name="l04414"></a>04414 0x01, <span class="comment">// 11 -\ 11</span>
  4406. <a name="l04415"></a>04415 <span class="comment">// 10 -/ 10</span>
  4407. <a name="l04416"></a>04416
  4408. <a name="l04417"></a>04417 0x01, <span class="comment">// 01 -\ 10</span>
  4409. <a name="l04418"></a>04418 <span class="comment">// 01 -/ 10</span>
  4410. <a name="l04419"></a>04419
  4411. <a name="l04420"></a>04420 0x01, <span class="comment">// 01 -\ 01</span>
  4412. <a name="l04421"></a>04421 <span class="comment">// 11 -/ 11</span>
  4413. <a name="l04422"></a>04422
  4414. <a name="l04423"></a>04423 0x02, <span class="comment">// 11 -\ 11 11</span>
  4415. <a name="l04424"></a>04424 <span class="comment">// 01 -/ 01 ? 11</span>
  4416. <a name="l04425"></a>04425
  4417. <a name="l04426"></a>04426 0x01 <span class="comment">// 11 -\ 11</span>
  4418. <a name="l04427"></a>04427 <span class="comment">// 11 -/ 11</span>
  4419. <a name="l04428"></a>04428
  4420. <a name="l04429"></a>04429 };
  4421. <a name="l04430"></a>04430
  4422. <a name="l04431"></a>04431
  4423. <a name="l04432"></a>04432 <span class="keywordtype">void</span> CellEngine::n_glassheat()
  4424. <a name="l04433"></a>04433 {
  4425. <a name="l04434"></a>04434 <span class="keywordtype">int</span> code;
  4426. <a name="l04435"></a>04435 <span class="keywordtype">int</span> error = 0;
  4427. <a name="l04436"></a>04436
  4428. <a name="l04437"></a>04437 <span class="preprocessor">#define GLASSHEAT ( \</span>
  4429. <a name="l04438"></a>04438 <span class="preprocessor"> (code = GlassHeatTable[MARG]), \</span>
  4430. <a name="l04439"></a>04439 <span class="preprocessor"> (error += SUM8REG(0x7f) + frob), \</span>
  4431. <a name="l04440"></a>04440 <span class="preprocessor"> (error = ((error &lt; 0) \</span>
  4432. <a name="l04441"></a>04441 <span class="preprocessor"> ? 0 \</span>
  4433. <a name="l04442"></a>04442 <span class="preprocessor"> : ((error &gt; (0x7f &lt;&lt; 3)) \</span>
  4434. <a name="l04443"></a>04443 <span class="preprocessor"> ? (0x7f &lt;&lt; 3) \</span>
  4435. <a name="l04444"></a>04444 <span class="preprocessor"> : error))), \</span>
  4436. <a name="l04445"></a>04445 <span class="preprocessor"> ((code == 2) \</span>
  4437. <a name="l04446"></a>04446 <span class="preprocessor"> ? (((error &gt;= low) &amp;&amp; \</span>
  4438. <a name="l04447"></a>04447 <span class="preprocessor"> (error &gt;= inflation)) </span><span class="comment">/* can we get from bank? */</span> \
  4439. <a name="l04448"></a>04448 ? (error -= inflation, code ^= 1) <span class="comment">/* flip and debit */</span> \
  4440. <a name="l04449"></a>04449 : 0 \
  4441. <a name="l04450"></a>04450 ) \
  4442. <a name="l04451"></a>04451 : ((code == 3) \
  4443. <a name="l04452"></a>04452 ? (((error &lt;= high) &amp;&amp; \
  4444. <a name="l04453"></a>04453 (error &lt; (0x80 &lt;&lt; 3) - inflation)) <span class="comment">/* can we put to bank? */</span> \
  4445. <a name="l04454"></a>04454 ? (error += inflation, code ^= 1) <span class="comment">/* flip and credit */</span> \
  4446. <a name="l04455"></a>04455 : 0 \
  4447. <a name="l04456"></a>04456 ) \
  4448. <a name="l04457"></a>04457 : 0 \
  4449. <a name="l04458"></a>04458 ) \
  4450. <a name="l04459"></a>04459 ), \
  4451. <a name="l04460"></a>04460 (code = ((code &lt;&lt; 7) &amp; 0x80) | \
  4452. <a name="l04461"></a>04461 ((error &gt;&gt; 3) &amp; 0x7f)), \
  4453. <a name="l04462"></a>04462 (error &amp;= 0x07), \
  4454. <a name="l04463"></a>04463 code \
  4455. <a name="l04464"></a>04464 )
  4456. <a name="l04465"></a>04465
  4457. <a name="l04466"></a>04466 CAM_MASKED_REG_LOOP(GLASSHEAT)
  4458. <a name="l04467"></a>04467
  4459. <a name="l04468"></a>04468 }
  4460. <a name="l04469"></a>04469
  4461. <a name="l04470"></a>04470
  4462. <a name="l04471"></a>04471 <span class="preprocessor">#if 0</span>
  4463. <a name="l04472"></a>04472 <span class="preprocessor"></span>
  4464. <a name="l04473"></a>04473 FUNCTION JCRule(Oldstate,NW,N,NE,W,Self,E,SW,S,SE:integer):integer;
  4465. <a name="l04474"></a>04474 CONST
  4466. <a name="l04475"></a>04475 RN=127; L=2; U=2; K=2; Y=2;
  4467. <a name="l04476"></a>04476 VAR EightSum,NewState:integer;
  4468. <a name="l04477"></a>04477 BEGIN {Function}
  4469. <a name="l04478"></a>04478 EightSum:=NW+N+NE+E+SE+S+SW+W; ]
  4470. <a name="l04479"></a>04479 NewState:=0;
  4471. <a name="l04480"></a>04480 IF (OldState=0) AND
  4472. <a name="l04481"></a>04481 (L&lt;=EightSum) AND (EightSum&lt;=U) THEN
  4473. <a name="l04482"></a>04482 NewState:=1;
  4474. <a name="l04483"></a>04483 IF (OldState=1) THEN
  4475. <a name="l04484"></a>04484 IF (K&lt;=EightSum) AND (EightSum&lt;=Y) THEN
  4476. <a name="l04485"></a>04485 NewState:=1
  4477. <a name="l04486"></a>04486 ELSE
  4478. <a name="l04487"></a>04487 NewState:=2;
  4479. <a name="l04488"></a>04488 IF NOT(odd(OldState)) AND
  4480. <a name="l04489"></a>04489 (0&lt;OldState)AND(OldState&lt;2*RN) THEN
  4481. <a name="l04490"></a>04490 NewState:=OldState+2;
  4482. <a name="l04491"></a>04491 JCRule:=NewState
  4483. <a name="l04492"></a>04492 END; {Function}
  4484. <a name="l04493"></a>04493
  4485. <a name="l04494"></a>04494 <span class="preprocessor">#endif</span>
  4486. <a name="l04495"></a>04495 <span class="preprocessor"></span>
  4487. <a name="l04496"></a>04496
  4488. <a name="l04497"></a>04497 <span class="keywordtype">void</span> CellEngine::n_faders()
  4489. <a name="l04498"></a>04498 {
  4490. <a name="l04499"></a>04499 <span class="keywordtype">long</span> sum;
  4491. <a name="l04500"></a>04500 <span class="keywordtype">long</span> state;
  4492. <a name="l04501"></a>04501
  4493. <a name="l04502"></a>04502 <span class="preprocessor">#define FADERS ( \</span>
  4494. <a name="l04503"></a>04503 <span class="preprocessor"> (sum = SUM8REG(1)), \</span>
  4495. <a name="l04504"></a>04504 <span class="preprocessor"> ( ((c == 0) &amp;&amp; (sum == 2)) \</span>
  4496. <a name="l04505"></a>04505 <span class="preprocessor"> ? (state = 1) \</span>
  4497. <a name="l04506"></a>04506 <span class="preprocessor"> : (state = 0)), \</span>
  4498. <a name="l04507"></a>04507 <span class="preprocessor"> ( (c == 1) \</span>
  4499. <a name="l04508"></a>04508 <span class="preprocessor"> ? ((sum == 2) \</span>
  4500. <a name="l04509"></a>04509 <span class="preprocessor"> ? (state = 1) \</span>
  4501. <a name="l04510"></a>04510 <span class="preprocessor"> : (state = 2)) \</span>
  4502. <a name="l04511"></a>04511 <span class="preprocessor"> : 0), \</span>
  4503. <a name="l04512"></a>04512 <span class="preprocessor"> ( (((c &amp; 1) == 0) &amp;&amp; \</span>
  4504. <a name="l04513"></a>04513 <span class="preprocessor"> (0 &lt; c) &amp;&amp; \</span>
  4505. <a name="l04514"></a>04514 <span class="preprocessor"> (c &lt; (unsigned char)(frob &amp; 0xff))) \</span>
  4506. <a name="l04515"></a>04515 <span class="preprocessor"> ? (state = c + 2) \</span>
  4507. <a name="l04516"></a>04516 <span class="preprocessor"> : 0), \</span>
  4508. <a name="l04517"></a>04517 <span class="preprocessor"> (unsigned char)state)</span>
  4509. <a name="l04518"></a>04518 <span class="preprocessor"></span>
  4510. <a name="l04519"></a>04519 CAM_MASKED_REG_LOOP(FADERS)
  4511. <a name="l04520"></a>04520 }
  4512. <a name="l04521"></a>04521
  4513. <a name="l04522"></a>04522
  4514. <a name="l04523"></a>04523 <span class="comment">// This is a wavy version of flaming marble.</span>
  4515. <a name="l04524"></a>04524 <span class="comment">// We define four different convolution kernels, that diffuse</span>
  4516. <a name="l04525"></a>04525 <span class="comment">// the heat in different directions (nw, n, ne, and side to side),</span>
  4517. <a name="l04526"></a>04526 <span class="comment">// and select between then based on the phase (0 to 3).</span>
  4518. <a name="l04527"></a>04527 <span class="comment">// What defines the phase?</span>
  4519. <a name="l04528"></a>04528 <span class="comment">// There are several interesting defintions.</span>
  4520. <a name="l04529"></a>04529 <span class="comment">// Generally, we don't want to change phase too often, and we</span>
  4521. <a name="l04530"></a>04530 <span class="comment">// want to do it in interesting patterns so the heat flows nicely.</span>
  4522. <a name="l04531"></a>04531 <span class="comment">// The right shifting lowers the frequency of the phase changes.</span>
  4523. <a name="l04532"></a>04532 <span class="comment">// The anding with 3 is because there are only 4 phases.</span>
  4524. <a name="l04533"></a>04533 <span class="comment">// (y &gt;&gt; 2) &amp; 3:</span>
  4525. <a name="l04534"></a>04534 <span class="comment">// Vertically driven phase.</span>
  4526. <a name="l04535"></a>04535 <span class="comment">// Horizontally synchronized vertical waves.</span>
  4527. <a name="l04536"></a>04536 <span class="comment">// ((x + y) &gt;&gt; 2) &amp; 3:</span>
  4528. <a name="l04537"></a>04537 <span class="comment">// Vertically and horizontally driven phase.</span>
  4529. <a name="l04538"></a>04538 <span class="comment">// Sheared diamond synchronized waves.</span>
  4530. <a name="l04539"></a>04539 <span class="comment">// ((x + y + c) &gt;&gt; 2) &amp; 3:</span>
  4531. <a name="l04540"></a>04540 <span class="comment">// Vertically, horizontally, and smoothly varying</span>
  4532. <a name="l04541"></a>04541 <span class="comment">// temperature driven phase.</span>
  4533. <a name="l04542"></a>04542 <span class="comment">// Diamonds smoothly shifting phase with the heat contours.</span>
  4534. <a name="l04543"></a>04543 <span class="comment">// Interesting feedback driving heat flow direction by heat.</span>
  4535. <a name="l04544"></a>04544
  4536. <a name="l04545"></a>04545 <span class="comment">// New interactive harble using joystick hubba.</span>
  4537. <a name="l04546"></a>04546
  4538. <a name="l04547"></a>04547 <span class="preprocessor">#define HARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
  4539. <a name="l04548"></a>04548 <span class="preprocessor"> switch ((((xx - yy) &gt;&gt; 3) + (((xx - yy * 2 - 1) ^ (xx * 2 + yy + 1)) &gt;&gt; 2) + ((c + (hubba &gt;&gt; 4)) &gt;&gt; 2)) &amp; 7) { \</span>
  4540. <a name="l04549"></a>04549 <span class="preprocessor"> case 0: \</span>
  4541. <a name="l04550"></a>04550 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + w + sw + s + s + s + s + se + e); \</span>
  4542. <a name="l04551"></a>04551 <span class="preprocessor"> break; \</span>
  4543. <a name="l04552"></a>04552 <span class="preprocessor"> case 1: \</span>
  4544. <a name="l04553"></a>04553 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + nw + w + sw + sw + sw + sw + s + se); \</span>
  4545. <a name="l04554"></a>04554 <span class="preprocessor"> break; \</span>
  4546. <a name="l04555"></a>04555 <span class="preprocessor"> case 2: \</span>
  4547. <a name="l04556"></a>04556 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + n + nw + w + w + w + w + sw + s); \</span>
  4548. <a name="l04557"></a>04557 <span class="preprocessor"> break; \</span>
  4549. <a name="l04558"></a>04558 <span class="preprocessor"> case 3: \</span>
  4550. <a name="l04559"></a>04559 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + ne + n + nw + nw + nw + nw + w + sw); \</span>
  4551. <a name="l04560"></a>04560 <span class="preprocessor"> break; \</span>
  4552. <a name="l04561"></a>04561 <span class="preprocessor"> case 4: \</span>
  4553. <a name="l04562"></a>04562 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + e + ne + n + n + n + n + nw + w); \</span>
  4554. <a name="l04563"></a>04563 <span class="preprocessor"> break; \</span>
  4555. <a name="l04564"></a>04564 <span class="preprocessor"> case 5: \</span>
  4556. <a name="l04565"></a>04565 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + se + e + ne + ne + ne + ne + n + nw); \</span>
  4557. <a name="l04566"></a>04566 <span class="preprocessor"> break; \</span>
  4558. <a name="l04567"></a>04567 <span class="preprocessor"> case 6: \</span>
  4559. <a name="l04568"></a>04568 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + s + se + e + e + e + e + ne + n); \</span>
  4560. <a name="l04569"></a>04569 <span class="preprocessor"> break; \</span>
  4561. <a name="l04570"></a>04570 <span class="preprocessor"> case 7: \</span>
  4562. <a name="l04571"></a>04571 <span class="preprocessor"> error += (frob + (c &lt;&lt; 3) + sw + s + se + se + se + se + e + ne); \</span>
  4563. <a name="l04572"></a>04572 <span class="preprocessor"> break; \</span>
  4564. <a name="l04573"></a>04573 <span class="preprocessor"> } \</span>
  4565. <a name="l04574"></a>04574 <span class="preprocessor"> result = error &gt;&gt; 4; \</span>
  4566. <a name="l04575"></a>04575 <span class="preprocessor"> error &amp;= 0x0f;</span>
  4567. <a name="l04576"></a>04576 <span class="preprocessor"></span>
  4568. <a name="l04577"></a>04577 <span class="keywordtype">void</span> CellEngine::n_harble()
  4569. <a name="l04578"></a>04578 {
  4570. <a name="l04579"></a>04579 QUAD *front = (QUAD *)frontMem;
  4571. <a name="l04580"></a>04580 QUAD *back = (QUAD *)(backMem +
  4572. <a name="l04581"></a>04581 (backBorder - 1) +
  4573. <a name="l04582"></a>04582 ((backBorder - 1) * backRowBytes));
  4574. <a name="l04583"></a>04583 <span class="keywordtype">long</span> backline = backRowBytes &gt;&gt; 2;
  4575. <a name="l04584"></a>04584 <span class="keywordtype">long</span> backstride = backline - ((width &gt;&gt; 2) + 1);
  4576. <a name="l04585"></a>04585 <span class="keywordtype">long</span> frontstride = (screenRowBytes &gt;&gt; 2) - (width &gt;&gt; 2);
  4577. <a name="l04586"></a>04586 <span class="keywordtype">long</span> xsteps = width &gt;&gt; 2;
  4578. <a name="l04587"></a>04587 <span class="keywordtype">long</span> yy;
  4579. <a name="l04588"></a>04588
  4580. <a name="l04589"></a>04589 total = 0;
  4581. <a name="l04590"></a>04590
  4582. <a name="l04591"></a>04591 <span class="keywordflow">for</span> (yy = height;
  4583. <a name="l04592"></a>04592 yy &gt; 0;
  4584. <a name="l04593"></a>04593 back += backstride,
  4585. <a name="l04594"></a>04594 front += frontstride,
  4586. <a name="l04595"></a>04595 yy--) {
  4587. <a name="l04596"></a>04596 <span class="keyword">register</span> QUAD b1, b2;
  4588. <a name="l04597"></a>04597 <span class="keyword">register</span> QUAD c1, c2;
  4589. <a name="l04598"></a>04598 <span class="keyword">register</span> QUAD d1, d2;
  4590. <a name="l04599"></a>04599 <span class="keywordtype">long</span> error = 0;
  4591. <a name="l04600"></a>04600 <span class="keywordtype">long</span> xx;
  4592. <a name="l04601"></a>04601
  4593. <a name="l04602"></a>04602 b2 = back[0];
  4594. <a name="l04603"></a>04603 c2 = back[backline];
  4595. <a name="l04604"></a>04604 d2 = back[backline &lt;&lt; 1];
  4596. <a name="l04605"></a>04605 back++;
  4597. <a name="l04606"></a>04606
  4598. <a name="l04607"></a>04607 <span class="keywordflow">for</span> (xx = xsteps;
  4599. <a name="l04608"></a>04608 xx &gt; 0;
  4600. <a name="l04609"></a>04609 xx--) {
  4601. <a name="l04610"></a>04610 <span class="keywordtype">long</span> result, cells = 0;
  4602. <a name="l04611"></a>04611
  4603. <a name="l04612"></a>04612 b1 = b2; b2 = back[0];
  4604. <a name="l04613"></a>04613 c1 = c2; c2 = back[backline];
  4605. <a name="l04614"></a>04614 d1 = d2; d2 = back[backline &lt;&lt; 1];
  4606. <a name="l04615"></a>04615 back++;
  4607. <a name="l04616"></a>04616
  4608. <a name="l04617"></a>04617 HARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
  4609. <a name="l04618"></a>04618 BYTE0(c1), BYTE1(c1), BYTE2(c1),
  4610. <a name="l04619"></a>04619 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
  4611. <a name="l04620"></a>04620 total += result;
  4612. <a name="l04621"></a>04621 SETBYTE0(cells, result);
  4613. <a name="l04622"></a>04622
  4614. <a name="l04623"></a>04623 HARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
  4615. <a name="l04624"></a>04624 BYTE1(c1), BYTE2(c1), BYTE3(c1),
  4616. <a name="l04625"></a>04625 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
  4617. <a name="l04626"></a>04626 total += result;
  4618. <a name="l04627"></a>04627 SETBYTE1(cells, result);
  4619. <a name="l04628"></a>04628
  4620. <a name="l04629"></a>04629 HARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
  4621. <a name="l04630"></a>04630 BYTE2(c1), BYTE3(c1), BYTE0(c2),
  4622. <a name="l04631"></a>04631 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
  4623. <a name="l04632"></a>04632 total += result;
  4624. <a name="l04633"></a>04633 SETBYTE2(cells, result);
  4625. <a name="l04634"></a>04634
  4626. <a name="l04635"></a>04635 HARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
  4627. <a name="l04636"></a>04636 BYTE3(c1), BYTE0(c2), BYTE1(c2),
  4628. <a name="l04637"></a>04637 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
  4629. <a name="l04638"></a>04638 total += result;
  4630. <a name="l04639"></a>04639 SETBYTE3(cells, result);
  4631. <a name="l04640"></a>04640
  4632. <a name="l04641"></a>04641 *front = cells;
  4633. <a name="l04642"></a>04642 front++;
  4634. <a name="l04643"></a>04643 }
  4635. <a name="l04644"></a>04644 }
  4636. <a name="l04645"></a>04645 }
  4637. <a name="l04646"></a>04646
  4638. <a name="l04647"></a>04647
  4639. <a name="l04648"></a>04648 <span class="comment">// From Intel's paper on the Perlin noise function at:</span>
  4640. <a name="l04649"></a>04649 <span class="comment">// http://www.pentium.com/drg/mmx/appnotes/proctex.htm</span>
  4641. <a name="l04650"></a>04650 <span class="comment">//</span>
  4642. <a name="l04651"></a>04651 <span class="comment">// Procedure C_Noise()</span>
  4643. <a name="l04652"></a>04652 <span class="comment">// Inputs: u_init, v_init: starting u and v parameters into the image.</span>
  4644. <a name="l04653"></a>04653 <span class="comment">// du, dv: the incremental change to u_init and v_init.</span>
  4645. <a name="l04654"></a>04654 <span class="comment">// ddu, ddv: the incremental change to du and dv.</span>
  4646. <a name="l04655"></a>04655 <span class="comment">// Num_Pix: number of pixels in the scan line to draw.</span>
  4647. <a name="l04656"></a>04656 <span class="comment">// screen_buffer: Pointer to the screen buffer.</span>
  4648. <a name="l04657"></a>04657 <span class="comment">// Output: 16 bit pixels are drawn to the screen.</span>
  4649. <a name="l04658"></a>04658
  4650. <a name="l04659"></a>04659 <span class="preprocessor">#define random1(i) ((i * i) &amp; 65535) //GREAT! 1 MMX(tm) instr</span>
  4651. <a name="l04660"></a>04660 <span class="preprocessor"></span><span class="preprocessor">#define random2(i) (((i * i) &amp; 65535) &gt;&gt; 2)</span>
  4652. <a name="l04661"></a>04661 <span class="preprocessor"></span>
  4653. <a name="l04662"></a>04662 <span class="keyword">static</span> <span class="keywordtype">void</span> C_Noise(
  4654. <a name="l04663"></a>04663 <span class="keywordtype">long</span> u_init,
  4655. <a name="l04664"></a>04664 <span class="keywordtype">long</span> v_init,
  4656. <a name="l04665"></a>04665 <span class="keywordtype">long</span> du,
  4657. <a name="l04666"></a>04666 <span class="keywordtype">long</span> dv,
  4658. <a name="l04667"></a>04667 <span class="keywordtype">long</span> ddu,
  4659. <a name="l04668"></a>04668 <span class="keywordtype">long</span> ddv,
  4660. <a name="l04669"></a>04669 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *screen_buffer,
  4661. <a name="l04670"></a>04670 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count)
  4662. <a name="l04671"></a>04671 {
  4663. <a name="l04672"></a>04672 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> color;
  4664. <a name="l04673"></a>04673 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> bx0, bx1, by0, by1;
  4665. <a name="l04674"></a>04674 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> rx0, ry0;
  4666. <a name="l04675"></a>04675
  4667. <a name="l04676"></a>04676 <span class="comment">// Original Perlin's noise program used an array g[512][2].</span>
  4668. <a name="l04677"></a>04677 <span class="comment">// This program replaces the array with real-time calculations.</span>
  4669. <a name="l04678"></a>04678 <span class="comment">// The results are stored into variables of the form g_b##_#.</span>
  4670. <a name="l04679"></a>04679
  4671. <a name="l04680"></a>04680 <span class="keywordtype">short</span> g_b00_0; <span class="comment">// Used to replace array g[b00][0]</span>
  4672. <a name="l04681"></a>04681 <span class="keywordtype">short</span> g_b00_1; <span class="comment">// Used to replace array g[b00][1]</span>
  4673. <a name="l04682"></a>04682 <span class="keywordtype">short</span> g_b01_0; <span class="comment">// replaces array g[b01][0]</span>
  4674. <a name="l04683"></a>04683 <span class="keywordtype">short</span> g_b01_1; <span class="comment">// replaces array g[b01][1]</span>
  4675. <a name="l04684"></a>04684 <span class="keywordtype">short</span> g_b10_0; <span class="comment">// replaces array g[b10][0]</span>
  4676. <a name="l04685"></a>04685 <span class="keywordtype">short</span> g_b10_1; <span class="comment">// replaces array g[b10][1]</span>
  4677. <a name="l04686"></a>04686 <span class="keywordtype">short</span> g_b11_0; <span class="comment">// replaces array g[b11][0]</span>
  4678. <a name="l04687"></a>04687 <span class="keywordtype">short</span> g_b11_1; <span class="comment">// replaces array g[b11][1]</span>
  4679. <a name="l04688"></a>04688
  4680. <a name="l04689"></a>04689 <span class="comment">// Used to replace array: b00 = p[p[bx0] + by0];</span>
  4681. <a name="l04690"></a>04690 <span class="keywordtype">short</span> b00;
  4682. <a name="l04691"></a>04691 <span class="keywordtype">short</span> b01;
  4683. <a name="l04692"></a>04692 <span class="keywordtype">short</span> b10;
  4684. <a name="l04693"></a>04693 <span class="keywordtype">short</span> b11;
  4685. <a name="l04694"></a>04694
  4686. <a name="l04695"></a>04695 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> i;
  4687. <a name="l04696"></a>04696 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> u_16bit, v_16bit;
  4688. <a name="l04697"></a>04697 <span class="keywordtype">signed</span> <span class="keywordtype">short</span> rx1, ry1;
  4689. <a name="l04698"></a>04698 <span class="keywordtype">signed</span> <span class="keywordtype">short</span> sx, sy;
  4690. <a name="l04699"></a>04699 <span class="keywordtype">signed</span> <span class="keywordtype">long</span> color_p0, color_p1, color_p2, color_p3;
  4691. <a name="l04700"></a>04700 <span class="keywordtype">signed</span> <span class="keywordtype">long</span> color_y0, color_y1;
  4692. <a name="l04701"></a>04701
  4693. <a name="l04702"></a>04702 <span class="comment">// Inner loop for the scan line. "count" pixels will be drawn.</span>
  4694. <a name="l04703"></a>04703 <span class="keywordflow">for</span> (i = 0; i &lt; count; i++) {
  4695. <a name="l04704"></a>04704 <span class="comment">// Convert the u and v parameters from 10.22 to 8.8 format.</span>
  4696. <a name="l04705"></a>04705 u_16bit = (short)(u_init &gt;&gt; 14);
  4697. <a name="l04706"></a>04706 v_16bit = (short)(v_init &gt;&gt; 14);
  4698. <a name="l04707"></a>04707
  4699. <a name="l04708"></a>04708 <span class="comment">// Imagine having a square of the type</span>
  4700. <a name="l04709"></a>04709 <span class="comment">// p0---p1 Where p0 = (bx0, by0) +----&gt; U</span>
  4701. <a name="l04710"></a>04710 <span class="comment">// |(u,v)| p1 = (bx1, by0) |</span>
  4702. <a name="l04711"></a>04711 <span class="comment">// | | p2 = (bx0, by1) | Coordinate System</span>
  4703. <a name="l04712"></a>04712 <span class="comment">// p2---p3 p3 = (bx1, by1) V</span>
  4704. <a name="l04713"></a>04713 <span class="comment">// The u, v point in 2D texture space is bounded by this rectangle.</span>
  4705. <a name="l04714"></a>04714
  4706. <a name="l04715"></a>04715 <span class="comment">// Goal: determine the color of the points p0, p1, p2, p3.</span>
  4707. <a name="l04716"></a>04716 <span class="comment">// Then the color of the point (u, v) will be found by linear interpolation.</span>
  4708. <a name="l04717"></a>04717
  4709. <a name="l04718"></a>04718 <span class="comment">// First step: Get the 2D coordinates of the points p0, p1, p2, p3.</span>
  4710. <a name="l04719"></a>04719
  4711. <a name="l04720"></a>04720 <span class="comment">// Same as Perlin's original code except floating point</span>
  4712. <a name="l04721"></a>04721 <span class="comment">// is converted over to fixed integer.</span>
  4713. <a name="l04722"></a>04722
  4714. <a name="l04723"></a>04723 <span class="comment">// Process the x component.</span>
  4715. <a name="l04724"></a>04724 bx0 = u_16bit &gt;&gt; 8; <span class="comment">// Integer part of u, x component of p0 and p2.</span>
  4716. <a name="l04725"></a>04725 bx1 = bx0 + 1; <span class="comment">// Integer part of u + 1, x component of p1 and p3.</span>
  4717. <a name="l04726"></a>04726
  4718. <a name="l04727"></a>04727 <span class="comment">// Process the y component.</span>
  4719. <a name="l04728"></a>04728 by0 = v_16bit &gt;&gt; 8; <span class="comment">// Integer part of v, y component of p0 and p1.</span>
  4720. <a name="l04729"></a>04729 by1 = by0 + 1; <span class="comment">// Integer part of v + 1, y component of p2 and p3.</span>
  4721. <a name="l04730"></a>04730
  4722. <a name="l04731"></a>04731 <span class="comment">// Next, we need vectors pointing from each point in the square above and</span>
  4723. <a name="l04732"></a>04732 <span class="comment">// ending at the (u,v) coordinate located inside the square.</span>
  4724. <a name="l04733"></a>04733 <span class="comment">// The vector (rx0, ry0) goes from P0 to the (u,v) coordinate.</span>
  4725. <a name="l04734"></a>04734 <span class="comment">// The vector (rx1, ry0) goes from P1 to the (u,v) coordinate.</span>
  4726. <a name="l04735"></a>04735 <span class="comment">// The vector (rx0, ry1) goes from P2 to the (u,v) coordinate.</span>
  4727. <a name="l04736"></a>04736 <span class="comment">// The vector (rx1, ry1) goes from P3 to the (u,v) coordinate.</span>
  4728. <a name="l04737"></a>04737
  4729. <a name="l04738"></a>04738 <span class="comment">// Process the x component.</span>
  4730. <a name="l04739"></a>04739 rx0 = u_16bit &amp; 255; <span class="comment">// Fractional part of u. (0.0 &lt;= rx0 &lt; 1.0) or (0 &lt;= rx0 &lt; 255) for fixed math.</span>
  4731. <a name="l04740"></a>04740 rx1 = rx0 - 256; <span class="comment">// Fractional part of u + 1. (-1.0 &lt; rx1 &lt;= 0.0) or (-255 &lt; rx1 &lt;= 0) for fixed math.</span>
  4732. <a name="l04741"></a>04741
  4733. <a name="l04742"></a>04742 <span class="comment">// Process the y component.</span>
  4734. <a name="l04743"></a>04743 ry0 = v_16bit &amp; 255; <span class="comment">// Fractional part of v. (0.0 &lt;= ry0 &lt; 1.0) or (0 &lt;= ry0 &lt; 255) for fixed math.</span>
  4735. <a name="l04744"></a>04744 ry1 = ry0 - 256; <span class="comment">// Fractional part of v + 1. (-1.0 &lt; rx1 &lt;= 0.0) or (-255 &lt; rx1 &lt;= 0) for fixed math.</span>
  4736. <a name="l04745"></a>04745
  4737. <a name="l04746"></a>04746 <span class="comment">// Next, calculate the dropoff component about the point p0.</span>
  4738. <a name="l04747"></a>04747
  4739. <a name="l04748"></a>04748 <span class="comment">// Same as Perlin's original code except floating point</span>
  4740. <a name="l04749"></a>04749 <span class="comment">// is converted over to fixed integer. The "&gt;&gt; 1" is used to</span>
  4741. <a name="l04750"></a>04750 <span class="comment">// avoid overflow when the values are multiplied together.</span>
  4742. <a name="l04751"></a>04751 <span class="comment">// This is not a problem in "C" but will be in the MMX implementation.</span>
  4743. <a name="l04752"></a>04752
  4744. <a name="l04753"></a>04753 sx = (((rx0 * rx0) &gt;&gt; 1) * ((1536 - (rx0 &lt;&lt; 2)))) &gt;&gt; 16;
  4745. <a name="l04754"></a>04754 sy = (((ry0 * ry0) &gt;&gt; 1) * ((1536 - (ry0 &lt;&lt; 2)))) &gt;&gt; 16;
  4746. <a name="l04755"></a>04755
  4747. <a name="l04756"></a>04756 <span class="comment">// Now, for each point p0, p1, p2, p3 in the square above, image having</span>
  4748. <a name="l04757"></a>04757 <span class="comment">// a unit gradiant vector pointing in any random direction. This step</span>
  4749. <a name="l04758"></a>04758 <span class="comment">// attaches a unit gradiant vector to each point of the square. This is</span>
  4750. <a name="l04759"></a>04759 <span class="comment">// done by precalculating 256, random, uniform, unit vectors. Then to attach</span>
  4751. <a name="l04760"></a>04760 <span class="comment">// the gradiant vector to a point, an index into the array is needed. The</span>
  4752. <a name="l04761"></a>04761 <span class="comment">// index is acquired from the x and y coordinates of the square corner point.</span>
  4753. <a name="l04762"></a>04762 <span class="comment">// The algorithm used is called "Folding Over".</span>
  4754. <a name="l04763"></a>04763 <span class="comment">// b00, b10, b01, and b11 contain indexes for a gradiant vector for each</span>
  4755. <a name="l04764"></a>04764 <span class="comment">// corner of the square shown above.</span>
  4756. <a name="l04765"></a>04765
  4757. <a name="l04766"></a>04766 <span class="comment">// This is where the code differs from Perlins.</span>
  4758. <a name="l04767"></a>04767 <span class="comment">// Rather than use arrays p[] and g[][], the values are</span>
  4759. <a name="l04768"></a>04768 <span class="comment">// calculated real-time. Here random1() replaces array p[].</span>
  4760. <a name="l04769"></a>04769 <span class="comment">// Perlin's equivalent: b00 = p[p[bx0] + by0];</span>
  4761. <a name="l04770"></a>04770
  4762. <a name="l04771"></a>04771 b00 = random1((random1(bx0) + by0));
  4763. <a name="l04772"></a>04772 b01 = random1((random1(bx0) + by1));
  4764. <a name="l04773"></a>04773 b10 = random1((random1(bx1) + by0));
  4765. <a name="l04774"></a>04774 b11 = random1((random1(bx1) + by1));
  4766. <a name="l04775"></a>04775
  4767. <a name="l04776"></a>04776 <span class="comment">// Here, random2() replaces array g[][].</span>
  4768. <a name="l04777"></a>04777 <span class="comment">// Perlin's equivalent: g_b00_0 = g[b00][0];</span>
  4769. <a name="l04778"></a>04778
  4770. <a name="l04779"></a>04779 g_b00_0 = (random2(b00) &amp; 511) - 256;
  4771. <a name="l04780"></a>04780 g_b01_0 = (random2(b01) &amp; 511) - 256;
  4772. <a name="l04781"></a>04781 g_b10_0 = (random2(b10) &amp; 511) - 256;
  4773. <a name="l04782"></a>04782 g_b11_0 = (random2(b11) &amp; 511) - 256;
  4774. <a name="l04783"></a>04783
  4775. <a name="l04784"></a>04784 g_b00_1 = (random2((b00 + 1)) &amp; 511) - 256;
  4776. <a name="l04785"></a>04785 g_b01_1 = (random2((b01 + 1)) &amp; 511) - 256;
  4777. <a name="l04786"></a>04786 g_b10_1 = (random2((b10 + 1)) &amp; 511) - 256;
  4778. <a name="l04787"></a>04787 g_b11_1 = (random2((b11 + 1)) &amp; 511) - 256;
  4779. <a name="l04788"></a>04788
  4780. <a name="l04789"></a>04789 <span class="comment">// Now, for each point in the square shown above, calculate the dot</span>
  4781. <a name="l04790"></a>04790 <span class="comment">// product of the gradiant vector and the vector going from each square</span>
  4782. <a name="l04791"></a>04791 <span class="comment">// corner point to the (u,v) point inside the square.</span>
  4783. <a name="l04792"></a>04792
  4784. <a name="l04793"></a>04793 <span class="comment">// Same as Perlin's original code.</span>
  4785. <a name="l04794"></a>04794
  4786. <a name="l04795"></a>04795 color_p0 = rx0 * g_b00_0 + ry0 * g_b00_1;
  4787. <a name="l04796"></a>04796 color_p1 = rx1 * g_b10_0 + ry0 * g_b10_1;
  4788. <a name="l04797"></a>04797 color_p2 = rx0 * g_b01_0 + ry1 * g_b01_1;
  4789. <a name="l04798"></a>04798 color_p3 = rx1 * g_b11_0 + ry1 * g_b11_1;
  4790. <a name="l04799"></a>04799
  4791. <a name="l04800"></a>04800 <span class="comment">// color_p0, color_p1, ... are the colors of the points p0, p1, p2, p3.</span>
  4792. <a name="l04801"></a>04801 <span class="comment">// Now use linear interpolation to get the color of the point (sx, sy) inside</span>
  4793. <a name="l04802"></a>04802 <span class="comment">// the square.</span>
  4794. <a name="l04803"></a>04803
  4795. <a name="l04804"></a>04804 <span class="comment">// Interpolation along the X axis.</span>
  4796. <a name="l04805"></a>04805
  4797. <a name="l04806"></a>04806 color_y0 = color_p0 + sx * ((color_p1 - color_p0) &gt;&gt; 8);
  4798. <a name="l04807"></a>04807 color_y1 = color_p2 + sx * ((color_p3 - color_p2) &gt;&gt; 8);
  4799. <a name="l04808"></a>04808
  4800. <a name="l04809"></a>04809 <span class="comment">// Interpolation along the Y axis.</span>
  4801. <a name="l04810"></a>04810 <span class="comment">// Output is from -256 to +256, so a 256 color offset is added and</span>
  4802. <a name="l04811"></a>04811 <span class="comment">// the final result is divided by 2. (&gt;&gt;1). (0 &lt;= next_color &lt; 256).</span>
  4803. <a name="l04812"></a>04812
  4804. <a name="l04813"></a>04813 <span class="comment">// Same as Perlin's original code except the output is</span>
  4805. <a name="l04814"></a>04814 <span class="comment">// converted from fixed point to regular integer. Also</span>
  4806. <a name="l04815"></a>04815 <span class="comment">// since the output ranges from -256 to +256, a 256 offest</span>
  4807. <a name="l04816"></a>04816 <span class="comment">// is added to make the range from 0 to 511. This offset</span>
  4808. <a name="l04817"></a>04817 <span class="comment">// is the 65536 value. Then the 0 to 511 is scaled down.</span>
  4809. <a name="l04818"></a>04818 <span class="comment">// to a range of 0 to 255.</span>
  4810. <a name="l04819"></a>04819
  4811. <a name="l04820"></a>04820 color =
  4812. <a name="l04821"></a>04821 (<span class="keywordtype">unsigned</span> char)
  4813. <a name="l04822"></a>04822 ((color_y0 +
  4814. <a name="l04823"></a>04823 65536 +
  4815. <a name="l04824"></a>04824 (sy * ((color_y1 - color_y0) &gt;&gt; 8))
  4816. <a name="l04825"></a>04825 ) &gt;&gt; 9);
  4817. <a name="l04826"></a>04826
  4818. <a name="l04827"></a>04827 *(screen_buffer) = color;
  4819. <a name="l04828"></a>04828
  4820. <a name="l04829"></a>04829 u_init += du; <span class="comment">// New u for calc the color of the next pixel</span>
  4821. <a name="l04830"></a>04830 v_init += dv; <span class="comment">// New v for calc the color of the next pixel</span>
  4822. <a name="l04831"></a>04831 du += ddu; <span class="comment">// New du for calc the color of the next pixel</span>
  4823. <a name="l04832"></a>04832 dv += ddv; <span class="comment">// New dv for calc the color of the next pixel</span>
  4824. <a name="l04833"></a>04833
  4825. <a name="l04834"></a>04834 screen_buffer++; <span class="comment">// Advance 1 pixel.</span>
  4826. <a name="l04835"></a>04835 } <span class="comment">// for x</span>
  4827. <a name="l04836"></a>04836
  4828. <a name="l04837"></a>04837 } <span class="comment">// C_Noise()</span>
  4829. <a name="l04838"></a>04838
  4830. <a name="l04839"></a>04839
  4831. <a name="l04840"></a>04840 <span class="keywordtype">void</span> CellEngine::n_perlin()
  4832. <a name="l04841"></a>04841 {
  4833. <a name="l04842"></a>04842 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *front = frontMem;
  4834. <a name="l04843"></a>04843 <span class="keywordtype">long</span> yy;
  4835. <a name="l04844"></a>04844 <span class="keywordtype">long</span> u = pointax;
  4836. <a name="l04845"></a>04845 <span class="keywordtype">long</span> v = pointay;
  4837. <a name="l04846"></a>04846 <span class="keywordtype">long</span> du = pointbx * frob;
  4838. <a name="l04847"></a>04847 <span class="keywordtype">long</span> dv = pointby * frob;
  4839. <a name="l04848"></a>04848 <span class="keywordtype">long</span> ddu = pointcx;
  4840. <a name="l04849"></a>04849 <span class="keywordtype">long</span> ddv = pointcy;
  4841. <a name="l04850"></a>04850
  4842. <a name="l04851"></a>04851 <span class="keywordflow">for</span> (yy = 0;
  4843. <a name="l04852"></a>04852 yy &lt; height;
  4844. <a name="l04853"></a>04853 front += screenRowBytes,
  4845. <a name="l04854"></a>04854 yy++) {
  4846. <a name="l04855"></a>04855
  4847. <a name="l04856"></a>04856 C_Noise(
  4848. <a name="l04857"></a>04857 u,
  4849. <a name="l04858"></a>04858 v,
  4850. <a name="l04859"></a>04859 du,
  4851. <a name="l04860"></a>04860 dv,
  4852. <a name="l04861"></a>04861 ddu,
  4853. <a name="l04862"></a>04862 ddv,
  4854. <a name="l04863"></a>04863 front,
  4855. <a name="l04864"></a>04864 width);
  4856. <a name="l04865"></a>04865
  4857. <a name="l04866"></a>04866 <span class="comment">// Step to the next scan line, by adding du,dv vector rotated 90 degrees to u,v</span>
  4858. <a name="l04867"></a>04867
  4859. <a name="l04868"></a>04868 u += dv;
  4860. <a name="l04869"></a>04869 v -= du;
  4861. <a name="l04870"></a>04870 } <span class="comment">// for yy</span>
  4862. <a name="l04871"></a>04871 }
  4863. <a name="l04872"></a>04872
  4864. <a name="l04873"></a>04873
  4865. <a name="l04874"></a>04874 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> MARG_RULE_DIFFUSION(
  4866. <a name="l04875"></a>04875 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c,
  4867. <a name="l04876"></a>04876 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cw,
  4868. <a name="l04877"></a>04877 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ccw,
  4869. <a name="l04878"></a>04878 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> opp,
  4870. <a name="l04879"></a>04879 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> r,
  4871. <a name="l04880"></a>04880 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> p)
  4872. <a name="l04881"></a>04881 {
  4873. <a name="l04882"></a>04882 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> result = 0;
  4874. <a name="l04883"></a>04883 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> wall =
  4875. <a name="l04884"></a>04884 (c | cw | ccw | opp) &amp; 2;
  4876. <a name="l04885"></a>04885 <span class="keywordflow">if</span> (wall) {
  4877. <a name="l04886"></a>04886 <span class="keywordflow">if</span> (c &amp; 3) {
  4878. <a name="l04887"></a>04887 result = 2;
  4879. <a name="l04888"></a>04888 } <span class="comment">// if</span>
  4880. <a name="l04889"></a>04889 } <span class="keywordflow">else</span> {
  4881. <a name="l04890"></a>04890 result =
  4882. <a name="l04891"></a>04891 (((r &amp; 1) ? cw : ccw) &amp; 1) |
  4883. <a name="l04892"></a>04892 (c &amp; 2);
  4884. <a name="l04893"></a>04893 } <span class="comment">// if</span>
  4885. <a name="l04894"></a>04894
  4886. <a name="l04895"></a>04895 <span class="keywordflow">return</span> result;
  4887. <a name="l04896"></a>04896 }
  4888. <a name="l04897"></a>04897
  4889. <a name="l04898"></a>04898
  4890. <a name="l04899"></a>04899 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> MARG_RULE_GAS(
  4891. <a name="l04900"></a>04900 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c,
  4892. <a name="l04901"></a>04901 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cw,
  4893. <a name="l04902"></a>04902 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ccw,
  4894. <a name="l04903"></a>04903 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> opp,
  4895. <a name="l04904"></a>04904 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> r,
  4896. <a name="l04905"></a>04905 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> p)
  4897. <a name="l04906"></a>04906 {
  4898. <a name="l04907"></a>04907 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> result = 0;
  4899. <a name="l04908"></a>04908 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> collision =
  4900. <a name="l04909"></a>04909 ((c &amp; 1) == (opp &amp; 1)) &amp;&amp;
  4901. <a name="l04910"></a>04910 ((cw &amp; 1) == (ccw &amp; 1)) &amp;&amp;
  4902. <a name="l04911"></a>04911 ((c &amp; 1) != (cw &amp; 1));
  4903. <a name="l04912"></a>04912 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> frozen =
  4904. <a name="l04913"></a>04913 (c | cw | ccw | opp) &amp; 2;
  4905. <a name="l04914"></a>04914 <span class="keywordflow">if</span> (frozen) {
  4906. <a name="l04915"></a>04915 <span class="keywordflow">if</span> (c &amp; 3) {
  4907. <a name="l04916"></a>04916 result = 2;
  4908. <a name="l04917"></a>04917 } <span class="comment">// if</span>
  4909. <a name="l04918"></a>04918 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (collision) {
  4910. <a name="l04919"></a>04919 result = cw;
  4911. <a name="l04920"></a>04920 } <span class="keywordflow">else</span> {
  4912. <a name="l04921"></a>04921 result = opp;
  4913. <a name="l04922"></a>04922 } <span class="comment">// if</span>
  4914. <a name="l04923"></a>04923
  4915. <a name="l04924"></a>04924 <span class="keywordflow">return</span> result;
  4916. <a name="l04925"></a>04925 }
  4917. <a name="l04926"></a>04926
  4918. <a name="l04927"></a>04927
  4919. <a name="l04928"></a>04928 <span class="keywordtype">void</span> CellEngine::n_dendrite()
  4920. <a name="l04929"></a>04929 {
  4921. <a name="l04930"></a>04930 Byte *front = frontMem;
  4922. <a name="l04931"></a>04931 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *nw;
  4923. <a name="l04932"></a>04932 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ne;
  4924. <a name="l04933"></a>04933 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *sw;
  4925. <a name="l04934"></a>04934 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *se;
  4926. <a name="l04935"></a>04935 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data = front;
  4927. <a name="l04936"></a>04936 <span class="keywordtype">int</span> xx, yy;
  4928. <a name="l04937"></a>04937 <span class="comment">// nw ne</span>
  4929. <a name="l04938"></a>04938 <span class="comment">// sw se</span>
  4930. <a name="l04939"></a>04939 <span class="keywordflow">for</span> (yy = 0; yy &lt; height; yy += 2) {
  4931. <a name="l04940"></a>04940 <span class="keywordflow">if</span> (phase == 0) {
  4932. <a name="l04941"></a>04941 nw = data;
  4933. <a name="l04942"></a>04942 ne = nw + 1;
  4934. <a name="l04943"></a>04943 sw = data + screenRowBytes;
  4935. <a name="l04944"></a>04944 se = sw + 1;
  4936. <a name="l04945"></a>04945 } <span class="keywordflow">else</span> {
  4937. <a name="l04946"></a>04946 se = data;
  4938. <a name="l04947"></a>04947 sw = se + (width - 1);
  4939. <a name="l04948"></a>04948 ne = data +
  4940. <a name="l04949"></a>04949 ((yy == 0)
  4941. <a name="l04950"></a>04950 ? ((height - 1) * screenRowBytes)
  4942. <a name="l04951"></a>04951 : (-screenRowBytes));
  4943. <a name="l04952"></a>04952 nw = ne + (width - 1);
  4944. <a name="l04953"></a>04953 } <span class="comment">// if</span>
  4945. <a name="l04954"></a>04954
  4946. <a name="l04955"></a>04955 <span class="keywordflow">for</span> (xx = 0; xx &lt; width; xx += 2) {
  4947. <a name="l04956"></a>04956 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> nw0 = *nw;
  4948. <a name="l04957"></a>04957 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ne0 = *ne;
  4949. <a name="l04958"></a>04958 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> sw0 = *sw;
  4950. <a name="l04959"></a>04959 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> se0 = *se;
  4951. <a name="l04960"></a>04960 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> r = (<span class="keywordtype">unsigned</span> char)Rand8();
  4952. <a name="l04961"></a>04961
  4953. <a name="l04962"></a>04962 <span class="comment">// nw ne</span>
  4954. <a name="l04963"></a>04963 <span class="comment">// sw se</span>
  4955. <a name="l04964"></a>04964
  4956. <a name="l04965"></a>04965 <span class="comment">// MARG_RULE(c, cw, ccw, opp, r, phase)</span>
  4957. <a name="l04966"></a>04966
  4958. <a name="l04967"></a>04967 <span class="preprocessor">#if 1</span>
  4959. <a name="l04968"></a>04968 <span class="preprocessor"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> collision =
  4960. <a name="l04969"></a>04969 ((nw0 &amp; 1) == (ne0 &amp; 1)) &amp;&amp;
  4961. <a name="l04970"></a>04970 ((sw0 &amp; 1) == (se0 &amp; 1)) &amp;&amp;
  4962. <a name="l04971"></a>04971 ((nw0 &amp; 1) != (sw0 &amp; 1));
  4963. <a name="l04972"></a>04972 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> frozen =
  4964. <a name="l04973"></a>04973 (nw0 | ne0 | sw0 | se0) &amp; 128;
  4965. <a name="l04974"></a>04974 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> nw1, ne1, sw1, se1;
  4966. <a name="l04975"></a>04975 <span class="comment">// nw ne</span>
  4967. <a name="l04976"></a>04976 <span class="comment">// sw se</span>
  4968. <a name="l04977"></a>04977 <span class="keywordflow">if</span> (frozen) {
  4969. <a name="l04978"></a>04978 <span class="keywordtype">int</span> t = ticks &gt;&gt; 4;
  4970. <a name="l04979"></a>04979 nw1 =
  4971. <a name="l04980"></a>04980 (nw0 == 0)
  4972. <a name="l04981"></a>04981 ? 0
  4973. <a name="l04982"></a>04982 : ((nw0 &amp; 128)
  4974. <a name="l04983"></a>04983 ? nw0
  4975. <a name="l04984"></a>04984 : (t | 128));
  4976. <a name="l04985"></a>04985 ne1 =
  4977. <a name="l04986"></a>04986 (ne0 == 0)
  4978. <a name="l04987"></a>04987 ? 0
  4979. <a name="l04988"></a>04988 : ((ne0 &amp; 128)
  4980. <a name="l04989"></a>04989 ? ne0
  4981. <a name="l04990"></a>04990 : (t | 128));
  4982. <a name="l04991"></a>04991 sw1 =
  4983. <a name="l04992"></a>04992 (sw0 == 0)
  4984. <a name="l04993"></a>04993 ? 0
  4985. <a name="l04994"></a>04994 : ((sw0 &amp; 128)
  4986. <a name="l04995"></a>04995 ? sw0
  4987. <a name="l04996"></a>04996 : (t | 128));
  4988. <a name="l04997"></a>04997 se1 =
  4989. <a name="l04998"></a>04998 (se0 == 0)
  4990. <a name="l04999"></a>04999 ? 0
  4991. <a name="l05000"></a>05000 : ((se0 &amp; 128)
  4992. <a name="l05001"></a>05001 ? se0
  4993. <a name="l05002"></a>05002 : (t | 128));
  4994. <a name="l05003"></a>05003
  4995. <a name="l05004"></a>05004 <span class="preprocessor">#if 1</span>
  4996. <a name="l05005"></a>05005 <span class="preprocessor"></span> <span class="keywordtype">int</span> count =
  4997. <a name="l05006"></a>05006 ((nw1 &amp; 128) + (ne1 &amp; 128) +
  4998. <a name="l05007"></a>05007 (sw1 &amp; 128) + (se1 &amp; 128)) &gt;&gt; 7;
  4999. <a name="l05008"></a>05008
  5000. <a name="l05009"></a>05009 <span class="keywordflow">if</span> (count &gt; 0) {
  5001. <a name="l05010"></a>05010 <span class="comment">// static int countHeatMod[5] = { 0, -20, -5, 10, 30 };</span>
  5002. <a name="l05011"></a>05011 <span class="keyword">static</span> <span class="keywordtype">int</span> countHeatMod[5] = { 0, -1, 0, 0, 0 };
  5003. <a name="l05012"></a>05012 <span class="keywordtype">int</span> avg =
  5004. <a name="l05013"></a>05013 ((((nw1 &amp; 128) ? (nw1 &amp; 127) : 0) +
  5005. <a name="l05014"></a>05014 ((ne1 &amp; 128) ? (ne1 &amp; 127) : 0) +
  5006. <a name="l05015"></a>05015 ((sw1 &amp; 128) ? (sw1 &amp; 127) : 0) +
  5007. <a name="l05016"></a>05016 ((se1 &amp; 128) ? (se1 &amp; 127) : 0) +
  5008. <a name="l05017"></a>05017 <span class="comment">// countHeatMod[count] +</span>
  5009. <a name="l05018"></a>05018 <span class="comment">// frob +</span>
  5010. <a name="l05019"></a>05019 0) / count) +
  5011. <a name="l05020"></a>05020 frob +
  5012. <a name="l05021"></a>05021 countHeatMod[count] +
  5013. <a name="l05022"></a>05022 0;
  5014. <a name="l05023"></a>05023 <span class="keywordflow">if</span> (nw1 &amp; 128) {
  5015. <a name="l05024"></a>05024 nw1 = avg | 128; <span class="comment">// (((nw1 &amp; 127) + avg) &gt;&gt; 1) | 128;</span>
  5016. <a name="l05025"></a>05025 } <span class="comment">// if</span>
  5017. <a name="l05026"></a>05026 <span class="keywordflow">if</span> (ne1 &amp; 128) {
  5018. <a name="l05027"></a>05027 ne1 = avg | 128; <span class="comment">// (((ne1 &amp; 127) + avg) &gt;&gt; 1) | 128;</span>
  5019. <a name="l05028"></a>05028 } <span class="comment">// if</span>
  5020. <a name="l05029"></a>05029 <span class="keywordflow">if</span> (sw1 &amp; 128) {
  5021. <a name="l05030"></a>05030 sw1 = avg | 128; <span class="comment">// (((sw1 &amp; 127) + avg) &gt;&gt; 1) | 128;</span>
  5022. <a name="l05031"></a>05031 } <span class="comment">// if</span>
  5023. <a name="l05032"></a>05032 <span class="keywordflow">if</span> (se1 &amp; 128) {
  5024. <a name="l05033"></a>05033 se1 = avg | 128; <span class="comment">// (((se1 &amp; 127) + avg) &gt;&gt; 1) | 128;</span>
  5025. <a name="l05034"></a>05034 } <span class="comment">// if</span>
  5026. <a name="l05035"></a>05035 } <span class="comment">// if</span>
  5027. <a name="l05036"></a>05036 <span class="preprocessor">#endif</span>
  5028. <a name="l05037"></a>05037 <span class="preprocessor"></span>
  5029. <a name="l05038"></a>05038 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (collision) {
  5030. <a name="l05039"></a>05039 <span class="keywordflow">if</span> (r &amp; 16) {
  5031. <a name="l05040"></a>05040 <span class="comment">// Rotate clockwise</span>
  5032. <a name="l05041"></a>05041 nw1 = sw0;
  5033. <a name="l05042"></a>05042 ne1 = nw0;
  5034. <a name="l05043"></a>05043 se1 = ne0;
  5035. <a name="l05044"></a>05044 sw1 = se0;
  5036. <a name="l05045"></a>05045 } <span class="keywordflow">else</span> {
  5037. <a name="l05046"></a>05046 <span class="comment">// Rotate counter-clockwise</span>
  5038. <a name="l05047"></a>05047 nw1 = ne0;
  5039. <a name="l05048"></a>05048 ne1 = se0;
  5040. <a name="l05049"></a>05049 se1 = sw0;
  5041. <a name="l05050"></a>05050 sw1 = nw0;
  5042. <a name="l05051"></a>05051 } <span class="comment">// if</span>
  5043. <a name="l05052"></a>05052 } <span class="keywordflow">else</span> {
  5044. <a name="l05053"></a>05053 <span class="keywordflow">if</span> (r &amp; 7) {
  5045. <a name="l05054"></a>05054 <span class="comment">// Flip opposite</span>
  5046. <a name="l05055"></a>05055 nw1 = se0;
  5047. <a name="l05056"></a>05056 ne1 = sw0;
  5048. <a name="l05057"></a>05057 se1 = nw0;
  5049. <a name="l05058"></a>05058 sw1 = ne0;
  5050. <a name="l05059"></a>05059 } <span class="keywordflow">else</span> {
  5051. <a name="l05060"></a>05060 <span class="keywordflow">if</span> (r &amp; 16) {
  5052. <a name="l05061"></a>05061 <span class="comment">// Rotate clockwise</span>
  5053. <a name="l05062"></a>05062 nw1 = sw0;
  5054. <a name="l05063"></a>05063 ne1 = nw0;
  5055. <a name="l05064"></a>05064 se1 = ne0;
  5056. <a name="l05065"></a>05065 sw1 = se0;
  5057. <a name="l05066"></a>05066 } <span class="keywordflow">else</span> {
  5058. <a name="l05067"></a>05067 <span class="comment">// Rotate counter-clockwise</span>
  5059. <a name="l05068"></a>05068 nw1 = ne0;
  5060. <a name="l05069"></a>05069 ne1 = se0;
  5061. <a name="l05070"></a>05070 se1 = sw0;
  5062. <a name="l05071"></a>05071 sw1 = nw0;
  5063. <a name="l05072"></a>05072 } <span class="comment">// if</span>
  5064. <a name="l05073"></a>05073 } <span class="comment">// if</span>
  5065. <a name="l05074"></a>05074 } <span class="comment">// if</span>
  5066. <a name="l05075"></a>05075 <span class="preprocessor">#else</span>
  5067. <a name="l05076"></a>05076 <span class="preprocessor"></span> <span class="comment">// c cw</span>
  5068. <a name="l05077"></a>05077 <span class="comment">// ccw opp</span>
  5069. <a name="l05078"></a>05078 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> nw1 = MARG_RULE_GAS(nw0, ne0, sw0, se0, r, phase);
  5070. <a name="l05079"></a>05079
  5071. <a name="l05080"></a>05080 <span class="comment">// ccw c</span>
  5072. <a name="l05081"></a>05081 <span class="comment">// opp cw</span>
  5073. <a name="l05082"></a>05082 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ne1 = MARG_RULE_GAS(ne0, se0, nw0, sw0, r, phase);
  5074. <a name="l05083"></a>05083
  5075. <a name="l05084"></a>05084 <span class="comment">// opp ccw</span>
  5076. <a name="l05085"></a>05085 <span class="comment">// cw c</span>
  5077. <a name="l05086"></a>05086 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> se1 = MARG_RULE_GAS(se0, sw0, ne0, nw0, r, phase);
  5078. <a name="l05087"></a>05087
  5079. <a name="l05088"></a>05088 <span class="comment">// cw opp</span>
  5080. <a name="l05089"></a>05089 <span class="comment">// c ccw</span>
  5081. <a name="l05090"></a>05090 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> sw1 = MARG_RULE_GAS(sw0, nw0, se0, ne0, r, phase);
  5082. <a name="l05091"></a>05091
  5083. <a name="l05092"></a>05092 <span class="preprocessor">#endif</span>
  5084. <a name="l05093"></a>05093 <span class="preprocessor"></span>
  5085. <a name="l05094"></a>05094 <span class="preprocessor">#if 0</span>
  5086. <a name="l05095"></a>05095 <span class="preprocessor"></span> <span class="keywordtype">int</span> nwgas = ((nw1 &gt; 0) &amp;&amp; (nw1 &lt; 128));
  5087. <a name="l05096"></a>05096 <span class="keywordtype">int</span> negas = ((ne1 &gt; 0) &amp;&amp; (ne1 &lt; 128));
  5088. <a name="l05097"></a>05097 <span class="keywordtype">int</span> swgas = ((sw1 &gt; 0) &amp;&amp; (sw1 &lt; 128));
  5089. <a name="l05098"></a>05098 <span class="keywordtype">int</span> segas = ((se1 &gt; 0) &amp;&amp; (se1 &lt; 128));
  5090. <a name="l05099"></a>05099 <span class="keywordtype">int</span> gasses = nwgas + negas + swgas + segas;
  5091. <a name="l05100"></a>05100 <span class="keywordflow">if</span> (gasses &gt; 1) {
  5092. <a name="l05101"></a>05101 <span class="keywordtype">int</span> total =
  5093. <a name="l05102"></a>05102 (nwgas ? nw1 : 0) +
  5094. <a name="l05103"></a>05103 (negas ? ne1 : 0) +
  5095. <a name="l05104"></a>05104 (swgas ? sw1 : 0) +
  5096. <a name="l05105"></a>05105 (segas ? se1 : 0) +
  5097. <a name="l05106"></a>05106 leftover;
  5098. <a name="l05107"></a>05107 <span class="keywordflow">if</span> ((Rand8() &amp; 15) == 0) {
  5099. <a name="l05108"></a>05108 total += frob;
  5100. <a name="l05109"></a>05109 } <span class="comment">// if</span>
  5101. <a name="l05110"></a>05110 <span class="keywordtype">int</span> avg =
  5102. <a name="l05111"></a>05111 (total / gasses) &amp; 127;
  5103. <a name="l05112"></a>05112 leftover =
  5104. <a name="l05113"></a>05113 total % gasses;
  5105. <a name="l05114"></a>05114 <span class="keywordflow">while</span> (avg &lt;= 0) avg += 127;
  5106. <a name="l05115"></a>05115 <span class="keywordflow">if</span> (nwgas) nw1 = avg;
  5107. <a name="l05116"></a>05116 <span class="keywordflow">if</span> (negas) ne1 = avg;
  5108. <a name="l05117"></a>05117 <span class="keywordflow">if</span> (swgas) sw1 = avg;
  5109. <a name="l05118"></a>05118 <span class="keywordflow">if</span> (segas) se1 = avg;
  5110. <a name="l05119"></a>05119 } <span class="comment">// if</span>
  5111. <a name="l05120"></a>05120 <span class="preprocessor">#endif</span>
  5112. <a name="l05121"></a>05121 <span class="preprocessor"></span>
  5113. <a name="l05122"></a>05122 *nw = nw1;
  5114. <a name="l05123"></a>05123 *ne = ne1;
  5115. <a name="l05124"></a>05124 *sw = sw1;
  5116. <a name="l05125"></a>05125 *se = se1;
  5117. <a name="l05126"></a>05126
  5118. <a name="l05127"></a>05127 nw = ne + 1;
  5119. <a name="l05128"></a>05128 sw = se + 1;
  5120. <a name="l05129"></a>05129 ne = ne + 2;
  5121. <a name="l05130"></a>05130 se = se + 2;
  5122. <a name="l05131"></a>05131 } <span class="comment">// for xx</span>
  5123. <a name="l05132"></a>05132
  5124. <a name="l05133"></a>05133 data +=
  5125. <a name="l05134"></a>05134 2 * screenRowBytes;
  5126. <a name="l05135"></a>05135
  5127. <a name="l05136"></a>05136 } <span class="comment">// for yy</span>
  5128. <a name="l05137"></a>05137 }
  5129. <a name="l05138"></a>05138
  5130. <a name="l05139"></a>05139
  5131. <a name="l05140"></a>05140 <span class="keywordtype">void</span> CellEngine::n_vanneal()
  5132. <a name="l05141"></a>05141 {
  5133. <a name="l05142"></a>05142 <span class="keywordtype">long</span> sum;
  5134. <a name="l05143"></a>05143
  5135. <a name="l05144"></a>05144 <span class="keywordflow">if</span> (total &lt; hubba) {
  5136. <a name="l05145"></a>05145 inflation = 1;
  5137. <a name="l05146"></a>05146 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (total == hubba) {
  5138. <a name="l05147"></a>05147 inflation = 0;
  5139. <a name="l05148"></a>05148 } <span class="keywordflow">else</span> {
  5140. <a name="l05149"></a>05149 inflation = -1;
  5141. <a name="l05150"></a>05150 } <span class="comment">// if</span>
  5142. <a name="l05151"></a>05151
  5143. <a name="l05152"></a>05152 total = 0;
  5144. <a name="l05153"></a>05153
  5145. <a name="l05154"></a>05154 <span class="preprocessor">#define VANNEAL ( \</span>
  5146. <a name="l05155"></a>05155 <span class="preprocessor"> (((((sum = inflation + SUM9REG(1)) &gt; 5) || (sum == 4))) ? (total++, 1) : 0) | \</span>
  5147. <a name="l05156"></a>05156 <span class="preprocessor"> ((c&amp;0x7f) &lt;&lt; 1))</span>
  5148. <a name="l05157"></a>05157 <span class="preprocessor"></span>
  5149. <a name="l05158"></a>05158 CAM_MASKED_REG_LOOP(VANNEAL)
  5150. <a name="l05159"></a>05159 }
  5151. <a name="l05160"></a>05160
  5152. <a name="l05161"></a>05161
  5153. <a name="l05162"></a>05162 <span class="keywordtype">void</span> CellEngine::n_vanneal8()
  5154. <a name="l05163"></a>05163 {
  5155. <a name="l05164"></a>05164 <span class="keywordtype">long</span> sum0;
  5156. <a name="l05165"></a>05165 <span class="keywordtype">long</span> sum1;
  5157. <a name="l05166"></a>05166 <span class="keywordtype">long</span> sum2;
  5158. <a name="l05167"></a>05167 <span class="keywordtype">long</span> sum3;
  5159. <a name="l05168"></a>05168 <span class="keywordtype">long</span> sum4;
  5160. <a name="l05169"></a>05169 <span class="keywordtype">long</span> sum5;
  5161. <a name="l05170"></a>05170 <span class="keywordtype">long</span> sum6;
  5162. <a name="l05171"></a>05171 <span class="keywordtype">long</span> sum7;
  5163. <a name="l05172"></a>05172
  5164. <a name="l05173"></a>05173 <span class="keywordflow">if</span> (total &lt; hubba) {
  5165. <a name="l05174"></a>05174 inflation = 1;
  5166. <a name="l05175"></a>05175 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (total == hubba) {
  5167. <a name="l05176"></a>05176 inflation = 0;
  5168. <a name="l05177"></a>05177 } <span class="keywordflow">else</span> {
  5169. <a name="l05178"></a>05178 inflation = -1;
  5170. <a name="l05179"></a>05179 } <span class="comment">// if</span>
  5171. <a name="l05180"></a>05180
  5172. <a name="l05181"></a>05181 total = 0;
  5173. <a name="l05182"></a>05182
  5174. <a name="l05183"></a>05183 <span class="preprocessor">#define VANNEAL8 ( \</span>
  5175. <a name="l05184"></a>05184 <span class="preprocessor"> ((((sum0 = inflation + SUM9REG(1)) &gt; 5) || (sum0 == 4)) ? (total++, 1) : 0) | \</span>
  5176. <a name="l05185"></a>05185 <span class="preprocessor"> ((((sum1 = inflation + (SUM9REG(2) &gt;&gt; 1)) &gt; 5) || (sum1 == 4)) ? (total++, 2) : 0) | \</span>
  5177. <a name="l05186"></a>05186 <span class="preprocessor"> ((((sum2 = inflation + (SUM9REG(4) &gt;&gt; 2)) &gt; 5) || (sum2 == 4)) ? (total++, 4) : 0) | \</span>
  5178. <a name="l05187"></a>05187 <span class="preprocessor"> ((((sum3 = inflation + (SUM9REG(8) &gt;&gt; 3)) &gt; 5) || (sum3 == 4)) ? (total++, 8) : 0) | \</span>
  5179. <a name="l05188"></a>05188 <span class="preprocessor"> ((((sum4 = inflation + (SUM9REG(16) &gt;&gt; 4)) &gt; 5) || (sum4 == 4)) ? (total++, 16) : 0) | \</span>
  5180. <a name="l05189"></a>05189 <span class="preprocessor"> ((((sum5 = inflation + (SUM9REG(32) &gt;&gt; 5)) &gt; 5) || (sum5 == 4)) ? (total++, 32) : 0) | \</span>
  5181. <a name="l05190"></a>05190 <span class="preprocessor"> ((((sum6 = inflation + (SUM9REG(64) &gt;&gt; 6)) &gt; 5) || (sum6 == 4)) ? (total++, 64) : 0) | \</span>
  5182. <a name="l05191"></a>05191 <span class="preprocessor"> ((((sum7 = inflation + (SUM9REG(128) &gt;&gt; 7)) &gt; 5) || (sum7 == 4)) ? (total++, 128) : 0))</span>
  5183. <a name="l05192"></a>05192 <span class="preprocessor"></span>
  5184. <a name="l05193"></a>05193 CAM_MASKED_REG_LOOP(VANNEAL8)
  5185. <a name="l05194"></a>05194 }
  5186. <a name="l05195"></a>05195
  5187. <a name="l05196"></a>05196 <span class="preprocessor">#if 0</span>
  5188. <a name="l05197"></a>05197 <span class="preprocessor"></span>
  5189. <a name="l05198"></a>05198 <span class="keywordtype">void</span> CellEngine::n_freaco()
  5190. <a name="l05199"></a>05199 {
  5191. <a name="l05200"></a>05200 <span class="keywordtype">long</span> sum;
  5192. <a name="l05201"></a>05201
  5193. <a name="l05202"></a>05202 <span class="preprocessor">#define FRAIN ( \</span>
  5194. <a name="l05203"></a>05203 <span class="preprocessor"> (((c &amp; 0x03) == 0) \</span>
  5195. <a name="l05204"></a>05204 <span class="preprocessor"> ? ((SUM8REG(1) == 2) ? 1 : 0) \</span>
  5196. <a name="l05205"></a>05205 <span class="preprocessor"> : 0) | \</span>
  5197. <a name="l05206"></a>05206 <span class="preprocessor"> ((c &amp; 1) ? (0xfe) | \</span>
  5198. <a name="l05207"></a>05207 <span class="preprocessor"> : (</span>
  5199. <a name="l05208"></a>05208 <span class="preprocessor"></span> : 0)
  5200. <a name="l05209"></a>05209 ((sum = c % 0xfe),
  5201. <a name="l05210"></a>05210 (c &lt;&lt; 1) &amp; 0xfe)) \
  5202. <a name="l05211"></a>05211 )
  5203. <a name="l05212"></a>05212
  5204. <a name="l05213"></a>05213 <span class="preprocessor">#define FRANTILIFE ( \</span>
  5205. <a name="l05214"></a>05214 <span class="preprocessor"> ((sum = SUM8REG(1)), \</span>
  5206. <a name="l05215"></a>05215 <span class="preprocessor"> (((c&amp;1) ? (sum != 5) : (((sum != 5) &amp;&amp; (sum != 6)) ? 1 : 0)) | \</span>
  5207. <a name="l05216"></a>05216 <span class="preprocessor"> ((c&amp;0x7f) &lt;&lt; 1))))</span>
  5208. <a name="l05217"></a>05217 <span class="preprocessor"></span>
  5209. <a name="l05218"></a>05218 <span class="preprocessor">#define FREACO ( \</span>
  5210. <a name="l05219"></a>05219 <span class="preprocessor"> ((((sum = (SUM9REG(128) &gt;&gt; 7)) &gt; 5) || (sum == 4)) \</span>
  5211. <a name="l05220"></a>05220 <span class="preprocessor"> ? ((FRANTILIFE &amp; 127) | 128) \</span>
  5212. <a name="l05221"></a>05221 <span class="preprocessor"> : (FRAIN &amp; 127)))</span>
  5213. <a name="l05222"></a>05222 <span class="preprocessor"></span>
  5214. <a name="l05223"></a>05223 CAM_MASKED_REG_LOOP(FREACO)
  5215. <a name="l05224"></a>05224 }
  5216. <a name="l05225"></a>05225
  5217. <a name="l05226"></a>05226 <span class="preprocessor">#endif</span>
  5218. <a name="l05227"></a>05227 <span class="preprocessor"></span>
  5219. <a name="l05228"></a>05228
  5220. <a name="l05230"></a>05230 <span class="comment">// von Neumann 29 state cellular automata</span>
  5221. <a name="l05231"></a>05231
  5222. <a name="l05232"></a>05232
  5223. <a name="l05233"></a>05233 <span class="keyword">enum</span> {
  5224. <a name="l05234"></a>05234 U = 0x00,
  5225. <a name="l05235"></a>05235
  5226. <a name="l05236"></a>05236 S = 0x01,
  5227. <a name="l05237"></a>05237 S0 = 0x02,
  5228. <a name="l05238"></a>05238 S1 = 0x03,
  5229. <a name="l05239"></a>05239 S00 = 0x04,
  5230. <a name="l05240"></a>05240 S01 = 0x05,
  5231. <a name="l05241"></a>05241 S10 = 0x06,
  5232. <a name="l05242"></a>05242 S11 = 0x07,
  5233. <a name="l05243"></a>05243 S000 = 0x08,
  5234. <a name="l05244"></a>05244
  5235. <a name="l05245"></a>05245 C00 = 0x10,
  5236. <a name="l05246"></a>05246 C10 = 0x11,
  5237. <a name="l05247"></a>05247 C01 = 0x90,
  5238. <a name="l05248"></a>05248 C11 = 0x91,
  5239. <a name="l05249"></a>05249
  5240. <a name="l05250"></a>05250 OR = 0x20,
  5241. <a name="l05251"></a>05251 OU = 0x21,
  5242. <a name="l05252"></a>05252 OL = 0x22,
  5243. <a name="l05253"></a>05253 OD = 0x23,
  5244. <a name="l05254"></a>05254
  5245. <a name="l05255"></a>05255 SR = 0x40,
  5246. <a name="l05256"></a>05256 SU = 0x41,
  5247. <a name="l05257"></a>05257 SL = 0x42,
  5248. <a name="l05258"></a>05258 SD = 0x43,
  5249. <a name="l05259"></a>05259
  5250. <a name="l05260"></a>05260 ORX = 0xa0,
  5251. <a name="l05261"></a>05261 OUX = 0xa1,
  5252. <a name="l05262"></a>05262 OLX = 0xa2,
  5253. <a name="l05263"></a>05263 ODX = 0xa3,
  5254. <a name="l05264"></a>05264
  5255. <a name="l05265"></a>05265 SRX = 0xc0,
  5256. <a name="l05266"></a>05266 SUX = 0xc1,
  5257. <a name="l05267"></a>05267 SLX = 0xc2,
  5258. <a name="l05268"></a>05268 SDX = 0xc3,
  5259. <a name="l05269"></a>05269
  5260. <a name="l05270"></a>05270 DM = 0x03, <span class="comment">// direction mask</span>
  5261. <a name="l05271"></a>05271 RD = 0x00, <span class="comment">// right direction</span>
  5262. <a name="l05272"></a>05272 UD = 0x01, <span class="comment">// up direction</span>
  5263. <a name="l05273"></a>05273 LD = 0x02, <span class="comment">// left direction</span>
  5264. <a name="l05274"></a>05274 DD = 0x03, <span class="comment">// down direction</span>
  5265. <a name="l05275"></a>05275 EX = 0x80, <span class="comment">// excited</span>
  5266. <a name="l05276"></a>05276 NX = 0x7f, <span class="comment">// not excited</span>
  5267. <a name="l05277"></a>05277
  5268. <a name="l05278"></a>05278 };
  5269. <a name="l05279"></a>05279
  5270. <a name="l05280"></a>05280
  5271. <a name="l05281"></a>05281 <span class="keyword">typedef</span> <span class="keyword">struct </span>StateInfo {
  5272. <a name="l05282"></a>05282 <span class="keyword">const</span> <span class="keywordtype">char</span> *name;
  5273. <a name="l05283"></a>05283 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> code;
  5274. <a name="l05284"></a>05284 } StateInfo;
  5275. <a name="l05285"></a>05285
  5276. <a name="l05286"></a>05286 <span class="keyword">const</span> <span class="keywordtype">int</span> JVNSTATES = 29;
  5277. <a name="l05287"></a>05287 StateInfo states[JVNSTATES] = {
  5278. <a name="l05288"></a>05288 { <span class="stringliteral">"U"</span>, U },
  5279. <a name="l05289"></a>05289
  5280. <a name="l05290"></a>05290 { <span class="stringliteral">"S"</span>, S },
  5281. <a name="l05291"></a>05291 { <span class="stringliteral">"S0"</span>, S0 },
  5282. <a name="l05292"></a>05292 { <span class="stringliteral">"S1"</span>, S1 },
  5283. <a name="l05293"></a>05293 { <span class="stringliteral">"S00"</span>, S00 },
  5284. <a name="l05294"></a>05294 { <span class="stringliteral">"S01"</span>, S01 },
  5285. <a name="l05295"></a>05295 { <span class="stringliteral">"S10"</span>, S10 },
  5286. <a name="l05296"></a>05296 { <span class="stringliteral">"S11"</span>, S11 },
  5287. <a name="l05297"></a>05297 { <span class="stringliteral">"S000"</span>, S000 },
  5288. <a name="l05298"></a>05298
  5289. <a name="l05299"></a>05299 { <span class="stringliteral">"C00"</span>, C00 },
  5290. <a name="l05300"></a>05300 { <span class="stringliteral">"C10"</span>, C10 },
  5291. <a name="l05301"></a>05301 { <span class="stringliteral">"C01"</span>, C01 },
  5292. <a name="l05302"></a>05302 { <span class="stringliteral">"C11"</span>, C11 },
  5293. <a name="l05303"></a>05303
  5294. <a name="l05304"></a>05304 { <span class="stringliteral">"OR"</span>, OR },
  5295. <a name="l05305"></a>05305 { <span class="stringliteral">"OU"</span>, OU },
  5296. <a name="l05306"></a>05306 { <span class="stringliteral">"OL"</span>, OL },
  5297. <a name="l05307"></a>05307 { <span class="stringliteral">"OD"</span>, OD },
  5298. <a name="l05308"></a>05308
  5299. <a name="l05309"></a>05309 { <span class="stringliteral">"SR"</span>, SR },
  5300. <a name="l05310"></a>05310 { <span class="stringliteral">"SU"</span>, SU },
  5301. <a name="l05311"></a>05311 { <span class="stringliteral">"SL"</span>, SL },
  5302. <a name="l05312"></a>05312 { <span class="stringliteral">"SD"</span>, SD },
  5303. <a name="l05313"></a>05313
  5304. <a name="l05314"></a>05314 { <span class="stringliteral">"ORX"</span>, ORX },
  5305. <a name="l05315"></a>05315 { <span class="stringliteral">"OUX"</span>, OUX },
  5306. <a name="l05316"></a>05316 { <span class="stringliteral">"OLX"</span>, OLX },
  5307. <a name="l05317"></a>05317 { <span class="stringliteral">"ODX"</span>, ODX },
  5308. <a name="l05318"></a>05318
  5309. <a name="l05319"></a>05319 { <span class="stringliteral">"SRX"</span>, SRX },
  5310. <a name="l05320"></a>05320 { <span class="stringliteral">"SUX"</span>, SUX },
  5311. <a name="l05321"></a>05321 { <span class="stringliteral">"SLX"</span>, SLX },
  5312. <a name="l05322"></a>05322 { <span class="stringliteral">"SDX"</span>, SDX },
  5313. <a name="l05323"></a>05323 };
  5314. <a name="l05324"></a>05324
  5315. <a name="l05325"></a>05325
  5316. <a name="l05326"></a>05326 <span class="keyword">static</span> <span class="keywordtype">bool</span> jvnInitialized = <span class="keyword">false</span>;
  5317. <a name="l05327"></a>05327 <span class="keyword">const</span> <span class="keywordtype">char</span> *codeToName[256];
  5318. <a name="l05328"></a>05328
  5319. <a name="l05329"></a>05329
  5320. <a name="l05330"></a>05330 <span class="comment">/* Return 1 if pointed by an excited special transmission state,</span>
  5321. <a name="l05331"></a>05331 <span class="comment"> else returns 0. */</span>
  5322. <a name="l05332"></a>05332 <span class="keywordtype">int</span> sp(Byte right, Byte up, Byte left, Byte down)
  5323. <a name="l05333"></a>05333 {
  5324. <a name="l05334"></a>05334 <span class="keywordflow">return</span> (
  5325. <a name="l05335"></a>05335 (right == SLX) ||
  5326. <a name="l05336"></a>05336 (up == SDX) ||
  5327. <a name="l05337"></a>05337 (left == SRX) ||
  5328. <a name="l05338"></a>05338 (down == SUX)
  5329. <a name="l05339"></a>05339 );
  5330. <a name="l05340"></a>05340 }
  5331. <a name="l05341"></a>05341
  5332. <a name="l05342"></a>05342
  5333. <a name="l05343"></a>05343 <span class="comment">/* Return 1 if pointed by an excited ordinary transmission state,</span>
  5334. <a name="l05344"></a>05344 <span class="comment"> else returns 0. */</span>
  5335. <a name="l05345"></a>05345 <span class="keywordtype">int</span> op(Byte right, Byte up, Byte left, Byte down)
  5336. <a name="l05346"></a>05346 {
  5337. <a name="l05347"></a>05347 <span class="keywordflow">return</span> (
  5338. <a name="l05348"></a>05348 (right == OLX) ||
  5339. <a name="l05349"></a>05349 (up == ODX) ||
  5340. <a name="l05350"></a>05350 (left == ORX) ||
  5341. <a name="l05351"></a>05351 (down == OUX)
  5342. <a name="l05352"></a>05352 );
  5343. <a name="l05353"></a>05353 }
  5344. <a name="l05354"></a>05354
  5345. <a name="l05355"></a>05355
  5346. <a name="l05356"></a>05356 <span class="comment">/* Return 1 if pointed by an excited transmission state (ordinary or special),</span>
  5347. <a name="l05357"></a>05357 <span class="comment"> else returns 0. */</span>
  5348. <a name="l05358"></a>05358 <span class="keywordtype">int</span> osp(Byte right, Byte up, Byte left, Byte down)
  5349. <a name="l05359"></a>05359 {
  5350. <a name="l05360"></a>05360 <span class="keywordflow">return</span> (
  5351. <a name="l05361"></a>05361 (right == OLX) ||
  5352. <a name="l05362"></a>05362 (right == SLX) ||
  5353. <a name="l05363"></a>05363 (up == ODX) ||
  5354. <a name="l05364"></a>05364 (up == SDX) ||
  5355. <a name="l05365"></a>05365 (left == ORX) ||
  5356. <a name="l05366"></a>05366 (left == SRX) ||
  5357. <a name="l05367"></a>05367 (down == OUX) ||
  5358. <a name="l05368"></a>05368 (down == SUX)
  5359. <a name="l05369"></a>05369 );
  5360. <a name="l05370"></a>05370 }
  5361. <a name="l05371"></a>05371
  5362. <a name="l05372"></a>05372
  5363. <a name="l05373"></a>05373 <span class="comment">/* Return 1 if well pointed by an excited ordinary transmission state,</span>
  5364. <a name="l05374"></a>05374 <span class="comment"> else returns 0. */</span>
  5365. <a name="l05375"></a>05375 <span class="keywordtype">int</span> wop(Byte state, Byte right, Byte up, Byte left, Byte down)
  5366. <a name="l05376"></a>05376 {
  5367. <a name="l05377"></a>05377 state &amp;= DM;
  5368. <a name="l05378"></a>05378 <span class="keywordflow">return</span> (
  5369. <a name="l05379"></a>05379 ((right == OLX) &amp;&amp;
  5370. <a name="l05380"></a>05380 (state != RD)) ||
  5371. <a name="l05381"></a>05381 ((up == ODX) &amp;&amp;
  5372. <a name="l05382"></a>05382 (state != UD)) ||
  5373. <a name="l05383"></a>05383 ((left == ORX) &amp;&amp;
  5374. <a name="l05384"></a>05384 (state != LD)) ||
  5375. <a name="l05385"></a>05385 ((down == OUX) &amp;&amp;
  5376. <a name="l05386"></a>05386 (state != DD))
  5377. <a name="l05387"></a>05387 );
  5378. <a name="l05388"></a>05388 }
  5379. <a name="l05389"></a>05389
  5380. <a name="l05390"></a>05390
  5381. <a name="l05391"></a>05391 <span class="comment">/* Return 1 if well pointed by an excited special transmission state,</span>
  5382. <a name="l05392"></a>05392 <span class="comment"> else returns 0. */</span>
  5383. <a name="l05393"></a>05393 <span class="keywordtype">int</span> wsp(Byte state, Byte right, Byte up, Byte left, Byte down)
  5384. <a name="l05394"></a>05394 {
  5385. <a name="l05395"></a>05395 state &amp;= DM;
  5386. <a name="l05396"></a>05396 <span class="keywordflow">return</span> (
  5387. <a name="l05397"></a>05397 ((right == SLX) &amp;&amp;
  5388. <a name="l05398"></a>05398 (state != RD)) ||
  5389. <a name="l05399"></a>05399 ((up == SDX) &amp;&amp;
  5390. <a name="l05400"></a>05400 (state != UD)) ||
  5391. <a name="l05401"></a>05401 ((left == SRX) &amp;&amp;
  5392. <a name="l05402"></a>05402 (state != LD)) ||
  5393. <a name="l05403"></a>05403 ((down == SUX) &amp;&amp;
  5394. <a name="l05404"></a>05404 (state != DD))
  5395. <a name="l05405"></a>05405 );
  5396. <a name="l05406"></a>05406 }
  5397. <a name="l05407"></a>05407
  5398. <a name="l05408"></a>05408
  5399. <a name="l05409"></a>05409 <span class="comment">/* Return 1 if well flanked by an excited (not next excited) confluent state,</span>
  5400. <a name="l05410"></a>05410 <span class="comment"> else returns 0. */</span>
  5401. <a name="l05411"></a>05411 <span class="keywordtype">int</span> wce(Byte state, Byte right, Byte up, Byte left, Byte down)
  5402. <a name="l05412"></a>05412 {
  5403. <a name="l05413"></a>05413 state &amp;= DM;
  5404. <a name="l05414"></a>05414 <span class="keywordflow">return</span> (
  5405. <a name="l05415"></a>05415 (((right == C10) || (right == C11)) &amp;&amp;
  5406. <a name="l05416"></a>05416 (state != RD)) ||
  5407. <a name="l05417"></a>05417 (((up == C10) || (up == C11)) &amp;&amp;
  5408. <a name="l05418"></a>05418 (state != UD)) ||
  5409. <a name="l05419"></a>05419 (((left == C10) || (left == C11)) &amp;&amp;
  5410. <a name="l05420"></a>05420 (state != LD)) ||
  5411. <a name="l05421"></a>05421 (((down == C10) || (down == C11)) &amp;&amp;
  5412. <a name="l05422"></a>05422 (state != DD))
  5413. <a name="l05423"></a>05423 );
  5414. <a name="l05424"></a>05424 }
  5415. <a name="l05425"></a>05425
  5416. <a name="l05426"></a>05426
  5417. <a name="l05427"></a>05427 <span class="comment">/* Return excited confluent state. */</span>
  5418. <a name="l05428"></a>05428 Byte cascade(Byte right, Byte up, Byte left, Byte down)
  5419. <a name="l05429"></a>05429 {
  5420. <a name="l05430"></a>05430 <span class="keywordflow">return</span> ( ((right == OLX) || (up == ODX) || (left == ORX) || (down == OUX)) &amp;&amp;
  5421. <a name="l05431"></a>05431 !((right == OL) || (up == OD) || (left == OR) || (down == OU)) );
  5422. <a name="l05432"></a>05432 }
  5423. <a name="l05433"></a>05433
  5424. <a name="l05434"></a>05434
  5425. <a name="l05435"></a>05435 <span class="comment">/* Return excited confluent state. */</span>
  5426. <a name="l05436"></a>05436 Byte excite(Byte state)
  5427. <a name="l05437"></a>05437 {
  5428. <a name="l05438"></a>05438 <span class="keywordflow">if</span> ((state == C00) || (state == C10)) {
  5429. <a name="l05439"></a>05439 <span class="keywordflow">return</span> C01;
  5430. <a name="l05440"></a>05440 } <span class="keywordflow">else</span> {
  5431. <a name="l05441"></a>05441 <span class="keywordflow">return</span> C11;
  5432. <a name="l05442"></a>05442 } <span class="comment">// if</span>
  5433. <a name="l05443"></a>05443 }
  5434. <a name="l05444"></a>05444
  5435. <a name="l05445"></a>05445
  5436. <a name="l05446"></a>05446 <span class="comment">/* Return decayed confluent state. */</span>
  5437. <a name="l05447"></a>05447 Byte decay(Byte state)
  5438. <a name="l05448"></a>05448 {
  5439. <a name="l05449"></a>05449 <span class="keywordflow">if</span> ((state == C00) || (state == C10)) {
  5440. <a name="l05450"></a>05450 <span class="keywordflow">return</span> C00;
  5441. <a name="l05451"></a>05451 } <span class="keywordflow">else</span> {
  5442. <a name="l05452"></a>05452 <span class="keywordflow">return</span> C10;
  5443. <a name="l05453"></a>05453 } <span class="comment">// if</span>
  5444. <a name="l05454"></a>05454 }
  5445. <a name="l05455"></a>05455
  5446. <a name="l05456"></a>05456
  5447. <a name="l05457"></a>05457 <span class="comment">/*</span>
  5448. <a name="l05458"></a>05458 <span class="comment"></span>
  5449. <a name="l05459"></a>05459 <span class="comment"> Instructions to the construction arm:</span>
  5450. <a name="l05460"></a>05460 <span class="comment"></span>
  5451. <a name="l05461"></a>05461 <span class="comment"> Bits Construct</span>
  5452. <a name="l05462"></a>05462 <span class="comment"></span>
  5453. <a name="l05463"></a>05463 <span class="comment"> 1111 C00</span>
  5454. <a name="l05464"></a>05464 <span class="comment"></span>
  5455. <a name="l05465"></a>05465 <span class="comment"> 10000 OR</span>
  5456. <a name="l05466"></a>05466 <span class="comment"> 10001 OU</span>
  5457. <a name="l05467"></a>05467 <span class="comment"> 1001 OL</span>
  5458. <a name="l05468"></a>05468 <span class="comment"> 1010 OD</span>
  5459. <a name="l05469"></a>05469 <span class="comment"></span>
  5460. <a name="l05470"></a>05470 <span class="comment"> 1011 SR</span>
  5461. <a name="l05471"></a>05471 <span class="comment"> 1100 SU</span>
  5462. <a name="l05472"></a>05472 <span class="comment"> 1101 SL</span>
  5463. <a name="l05473"></a>05473 <span class="comment"> 1110 SD</span>
  5464. <a name="l05474"></a>05474 <span class="comment"></span>
  5465. <a name="l05475"></a>05475 <span class="comment"> */</span>
  5466. <a name="l05476"></a>05476
  5467. <a name="l05477"></a>05477 <span class="keywordtype">void</span> CellEngine::n_jvn29()
  5468. <a name="l05478"></a>05478 {
  5469. <a name="l05479"></a>05479 <span class="keywordflow">if</span> (!jvnInitialized) {
  5470. <a name="l05480"></a>05480 jvnInitialized = <span class="keyword">true</span>;
  5471. <a name="l05481"></a>05481
  5472. <a name="l05482"></a>05482 <span class="keywordtype">int</span> i;
  5473. <a name="l05483"></a>05483 <span class="keywordflow">for</span> (i = 0; i &lt; 256; i++) {
  5474. <a name="l05484"></a>05484 codeToName[i] = NULL;
  5475. <a name="l05485"></a>05485 }
  5476. <a name="l05486"></a>05486 <span class="keywordflow">for</span> (i = 0; i &lt; JVNSTATES; i++) {
  5477. <a name="l05487"></a>05487 codeToName[states[i].code] = states[i].name;
  5478. <a name="l05488"></a>05488 }
  5479. <a name="l05489"></a>05489 }
  5480. <a name="l05490"></a>05490
  5481. <a name="l05491"></a>05491 Byte *front = frontMem;
  5482. <a name="l05492"></a>05492 Byte *back = backMem +
  5483. <a name="l05493"></a>05493 backBorder +
  5484. <a name="l05494"></a>05494 (backBorder * backRowBytes);
  5485. <a name="l05495"></a>05495 Byte *f = front, *b = back;
  5486. <a name="l05496"></a>05496 <span class="keywordtype">long</span> xx, yy;
  5487. <a name="l05497"></a>05497
  5488. <a name="l05498"></a>05498 Byte up, down, left, right, state;
  5489. <a name="l05499"></a>05499 <span class="keywordflow">for</span> (yy = 0;
  5490. <a name="l05500"></a>05500 yy &lt; height;
  5491. <a name="l05501"></a>05501 f += screenRowBytes,
  5492. <a name="l05502"></a>05502 b += backRowBytes,
  5493. <a name="l05503"></a>05503 yy++) {
  5494. <a name="l05504"></a>05504
  5495. <a name="l05505"></a>05505 state = b[-1];
  5496. <a name="l05506"></a>05506 right = b[0];
  5497. <a name="l05507"></a>05507
  5498. <a name="l05508"></a>05508 <span class="keywordflow">for</span> (xx = 0;
  5499. <a name="l05509"></a>05509 xx &lt; width;
  5500. <a name="l05510"></a>05510 xx++) {
  5501. <a name="l05511"></a>05511
  5502. <a name="l05512"></a>05512 up = b[xx + -backRowBytes];
  5503. <a name="l05513"></a>05513 down = b[xx + backRowBytes];
  5504. <a name="l05514"></a>05514 left = state;
  5505. <a name="l05515"></a>05515 state = right;
  5506. <a name="l05516"></a>05516 right = b[xx + 1];
  5507. <a name="l05517"></a>05517
  5508. <a name="l05518"></a>05518 Byte nextstate = state;
  5509. <a name="l05519"></a>05519
  5510. <a name="l05520"></a>05520 <span class="keywordflow">switch</span> (state) {
  5511. <a name="l05521"></a>05521
  5512. <a name="l05522"></a>05522
  5513. <a name="l05523"></a>05523 <span class="keywordflow">case</span> U: <span class="comment">// unexcited state</span>
  5514. <a name="l05524"></a>05524 {
  5515. <a name="l05525"></a>05525 <span class="keywordflow">if</span> ((right == U) &amp;&amp; (up == U) &amp;&amp; (left == U) &amp;&amp; (down == U)) {
  5516. <a name="l05526"></a>05526 <span class="comment">// no change</span>
  5517. <a name="l05527"></a>05527 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5518. <a name="l05528"></a>05528 nextstate = S;
  5519. <a name="l05529"></a>05529 } <span class="keywordflow">else</span> {
  5520. <a name="l05530"></a>05530 <span class="comment">// no change</span>
  5521. <a name="l05531"></a>05531 } <span class="comment">// if</span>
  5522. <a name="l05532"></a>05532 <span class="keywordflow">break</span>;
  5523. <a name="l05533"></a>05533 } <span class="comment">// case</span>
  5524. <a name="l05534"></a>05534
  5525. <a name="l05535"></a>05535 <span class="keywordflow">case</span> OR: <span class="comment">// ordinary states</span>
  5526. <a name="l05536"></a>05536 <span class="keywordflow">case</span> OU:
  5527. <a name="l05537"></a>05537 <span class="keywordflow">case</span> OL:
  5528. <a name="l05538"></a>05538 <span class="keywordflow">case</span> OD:
  5529. <a name="l05539"></a>05539 <span class="keywordflow">case</span> ORX:
  5530. <a name="l05540"></a>05540 <span class="keywordflow">case</span> OUX:
  5531. <a name="l05541"></a>05541 <span class="keywordflow">case</span> OLX:
  5532. <a name="l05542"></a>05542 <span class="keywordflow">case</span> ODX:
  5533. <a name="l05543"></a>05543 {
  5534. <a name="l05544"></a>05544 <span class="keywordflow">if</span> (sp(right, up, left, down)) {
  5535. <a name="l05545"></a>05545 nextstate = U; <span class="comment">// blank</span>
  5536. <a name="l05546"></a>05546 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (wce(state, right, up, left, down) ||
  5537. <a name="l05547"></a>05547 wop(state, right, up, left, down)) {
  5538. <a name="l05548"></a>05548 nextstate |= EX; <span class="comment">// excited</span>
  5539. <a name="l05549"></a>05549 } <span class="keywordflow">else</span> {
  5540. <a name="l05550"></a>05550 nextstate &amp;= NX; <span class="comment">// not excited</span>
  5541. <a name="l05551"></a>05551 } <span class="comment">// if</span>
  5542. <a name="l05552"></a>05552 <span class="keywordflow">break</span>;
  5543. <a name="l05553"></a>05553 } <span class="comment">// case</span>
  5544. <a name="l05554"></a>05554
  5545. <a name="l05555"></a>05555 <span class="keywordflow">case</span> SR: <span class="comment">// special states</span>
  5546. <a name="l05556"></a>05556 <span class="keywordflow">case</span> SU:
  5547. <a name="l05557"></a>05557 <span class="keywordflow">case</span> SL:
  5548. <a name="l05558"></a>05558 <span class="keywordflow">case</span> SD:
  5549. <a name="l05559"></a>05559 <span class="keywordflow">case</span> SRX:
  5550. <a name="l05560"></a>05560 <span class="keywordflow">case</span> SUX:
  5551. <a name="l05561"></a>05561 <span class="keywordflow">case</span> SLX:
  5552. <a name="l05562"></a>05562 <span class="keywordflow">case</span> SDX:
  5553. <a name="l05563"></a>05563 {
  5554. <a name="l05564"></a>05564 <span class="keywordflow">if</span> (op(right, up, left, down)) {
  5555. <a name="l05565"></a>05565 nextstate = U; <span class="comment">// blank</span>
  5556. <a name="l05566"></a>05566 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (wce(state, right, up, left, down) ||
  5557. <a name="l05567"></a>05567 wsp(state, right, up, left, down)) {
  5558. <a name="l05568"></a>05568 nextstate |= EX; <span class="comment">// excited</span>
  5559. <a name="l05569"></a>05569 } <span class="keywordflow">else</span> {
  5560. <a name="l05570"></a>05570 nextstate &amp;= NX; <span class="comment">// not excited</span>
  5561. <a name="l05571"></a>05571 } <span class="comment">// if</span>
  5562. <a name="l05572"></a>05572 <span class="keywordflow">break</span>;
  5563. <a name="l05573"></a>05573 } <span class="comment">// case</span>
  5564. <a name="l05574"></a>05574
  5565. <a name="l05575"></a>05575 <span class="keywordflow">case</span> C00:
  5566. <a name="l05576"></a>05576 <span class="keywordflow">case</span> C10:
  5567. <a name="l05577"></a>05577 <span class="keywordflow">case</span> C01:
  5568. <a name="l05578"></a>05578 <span class="keywordflow">case</span> C11:
  5569. <a name="l05579"></a>05579 {
  5570. <a name="l05580"></a>05580 <span class="keywordflow">if</span> (sp(right, up, left, down)) {
  5571. <a name="l05581"></a>05581 nextstate = U; <span class="comment">// blank</span>
  5572. <a name="l05582"></a>05582 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cascade(right, up, left, down)) {
  5573. <a name="l05583"></a>05583 nextstate = excite(state);
  5574. <a name="l05584"></a>05584 } <span class="keywordflow">else</span> {
  5575. <a name="l05585"></a>05585 nextstate = decay(state);
  5576. <a name="l05586"></a>05586 } <span class="comment">// if</span>
  5577. <a name="l05587"></a>05587 <span class="keywordflow">break</span>;
  5578. <a name="l05588"></a>05588 } <span class="comment">// case</span>
  5579. <a name="l05589"></a>05589
  5580. <a name="l05590"></a>05590 <span class="keywordflow">case</span> S: <span class="comment">// sensitized state</span>
  5581. <a name="l05591"></a>05591 {
  5582. <a name="l05592"></a>05592 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5583. <a name="l05593"></a>05593 nextstate = S1;
  5584. <a name="l05594"></a>05594 } <span class="keywordflow">else</span> {
  5585. <a name="l05595"></a>05595 nextstate = S0;
  5586. <a name="l05596"></a>05596 } <span class="comment">// if</span>
  5587. <a name="l05597"></a>05597 <span class="keywordflow">break</span>;
  5588. <a name="l05598"></a>05598 } <span class="comment">// case</span>
  5589. <a name="l05599"></a>05599
  5590. <a name="l05600"></a>05600 <span class="keywordflow">case</span> S0: <span class="comment">// sensitized state</span>
  5591. <a name="l05601"></a>05601 {
  5592. <a name="l05602"></a>05602 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5593. <a name="l05603"></a>05603 nextstate = S01;
  5594. <a name="l05604"></a>05604 } <span class="keywordflow">else</span> {
  5595. <a name="l05605"></a>05605 nextstate = S00;
  5596. <a name="l05606"></a>05606 } <span class="comment">// if</span>
  5597. <a name="l05607"></a>05607 <span class="keywordflow">break</span>;
  5598. <a name="l05608"></a>05608 } <span class="comment">// case</span>
  5599. <a name="l05609"></a>05609
  5600. <a name="l05610"></a>05610 <span class="keywordflow">case</span> S1: <span class="comment">// sensitized state</span>
  5601. <a name="l05611"></a>05611 {
  5602. <a name="l05612"></a>05612 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5603. <a name="l05613"></a>05613 nextstate = S11;
  5604. <a name="l05614"></a>05614 } <span class="keywordflow">else</span> {
  5605. <a name="l05615"></a>05615 nextstate = S10;
  5606. <a name="l05616"></a>05616 } <span class="comment">// if</span>
  5607. <a name="l05617"></a>05617 <span class="keywordflow">break</span>;
  5608. <a name="l05618"></a>05618 } <span class="comment">// case</span>
  5609. <a name="l05619"></a>05619
  5610. <a name="l05620"></a>05620 <span class="keywordflow">case</span> S00: <span class="comment">// sensitized state</span>
  5611. <a name="l05621"></a>05621 {
  5612. <a name="l05622"></a>05622 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5613. <a name="l05623"></a>05623 nextstate = OL;
  5614. <a name="l05624"></a>05624 } <span class="keywordflow">else</span> {
  5615. <a name="l05625"></a>05625 nextstate = S000;
  5616. <a name="l05626"></a>05626 } <span class="comment">// if</span>
  5617. <a name="l05627"></a>05627 <span class="keywordflow">break</span>;
  5618. <a name="l05628"></a>05628 } <span class="comment">// case</span>
  5619. <a name="l05629"></a>05629
  5620. <a name="l05630"></a>05630 <span class="keywordflow">case</span> S01: <span class="comment">// sensitized state</span>
  5621. <a name="l05631"></a>05631 {
  5622. <a name="l05632"></a>05632 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5623. <a name="l05633"></a>05633 nextstate = SR;
  5624. <a name="l05634"></a>05634 } <span class="keywordflow">else</span> {
  5625. <a name="l05635"></a>05635 nextstate = OD;
  5626. <a name="l05636"></a>05636 } <span class="comment">// if</span>
  5627. <a name="l05637"></a>05637 <span class="keywordflow">break</span>;
  5628. <a name="l05638"></a>05638 } <span class="comment">// case</span>
  5629. <a name="l05639"></a>05639
  5630. <a name="l05640"></a>05640 <span class="keywordflow">case</span> S10: <span class="comment">// sensitized state</span>
  5631. <a name="l05641"></a>05641 {
  5632. <a name="l05642"></a>05642 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5633. <a name="l05643"></a>05643 nextstate = SL;
  5634. <a name="l05644"></a>05644 } <span class="keywordflow">else</span> {
  5635. <a name="l05645"></a>05645 nextstate = SU;
  5636. <a name="l05646"></a>05646 } <span class="comment">// if</span>
  5637. <a name="l05647"></a>05647 <span class="keywordflow">break</span>;
  5638. <a name="l05648"></a>05648 } <span class="comment">// case</span>
  5639. <a name="l05649"></a>05649
  5640. <a name="l05650"></a>05650 <span class="keywordflow">case</span> S11: <span class="comment">// sensitized state</span>
  5641. <a name="l05651"></a>05651 {
  5642. <a name="l05652"></a>05652 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5643. <a name="l05653"></a>05653 nextstate = C00;
  5644. <a name="l05654"></a>05654 } <span class="keywordflow">else</span> {
  5645. <a name="l05655"></a>05655 nextstate = SD;
  5646. <a name="l05656"></a>05656 } <span class="comment">// if</span>
  5647. <a name="l05657"></a>05657 <span class="keywordflow">break</span>;
  5648. <a name="l05658"></a>05658 } <span class="comment">// case</span>
  5649. <a name="l05659"></a>05659
  5650. <a name="l05660"></a>05660 <span class="keywordflow">case</span> S000: <span class="comment">// sensitized state</span>
  5651. <a name="l05661"></a>05661 {
  5652. <a name="l05662"></a>05662 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
  5653. <a name="l05663"></a>05663 nextstate = OU;
  5654. <a name="l05664"></a>05664 } <span class="keywordflow">else</span> {
  5655. <a name="l05665"></a>05665 nextstate = OR;
  5656. <a name="l05666"></a>05666 } <span class="comment">// if</span>
  5657. <a name="l05667"></a>05667 <span class="keywordflow">break</span>;
  5658. <a name="l05668"></a>05668 } <span class="comment">// case</span>
  5659. <a name="l05669"></a>05669
  5660. <a name="l05670"></a>05670 <span class="keywordflow">default</span>:
  5661. <a name="l05671"></a>05671 {
  5662. <a name="l05672"></a>05672 nextstate = U;
  5663. <a name="l05673"></a>05673 <span class="keywordflow">break</span>;
  5664. <a name="l05674"></a>05674 } <span class="comment">// case</span>
  5665. <a name="l05675"></a>05675
  5666. <a name="l05676"></a>05676 } <span class="comment">// switch</span>
  5667. <a name="l05677"></a>05677
  5668. <a name="l05678"></a>05678 f[xx] = nextstate;
  5669. <a name="l05679"></a>05679
  5670. <a name="l05680"></a>05680 } <span class="comment">// for xx</span>
  5671. <a name="l05681"></a>05681 } <span class="comment">// for yy</span>
  5672. <a name="l05682"></a>05682
  5673. <a name="l05683"></a>05683 }
  5674. <a name="l05684"></a>05684
  5675. </pre></div></div>
  5676. <hr size="1"><address style="text-align: right;"><small>Generated on Wed Feb 2 09:19:21 2011 for Micropolis by&nbsp;
  5677. <a href="http://www.doxygen.org/index.html">
  5678. <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
  5679. </body>
  5680. </html>