/src/html/cellengine_8cpp-source.html
HTML | 5680 lines | 5679 code | 0 blank | 1 comment | 0 complexity | e4e0607d24ba5dd20d4b7aa0fe5661ea MD5 | raw file
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
- <title>Micropolis: CellEngine/src/cellengine.cpp Source File</title>
- <link href="doxygen.css" rel="stylesheet" type="text/css">
- <link href="tabs.css" rel="stylesheet" type="text/css">
- </head><body>
- <!-- Generated by Doxygen 1.5.6 -->
- <div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="main.html"><span>Main Page</span></a></li>
- <li><a href="pages.html"><span>Related Pages</span></a></li>
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <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>
- <a name="l00002"></a>00002 <span class="comment"> *</span>
- <a name="l00003"></a>00003 <span class="comment"> * Micropolis, Unix Version. This game was released for the Unix platform</span>
- <a name="l00004"></a>00004 <span class="comment"> * in or about 1990 and has been modified for inclusion in the One Laptop</span>
- <a name="l00005"></a>00005 <span class="comment"> * Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc. If</span>
- <a name="l00006"></a>00006 <span class="comment"> * you need assistance with this program, you may contact:</span>
- <a name="l00007"></a>00007 <span class="comment"> * http://wiki.laptop.org/go/Micropolis or email micropolis@laptop.org.</span>
- <a name="l00008"></a>00008 <span class="comment"> *</span>
- <a name="l00009"></a>00009 <span class="comment"> * This program is free software: you can redistribute it and/or modify</span>
- <a name="l00010"></a>00010 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
- <a name="l00011"></a>00011 <span class="comment"> * the Free Software Foundation, either version 3 of the License, or (at</span>
- <a name="l00012"></a>00012 <span class="comment"> * your option) any later version.</span>
- <a name="l00013"></a>00013 <span class="comment"> *</span>
- <a name="l00014"></a>00014 <span class="comment"> * This program is distributed in the hope that it will be useful, but</span>
- <a name="l00015"></a>00015 <span class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</span>
- <a name="l00016"></a>00016 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span>
- <a name="l00017"></a>00017 <span class="comment"> * General Public License for more details. You should have received a</span>
- <a name="l00018"></a>00018 <span class="comment"> * copy of the GNU General Public License along with this program. If</span>
- <a name="l00019"></a>00019 <span class="comment"> * not, see <http://www.gnu.org/licenses/>.</span>
- <a name="l00020"></a>00020 <span class="comment"> *</span>
- <a name="l00021"></a>00021 <span class="comment"> * ADDITIONAL TERMS per GNU GPL Section 7</span>
- <a name="l00022"></a>00022 <span class="comment"> *</span>
- <a name="l00023"></a>00023 <span class="comment"> * No trademark or publicity rights are granted. This license does NOT</span>
- <a name="l00024"></a>00024 <span class="comment"> * give you any right, title or interest in the trademark SimCity or any</span>
- <a name="l00025"></a>00025 <span class="comment"> * other Electronic Arts trademark. You may not distribute any</span>
- <a name="l00026"></a>00026 <span class="comment"> * modification of this program using the trademark SimCity or claim any</span>
- <a name="l00027"></a>00027 <span class="comment"> * affliation or association with Electronic Arts Inc. or its employees.</span>
- <a name="l00028"></a>00028 <span class="comment"> *</span>
- <a name="l00029"></a>00029 <span class="comment"> * Any propagation or conveyance of this program must include this</span>
- <a name="l00030"></a>00030 <span class="comment"> * copyright notice and these terms.</span>
- <a name="l00031"></a>00031 <span class="comment"> *</span>
- <a name="l00032"></a>00032 <span class="comment"> * If you convey this program (or any modifications of it) and assume</span>
- <a name="l00033"></a>00033 <span class="comment"> * contractual liability for the program to recipients of it, you agree</span>
- <a name="l00034"></a>00034 <span class="comment"> * to indemnify Electronic Arts for any liability that those contractual</span>
- <a name="l00035"></a>00035 <span class="comment"> * assumptions impose on Electronic Arts.</span>
- <a name="l00036"></a>00036 <span class="comment"> *</span>
- <a name="l00037"></a>00037 <span class="comment"> * You may not misrepresent the origins of this program; modified</span>
- <a name="l00038"></a>00038 <span class="comment"> * versions of the program must be marked as such and not identified as</span>
- <a name="l00039"></a>00039 <span class="comment"> * the original program.</span>
- <a name="l00040"></a>00040 <span class="comment"> *</span>
- <a name="l00041"></a>00041 <span class="comment"> * This disclaimer supplements the one included in the General Public</span>
- <a name="l00042"></a>00042 <span class="comment"> * License. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS</span>
- <a name="l00043"></a>00043 <span class="comment"> * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY</span>
- <a name="l00044"></a>00044 <span class="comment"> * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF</span>
- <a name="l00045"></a>00045 <span class="comment"> * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU. ELECTRONIC ARTS</span>
- <a name="l00046"></a>00046 <span class="comment"> * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,</span>
- <a name="l00047"></a>00047 <span class="comment"> * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,</span>
- <a name="l00048"></a>00048 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY</span>
- <a name="l00049"></a>00049 <span class="comment"> * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,</span>
- <a name="l00050"></a>00050 <span class="comment"> * USAGE, OR TRADE PRACTICE. ELECTRONIC ARTS DOES NOT WARRANT AGAINST</span>
- <a name="l00051"></a>00051 <span class="comment"> * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL</span>
- <a name="l00052"></a>00052 <span class="comment"> * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE</span>
- <a name="l00053"></a>00053 <span class="comment"> * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE</span>
- <a name="l00054"></a>00054 <span class="comment"> * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE</span>
- <a name="l00055"></a>00055 <span class="comment"> * CORRECTED. NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR</span>
- <a name="l00056"></a>00056 <span class="comment"> * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME</span>
- <a name="l00057"></a>00057 <span class="comment"> * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED</span>
- <a name="l00058"></a>00058 <span class="comment"> * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A</span>
- <a name="l00059"></a>00059 <span class="comment"> * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY</span>
- <a name="l00060"></a>00060 <span class="comment"> * NOT APPLY TO YOU.</span>
- <a name="l00061"></a>00061 <span class="comment"> */</span>
- <a name="l00062"></a>00062
- <a name="l00063"></a>00063
- <a name="l00065"></a>00065
- <a name="l00071"></a>00071 <span class="preprocessor">#include "stdafx.h"</span>
- <a name="l00072"></a>00072
- <a name="l00073"></a>00073
- <a name="l00075"></a>00075
- <a name="l00076"></a>00076
- <a name="l00091"></a>00091
- <a name="l00092"></a>00092
- <a name="l00093"></a>00093
- <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>[];
- <a name="l00095"></a>00095 <span class="keyword">static</span> <span class="keywordtype">int</span> ruleCount = -1;
- <a name="l00096"></a>00096
- <a name="l00097"></a>00097
- <a name="l00099"></a>00099
- <a name="l00100"></a>00100
- <a name="l00101"></a>00101 <span class="preprocessor">#define RANDOMS_COUNT 256</span>
- <a name="l00102"></a>00102 <span class="preprocessor"></span>
- <a name="l00103"></a>00103 <span class="keyword">static</span> <span class="keywordtype">long</span> randomsPrimed = 0;
- <a name="l00104"></a>00104 <span class="keyword">static</span> <span class="keywordtype">long</span> randoms[RANDOMS_COUNT];
- <a name="l00105"></a>00105 <span class="keyword">static</span> <span class="keywordtype">long</span> randomRead = 0;
- <a name="l00106"></a>00106 <span class="keyword">static</span> <span class="keywordtype">long</span> randomWrite = 0;
- <a name="l00107"></a>00107
- <a name="l00108"></a>00108
- <a name="l00109"></a>00109 <span class="keywordtype">void</span> PrimeRandoms()
- <a name="l00110"></a>00110 {
- <a name="l00111"></a>00111 <span class="keywordflow">if</span> (randomsPrimed) {
- <a name="l00112"></a>00112 <span class="keywordflow">return</span>;
- <a name="l00113"></a>00113 } <span class="comment">// if</span>
- <a name="l00114"></a>00114
- <a name="l00115"></a>00115 randomsPrimed = 1;
- <a name="l00116"></a>00116
- <a name="l00117"></a>00117 <span class="keywordtype">long</span> i;
- <a name="l00118"></a>00118 <span class="keywordflow">for</span> (i = 0; i < RANDOMS_COUNT; i++) {
- <a name="l00119"></a>00119 randoms[i] ^=
- <a name="l00120"></a>00120 <span class="preprocessor">#ifdef MACOS</span>
- <a name="l00121"></a>00121 <span class="preprocessor"></span> Random() ^
- <a name="l00122"></a>00122 (Random() >> 4) ^
- <a name="l00123"></a>00123 (Random() << 4);
- <a name="l00124"></a>00124 <span class="preprocessor">#else</span>
- <a name="l00125"></a>00125 <span class="preprocessor"></span> rand() ^
- <a name="l00126"></a>00126 (rand() >> 4) ^
- <a name="l00127"></a>00127 (rand() >> 8) ^
- <a name="l00128"></a>00128 (rand() << 4);
- <a name="l00129"></a>00129 <span class="preprocessor">#endif</span>
- <a name="l00130"></a>00130 <span class="preprocessor"></span> }
- <a name="l00131"></a>00131
- <a name="l00132"></a>00132 randomRead = 0;
- <a name="l00133"></a>00133 randomWrite = 0;
- <a name="l00134"></a>00134 }
- <a name="l00135"></a>00135
- <a name="l00136"></a>00136
- <a name="l00137"></a>00137 <span class="keywordtype">void</span> FeedRandom(
- <a name="l00138"></a>00138 <span class="keywordtype">long</span> food)
- <a name="l00139"></a>00139 {
- <a name="l00140"></a>00140 randomWrite--;
- <a name="l00141"></a>00141 <span class="keywordflow">if</span> (randomWrite < 0) {
- <a name="l00142"></a>00142 randomWrite = RANDOMS_COUNT - 1;
- <a name="l00143"></a>00143 }
- <a name="l00144"></a>00144 randoms[randomWrite] ^= food;
- <a name="l00145"></a>00145 }
- <a name="l00146"></a>00146
- <a name="l00147"></a>00147
- <a name="l00148"></a>00148 <span class="keywordtype">long</span> Rand32()
- <a name="l00149"></a>00149 {
- <a name="l00150"></a>00150 PrimeRandoms();
- <a name="l00151"></a>00151
- <a name="l00152"></a>00152 randomRead++;
- <a name="l00153"></a>00153 <span class="keywordflow">if</span> (randomRead >= RANDOMS_COUNT) {
- <a name="l00154"></a>00154 randomRead = 0;
- <a name="l00155"></a>00155 }
- <a name="l00156"></a>00156
- <a name="l00157"></a>00157 <span class="keywordtype">long</span> result = randoms[randomRead];
- <a name="l00158"></a>00158
- <a name="l00159"></a>00159 <span class="comment">// TODO: make a better hasher</span>
- <a name="l00160"></a>00160 <span class="preprocessor">#ifdef MACOS</span>
- <a name="l00161"></a>00161 <span class="preprocessor"></span> randoms[randomRead] ^= Random();
- <a name="l00162"></a>00162 <span class="preprocessor">#else</span>
- <a name="l00163"></a>00163 <span class="preprocessor"></span> <span class="keywordtype">int</span> r = rand() ^ (rand() << 8);
- <a name="l00164"></a>00164 randoms[randomRead] ^= r;
- <a name="l00165"></a>00165 <span class="preprocessor">#endif</span>
- <a name="l00166"></a>00166 <span class="preprocessor"></span>
- <a name="l00167"></a>00167 <span class="keywordflow">return</span> result;
- <a name="l00168"></a>00168 }
- <a name="l00169"></a>00169
- <a name="l00170"></a>00170
- <a name="l00171"></a>00171 <span class="keywordtype">long</span> Rand16()
- <a name="l00172"></a>00172 {
- <a name="l00173"></a>00173 <span class="keywordflow">return</span> Rand32() & 0xffff;
- <a name="l00174"></a>00174 }
- <a name="l00175"></a>00175
- <a name="l00176"></a>00176
- <a name="l00177"></a>00177 <span class="keywordtype">long</span> Rand8()
- <a name="l00178"></a>00178 {
- <a name="l00179"></a>00179 <span class="keywordflow">return</span> Rand32() & 0xff;
- <a name="l00180"></a>00180 }
- <a name="l00181"></a>00181
- <a name="l00182"></a>00182
- <a name="l00184"></a>00184
- <a name="l00185"></a>00185
- <a name="l00186"></a>00186 <span class="preprocessor">#ifdef DOSOUND</span>
- <a name="l00187"></a>00187 <span class="preprocessor"></span>
- <a name="l00188"></a>00188 <span class="keyword">class </span>SoundEvent {
- <a name="l00189"></a>00189 <span class="keywordtype">long</span> x;
- <a name="l00190"></a>00190 <span class="keywordtype">long</span> y;
- <a name="l00191"></a>00191 <span class="keywordtype">long</span> w;
- <a name="l00192"></a>00192 <span class="keywordtype">long</span> h;
- <a name="l00193"></a>00193 <span class="keywordtype">long</span> s;
- <a name="l00194"></a>00194 <span class="keyword">static</span> std::vector<SoundEvent> queue;
- <a name="l00195"></a>00195
- <a name="l00196"></a>00196 <span class="keyword">public</span>:
- <a name="l00197"></a>00197
- <a name="l00198"></a>00198 SoundEvent(
- <a name="l00199"></a>00199 <span class="keywordtype">long</span> xx,
- <a name="l00200"></a>00200 <span class="keywordtype">long</span> yy,
- <a name="l00201"></a>00201 <span class="keywordtype">long</span> ww,
- <a name="l00202"></a>00202 <span class="keywordtype">long</span> hh,
- <a name="l00203"></a>00203 <span class="keywordtype">long</span> ss) :
- <a name="l00204"></a>00204 x(xx),
- <a name="l00205"></a>00205 y(yy),
- <a name="l00206"></a>00206 w(ww),
- <a name="l00207"></a>00207 h(hh),
- <a name="l00208"></a>00208 s(ss)
- <a name="l00209"></a>00209 {
- <a name="l00210"></a>00210 }
- <a name="l00211"></a>00211
- <a name="l00212"></a>00212 SoundEvent();
- <a name="l00213"></a>00213
- <a name="l00214"></a>00214 ~SoundEvent()
- <a name="l00215"></a>00215 {
- <a name="l00216"></a>00216 }
- <a name="l00217"></a>00217
- <a name="l00218"></a>00218 <span class="keyword">static</span> <span class="keywordtype">void</span> Queue(
- <a name="l00219"></a>00219 <span class="keywordtype">long</span> xx,
- <a name="l00220"></a>00220 <span class="keywordtype">long</span> yy,
- <a name="l00221"></a>00221 <span class="keywordtype">long</span> ww,
- <a name="l00222"></a>00222 <span class="keywordtype">long</span> hh,
- <a name="l00223"></a>00223 <span class="keywordtype">long</span> ss)
- <a name="l00224"></a>00224 {
- <a name="l00225"></a>00225 queue.push_back(
- <a name="l00226"></a>00226 SoundEvent(
- <a name="l00227"></a>00227 xx,
- <a name="l00228"></a>00228 yy,
- <a name="l00229"></a>00229 ww,
- <a name="l00230"></a>00230 hh,
- <a name="l00231"></a>00231 ss));
- <a name="l00232"></a>00232 }
- <a name="l00233"></a>00233
- <a name="l00234"></a>00234 <span class="keyword">static</span> <span class="keywordtype">void</span> ClearQueue()
- <a name="l00235"></a>00235 {
- <a name="l00236"></a>00236 queue.erase(
- <a name="l00237"></a>00237 queue.begin(),
- <a name="l00238"></a>00238 queue.end());
- <a name="l00239"></a>00239 }
- <a name="l00240"></a>00240
- <a name="l00241"></a>00241 <span class="keywordtype">void</span> Play(<span class="keywordtype">float</span> vol)
- <a name="l00242"></a>00242 {
- <a name="l00243"></a>00243 <span class="keywordtype">float</span> speed =
- <a name="l00244"></a>00244 (float)0.2 +
- <a name="l00245"></a>00245 (((<span class="keywordtype">float</span>)2.0 *
- <a name="l00246"></a>00246 (<span class="keywordtype">float</span>)(h - y) /
- <a name="l00247"></a>00247 (<span class="keywordtype">float</span>)h));
- <a name="l00248"></a>00248 <span class="keywordtype">float</span> pan = ((float)2.0 *
- <a name="l00249"></a>00249 (<span class="keywordtype">float</span>)x /
- <a name="l00250"></a>00250 (float)w) - (float)1.0;
- <a name="l00251"></a>00251 <span class="preprocessor">#ifdef TODO</span>
- <a name="l00252"></a>00252 <span class="preprocessor"></span> PlayWave(
- <a name="l00253"></a>00253 s, <span class="comment">// wave#</span>
- <a name="l00254"></a>00254 0, <span class="comment">// looping</span>
- <a name="l00255"></a>00255 speed,
- <a name="l00256"></a>00256 vol,
- <a name="l00257"></a>00257 pan);
- <a name="l00258"></a>00258 <span class="preprocessor">#endif</span>
- <a name="l00259"></a>00259 <span class="preprocessor"></span> }
- <a name="l00260"></a>00260
- <a name="l00261"></a>00261 <span class="keyword">static</span> <span class="keywordtype">void</span> PlayReverse(<span class="keywordtype">float</span> vol)
- <a name="l00262"></a>00262 {
- <a name="l00263"></a>00263 <span class="keywordtype">int</span> count = queue.size();
- <a name="l00264"></a>00264 <span class="keywordtype">int</span> i = count - 1;
- <a name="l00265"></a>00265 <span class="keywordflow">while</span> (i >= 0) {
- <a name="l00266"></a>00266 <span class="keywordtype">long</span> r = Rand8();
- <a name="l00267"></a>00267 <span class="keywordflow">if</span> ((count < 10) ||
- <a name="l00268"></a>00268 ((r = Rand8()) < 50)) {
- <a name="l00269"></a>00269 <span class="keywordflow">if</span> ((count < 50) ||
- <a name="l00270"></a>00270 (r < 10)) {
- <a name="l00271"></a>00271 queue[i].Play(vol);
- <a name="l00272"></a>00272 } <span class="comment">// if</span>
- <a name="l00273"></a>00273 } <span class="comment">// if</span>
- <a name="l00274"></a>00274
- <a name="l00275"></a>00275 i--;
- <a name="l00276"></a>00276 } <span class="comment">// while</span>
- <a name="l00277"></a>00277
- <a name="l00278"></a>00278 }
- <a name="l00279"></a>00279
- <a name="l00280"></a>00280 <span class="keyword">static</span> <span class="keywordtype">void</span> PlayQueue()
- <a name="l00281"></a>00281 {
- <a name="l00282"></a>00282 <span class="keywordflow">if</span> (queue.size() > 0) {
- <a name="l00283"></a>00283 <span class="keywordtype">float</span> vol = (float)0.75 +
- <a name="l00284"></a>00284 ((<span class="keywordtype">float</span>)0.25 *
- <a name="l00285"></a>00285 (float)sqrt((<span class="keywordtype">float</span>)1.0 / queue.size()));
- <a name="l00286"></a>00286 PlayReverse(vol);
- <a name="l00287"></a>00287 ClearQueue();
- <a name="l00288"></a>00288 }
- <a name="l00289"></a>00289 }
- <a name="l00290"></a>00290 };
- <a name="l00291"></a>00291
- <a name="l00292"></a>00292 std::vector<SoundEvent> SoundEvent::queue;
- <a name="l00293"></a>00293
- <a name="l00294"></a>00294 <span class="preprocessor">#endif</span>
- <a name="l00295"></a>00295 <span class="preprocessor"></span>
- <a name="l00296"></a>00296
- <a name="l00298"></a>00298
- <a name="l00299"></a>00299
- <a name="l00300"></a>00300 CellEngine::CellEngine()
- <a name="l00301"></a>00301 {
- <a name="l00302"></a>00302 Init();
- <a name="l00303"></a>00303 }
- <a name="l00304"></a>00304
- <a name="l00305"></a>00305
- <a name="l00306"></a>00306 <span class="keywordtype">void</span> CellEngine::Init()
- <a name="l00307"></a>00307 {
- <a name="l00308"></a>00308 name = <span class="stringliteral">""</span>;
- <a name="l00309"></a>00309 screenMem = NULL;
- <a name="l00310"></a>00310 screenWidth = 0;
- <a name="l00311"></a>00311 screenHeight = 0;
- <a name="l00312"></a>00312 screenRowBytes = 0;
- <a name="l00313"></a>00313 backMem = NULL;
- <a name="l00314"></a>00314 backSize = 0;
- <a name="l00315"></a>00315 backRowBytes = 0;
- <a name="l00316"></a>00316 backWidth = 0;
- <a name="l00317"></a>00317 backHeight = 0;
- <a name="l00318"></a>00318 backBorder = 2;
- <a name="l00319"></a>00319 frontMem = NULL;
- <a name="l00320"></a>00320 maskMem = NULL;
- <a name="l00321"></a>00321 maskRowBytes = 0;
- <a name="l00322"></a>00322 maskWidth = 0;
- <a name="l00323"></a>00323 maskHeight = 0;
- <a name="l00324"></a>00324 masked = 0;
- <a name="l00325"></a>00325 neighborhood = 33; <span class="comment">// garble</span>
- <a name="l00326"></a>00326 rule = NULL;
- <a name="l00327"></a>00327 ruleStatic = 0;
- <a name="l00328"></a>00328 ruleSize = 0;
- <a name="l00329"></a>00329 ruleName = NULL;
- <a name="l00330"></a>00330 x = 0;
- <a name="l00331"></a>00331 y = 0;
- <a name="l00332"></a>00332 dx = 0;
- <a name="l00333"></a>00333 dy = 0;
- <a name="l00334"></a>00334 width = 0;
- <a name="l00335"></a>00335 height = 0;
- <a name="l00336"></a>00336 idealWidth = 0;
- <a name="l00337"></a>00337 idealHeight = 0;
- <a name="l00338"></a>00338 phase = 0;
- <a name="l00339"></a>00339 ticks = 0;
- <a name="l00340"></a>00340 wrap = 5;
- <a name="l00341"></a>00341 steps = 1;
- <a name="l00342"></a>00342 frob = -1;
- <a name="l00343"></a>00343 rumble = 0;
- <a name="l00344"></a>00344 rumblemax = 0;
- <a name="l00345"></a>00345 hubba = 0;
- <a name="l00346"></a>00346 inflation = 0;
- <a name="l00347"></a>00347 high = 255;
- <a name="l00348"></a>00348 low = 0;
- <a name="l00349"></a>00349 maskClip = 0;
- <a name="l00350"></a>00350 moveImage = 0;
- <a name="l00351"></a>00351 numbera = 0;
- <a name="l00352"></a>00352 numberb = 0;
- <a name="l00353"></a>00353 numberc = 0;
- <a name="l00354"></a>00354 anglea = 0;
- <a name="l00355"></a>00355 angleb = 0;
- <a name="l00356"></a>00356 anglec = 0;
- <a name="l00357"></a>00357 pointax = 0;
- <a name="l00358"></a>00358 pointay = 0;
- <a name="l00359"></a>00359 pointbx = 0;
- <a name="l00360"></a>00360 pointby = 0;
- <a name="l00361"></a>00361 pointcx = 0;
- <a name="l00362"></a>00362 pointcy = 0;
- <a name="l00363"></a>00363 clipRects = 0;
- <a name="l00364"></a>00364 rectList = NULL;
- <a name="l00365"></a>00365 skips = 0;
- <a name="l00366"></a>00366 skip = 0;
- <a name="l00367"></a>00367 total = 0;
- <a name="l00368"></a>00368 tracking = 0;
- <a name="l00369"></a>00369 action = 8 + 2;
- <a name="l00370"></a>00370 downx = 0;
- <a name="l00371"></a>00371 downy = 0;
- <a name="l00372"></a>00372 grabx = 0;
- <a name="l00373"></a>00373 graby = 0;
- <a name="l00374"></a>00374 lastx = 0;
- <a name="l00375"></a>00375 lasty = 0;
- <a name="l00376"></a>00376 saveskips = 0;
- <a name="l00377"></a>00377 still = 0;
- <a name="l00378"></a>00378 gravx = 0;
- <a name="l00379"></a>00379 gravy = 0;
- <a name="l00380"></a>00380 grabbable = 1;
- <a name="l00381"></a>00381 data = NULL;
- <a name="l00382"></a>00382
- <a name="l00383"></a>00383 SetSize(16, 16);
- <a name="l00384"></a>00384 }
- <a name="l00385"></a>00385
- <a name="l00386"></a>00386
- <a name="l00387"></a>00387 CellEngine::~CellEngine()
- <a name="l00388"></a>00388 {
- <a name="l00389"></a>00389 <span class="keywordflow">if</span> (backMem != NULL) {
- <a name="l00390"></a>00390 <span class="keyword">delete</span> [] backMem;
- <a name="l00391"></a>00391 backMem = NULL;
- <a name="l00392"></a>00392 }
- <a name="l00393"></a>00393
- <a name="l00394"></a>00394 <span class="preprocessor">#if 0</span>
- <a name="l00395"></a>00395 <span class="preprocessor"></span> <span class="keywordflow">if</span> (maskMem != NULL) {
- <a name="l00396"></a>00396 <span class="keyword">delete</span> [] maskMem;
- <a name="l00397"></a>00397 maskMem = NULL;
- <a name="l00398"></a>00398 }
- <a name="l00399"></a>00399 <span class="preprocessor">#endif</span>
- <a name="l00400"></a>00400 <span class="preprocessor"></span>
- <a name="l00401"></a>00401 <span class="keywordflow">if</span> ((rule != NULL) &&
- <a name="l00402"></a>00402 (!ruleStatic)) {
- <a name="l00403"></a>00403 <span class="keyword">delete</span> [] rule;
- <a name="l00404"></a>00404 rule = NULL;
- <a name="l00405"></a>00405 }
- <a name="l00406"></a>00406
- <a name="l00407"></a>00407 <span class="keywordflow">if</span> (ruleName != NULL) {
- <a name="l00408"></a>00408 <span class="keyword">delete</span> [] ruleName;
- <a name="l00409"></a>00409 ruleName = NULL;
- <a name="l00410"></a>00410 }
- <a name="l00411"></a>00411
- <a name="l00412"></a>00412 <span class="keywordflow">if</span> (rectList != NULL) {
- <a name="l00413"></a>00413 <span class="keyword">delete</span> [] rectList;
- <a name="l00414"></a>00414 rectList = NULL;
- <a name="l00415"></a>00415 }
- <a name="l00416"></a>00416
- <a name="l00417"></a>00417 <span class="keywordflow">if</span> (screenMem != NULL) {
- <a name="l00418"></a>00418 <span class="keyword">delete</span> [] screenMem;
- <a name="l00419"></a>00419 screenMem = NULL;
- <a name="l00420"></a>00420 }
- <a name="l00421"></a>00421
- <a name="l00422"></a>00422 }
- <a name="l00423"></a>00423
- <a name="l00424"></a>00424
- <a name="l00425"></a>00425 <span class="keywordtype">void</span> CellEngine::InitScreen(
- <a name="l00426"></a>00426 <span class="keywordtype">long</span> ww,
- <a name="l00427"></a>00427 <span class="keywordtype">long</span> hh)
- <a name="l00428"></a>00428 {
- <a name="l00429"></a>00429 <span class="keywordflow">if</span> (screenMem != NULL) {
- <a name="l00430"></a>00430 <span class="keyword">delete</span> [] screenMem;
- <a name="l00431"></a>00431 }
- <a name="l00432"></a>00432
- <a name="l00433"></a>00433 screenWidth = ww;
- <a name="l00434"></a>00434 screenHeight = hh;
- <a name="l00435"></a>00435 screenRowBytes = (ww + 3) & ~3;
- <a name="l00436"></a>00436 screenMem = <span class="keyword">new</span> Byte[screenRowBytes * screenHeight];
- <a name="l00437"></a>00437
- <a name="l00438"></a>00438 SetPos(0, 0);
- <a name="l00439"></a>00439 }
- <a name="l00440"></a>00440
- <a name="l00441"></a>00441
- <a name="l00442"></a>00442 <span class="keywordtype">void</span> CellEngine::SetRect(
- <a name="l00443"></a>00443 <span class="keywordtype">long</span> xx,
- <a name="l00444"></a>00444 <span class="keywordtype">long</span> yy,
- <a name="l00445"></a>00445 <span class="keywordtype">long</span> ww,
- <a name="l00446"></a>00446 <span class="keywordtype">long</span> hh)
- <a name="l00447"></a>00447 {
- <a name="l00448"></a>00448 <span class="keywordtype">long</span> w2;
- <a name="l00449"></a>00449 <span class="keywordtype">long</span> h2;
- <a name="l00450"></a>00450 <span class="keywordtype">long</span> rb;
- <a name="l00451"></a>00451 <span class="keywordtype">long</span> size;
- <a name="l00452"></a>00452
- <a name="l00453"></a>00453 idealWidth = ww;
- <a name="l00454"></a>00454 idealHeight = hh;
- <a name="l00455"></a>00455 ww = (ww + 3) & ~3;
- <a name="l00456"></a>00456
- <a name="l00457"></a>00457 w2 = backBorder + ww + backBorder;
- <a name="l00458"></a>00458 h2 = backBorder + hh + backBorder;
- <a name="l00459"></a>00459 rb = (w2 + 3) & (~3);
- <a name="l00460"></a>00460 size = (rb * h2);
- <a name="l00461"></a>00461
- <a name="l00462"></a>00462 <span class="keywordflow">if</span> ((backMem == NULL) ||
- <a name="l00463"></a>00463 (backSize < size)) {
- <a name="l00464"></a>00464
- <a name="l00465"></a>00465 <span class="keywordflow">if</span> (backMem != NULL) {
- <a name="l00466"></a>00466 <span class="keyword">delete</span> [] backMem;
- <a name="l00467"></a>00467 }
- <a name="l00468"></a>00468
- <a name="l00469"></a>00469 <span class="comment">// inflate the size a bit if this isn't the first allocation</span>
- <a name="l00470"></a>00470 <span class="keywordflow">if</span> (backSize != 0) {
- <a name="l00471"></a>00471 size = (12 * size) / 10;
- <a name="l00472"></a>00472 }
- <a name="l00473"></a>00473
- <a name="l00474"></a>00474 backSize = size;
- <a name="l00475"></a>00475 backMem = <span class="keyword">new</span> Byte[size];
- <a name="l00476"></a>00476 }
- <a name="l00477"></a>00477
- <a name="l00478"></a>00478 width = ww;
- <a name="l00479"></a>00479 height = hh;
- <a name="l00480"></a>00480 backWidth = w2;
- <a name="l00481"></a>00481 backHeight = h2;
- <a name="l00482"></a>00482 backRowBytes = rb;
- <a name="l00483"></a>00483 SetPos(xx, yy);
- <a name="l00484"></a>00484 }
- <a name="l00485"></a>00485
- <a name="l00486"></a>00486
- <a name="l00487"></a>00487 <span class="keywordtype">void</span> CellEngine::SetPos(
- <a name="l00488"></a>00488 <span class="keywordtype">long</span> xx,
- <a name="l00489"></a>00489 <span class="keywordtype">long</span> yy)
- <a name="l00490"></a>00490 {
- <a name="l00491"></a>00491 x = xx;
- <a name="l00492"></a>00492 y = yy;
- <a name="l00493"></a>00493 frontMem =
- <a name="l00494"></a>00494 screenMem +
- <a name="l00495"></a>00495 xx +
- <a name="l00496"></a>00496 (screenRowBytes * yy);
- <a name="l00497"></a>00497 }
- <a name="l00498"></a>00498
- <a name="l00499"></a>00499
- <a name="l00500"></a>00500 <span class="keywordtype">void</span> CellEngine::SetSize(
- <a name="l00501"></a>00501 <span class="keywordtype">long</span> ww,
- <a name="l00502"></a>00502 <span class="keywordtype">long</span> hh)
- <a name="l00503"></a>00503 {
- <a name="l00504"></a>00504 SetRect(x, y, ww, hh);
- <a name="l00505"></a>00505 }
- <a name="l00506"></a>00506
- <a name="l00507"></a>00507
- <a name="l00508"></a>00508 <span class="keywordtype">void</span> CellEngine::ForceOnScreen()
- <a name="l00509"></a>00509 {
- <a name="l00510"></a>00510 <span class="keywordtype">int</span> hangout;
- <a name="l00511"></a>00511 <span class="keywordtype">int</span> xx = x;
- <a name="l00512"></a>00512 <span class="keywordtype">int</span> yy = y;
- <a name="l00513"></a>00513 <span class="keywordtype">int</span> ww = idealWidth;
- <a name="l00514"></a>00514 <span class="keywordtype">int</span> hh = idealHeight;
- <a name="l00515"></a>00515 <span class="keywordtype">int</span> ww2 = width;
- <a name="l00516"></a>00516 <span class="keywordtype">int</span> hh2 = height;
- <a name="l00517"></a>00517
- <a name="l00518"></a>00518 hangout = (xx + ww2) - screenWidth;
- <a name="l00519"></a>00519 <span class="keywordflow">if</span> (hangout > 0) {
- <a name="l00520"></a>00520 xx -= hangout;
- <a name="l00521"></a>00521 }
- <a name="l00522"></a>00522 hangout = (yy + hh2) - screenHeight;
- <a name="l00523"></a>00523 <span class="keywordflow">if</span> (hangout > 0) {
- <a name="l00524"></a>00524 yy -= hangout;
- <a name="l00525"></a>00525 }
- <a name="l00526"></a>00526 hangout = -xx;
- <a name="l00527"></a>00527 <span class="keywordflow">if</span> (hangout > 0) {
- <a name="l00528"></a>00528 xx += hangout;
- <a name="l00529"></a>00529 }
- <a name="l00530"></a>00530 hangout = -yy;
- <a name="l00531"></a>00531 <span class="keywordflow">if</span> (hangout > 0) {
- <a name="l00532"></a>00532 yy -= hangout;
- <a name="l00533"></a>00533 }
- <a name="l00534"></a>00534 <span class="keywordflow">if</span> ((xx + ww2) > screenWidth) {
- <a name="l00535"></a>00535 ww = screenWidth - xx;
- <a name="l00536"></a>00536 }
- <a name="l00537"></a>00537 <span class="keywordflow">if</span> ((yy + hh2) > screenHeight) {
- <a name="l00538"></a>00538 hh = screenHeight - yy;
- <a name="l00539"></a>00539 }
- <a name="l00540"></a>00540
- <a name="l00541"></a>00541 SetRect(xx, yy, ww, hh);
- <a name="l00542"></a>00542 }
- <a name="l00543"></a>00543
- <a name="l00544"></a>00544
- <a name="l00545"></a>00545 <span class="keywordtype">long</span> CellEngine::OnScreen()
- <a name="l00546"></a>00546 {
- <a name="l00547"></a>00547 <span class="keywordflow">return</span> ((screenMem != NULL) &&
- <a name="l00548"></a>00548 (x >= 0) &&
- <a name="l00549"></a>00549 (y >= 0) &&
- <a name="l00550"></a>00550 ((x + width) <= screenWidth) &&
- <a name="l00551"></a>00551 ((y + height) <= screenHeight));
- <a name="l00552"></a>00552 }
- <a name="l00553"></a>00553
- <a name="l00554"></a>00554
- <a name="l00555"></a>00555 <span class="keywordtype">void</span> CellEngine::Garble()
- <a name="l00556"></a>00556 {
- <a name="l00557"></a>00557
- <a name="l00558"></a>00558 <span class="keywordflow">if</span> (!OnScreen()) {
- <a name="l00559"></a>00559 <span class="keywordflow">return</span>;
- <a name="l00560"></a>00560 }
- <a name="l00561"></a>00561
- <a name="l00562"></a>00562 <span class="keywordtype">long</span> xx, yy;
- <a name="l00563"></a>00563 Byte *image = frontMem;
- <a name="l00564"></a>00564
- <a name="l00565"></a>00565 <span class="keywordflow">for</span> (yy = 0;
- <a name="l00566"></a>00566 yy < height;
- <a name="l00567"></a>00567 yy++, image += screenRowBytes) {
- <a name="l00568"></a>00568 <span class="keywordflow">for</span> (xx = 0;
- <a name="l00569"></a>00569 xx < width;
- <a name="l00570"></a>00570 xx++) {
- <a name="l00571"></a>00571 image[xx] ^= (char)(Rand16() >> 4);
- <a name="l00572"></a>00572 }
- <a name="l00573"></a>00573 }
- <a name="l00574"></a>00574 }
- <a name="l00575"></a>00575
- <a name="l00576"></a>00576
- <a name="l00577"></a>00577 <span class="keywordtype">void</span> CellEngine::GarbleRect(
- <a name="l00578"></a>00578 <span class="keywordtype">long</span> xx,
- <a name="l00579"></a>00579 <span class="keywordtype">long</span> yy,
- <a name="l00580"></a>00580 <span class="keywordtype">long</span> ww,
- <a name="l00581"></a>00581 <span class="keywordtype">long</span> hh)
- <a name="l00582"></a>00582 {
- <a name="l00583"></a>00583 Byte *image;
- <a name="l00584"></a>00584 <span class="keywordtype">long</span> x0, y0, x1, y1;
- <a name="l00585"></a>00585
- <a name="l00586"></a>00586 <span class="keywordflow">if</span> (!OnScreen()) {
- <a name="l00587"></a>00587 <span class="keywordflow">return</span>;
- <a name="l00588"></a>00588 }
- <a name="l00589"></a>00589
- <a name="l00590"></a>00590 <span class="keywordflow">if</span> (xx < 0) x0 = 0; <span class="keywordflow">else</span> x0 = xx;
- <a name="l00591"></a>00591 <span class="keywordflow">if</span> (yy < 0) y0 = 0; <span class="keywordflow">else</span> y0 = yy;
- <a name="l00592"></a>00592 <span class="keywordflow">if</span> (xx + ww > width) x1 = width; <span class="keywordflow">else</span> x1 = xx + ww;
- <a name="l00593"></a>00593 <span class="keywordflow">if</span> (yy + hh > height) y1 = height; <span class="keywordflow">else</span> y1 = yy + ww;
- <a name="l00594"></a>00594
- <a name="l00595"></a>00595 <span class="keywordflow">if</span> ((x0 < x1) && (y0 < y1)) {
- <a name="l00596"></a>00596 image = frontMem;
- <a name="l00597"></a>00597
- <a name="l00598"></a>00598 <span class="keywordflow">for</span> (yy = y0;
- <a name="l00599"></a>00599 yy < y1;
- <a name="l00600"></a>00600 yy++, image += screenRowBytes) {
- <a name="l00601"></a>00601 <span class="keywordflow">for</span> (xx = x0;
- <a name="l00602"></a>00602 xx < x1;
- <a name="l00603"></a>00603 xx++) {
- <a name="l00604"></a>00604 image[xx] ^= (char)(Rand16() >> 4);
- <a name="l00605"></a>00605 }
- <a name="l00606"></a>00606 }
- <a name="l00607"></a>00607 }
- <a name="l00608"></a>00608 }
- <a name="l00609"></a>00609
- <a name="l00610"></a>00610
- <a name="l00611"></a>00611 <span class="keywordtype">void</span> CellEngine::Fill(
- <a name="l00612"></a>00612 Byte c)
- <a name="l00613"></a>00613 {
- <a name="l00614"></a>00614 <span class="keywordflow">if</span> (!OnScreen()) {
- <a name="l00615"></a>00615 <span class="keywordflow">return</span>;
- <a name="l00616"></a>00616 }
- <a name="l00617"></a>00617
- <a name="l00618"></a>00618 Byte *image = frontMem;
- <a name="l00619"></a>00619
- <a name="l00620"></a>00620 <span class="keywordtype">long</span> yy;
- <a name="l00621"></a>00621 <span class="keywordflow">for</span> (yy = 0;
- <a name="l00622"></a>00622 yy < height;
- <a name="l00623"></a>00623 yy++, image += screenRowBytes) {
- <a name="l00624"></a>00624 <span class="keywordtype">long</span> xx;
- <a name="l00625"></a>00625 <span class="keywordflow">for</span> (xx = 0;
- <a name="l00626"></a>00626 xx < width;
- <a name="l00627"></a>00627 xx++) {
- <a name="l00628"></a>00628 image[xx] = c;
- <a name="l00629"></a>00629 }
- <a name="l00630"></a>00630 }
- <a name="l00631"></a>00631 }
- <a name="l00632"></a>00632
- <a name="l00633"></a>00633
- <a name="l00634"></a>00634 <span class="keywordtype">void</span> CellEngine::FillRect(
- <a name="l00635"></a>00635 Byte c,
- <a name="l00636"></a>00636 <span class="keywordtype">long</span> xx,
- <a name="l00637"></a>00637 <span class="keywordtype">long</span> yy,
- <a name="l00638"></a>00638 <span class="keywordtype">long</span> ww,
- <a name="l00639"></a>00639 <span class="keywordtype">long</span> hh)
- <a name="l00640"></a>00640 {
- <a name="l00641"></a>00641 Byte *image;
- <a name="l00642"></a>00642 <span class="keywordtype">long</span> x0, y0, x1, y1;
- <a name="l00643"></a>00643
- <a name="l00644"></a>00644 <span class="keywordflow">if</span> (!OnScreen()) {
- <a name="l00645"></a>00645 <span class="keywordflow">return</span>;
- <a name="l00646"></a>00646 }
- <a name="l00647"></a>00647
- <a name="l00648"></a>00648 <span class="keywordflow">if</span> (xx < 0) x0 = 0; <span class="keywordflow">else</span> x0 = xx;
- <a name="l00649"></a>00649 <span class="keywordflow">if</span> (yy < 0) y0 = 0; <span class="keywordflow">else</span> y0 = yy;
- <a name="l00650"></a>00650 <span class="keywordflow">if</span> (xx + ww > width) x1 = width; <span class="keywordflow">else</span> x1 = xx + ww;
- <a name="l00651"></a>00651 <span class="keywordflow">if</span> (yy + hh > height) y1 = height; <span class="keywordflow">else</span> y1 = yy + ww;
- <a name="l00652"></a>00652
- <a name="l00653"></a>00653 <span class="keywordflow">if</span> ((x0 < x1) && (y0 < y1)) {
- <a name="l00654"></a>00654 image = frontMem;
- <a name="l00655"></a>00655
- <a name="l00656"></a>00656 <span class="keywordflow">for</span> (yy = y0;
- <a name="l00657"></a>00657 yy < y1;
- <a name="l00658"></a>00658 yy++, image += screenRowBytes) {
- <a name="l00659"></a>00659 <span class="keywordflow">for</span> (xx = x0;
- <a name="l00660"></a>00660 xx < x1;
- <a name="l00661"></a>00661 xx++) {
- <a name="l00662"></a>00662 image[xx] = c;
- <a name="l00663"></a>00663 }
- <a name="l00664"></a>00664 }
- <a name="l00665"></a>00665 }
- <a name="l00666"></a>00666 }
- <a name="l00667"></a>00667
- <a name="l00668"></a>00668
- <a name="l00669"></a>00669 <span class="keywordtype">void</span> CellEngine::ResetMask()
- <a name="l00670"></a>00670 {
- <a name="l00671"></a>00671 <span class="keywordflow">if</span> (masked) {
- <a name="l00672"></a>00672 <span class="keywordflow">if</span> (maskMem != NULL) {
- <a name="l00673"></a>00673 maskMem = NULL;
- <a name="l00674"></a>00674 } <span class="comment">// if</span>
- <a name="l00675"></a>00675 maskWidth = 0;
- <a name="l00676"></a>00676 maskHeight = 0;
- <a name="l00677"></a>00677 maskRowBytes = 0;
- <a name="l00678"></a>00678 } <span class="comment">// if</span>
- <a name="l00679"></a>00679 masked = 0;
- <a name="l00680"></a>00680 UpdateClip();
- <a name="l00681"></a>00681 }
- <a name="l00682"></a>00682
- <a name="l00683"></a>00683
- <a name="l00684"></a>00684 <span class="keywordtype">void</span> CellEngine::SetMask(
- <a name="l00685"></a>00685 <span class="keywordtype">long</span> ww,
- <a name="l00686"></a>00686 <span class="keywordtype">long</span> hh,
- <a name="l00687"></a>00687 Byte *data,
- <a name="l00688"></a>00688 <span class="keywordtype">long</span> rb)
- <a name="l00689"></a>00689 {
- <a name="l00690"></a>00690 maskMem = data;
- <a name="l00691"></a>00691 maskRowBytes = rb;
- <a name="l00692"></a>00692 maskWidth = ww;
- <a name="l00693"></a>00693 maskHeight = hh;
- <a name="l00694"></a>00694 masked = 1;
- <a name="l00695"></a>00695 UpdateClip();
- <a name="l00696"></a>00696 }
- <a name="l00697"></a>00697
- <a name="l00698"></a>00698
- <a name="l00699"></a>00699 <span class="keywordtype">void</span> CellEngine::UpdateClip()
- <a name="l00700"></a>00700 {
- <a name="l00701"></a>00701 <span class="keywordflow">if</span> (rectList != NULL) {
- <a name="l00702"></a>00702 <span class="keyword">delete</span> [] rectList;
- <a name="l00703"></a>00703 rectList = NULL;
- <a name="l00704"></a>00704 clipRects = 0;
- <a name="l00705"></a>00705 } <span class="comment">// if</span>
- <a name="l00706"></a>00706
- <a name="l00707"></a>00707 <span class="keywordflow">if</span> (masked) {
- <a name="l00708"></a>00708 Byte *mem = maskMem;
- <a name="l00709"></a>00709 <span class="keywordtype">long</span> rectCount = 0;
- <a name="l00710"></a>00710 <span class="keywordtype">long</span> rectBufSize = 256;
- <a name="l00711"></a>00711 RECT *rects = <span class="keyword">new</span> RECT[rectBufSize];
- <a name="l00712"></a>00712 RECT *r = NULL;
- <a name="l00713"></a>00713 <span class="keywordtype">long</span> xx, yy;
- <a name="l00714"></a>00714 <span class="keywordtype">long</span> curRect = -1;
- <a name="l00715"></a>00715 <span class="keywordtype">long</span> aboveRect = -1;
- <a name="l00716"></a>00716 <span class="keywordflow">for</span> (yy = 0; yy < maskHeight; yy++) {
- <a name="l00717"></a>00717 <span class="keywordtype">long</span> isInside = 0;
- <a name="l00718"></a>00718 <span class="keywordtype">long</span> wasInside = 0;
- <a name="l00719"></a>00719 <span class="keywordflow">for</span> (xx = 0; xx < maskWidth; xx++) {
- <a name="l00720"></a>00720 <span class="keywordtype">long</span> pixel = mem[xx];
- <a name="l00721"></a>00721 isInside = pixel > maskClip;
- <a name="l00722"></a>00722 <span class="keywordflow">if</span> (wasInside) {
- <a name="l00723"></a>00723 <span class="keywordflow">if</span> (! isInside) {
- <a name="l00724"></a>00724 r->right = xx;
- <a name="l00725"></a>00725 <span class="keywordflow">if</span> ((aboveRect != -1) &&
- <a name="l00726"></a>00726 (rects[aboveRect].right == xx)) {
- <a name="l00727"></a>00727 <span class="comment">// merge with rect above</span>
- <a name="l00728"></a>00728 rects[aboveRect].bottom = r->bottom;
- <a name="l00729"></a>00729 rectCount--;
- <a name="l00730"></a>00730 } <span class="comment">// if</span>
- <a name="l00731"></a>00731 wasInside = 0;
- <a name="l00732"></a>00732 curRect = -1;
- <a name="l00733"></a>00733 aboveRect = -1;
- <a name="l00734"></a>00734 } <span class="comment">// if (! isInside)</span>
- <a name="l00735"></a>00735 } <span class="keywordflow">else</span> { <span class="comment">// if (wasInside)</span>
- <a name="l00736"></a>00736 <span class="keywordflow">if</span> (isInside) {
- <a name="l00737"></a>00737 wasInside = 1;
- <a name="l00738"></a>00738
- <a name="l00739"></a>00739 curRect = rectCount++;
- <a name="l00740"></a>00740
- <a name="l00741"></a>00741 <span class="keywordflow">if</span> (rectCount > rectBufSize) {
- <a name="l00742"></a>00742 <span class="keywordtype">long</span> i;
- <a name="l00743"></a>00743 RECT *newRects;
- <a name="l00744"></a>00744
- <a name="l00745"></a>00745 rectBufSize += 256;
- <a name="l00746"></a>00746 newRects = <span class="keyword">new</span> RECT[rectBufSize];
- <a name="l00747"></a>00747 <span class="keywordflow">for</span> (i = 0; i < curRect; i++) {
- <a name="l00748"></a>00748 newRects[i] = rects[i];
- <a name="l00749"></a>00749 } <span class="comment">// for</span>
- <a name="l00750"></a>00750 <span class="keyword">delete</span> [] rects;
- <a name="l00751"></a>00751 rects = newRects;
- <a name="l00752"></a>00752 } <span class="comment">// if (rectCount > rectBufSize)</span>
- <a name="l00753"></a>00753
- <a name="l00754"></a>00754 r = &rects[curRect];
- <a name="l00755"></a>00755 r->left = xx;
- <a name="l00756"></a>00756 r->top = yy;
- <a name="l00757"></a>00757 r->right = xx + 1;
- <a name="l00758"></a>00758 r->bottom = yy + 1;
- <a name="l00759"></a>00759
- <a name="l00760"></a>00760 aboveRect = -1;
- <a name="l00761"></a>00761
- <a name="l00762"></a>00762 { <span class="keywordtype">long</span> i;
- <a name="l00763"></a>00763 <span class="keywordflow">for</span> (i = 0; i < curRect; i++) {
- <a name="l00764"></a>00764 RECT *ra = &rects[i];
- <a name="l00765"></a>00765 <span class="keywordflow">if</span> ((ra->left == xx) &&
- <a name="l00766"></a>00766 (ra->bottom == yy)) {
- <a name="l00767"></a>00767 aboveRect = i;
- <a name="l00768"></a>00768 <span class="keywordflow">break</span>;
- <a name="l00769"></a>00769 } <span class="comment">// if</span>
- <a name="l00770"></a>00770 } <span class="comment">// for i</span>
- <a name="l00771"></a>00771 }
- <a name="l00772"></a>00772 } <span class="comment">// if (isInside)</span>
- <a name="l00773"></a>00773 } <span class="comment">// if (wasInside)</span>
- <a name="l00774"></a>00774 } <span class="comment">// for xx</span>
- <a name="l00775"></a>00775
- <a name="l00776"></a>00776 <span class="keywordflow">if</span> (curRect != -1) {
- <a name="l00777"></a>00777 r->right = xx;
- <a name="l00778"></a>00778 <span class="keywordflow">if</span> ((aboveRect != -1) &&
- <a name="l00779"></a>00779 (rects[aboveRect].right == xx)) {
- <a name="l00780"></a>00780 <span class="comment">// merge with rect above</span>
- <a name="l00781"></a>00781 rects[aboveRect].bottom = r->bottom;
- <a name="l00782"></a>00782 rectCount--;
- <a name="l00783"></a>00783 } <span class="comment">// if</span>
- <a name="l00784"></a>00784 } <span class="comment">// if (curRect != -1)</span>
- <a name="l00785"></a>00785
- <a name="l00786"></a>00786 curRect = -1;
- <a name="l00787"></a>00787 aboveRect = -1;
- <a name="l00788"></a>00788 mem += maskRowBytes;
- <a name="l00789"></a>00789
- <a name="l00790"></a>00790 } <span class="comment">// for yy</span>
- <a name="l00791"></a>00791
- <a name="l00792"></a>00792 {
- <a name="l00793"></a>00793 <span class="keywordtype">long</span> i;
- <a name="l00794"></a>00794 RECT *newRects = <span class="keyword">new</span> RECT[rectCount];
- <a name="l00795"></a>00795
- <a name="l00796"></a>00796 clipRects = rectCount;
- <a name="l00797"></a>00797 rectList = newRects;
- <a name="l00798"></a>00798 <span class="keywordflow">for</span> (i = 0; i < rectCount; i++) {
- <a name="l00799"></a>00799 newRects[i] = rects[i];
- <a name="l00800"></a>00800 } <span class="comment">// for</span>
- <a name="l00801"></a>00801 <span class="keyword">delete</span> [] rects;
- <a name="l00802"></a>00802 }
- <a name="l00803"></a>00803 } <span class="comment">// if (masked)</span>
- <a name="l00804"></a>00804 }
- <a name="l00805"></a>00805
- <a name="l00806"></a>00806
- <a name="l00807"></a>00807 <span class="keywordtype">void</span> CellEngine::LoadRule(
- <a name="l00808"></a>00808 <span class="keyword">const</span> <span class="keywordtype">char</span> *name)
- <a name="l00809"></a>00809 {
- <a name="l00810"></a>00810 <span class="keywordflow">if</span> (ruleName != NULL) {
- <a name="l00811"></a>00811 <span class="keyword">delete</span> [] ruleName;
- <a name="l00812"></a>00812 }
- <a name="l00813"></a>00813
- <a name="l00814"></a>00814 ruleName = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(name) + 1];
- <a name="l00815"></a>00815
- <a name="l00816"></a>00816 strcpy(ruleName, name);
- <a name="l00817"></a>00817
- <a name="l00818"></a>00818 <span class="keyword">const</span> <span class="keywordtype">char</span> *stream =
- <a name="l00819"></a>00819 NULL;
- <a name="l00820"></a>00820
- <a name="l00821"></a>00821 <span class="keyword">const</span> <span class="keywordtype">char</span> **pstr =
- <a name="l00822"></a>00822 <a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>;
- <a name="l00823"></a>00823
- <a name="l00824"></a>00824 <span class="keywordflow">while</span> (pstr[0] != NULL) {
- <a name="l00825"></a>00825 <span class="keywordflow">if</span> (stricmp(
- <a name="l00826"></a>00826 name,
- <a name="l00827"></a>00827 pstr[0]) == 0) {
- <a name="l00828"></a>00828 stream =
- <a name="l00829"></a>00829 pstr[1];
- <a name="l00830"></a>00830 <span class="keywordflow">break</span>;
- <a name="l00831"></a>00831 } <span class="comment">// if</span>
- <a name="l00832"></a>00832 pstr += 2;
- <a name="l00833"></a>00833 } <span class="comment">// while</span>
- <a name="l00834"></a>00834
- <a name="l00835"></a>00835 <span class="keywordflow">if</span> (stream != NULL) {
- <a name="l00836"></a>00836 LoadRuleData(stream);
- <a name="l00837"></a>00837 } <span class="comment">// if</span>
- <a name="l00838"></a>00838 }
- <a name="l00839"></a>00839
- <a name="l00840"></a>00840
- <a name="l00841"></a>00841 <span class="keywordtype">void</span> CellEngine::LoadRuleData(
- <a name="l00842"></a>00842 <span class="keyword">const</span> <span class="keywordtype">char</span> *stream)
- <a name="l00843"></a>00843 {
- <a name="l00844"></a>00844 QUAD magic;
- <a name="l00845"></a>00845
- <a name="l00846"></a>00846 <span class="keywordflow">if</span> (stream == NULL) {
- <a name="l00847"></a>00847 ruleSize = 0;
- <a name="l00848"></a>00848 neighborhood = 0;
- <a name="l00849"></a>00849 } <span class="keywordflow">else</span> {
- <a name="l00850"></a>00850
- <a name="l00851"></a>00851 <span class="comment">// XXX: Make this byte order independent!!!</span>
- <a name="l00852"></a>00852
- <a name="l00853"></a>00853 magic = *(<span class="keywordtype">long</span> *)stream;
- <a name="l00854"></a>00854 magic = SWAPLONG(magic);
- <a name="l00855"></a>00855 <span class="keywordflow">if</span> (magic != (QUAD)0xCAC0CAC0) <span class="keywordflow">return</span>;
- <a name="l00856"></a>00856 stream += <span class="keyword">sizeof</span>(long);
- <a name="l00857"></a>00857
- <a name="l00858"></a>00858 neighborhood = *(<span class="keywordtype">long</span> *)stream;
- <a name="l00859"></a>00859 neighborhood = SWAPLONG(neighborhood);
- <a name="l00860"></a>00860 stream += <span class="keyword">sizeof</span>(long);
- <a name="l00861"></a>00861
- <a name="l00862"></a>00862 ruleSize = *(<span class="keywordtype">long</span> *)stream;
- <a name="l00863"></a>00863 ruleSize = SWAPLONG(ruleSize);
- <a name="l00864"></a>00864 stream += <span class="keyword">sizeof</span>(long);
- <a name="l00865"></a>00865 }
- <a name="l00866"></a>00866
- <a name="l00867"></a>00867 <span class="keywordflow">if</span> ((rule != NULL) &&
- <a name="l00868"></a>00868 (!ruleStatic)) {
- <a name="l00869"></a>00869 <span class="keyword">delete</span> [] rule;
- <a name="l00870"></a>00870 rule = NULL;
- <a name="l00871"></a>00871 ruleStatic = 0;
- <a name="l00872"></a>00872 } <span class="comment">// if</span>
- <a name="l00873"></a>00873
- <a name="l00874"></a>00874 <span class="keywordflow">if</span> (ruleSize != 0) {
- <a name="l00875"></a>00875 rule = <span class="keyword">new</span> Byte[ruleSize];
- <a name="l00876"></a>00876 memcpy(rule, stream, ruleSize);
- <a name="l00877"></a>00877 ruleStatic = 0;
- <a name="l00878"></a>00878 } <span class="comment">// if</span>
- <a name="l00879"></a>00879 }
- <a name="l00880"></a>00880
- <a name="l00881"></a>00881
- <a name="l00882"></a>00882 <span class="keywordtype">void</span> CellEngine::LoadStaticRuleData(
- <a name="l00883"></a>00883 <span class="keyword">const</span> <span class="keywordtype">char</span> *stream)
- <a name="l00884"></a>00884 {
- <a name="l00885"></a>00885 QUAD magic;
- <a name="l00886"></a>00886
- <a name="l00887"></a>00887 <span class="keywordflow">if</span> (stream == NULL) {
- <a name="l00888"></a>00888 ruleSize = 0;
- <a name="l00889"></a>00889 neighborhood = 0;
- <a name="l00890"></a>00890 } <span class="keywordflow">else</span> {
- <a name="l00891"></a>00891
- <a name="l00892"></a>00892 <span class="comment">// XXX: Make this byte order independent!!!</span>
- <a name="l00893"></a>00893
- <a name="l00894"></a>00894 magic = *(<span class="keywordtype">long</span> *)stream;
- <a name="l00895"></a>00895 magic = SWAPLONG(magic);
- <a name="l00896"></a>00896 <span class="keywordflow">if</span> (magic != (LONG)0xCAC0CAC0) <span class="keywordflow">return</span>;
- <a name="l00897"></a>00897 stream += <span class="keyword">sizeof</span>(long);
- <a name="l00898"></a>00898
- <a name="l00899"></a>00899 neighborhood = *(<span class="keywordtype">long</span> *)stream;
- <a name="l00900"></a>00900 neighborhood = SWAPLONG(neighborhood);
- <a name="l00901"></a>00901 stream += <span class="keyword">sizeof</span>(long);
- <a name="l00902"></a>00902
- <a name="l00903"></a>00903 ruleSize = *(<span class="keywordtype">long</span> *)stream;
- <a name="l00904"></a>00904 ruleSize = SWAPLONG(ruleSize);
- <a name="l00905"></a>00905 stream += <span class="keyword">sizeof</span>(long);
- <a name="l00906"></a>00906 }
- <a name="l00907"></a>00907
- <a name="l00908"></a>00908 rule = (Byte *)stream;
- <a name="l00909"></a>00909 ruleStatic = 1;
- <a name="l00910"></a>00910 }
- <a name="l00911"></a>00911
- <a name="l00912"></a>00912
- <a name="l00913"></a>00913 <span class="keywordtype">void</span> CellEngine::SetRuleTable(
- <a name="l00914"></a>00914 <span class="keyword">const</span> <span class="keywordtype">char</span> *table,
- <a name="l00915"></a>00915 <span class="keywordtype">int</span> ruleSize,
- <a name="l00916"></a>00916 <span class="keywordtype">int</span> neigh)
- <a name="l00917"></a>00917 {
- <a name="l00918"></a>00918 neighborhood = neigh;
- <a name="l00919"></a>00919 <span class="keywordflow">if</span> (rule != NULL) {
- <a name="l00920"></a>00920 <span class="keyword">delete</span> [] rule;
- <a name="l00921"></a>00921 rule = NULL;
- <a name="l00922"></a>00922 } <span class="comment">// if</span>
- <a name="l00923"></a>00923
- <a name="l00924"></a>00924 <span class="keywordflow">if</span> (ruleSize != 0) {
- <a name="l00925"></a>00925 rule = <span class="keyword">new</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>[ruleSize];
- <a name="l00926"></a>00926 memcpy(rule, table, ruleSize);
- <a name="l00927"></a>00927 ruleStatic = 0;
- <a name="l00928"></a>00928 } <span class="comment">// if</span>
- <a name="l00929"></a>00929 }
- <a name="l00930"></a>00930
- <a name="l00931"></a>00931
- <a name="l00932"></a>00932 <span class="keywordtype">int</span> CellEngine::CountRules()
- <a name="l00933"></a>00933 {
- <a name="l00934"></a>00934 <span class="keywordflow">if</span> (ruleCount < 0) {
- <a name="l00935"></a>00935 ruleCount = 0;
- <a name="l00936"></a>00936 <span class="keywordflow">while</span> (<a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>[ruleCount << 1] != NULL) {
- <a name="l00937"></a>00937 ruleCount++;
- <a name="l00938"></a>00938 } <span class="comment">// while</span>
- <a name="l00939"></a>00939 } <span class="comment">// if</span>
- <a name="l00940"></a>00940
- <a name="l00941"></a>00941 <span class="keywordflow">return</span> ruleCount;
- <a name="l00942"></a>00942 }
- <a name="l00943"></a>00943
- <a name="l00944"></a>00944
- <a name="l00945"></a>00945 <span class="keyword">const</span> <span class="keywordtype">char</span> *CellEngine::GetRuleName(
- <a name="l00946"></a>00946 <span class="keywordtype">int</span> i)
- <a name="l00947"></a>00947 {
- <a name="l00948"></a>00948 <span class="keywordflow">if</span> ((i < 0) ||
- <a name="l00949"></a>00949 (i >= CountRules())) {
- <a name="l00950"></a>00950 <span class="keywordflow">return</span> NULL;
- <a name="l00951"></a>00951 } <span class="comment">// if</span>
- <a name="l00952"></a>00952
- <a name="l00953"></a>00953 <span class="keywordflow">return</span> <a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>[i << 1];
- <a name="l00954"></a>00954 }
- <a name="l00955"></a>00955
- <a name="l00956"></a>00956
- <a name="l00957"></a>00957 <span class="keyword">const</span> <span class="keywordtype">char</span> *CellEngine::GetRuleData(
- <a name="l00958"></a>00958 <span class="keywordtype">int</span> i)
- <a name="l00959"></a>00959 {
- <a name="l00960"></a>00960 <span class="keywordflow">if</span> ((i < 0) ||
- <a name="l00961"></a>00961 (i >= CountRules())) {
- <a name="l00962"></a>00962 <span class="keywordflow">return</span> NULL;
- <a name="l00963"></a>00963 } <span class="comment">// if</span>
- <a name="l00964"></a>00964
- <a name="l00965"></a>00965 <span class="keywordflow">return</span> <a class="code" href="cellengine_8cpp.html#e658b09e5441dba52b12b813b1701a65">ruleTables</a>[(i << 1) + 1];
- <a name="l00966"></a>00966 }
- <a name="l00967"></a>00967
- <a name="l00968"></a>00968
- <a name="l00969"></a>00969 <span class="keywordtype">long</span> CellEngine::DoPhysics()
- <a name="l00970"></a>00970 {
- <a name="l00971"></a>00971 <span class="keywordtype">long</span> xx = x;
- <a name="l00972"></a>00972 <span class="keywordtype">long</span> yy = y;
- <a name="l00973"></a>00973 <span class="keywordtype">long</span> oldx = xx;
- <a name="l00974"></a>00974 <span class="keywordtype">long</span> oldy = yy;
- <a name="l00975"></a>00975 <span class="keywordtype">long</span> dxx = dx;
- <a name="l00976"></a>00976 <span class="keywordtype">long</span> dyy = dy;
- <a name="l00977"></a>00977 <span class="keywordtype">long</span> events = 0;
- <a name="l00978"></a>00978
- <a name="l00979"></a>00979 <span class="keywordflow">if</span> (tracking) {
- <a name="l00980"></a>00980 dxx = dyy = 0;
- <a name="l00981"></a>00981 } <span class="comment">// if</span>
- <a name="l00982"></a>00982
- <a name="l00983"></a>00983 xx = xx + dxx;
- <a name="l00984"></a>00984 <span class="keywordflow">if</span> (xx < 0) {
- <a name="l00985"></a>00985 xx = 0;
- <a name="l00986"></a>00986 <span class="keywordflow">if</span> (dxx < 0) dxx = -dxx;
- <a name="l00987"></a>00987 events |= EVENT_BOUNCE_LEFT;
- <a name="l00988"></a>00988 } <span class="keywordflow">else</span> {
- <a name="l00989"></a>00989 <span class="keywordflow">if</span> ((xx + width) > screenWidth) {
- <a name="l00990"></a>00990 xx = screenWidth - width;
- <a name="l00991"></a>00991 <span class="keywordflow">if</span> (xx < 0) xx = 0;
- <a name="l00992"></a>00992 <span class="keywordflow">if</span> (dxx > 0) dxx = -dxx;
- <a name="l00993"></a>00993 events |= EVENT_BOUNCE_RIGHT;
- <a name="l00994"></a>00994 } <span class="comment">// if</span>
- <a name="l00995"></a>00995 } <span class="comment">// if</span>
- <a name="l00996"></a>00996
- <a name="l00997"></a>00997 yy = yy + dyy;
- <a name="l00998"></a>00998 <span class="keywordflow">if</span> (yy < 0) {
- <a name="l00999"></a>00999 yy = 0;
- <a name="l01000"></a>01000 <span class="keywordflow">if</span> (dyy < 0) {
- <a name="l01001"></a>01001 dyy = -dyy;
- <a name="l01002"></a>01002 } <span class="comment">// if</span>
- <a name="l01003"></a>01003 events |= EVENT_BOUNCE_TOP;
- <a name="l01004"></a>01004 } <span class="keywordflow">else</span> {
- <a name="l01005"></a>01005 <span class="keywordflow">if</span> ((yy + height) > screenHeight) {
- <a name="l01006"></a>01006 yy = screenHeight - height;
- <a name="l01007"></a>01007 <span class="keywordflow">if</span> (yy < 0) yy = 0;
- <a name="l01008"></a>01008 <span class="keywordflow">if</span> (dyy > 0) {
- <a name="l01009"></a>01009 dyy = -dyy;
- <a name="l01010"></a>01010 } <span class="comment">// if</span>
- <a name="l01011"></a>01011 events |= EVENT_BOUNCE_BOTTOM;
- <a name="l01012"></a>01012 } <span class="comment">// if</span>
- <a name="l01013"></a>01013 } <span class="comment">// if</span>
- <a name="l01014"></a>01014
- <a name="l01015"></a>01015 <span class="keywordflow">if</span> ((!tracking) && events) {
- <a name="l01016"></a>01016 <span class="keywordflow">if</span> (hubba) {
- <a name="l01017"></a>01017 frob += (Rand16() % ((2 * hubba) + 1)) - hubba;
- <a name="l01018"></a>01018 <span class="keywordflow">if</span> (frob > hubba) frob = hubba;
- <a name="l01019"></a>01019 <span class="keywordflow">if</span> (frob < -hubba) frob = -hubba;
- <a name="l01020"></a>01020 } <span class="comment">// if</span>
- <a name="l01021"></a>01021 <span class="keywordflow">if</span> (rumble) {
- <a name="l01022"></a>01022 <span class="keywordflow">do</span> {
- <a name="l01023"></a>01023 <span class="keywordflow">if</span> (rumble > 0) {
- <a name="l01024"></a>01024 <span class="keywordflow">if</span> (events & (EVENT_BOUNCE_LEFT |
- <a name="l01025"></a>01025 EVENT_BOUNCE_RIGHT |
- <a name="l01026"></a>01026 EVENT_BOUNCE_TOP |
- <a name="l01027"></a>01027 EVENT_BOUNCE_BOTTOM)) {
- <a name="l01028"></a>01028 dxx += (Rand16() % ((2 * rumble) + 1)) - rumble;
- <a name="l01029"></a>01029 dyy += (Rand16() % ((2 * rumble) + 1)) - rumble;
- <a name="l01030"></a>01030 <span class="keywordflow">if</span> (rumblemax) {
- <a name="l01031"></a>01031 <span class="keywordflow">if</span> (dxx > rumblemax) dxx = rumblemax;
- <a name="l01032"></a>01032 <span class="keywordflow">if</span> (dxx < -rumblemax) dxx = -rumblemax;
- <a name="l01033"></a>01033 <span class="keywordflow">if</span> (dyy > rumblemax) dyy = rumblemax;
- <a name="l01034"></a>01034 <span class="keywordflow">if</span> (dyy < -rumblemax) dyy = -rumblemax;
- <a name="l01035"></a>01035 } <span class="comment">// if</span>
- <a name="l01036"></a>01036 } <span class="comment">// if</span>
- <a name="l01037"></a>01037 } <span class="keywordflow">else</span> {
- <a name="l01038"></a>01038 <span class="keywordflow">if</span> (events & (EVENT_BOUNCE_LEFT |
- <a name="l01039"></a>01039 EVENT_BOUNCE_RIGHT)) {
- <a name="l01040"></a>01040 dxx += (Rand16() % ((-2 * rumble) + 1)) + rumble;
- <a name="l01041"></a>01041 } <span class="comment">// if</span>
- <a name="l01042"></a>01042 <span class="keywordflow">if</span> (events & (EVENT_BOUNCE_TOP |
- <a name="l01043"></a>01043 EVENT_BOUNCE_BOTTOM)) {
- <a name="l01044"></a>01044 dyy += (Rand16() % ((-2 * rumble) + 1)) + rumble;
- <a name="l01045"></a>01045 } <span class="comment">// if</span>
- <a name="l01046"></a>01046 } <span class="comment">// if</span>
- <a name="l01047"></a>01047 } <span class="keywordflow">while</span> ((dxx == 0) && (dyy == 0));
- <a name="l01048"></a>01048 } <span class="comment">// if</span>
- <a name="l01049"></a>01049 } <span class="comment">// if</span>
- <a name="l01050"></a>01050
- <a name="l01051"></a>01051 dx = dxx + gravx;
- <a name="l01052"></a>01052 dy = dyy + gravy;
- <a name="l01053"></a>01053
- <a name="l01054"></a>01054 <span class="keywordflow">if</span> ((oldx != xx) || (oldy != yy)) {
- <a name="l01055"></a>01055 SetPos(xx, yy);
- <a name="l01056"></a>01056 ForceOnScreen();
- <a name="l01057"></a>01057 events |= EVENT_MOVE;
- <a name="l01058"></a>01058 } <span class="comment">// if</span>
- <a name="l01059"></a>01059
- <a name="l01060"></a>01060 <span class="keywordflow">return</span> events;
- <a name="l01061"></a>01061 }
- <a name="l01062"></a>01062
- <a name="l01063"></a>01063
- <a name="l01064"></a>01064 <span class="keywordtype">long</span> CellEngine::DoRule()
- <a name="l01065"></a>01065 {
- <a name="l01066"></a>01066 <span class="keywordtype">int</span> step = 0;
- <a name="l01067"></a>01067
- <a name="l01068"></a>01068 <span class="keywordflow">if</span> (!moveImage) {
- <a name="l01069"></a>01069 DoPhysics();
- <a name="l01070"></a>01070 }
- <a name="l01071"></a>01071
- <a name="l01072"></a>01072 <span class="keywordflow">if</span> (skips > 0) {
- <a name="l01073"></a>01073 <span class="keywordflow">if</span> (skip > 0) {
- <a name="l01074"></a>01074 skip--;
- <a name="l01075"></a>01075 done:
- <a name="l01076"></a>01076 <span class="keywordflow">if</span> (moveImage) {
- <a name="l01077"></a>01077 DoPhysics();
- <a name="l01078"></a>01078 }
- <a name="l01079"></a>01079 <span class="keywordflow">return</span> step;
- <a name="l01080"></a>01080 } <span class="comment">// if</span>
- <a name="l01081"></a>01081 skip = skips;
- <a name="l01082"></a>01082 } <span class="comment">// if</span>
- <a name="l01083"></a>01083
- <a name="l01084"></a>01084 <span class="keywordflow">if</span> (!OnScreen()) <span class="keywordflow">goto</span> done;
- <a name="l01085"></a>01085
- <a name="l01086"></a>01086 <span class="keywordflow">for</span> (step = 0;
- <a name="l01087"></a>01087 step < steps;
- <a name="l01088"></a>01088 step++) {
- <a name="l01089"></a>01089
- <a name="l01090"></a>01090 CopyToBack();
- <a name="l01091"></a>01091
- <a name="l01092"></a>01092 <span class="keywordflow">if</span> (moveImage &&
- <a name="l01093"></a>01093 (step == 0)) {
- <a name="l01094"></a>01094 DoPhysics();
- <a name="l01095"></a>01095 }
- <a name="l01096"></a>01096
- <a name="l01097"></a>01097 PumpToFront();
- <a name="l01098"></a>01098
- <a name="l01099"></a>01099 } <span class="comment">// for step</span>
- <a name="l01100"></a>01100
- <a name="l01101"></a>01101 <span class="keywordflow">return</span> step;
- <a name="l01102"></a>01102 }
- <a name="l01103"></a>01103
- <a name="l01104"></a>01104
- <a name="l01105"></a>01105 <span class="keywordtype">void</span> CellEngine::PostRule()
- <a name="l01106"></a>01106 {
- <a name="l01107"></a>01107 }
- <a name="l01108"></a>01108
- <a name="l01109"></a>01109
- <a name="l01111"></a>01111 <span class="comment">//</span>
- <a name="l01112"></a>01112 <span class="comment">// Before applying a rule, we copy the front buffer to the back buffer.</span>
- <a name="l01113"></a>01113 <span class="comment">// The back buffer is two pixels wider and taller than the front buffer,</span>
- <a name="l01114"></a>01114 <span class="comment">// so that we can handle the edge conditions efficiently.</span>
- <a name="l01115"></a>01115 <span class="comment">// The main cellular automata loops do not need to worry about the special case</span>
- <a name="l01116"></a>01116 <span class="comment">// at the edges, because we pre-wrap a one pixel wide perimeter around the back</span>
- <a name="l01117"></a>01117 <span class="comment">// buffer before applying the rule.</span>
- <a name="l01118"></a>01118 <span class="comment">//</span>
- <a name="l01119"></a>01119 <span class="comment">// 0 ff f0 f1 ... fe ff f0</span>
- <a name="l01120"></a>01120 <span class="comment">//</span>
- <a name="l01121"></a>01121 <span class="comment">// 1 0f aa bb ... ee ee 00</span>
- <a name="l01122"></a>01122 <span class="comment">// 2 1f 10 11 ... ee ff 10</span>
- <a name="l01123"></a>01123 <span class="comment">// .. .. .. .. .. ..</span>
- <a name="l01124"></a>01124 <span class="comment">// ef e0 e1 ... ee ff e0</span>
- <a name="l01125"></a>01125 <span class="comment">// h ff f0 f1 ... ee ff f0</span>
- <a name="l01126"></a>01126 <span class="comment">//</span>
- <a name="l01127"></a>01127 <span class="comment">// h+1 0f 00 01 ... 0e 0f 00</span>
- <a name="l01128"></a>01128 <span class="comment">//</span>
- <a name="l01129"></a>01129 <span class="comment">//</span>
- <a name="l01130"></a>01130 <span class="comment">// There are several "wrap" modes to handle the edge conditions.</span>
- <a name="l01131"></a>01131 <span class="comment">// Initially:</span>
- <a name="l01132"></a>01132 <span class="comment">// BACK FRONT</span>
- <a name="l01133"></a>01133 <span class="comment">// ---- -----</span>
- <a name="l01134"></a>01134 <span class="comment">// abcd 0123</span>
- <a name="l01135"></a>01135 <span class="comment">// eFGh 4567</span>
- <a name="l01136"></a>01136 <span class="comment">// iJKl 8901</span>
- <a name="l01137"></a>01137 <span class="comment">// mnop 2345</span>
- <a name="l01138"></a>01138 <span class="comment">//</span>
- <a name="l01139"></a>01139 <span class="comment">// Legend:</span>
- <a name="l01140"></a>01140 <span class="comment">// aBCd=> 0AB3 Copy back to front.</span>
- <a name="l01141"></a>01141 <span class="comment">// Upper case source letters are copied.</span>
- <a name="l01142"></a>01142 <span class="comment">// <2121> Wrap from opposite edges (vertical and horizontal).</span>
- <a name="l01143"></a>01143 <span class="comment">// |1122| Truncate from same edges (vertical and horizontal).</span>
- <a name="l01144"></a>01144 <span class="comment">//</span>
- <a name="l01145"></a>01145 <span class="comment">// WRAP EFFECT</span>
- <a name="l01146"></a>01146 <span class="comment">// ---- ------</span>
- <a name="l01147"></a>01147 <span class="comment">// 0 no effect, don't change back</span>
- <a name="l01148"></a>01148 <span class="comment">// abcd 0123</span>
- <a name="l01149"></a>01149 <span class="comment">// efgh 4567</span>
- <a name="l01150"></a>01150 <span class="comment">// ijkl 8901</span>
- <a name="l01151"></a>01151 <span class="comment">// mnop 2345</span>
- <a name="l01152"></a>01152 <span class="comment">// 1 copy front to back, no wrap, don't change back perimeter</span>
- <a name="l01153"></a>01153 <span class="comment">// abcd 0123</span>
- <a name="l01154"></a>01154 <span class="comment">// eFGh=> 4FG7</span>
- <a name="l01155"></a>01155 <span class="comment">// iJKl=> 8JK1</span>
- <a name="l01156"></a>01156 <span class="comment">// mnop 2345</span>
- <a name="l01157"></a>01157 <span class="comment">// 2 don't copy front to back, just wrap edges</span>
- <a name="l01158"></a>01158 <span class="comment">// abcd 0909</span>
- <a name="l01159"></a>01159 <span class="comment">// eFGh <6565></span>
- <a name="l01160"></a>01160 <span class="comment">// iJKl <0909></span>
- <a name="l01161"></a>01161 <span class="comment">// mnop 6565</span>
- <a name="l01162"></a>01162 <span class="comment">// 3 copy front to back, and wrap edges</span>
- <a name="l01163"></a>01163 <span class="comment">// abcd KJKJ</span>
- <a name="l01164"></a>01164 <span class="comment">// eFGh=> <GFGF></span>
- <a name="l01165"></a>01165 <span class="comment">// iJKl=> <KJKJ></span>
- <a name="l01166"></a>01166 <span class="comment">// mnop GFGF</span>
- <a name="l01167"></a>01167 <span class="comment">// 4 copy front to back, truncate edges</span>
- <a name="l01168"></a>01168 <span class="comment">// abcd FFGG</span>
- <a name="l01169"></a>01169 <span class="comment">// eFGh=> |FFGG|</span>
- <a name="l01170"></a>01170 <span class="comment">// iJKl=> |JJKK|</span>
- <a name="l01171"></a>01171 <span class="comment">// mnop JJKK</span>
- <a name="l01172"></a>01172 <span class="comment">// 5 copy edges from screen, don't wrap</span>
- <a name="l01173"></a>01173 <span class="comment">// ABCD=> ABCD</span>
- <a name="l01174"></a>01174 <span class="comment">// EFGH=> EFGH</span>
- <a name="l01175"></a>01175 <span class="comment">// IJKL=> IJKL</span>
- <a name="l01176"></a>01176 <span class="comment">// MNOP=> MNOP</span>
- <a name="l01177"></a>01177 <span class="comment">//</span>
- <a name="l01178"></a>01178
- <a name="l01179"></a>01179 <span class="keywordtype">void</span> CellEngine::CopyToBack()
- <a name="l01180"></a>01180 {
- <a name="l01181"></a>01181 <span class="keywordtype">long</span> yy;
- <a name="l01182"></a>01182 Byte *f = frontMem;
- <a name="l01183"></a>01183 Byte *p = backMem +
- <a name="l01184"></a>01184 backBorder +
- <a name="l01185"></a>01185 (backBorder * backRowBytes);
- <a name="l01186"></a>01186
- <a name="l01187"></a>01187 <span class="keywordflow">switch</span> (wrap) {
- <a name="l01188"></a>01188
- <a name="l01189"></a>01189 <span class="keywordflow">case</span> 0:
- <a name="l01190"></a>01190 <span class="comment">// no effect, don't change back</span>
- <a name="l01191"></a>01191 <span class="keywordflow">break</span>;
- <a name="l01192"></a>01192
- <a name="l01193"></a>01193 <span class="keywordflow">case</span> 1:
- <a name="l01194"></a>01194 <span class="comment">// copy front to back, no wrap,</span>
- <a name="l01195"></a>01195 <span class="comment">// don't change back perimeter</span>
- <a name="l01196"></a>01196 <span class="keywordflow">for</span> (yy = 0; yy < height; yy++) {
- <a name="l01197"></a>01197 memcpy(p, f, width);
- <a name="l01198"></a>01198 p += backRowBytes;
- <a name="l01199"></a>01199 f += screenRowBytes;
- <a name="l01200"></a>01200 }
- <a name="l01201"></a>01201 <span class="keywordflow">break</span>;
- <a name="l01202"></a>01202
- <a name="l01203"></a>01203 <span class="keywordflow">case</span> 2:
- <a name="l01204"></a>01204 <span class="comment">// don't copy front to back, just wrap 1 pixel edges</span>
- <a name="l01205"></a>01205 <span class="keywordflow">for</span> (yy = 0; yy < height; yy++) {
- <a name="l01206"></a>01206 p[-1] = p[width - 1];
- <a name="l01207"></a>01207 p[width] = p[0];
- <a name="l01208"></a>01208 p += backRowBytes;
- <a name="l01209"></a>01209 f += screenRowBytes;
- <a name="l01210"></a>01210 } <span class="comment">// for</span>
- <a name="l01211"></a>01211 f = frontMem;
- <a name="l01212"></a>01212 p = backMem +
- <a name="l01213"></a>01213 backBorder +
- <a name="l01214"></a>01214 (backBorder * backRowBytes);
- <a name="l01215"></a>01215 memcpy(&p[(-1 * backRowBytes) - 1],
- <a name="l01216"></a>01216 &p[((height - 1) * backRowBytes) - 1],
- <a name="l01217"></a>01217 width + 2);
- <a name="l01218"></a>01218 memcpy(&p[(height * backRowBytes) - 1],
- <a name="l01219"></a>01219 &p[-1],
- <a name="l01220"></a>01220 width + 2);
- <a name="l01221"></a>01221 <span class="keywordflow">break</span>;
- <a name="l01222"></a>01222
- <a name="l01223"></a>01223 <span class="keywordflow">case</span> 3:
- <a name="l01224"></a>01224 <span class="comment">// copy front to back, and wrap 1 pixel edges</span>
- <a name="l01225"></a>01225 <span class="keywordflow">for</span> (yy = 0; yy < height; yy++) {
- <a name="l01226"></a>01226 memcpy(p, f, width);
- <a name="l01227"></a>01227 p[-1] = p[width - 1];
- <a name="l01228"></a>01228 p[width] = p[0];
- <a name="l01229"></a>01229 p += backRowBytes;
- <a name="l01230"></a>01230 f += screenRowBytes;
- <a name="l01231"></a>01231 } <span class="comment">// for</span>
- <a name="l01232"></a>01232 f = frontMem;
- <a name="l01233"></a>01233 p = backMem +
- <a name="l01234"></a>01234 backBorder +
- <a name="l01235"></a>01235 (backBorder * backRowBytes);
- <a name="l01236"></a>01236 memcpy(&p[(-1 * backRowBytes) - 1],
- <a name="l01237"></a>01237 &p[((height - 1) * backRowBytes) - 1],
- <a name="l01238"></a>01238 width + 2);
- <a name="l01239"></a>01239 memcpy(&p[(height * backRowBytes) - 1],
- <a name="l01240"></a>01240 &p[-1],
- <a name="l01241"></a>01241 width + 2);
- <a name="l01242"></a>01242 <span class="keywordflow">break</span>;
- <a name="l01243"></a>01243
- <a name="l01244"></a>01244 <span class="keywordflow">case</span> 4:
- <a name="l01245"></a>01245 <span class="comment">// copy front to back, truncate edges</span>
- <a name="l01246"></a>01246 <span class="keywordflow">for</span> (yy = 0; yy < height; yy++) {
- <a name="l01247"></a>01247 memcpy(p, f, width);
- <a name="l01248"></a>01248 p[-1] = p[0];
- <a name="l01249"></a>01249 p[width] = p[width - 1];
- <a name="l01250"></a>01250 p += backRowBytes;
- <a name="l01251"></a>01251 f += screenRowBytes;
- <a name="l01252"></a>01252 } <span class="comment">// for</span>
- <a name="l01253"></a>01253 f = frontMem;
- <a name="l01254"></a>01254 p = backMem +
- <a name="l01255"></a>01255 backBorder +
- <a name="l01256"></a>01256 (backBorder * backRowBytes);
- <a name="l01257"></a>01257 memcpy(&p[(-1 * backRowBytes) - 1],
- <a name="l01258"></a>01258 &p[-1],
- <a name="l01259"></a>01259 width + 2);
- <a name="l01260"></a>01260 memcpy(&p[(height * backRowBytes) - 1],
- <a name="l01261"></a>01261 &p[((height - 1) * backRowBytes) - 1],
- <a name="l01262"></a>01262 width + 2);
- <a name="l01263"></a>01263 <span class="keywordflow">break</span>;
- <a name="l01264"></a>01264
- <a name="l01265"></a>01265 <span class="keywordflow">case</span> 5:
- <a name="l01266"></a>01266 {
- <a name="l01267"></a>01267 <span class="comment">// copy edges from screen, don't wrap</span>
- <a name="l01268"></a>01268 <span class="comment">// Mind those screen edge conditions!</span>
- <a name="l01269"></a>01269 <span class="keywordtype">long</span> left = (x == 0);
- <a name="l01270"></a>01270 <span class="keywordtype">long</span> right = (x + width == screenWidth);
- <a name="l01271"></a>01271 <span class="keywordtype">long</span> top = (y == 0);
- <a name="l01272"></a>01272 <span class="keywordtype">long</span> bottom = (y + height == screenHeight);
- <a name="l01273"></a>01273
- <a name="l01274"></a>01274 <span class="keywordflow">if</span> (!left && !right && !top && !bottom) {
- <a name="l01275"></a>01275 p -= backRowBytes + 1;
- <a name="l01276"></a>01276 f -= screenRowBytes + 1;
- <a name="l01277"></a>01277
- <a name="l01278"></a>01278 <span class="keywordflow">for</span> (yy = -1; yy <= height; yy++) {
- <a name="l01279"></a>01279 memcpy(p, f, width + 2);
- <a name="l01280"></a>01280 p += backRowBytes;
- <a name="l01281"></a>01281 f += screenRowBytes;
- <a name="l01282"></a>01282 } <span class="comment">// for</span>
- <a name="l01283"></a>01283 } <span class="keywordflow">else</span> {
- <a name="l01284"></a>01284 left = left
- <a name="l01285"></a>01285 ? (0)
- <a name="l01286"></a>01286 : (-1);
- <a name="l01287"></a>01287 right = right
- <a name="l01288"></a>01288 ? (width - 1)
- <a name="l01289"></a>01289 : (width);
- <a name="l01290"></a>01290 top = top
- <a name="l01291"></a>01291 ? (0)
- <a name="l01292"></a>01292 : (-screenRowBytes);
- <a name="l01293"></a>01293 bottom = bottom
- <a name="l01294"></a>01294 ? ((height - 1) * screenRowBytes)
- <a name="l01295"></a>01295 : (height * screenRowBytes);
- <a name="l01296"></a>01296
- <a name="l01297"></a>01297 p[-backRowBytes - 1] =
- <a name="l01298"></a>01298 f[left + top];
- <a name="l01299"></a>01299
- <a name="l01300"></a>01300 memcpy(p - backRowBytes,
- <a name="l01301"></a>01301 f + top,
- <a name="l01302"></a>01302 width);
- <a name="l01303"></a>01303
- <a name="l01304"></a>01304 p[-backRowBytes + width] =
- <a name="l01305"></a>01305 f[right + top];
- <a name="l01306"></a>01306
- <a name="l01307"></a>01307 p[(height * backRowBytes) - 1] =
- <a name="l01308"></a>01308 f[left + bottom];
- <a name="l01309"></a>01309
- <a name="l01310"></a>01310 memcpy(p + (height * backRowBytes),
- <a name="l01311"></a>01311 f + bottom,
- <a name="l01312"></a>01312 width);
- <a name="l01313"></a>01313
- <a name="l01314"></a>01314 p[(height * backRowBytes) + width] =
- <a name="l01315"></a>01315 f[right + bottom];
- <a name="l01316"></a>01316
- <a name="l01317"></a>01317 <span class="keywordflow">for</span> (yy = 0; yy < height; yy++) {
- <a name="l01318"></a>01318 p[-1] = f[left];
- <a name="l01319"></a>01319 memcpy(p, f, width);
- <a name="l01320"></a>01320 p[width] = f[right];
- <a name="l01321"></a>01321 p += backRowBytes;
- <a name="l01322"></a>01322 f += screenRowBytes;
- <a name="l01323"></a>01323 } <span class="comment">// for</span>
- <a name="l01324"></a>01324 } <span class="comment">// if</span>
- <a name="l01325"></a>01325 }
- <a name="l01326"></a>01326 <span class="keywordflow">break</span>;
- <a name="l01327"></a>01327
- <a name="l01328"></a>01328 <span class="keywordflow">case</span> 6:
- <a name="l01329"></a>01329 <span class="comment">// copy front to back, and wrap 2 pixel edges</span>
- <a name="l01330"></a>01330 <span class="keywordflow">for</span> (yy = 0; yy < height; yy++) {
- <a name="l01331"></a>01331 memcpy(p, f, width);
- <a name="l01332"></a>01332 p[-1] = p[width - 1];
- <a name="l01333"></a>01333 p[-2] = p[width - 2];
- <a name="l01334"></a>01334 p[width] = p[0];
- <a name="l01335"></a>01335 p[width + 1] = p[1];
- <a name="l01336"></a>01336 p += backRowBytes;
- <a name="l01337"></a>01337 f += screenRowBytes;
- <a name="l01338"></a>01338 } <span class="comment">// for</span>
- <a name="l01339"></a>01339 f = frontMem;
- <a name="l01340"></a>01340 p = backMem +
- <a name="l01341"></a>01341 backBorder +
- <a name="l01342"></a>01342 (backBorder * backRowBytes);
- <a name="l01343"></a>01343 memcpy(&p[(-1 * backRowBytes) - 2],
- <a name="l01344"></a>01344 &p[((height - 1) * backRowBytes) - 2],
- <a name="l01345"></a>01345 width + 4);
- <a name="l01346"></a>01346 memcpy(&p[(-2 * backRowBytes) - 2],
- <a name="l01347"></a>01347 &p[((height - 2) * backRowBytes) - 2],
- <a name="l01348"></a>01348 width + 4);
- <a name="l01349"></a>01349 memcpy(&p[(height * backRowBytes) - 2],
- <a name="l01350"></a>01350 &p[-2],
- <a name="l01351"></a>01351 width + 4);
- <a name="l01352"></a>01352 memcpy(&p[((height + 1) * backRowBytes) - 2],
- <a name="l01353"></a>01353 &p[-2 + backRowBytes],
- <a name="l01354"></a>01354 width + 4);
- <a name="l01355"></a>01355 <span class="keywordflow">break</span>;
- <a name="l01356"></a>01356
- <a name="l01357"></a>01357 } <span class="comment">// switch wrap</span>
- <a name="l01358"></a>01358 }
- <a name="l01359"></a>01359
- <a name="l01360"></a>01360
- <a name="l01361"></a>01361 <span class="keywordtype">void</span> CellEngine::PumpToFront()
- <a name="l01362"></a>01362 {
- <a name="l01363"></a>01363 <span class="keywordflow">switch</span> (neighborhood) {
- <a name="l01364"></a>01364 <span class="keywordflow">case</span> -1:
- <a name="l01365"></a>01365 <span class="keywordflow">break</span>;
- <a name="l01366"></a>01366 <span class="keywordflow">case</span> 0:
- <a name="l01367"></a>01367 <span class="keywordflow">case</span> 1:
- <a name="l01368"></a>01368 n_moore_a();
- <a name="l01369"></a>01369 <span class="keywordflow">break</span>;
- <a name="l01370"></a>01370 <span class="keywordflow">case</span> 2:
- <a name="l01371"></a>01371 n_moore_ab();
- <a name="l01372"></a>01372 <span class="keywordflow">break</span>;
- <a name="l01373"></a>01373 <span class="keywordflow">case</span> 3:
- <a name="l01374"></a>01374 n_vonn_neumann();
- <a name="l01375"></a>01375 <span class="keywordflow">break</span>;
- <a name="l01376"></a>01376 <span class="keywordflow">case</span> 4:
- <a name="l01377"></a>01377 n_margolis();
- <a name="l01378"></a>01378 <span class="keywordflow">break</span>;
- <a name="l01379"></a>01379 <span class="keywordflow">case</span> 5:
- <a name="l01380"></a>01380 n_margolis_ph();
- <a name="l01381"></a>01381 <span class="keywordflow">break</span>;
- <a name="l01382"></a>01382 <span class="keywordflow">case</span> 6:
- <a name="l01383"></a>01383 n_margolis_hv();
- <a name="l01384"></a>01384 <span class="keywordflow">break</span>;
- <a name="l01385"></a>01385 <span class="keywordflow">case</span> 7:
- <a name="l01386"></a>01386 n_life();
- <a name="l01387"></a>01387 <span class="keywordflow">break</span>;
- <a name="l01388"></a>01388 <span class="keywordflow">case</span> 8:
- <a name="l01389"></a>01389 n_brain();
- <a name="l01390"></a>01390 <span class="keywordflow">break</span>;
- <a name="l01391"></a>01391 <span class="keywordflow">case</span> 9:
- <a name="l01392"></a>01392 n_heat();
- <a name="l01393"></a>01393 <span class="keywordflow">break</span>;
- <a name="l01394"></a>01394 <span class="keywordflow">case</span> 10:
- <a name="l01395"></a>01395 n_dheat();
- <a name="l01396"></a>01396 <span class="keywordflow">break</span>;
- <a name="l01397"></a>01397 <span class="keywordflow">case</span> 11:
- <a name="l01398"></a>01398 n_lheat();
- <a name="l01399"></a>01399 <span class="keywordflow">break</span>;
- <a name="l01400"></a>01400 <span class="keywordflow">case</span> 12:
- <a name="l01401"></a>01401 n_ldheat();
- <a name="l01402"></a>01402 <span class="keywordflow">break</span>;
- <a name="l01403"></a>01403 <span class="keywordflow">case</span> 13:
- <a name="l01404"></a>01404 n_ranch();
- <a name="l01405"></a>01405 <span class="keywordflow">break</span>;
- <a name="l01406"></a>01406 <span class="keywordflow">case</span> 14:
- <a name="l01407"></a>01407 n_anneal();
- <a name="l01408"></a>01408 <span class="keywordflow">break</span>;
- <a name="l01409"></a>01409 <span class="keywordflow">case</span> 15:
- <a name="l01410"></a>01410 n_anneal4();
- <a name="l01411"></a>01411 <span class="keywordflow">break</span>;
- <a name="l01412"></a>01412 <span class="keywordflow">case</span> 16:
- <a name="l01413"></a>01413 n_anneal8();
- <a name="l01414"></a>01414 <span class="keywordflow">break</span>;
- <a name="l01415"></a>01415 <span class="keywordflow">case</span> 17:
- <a name="l01416"></a>01416 n_eco();
- <a name="l01417"></a>01417 <span class="keywordflow">break</span>;
- <a name="l01418"></a>01418 <span class="keywordflow">case</span> 18:
- <a name="l01419"></a>01419 n_abdheat();
- <a name="l01420"></a>01420 <span class="keywordflow">break</span>;
- <a name="l01421"></a>01421 <span class="keywordflow">case</span> 19:
- <a name="l01422"></a>01422 n_edheat();
- <a name="l01423"></a>01423 <span class="keywordflow">break</span>;
- <a name="l01424"></a>01424 <span class="keywordflow">case</span> 20:
- <a name="l01425"></a>01425 n_abcdheat();
- <a name="l01426"></a>01426 <span class="keywordflow">break</span>;
- <a name="l01427"></a>01427 <span class="keywordflow">case</span> 21:
- <a name="l01428"></a>01428 n_torben();
- <a name="l01429"></a>01429 <span class="keywordflow">break</span>;
- <a name="l01430"></a>01430 <span class="keywordflow">case</span> 22:
- <a name="l01431"></a>01431 n_torben2();
- <a name="l01432"></a>01432 <span class="keywordflow">break</span>;
- <a name="l01433"></a>01433 <span class="keywordflow">case</span> 23:
- <a name="l01434"></a>01434 n_torben3();
- <a name="l01435"></a>01435 <span class="keywordflow">break</span>;
- <a name="l01436"></a>01436 <span class="keywordflow">case</span> 24:
- <a name="l01437"></a>01437 n_torben4();
- <a name="l01438"></a>01438 <span class="keywordflow">break</span>;
- <a name="l01439"></a>01439 <span class="keywordflow">case</span> 25:
- <a name="l01440"></a>01440 n_ball();
- <a name="l01441"></a>01441 <span class="keywordflow">break</span>;
- <a name="l01442"></a>01442 <span class="keywordflow">case</span> 26:
- <a name="l01443"></a>01443 n_fdheat();
- <a name="l01444"></a>01444 <span class="keywordflow">break</span>;
- <a name="l01445"></a>01445 <span class="keywordflow">case</span> 27:
- <a name="l01446"></a>01446 n_fabcdheat();
- <a name="l01447"></a>01447 <span class="keywordflow">break</span>;
- <a name="l01448"></a>01448 <span class="keywordflow">case</span> 28:
- <a name="l01449"></a>01449 n_risca();
- <a name="l01450"></a>01450 <span class="keywordflow">break</span>;
- <a name="l01451"></a>01451 <span class="keywordflow">case</span> 29:
- <a name="l01452"></a>01452 n_insert();
- <a name="l01453"></a>01453 <span class="keywordflow">break</span>;
- <a name="l01454"></a>01454 <span class="keywordflow">case</span> 30:
- <a name="l01455"></a>01455 n_heaco();
- <a name="l01456"></a>01456 <span class="keywordflow">break</span>;
- <a name="l01457"></a>01457 <span class="keywordflow">case</span> 31:
- <a name="l01458"></a>01458 n_marble();
- <a name="l01459"></a>01459 <span class="keywordflow">break</span>;
- <a name="l01460"></a>01460 <span class="keywordflow">case</span> 32:
- <a name="l01461"></a>01461 n_smarble();
- <a name="l01462"></a>01462 <span class="keywordflow">break</span>;
- <a name="l01463"></a>01463 <span class="keywordflow">case</span> 33:
- <a name="l01464"></a>01464 n_farble();
- <a name="l01465"></a>01465 <span class="keywordflow">break</span>;
- <a name="l01466"></a>01466 <span class="keywordflow">case</span> 34:
- <a name="l01467"></a>01467 n_garblebug();
- <a name="l01468"></a>01468 <span class="keywordflow">break</span>;
- <a name="l01469"></a>01469 <span class="keywordflow">case</span> 35:
- <a name="l01470"></a>01470 n_twoheats();
- <a name="l01471"></a>01471 <span class="keywordflow">break</span>;
- <a name="l01472"></a>01472 <span class="keywordflow">case</span> 36:
- <a name="l01473"></a>01473 n_spin();
- <a name="l01474"></a>01474 <span class="keywordflow">break</span>;
- <a name="l01475"></a>01475 <span class="keywordflow">case</span> 37:
- <a name="l01476"></a>01476 n_driven();
- <a name="l01477"></a>01477 <span class="keywordflow">break</span>;
- <a name="l01478"></a>01478 <span class="keywordflow">case</span> 38:
- <a name="l01479"></a>01479 n_daft();
- <a name="l01480"></a>01480 <span class="keywordflow">break</span>;
- <a name="l01481"></a>01481 <span class="keywordflow">case</span> 39:
- <a name="l01482"></a>01482 n_spinsonly();
- <a name="l01483"></a>01483 <span class="keywordflow">break</span>;
- <a name="l01484"></a>01484 <span class="keywordflow">case</span> 40:
- <a name="l01485"></a>01485 n_spinsbank();
- <a name="l01486"></a>01486 <span class="keywordflow">break</span>;
- <a name="l01487"></a>01487 <span class="keywordflow">case</span> 41:
- <a name="l01488"></a>01488 n_spinsheat();
- <a name="l01489"></a>01489 <span class="keywordflow">break</span>;
- <a name="l01490"></a>01490 <span class="keywordflow">case</span> 42:
- <a name="l01491"></a>01491 n_spinglass();
- <a name="l01492"></a>01492 <span class="keywordflow">break</span>;
- <a name="l01493"></a>01493 <span class="keywordflow">case</span> 43:
- <a name="l01494"></a>01494 n_glassbonds();
- <a name="l01495"></a>01495 <span class="keywordflow">break</span>;
- <a name="l01496"></a>01496 <span class="keywordflow">case</span> 44:
- <a name="l01497"></a>01497 n_glassheat();
- <a name="l01498"></a>01498 <span class="keywordflow">break</span>;
- <a name="l01499"></a>01499 <span class="keywordflow">case</span> 45:
- <a name="l01500"></a>01500 n_faders();
- <a name="l01501"></a>01501 <span class="keywordflow">break</span>;
- <a name="l01502"></a>01502 <span class="keywordflow">case</span> 46:
- <a name="l01503"></a>01503 n_harble();
- <a name="l01504"></a>01504 <span class="keywordflow">break</span>;
- <a name="l01505"></a>01505 <span class="keywordflow">case</span> 47:
- <a name="l01506"></a>01506 n_perlin();
- <a name="l01507"></a>01507 <span class="keywordflow">break</span>;
- <a name="l01508"></a>01508 <span class="keywordflow">case</span> 48:
- <a name="l01509"></a>01509 n_dendrite();
- <a name="l01510"></a>01510 <span class="keywordflow">break</span>;
- <a name="l01511"></a>01511 <span class="keywordflow">case</span> 49:
- <a name="l01512"></a>01512 n_vanneal();
- <a name="l01513"></a>01513 <span class="keywordflow">break</span>;
- <a name="l01514"></a>01514 <span class="keywordflow">case</span> 50:
- <a name="l01515"></a>01515 n_vanneal8();
- <a name="l01516"></a>01516 <span class="keywordflow">break</span>;
- <a name="l01517"></a>01517 <span class="keywordflow">case</span> 51:
- <a name="l01518"></a>01518 n_garble();
- <a name="l01519"></a>01519 <span class="keywordflow">break</span>;
- <a name="l01520"></a>01520 <span class="keywordflow">case</span> 52:
- <a name="l01521"></a>01521 n_jvn29();
- <a name="l01522"></a>01522 <span class="keywordflow">break</span>;
- <a name="l01523"></a>01523 <span class="keywordflow">default</span>:
- <a name="l01524"></a>01524 <span class="keywordflow">break</span>;
- <a name="l01525"></a>01525 } <span class="comment">// switch neighborhood</span>
- <a name="l01526"></a>01526
- <a name="l01527"></a>01527 phase = !phase;
- <a name="l01528"></a>01528 ticks++;
- <a name="l01529"></a>01529 }
- <a name="l01530"></a>01530
- <a name="l01531"></a>01531
- <a name="l01532"></a>01532 Byte CellEngine::GetCell(
- <a name="l01533"></a>01533 <span class="keywordtype">int</span> col,
- <a name="l01534"></a>01534 <span class="keywordtype">int</span> row)
- <a name="l01535"></a>01535 {
- <a name="l01536"></a>01536 <span class="keywordflow">if</span> ((col < 0) ||
- <a name="l01537"></a>01537 (col >= width) ||
- <a name="l01538"></a>01538 (row < 0) ||
- <a name="l01539"></a>01539 (row >= height) ||
- <a name="l01540"></a>01540 (frontMem == NULL)) {
- <a name="l01541"></a>01541 <span class="keywordflow">return</span> 0;
- <a name="l01542"></a>01542 }
- <a name="l01543"></a>01543
- <a name="l01544"></a>01544 Byte cell =
- <a name="l01545"></a>01545 frontMem[col + (row * screenRowBytes)];
- <a name="l01546"></a>01546
- <a name="l01547"></a>01547 <span class="keywordflow">return</span> cell;
- <a name="l01548"></a>01548 }
- <a name="l01549"></a>01549
- <a name="l01550"></a>01550
- <a name="l01551"></a>01551 <span class="keywordtype">void</span> CellEngine::SetCell(
- <a name="l01552"></a>01552 <span class="keywordtype">int</span> col,
- <a name="l01553"></a>01553 <span class="keywordtype">int</span> row,
- <a name="l01554"></a>01554 Byte cell)
- <a name="l01555"></a>01555 {
- <a name="l01556"></a>01556 <span class="keywordflow">if</span> ((col < 0) ||
- <a name="l01557"></a>01557 (col >= width) ||
- <a name="l01558"></a>01558 (row < 0) ||
- <a name="l01559"></a>01559 (row >= height) ||
- <a name="l01560"></a>01560 (frontMem == NULL)) {
- <a name="l01561"></a>01561 <span class="keywordflow">return</span>;
- <a name="l01562"></a>01562 }
- <a name="l01563"></a>01563
- <a name="l01564"></a>01564 frontMem[col + (row * screenRowBytes)] =
- <a name="l01565"></a>01565 cell;
- <a name="l01566"></a>01566 }
- <a name="l01567"></a>01567
- <a name="l01568"></a>01568
- <a name="l01569"></a>01569 <span class="keywordtype">void</span> *CellEngine::GetCellBuffer()
- <a name="l01570"></a>01570 {
- <a name="l01571"></a>01571 <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)frontMem;
- <a name="l01572"></a>01572 }
- <a name="l01573"></a>01573
- <a name="l01574"></a>01574
- <a name="l01575"></a>01575 <span class="keywordtype">void</span> CellEngine::n_moore_a()
- <a name="l01576"></a>01576 {
- <a name="l01577"></a>01577 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
- <a name="l01578"></a>01578
- <a name="l01579"></a>01579 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
- <a name="l01580"></a>01580 <span class="comment">// c c' se sw ne nw e w s n</span>
- <a name="l01581"></a>01581 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
- <a name="l01582"></a>01582
- <a name="l01583"></a>01583 <span class="preprocessor">#define MOORE_A ( \</span>
- <a name="l01584"></a>01584 <span class="preprocessor"> ((nw & 1) << 5) | \</span>
- <a name="l01585"></a>01585 <span class="preprocessor"> ((n & 1) << 9) | \</span>
- <a name="l01586"></a>01586 <span class="preprocessor"> ((ne & 1) << 4) | \</span>
- <a name="l01587"></a>01587 <span class="preprocessor"> ((w & 1) << 7) | \</span>
- <a name="l01588"></a>01588 <span class="preprocessor"> ((c & 3) << 0) | \</span>
- <a name="l01589"></a>01589 <span class="preprocessor"> ((e & 1) << 6) | \</span>
- <a name="l01590"></a>01590 <span class="preprocessor"> ((sw & 1) << 3) | \</span>
- <a name="l01591"></a>01591 <span class="preprocessor"> ((s & 1) << 8) | \</span>
- <a name="l01592"></a>01592 <span class="preprocessor"> ((se & 1) << 2))</span>
- <a name="l01593"></a>01593 <span class="preprocessor"></span>
- <a name="l01594"></a>01594 <span class="keywordflow">if</span> (inflation) {
- <a name="l01595"></a>01595 <span class="keywordtype">int</span> last = 0;
- <a name="l01596"></a>01596 <span class="keywordtype">int</span> heat = 0;
- <a name="l01597"></a>01597
- <a name="l01598"></a>01598 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MOORE_A)
- <a name="l01599"></a>01599 } <span class="keywordflow">else</span> {
- <a name="l01600"></a>01600 CAM_MASKED_REG_TABLE_LOOP(MOORE_A)
- <a name="l01601"></a>01601 } <span class="comment">// if</span>
- <a name="l01602"></a>01602 }
- <a name="l01603"></a>01603
- <a name="l01604"></a>01604
- <a name="l01605"></a>01605 <span class="keywordtype">void</span> CellEngine::n_moore_ab()
- <a name="l01606"></a>01606 {
- <a name="l01607"></a>01607 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
- <a name="l01608"></a>01608
- <a name="l01609"></a>01609 <span class="comment">// 0 1 2 3 4 5 6 7 8 9 10 11</span>
- <a name="l01610"></a>01610 <span class="comment">// c c' se sw ne nw e w s n &c &c'</span>
- <a name="l01611"></a>01611 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200 0x400 0x800</span>
- <a name="l01612"></a>01612
- <a name="l01613"></a>01613 <span class="preprocessor">#define MOORE_AB ( \</span>
- <a name="l01614"></a>01614 <span class="preprocessor"> MOORE_A | \</span>
- <a name="l01615"></a>01615 <span class="preprocessor"> ((c & 0x0c) << 8))</span>
- <a name="l01616"></a>01616 <span class="preprocessor"></span>
- <a name="l01617"></a>01617 <span class="keywordflow">if</span> (inflation) {
- <a name="l01618"></a>01618 <span class="keywordtype">int</span> last = 0;
- <a name="l01619"></a>01619 <span class="keywordtype">int</span> heat = 0;
- <a name="l01620"></a>01620
- <a name="l01621"></a>01621 CAM_MASKED_REG_TABLE_HEAT4_LOOP(MOORE_AB)
- <a name="l01622"></a>01622 } <span class="keywordflow">else</span> {
- <a name="l01623"></a>01623 CAM_MASKED_REG_TABLE_LOOP(MOORE_AB)
- <a name="l01624"></a>01624 } <span class="comment">// if</span>
- <a name="l01625"></a>01625 }
- <a name="l01626"></a>01626
- <a name="l01627"></a>01627
- <a name="l01628"></a>01628 <span class="keywordtype">void</span> CellEngine::n_vonn_neumann()
- <a name="l01629"></a>01629 {
- <a name="l01630"></a>01630 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
- <a name="l01631"></a>01631
- <a name="l01632"></a>01632 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
- <a name="l01633"></a>01633 <span class="comment">// c c' e' w' s' n' e w s n</span>
- <a name="l01634"></a>01634 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
- <a name="l01635"></a>01635
- <a name="l01636"></a>01636 <span class="preprocessor">#define VON_NEUMANN ( \</span>
- <a name="l01637"></a>01637 <span class="preprocessor"> ((c & 3) << 0) | \</span>
- <a name="l01638"></a>01638 <span class="preprocessor"> ((e & 1) << 6) | \</span>
- <a name="l01639"></a>01639 <span class="preprocessor"> ((e & 2) << 1) | \</span>
- <a name="l01640"></a>01640 <span class="preprocessor"> ((w & 1) << 7) | \</span>
- <a name="l01641"></a>01641 <span class="preprocessor"> ((w & 2) << 2) | \</span>
- <a name="l01642"></a>01642 <span class="preprocessor"> ((s & 1) << 8) | \</span>
- <a name="l01643"></a>01643 <span class="preprocessor"> ((s & 2) << 3) | \</span>
- <a name="l01644"></a>01644 <span class="preprocessor"> ((n & 1) << 9) | \</span>
- <a name="l01645"></a>01645 <span class="preprocessor"> ((n & 2) << 4))</span>
- <a name="l01646"></a>01646 <span class="preprocessor"></span>
- <a name="l01647"></a>01647 <span class="keywordflow">if</span> (inflation) {
- <a name="l01648"></a>01648 <span class="keywordtype">int</span> last = 0;
- <a name="l01649"></a>01649 <span class="keywordtype">int</span> heat = 0;
- <a name="l01650"></a>01650
- <a name="l01651"></a>01651 CAM_MASKED_REG_TABLE_HEAT6_LOOP(VON_NEUMANN)
- <a name="l01652"></a>01652 } <span class="keywordflow">else</span> {
- <a name="l01653"></a>01653 CAM_MASKED_REG_TABLE_LOOP(VON_NEUMANN)
- <a name="l01654"></a>01654 }
- <a name="l01655"></a>01655 }
- <a name="l01656"></a>01656
- <a name="l01657"></a>01657
- <a name="l01658"></a>01658 <span class="keywordtype">void</span> CellEngine::n_margolis()
- <a name="l01659"></a>01659 {
- <a name="l01660"></a>01660 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
- <a name="l01661"></a>01661
- <a name="l01662"></a>01662 <span class="keyword">register</span> Byte i;
- <a name="l01663"></a>01663
- <a name="l01664"></a>01664 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
- <a name="l01665"></a>01665 <span class="comment">// c c' cw ccw opp cw' ccw' opp'</span>
- <a name="l01666"></a>01666 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
- <a name="l01667"></a>01667
- <a name="l01668"></a>01668 <span class="preprocessor">#define MARGOLIS_ODD ( \</span>
- <a name="l01669"></a>01669 <span class="preprocessor"> </span><span class="comment">/* c c' */</span> \
- <a name="l01670"></a>01670 (c & 3) | \
- <a name="l01671"></a>01671 <span class="comment">/* cw cw' */</span> \
- <a name="l01672"></a>01672 (i = ((xx & 1) ? ((yy & 1) ? (e & 3) : (n & 3)) \
- <a name="l01673"></a>01673 : ((yy & 1) ? (s & 3) : (w & 3))), \
- <a name="l01674"></a>01674 (((i & 1) << 2) | ((i & 2) << 4))) | \
- <a name="l01675"></a>01675 <span class="comment">/* ccw ccw' */</span> \
- <a name="l01676"></a>01676 (i = ((xx & 1) ? ((yy & 1) ? (s & 3) : (e & 3)) \
- <a name="l01677"></a>01677 : ((yy & 1) ? (w & 3) : (n & 3))), \
- <a name="l01678"></a>01678 (((i & 1) << 3) | ((i & 2) << 5))) | \
- <a name="l01679"></a>01679 <span class="comment">/* opp opp' */</span> \
- <a name="l01680"></a>01680 (i = ((xx & 1) ? ((yy & 1) ? (se & 3) : (ne & 3)) \
- <a name="l01681"></a>01681 : ((yy & 1) ? (sw & 3) : (nw & 3))), \
- <a name="l01682"></a>01682 (((i & 1) << 4) | ((i & 2) << 6))))
- <a name="l01683"></a>01683
- <a name="l01684"></a>01684 <span class="preprocessor">#define MARGOLIS_EVEN ( \</span>
- <a name="l01685"></a>01685 <span class="preprocessor"> </span><span class="comment">/* c c' */</span> \
- <a name="l01686"></a>01686 (c & 3) | \
- <a name="l01687"></a>01687 <span class="comment">/* cw cw' */</span> \
- <a name="l01688"></a>01688 (i = ((xx & 1) ? ((yy & 1) ? (w & 3) : (s & 3)) \
- <a name="l01689"></a>01689 : ((yy & 1) ? (n & 3) : (e & 3))), \
- <a name="l01690"></a>01690 (((i & 1) << 2) | ((i & 2) << 4))) | \
- <a name="l01691"></a>01691 <span class="comment">/* ccw ccw' */</span> \
- <a name="l01692"></a>01692 (i = ((xx & 1) ? ((yy & 1) ? (n & 3) : (w & 3)) \
- <a name="l01693"></a>01693 : ((yy & 1) ? (e & 3) : (s & 3))), \
- <a name="l01694"></a>01694 (((i & 1) << 3) | ((i & 2) << 5))) | \
- <a name="l01695"></a>01695 <span class="comment">/* opp opp' */</span> \
- <a name="l01696"></a>01696 (i = ((xx & 1) ? ((yy & 1) ? (nw & 3) : (sw & 3)) \
- <a name="l01697"></a>01697 : ((yy & 1) ? (ne & 3) : (se & 3))), \
- <a name="l01698"></a>01698 (((i & 1) << 4) | ((i & 2) << 6))))
- <a name="l01699"></a>01699
- <a name="l01700"></a>01700 <span class="keywordflow">if</span> (inflation) {
- <a name="l01701"></a>01701 <span class="keywordtype">int</span> last = 0;
- <a name="l01702"></a>01702 <span class="keywordtype">int</span> heat = 0;
- <a name="l01703"></a>01703
- <a name="l01704"></a>01704 <span class="keywordflow">if</span> (phase) {
- <a name="l01705"></a>01705 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_ODD)
- <a name="l01706"></a>01706 } <span class="keywordflow">else</span> {
- <a name="l01707"></a>01707 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_EVEN)
- <a name="l01708"></a>01708 }
- <a name="l01709"></a>01709 } <span class="keywordflow">else</span> {
- <a name="l01710"></a>01710 <span class="keywordflow">if</span> (phase) {
- <a name="l01711"></a>01711 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_ODD)
- <a name="l01712"></a>01712 } <span class="keywordflow">else</span> {
- <a name="l01713"></a>01713 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_EVEN)
- <a name="l01714"></a>01714 }
- <a name="l01715"></a>01715 }
- <a name="l01716"></a>01716 }
- <a name="l01717"></a>01717
- <a name="l01718"></a>01718
- <a name="l01719"></a>01719 <span class="keywordtype">void</span> CellEngine::n_margolis_ph()
- <a name="l01720"></a>01720 {
- <a name="l01721"></a>01721 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
- <a name="l01722"></a>01722
- <a name="l01723"></a>01723 <span class="keyword">register</span> Byte i;
- <a name="l01724"></a>01724
- <a name="l01725"></a>01725 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
- <a name="l01726"></a>01726 <span class="comment">// c c' cw ccw opp cw' ccw' opp' pha pha'</span>
- <a name="l01727"></a>01727 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
- <a name="l01728"></a>01728
- <a name="l01729"></a>01729 <span class="preprocessor">#define MARGOLIS_ODD_PH ( \</span>
- <a name="l01730"></a>01730 <span class="preprocessor"> MARGOLIS_ODD | \</span>
- <a name="l01731"></a>01731 <span class="preprocessor"> 0x100)</span>
- <a name="l01732"></a>01732 <span class="preprocessor"></span>
- <a name="l01733"></a>01733 <span class="preprocessor">#define MARGOLIS_EVEN_PH ( \</span>
- <a name="l01734"></a>01734 <span class="preprocessor"> MARGOLIS_EVEN | \</span>
- <a name="l01735"></a>01735 <span class="preprocessor"> 0x200)</span>
- <a name="l01736"></a>01736 <span class="preprocessor"></span>
- <a name="l01737"></a>01737 <span class="keywordflow">if</span> (inflation) {
- <a name="l01738"></a>01738 <span class="keywordtype">int</span> last = 0;
- <a name="l01739"></a>01739 <span class="keywordtype">int</span> heat = 0;
- <a name="l01740"></a>01740
- <a name="l01741"></a>01741 <span class="keywordflow">if</span> (phase) {
- <a name="l01742"></a>01742 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_ODD_PH)
- <a name="l01743"></a>01743 } <span class="keywordflow">else</span> {
- <a name="l01744"></a>01744 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_EVEN_PH)
- <a name="l01745"></a>01745 }
- <a name="l01746"></a>01746 } <span class="keywordflow">else</span> {
- <a name="l01747"></a>01747 <span class="keywordflow">if</span> (phase) {
- <a name="l01748"></a>01748 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_ODD_PH)
- <a name="l01749"></a>01749 } <span class="keywordflow">else</span> {
- <a name="l01750"></a>01750 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_EVEN_PH)
- <a name="l01751"></a>01751 }
- <a name="l01752"></a>01752 }
- <a name="l01753"></a>01753 }
- <a name="l01754"></a>01754
- <a name="l01755"></a>01755
- <a name="l01756"></a>01756 <span class="keywordtype">void</span> CellEngine::n_margolis_hv()
- <a name="l01757"></a>01757 {
- <a name="l01758"></a>01758 <span class="keywordflow">if</span> (rule == NULL) <span class="keywordflow">return</span>;
- <a name="l01759"></a>01759
- <a name="l01760"></a>01760 <span class="keyword">register</span> Byte i;
- <a name="l01761"></a>01761
- <a name="l01762"></a>01762 <span class="comment">// 0 1 2 3 4 5 6 7 8 9</span>
- <a name="l01763"></a>01763 <span class="comment">// c c' cw ccw opp cw' ccw' opp' horz vert</span>
- <a name="l01764"></a>01764 <span class="comment">// 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200</span>
- <a name="l01765"></a>01765
- <a name="l01766"></a>01766 <span class="preprocessor">#define MARGOLIS_ODD_HV ( \</span>
- <a name="l01767"></a>01767 <span class="preprocessor"> MARGOLIS_ODD | \</span>
- <a name="l01768"></a>01768 <span class="preprocessor"> ((xx & 1) << 8) | \</span>
- <a name="l01769"></a>01769 <span class="preprocessor"> ((yy & 1) << 9))</span>
- <a name="l01770"></a>01770 <span class="preprocessor"></span>
- <a name="l01771"></a>01771 <span class="preprocessor">#define MARGOLIS_EVEN_HV ( \</span>
- <a name="l01772"></a>01772 <span class="preprocessor"> MARGOLIS_EVEN | \</span>
- <a name="l01773"></a>01773 <span class="preprocessor"> ((xx & 1) << 8) | \</span>
- <a name="l01774"></a>01774 <span class="preprocessor"> ((yy & 1) << 9))</span>
- <a name="l01775"></a>01775 <span class="preprocessor"></span>
- <a name="l01776"></a>01776 <span class="keywordflow">if</span> (inflation) {
- <a name="l01777"></a>01777 <span class="keywordtype">int</span> last = 0;
- <a name="l01778"></a>01778 <span class="keywordtype">int</span> heat = 0;
- <a name="l01779"></a>01779
- <a name="l01780"></a>01780 <span class="keywordflow">if</span> (phase) {
- <a name="l01781"></a>01781 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_ODD_HV)
- <a name="l01782"></a>01782 } <span class="keywordflow">else</span> {
- <a name="l01783"></a>01783 CAM_MASKED_REG_TABLE_HEAT6_LOOP(MARGOLIS_EVEN_HV)
- <a name="l01784"></a>01784 }
- <a name="l01785"></a>01785 } <span class="keywordflow">else</span> {
- <a name="l01786"></a>01786 <span class="keywordflow">if</span> (phase) {
- <a name="l01787"></a>01787 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_ODD_HV)
- <a name="l01788"></a>01788 } <span class="keywordflow">else</span> {
- <a name="l01789"></a>01789 CAM_MASKED_REG_TABLE_LOOP(MARGOLIS_EVEN_HV)
- <a name="l01790"></a>01790 }
- <a name="l01791"></a>01791 }
- <a name="l01792"></a>01792 }
- <a name="l01793"></a>01793
- <a name="l01794"></a>01794
- <a name="l01795"></a>01795 <span class="keywordtype">void</span> CellEngine::n_life()
- <a name="l01796"></a>01796 {
- <a name="l01797"></a>01797 <span class="keywordtype">long</span> sum;
- <a name="l01798"></a>01798
- <a name="l01799"></a>01799 <span class="preprocessor">#define LIFE ( \</span>
- <a name="l01800"></a>01800 <span class="preprocessor"> ((c & 1) \</span>
- <a name="l01801"></a>01801 <span class="preprocessor"> ? (((sum = SUM8REG(1)) == 2) || \</span>
- <a name="l01802"></a>01802 <span class="preprocessor"> (sum == 3)) \</span>
- <a name="l01803"></a>01803 <span class="preprocessor"> : ((SUM8REG(1) == 3) ? 1 : 0)) | \</span>
- <a name="l01804"></a>01804 <span class="preprocessor"> ((c & 0x7f) << 1))</span>
- <a name="l01805"></a>01805 <span class="preprocessor"></span>
- <a name="l01806"></a>01806 <span class="keywordflow">if</span> (inflation) {
- <a name="l01807"></a>01807 <span class="keywordtype">int</span> last = 0;
- <a name="l01808"></a>01808 <span class="keywordtype">int</span> heat = 0;
- <a name="l01809"></a>01809
- <a name="l01810"></a>01810 CAM_MASKED_REG_HEAT6_LOOP(LIFE)
- <a name="l01811"></a>01811 } <span class="keywordflow">else</span> {
- <a name="l01812"></a>01812 CAM_MASKED_REG_LOOP(LIFE)
- <a name="l01813"></a>01813 }
- <a name="l01814"></a>01814 }
- <a name="l01815"></a>01815
- <a name="l01816"></a>01816
- <a name="l01817"></a>01817 <span class="keywordtype">void</span> CellEngine::n_brain()
- <a name="l01818"></a>01818 {
- <a name="l01819"></a>01819
- <a name="l01820"></a>01820 <span class="preprocessor">#define BRAIN ( \</span>
- <a name="l01821"></a>01821 <span class="preprocessor"> (((c & 0x03) == 0) \</span>
- <a name="l01822"></a>01822 <span class="preprocessor"> ? ((SUM8REG(1) == 2) ? 1 : 0) \</span>
- <a name="l01823"></a>01823 <span class="preprocessor"> : 0) | \</span>
- <a name="l01824"></a>01824 <span class="preprocessor"> ((c << 1) & 0xfe))</span>
- <a name="l01825"></a>01825 <span class="preprocessor"></span>
- <a name="l01826"></a>01826 <span class="keywordflow">if</span> (inflation) {
- <a name="l01827"></a>01827 <span class="keywordtype">int</span> last = 0;
- <a name="l01828"></a>01828 <span class="keywordtype">int</span> heat = 0;
- <a name="l01829"></a>01829
- <a name="l01830"></a>01830 CAM_MASKED_REG_HEAT6_LOOP(BRAIN)
- <a name="l01831"></a>01831 } <span class="keywordflow">else</span> {
- <a name="l01832"></a>01832 CAM_MASKED_REG_LOOP(BRAIN)
- <a name="l01833"></a>01833 }
- <a name="l01834"></a>01834 }
- <a name="l01835"></a>01835
- <a name="l01836"></a>01836
- <a name="l01837"></a>01837 <span class="keywordtype">void</span> CellEngine::n_heat()
- <a name="l01838"></a>01838 {
- <a name="l01839"></a>01839 <span class="preprocessor">#define HEAT ( \</span>
- <a name="l01840"></a>01840 <span class="preprocessor"> (nw + n + ne + w + frob + e + sw + s + se) >> 3)</span>
- <a name="l01841"></a>01841 <span class="preprocessor"></span>
- <a name="l01842"></a>01842 CAM_MASKED_REG_LOOP(HEAT)
- <a name="l01843"></a>01843 }
- <a name="l01844"></a>01844
- <a name="l01845"></a>01845
- <a name="l01846"></a>01846 <span class="keywordtype">void</span> CellEngine::n_dheat()
- <a name="l01847"></a>01847 {
- <a name="l01848"></a>01848 <span class="keywordtype">long</span> last = 0;
- <a name="l01849"></a>01849
- <a name="l01850"></a>01850 <span class="preprocessor">#define DHEAT \</span>
- <a name="l01851"></a>01851 <span class="preprocessor"> last += (nw + n + ne + w + frob + e + sw + s + se); \</span>
- <a name="l01852"></a>01852 <span class="preprocessor"> *front = (Byte)last >> 3; \</span>
- <a name="l01853"></a>01853 <span class="preprocessor"> last &= 7;</span>
- <a name="l01854"></a>01854 <span class="preprocessor"></span>
- <a name="l01855"></a>01855 CAM_MASKED_REG_LOOP_BODY(DHEAT)
- <a name="l01856"></a>01856 }
- <a name="l01857"></a>01857
- <a name="l01858"></a>01858
- <a name="l01859"></a>01859 <span class="keywordtype">void</span> CellEngine::n_lheat()
- <a name="l01860"></a>01860 {
- <a name="l01861"></a>01861 <span class="preprocessor">#define LHEAT \</span>
- <a name="l01862"></a>01862 <span class="preprocessor"> (Byte)((n + w + e + s + frob) >> 2)</span>
- <a name="l01863"></a>01863 <span class="preprocessor"></span>
- <a name="l01864"></a>01864 CAM_MASKED_REG_LOOP(LHEAT)
- <a name="l01865"></a>01865 }
- <a name="l01866"></a>01866
- <a name="l01867"></a>01867
- <a name="l01868"></a>01868 <span class="keywordtype">void</span> CellEngine::n_ldheat()
- <a name="l01869"></a>01869 {
- <a name="l01870"></a>01870 <span class="keywordtype">long</span> last = 0;
- <a name="l01871"></a>01871
- <a name="l01872"></a>01872 <span class="preprocessor">#define LDHEAT \</span>
- <a name="l01873"></a>01873 <span class="preprocessor"> (Byte)((last = (n + w + e + s + frob + (last & 3))), (last >> 2))</span>
- <a name="l01874"></a>01874 <span class="preprocessor"></span>
- <a name="l01875"></a>01875 CAM_MASKED_REG_LOOP(LDHEAT)
- <a name="l01876"></a>01876 }
- <a name="l01877"></a>01877
- <a name="l01878"></a>01878
- <a name="l01879"></a>01879 <span class="keywordtype">void</span> CellEngine::n_abdheat()
- <a name="l01880"></a>01880 {
- <a name="l01881"></a>01881 <span class="comment">//long last = 0;</span>
- <a name="l01882"></a>01882
- <a name="l01883"></a>01883 <span class="preprocessor">#define ABDHEAT \</span>
- <a name="l01884"></a>01884 <span class="preprocessor"> (Byte)(((n + w + e + s + \</span>
- <a name="l01885"></a>01885 <span class="preprocessor"> (((xx^yy^phase)&1) ? frob : -frob)) >> 2))</span>
- <a name="l01886"></a>01886 <span class="preprocessor"></span>
- <a name="l01887"></a>01887 CAM_MASKED_REG_LOOP(ABDHEAT)
- <a name="l01888"></a>01888 }
- <a name="l01889"></a>01889
- <a name="l01890"></a>01890
- <a name="l01891"></a>01891 <span class="keywordtype">void</span> CellEngine::n_abcdheat()
- <a name="l01892"></a>01892 {
- <a name="l01893"></a>01893 <span class="keywordtype">long</span> last = 0;
- <a name="l01894"></a>01894
- <a name="l01895"></a>01895 <span class="preprocessor">#define ABCDHEAT \</span>
- <a name="l01896"></a>01896 <span class="preprocessor"> (Byte)((last = (n + w + e + s + \</span>
- <a name="l01897"></a>01897 <span class="preprocessor"> (((xx^yy^phase)&1) ? frob : -frob) + \</span>
- <a name="l01898"></a>01898 <span class="preprocessor"> (last & 3)), \</span>
- <a name="l01899"></a>01899 <span class="preprocessor"> (last >> 2)))</span>
- <a name="l01900"></a>01900 <span class="preprocessor"></span>
- <a name="l01901"></a>01901 CAM_MASKED_REG_LOOP(ABCDHEAT)
- <a name="l01902"></a>01902 }
- <a name="l01903"></a>01903
- <a name="l01904"></a>01904
- <a name="l01905"></a>01905 <span class="keywordtype">void</span> CellEngine::n_edheat()
- <a name="l01906"></a>01906 {
- <a name="l01907"></a>01907 <span class="comment">//long last = 0;</span>
- <a name="l01908"></a>01908
- <a name="l01909"></a>01909 CAM_MASKED_REG_LOOP(HEAT)
- <a name="l01910"></a>01910 }
- <a name="l01911"></a>01911
- <a name="l01912"></a>01912
- <a name="l01913"></a>01913 <span class="preprocessor">#define RANCH(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l01914"></a>01914 <span class="preprocessor"> (Byte)(n ^ w ^ e ^ s)</span>
- <a name="l01915"></a>01915 <span class="preprocessor"></span>
- <a name="l01916"></a>01916 <span class="keywordtype">void</span> CellEngine::n_ranch()
- <a name="l01917"></a>01917 {
- <a name="l01918"></a>01918 <span class="preprocessor">#define XRANCH (n ^ s ^ e ^ w)</span>
- <a name="l01919"></a>01919 <span class="preprocessor"></span>
- <a name="l01920"></a>01920 CAM_MASKED_REG_LOOP(XRANCH)
- <a name="l01921"></a>01921 }
- <a name="l01922"></a>01922
- <a name="l01923"></a>01923
- <a name="l01924"></a>01924 <span class="keywordtype">void</span> CellEngine::n_anneal()
- <a name="l01925"></a>01925 {
- <a name="l01926"></a>01926 <span class="keywordtype">long</span> sum;
- <a name="l01927"></a>01927
- <a name="l01928"></a>01928 <span class="preprocessor">#define ANNEAL ( \</span>
- <a name="l01929"></a>01929 <span class="preprocessor"> (((sum = SUM9REG(1)) > 5) || (sum == 4)) | \</span>
- <a name="l01930"></a>01930 <span class="preprocessor"> ((c&0x7f) << 1))</span>
- <a name="l01931"></a>01931 <span class="preprocessor"></span>
- <a name="l01932"></a>01932 CAM_MASKED_REG_LOOP(ANNEAL)
- <a name="l01933"></a>01933 }
- <a name="l01934"></a>01934
- <a name="l01935"></a>01935
- <a name="l01936"></a>01936 <span class="keywordtype">void</span> CellEngine::n_anneal4()
- <a name="l01937"></a>01937 {
- <a name="l01938"></a>01938 <span class="keywordtype">long</span> sum0 = 0;
- <a name="l01939"></a>01939 <span class="keywordtype">long</span> sum1 = 0;
- <a name="l01940"></a>01940 <span class="keywordtype">long</span> sum2 = 0;
- <a name="l01941"></a>01941 <span class="keywordtype">long</span> sum3 = 0;
- <a name="l01942"></a>01942
- <a name="l01943"></a>01943 <span class="preprocessor">#define ANNEAL4 ( \</span>
- <a name="l01944"></a>01944 <span class="preprocessor"> ((((sum0 = (SUM9REG(1) >> 0)) > 5) || (sum0 == 4)) ? 1 : 0) | \</span>
- <a name="l01945"></a>01945 <span class="preprocessor"> ((((sum1 = (SUM9REG(2) >> 1)) > 5) || (sum1 == 4)) ? 2 : 0) | \</span>
- <a name="l01946"></a>01946 <span class="preprocessor"> ((((sum2 = (SUM9REG(4) >> 2)) > 5) || (sum2 == 4)) ? 4 : 0) | \</span>
- <a name="l01947"></a>01947 <span class="preprocessor"> ((((sum3 = (SUM9REG(8) >> 3)) > 5) || (sum3 == 4)) ? 8 : 0) | \</span>
- <a name="l01948"></a>01948 <span class="preprocessor"> ((c & 0x0f) << 4))</span>
- <a name="l01949"></a>01949 <span class="preprocessor"></span>
- <a name="l01950"></a>01950 CAM_MASKED_REG_LOOP(ANNEAL4)
- <a name="l01951"></a>01951 }
- <a name="l01952"></a>01952
- <a name="l01953"></a>01953
- <a name="l01954"></a>01954 <span class="keywordtype">void</span> CellEngine::n_anneal8()
- <a name="l01955"></a>01955 {
- <a name="l01956"></a>01956 <span class="keywordtype">long</span> sum0 = 0;
- <a name="l01957"></a>01957 <span class="keywordtype">long</span> sum1 = 0;
- <a name="l01958"></a>01958 <span class="keywordtype">long</span> sum2 = 0;
- <a name="l01959"></a>01959 <span class="keywordtype">long</span> sum3 = 0;
- <a name="l01960"></a>01960 <span class="keywordtype">long</span> sum4 = 0;
- <a name="l01961"></a>01961 <span class="keywordtype">long</span> sum5 = 0;
- <a name="l01962"></a>01962 <span class="keywordtype">long</span> sum6 = 0;
- <a name="l01963"></a>01963 <span class="keywordtype">long</span> sum7 = 0;
- <a name="l01964"></a>01964
- <a name="l01965"></a>01965 <span class="preprocessor">#define ANNEAL8 ( \</span>
- <a name="l01966"></a>01966 <span class="preprocessor"> ((((sum0 = (SUM9REG(1) >> 0)) > 5) || (sum0 == 4)) ? 1 : 0) | \</span>
- <a name="l01967"></a>01967 <span class="preprocessor"> ((((sum1 = (SUM9REG(2) >> 1)) > 5) || (sum1 == 4)) ? 2 : 0) | \</span>
- <a name="l01968"></a>01968 <span class="preprocessor"> ((((sum2 = (SUM9REG(4) >> 2)) > 5) || (sum2 == 4)) ? 4 : 0) | \</span>
- <a name="l01969"></a>01969 <span class="preprocessor"> ((((sum3 = (SUM9REG(8) >> 3)) > 5) || (sum3 == 4)) ? 8 : 0) | \</span>
- <a name="l01970"></a>01970 <span class="preprocessor"> ((((sum4 = (SUM9REG(16) >> 4)) > 5) || (sum4 == 4)) ? 16 : 0) | \</span>
- <a name="l01971"></a>01971 <span class="preprocessor"> ((((sum5 = (SUM9REG(32) >> 5)) > 5) || (sum5 == 4)) ? 32 : 0) | \</span>
- <a name="l01972"></a>01972 <span class="preprocessor"> ((((sum6 = (SUM9REG(64) >> 6)) > 5) || (sum6 == 4)) ? 64 : 0) | \</span>
- <a name="l01973"></a>01973 <span class="preprocessor"> ((((sum7 = (SUM9REG(128) >> 7)) > 5) || (sum7 == 4)) ? 128 : 0))</span>
- <a name="l01974"></a>01974 <span class="preprocessor"></span>
- <a name="l01975"></a>01975 CAM_MASKED_REG_LOOP(ANNEAL8)
- <a name="l01976"></a>01976 }
- <a name="l01977"></a>01977
- <a name="l01978"></a>01978
- <a name="l01979"></a>01979 <span class="keywordtype">void</span> CellEngine::n_eco()
- <a name="l01980"></a>01980 {
- <a name="l01981"></a>01981 <span class="keywordtype">long</span> sum;
- <a name="l01982"></a>01982
- <a name="l01983"></a>01983 <span class="preprocessor">#define ANTILIFE ( \</span>
- <a name="l01984"></a>01984 <span class="preprocessor"> ((sum = SUM8REG(1)), \</span>
- <a name="l01985"></a>01985 <span class="preprocessor"> (((c&1) ? (sum != 5) : (((sum != 5) && (sum != 6)) ? 1 : 0)) | \</span>
- <a name="l01986"></a>01986 <span class="preprocessor"> ((c&0x7f) << 1))))</span>
- <a name="l01987"></a>01987 <span class="preprocessor"></span>
- <a name="l01988"></a>01988 <span class="preprocessor">#define ECO ( \</span>
- <a name="l01989"></a>01989 <span class="preprocessor"> ((((sum = (SUM9REG(128) >> 7)) > 5) || (sum == 4)) \</span>
- <a name="l01990"></a>01990 <span class="preprocessor"> ? ((ANTILIFE & 127) | 128) \</span>
- <a name="l01991"></a>01991 <span class="preprocessor"> : (BRAIN & 127)))</span>
- <a name="l01992"></a>01992 <span class="preprocessor"></span>
- <a name="l01993"></a>01993 <span class="keywordflow">if</span> (inflation) {
- <a name="l01994"></a>01994 <span class="keywordtype">int</span> last = 0;
- <a name="l01995"></a>01995 <span class="keywordtype">int</span> heat = 0;
- <a name="l01996"></a>01996
- <a name="l01997"></a>01997 CAM_MASKED_REG_HEAT4_LOOP(ECO)
- <a name="l01998"></a>01998 } <span class="keywordflow">else</span> {
- <a name="l01999"></a>01999 CAM_MASKED_REG_LOOP(ECO)
- <a name="l02000"></a>02000 }
- <a name="l02001"></a>02001 }
- <a name="l02002"></a>02002
- <a name="l02003"></a>02003
- <a name="l02004"></a>02004 <span class="keywordtype">void</span> CellEngine::n_torben()
- <a name="l02005"></a>02005 {
- <a name="l02006"></a>02006 <span class="keywordtype">long</span> sum1;
- <a name="l02007"></a>02007
- <a name="l02008"></a>02008 <span class="comment">// 0 0 0 1 0 1 0 1 1 1</span>
- <a name="l02009"></a>02009
- <a name="l02010"></a>02010 <span class="preprocessor">#define TORBEN ( \</span>
- <a name="l02011"></a>02011 <span class="preprocessor"> ((((sum1 = SUM9REG(1)) > 6) || (sum1 == 5) || (sum1 == 3)) ? 1 : 0) | \</span>
- <a name="l02012"></a>02012 <span class="preprocessor"> ((c & 0x7f) << 1))</span>
- <a name="l02013"></a>02013 <span class="preprocessor"></span>
- <a name="l02014"></a>02014 CAM_MASKED_REG_LOOP(TORBEN)
- <a name="l02015"></a>02015 }
- <a name="l02016"></a>02016
- <a name="l02017"></a>02017
- <a name="l02018"></a>02018 <span class="keywordtype">void</span> CellEngine::n_torben2()
- <a name="l02019"></a>02019 {
- <a name="l02020"></a>02020 <span class="keywordtype">long</span> sum2;
- <a name="l02021"></a>02021
- <a name="l02022"></a>02022 <span class="comment">// 0 0 0 1 0 1 0 1 1 1</span>
- <a name="l02023"></a>02023 <span class="comment">// 0 0 1 0 1 0 1 0 1 1</span>
- <a name="l02024"></a>02024
- <a name="l02025"></a>02025 <span class="preprocessor">#define TORBEN2 ( \</span>
- <a name="l02026"></a>02026 <span class="preprocessor"> ((((sum2 = SUM9REG(1)) > 6) || (sum2 == 3) || (sum2 == 4)) ? 1 : 0) | \</span>
- <a name="l02027"></a>02027 <span class="preprocessor"> ((c & 0x7f) << 1))</span>
- <a name="l02028"></a>02028 <span class="preprocessor"></span>
- <a name="l02029"></a>02029 CAM_MASKED_REG_LOOP(TORBEN2)
- <a name="l02030"></a>02030 }
- <a name="l02031"></a>02031
- <a name="l02032"></a>02032
- <a name="l02033"></a>02033 <span class="keywordtype">void</span> CellEngine::n_torben3()
- <a name="l02034"></a>02034 {
- <a name="l02035"></a>02035 <span class="keywordtype">long</span> sum1;
- <a name="l02036"></a>02036 <span class="keywordtype">long</span> sum2;
- <a name="l02037"></a>02037
- <a name="l02038"></a>02038 <span class="comment">// 0 0 0 1 1 0 0 1 1 1</span>
- <a name="l02039"></a>02039
- <a name="l02040"></a>02040 <span class="preprocessor">#define TORBEN3 ((TORBEN) ^ (TORBEN2))</span>
- <a name="l02041"></a>02041 <span class="preprocessor"></span>
- <a name="l02042"></a>02042 CAM_MASKED_REG_LOOP(TORBEN3)
- <a name="l02043"></a>02043 }
- <a name="l02044"></a>02044
- <a name="l02045"></a>02045
- <a name="l02046"></a>02046 <span class="keywordtype">void</span> CellEngine::n_torben4()
- <a name="l02047"></a>02047 {
- <a name="l02048"></a>02048 <span class="keywordtype">long</span> sum;
- <a name="l02049"></a>02049
- <a name="l02050"></a>02050 <span class="comment">// 1 0 0 0 1 0 1 1 1 0</span>
- <a name="l02051"></a>02051
- <a name="l02052"></a>02052 <span class="preprocessor">#define TORBEN4 ( \</span>
- <a name="l02053"></a>02053 <span class="preprocessor"> ((((sum = SUM9REG(1)) == 0) || \</span>
- <a name="l02054"></a>02054 <span class="preprocessor"> (sum == 4) || \</span>
- <a name="l02055"></a>02055 <span class="preprocessor"> (sum == 6) || \</span>
- <a name="l02056"></a>02056 <span class="preprocessor"> (sum == 7) || \</span>
- <a name="l02057"></a>02057 <span class="preprocessor"> (sum == 8)) ? 1 : 0) | \</span>
- <a name="l02058"></a>02058 <span class="preprocessor"> ((c&0x7f) << 1))</span>
- <a name="l02059"></a>02059 <span class="preprocessor"></span>
- <a name="l02060"></a>02060 CAM_MASKED_REG_LOOP(TORBEN4)
- <a name="l02061"></a>02061 }
- <a name="l02062"></a>02062
- <a name="l02063"></a>02063
- <a name="l02064"></a>02064 <span class="keywordtype">void</span> CellEngine::n_ball()
- <a name="l02065"></a>02065 {
- <a name="l02066"></a>02066 <span class="comment">// This spatio temporal phase synchronization is busted.</span>
- <a name="l02067"></a>02067 <span class="comment">// It stays in synch for vertical and horizontal movement,</span>
- <a name="l02068"></a>02068 <span class="comment">// but gets out of phase for diagonal movement,</span>
- <a name="l02069"></a>02069 <span class="comment">// and I can't figure out how to keep it in phase</span>
- <a name="l02070"></a>02070 <span class="comment">// regardless of position.</span>
- <a name="l02071"></a>02071 <span class="keywordtype">char</span> p = ((phase ^ x ^ y) & 1);
- <a name="l02072"></a>02072 <span class="keywordtype">long</span> xx, yy, r = Rand16();
- <a name="l02073"></a>02073 Byte *front = frontMem;
- <a name="l02074"></a>02074 Byte *back = backMem +
- <a name="l02075"></a>02075 (backBorder - 1) +
- <a name="l02076"></a>02076 ((backBorder - 1) * backRowBytes);
- <a name="l02077"></a>02077
- <a name="l02078"></a>02078 <span class="keywordflow">if</span> (!p) {
- <a name="l02079"></a>02079 back += 1 + backRowBytes;
- <a name="l02080"></a>02080 }
- <a name="l02081"></a>02081
- <a name="l02082"></a>02082 <span class="keywordflow">for</span> (yy = p + (height >>1);
- <a name="l02083"></a>02083 yy > 0;
- <a name="l02084"></a>02084 yy--) {
- <a name="l02085"></a>02085 <span class="keywordflow">for</span> (xx = p + (width >>1);
- <a name="l02086"></a>02086 xx > 0;
- <a name="l02087"></a>02087 xx--) {
- <a name="l02088"></a>02088 Byte nw = back[0], nw0 = nw >> 6,
- <a name="l02089"></a>02089 ne = back[1], ne0 = ne >> 6,
- <a name="l02090"></a>02090 sw = back[backRowBytes], sw0 = sw >> 6,
- <a name="l02091"></a>02091 se = back[backRowBytes+1], se0 = se >> 6;
- <a name="l02092"></a>02092
- <a name="l02093"></a>02093 <span class="comment">// r += nw + ne + sw + sw; r >>= 1;</span>
- <a name="l02094"></a>02094 r += (nw0&1) + (ne0&1) + (sw0&1) + (se0&1); r >>= 1;
- <a name="l02095"></a>02095
- <a name="l02096"></a>02096 <span class="keywordflow">if</span> ((nw0 | ne0 | sw0 | se0) & 2) {
- <a name="l02097"></a>02097 <span class="keywordflow">if</span> (nw0 == 1) {
- <a name="l02098"></a>02098 back[0] |= 128;
- <a name="l02099"></a>02099 }
- <a name="l02100"></a>02100 <span class="keywordflow">if</span> (ne0 == 1) {
- <a name="l02101"></a>02101 back[1] |= 128;
- <a name="l02102"></a>02102 }
- <a name="l02103"></a>02103 <span class="keywordflow">if</span> (sw0 == 1) {
- <a name="l02104"></a>02104 back[backRowBytes] |= 128;
- <a name="l02105"></a>02105 }
- <a name="l02106"></a>02106 <span class="keywordflow">if</span> (se0 == 1) {
- <a name="l02107"></a>02107 back[backRowBytes+1] |= 128;
- <a name="l02108"></a>02108 }
- <a name="l02109"></a>02109 } <span class="keywordflow">else</span> {
- <a name="l02110"></a>02110
- <a name="l02111"></a>02111 <span class="keywordflow">switch</span> ((nw0&1) + (ne0&1) + (sw0&1) + (se0&1)) {
- <a name="l02112"></a>02112
- <a name="l02113"></a>02113 <span class="keywordflow">case</span> 0:
- <a name="l02114"></a>02114 <span class="keywordflow">case</span> 3:
- <a name="l02115"></a>02115 <span class="keywordflow">case</span> 4:
- <a name="l02116"></a>02116 <span class="comment">// same</span>
- <a name="l02117"></a>02117 back[0] = nw; back[1] = ne;
- <a name="l02118"></a>02118 back[backRowBytes] = sw;
- <a name="l02119"></a>02119 back[backRowBytes+1] = se;
- <a name="l02120"></a>02120 <span class="keywordflow">break</span>;
- <a name="l02121"></a>02121
- <a name="l02122"></a>02122 <span class="keywordflow">case</span> 1:
- <a name="l02123"></a>02123 <span class="comment">// reflect</span>
- <a name="l02124"></a>02124 back[0] = se; back[1] = sw;
- <a name="l02125"></a>02125 back[backRowBytes] = ne;
- <a name="l02126"></a>02126 back[backRowBytes+1] = nw;
- <a name="l02127"></a>02127 <span class="keywordflow">break</span>;
- <a name="l02128"></a>02128
- <a name="l02129"></a>02129 <span class="keywordflow">case</span> 2:
- <a name="l02130"></a>02130 <span class="comment">// turn</span>
- <a name="l02131"></a>02131 <span class="keywordflow">switch</span> (((nw0&1) <<3) |
- <a name="l02132"></a>02132 ((ne0&1) <<2) |
- <a name="l02133"></a>02133 ((sw0&1) <<1) |
- <a name="l02134"></a>02134 (se0&1)) {
- <a name="l02135"></a>02135
- <a name="l02136"></a>02136 <span class="keywordflow">case</span> 6:
- <a name="l02137"></a>02137 <span class="keywordflow">case</span> 9:
- <a name="l02138"></a>02138 <span class="keywordflow">if</span> (r&1) {
- <a name="l02139"></a>02139 <span class="comment">// clockwise</span>
- <a name="l02140"></a>02140 back[0] = sw; back[1] = nw;
- <a name="l02141"></a>02141 back[backRowBytes] = se;
- <a name="l02142"></a>02142 back[backRowBytes+1] = ne;
- <a name="l02143"></a>02143 } <span class="keywordflow">else</span> {
- <a name="l02144"></a>02144 <span class="comment">// counterclockwise</span>
- <a name="l02145"></a>02145 back[0] = ne; back[1] = se;
- <a name="l02146"></a>02146 back[backRowBytes] = nw;
- <a name="l02147"></a>02147 back[backRowBytes+1] = sw;
- <a name="l02148"></a>02148 }
- <a name="l02149"></a>02149 <span class="keywordflow">break</span>;
- <a name="l02150"></a>02150
- <a name="l02151"></a>02151 <span class="keywordflow">default</span>:
- <a name="l02152"></a>02152 back[0] = nw; back[1] = ne;
- <a name="l02153"></a>02153 back[backRowBytes] = sw;
- <a name="l02154"></a>02154 back[backRowBytes+1] = se;
- <a name="l02155"></a>02155 <span class="keywordflow">break</span>;
- <a name="l02156"></a>02156
- <a name="l02157"></a>02157 } <span class="comment">// switch</span>
- <a name="l02158"></a>02158
- <a name="l02159"></a>02159 <span class="keywordflow">break</span>;
- <a name="l02160"></a>02160
- <a name="l02161"></a>02161 } <span class="comment">// switch</span>
- <a name="l02162"></a>02162 } <span class="comment">// if</span>
- <a name="l02163"></a>02163
- <a name="l02164"></a>02164 back += 2;
- <a name="l02165"></a>02165 }
- <a name="l02166"></a>02166 back += (backRowBytes * 2) - width - (p * 2);
- <a name="l02167"></a>02167 }
- <a name="l02168"></a>02168
- <a name="l02169"></a>02169 back = backMem +
- <a name="l02170"></a>02170 backBorder +
- <a name="l02171"></a>02171 (backBorder * backRowBytes);
- <a name="l02172"></a>02172 front = frontMem;
- <a name="l02173"></a>02173
- <a name="l02174"></a>02174 <span class="keywordflow">for</span> (yy = height;
- <a name="l02175"></a>02175 yy > 0;
- <a name="l02176"></a>02176 yy--) {
- <a name="l02177"></a>02177 memcpy(front, back, width);
- <a name="l02178"></a>02178 back += backRowBytes;
- <a name="l02179"></a>02179 front += screenRowBytes;
- <a name="l02180"></a>02180 }
- <a name="l02181"></a>02181 }
- <a name="l02182"></a>02182
- <a name="l02183"></a>02183
- <a name="l02184"></a>02184 <span class="preprocessor">#define FDHEAT(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l02185"></a>02185 <span class="preprocessor"> error += (nw + n + ne + w + frob + e + sw + s + se); \</span>
- <a name="l02186"></a>02186 <span class="preprocessor"> result = error >> 3; \</span>
- <a name="l02187"></a>02187 <span class="preprocessor"> error &= 7;</span>
- <a name="l02188"></a>02188 <span class="preprocessor"></span>
- <a name="l02189"></a>02189
- <a name="l02190"></a>02190 <span class="preprocessor">#ifndef _WIN32</span>
- <a name="l02191"></a>02191 <span class="preprocessor"></span>
- <a name="l02192"></a>02192
- <a name="l02193"></a>02193 <span class="keywordtype">void</span> CellEngine::n_fdheat()
- <a name="l02194"></a>02194 {
- <a name="l02195"></a>02195 QUAD *front = (QUAD *)frontMem;
- <a name="l02196"></a>02196 QUAD *back = (QUAD *)(backMem +
- <a name="l02197"></a>02197 (backBorder - 1) +
- <a name="l02198"></a>02198 ((backBorder - 1) * backRowBytes));
- <a name="l02199"></a>02199 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l02200"></a>02200 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l02201"></a>02201 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l02202"></a>02202 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l02203"></a>02203 <span class="keywordtype">long</span> yy;
- <a name="l02204"></a>02204
- <a name="l02205"></a>02205 total = 0;
- <a name="l02206"></a>02206
- <a name="l02207"></a>02207 <span class="keywordflow">for</span> (yy = height;
- <a name="l02208"></a>02208 yy > 0;
- <a name="l02209"></a>02209 back += backstride,
- <a name="l02210"></a>02210 front += frontstride,
- <a name="l02211"></a>02211 yy--) {
- <a name="l02212"></a>02212 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l02213"></a>02213 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l02214"></a>02214 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l02215"></a>02215 <span class="keywordtype">long</span> error = 0;
- <a name="l02216"></a>02216 <span class="keywordtype">long</span> xx;
- <a name="l02217"></a>02217
- <a name="l02218"></a>02218 b2 = back[0];
- <a name="l02219"></a>02219 c2 = back[backline];
- <a name="l02220"></a>02220 d2 = back[backline << 1];
- <a name="l02221"></a>02221 back++;
- <a name="l02222"></a>02222
- <a name="l02223"></a>02223 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l02224"></a>02224 xx > 0;
- <a name="l02225"></a>02225 xx--) {
- <a name="l02226"></a>02226 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l02227"></a>02227
- <a name="l02228"></a>02228 b1 = b2; b2 = back[0];
- <a name="l02229"></a>02229 c1 = c2; c2 = back[backline];
- <a name="l02230"></a>02230 d1 = d2; d2 = back[backline << 1];
- <a name="l02231"></a>02231 back++;
- <a name="l02232"></a>02232
- <a name="l02233"></a>02233 FDHEAT( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l02234"></a>02234 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l02235"></a>02235 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l02236"></a>02236 total += result;
- <a name="l02237"></a>02237 SETBYTE0(cells, result);
- <a name="l02238"></a>02238
- <a name="l02239"></a>02239 FDHEAT( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l02240"></a>02240 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l02241"></a>02241 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l02242"></a>02242 total += result;
- <a name="l02243"></a>02243 SETBYTE1(cells, result);
- <a name="l02244"></a>02244
- <a name="l02245"></a>02245 FDHEAT( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l02246"></a>02246 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l02247"></a>02247 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l02248"></a>02248 total += result;
- <a name="l02249"></a>02249 SETBYTE2(cells, result);
- <a name="l02250"></a>02250
- <a name="l02251"></a>02251 FDHEAT( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l02252"></a>02252 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l02253"></a>02253 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l02254"></a>02254 total += result;
- <a name="l02255"></a>02255 SETBYTE3(cells, result);
- <a name="l02256"></a>02256
- <a name="l02257"></a>02257 *front = cells;
- <a name="l02258"></a>02258 front++;
- <a name="l02259"></a>02259 }
- <a name="l02260"></a>02260 }
- <a name="l02261"></a>02261 }
- <a name="l02262"></a>02262
- <a name="l02263"></a>02263
- <a name="l02264"></a>02264 <span class="preprocessor">#else</span>
- <a name="l02265"></a>02265 <span class="preprocessor"></span>
- <a name="l02266"></a>02266
- <a name="l02267"></a>02267 <span class="keyword">class </span>CellEngine *cellEngine = NULL; <span class="comment">// to fool the assembler</span>
- <a name="l02268"></a>02268
- <a name="l02269"></a>02269 <span class="keywordtype">void</span> CellEngine::n_fdheat()
- <a name="l02270"></a>02270 {
- <a name="l02271"></a>02271 <span class="keywordtype">long</span> nextbackline;
- <a name="l02272"></a>02272 <span class="keywordtype">long</span> frontstride;
- <a name="l02273"></a>02273 <span class="keywordtype">char</span> *back;
- <a name="l02274"></a>02274 <span class="keywordtype">char</span> *front;
- <a name="l02275"></a>02275 <span class="keywordtype">long</span> yy;
- <a name="l02276"></a>02276 <span class="keywordtype">long</span> xsteps;
- <a name="l02277"></a>02277 <span class="keywordtype">long</span> backline;
- <a name="l02278"></a>02278 <span class="keywordtype">long</span> backstride;
- <a name="l02279"></a>02279 <span class="keywordtype">long</span> b2;
- <a name="l02280"></a>02280 <span class="keywordtype">long</span> c1;
- <a name="l02281"></a>02281 <span class="keywordtype">long</span> c2;
- <a name="l02282"></a>02282 <span class="keywordtype">long</span> d1;
- <a name="l02283"></a>02283 <span class="keywordtype">long</span> d2;
- <a name="l02284"></a>02284 <span class="keywordtype">long</span> error;
- <a name="l02285"></a>02285 <span class="keywordtype">long</span> xx;
- <a name="l02286"></a>02286 <span class="keywordtype">long</span> b1;
- <a name="l02287"></a>02287 <span class="keywordtype">long</span> result;
- <a name="l02288"></a>02288 <span class="keywordtype">long</span> cells;
- <a name="l02289"></a>02289 <span class="keywordtype">long</span> frob;
- <a name="l02290"></a>02290 <span class="keywordtype">long</span> total;
- <a name="l02291"></a>02291
- <a name="l02292"></a>02292 __asm {
- <a name="l02293"></a>02293
- <a name="l02294"></a>02294 <span class="comment">// 1846 : QUAD *front = (QUAD *)frontMem;</span>
- <a name="l02295"></a>02295
- <a name="l02296"></a>02296 mov ecx, DWORD PTR [<span class="keyword">this</span>]
- <a name="l02297"></a>02297 mov eax, DWORD PTR [ecx].frontMem
- <a name="l02298"></a>02298 mov DWORD PTR [front], eax
- <a name="l02299"></a>02299
- <a name="l02300"></a>02300 <span class="comment">// 1847 : QUAD *back = (QUAD *)(backMem +</span>
- <a name="l02301"></a>02301 <span class="comment">// 1848 : (backBorder - 1) +</span>
- <a name="l02302"></a>02302 <span class="comment">// 1849 : ((backBorder - 1) * backRowBytes));</span>
- <a name="l02303"></a>02303
- <a name="l02304"></a>02304 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02305"></a>02305 mov eax, DWORD PTR [ecx].backBorder
- <a name="l02306"></a>02306 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02307"></a>02307 mov edx, DWORD PTR [ecx].backMem
- <a name="l02308"></a>02308 lea eax, DWORD PTR [edx+eax-1]
- <a name="l02309"></a>02309 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02310"></a>02310 mov edx, DWORD PTR [ecx].backBorder
- <a name="l02311"></a>02311 sub edx, 1
- <a name="l02312"></a>02312 mov ecx, DWORD PTR [<span class="keyword">this</span>]
- <a name="l02313"></a>02313 imul edx, DWORD PTR [ecx].backRowBytes
- <a name="l02314"></a>02314 <span class="keyword">add</span> eax, edx
- <a name="l02315"></a>02315 mov DWORD PTR [back], eax
- <a name="l02316"></a>02316
- <a name="l02317"></a>02317 <span class="comment">// 1850 : long backline = backRowBytes >> 2;</span>
- <a name="l02318"></a>02318
- <a name="l02319"></a>02319 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02320"></a>02320 mov eax, DWORD PTR [ecx].backRowBytes
- <a name="l02321"></a>02321 sar eax, 2
- <a name="l02322"></a>02322 mov DWORD PTR [backline], eax
- <a name="l02323"></a>02323
- <a name="l02324"></a>02324 <span class="comment">// 1851 : long nextbackline = backline << 1;</span>
- <a name="l02325"></a>02325
- <a name="l02326"></a>02326 mov eax, DWORD PTR [backline]
- <a name="l02327"></a>02327 shl eax, 1
- <a name="l02328"></a>02328 mov DWORD PTR [nextbackline], eax
- <a name="l02329"></a>02329
- <a name="l02330"></a>02330 <span class="comment">// 1852 : long backstride = backline - ((width >> 2) + 1);</span>
- <a name="l02331"></a>02331
- <a name="l02332"></a>02332 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02333"></a>02333 mov eax, DWORD PTR [ecx]cellEngine.width
- <a name="l02334"></a>02334 sar eax, 2
- <a name="l02335"></a>02335 <span class="keyword">add</span> eax, 1
- <a name="l02336"></a>02336 mov edx, DWORD PTR [backline]
- <a name="l02337"></a>02337 sub edx, eax
- <a name="l02338"></a>02338 mov DWORD PTR [backstride], edx
- <a name="l02339"></a>02339
- <a name="l02340"></a>02340 <span class="comment">// 1853 : long frontstride = (screenRowBytes >> 2) - (width >> 2);</span>
- <a name="l02341"></a>02341
- <a name="l02342"></a>02342 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02343"></a>02343 mov eax, DWORD PTR [ecx].screenRowBytes
- <a name="l02344"></a>02344 sar eax, 2
- <a name="l02345"></a>02345 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02346"></a>02346 mov edx, DWORD PTR [ecx]cellEngine.width
- <a name="l02347"></a>02347 sar edx, 2
- <a name="l02348"></a>02348 sub eax, edx
- <a name="l02349"></a>02349 mov DWORD PTR [frontstride], eax
- <a name="l02350"></a>02350
- <a name="l02351"></a>02351 <span class="comment">// 1854 : long xsteps = width >> 2;</span>
- <a name="l02352"></a>02352
- <a name="l02353"></a>02353 <span class="comment">// mov eax, DWORD PTR [this]</span>
- <a name="l02354"></a>02354 mov edx, DWORD PTR [ecx]cellEngine.width
- <a name="l02355"></a>02355 sar edx, 2
- <a name="l02356"></a>02356 mov DWORD PTR [xsteps], edx
- <a name="l02357"></a>02357
- <a name="l02358"></a>02358 <span class="comment">// 1855 : long yy;</span>
- <a name="l02359"></a>02359 <span class="comment">// 1856 :</span>
- <a name="l02360"></a>02360 <span class="comment">// 1857 : total = 0;</span>
- <a name="l02361"></a>02361
- <a name="l02362"></a>02362 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02363"></a>02363 mov DWORD PTR [total], 0
- <a name="l02364"></a>02364
- <a name="l02365"></a>02365 <span class="comment">// long frob = this->frob;</span>
- <a name="l02366"></a>02366 mov eax, DWORD PTR [ecx].frob
- <a name="l02367"></a>02367 mov [frob], eax
- <a name="l02368"></a>02368
- <a name="l02369"></a>02369 <span class="comment">// 1858 :</span>
- <a name="l02370"></a>02370 <span class="comment">// 1859 : for (yy = height;</span>
- <a name="l02371"></a>02371
- <a name="l02372"></a>02372 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02373"></a>02373 mov eax, DWORD PTR [ecx]cellEngine.height
- <a name="l02374"></a>02374 mov DWORD PTR [yy], eax
- <a name="l02375"></a>02375
- <a name="l02376"></a>02376 <span class="comment">// 1860 : yy > 0;</span>
- <a name="l02377"></a>02377 <span class="comment">// 1861 : back += backstride,</span>
- <a name="l02378"></a>02378 <span class="comment">// 1862 : front += frontstride,</span>
- <a name="l02379"></a>02379 <span class="comment">// 1863 : yy--) {</span>
- <a name="l02380"></a>02380
- <a name="l02381"></a>02381 jmp SHORT _L76116
- <a name="l02382"></a>02382
- <a name="l02383"></a>02383 _L76117:
- <a name="l02384"></a>02384 mov edx, DWORD PTR [backstride]
- <a name="l02385"></a>02385 mov eax, DWORD PTR [back]
- <a name="l02386"></a>02386 lea ecx, DWORD PTR [eax+edx*4]
- <a name="l02387"></a>02387 mov DWORD PTR [back], ecx
- <a name="l02388"></a>02388 mov edx, DWORD PTR [frontstride]
- <a name="l02389"></a>02389 mov eax, DWORD PTR [front]
- <a name="l02390"></a>02390 lea ecx, DWORD PTR [eax+edx*4]
- <a name="l02391"></a>02391 mov DWORD PTR [front], ecx
- <a name="l02392"></a>02392 mov edx, DWORD PTR [yy]
- <a name="l02393"></a>02393 sub edx, 1
- <a name="l02394"></a>02394 mov DWORD PTR [yy], edx
- <a name="l02395"></a>02395
- <a name="l02396"></a>02396 _L76116:
- <a name="l02397"></a>02397 cmp DWORD PTR [yy], 0
- <a name="l02398"></a>02398 jle _L76118
- <a name="l02399"></a>02399
- <a name="l02400"></a>02400 <span class="comment">// 1864 : register QUAD b1, b2;</span>
- <a name="l02401"></a>02401 <span class="comment">// 1865 : register QUAD c1, c2;</span>
- <a name="l02402"></a>02402 <span class="comment">// 1866 : register QUAD d1, d2;</span>
- <a name="l02403"></a>02403 <span class="comment">// 1867 : long error = 0;</span>
- <a name="l02404"></a>02404
- <a name="l02405"></a>02405 mov DWORD PTR [error], 0
- <a name="l02406"></a>02406
- <a name="l02407"></a>02407 <span class="comment">// 1868 : long xx;</span>
- <a name="l02408"></a>02408 <span class="comment">// 1869 :</span>
- <a name="l02409"></a>02409 <span class="comment">// 1870 : b2 = back[0];</span>
- <a name="l02410"></a>02410
- <a name="l02411"></a>02411 mov eax, DWORD PTR [back]
- <a name="l02412"></a>02412 mov ecx, DWORD PTR [eax]
- <a name="l02413"></a>02413 mov DWORD PTR [b2], ecx
- <a name="l02414"></a>02414
- <a name="l02415"></a>02415 <span class="comment">// 1871 : c2 = back[backline];</span>
- <a name="l02416"></a>02416
- <a name="l02417"></a>02417 mov edx, DWORD PTR [backline]
- <a name="l02418"></a>02418 <span class="comment">// mov eax, DWORD PTR [back] // redundant</span>
- <a name="l02419"></a>02419 mov ecx, DWORD PTR [eax+edx*4]
- <a name="l02420"></a>02420 mov DWORD PTR [c2], ecx
- <a name="l02421"></a>02421
- <a name="l02422"></a>02422 <span class="comment">// 1872 : d2 = back[backline << 1];</span>
- <a name="l02423"></a>02423
- <a name="l02424"></a>02424 <span class="comment">// mov edx, DWORD PTR [backline] // redundant</span>
- <a name="l02425"></a>02425 shl edx, 1
- <a name="l02426"></a>02426 <span class="comment">// mov eax, DWORD PTR [back] // redundant</span>
- <a name="l02427"></a>02427 mov ecx, DWORD PTR [eax+edx*4]
- <a name="l02428"></a>02428 mov DWORD PTR [d2], ecx
- <a name="l02429"></a>02429
- <a name="l02430"></a>02430 <span class="comment">// 1873 : back++;</span>
- <a name="l02431"></a>02431
- <a name="l02432"></a>02432 <span class="comment">// mov edx, DWORD PTR [back] // redundant</span>
- <a name="l02433"></a>02433 <span class="comment">// add edx, 4 // redundant</span>
- <a name="l02434"></a>02434 <span class="comment">// mov DWORD PTR [back], edx // redundant</span>
- <a name="l02435"></a>02435 <span class="keyword">add</span> eax, 4
- <a name="l02436"></a>02436 mov DWORD PTR [back], eax
- <a name="l02437"></a>02437
- <a name="l02438"></a>02438 <span class="comment">// 1874 :</span>
- <a name="l02439"></a>02439 <span class="comment">// 1875 : for (xx = xsteps;</span>
- <a name="l02440"></a>02440
- <a name="l02441"></a>02441 mov eax, DWORD PTR [xsteps]
- <a name="l02442"></a>02442 mov DWORD PTR [xx], eax
- <a name="l02443"></a>02443
- <a name="l02444"></a>02444 <span class="comment">// 1876 : xx > 0;</span>
- <a name="l02445"></a>02445 <span class="comment">// 1877 : xx--) {</span>
- <a name="l02446"></a>02446
- <a name="l02447"></a>02447 jmp SHORT _L76127
- <a name="l02448"></a>02448
- <a name="l02449"></a>02449 _L76128:
- <a name="l02450"></a>02450 mov ecx, DWORD PTR [xx]
- <a name="l02451"></a>02451 sub ecx, 1
- <a name="l02452"></a>02452 mov DWORD PTR [xx], ecx
- <a name="l02453"></a>02453
- <a name="l02454"></a>02454 _L76127:
- <a name="l02455"></a>02455 cmp DWORD PTR [xx], 0
- <a name="l02456"></a>02456 jle _L76129
- <a name="l02457"></a>02457
- <a name="l02458"></a>02458 <span class="comment">// 1878 : long result, cells = 0;</span>
- <a name="l02459"></a>02459
- <a name="l02460"></a>02460 mov DWORD PTR [cells], 0
- <a name="l02461"></a>02461
- <a name="l02462"></a>02462 <span class="comment">// 1879 :</span>
- <a name="l02463"></a>02463 <span class="comment">// 1880 : b1 = b2; b2 = back[0];</span>
- <a name="l02464"></a>02464
- <a name="l02465"></a>02465 mov edx, DWORD PTR [b2]
- <a name="l02466"></a>02466 mov DWORD PTR [b1], edx
- <a name="l02467"></a>02467 mov eax, DWORD PTR [back]
- <a name="l02468"></a>02468 mov ecx, DWORD PTR [eax]
- <a name="l02469"></a>02469 mov DWORD PTR [b2], ecx
- <a name="l02470"></a>02470
- <a name="l02471"></a>02471 <span class="comment">// 1881 : c1 = c2; c2 = back[backline];</span>
- <a name="l02472"></a>02472
- <a name="l02473"></a>02473 mov edx, DWORD PTR [c2]
- <a name="l02474"></a>02474 mov DWORD PTR [c1], edx
- <a name="l02475"></a>02475 mov ecx, DWORD PTR [backline]
- <a name="l02476"></a>02476 <span class="comment">// mov eax, DWORD PTR [back]</span>
- <a name="l02477"></a>02477 mov edx, DWORD PTR [eax+ecx*4]
- <a name="l02478"></a>02478 mov DWORD PTR [c2], edx
- <a name="l02479"></a>02479
- <a name="l02480"></a>02480 <span class="comment">// 1882 : d1 = d2; d2 = back[backline << 1];</span>
- <a name="l02481"></a>02481
- <a name="l02482"></a>02482 mov edx, DWORD PTR [d2]
- <a name="l02483"></a>02483 mov DWORD PTR [d1], edx
- <a name="l02484"></a>02484 <span class="comment">// mov ecx, DWORD PTR [backline]</span>
- <a name="l02485"></a>02485 shl ecx, 1
- <a name="l02486"></a>02486 <span class="comment">// mov eax, DWORD PTR [back]</span>
- <a name="l02487"></a>02487 mov edx, DWORD PTR [eax+ecx*4]
- <a name="l02488"></a>02488 mov DWORD PTR [d2], edx
- <a name="l02489"></a>02489
- <a name="l02490"></a>02490 <span class="comment">// 1883 : back++;</span>
- <a name="l02491"></a>02491
- <a name="l02492"></a>02492 <span class="comment">// mov eax, DWORD PTR [back]</span>
- <a name="l02493"></a>02493 <span class="keyword">add</span> eax, 4
- <a name="l02494"></a>02494 mov DWORD PTR [back], eax
- <a name="l02495"></a>02495
- <a name="l02496"></a>02496 <span class="comment">// 1884 :</span>
- <a name="l02497"></a>02497 <span class="comment">// 1885 : FDHEAT( BYTE0(b1), BYTE1(b1), BYTE2(b1),</span>
- <a name="l02498"></a>02498 <span class="comment">// 1886 : BYTE0(c1), BYTE1(c1), BYTE2(c1),</span>
- <a name="l02499"></a>02499 <span class="comment">// 1887 : BYTE0(d1), BYTE1(d1), BYTE2(d1) );</span>
- <a name="l02500"></a>02500
- <a name="l02501"></a>02501 mov edx, DWORD PTR [b1]
- <a name="l02502"></a>02502 and edx, 255 ; 000000ffH
- <a name="l02503"></a>02503 mov eax, DWORD PTR [b1]
- <a name="l02504"></a>02504 sar eax, 8
- <a name="l02505"></a>02505 and eax, 255 ; 000000ffH
- <a name="l02506"></a>02506 <span class="keyword">add</span> edx, eax
- <a name="l02507"></a>02507 mov ecx, DWORD PTR [b1]
- <a name="l02508"></a>02508 sar ecx, 16 ; 00000010H
- <a name="l02509"></a>02509 and ecx, 255 ; 000000ffH
- <a name="l02510"></a>02510 <span class="keyword">add</span> edx, ecx
- <a name="l02511"></a>02511 mov eax, DWORD PTR [c1]
- <a name="l02512"></a>02512 and eax, 255 ; 000000ffH
- <a name="l02513"></a>02513 <span class="keyword">add</span> edx, eax
- <a name="l02514"></a>02514 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02515"></a>02515 <span class="keyword">add</span> edx, DWORD PTR [frob]
- <a name="l02516"></a>02516 mov eax, DWORD PTR [c1]
- <a name="l02517"></a>02517 sar eax, 16 ; 00000010H
- <a name="l02518"></a>02518 and eax, 255 ; 000000ffH
- <a name="l02519"></a>02519 <span class="keyword">add</span> edx, eax
- <a name="l02520"></a>02520 mov ecx, DWORD PTR [d1]
- <a name="l02521"></a>02521 and ecx, 255 ; 000000ffH
- <a name="l02522"></a>02522 <span class="keyword">add</span> edx, ecx
- <a name="l02523"></a>02523 mov eax, DWORD PTR [d1]
- <a name="l02524"></a>02524 sar eax, 8
- <a name="l02525"></a>02525 and eax, 255 ; 000000ffH
- <a name="l02526"></a>02526 <span class="keyword">add</span> edx, eax
- <a name="l02527"></a>02527 mov ecx, DWORD PTR [d1]
- <a name="l02528"></a>02528 sar ecx, 16 ; 00000010H
- <a name="l02529"></a>02529 and ecx, 255 ; 000000ffH
- <a name="l02530"></a>02530 <span class="keyword">add</span> ecx, DWORD PTR [error]
- <a name="l02531"></a>02531 <span class="keyword">add</span> ecx, edx
- <a name="l02532"></a>02532 mov DWORD PTR [error], ecx
- <a name="l02533"></a>02533 mov edx, DWORD PTR [error]
- <a name="l02534"></a>02534 sar edx, 3
- <a name="l02535"></a>02535 mov DWORD PTR [result], edx
- <a name="l02536"></a>02536 mov eax, DWORD PTR [error]
- <a name="l02537"></a>02537 and eax, 7
- <a name="l02538"></a>02538 mov DWORD PTR [error], eax
- <a name="l02539"></a>02539
- <a name="l02540"></a>02540 <span class="comment">// 1888 : total += result;</span>
- <a name="l02541"></a>02541
- <a name="l02542"></a>02542 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02543"></a>02543 mov edx, DWORD PTR [total]
- <a name="l02544"></a>02544 <span class="keyword">add</span> edx, DWORD PTR [result]
- <a name="l02545"></a>02545 <span class="comment">// mov eax, DWORD PTR [this]</span>
- <a name="l02546"></a>02546 mov DWORD PTR [total], edx
- <a name="l02547"></a>02547
- <a name="l02548"></a>02548 <span class="comment">// 1889 : SETBYTE0(cells, result);</span>
- <a name="l02549"></a>02549
- <a name="l02550"></a>02550 mov ecx, DWORD PTR [cells]
- <a name="l02551"></a>02551 and ecx, -256 ; ffffff00H
- <a name="l02552"></a>02552 mov edx, DWORD PTR [result]
- <a name="l02553"></a>02553 and edx, 255 ; 000000ffH
- <a name="l02554"></a>02554 or ecx, edx
- <a name="l02555"></a>02555 mov DWORD PTR [cells], ecx
- <a name="l02556"></a>02556
- <a name="l02557"></a>02557 <span class="comment">// 1890 :</span>
- <a name="l02558"></a>02558 <span class="comment">// 1891 : FDHEAT( BYTE1(b1), BYTE2(b1), BYTE3(b1),</span>
- <a name="l02559"></a>02559 <span class="comment">// 1892 : BYTE1(c1), BYTE2(c1), BYTE3(c1),</span>
- <a name="l02560"></a>02560 <span class="comment">// 1893 : BYTE1(d1), BYTE2(d1), BYTE3(d1) );</span>
- <a name="l02561"></a>02561
- <a name="l02562"></a>02562 mov eax, DWORD PTR [b1]
- <a name="l02563"></a>02563 sar eax, 8
- <a name="l02564"></a>02564 and eax, 255 ; 000000ffH
- <a name="l02565"></a>02565 mov ecx, DWORD PTR [b1]
- <a name="l02566"></a>02566 sar ecx, 16 ; 00000010H
- <a name="l02567"></a>02567 and ecx, 255 ; 000000ffH
- <a name="l02568"></a>02568 <span class="keyword">add</span> eax, ecx
- <a name="l02569"></a>02569 mov edx, DWORD PTR [b1]
- <a name="l02570"></a>02570 sar edx, 24 ; 00000018H
- <a name="l02571"></a>02571 and edx, 255 ; 000000ffH
- <a name="l02572"></a>02572 <span class="keyword">add</span> eax, edx
- <a name="l02573"></a>02573 mov ecx, DWORD PTR [c1]
- <a name="l02574"></a>02574 sar ecx, 8
- <a name="l02575"></a>02575 and ecx, 255 ; 000000ffH
- <a name="l02576"></a>02576 <span class="keyword">add</span> eax, ecx
- <a name="l02577"></a>02577 <span class="comment">// mov edx, DWORD PTR [this]</span>
- <a name="l02578"></a>02578 <span class="keyword">add</span> eax, DWORD PTR [frob]
- <a name="l02579"></a>02579 mov ecx, DWORD PTR [c1]
- <a name="l02580"></a>02580 sar ecx, 24 ; 00000018H
- <a name="l02581"></a>02581 and ecx, 255 ; 000000ffH
- <a name="l02582"></a>02582 <span class="keyword">add</span> eax, ecx
- <a name="l02583"></a>02583 mov edx, DWORD PTR [d1]
- <a name="l02584"></a>02584 sar edx, 8
- <a name="l02585"></a>02585 and edx, 255 ; 000000ffH
- <a name="l02586"></a>02586 <span class="keyword">add</span> eax, edx
- <a name="l02587"></a>02587 mov ecx, DWORD PTR [d1]
- <a name="l02588"></a>02588 sar ecx, 16 ; 00000010H
- <a name="l02589"></a>02589 and ecx, 255 ; 000000ffH
- <a name="l02590"></a>02590 <span class="keyword">add</span> eax, ecx
- <a name="l02591"></a>02591 mov edx, DWORD PTR [d1]
- <a name="l02592"></a>02592 sar edx, 24 ; 00000018H
- <a name="l02593"></a>02593 and edx, 255 ; 000000ffH
- <a name="l02594"></a>02594 <span class="keyword">add</span> edx, DWORD PTR [error]
- <a name="l02595"></a>02595 <span class="keyword">add</span> edx, eax
- <a name="l02596"></a>02596 mov DWORD PTR [error], edx
- <a name="l02597"></a>02597 <span class="comment">// mov eax, DWORD PTR [error]</span>
- <a name="l02598"></a>02598 mov eax, edx
- <a name="l02599"></a>02599 sar eax, 3
- <a name="l02600"></a>02600 mov DWORD PTR [result], eax
- <a name="l02601"></a>02601 <span class="comment">// mov ecx, DWORD PTR [error]</span>
- <a name="l02602"></a>02602 and edx, 7
- <a name="l02603"></a>02603 mov DWORD PTR [error], edx
- <a name="l02604"></a>02604
- <a name="l02605"></a>02605 <span class="comment">// 1894 : total += result;</span>
- <a name="l02606"></a>02606
- <a name="l02607"></a>02607 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02608"></a>02608 mov edx, DWORD PTR [total]
- <a name="l02609"></a>02609 <span class="keyword">add</span> edx, DWORD PTR [result]
- <a name="l02610"></a>02610 <span class="comment">// mov eax, DWORD PTR [this]</span>
- <a name="l02611"></a>02611 mov DWORD PTR [total], edx
- <a name="l02612"></a>02612
- <a name="l02613"></a>02613 <span class="comment">// 1895 : SETBYTE1(cells, result);</span>
- <a name="l02614"></a>02614
- <a name="l02615"></a>02615 mov edx, DWORD PTR [cells]
- <a name="l02616"></a>02616 and edx, -65281 ; ffff00ffH
- <a name="l02617"></a>02617 mov eax, DWORD PTR [result]
- <a name="l02618"></a>02618 shl eax, 8
- <a name="l02619"></a>02619 and eax, 65280 ; 0000ff00H
- <a name="l02620"></a>02620 or edx, eax
- <a name="l02621"></a>02621 mov DWORD PTR [cells], edx
- <a name="l02622"></a>02622
- <a name="l02623"></a>02623 <span class="comment">// 1896 :</span>
- <a name="l02624"></a>02624 <span class="comment">// 1897 : FDHEAT( BYTE2(b1), BYTE3(b1), BYTE0(b2),</span>
- <a name="l02625"></a>02625 <span class="comment">// 1898 : BYTE2(c1), BYTE3(c1), BYTE0(c2),</span>
- <a name="l02626"></a>02626 <span class="comment">// 1899 : BYTE2(d1), BYTE3(d1), BYTE0(d2) );</span>
- <a name="l02627"></a>02627
- <a name="l02628"></a>02628 mov ecx, DWORD PTR [b1]
- <a name="l02629"></a>02629 sar ecx, 16 ; 00000010H
- <a name="l02630"></a>02630 and ecx, 255 ; 000000ffH
- <a name="l02631"></a>02631 mov edx, DWORD PTR [b1]
- <a name="l02632"></a>02632 sar edx, 24 ; 00000018H
- <a name="l02633"></a>02633 and edx, 255 ; 000000ffH
- <a name="l02634"></a>02634 <span class="keyword">add</span> ecx, edx
- <a name="l02635"></a>02635 mov eax, DWORD PTR [b2]
- <a name="l02636"></a>02636 and eax, 255 ; 000000ffH
- <a name="l02637"></a>02637 <span class="keyword">add</span> ecx, eax
- <a name="l02638"></a>02638 mov edx, DWORD PTR [c1]
- <a name="l02639"></a>02639 sar edx, 16 ; 00000010H
- <a name="l02640"></a>02640 and edx, 255 ; 000000ffH
- <a name="l02641"></a>02641 <span class="keyword">add</span> ecx, edx
- <a name="l02642"></a>02642 <span class="comment">// mov eax, DWORD PTR [this]</span>
- <a name="l02643"></a>02643 <span class="keyword">add</span> ecx, DWORD PTR [frob]
- <a name="l02644"></a>02644 mov edx, DWORD PTR [c2]
- <a name="l02645"></a>02645 and edx, 255 ; 000000ffH
- <a name="l02646"></a>02646 <span class="keyword">add</span> ecx, edx
- <a name="l02647"></a>02647 mov eax, DWORD PTR [d1]
- <a name="l02648"></a>02648 sar eax, 16 ; 00000010H
- <a name="l02649"></a>02649 and eax, 255 ; 000000ffH
- <a name="l02650"></a>02650 <span class="keyword">add</span> ecx, eax
- <a name="l02651"></a>02651 mov edx, DWORD PTR [d1]
- <a name="l02652"></a>02652 sar edx, 24 ; 00000018H
- <a name="l02653"></a>02653 and edx, 255 ; 000000ffH
- <a name="l02654"></a>02654 <span class="keyword">add</span> ecx, edx
- <a name="l02655"></a>02655 mov eax, DWORD PTR [d2]
- <a name="l02656"></a>02656 and eax, 255 ; 000000ffH
- <a name="l02657"></a>02657 <span class="keyword">add</span> eax, DWORD PTR [error]
- <a name="l02658"></a>02658 <span class="keyword">add</span> eax, ecx
- <a name="l02659"></a>02659 mov DWORD PTR [error], eax
- <a name="l02660"></a>02660 <span class="comment">// mov ecx, DWORD PTR [error]</span>
- <a name="l02661"></a>02661 mov ecx, eax
- <a name="l02662"></a>02662 sar ecx, 3
- <a name="l02663"></a>02663 mov DWORD PTR [result], ecx
- <a name="l02664"></a>02664 <span class="comment">// mov edx, DWORD PTR [error]</span>
- <a name="l02665"></a>02665 and eax, 7
- <a name="l02666"></a>02666 mov DWORD PTR [error], eax
- <a name="l02667"></a>02667
- <a name="l02668"></a>02668 <span class="comment">// 1900 : total += result;</span>
- <a name="l02669"></a>02669
- <a name="l02670"></a>02670 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02671"></a>02671 mov edx, DWORD PTR [total]
- <a name="l02672"></a>02672 <span class="keyword">add</span> edx, DWORD PTR [result]
- <a name="l02673"></a>02673 <span class="comment">// mov eax, DWORD PTR [this]</span>
- <a name="l02674"></a>02674 mov DWORD PTR [total], edx
- <a name="l02675"></a>02675
- <a name="l02676"></a>02676 <span class="comment">// 1901 : SETBYTE2(cells, result);</span>
- <a name="l02677"></a>02677
- <a name="l02678"></a>02678 mov eax, DWORD PTR [cells]
- <a name="l02679"></a>02679 and eax, -16711681 ; ff00ffffH
- <a name="l02680"></a>02680 mov ecx, DWORD PTR [result]
- <a name="l02681"></a>02681 shl ecx, 16 ; 00000010H
- <a name="l02682"></a>02682 and ecx, 16711680 ; 00ff0000H
- <a name="l02683"></a>02683 or eax, ecx
- <a name="l02684"></a>02684 mov DWORD PTR [cells], eax
- <a name="l02685"></a>02685
- <a name="l02686"></a>02686 <span class="comment">// 1902 :</span>
- <a name="l02687"></a>02687 <span class="comment">// 1903 : FDHEAT( BYTE3(b1), BYTE0(b2), BYTE1(b2),</span>
- <a name="l02688"></a>02688 <span class="comment">// 1904 : BYTE3(c1), BYTE0(c2), BYTE1(c2),</span>
- <a name="l02689"></a>02689 <span class="comment">// 1905 : BYTE3(d1), BYTE0(d2), BYTE1(d2) );</span>
- <a name="l02690"></a>02690
- <a name="l02691"></a>02691 mov edx, DWORD PTR [b1]
- <a name="l02692"></a>02692 sar edx, 24 ; 00000018H
- <a name="l02693"></a>02693 and edx, 255 ; 000000ffH
- <a name="l02694"></a>02694 mov eax, DWORD PTR [b2]
- <a name="l02695"></a>02695 and eax, 255 ; 000000ffH
- <a name="l02696"></a>02696 <span class="keyword">add</span> edx, eax
- <a name="l02697"></a>02697 mov ecx, DWORD PTR [b2]
- <a name="l02698"></a>02698 sar ecx, 8
- <a name="l02699"></a>02699 and ecx, 255 ; 000000ffH
- <a name="l02700"></a>02700 <span class="keyword">add</span> edx, ecx
- <a name="l02701"></a>02701 mov eax, DWORD PTR [c1]
- <a name="l02702"></a>02702 sar eax, 24 ; 00000018H
- <a name="l02703"></a>02703 and eax, 255 ; 000000ffH
- <a name="l02704"></a>02704 <span class="keyword">add</span> edx, eax
- <a name="l02705"></a>02705 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02706"></a>02706 <span class="keyword">add</span> edx, DWORD PTR [frob]
- <a name="l02707"></a>02707 mov eax, DWORD PTR [c2]
- <a name="l02708"></a>02708 sar eax, 8
- <a name="l02709"></a>02709 and eax, 255 ; 000000ffH
- <a name="l02710"></a>02710 <span class="keyword">add</span> edx, eax
- <a name="l02711"></a>02711 mov ecx, DWORD PTR [d1]
- <a name="l02712"></a>02712 sar ecx, 24 ; 00000018H
- <a name="l02713"></a>02713 and ecx, 255 ; 000000ffH
- <a name="l02714"></a>02714 <span class="keyword">add</span> edx, ecx
- <a name="l02715"></a>02715 mov eax, DWORD PTR [d2]
- <a name="l02716"></a>02716 and eax, 255 ; 000000ffH
- <a name="l02717"></a>02717 <span class="keyword">add</span> edx, eax
- <a name="l02718"></a>02718 mov ecx, DWORD PTR [d2]
- <a name="l02719"></a>02719 sar ecx, 8
- <a name="l02720"></a>02720 and ecx, 255 ; 000000ffH
- <a name="l02721"></a>02721 <span class="keyword">add</span> ecx, DWORD PTR [error]
- <a name="l02722"></a>02722 <span class="keyword">add</span> ecx, edx
- <a name="l02723"></a>02723 mov DWORD PTR [error], ecx
- <a name="l02724"></a>02724 <span class="comment">// mov edx, DWORD PTR [error]</span>
- <a name="l02725"></a>02725 mov edx, ecx
- <a name="l02726"></a>02726 sar edx, 3
- <a name="l02727"></a>02727 mov DWORD PTR [result], edx
- <a name="l02728"></a>02728 <span class="comment">// mov eax, DWORD PTR [error]</span>
- <a name="l02729"></a>02729 and ecx, 7
- <a name="l02730"></a>02730 mov DWORD PTR [error], ecx
- <a name="l02731"></a>02731
- <a name="l02732"></a>02732 <span class="comment">// 1906 : total += result;</span>
- <a name="l02733"></a>02733
- <a name="l02734"></a>02734 <span class="comment">// mov ecx, DWORD PTR [this]</span>
- <a name="l02735"></a>02735 mov edx, DWORD PTR [total]
- <a name="l02736"></a>02736 <span class="keyword">add</span> edx, DWORD PTR [result]
- <a name="l02737"></a>02737 <span class="comment">// mov eax, DWORD PTR [this]</span>
- <a name="l02738"></a>02738 mov DWORD PTR [total], edx
- <a name="l02739"></a>02739
- <a name="l02740"></a>02740 <span class="comment">// 1907 : SETBYTE3(cells, result);</span>
- <a name="l02741"></a>02741
- <a name="l02742"></a>02742 mov ecx, DWORD PTR [cells]
- <a name="l02743"></a>02743 and ecx, 16777215 ; 00ffffffH
- <a name="l02744"></a>02744 mov edx, DWORD PTR [result]
- <a name="l02745"></a>02745 shl edx, 24 ; 00000018H
- <a name="l02746"></a>02746 and edx, -16777216 ; ff000000H
- <a name="l02747"></a>02747 or ecx, edx
- <a name="l02748"></a>02748 mov DWORD PTR [cells], ecx
- <a name="l02749"></a>02749
- <a name="l02750"></a>02750 <span class="comment">// 1908 :</span>
- <a name="l02751"></a>02751 <span class="comment">// 1909 : *front = cells;</span>
- <a name="l02752"></a>02752
- <a name="l02753"></a>02753 mov eax, DWORD PTR [front]
- <a name="l02754"></a>02754 mov ecx, DWORD PTR [cells]
- <a name="l02755"></a>02755 mov DWORD PTR [eax], ecx
- <a name="l02756"></a>02756
- <a name="l02757"></a>02757 <span class="comment">// 1910 : front++;</span>
- <a name="l02758"></a>02758
- <a name="l02759"></a>02759 <span class="comment">// mov eax, DWORD PTR [front]</span>
- <a name="l02760"></a>02760 <span class="keyword">add</span> eax, 4
- <a name="l02761"></a>02761 mov DWORD PTR [front], eax
- <a name="l02762"></a>02762
- <a name="l02763"></a>02763 <span class="comment">// 1911 : } // for xx</span>
- <a name="l02764"></a>02764
- <a name="l02765"></a>02765 jmp _L76128
- <a name="l02766"></a>02766
- <a name="l02767"></a>02767 _L76129:
- <a name="l02768"></a>02768
- <a name="l02769"></a>02769 <span class="comment">// 1912 : } // for yy</span>
- <a name="l02770"></a>02770
- <a name="l02771"></a>02771 jmp _L76117
- <a name="l02772"></a>02772
- <a name="l02773"></a>02773 _L76118:
- <a name="l02774"></a>02774 mov ecx, DWORD PTR [<span class="keyword">this</span>]
- <a name="l02775"></a>02775 mov eax, DWORD PTR [total]
- <a name="l02776"></a>02776 mov DWORD PTR [ecx].total, eax
- <a name="l02777"></a>02777
- <a name="l02778"></a>02778 } <span class="comment">// asm</span>
- <a name="l02779"></a>02779 }
- <a name="l02780"></a>02780
- <a name="l02781"></a>02781
- <a name="l02782"></a>02782 <span class="preprocessor">#endif</span>
- <a name="l02783"></a>02783 <span class="preprocessor"></span>
- <a name="l02784"></a>02784
- <a name="l02785"></a>02785
- <a name="l02786"></a>02786 <span class="preprocessor">#define FABCDHEAT(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l02787"></a>02787 <span class="preprocessor"> error += (n + s + w + e + frobby); \</span>
- <a name="l02788"></a>02788 <span class="preprocessor"> result = error >> 2; \</span>
- <a name="l02789"></a>02789 <span class="preprocessor"> error &= 3; \</span>
- <a name="l02790"></a>02790 <span class="preprocessor"> frobby = -frobby;</span>
- <a name="l02791"></a>02791 <span class="preprocessor"></span>
- <a name="l02792"></a>02792 <span class="keywordtype">void</span> CellEngine::n_fabcdheat()
- <a name="l02793"></a>02793 {
- <a name="l02794"></a>02794 QUAD *front = (QUAD *)frontMem;
- <a name="l02795"></a>02795 QUAD *back = (QUAD *)(backMem +
- <a name="l02796"></a>02796 (backBorder - 1) +
- <a name="l02797"></a>02797 ((backBorder - 1) * backRowBytes));
- <a name="l02798"></a>02798 <span class="keywordtype">long</span> frobby = frob;
- <a name="l02799"></a>02799 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l02800"></a>02800 <span class="keywordtype">long</span> nextbackline = backline << 1;
- <a name="l02801"></a>02801 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l02802"></a>02802 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l02803"></a>02803 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l02804"></a>02804 <span class="keywordtype">long</span> yy;
- <a name="l02805"></a>02805
- <a name="l02806"></a>02806 total = 0;
- <a name="l02807"></a>02807
- <a name="l02808"></a>02808 <span class="comment">// flip frob with the spatio-temporal phase,</span>
- <a name="l02809"></a>02809 <span class="comment">// since interlaced checkerboards</span>
- <a name="l02810"></a>02810 <span class="comment">// exchange places each step.</span>
- <a name="l02811"></a>02811 <span class="keywordflow">if</span> ((phase ^ x ^ y) & 1) {
- <a name="l02812"></a>02812 frobby = -frobby;
- <a name="l02813"></a>02813 }
- <a name="l02814"></a>02814
- <a name="l02815"></a>02815 <span class="keywordflow">for</span> (yy = height;
- <a name="l02816"></a>02816 yy > 0;
- <a name="l02817"></a>02817 back += backstride,
- <a name="l02818"></a>02818 front += frontstride,
- <a name="l02819"></a>02819 yy--) {
- <a name="l02820"></a>02820 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l02821"></a>02821 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l02822"></a>02822 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l02823"></a>02823 <span class="keywordtype">long</span> error = 0;
- <a name="l02824"></a>02824 <span class="keywordtype">long</span> xx;
- <a name="l02825"></a>02825
- <a name="l02826"></a>02826 <span class="comment">// Flip frob each y line, to apply opposite frobs</span>
- <a name="l02827"></a>02827 <span class="comment">// to each spatial phase of the checkerboard.</span>
- <a name="l02828"></a>02828 <span class="comment">// This works because the width must be divisible by 4.</span>
- <a name="l02829"></a>02829 frobby = -frobby;
- <a name="l02830"></a>02830
- <a name="l02831"></a>02831 b2 = back[0];
- <a name="l02832"></a>02832 c2 = back[backline];
- <a name="l02833"></a>02833 d2 = back[nextbackline];
- <a name="l02834"></a>02834 back++;
- <a name="l02835"></a>02835
- <a name="l02836"></a>02836 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l02837"></a>02837 xx > 0;
- <a name="l02838"></a>02838 xx--) {
- <a name="l02839"></a>02839 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l02840"></a>02840
- <a name="l02841"></a>02841 b1 = b2; b2 = back[0];
- <a name="l02842"></a>02842 c1 = c2; c2 = back[backline];
- <a name="l02843"></a>02843 d1 = d2; d2 = back[nextbackline];
- <a name="l02844"></a>02844 back++;
- <a name="l02845"></a>02845
- <a name="l02846"></a>02846 FABCDHEAT( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l02847"></a>02847 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l02848"></a>02848 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l02849"></a>02849 SETBYTE0(cells, result);
- <a name="l02850"></a>02850 total += result;
- <a name="l02851"></a>02851
- <a name="l02852"></a>02852 FABCDHEAT( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l02853"></a>02853 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l02854"></a>02854 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l02855"></a>02855 SETBYTE1(cells, result);
- <a name="l02856"></a>02856 total += result;
- <a name="l02857"></a>02857
- <a name="l02858"></a>02858 FABCDHEAT( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l02859"></a>02859 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l02860"></a>02860 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l02861"></a>02861 SETBYTE2(cells, result);
- <a name="l02862"></a>02862 total += result;
- <a name="l02863"></a>02863
- <a name="l02864"></a>02864 FABCDHEAT( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l02865"></a>02865 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l02866"></a>02866 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l02867"></a>02867 SETBYTE3(cells, result);
- <a name="l02868"></a>02868 total += result;
- <a name="l02869"></a>02869
- <a name="l02870"></a>02870 front++;
- <a name="l02871"></a>02871 *front = cells;
- <a name="l02872"></a>02872 }
- <a name="l02873"></a>02873 }
- <a name="l02874"></a>02874 }
- <a name="l02875"></a>02875
- <a name="l02876"></a>02876
- <a name="l02877"></a>02877 <span class="preprocessor">#define SUM8R(m, nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l02878"></a>02878 <span class="preprocessor"> (((nw&m) + (n&m) + (ne&m) + (w&m) + (e&m) + (sw&m) + (s&m) + (se&m)))</span>
- <a name="l02879"></a>02879 <span class="preprocessor"></span>
- <a name="l02880"></a>02880 <span class="preprocessor">#define SUM9R(m, nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l02881"></a>02881 <span class="preprocessor"> (((nw&m) + (n&m) + (ne&m) + (w&m) + (c&m) + (e&m) + (sw&m) + (s&m) + (se&m)))</span>
- <a name="l02882"></a>02882 <span class="preprocessor"></span>
- <a name="l02883"></a>02883 <span class="preprocessor">#define RISCA(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l02884"></a>02884 <span class="preprocessor"> result = c & 0xf0; \</span>
- <a name="l02885"></a>02885 <span class="preprocessor"> switch (result) { \</span>
- <a name="l02886"></a>02886 <span class="preprocessor"> case 0x00: </span><span class="comment">/* c */</span> \
- <a name="l02887"></a>02887 result |= (c & 0x0f) ; \
- <a name="l02888"></a>02888 break; \
- <a name="l02889"></a>02889 case 0x10: <span class="comment">/* life */</span> \
- <a name="l02890"></a>02890 sum = (SUM8R(8, nw, n, ne, w, c, e, sw, s, se) >> 3); \
- <a name="l02891"></a>02891 result |= ((c & 0x0e) >> 1) | \
- <a name="l02892"></a>02892 ((((c & 1) && ((sum == 2) || (sum == 3))) || \
- <a name="l02893"></a>02893 (sum == 3)) << 3); \
- <a name="l02894"></a>02894 break; \
- <a name="l02895"></a>02895 case 0x20: <span class="comment">/* brain */</span> \
- <a name="l02896"></a>02896 result |= ((c & 0x0e) >> 1) | \
- <a name="l02897"></a>02897 ((((c & 0x03) == 0) && \
- <a name="l02898"></a>02898 ((SUM8R(8, nw, n, ne, w, c, e, sw, s, se) >> 3) == 2)) << 3); \
- <a name="l02899"></a>02899 break; \
- <a name="l02900"></a>02900 case 0x30: <span class="comment">/* torben */</span> \
- <a name="l02901"></a>02901 sum = (SUM9R(8, nw, n, ne, w, c, e, sw, s, se) >> 3); \
- <a name="l02902"></a>02902 result |= ((c & 0x0e) >> 1) | \
- <a name="l02903"></a>02903 (((sum > 6) || (sum == 5) || (sum == 3)) << 3); \
- <a name="l02904"></a>02904 break; \
- <a name="l02905"></a>02905 case 0x40: <span class="comment">/* anneal */</span> \
- <a name="l02906"></a>02906 sum = (SUM9R(8, nw, n, ne, w, c, e, sw, s, se) >> 3); \
- <a name="l02907"></a>02907 result |= ((c & 0x0e) >> 1) | \
- <a name="l02908"></a>02908 (((sum > 5) || (sum == 4)) << 3); \
- <a name="l02909"></a>02909 break; \
- <a name="l02910"></a>02910 case 0x50: <span class="comment">/* ditto */</span> \
- <a name="l02911"></a>02911 sum = (SUM9R(8, nw, n, ne, w, c, e, sw, s, se) >> 3); \
- <a name="l02912"></a>02912 result |= ((c & 0x0e) >> 1) | \
- <a name="l02913"></a>02913 ((sum > 5) << 3); \
- <a name="l02914"></a>02914 break; \
- <a name="l02915"></a>02915 case 0x60: <span class="comment">/* logic */</span> \
- <a name="l02916"></a>02916 { result |= (c & 0x07); \
- <a name="l02917"></a>02917 switch (c & 0x0f) { \
- <a name="l02918"></a>02918 case 0x00: <span class="comment">/* and */</span> \
- <a name="l02919"></a>02919 case 0x08: \
- <a name="l02920"></a>02920 result |= (nw & w) & 8; \
- <a name="l02921"></a>02921 break; \
- <a name="l02922"></a>02922 case 0x01: <span class="comment">/* or */</span> \
- <a name="l02923"></a>02923 case 0x09: \
- <a name="l02924"></a>02924 result |= (nw | w) & 8; \
- <a name="l02925"></a>02925 break; \
- <a name="l02926"></a>02926 case 0x02: <span class="comment">/* xor */</span> \
- <a name="l02927"></a>02927 case 0x0a: \
- <a name="l02928"></a>02928 result |= (nw ^ w) & 8; \
- <a name="l02929"></a>02929 break; \
- <a name="l02930"></a>02930 case 0x03: <span class="comment">/* nand */</span> \
- <a name="l02931"></a>02931 case 0x0b: \
- <a name="l02932"></a>02932 result |= (~(nw & w)) & 8; \
- <a name="l02933"></a>02933 break; \
- <a name="l02934"></a>02934 case 0x04: <span class="comment">/* nor */</span> \
- <a name="l02935"></a>02935 case 0x0c: \
- <a name="l02936"></a>02936 result |= (~(nw | w)) & 8; \
- <a name="l02937"></a>02937 break; \
- <a name="l02938"></a>02938 case 0x05: <span class="comment">/* equiv */</span> \
- <a name="l02939"></a>02939 case 0x0d: \
- <a name="l02940"></a>02940 result |= (~(nw ^ w)) & 8; \
- <a name="l02941"></a>02941 break; \
- <a name="l02942"></a>02942 case 0x06: <span class="comment">/* flip state 0 */</span> \
- <a name="l02943"></a>02943 result |= (nw & 8); \
- <a name="l02944"></a>02944 break; \
- <a name="l02945"></a>02945 case 0x0e: <span class="comment">/* flop state 1 */</span> \
- <a name="l02946"></a>02946 result |= ((~w) & 8); \
- <a name="l02947"></a>02947 break; \
- <a name="l02948"></a>02948 case 0x07: <span class="comment">/* relay */</span> \
- <a name="l02949"></a>02949 case 0x0f: \
- <a name="l02950"></a>02950 result |= ((w & 8) ? sw : nw) & 8; \
- <a name="l02951"></a>02951 break; \
- <a name="l02952"></a>02952 } \
- <a name="l02953"></a>02953 } \
- <a name="l02954"></a>02954 break; \
- <a name="l02955"></a>02955 case 0x70: <span class="comment">/* n */</span> \
- <a name="l02956"></a>02956 result |= (n & 0x0f) ; \
- <a name="l02957"></a>02957 break; \
- <a name="l02958"></a>02958 case 0x80: <span class="comment">/* nw */</span> \
- <a name="l02959"></a>02959 result |= (nw & 0x0f) ; \
- <a name="l02960"></a>02960 break; \
- <a name="l02961"></a>02961 case 0x90: <span class="comment">/* w */</span> \
- <a name="l02962"></a>02962 result |= (w & 0x0f) ; \
- <a name="l02963"></a>02963 break; \
- <a name="l02964"></a>02964 case 0xa0: <span class="comment">/* sw */</span> \
- <a name="l02965"></a>02965 result |= (sw & 0x0f) ; \
- <a name="l02966"></a>02966 break; \
- <a name="l02967"></a>02967 case 0xb0: <span class="comment">/* s */</span> \
- <a name="l02968"></a>02968 result |= (s & 0x0f) ; \
- <a name="l02969"></a>02969 break; \
- <a name="l02970"></a>02970 case 0xc0: <span class="comment">/* se */</span> \
- <a name="l02971"></a>02971 result |= (se & 0x0f) ; \
- <a name="l02972"></a>02972 break; \
- <a name="l02973"></a>02973 case 0xd0: <span class="comment">/* e */</span> \
- <a name="l02974"></a>02974 result |= (e & 0x0f) ; \
- <a name="l02975"></a>02975 break; \
- <a name="l02976"></a>02976 case 0xe0: <span class="comment">/* ne */</span> \
- <a name="l02977"></a>02977 result |= (ne & 0x0f) ; \
- <a name="l02978"></a>02978 break; \
- <a name="l02979"></a>02979 case 0xf0: <span class="comment">/* heat */</span> \
- <a name="l02980"></a>02980 leftover += nw + n + ne + w + e + sw + s + se + frob; \
- <a name="l02981"></a>02981 result |= ((leftover >> 3) & 15); \
- <a name="l02982"></a>02982 leftover &= 7; \
- <a name="l02983"></a>02983 break; \
- <a name="l02984"></a>02984 }
- <a name="l02985"></a>02985
- <a name="l02986"></a>02986
- <a name="l02987"></a>02987 <span class="keywordtype">void</span> CellEngine::n_risca()
- <a name="l02988"></a>02988 {
- <a name="l02989"></a>02989 QUAD *front = (QUAD *)frontMem;
- <a name="l02990"></a>02990 QUAD *back = (QUAD *)(backMem +
- <a name="l02991"></a>02991 (backBorder - 1) +
- <a name="l02992"></a>02992 ((backBorder - 1) * backRowBytes));
- <a name="l02993"></a>02993 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l02994"></a>02994 <span class="keywordtype">long</span> nextbackline = backline << 1;
- <a name="l02995"></a>02995 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l02996"></a>02996 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l02997"></a>02997 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l02998"></a>02998 <span class="keywordtype">long</span> yy;
- <a name="l02999"></a>02999 <span class="keywordtype">long</span> leftover = 0;
- <a name="l03000"></a>03000
- <a name="l03001"></a>03001 <span class="keywordflow">for</span> (yy = height;
- <a name="l03002"></a>03002 yy > 0;
- <a name="l03003"></a>03003 back += backstride,
- <a name="l03004"></a>03004 front += frontstride,
- <a name="l03005"></a>03005 yy--) {
- <a name="l03006"></a>03006 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l03007"></a>03007 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l03008"></a>03008 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l03009"></a>03009
- <a name="l03010"></a>03010 b2 = back[0];
- <a name="l03011"></a>03011 c2 = back[backline];
- <a name="l03012"></a>03012 d2 = back[nextbackline];
- <a name="l03013"></a>03013 back++;
- <a name="l03014"></a>03014
- <a name="l03015"></a>03015 <span class="keywordtype">long</span> xx;
- <a name="l03016"></a>03016 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l03017"></a>03017 xx > 0;
- <a name="l03018"></a>03018 xx--) {
- <a name="l03019"></a>03019 <span class="keywordtype">long</span> result, sum, cells = 0;
- <a name="l03020"></a>03020
- <a name="l03021"></a>03021 b1 = b2; b2 = back[0];
- <a name="l03022"></a>03022 c1 = c2; c2 = back[backline];
- <a name="l03023"></a>03023 d1 = d2; d2 = back[nextbackline];
- <a name="l03024"></a>03024 back++;
- <a name="l03025"></a>03025
- <a name="l03026"></a>03026 RISCA( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l03027"></a>03027 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l03028"></a>03028 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l03029"></a>03029 SETBYTE0(cells, result);
- <a name="l03030"></a>03030
- <a name="l03031"></a>03031 RISCA( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l03032"></a>03032 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l03033"></a>03033 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l03034"></a>03034 SETBYTE1(cells, result);
- <a name="l03035"></a>03035
- <a name="l03036"></a>03036 RISCA( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l03037"></a>03037 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l03038"></a>03038 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l03039"></a>03039 SETBYTE2(cells, result);
- <a name="l03040"></a>03040
- <a name="l03041"></a>03041 RISCA( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l03042"></a>03042 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l03043"></a>03043 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l03044"></a>03044 SETBYTE3(cells, result);
- <a name="l03045"></a>03045
- <a name="l03046"></a>03046 *front = cells;
- <a name="l03047"></a>03047 front++;
- <a name="l03048"></a>03048 }
- <a name="l03049"></a>03049 }
- <a name="l03050"></a>03050 }
- <a name="l03051"></a>03051
- <a name="l03052"></a>03052
- <a name="l03053"></a>03053 <span class="keywordtype">void</span> CellEngine::n_insert()
- <a name="l03054"></a>03054 {
- <a name="l03055"></a>03055 <span class="keywordtype">long</span> mask = (frob >> 8) & 0xff;
- <a name="l03056"></a>03056 <span class="keywordtype">long</span> val = frob & 0xff;
- <a name="l03057"></a>03057
- <a name="l03058"></a>03058 <span class="preprocessor">#define INSERT (Byte)((c & mask) | val)</span>
- <a name="l03059"></a>03059 <span class="preprocessor"></span>
- <a name="l03060"></a>03060 CAM_MASKED_REG_LOOP(INSERT)
- <a name="l03061"></a>03061 }
- <a name="l03062"></a>03062
- <a name="l03063"></a>03063
- <a name="l03064"></a>03064 <span class="keywordtype">void</span> CellEngine::n_heaco()
- <a name="l03065"></a>03065 {
- <a name="l03066"></a>03066 <span class="keywordtype">long</span> sum;
- <a name="l03067"></a>03067 <span class="keywordtype">long</span> last = 0;
- <a name="l03068"></a>03068
- <a name="l03069"></a>03069 <span class="preprocessor">#define HEACO \</span>
- <a name="l03070"></a>03070 <span class="preprocessor"> (Byte)( \</span>
- <a name="l03071"></a>03071 <span class="preprocessor"> (sum = nw + n + ne + w + e + sw + s + se + frob + last), \</span>
- <a name="l03072"></a>03072 <span class="preprocessor"> (last = sum & 31), \</span>
- <a name="l03073"></a>03073 <span class="preprocessor"> (sum = (sum >> 3) & (~3)), \</span>
- <a name="l03074"></a>03074 <span class="preprocessor"> (sum | ((c&1) << 1) | \</span>
- <a name="l03075"></a>03075 <span class="preprocessor"> (((c&3) == 0) && \</span>
- <a name="l03076"></a>03076 <span class="preprocessor"> (SUM8REG(1) == 2))))</span>
- <a name="l03077"></a>03077 <span class="preprocessor"></span>
- <a name="l03078"></a>03078 CAM_MASKED_REG_LOOP(HEACO)
- <a name="l03079"></a>03079 }
- <a name="l03080"></a>03080
- <a name="l03081"></a>03081
- <a name="l03082"></a>03082 <span class="comment">// This is a thicker version of dithered heat diffusion,</span>
- <a name="l03083"></a>03083 <span class="comment">// that exhibits this wonderful marbling behavior when the</span>
- <a name="l03084"></a>03084 <span class="comment">// frob is 1, -1, 2, or -2. It averages the center cell</span>
- <a name="l03085"></a>03085 <span class="comment">// with the average of the 8 neighbors, so it's thicker</span>
- <a name="l03086"></a>03086 <span class="comment">// than dheat, which does not look at the center cell,</span>
- <a name="l03087"></a>03087 <span class="comment">// just the average of the 8 neighbors.</span>
- <a name="l03088"></a>03088
- <a name="l03089"></a>03089 <span class="preprocessor">#define MARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l03090"></a>03090 <span class="preprocessor"> error += ((c << 3) + nw + n + ne + w + frob + e + sw + s + se); \</span>
- <a name="l03091"></a>03091 <span class="preprocessor"> result = error >> 4; \</span>
- <a name="l03092"></a>03092 <span class="preprocessor"> error &= 0x0f;</span>
- <a name="l03093"></a>03093 <span class="preprocessor"></span>
- <a name="l03094"></a>03094 <span class="keywordtype">void</span> CellEngine::n_marble()
- <a name="l03095"></a>03095 {
- <a name="l03096"></a>03096 QUAD *front = (QUAD *)frontMem;
- <a name="l03097"></a>03097 QUAD *back = (QUAD *)(backMem +
- <a name="l03098"></a>03098 (backBorder - 1) +
- <a name="l03099"></a>03099 ((backBorder - 1) * backRowBytes));
- <a name="l03100"></a>03100 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l03101"></a>03101 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l03102"></a>03102 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l03103"></a>03103 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l03104"></a>03104 <span class="keywordtype">long</span> yy;
- <a name="l03105"></a>03105
- <a name="l03106"></a>03106 total = 0;
- <a name="l03107"></a>03107
- <a name="l03108"></a>03108 <span class="keywordflow">for</span> (yy = height; yy > 0;
- <a name="l03109"></a>03109 back += backstride,
- <a name="l03110"></a>03110 front += frontstride,
- <a name="l03111"></a>03111 yy--) {
- <a name="l03112"></a>03112 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l03113"></a>03113 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l03114"></a>03114 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l03115"></a>03115 <span class="keywordtype">long</span> error = 0;
- <a name="l03116"></a>03116 <span class="keywordtype">long</span> xx;
- <a name="l03117"></a>03117
- <a name="l03118"></a>03118 b2 = back[0];
- <a name="l03119"></a>03119 c2 = back[backline];
- <a name="l03120"></a>03120 d2 = back[backline << 1];
- <a name="l03121"></a>03121 back++;
- <a name="l03122"></a>03122
- <a name="l03123"></a>03123 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l03124"></a>03124 xx > 0;
- <a name="l03125"></a>03125 xx--) {
- <a name="l03126"></a>03126 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l03127"></a>03127
- <a name="l03128"></a>03128 b1 = b2; b2 = back[0];
- <a name="l03129"></a>03129 c1 = c2; c2 = back[backline];
- <a name="l03130"></a>03130 d1 = d2; d2 = back[backline << 1];
- <a name="l03131"></a>03131 back++;
- <a name="l03132"></a>03132
- <a name="l03133"></a>03133 MARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l03134"></a>03134 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l03135"></a>03135 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l03136"></a>03136 total += result;
- <a name="l03137"></a>03137 SETBYTE0(cells, result);
- <a name="l03138"></a>03138
- <a name="l03139"></a>03139 MARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l03140"></a>03140 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l03141"></a>03141 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l03142"></a>03142 total += result;
- <a name="l03143"></a>03143 SETBYTE1(cells, result);
- <a name="l03144"></a>03144
- <a name="l03145"></a>03145 MARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l03146"></a>03146 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l03147"></a>03147 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l03148"></a>03148 total += result;
- <a name="l03149"></a>03149 SETBYTE2(cells, result);
- <a name="l03150"></a>03150
- <a name="l03151"></a>03151 MARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l03152"></a>03152 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l03153"></a>03153 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l03154"></a>03154 total += result;
- <a name="l03155"></a>03155 SETBYTE3(cells, result);
- <a name="l03156"></a>03156
- <a name="l03157"></a>03157 *front = cells;
- <a name="l03158"></a>03158 front++;
- <a name="l03159"></a>03159 }
- <a name="l03160"></a>03160 }
- <a name="l03161"></a>03161 }
- <a name="l03162"></a>03162
- <a name="l03163"></a>03163
- <a name="l03164"></a>03164 <span class="comment">// This is the smooth, undithered version of marble.</span>
- <a name="l03165"></a>03165 <span class="comment">// It does not exhibit the marbling behavior, which</span>
- <a name="l03166"></a>03166 <span class="comment">// seems to be dampened out because of the accuracy</span>
- <a name="l03167"></a>03167 <span class="comment">// lost by not dithering the leftover fractional heat.</span>
- <a name="l03168"></a>03168 <span class="comment">// It's still interesting as a thick version of the</span>
- <a name="l03169"></a>03169 <span class="comment">// smooth angular undithered heat diffusion.</span>
- <a name="l03170"></a>03170
- <a name="l03171"></a>03171 <span class="preprocessor">#define SMARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l03172"></a>03172 <span class="preprocessor"> result = ((c << 3) + nw + n + ne + w + frob + e + sw + s + se) >> 4;</span>
- <a name="l03173"></a>03173 <span class="preprocessor"></span>
- <a name="l03174"></a>03174 <span class="keywordtype">void</span> CellEngine::n_smarble()
- <a name="l03175"></a>03175 {
- <a name="l03176"></a>03176 QUAD *front = (QUAD *)frontMem;
- <a name="l03177"></a>03177 QUAD *back = (QUAD *)(backMem +
- <a name="l03178"></a>03178 (backBorder - 1) +
- <a name="l03179"></a>03179 ((backBorder - 1) * backRowBytes));
- <a name="l03180"></a>03180 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l03181"></a>03181 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l03182"></a>03182 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l03183"></a>03183 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l03184"></a>03184 <span class="keywordtype">long</span> yy;
- <a name="l03185"></a>03185
- <a name="l03186"></a>03186 total = 0;
- <a name="l03187"></a>03187
- <a name="l03188"></a>03188 <span class="keywordflow">for</span> (yy = height;
- <a name="l03189"></a>03189 yy > 0;
- <a name="l03190"></a>03190 back += backstride,
- <a name="l03191"></a>03191 front += frontstride,
- <a name="l03192"></a>03192 yy--) {
- <a name="l03193"></a>03193 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l03194"></a>03194 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l03195"></a>03195 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l03196"></a>03196 <span class="keywordtype">long</span> xx;
- <a name="l03197"></a>03197
- <a name="l03198"></a>03198 b2 = back[0];
- <a name="l03199"></a>03199 c2 = back[backline];
- <a name="l03200"></a>03200 d2 = back[backline << 1];
- <a name="l03201"></a>03201 back++;
- <a name="l03202"></a>03202
- <a name="l03203"></a>03203 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l03204"></a>03204 xx > 0;
- <a name="l03205"></a>03205 xx--) {
- <a name="l03206"></a>03206 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l03207"></a>03207
- <a name="l03208"></a>03208 b1 = b2; b2 = back[0];
- <a name="l03209"></a>03209 c1 = c2; c2 = back[backline];
- <a name="l03210"></a>03210 d1 = d2; d2 = back[backline << 1];
- <a name="l03211"></a>03211 back++;
- <a name="l03212"></a>03212
- <a name="l03213"></a>03213 SMARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l03214"></a>03214 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l03215"></a>03215 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l03216"></a>03216 total += result;
- <a name="l03217"></a>03217 SETBYTE0(cells, result);
- <a name="l03218"></a>03218
- <a name="l03219"></a>03219 SMARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l03220"></a>03220 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l03221"></a>03221 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l03222"></a>03222 total += result;
- <a name="l03223"></a>03223 SETBYTE1(cells, result);
- <a name="l03224"></a>03224
- <a name="l03225"></a>03225 SMARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l03226"></a>03226 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l03227"></a>03227 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l03228"></a>03228 total += result;
- <a name="l03229"></a>03229 SETBYTE2(cells, result);
- <a name="l03230"></a>03230
- <a name="l03231"></a>03231 SMARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l03232"></a>03232 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l03233"></a>03233 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l03234"></a>03234 total += result;
- <a name="l03235"></a>03235 SETBYTE3(cells, result);
- <a name="l03236"></a>03236
- <a name="l03237"></a>03237 *front = cells;
- <a name="l03238"></a>03238 front++;
- <a name="l03239"></a>03239 }
- <a name="l03240"></a>03240 }
- <a name="l03241"></a>03241 }
- <a name="l03242"></a>03242
- <a name="l03243"></a>03243
- <a name="l03244"></a>03244 <span class="comment">// This is a flaming version of marble, which diffuses</span>
- <a name="l03245"></a>03245 <span class="comment">// heat upward so it looks like a flame. Think of heat</span>
- <a name="l03246"></a>03246 <span class="comment">// diffusion as repeated bluring, or an iterative</span>
- <a name="l03247"></a>03247 <span class="comment">// convulution kernel. Normally, all the neighbors are</span>
- <a name="l03248"></a>03248 <span class="comment">// averaged with equal weights. In this case, we ignore</span>
- <a name="l03249"></a>03249 <span class="comment">// the nw, n, and ne neighbors, and look at the sw, s,</span>
- <a name="l03250"></a>03250 <span class="comment">// and se neighbors twice, so heat flows to the north.</span>
- <a name="l03251"></a>03251
- <a name="l03252"></a>03252 <span class="preprocessor">#define FARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l03253"></a>03253 <span class="preprocessor"> error += ((c << 3) + sw + se + w + frob + e + sw + s + s + se); \</span>
- <a name="l03254"></a>03254 <span class="preprocessor"> result = error >> 4; \</span>
- <a name="l03255"></a>03255 <span class="preprocessor"> error &= 0x0f;</span>
- <a name="l03256"></a>03256 <span class="preprocessor"></span>
- <a name="l03257"></a>03257 <span class="keywordtype">void</span> CellEngine::n_farble()
- <a name="l03258"></a>03258 {
- <a name="l03259"></a>03259 QUAD *front = (QUAD *)frontMem;
- <a name="l03260"></a>03260 QUAD *back = (QUAD *)(backMem +
- <a name="l03261"></a>03261 (backBorder - 1) +
- <a name="l03262"></a>03262 ((backBorder - 1) * backRowBytes));
- <a name="l03263"></a>03263 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l03264"></a>03264 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l03265"></a>03265 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l03266"></a>03266 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l03267"></a>03267 <span class="keywordtype">long</span> yy;
- <a name="l03268"></a>03268
- <a name="l03269"></a>03269 total = 0;
- <a name="l03270"></a>03270
- <a name="l03271"></a>03271 <span class="keywordflow">for</span> (yy = height;
- <a name="l03272"></a>03272 yy > 0;
- <a name="l03273"></a>03273 back += backstride,
- <a name="l03274"></a>03274 front += frontstride,
- <a name="l03275"></a>03275 yy--) {
- <a name="l03276"></a>03276 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l03277"></a>03277 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l03278"></a>03278 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l03279"></a>03279 <span class="keywordtype">long</span> error = 0;
- <a name="l03280"></a>03280 <span class="keywordtype">long</span> xx;
- <a name="l03281"></a>03281
- <a name="l03282"></a>03282 b2 = back[0];
- <a name="l03283"></a>03283 c2 = back[backline];
- <a name="l03284"></a>03284 d2 = back[backline << 1];
- <a name="l03285"></a>03285 back++;
- <a name="l03286"></a>03286
- <a name="l03287"></a>03287 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l03288"></a>03288 xx > 0;
- <a name="l03289"></a>03289 xx--) {
- <a name="l03290"></a>03290 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l03291"></a>03291
- <a name="l03292"></a>03292 b1 = b2; b2 = back[0];
- <a name="l03293"></a>03293 c1 = c2; c2 = back[backline];
- <a name="l03294"></a>03294 d1 = d2; d2 = back[backline << 1];
- <a name="l03295"></a>03295 back++;
- <a name="l03296"></a>03296
- <a name="l03297"></a>03297 FARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l03298"></a>03298 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l03299"></a>03299 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l03300"></a>03300 total += result;
- <a name="l03301"></a>03301 SETBYTE0(cells, result);
- <a name="l03302"></a>03302
- <a name="l03303"></a>03303 FARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l03304"></a>03304 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l03305"></a>03305 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l03306"></a>03306 total += result;
- <a name="l03307"></a>03307 SETBYTE1(cells, result);
- <a name="l03308"></a>03308
- <a name="l03309"></a>03309 FARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l03310"></a>03310 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l03311"></a>03311 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l03312"></a>03312 total += result;
- <a name="l03313"></a>03313 SETBYTE2(cells, result);
- <a name="l03314"></a>03314
- <a name="l03315"></a>03315 FARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l03316"></a>03316 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l03317"></a>03317 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l03318"></a>03318 total += result;
- <a name="l03319"></a>03319 SETBYTE3(cells, result);
- <a name="l03320"></a>03320
- <a name="l03321"></a>03321 *front = cells;
- <a name="l03322"></a>03322 front++;
- <a name="l03323"></a>03323 }
- <a name="l03324"></a>03324 }
- <a name="l03325"></a>03325 }
- <a name="l03326"></a>03326
- <a name="l03327"></a>03327
- <a name="l03328"></a>03328 <span class="comment">// This is a wavy version of flaming marble.</span>
- <a name="l03329"></a>03329 <span class="comment">// We define four different convolution kernels, that diffuse</span>
- <a name="l03330"></a>03330 <span class="comment">// the heat in different directions (nw, n, ne, and side to side),</span>
- <a name="l03331"></a>03331 <span class="comment">// and select between then based on the phase (0 to 3).</span>
- <a name="l03332"></a>03332 <span class="comment">// What defines the phase?</span>
- <a name="l03333"></a>03333 <span class="comment">// There are several interesting defintions.</span>
- <a name="l03334"></a>03334 <span class="comment">// Generally, we don't want to change phase too often, and we</span>
- <a name="l03335"></a>03335 <span class="comment">// want to do it in interesting patterns so the heat flows nicely.</span>
- <a name="l03336"></a>03336 <span class="comment">// The right shifting lowers the frequency of the phase changes.</span>
- <a name="l03337"></a>03337 <span class="comment">// The anding with 3 is because there are only 4 phases.</span>
- <a name="l03338"></a>03338 <span class="comment">// (y >> 2) & 3:</span>
- <a name="l03339"></a>03339 <span class="comment">// Vertically driven phase.</span>
- <a name="l03340"></a>03340 <span class="comment">// Horizontally synchronized vertical waves.</span>
- <a name="l03341"></a>03341 <span class="comment">// ((x + y) >> 2) & 3:</span>
- <a name="l03342"></a>03342 <span class="comment">// Vertically and horizontally driven phase.</span>
- <a name="l03343"></a>03343 <span class="comment">// Sheared diamond synchronized waves.</span>
- <a name="l03344"></a>03344 <span class="comment">// ((x + y + c) >> 2) & 3:</span>
- <a name="l03345"></a>03345 <span class="comment">// Vertically, horizontally, and smoothly varying</span>
- <a name="l03346"></a>03346 <span class="comment">// temperature driven phase.</span>
- <a name="l03347"></a>03347 <span class="comment">// Diamonds smoothly shifting phase with the heat contours.</span>
- <a name="l03348"></a>03348 <span class="comment">// Interesting feedback driving heat flow direction by heat.</span>
- <a name="l03349"></a>03349 <span class="comment">//</span>
- <a name="l03350"></a>03350 <span class="comment">// OOPS: There's a bug in the following code that I'm preserving</span>
- <a name="l03351"></a>03351 <span class="comment">// since it still looks nice. I meant to type "xx" instead of "x",</span>
- <a name="l03352"></a>03352 <span class="comment">// and "yy" instead of "y", because x and y are the position of the</span>
- <a name="l03353"></a>03353 <span class="comment">// upper left corner, not the cell. GARBLEBUG is the old buggy one,</span>
- <a name="l03354"></a>03354 <span class="comment">// and GARBLE is the fixed version that is described above.</span>
- <a name="l03355"></a>03355
- <a name="l03356"></a>03356 <span class="preprocessor">#define GARBLEBUG(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l03357"></a>03357 <span class="preprocessor"> switch (((y + x + c) >> 2) & 3) { \</span>
- <a name="l03358"></a>03358 <span class="preprocessor"> case 0: \</span>
- <a name="l03359"></a>03359 <span class="preprocessor"> error += (frob + (c << 3) + w + sw + sw + s + s + se + se + e); \</span>
- <a name="l03360"></a>03360 <span class="preprocessor"> break; \</span>
- <a name="l03361"></a>03361 <span class="preprocessor"> case 1: \</span>
- <a name="l03362"></a>03362 <span class="preprocessor"> error += (frob + (c << 3) + w + w + w + sw + sw + s + se + e); \</span>
- <a name="l03363"></a>03363 <span class="preprocessor"> break; \</span>
- <a name="l03364"></a>03364 <span class="preprocessor"> case 2: \</span>
- <a name="l03365"></a>03365 <span class="preprocessor"> error += (frob + (c << 3) + w + w + sw + sw + se + se + e + e); \</span>
- <a name="l03366"></a>03366 <span class="preprocessor"> break; \</span>
- <a name="l03367"></a>03367 <span class="preprocessor"> case 3: \</span>
- <a name="l03368"></a>03368 <span class="preprocessor"> error += (frob + (c << 3) + w + sw + s + se + se + e + e + e); \</span>
- <a name="l03369"></a>03369 <span class="preprocessor"> break; \</span>
- <a name="l03370"></a>03370 <span class="preprocessor"> } \</span>
- <a name="l03371"></a>03371 <span class="preprocessor"> result = error >> 4; \</span>
- <a name="l03372"></a>03372 <span class="preprocessor"> error &= 0x0f;</span>
- <a name="l03373"></a>03373 <span class="preprocessor"></span>
- <a name="l03374"></a>03374 <span class="keywordtype">void</span> CellEngine::n_garblebug()
- <a name="l03375"></a>03375 {
- <a name="l03376"></a>03376 QUAD *front = (QUAD *)frontMem;
- <a name="l03377"></a>03377 QUAD *back = (QUAD *)(backMem +
- <a name="l03378"></a>03378 (backBorder - 1) +
- <a name="l03379"></a>03379 ((backBorder - 1) * backRowBytes));
- <a name="l03380"></a>03380 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l03381"></a>03381 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l03382"></a>03382 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l03383"></a>03383 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l03384"></a>03384 <span class="keywordtype">long</span> yy;
- <a name="l03385"></a>03385
- <a name="l03386"></a>03386 total = 0;
- <a name="l03387"></a>03387
- <a name="l03388"></a>03388 <span class="keywordflow">for</span> (yy = height;
- <a name="l03389"></a>03389 yy > 0;
- <a name="l03390"></a>03390 back += backstride,
- <a name="l03391"></a>03391 front += frontstride,
- <a name="l03392"></a>03392 yy--) {
- <a name="l03393"></a>03393 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l03394"></a>03394 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l03395"></a>03395 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l03396"></a>03396 <span class="keywordtype">long</span> error = 0;
- <a name="l03397"></a>03397 <span class="keywordtype">long</span> xx;
- <a name="l03398"></a>03398
- <a name="l03399"></a>03399 b2 = back[0];
- <a name="l03400"></a>03400 c2 = back[backline];
- <a name="l03401"></a>03401 d2 = back[backline << 1];
- <a name="l03402"></a>03402 back++;
- <a name="l03403"></a>03403
- <a name="l03404"></a>03404 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l03405"></a>03405 xx > 0;
- <a name="l03406"></a>03406 xx--) {
- <a name="l03407"></a>03407 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l03408"></a>03408
- <a name="l03409"></a>03409 b1 = b2; b2 = back[0];
- <a name="l03410"></a>03410 c1 = c2; c2 = back[backline];
- <a name="l03411"></a>03411 d1 = d2; d2 = back[backline << 1];
- <a name="l03412"></a>03412 back++;
- <a name="l03413"></a>03413
- <a name="l03414"></a>03414 GARBLEBUG( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l03415"></a>03415 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l03416"></a>03416 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l03417"></a>03417 total += result;
- <a name="l03418"></a>03418 SETBYTE0(cells, result);
- <a name="l03419"></a>03419
- <a name="l03420"></a>03420 GARBLEBUG( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l03421"></a>03421 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l03422"></a>03422 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l03423"></a>03423 total += result;
- <a name="l03424"></a>03424 SETBYTE1(cells, result);
- <a name="l03425"></a>03425
- <a name="l03426"></a>03426 GARBLEBUG( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l03427"></a>03427 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l03428"></a>03428 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l03429"></a>03429 total += result;
- <a name="l03430"></a>03430 SETBYTE2(cells, result);
- <a name="l03431"></a>03431
- <a name="l03432"></a>03432 GARBLEBUG( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l03433"></a>03433 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l03434"></a>03434 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l03435"></a>03435 total += result;
- <a name="l03436"></a>03436 SETBYTE3(cells, result);
- <a name="l03437"></a>03437
- <a name="l03438"></a>03438 *front = cells;
- <a name="l03439"></a>03439 front++;
- <a name="l03440"></a>03440 }
- <a name="l03441"></a>03441 }
- <a name="l03442"></a>03442 }
- <a name="l03443"></a>03443
- <a name="l03444"></a>03444
- <a name="l03445"></a>03445 <span class="preprocessor">#define GARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l03446"></a>03446 <span class="preprocessor"> switch (((yy + xx + c) >> 2) & 3) { \</span>
- <a name="l03447"></a>03447 <span class="preprocessor"> case 0: \</span>
- <a name="l03448"></a>03448 <span class="preprocessor"> error += (frob + (c << 3) + w + sw + sw + s + s + se + se + e); \</span>
- <a name="l03449"></a>03449 <span class="preprocessor"> break; \</span>
- <a name="l03450"></a>03450 <span class="preprocessor"> case 1: \</span>
- <a name="l03451"></a>03451 <span class="preprocessor"> error += (frob + (c << 3) + w + w + w + sw + sw + s + se + e); \</span>
- <a name="l03452"></a>03452 <span class="preprocessor"> break; \</span>
- <a name="l03453"></a>03453 <span class="preprocessor"> case 2: \</span>
- <a name="l03454"></a>03454 <span class="preprocessor"> error += (frob + (c << 3) + w + w + sw + sw + se + se + e + e); \</span>
- <a name="l03455"></a>03455 <span class="preprocessor"> break; \</span>
- <a name="l03456"></a>03456 <span class="preprocessor"> case 3: \</span>
- <a name="l03457"></a>03457 <span class="preprocessor"> error += (frob + (c << 3) + w + sw + s + se + se + e + e + e); \</span>
- <a name="l03458"></a>03458 <span class="preprocessor"> break; \</span>
- <a name="l03459"></a>03459 <span class="preprocessor"> } \</span>
- <a name="l03460"></a>03460 <span class="preprocessor"> result = error >> 4; \</span>
- <a name="l03461"></a>03461 <span class="preprocessor"> error &= 0x0f;</span>
- <a name="l03462"></a>03462 <span class="preprocessor"></span>
- <a name="l03463"></a>03463 <span class="keywordtype">void</span> CellEngine::n_garble()
- <a name="l03464"></a>03464 {
- <a name="l03465"></a>03465 QUAD *front = (QUAD *)frontMem;
- <a name="l03466"></a>03466 QUAD *back = (QUAD *)(backMem +
- <a name="l03467"></a>03467 (backBorder - 1) +
- <a name="l03468"></a>03468 ((backBorder - 1) * backRowBytes));
- <a name="l03469"></a>03469 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l03470"></a>03470 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l03471"></a>03471 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l03472"></a>03472 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l03473"></a>03473 <span class="keywordtype">long</span> yy;
- <a name="l03474"></a>03474
- <a name="l03475"></a>03475 total = 0;
- <a name="l03476"></a>03476
- <a name="l03477"></a>03477 <span class="keywordflow">for</span> (yy = height;
- <a name="l03478"></a>03478 yy > 0;
- <a name="l03479"></a>03479 back += backstride,
- <a name="l03480"></a>03480 front += frontstride,
- <a name="l03481"></a>03481 yy--) {
- <a name="l03482"></a>03482 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l03483"></a>03483 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l03484"></a>03484 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l03485"></a>03485 <span class="keywordtype">long</span> error = 0;
- <a name="l03486"></a>03486 <span class="keywordtype">long</span> xx;
- <a name="l03487"></a>03487
- <a name="l03488"></a>03488 b2 = back[0];
- <a name="l03489"></a>03489 c2 = back[backline];
- <a name="l03490"></a>03490 d2 = back[backline << 1];
- <a name="l03491"></a>03491 back++;
- <a name="l03492"></a>03492
- <a name="l03493"></a>03493 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l03494"></a>03494 xx > 0;
- <a name="l03495"></a>03495 xx--) {
- <a name="l03496"></a>03496 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l03497"></a>03497
- <a name="l03498"></a>03498 b1 = b2; b2 = back[0];
- <a name="l03499"></a>03499 c1 = c2; c2 = back[backline];
- <a name="l03500"></a>03500 d1 = d2; d2 = back[backline << 1];
- <a name="l03501"></a>03501 back++;
- <a name="l03502"></a>03502
- <a name="l03503"></a>03503 GARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l03504"></a>03504 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l03505"></a>03505 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l03506"></a>03506 total += result;
- <a name="l03507"></a>03507 SETBYTE0(cells, result);
- <a name="l03508"></a>03508
- <a name="l03509"></a>03509 GARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l03510"></a>03510 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l03511"></a>03511 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l03512"></a>03512 total += result;
- <a name="l03513"></a>03513 SETBYTE1(cells, result);
- <a name="l03514"></a>03514
- <a name="l03515"></a>03515 GARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l03516"></a>03516 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l03517"></a>03517 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l03518"></a>03518 total += result;
- <a name="l03519"></a>03519 SETBYTE2(cells, result);
- <a name="l03520"></a>03520
- <a name="l03521"></a>03521 GARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l03522"></a>03522 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l03523"></a>03523 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l03524"></a>03524 total += result;
- <a name="l03525"></a>03525 SETBYTE3(cells, result);
- <a name="l03526"></a>03526
- <a name="l03527"></a>03527 *front = cells;
- <a name="l03528"></a>03528 front++;
- <a name="l03529"></a>03529 }
- <a name="l03530"></a>03530 }
- <a name="l03531"></a>03531 }
- <a name="l03532"></a>03532
- <a name="l03533"></a>03533
- <a name="l03534"></a>03534 <span class="preprocessor">#define TWOHEATS(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l03535"></a>03535 <span class="preprocessor"> error += ((nw&0x0f) + (n&0x0f) + (ne&0x0f) + (w&0x0f) + (frob&0x0f) + (e&0x0f) + (sw&0x0f) + (s&0x0f) + (se&0x0f)); \</span>
- <a name="l03536"></a>03536 <span class="preprocessor"> result = (error >> 3) & 0x0f; \</span>
- <a name="l03537"></a>03537 <span class="preprocessor"> error &= 7; \</span>
- <a name="l03538"></a>03538 <span class="preprocessor"> error += ((nw>>4) + (n>>4) + (ne>>4) + (w>>4) + ((frob>>1)&0x0f) + (e>>4) + (sw>>4) + (s>>4) + (se>>4)); \</span>
- <a name="l03539"></a>03539 <span class="preprocessor"> result |= (error<<1) & 0xf0; \</span>
- <a name="l03540"></a>03540 <span class="preprocessor"> error &= 7;</span>
- <a name="l03541"></a>03541 <span class="preprocessor"></span>
- <a name="l03542"></a>03542 <span class="keywordtype">void</span> CellEngine::n_twoheats()
- <a name="l03543"></a>03543 {
- <a name="l03544"></a>03544 QUAD *front = (QUAD *)frontMem;
- <a name="l03545"></a>03545 QUAD *back = (QUAD *)(backMem +
- <a name="l03546"></a>03546 (backBorder - 1) +
- <a name="l03547"></a>03547 ((backBorder - 1) * backRowBytes));
- <a name="l03548"></a>03548 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l03549"></a>03549 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l03550"></a>03550 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l03551"></a>03551 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l03552"></a>03552 <span class="keywordtype">long</span> yy;
- <a name="l03553"></a>03553
- <a name="l03554"></a>03554 total = 0;
- <a name="l03555"></a>03555
- <a name="l03556"></a>03556 <span class="keywordflow">for</span> (yy = height;
- <a name="l03557"></a>03557 yy > 0;
- <a name="l03558"></a>03558 back += backstride,
- <a name="l03559"></a>03559 front += frontstride,
- <a name="l03560"></a>03560 yy--) {
- <a name="l03561"></a>03561 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l03562"></a>03562 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l03563"></a>03563 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l03564"></a>03564 <span class="keywordtype">long</span> error = 0;
- <a name="l03565"></a>03565 <span class="keywordtype">long</span> xx;
- <a name="l03566"></a>03566
- <a name="l03567"></a>03567 b2 = back[0];
- <a name="l03568"></a>03568 c2 = back[backline];
- <a name="l03569"></a>03569 d2 = back[backline << 1];
- <a name="l03570"></a>03570 back++;
- <a name="l03571"></a>03571
- <a name="l03572"></a>03572 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l03573"></a>03573 xx > 0;
- <a name="l03574"></a>03574 xx--) {
- <a name="l03575"></a>03575 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l03576"></a>03576
- <a name="l03577"></a>03577 b1 = b2; b2 = back[0];
- <a name="l03578"></a>03578 c1 = c2; c2 = back[backline];
- <a name="l03579"></a>03579 d1 = d2; d2 = back[backline << 1];
- <a name="l03580"></a>03580 back++;
- <a name="l03581"></a>03581
- <a name="l03582"></a>03582 TWOHEATS( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l03583"></a>03583 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l03584"></a>03584 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l03585"></a>03585 total += result;
- <a name="l03586"></a>03586 SETBYTE0(cells, result);
- <a name="l03587"></a>03587
- <a name="l03588"></a>03588 TWOHEATS( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l03589"></a>03589 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l03590"></a>03590 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l03591"></a>03591 total += result;
- <a name="l03592"></a>03592 SETBYTE1(cells, result);
- <a name="l03593"></a>03593
- <a name="l03594"></a>03594 TWOHEATS( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l03595"></a>03595 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l03596"></a>03596 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l03597"></a>03597 total += result;
- <a name="l03598"></a>03598 SETBYTE2(cells, result);
- <a name="l03599"></a>03599
- <a name="l03600"></a>03600 TWOHEATS( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l03601"></a>03601 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l03602"></a>03602 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l03603"></a>03603 total += result;
- <a name="l03604"></a>03604 SETBYTE3(cells, result);
- <a name="l03605"></a>03605
- <a name="l03606"></a>03606 *front = cells;
- <a name="l03607"></a>03607 front++;
- <a name="l03608"></a>03608 }
- <a name="l03609"></a>03609 }
- <a name="l03610"></a>03610 }
- <a name="l03611"></a>03611
- <a name="l03612"></a>03612
- <a name="l03613"></a>03613 <span class="keywordtype">void</span> CellEngine::n_spin()
- <a name="l03614"></a>03614 {
- <a name="l03615"></a>03615 Byte *front = frontMem;
- <a name="l03616"></a>03616 Byte *back = backMem +
- <a name="l03617"></a>03617 (backBorder - 1) +
- <a name="l03618"></a>03618 ((backBorder - 1) * backRowBytes);
- <a name="l03619"></a>03619 Byte *f = front;
- <a name="l03620"></a>03620 <span class="keywordtype">long</span> xx, yy;
- <a name="l03621"></a>03621 <span class="comment">// float jitter = ((float)1.0 * ((float)Rand8() / (float)255.0));</span>
- <a name="l03622"></a>03622 <span class="keywordtype">float</span> jitter = 0.0;
- <a name="l03623"></a>03623 <span class="keywordtype">float</span> angle = ((float)8.0 * (<span class="keywordtype">float</span>)frob) + jitter;
- <a name="l03624"></a>03624 angle += ((float) hubba) * (float)-0.3;
- <a name="l03625"></a>03625 <span class="keywordtype">float</span> rad = (-angle) / (<span class="keywordtype">float</span>)(180.0 / 3.14152973);
- <a name="l03626"></a>03626 <span class="keywordtype">float</span> dy = (float)sin(rad);
- <a name="l03627"></a>03627 <span class="keywordtype">float</span> dx = (float)cos(rad);
- <a name="l03628"></a>03628 <span class="keywordtype">float</span> cx = (float)width / (<span class="keywordtype">float</span>)2.0;
- <a name="l03629"></a>03629 <span class="keywordtype">float</span> cy = (float)height / (<span class="keywordtype">float</span>)2.0;
- <a name="l03630"></a>03630
- <a name="l03631"></a>03631 <span class="keywordflow">for</span> (yy = 0;
- <a name="l03632"></a>03632 yy < height;
- <a name="l03633"></a>03633 f += screenRowBytes,
- <a name="l03634"></a>03634 yy++) {
- <a name="l03635"></a>03635 <span class="keywordflow">for</span> (xx = 0;
- <a name="l03636"></a>03636 xx < width;
- <a name="l03637"></a>03637 xx++) {
- <a name="l03638"></a>03638 <span class="keywordtype">float</span> x1, y1;
- <a name="l03639"></a>03639 <span class="keywordtype">long</span> x2, y2;
- <a name="l03640"></a>03640
- <a name="l03641"></a>03641 x1 = (float)xx - cx;
- <a name="l03642"></a>03642 y1 = (float)yy - cy;
- <a name="l03643"></a>03643
- <a name="l03644"></a>03644 x2 = (long)floor(1.5 + (x1 * dx) + (y1 * dy) + cx);
- <a name="l03645"></a>03645 y2 = (long)floor(1.5 + (y1 * dx) - (x1 * dy) + cy);
- <a name="l03646"></a>03646
- <a name="l03647"></a>03647 <span class="keywordflow">if</span> ((x2 >= 0) &&
- <a name="l03648"></a>03648 (x2 < width) &&
- <a name="l03649"></a>03649 (y2 >= 0) &&
- <a name="l03650"></a>03650 (y2 < height)) {
- <a name="l03651"></a>03651
- <a name="l03652"></a>03652 f[xx] = back[(y2 * backRowBytes) + x2];
- <a name="l03653"></a>03653 }
- <a name="l03654"></a>03654 }
- <a name="l03655"></a>03655 }
- <a name="l03656"></a>03656 }
- <a name="l03657"></a>03657
- <a name="l03658"></a>03658
- <a name="l03659"></a>03659 <span class="comment">// Driven Diffusion by Two Species</span>
- <a name="l03660"></a>03660 <span class="comment">// by Richard J. Gaylord and Kazume Nishidate</span>
- <a name="l03661"></a>03661 <span class="comment">// Mathematica in Education Research</span>
- <a name="l03662"></a>03662 <span class="comment">// Volume 6, Number 2, Spring 1997</span>
- <a name="l03663"></a>03663
- <a name="l03664"></a>03664 <span class="comment">// 00 000_____ : empty</span>
- <a name="l03665"></a>03665 <span class="comment">// 20 001_____ : empty</span>
- <a name="l03666"></a>03666 <span class="comment">// 40 010_____ : wall</span>
- <a name="l03667"></a>03667 <span class="comment">// 60 011_____ : mirror</span>
- <a name="l03668"></a>03668 <span class="comment">// 80 100_____ : A particle</span>
- <a name="l03669"></a>03669 <span class="comment">// a0 101_____ : B particle</span>
- <a name="l03670"></a>03670 <span class="comment">// c0 110_____ : C particle</span>
- <a name="l03671"></a>03671 <span class="comment">// e0 111_____ : D particle</span>
- <a name="l03672"></a>03672
- <a name="l03673"></a>03673 <span class="preprocessor">#define PART_MASK 0xe0</span>
- <a name="l03674"></a>03674 <span class="preprocessor"></span><span class="preprocessor">#define ABCD_MASK 0x60</span>
- <a name="l03675"></a>03675 <span class="preprocessor"></span><span class="preprocessor">#define PART(x) ((x) & PART_MASK)</span>
- <a name="l03676"></a>03676 <span class="preprocessor"></span><span class="preprocessor">#define ABCD(x) (((x) & ABCD_MASK) | 0x80)</span>
- <a name="l03677"></a>03677 <span class="preprocessor"></span><span class="preprocessor">#define PART_EMPTY 0x00</span>
- <a name="l03678"></a>03678 <span class="preprocessor"></span><span class="preprocessor">#define PART_PLASMA 0x20</span>
- <a name="l03679"></a>03679 <span class="preprocessor"></span><span class="preprocessor">#define PART_WALL 0x40</span>
- <a name="l03680"></a>03680 <span class="preprocessor"></span><span class="preprocessor">#define PART_MIRROR 0x60</span>
- <a name="l03681"></a>03681 <span class="preprocessor"></span><span class="preprocessor">#define PART_A 0x80</span>
- <a name="l03682"></a>03682 <span class="preprocessor"></span><span class="preprocessor">#define PART_B 0xa0</span>
- <a name="l03683"></a>03683 <span class="preprocessor"></span><span class="preprocessor">#define PART_C 0xc0</span>
- <a name="l03684"></a>03684 <span class="preprocessor"></span><span class="preprocessor">#define PART_D 0xe0</span>
- <a name="l03685"></a>03685 <span class="preprocessor"></span><span class="preprocessor">#define ISPLASMA(x) (PART(x) == PART_PLASMA)</span>
- <a name="l03686"></a>03686 <span class="preprocessor"></span><span class="preprocessor">#define ISWALL(x) (PART(x) == PART_WALL)</span>
- <a name="l03687"></a>03687 <span class="preprocessor"></span><span class="preprocessor">#define ISMIRROR(x) (PART(x) == PART_MIRROR)</span>
- <a name="l03688"></a>03688 <span class="preprocessor"></span><span class="preprocessor">#define ISA(x) (PART(x) == PART_A)</span>
- <a name="l03689"></a>03689 <span class="preprocessor"></span><span class="preprocessor">#define ISB(x) (PART(x) == PART_B)</span>
- <a name="l03690"></a>03690 <span class="preprocessor"></span><span class="preprocessor">#define ISC(x) (PART(x) == PART_C)</span>
- <a name="l03691"></a>03691 <span class="preprocessor"></span><span class="preprocessor">#define ISD(x) (PART(x) == PART_D)</span>
- <a name="l03692"></a>03692 <span class="preprocessor"></span><span class="preprocessor">#define ISABCD(x) ((x) & 0x80)</span>
- <a name="l03693"></a>03693 <span class="preprocessor"></span><span class="comment">//#define ISEMPTY(x) (((x) & 0xc0) == PART_EMPTY)</span>
- <a name="l03694"></a>03694 <span class="preprocessor">#define ISEMPTY(x) (PART(x) == PART_EMPTY)</span>
- <a name="l03695"></a>03695 <span class="preprocessor"></span>
- <a name="l03696"></a>03696 <span class="comment">// __XXXX__ : payload</span>
- <a name="l03697"></a>03697
- <a name="l03698"></a>03698 <span class="preprocessor">#define PAYLOAD_MASK 0x1c</span>
- <a name="l03699"></a>03699 <span class="preprocessor"></span><span class="preprocessor">#define PAYLOAD(x) ((x) & PAYLOAD_MASK)</span>
- <a name="l03700"></a>03700 <span class="preprocessor"></span>
- <a name="l03701"></a>03701 <span class="comment">// 0</span>
- <a name="l03702"></a>03702 <span class="comment">// 3 1</span>
- <a name="l03703"></a>03703 <span class="comment">// 2</span>
- <a name="l03704"></a>03704 <span class="comment">//</span>
- <a name="l03705"></a>03705 <span class="comment">// ______00 : north</span>
- <a name="l03706"></a>03706 <span class="comment">// ______01 : east</span>
- <a name="l03707"></a>03707 <span class="comment">// ______10 : south</span>
- <a name="l03708"></a>03708 <span class="comment">// ______11 : west</span>
- <a name="l03709"></a>03709
- <a name="l03710"></a>03710 <span class="preprocessor">#define DIR_MASK 0x03</span>
- <a name="l03711"></a>03711 <span class="preprocessor"></span><span class="preprocessor">#define DIR(x) ((x) & DIR_MASK)</span>
- <a name="l03712"></a>03712 <span class="preprocessor"></span><span class="preprocessor">#define DIR_N 0x00</span>
- <a name="l03713"></a>03713 <span class="preprocessor"></span><span class="preprocessor">#define DIR_E 0x01</span>
- <a name="l03714"></a>03714 <span class="preprocessor"></span><span class="preprocessor">#define DIR_S 0x02</span>
- <a name="l03715"></a>03715 <span class="preprocessor"></span><span class="preprocessor">#define DIR_W 0x03</span>
- <a name="l03716"></a>03716 <span class="preprocessor"></span>
- <a name="l03717"></a>03717 <span class="preprocessor">#define NOTPART_MASK (PAYLOAD_MASK | DIR_MASK)</span>
- <a name="l03718"></a>03718 <span class="preprocessor"></span><span class="preprocessor">#define NOTPART(x) ((x) & NOTPART_MASK)</span>
- <a name="l03719"></a>03719 <span class="preprocessor"></span>
- <a name="l03720"></a>03720
- <a name="l03721"></a>03721 Byte RandDir(Byte x);
- <a name="l03722"></a>03722
- <a name="l03723"></a>03723 Byte RandDir(Byte x)
- <a name="l03724"></a>03724 {
- <a name="l03725"></a>03725 <span class="keywordtype">long</span> b = Rand8() < 128;
- <a name="l03726"></a>03726 Byte result = 0;
- <a name="l03727"></a>03727
- <a name="l03728"></a>03728 <span class="keywordflow">switch</span> (ABCD(x)) {
- <a name="l03729"></a>03729
- <a name="l03730"></a>03730 <span class="keywordflow">case</span> PART_A:
- <a name="l03731"></a>03731 result = b ? DIR_N : DIR_W;
- <a name="l03732"></a>03732 <span class="keywordflow">break</span>;
- <a name="l03733"></a>03733
- <a name="l03734"></a>03734 <span class="keywordflow">case</span> PART_B:
- <a name="l03735"></a>03735 result = b ? DIR_W : DIR_S;
- <a name="l03736"></a>03736 <span class="keywordflow">break</span>;
- <a name="l03737"></a>03737
- <a name="l03738"></a>03738 <span class="keywordflow">case</span> PART_C:
- <a name="l03739"></a>03739 result = b ? DIR_S : DIR_E;
- <a name="l03740"></a>03740 <span class="keywordflow">break</span>;
- <a name="l03741"></a>03741
- <a name="l03742"></a>03742 <span class="keywordflow">case</span> PART_D:
- <a name="l03743"></a>03743 result = b ? DIR_E : DIR_N;
- <a name="l03744"></a>03744 <span class="keywordflow">break</span>;
- <a name="l03745"></a>03745
- <a name="l03746"></a>03746 }
- <a name="l03747"></a>03747
- <a name="l03748"></a>03748 <span class="keywordflow">return</span> PART(x) | result | PAYLOAD(x);
- <a name="l03749"></a>03749 }
- <a name="l03750"></a>03750
- <a name="l03751"></a>03751
- <a name="l03752"></a>03752 <span class="keywordtype">void</span> CellEngine::n_driven()
- <a name="l03753"></a>03753 {
- <a name="l03754"></a>03754 Byte *front = frontMem;
- <a name="l03755"></a>03755 Byte *back = backMem +
- <a name="l03756"></a>03756 backBorder +
- <a name="l03757"></a>03757 (backBorder * backRowBytes);
- <a name="l03758"></a>03758 Byte *f = front, *b = back;
- <a name="l03759"></a>03759 <span class="keywordtype">long</span> xx, yy;
- <a name="l03760"></a>03760 <span class="keywordtype">long</span> heat = 0;
- <a name="l03761"></a>03761 Byte nw, n, ne;
- <a name="l03762"></a>03762 Byte ww, w, c, e, ee;
- <a name="l03763"></a>03763 Byte sw, s, se;
- <a name="l03764"></a>03764
- <a name="l03765"></a>03765 <span class="keywordflow">for</span> (yy = 0;
- <a name="l03766"></a>03766 yy < height;
- <a name="l03767"></a>03767 f += screenRowBytes,
- <a name="l03768"></a>03768 b += backRowBytes,
- <a name="l03769"></a>03769 yy++) {
- <a name="l03770"></a>03770
- <a name="l03771"></a>03771 <span class="comment">// .. __ .. .. ..</span>
- <a name="l03772"></a>03772 <span class="comment">// __ n ne .. ..</span>
- <a name="l03773"></a>03773 <span class="comment">// w c e ee ..</span>
- <a name="l03774"></a>03774 <span class="comment">// __ s se .. ..</span>
- <a name="l03775"></a>03775 <span class="comment">// .. __ .. .. ..</span>
- <a name="l03776"></a>03776
- <a name="l03777"></a>03777 n = b[-1 + -backRowBytes];
- <a name="l03778"></a>03778 ne = b[-backRowBytes];
- <a name="l03779"></a>03779 w = b[-2];
- <a name="l03780"></a>03780 c = b[-1];
- <a name="l03781"></a>03781 e = b[0];
- <a name="l03782"></a>03782 ee = b[1];
- <a name="l03783"></a>03783 s = b[-1 + backRowBytes];
- <a name="l03784"></a>03784 se = b[backRowBytes];
- <a name="l03785"></a>03785
- <a name="l03786"></a>03786 <span class="keywordflow">for</span> (xx = 0;
- <a name="l03787"></a>03787 xx < width;
- <a name="l03788"></a>03788 xx++) {
- <a name="l03789"></a>03789 <span class="comment">// .. .. NN .. ..</span>
- <a name="l03790"></a>03790 <span class="comment">// .. nw n NE ..</span>
- <a name="l03791"></a>03791 <span class="comment">// ww w c e EE</span>
- <a name="l03792"></a>03792 <span class="comment">// .. sw s SE ..</span>
- <a name="l03793"></a>03793 <span class="comment">// .. .. SS .. ..</span>
- <a name="l03794"></a>03794
- <a name="l03795"></a>03795 nw = n;
- <a name="l03796"></a>03796 n = ne;
- <a name="l03797"></a>03797 ne = b[xx + 1 + -backRowBytes];
- <a name="l03798"></a>03798 ww = w;
- <a name="l03799"></a>03799 w = c;
- <a name="l03800"></a>03800 c = e;
- <a name="l03801"></a>03801 e = ee;
- <a name="l03802"></a>03802 ee = b[xx + 2];
- <a name="l03803"></a>03803 sw = s;
- <a name="l03804"></a>03804 s = se;
- <a name="l03805"></a>03805 se = b[xx + 1 + backRowBytes];
- <a name="l03806"></a>03806
- <a name="l03807"></a>03807 <span class="keywordflow">if</span> (ISEMPTY(c)) {
- <a name="l03808"></a>03808
- <a name="l03809"></a>03809 <span class="keywordflow">switch</span> (((ISABCD(n) && (DIR(n) == DIR_S)) ? 1 : 0) +
- <a name="l03810"></a>03810 ((ISABCD(e) && (DIR(e) == DIR_W)) ? 2 : 0) +
- <a name="l03811"></a>03811 ((ISABCD(s) && (DIR(s) == DIR_N)) ? 4 : 0) +
- <a name="l03812"></a>03812 ((ISABCD(w) && (DIR(w) == DIR_E)) ? 8 : 0)) {
- <a name="l03813"></a>03813
- <a name="l03814"></a>03814 <span class="keywordflow">case</span> 1:
- <a name="l03815"></a>03815 f[xx] = RandDir(n);
- <a name="l03816"></a>03816 <span class="keywordflow">break</span>;
- <a name="l03817"></a>03817
- <a name="l03818"></a>03818 <span class="keywordflow">case</span> 2:
- <a name="l03819"></a>03819 f[xx] = RandDir(e);
- <a name="l03820"></a>03820 <span class="keywordflow">break</span>;
- <a name="l03821"></a>03821
- <a name="l03822"></a>03822 <span class="keywordflow">case</span> 4:
- <a name="l03823"></a>03823 f[xx] = RandDir(s);
- <a name="l03824"></a>03824 <span class="keywordflow">break</span>;
- <a name="l03825"></a>03825
- <a name="l03826"></a>03826 <span class="keywordflow">case</span> 8:
- <a name="l03827"></a>03827 f[xx] = RandDir(w);
- <a name="l03828"></a>03828 <span class="keywordflow">break</span>;
- <a name="l03829"></a>03829
- <a name="l03830"></a>03830 <span class="keywordflow">default</span>:
- <a name="l03831"></a>03831 <span class="comment">// stay the same</span>
- <a name="l03832"></a>03832 <span class="keywordflow">break</span>;
- <a name="l03833"></a>03833
- <a name="l03834"></a>03834 }
- <a name="l03835"></a>03835 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ISPLASMA(c)) {
- <a name="l03836"></a>03836 heat += (Byte)frob;
- <a name="l03837"></a>03837 heat += ISEMPTY(nw) ? c : nw;
- <a name="l03838"></a>03838 heat += ISEMPTY(n) ? c : n;
- <a name="l03839"></a>03839 heat += ISEMPTY(ne) ? c : ne;
- <a name="l03840"></a>03840 heat += ISEMPTY(w) ? c : w;
- <a name="l03841"></a>03841 heat += ISEMPTY(e) ? c : e;
- <a name="l03842"></a>03842 heat += ISEMPTY(sw) ? c : sw;
- <a name="l03843"></a>03843 heat += ISEMPTY(s) ? c : s;
- <a name="l03844"></a>03844 heat += ISEMPTY(se) ? c : se;
- <a name="l03845"></a>03845 f[xx] = PART_PLASMA | NOTPART(heat >> 3);
- <a name="l03846"></a>03846 heat &= 7;
- <a name="l03847"></a>03847 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ISWALL(c)) {
- <a name="l03848"></a>03848 <span class="comment">// stay the same</span>
- <a name="l03849"></a>03849 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ISMIRROR(c)) {
- <a name="l03850"></a>03850 <span class="comment">// stay the same</span>
- <a name="l03851"></a>03851 } <span class="keywordflow">else</span> {
- <a name="l03852"></a>03852 <span class="keywordflow">switch</span> (DIR(c)) {
- <a name="l03853"></a>03853
- <a name="l03854"></a>03854 <span class="keywordflow">case</span> DIR_N:
- <a name="l03855"></a>03855 {
- <a name="l03856"></a>03856 Byte nn;
- <a name="l03857"></a>03857
- <a name="l03858"></a>03858 <span class="keywordflow">if</span> (ISMIRROR(n) || ISPLASMA(n)) {
- <a name="l03859"></a>03859 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
- <a name="l03860"></a>03860 <span class="preprocessor">#ifdef DOSOUND</span>
- <a name="l03861"></a>03861 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
- <a name="l03862"></a>03862 ((c >> 2) & 0x0f) |
- <a name="l03863"></a>03863 ((n & 3) << 4));
- <a name="l03864"></a>03864 <span class="preprocessor">#endif</span>
- <a name="l03865"></a>03865 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(n)) ||
- <a name="l03866"></a>03866 (ISABCD(nw) && (DIR(nw) == DIR_E)) ||
- <a name="l03867"></a>03867 (ISABCD(ne) && (DIR(ne) == DIR_W)) ||
- <a name="l03868"></a>03868 ((nn = b[xx + (-2 * backRowBytes)]),
- <a name="l03869"></a>03869 (ISABCD(nn) && (DIR(nn) == DIR_S)))) {
- <a name="l03870"></a>03870 <span class="comment">// stay the same</span>
- <a name="l03871"></a>03871 f[xx] = RandDir(c);
- <a name="l03872"></a>03872 } <span class="keywordflow">else</span> {
- <a name="l03873"></a>03873 <span class="comment">// move north</span>
- <a name="l03874"></a>03874 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
- <a name="l03875"></a>03875 }
- <a name="l03876"></a>03876 <span class="keywordflow">break</span>;
- <a name="l03877"></a>03877 }
- <a name="l03878"></a>03878
- <a name="l03879"></a>03879 <span class="keywordflow">case</span> DIR_S:
- <a name="l03880"></a>03880 {
- <a name="l03881"></a>03881 Byte ss;
- <a name="l03882"></a>03882
- <a name="l03883"></a>03883 <span class="keywordflow">if</span> (ISMIRROR(s) || ISPLASMA(s)) {
- <a name="l03884"></a>03884 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
- <a name="l03885"></a>03885 <span class="preprocessor">#ifdef DOSOUND</span>
- <a name="l03886"></a>03886 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
- <a name="l03887"></a>03887 ((c >> 2) & 0x0f) |
- <a name="l03888"></a>03888 ((s & 3) << 4));
- <a name="l03889"></a>03889 <span class="preprocessor">#endif</span>
- <a name="l03890"></a>03890 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(s)) ||
- <a name="l03891"></a>03891 (ISABCD(sw) && (DIR(sw) == DIR_E)) ||
- <a name="l03892"></a>03892 (ISABCD(se) && (DIR(se) == DIR_W)) ||
- <a name="l03893"></a>03893 ((ss = b[xx + (2 * backRowBytes)]),
- <a name="l03894"></a>03894 (ISABCD(ss) && (DIR(ss) == DIR_N)))) {
- <a name="l03895"></a>03895 <span class="comment">// stay the same</span>
- <a name="l03896"></a>03896 f[xx] = RandDir(c);
- <a name="l03897"></a>03897 } <span class="keywordflow">else</span> {
- <a name="l03898"></a>03898 <span class="comment">// move south</span>
- <a name="l03899"></a>03899 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
- <a name="l03900"></a>03900 }
- <a name="l03901"></a>03901 <span class="keywordflow">break</span>;
- <a name="l03902"></a>03902 }
- <a name="l03903"></a>03903
- <a name="l03904"></a>03904 <span class="keywordflow">case</span> DIR_W:
- <a name="l03905"></a>03905 {
- <a name="l03906"></a>03906 <span class="keywordflow">if</span> (ISMIRROR(w) || ISPLASMA(w)) {
- <a name="l03907"></a>03907 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
- <a name="l03908"></a>03908 <span class="preprocessor">#ifdef DOSOUND</span>
- <a name="l03909"></a>03909 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
- <a name="l03910"></a>03910 ((c >> 2) & 0x0f) |
- <a name="l03911"></a>03911 ((w & 3) << 4));
- <a name="l03912"></a>03912 <span class="preprocessor">#endif</span>
- <a name="l03913"></a>03913 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(w)) ||
- <a name="l03914"></a>03914 (ISABCD(ww) && (DIR(ww) == DIR_E)) ||
- <a name="l03915"></a>03915 (ISABCD(nw) && (DIR(nw) == DIR_S)) ||
- <a name="l03916"></a>03916 (ISABCD(sw) && (DIR(sw) == DIR_N))) {
- <a name="l03917"></a>03917 <span class="comment">// stay the same</span>
- <a name="l03918"></a>03918 f[xx] = RandDir(c);
- <a name="l03919"></a>03919 } <span class="keywordflow">else</span> {
- <a name="l03920"></a>03920 <span class="comment">// move west</span>
- <a name="l03921"></a>03921 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
- <a name="l03922"></a>03922 }
- <a name="l03923"></a>03923 <span class="keywordflow">break</span>;
- <a name="l03924"></a>03924 }
- <a name="l03925"></a>03925
- <a name="l03926"></a>03926 <span class="keywordflow">case</span> DIR_E:
- <a name="l03927"></a>03927 {
- <a name="l03928"></a>03928 <span class="keywordflow">if</span> (ISMIRROR(e) || ISPLASMA(e)) {
- <a name="l03929"></a>03929 f[xx] = RandDir(ABCD(Rand8()) | PAYLOAD(c));
- <a name="l03930"></a>03930 <span class="preprocessor">#ifdef DOSOUND</span>
- <a name="l03931"></a>03931 <span class="preprocessor"></span> SoundEvent::Queue(xx, yy, width, height,
- <a name="l03932"></a>03932 ((c >> 2) & 0x0f) |
- <a name="l03933"></a>03933 ((e & 3) << 4));
- <a name="l03934"></a>03934 <span class="preprocessor">#endif</span>
- <a name="l03935"></a>03935 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!ISEMPTY(e)) ||
- <a name="l03936"></a>03936 (ISABCD(ee) && (DIR(ee) == DIR_W)) ||
- <a name="l03937"></a>03937 (ISABCD(ne) && (DIR(ne) == DIR_S)) ||
- <a name="l03938"></a>03938 (ISABCD(se) && (DIR(se) == DIR_N))) {
- <a name="l03939"></a>03939 <span class="comment">// stay the same</span>
- <a name="l03940"></a>03940 f[xx] = RandDir(c);
- <a name="l03941"></a>03941 } <span class="keywordflow">else</span> {
- <a name="l03942"></a>03942 <span class="comment">// move east</span>
- <a name="l03943"></a>03943 f[xx] = PART_EMPTY | PAYLOAD(c) | DIR(c);
- <a name="l03944"></a>03944 }
- <a name="l03945"></a>03945 <span class="keywordflow">break</span>;
- <a name="l03946"></a>03946 }
- <a name="l03947"></a>03947 }
- <a name="l03948"></a>03948 }
- <a name="l03949"></a>03949 }
- <a name="l03950"></a>03950 }
- <a name="l03951"></a>03951
- <a name="l03952"></a>03952 <span class="preprocessor">#ifdef DOSOUND</span>
- <a name="l03953"></a>03953 <span class="preprocessor"></span> SoundEvent::PlayQueue(gui);
- <a name="l03954"></a>03954 <span class="preprocessor">#endif</span>
- <a name="l03955"></a>03955 <span class="preprocessor"></span>}
- <a name="l03956"></a>03956
- <a name="l03957"></a>03957
- <a name="l03959"></a>03959 <span class="comment">// daft</span>
- <a name="l03960"></a>03960
- <a name="l03961"></a>03961 <span class="comment">// 0</span>
- <a name="l03962"></a>03962 <span class="comment">// 3 1</span>
- <a name="l03963"></a>03963 <span class="comment">// 2</span>
- <a name="l03964"></a>03964
- <a name="l03965"></a>03965 <span class="comment">// 00 0000____ : north</span>
- <a name="l03966"></a>03966 <span class="comment">// 10 0001____ : east</span>
- <a name="l03967"></a>03967 <span class="comment">// 20 0010____ : south</span>
- <a name="l03968"></a>03968 <span class="comment">// 30 0011____ : west</span>
- <a name="l03969"></a>03969 <span class="comment">// 40 0100____ : north mirror</span>
- <a name="l03970"></a>03970 <span class="comment">// 50 0101____ : east mirror</span>
- <a name="l03971"></a>03971 <span class="comment">// 60 0110____ : south mirror</span>
- <a name="l03972"></a>03972 <span class="comment">// 70 0111____ : west mirror</span>
- <a name="l03973"></a>03973 <span class="comment">// 80 1000____ : space</span>
- <a name="l03974"></a>03974 <span class="comment">// 90 0001____ : magic</span>
- <a name="l03975"></a>03975 <span class="comment">// a0 1010____ : metal</span>
- <a name="l03976"></a>03976 <span class="comment">// b0 1011____ : microphone</span>
- <a name="l03977"></a>03977 <span class="comment">// c0 1100____ : speaker</span>
- <a name="l03978"></a>03978 <span class="comment">// d0 1101____ : input</span>
- <a name="l03979"></a>03979 <span class="comment">// e0 1110____ : output</span>
- <a name="l03980"></a>03980 <span class="comment">// f0 1111____ : random</span>
- <a name="l03981"></a>03981
- <a name="l03982"></a>03982 <span class="preprocessor">#define OPCODE_MASK 0xf0</span>
- <a name="l03983"></a>03983 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE(x) ((x) & OPCODE_MASK)</span>
- <a name="l03984"></a>03984 <span class="preprocessor"></span>
- <a name="l03985"></a>03985 <span class="preprocessor">#define OPCODE_NORTH 0x00</span>
- <a name="l03986"></a>03986 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_EAST 0x10</span>
- <a name="l03987"></a>03987 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SOUTH 0x20</span>
- <a name="l03988"></a>03988 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_WEST 0x30</span>
- <a name="l03989"></a>03989 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_NORTHMIRROR 0x40</span>
- <a name="l03990"></a>03990 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_EASTMIRROR 0x50</span>
- <a name="l03991"></a>03991 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SOUTHMIRROR 0x60</span>
- <a name="l03992"></a>03992 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_WESTMIRROR 0x70</span>
- <a name="l03993"></a>03993 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SPACE 0x80</span>
- <a name="l03994"></a>03994 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_MAGIC 0x90</span>
- <a name="l03995"></a>03995 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_METAL 0xa0</span>
- <a name="l03996"></a>03996 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_MICROPHONE 0xb0</span>
- <a name="l03997"></a>03997 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_SPEAKER 0xc0</span>
- <a name="l03998"></a>03998 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_INPUT 0xd0</span>
- <a name="l03999"></a>03999 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_OUTPUT 0xe0</span>
- <a name="l04000"></a>04000 <span class="preprocessor"></span><span class="preprocessor">#define OPCODE_RANDOM 0xf0</span>
- <a name="l04001"></a>04001 <span class="preprocessor"></span>
- <a name="l04002"></a>04002 <span class="preprocessor">#define FLOW_MASK 0x70</span>
- <a name="l04003"></a>04003 <span class="preprocessor"></span><span class="preprocessor">#define FLOW(x) ((x) & FLOW_MASK)</span>
- <a name="l04004"></a>04004 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_N 0x00</span>
- <a name="l04005"></a>04005 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_E 0x10</span>
- <a name="l04006"></a>04006 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_S 0x20</span>
- <a name="l04007"></a>04007 <span class="preprocessor"></span><span class="preprocessor">#define FLOW_W 0x30</span>
- <a name="l04008"></a>04008 <span class="preprocessor"></span>
- <a name="l04009"></a>04009 <span class="preprocessor">#define IS_FLOWING(x) ((x) < OPCODE_MAGIC)</span>
- <a name="l04010"></a>04010 <span class="preprocessor"></span>
- <a name="l04011"></a>04011 <span class="preprocessor">#define OPERAND_MASK 0x0f</span>
- <a name="l04012"></a>04012 <span class="preprocessor"></span><span class="preprocessor">#define OPERAND(x) ((x) & OPERAND_MASK)</span>
- <a name="l04013"></a>04013 <span class="preprocessor"></span>
- <a name="l04014"></a>04014 <span class="keywordtype">void</span> CellEngine::n_daft()
- <a name="l04015"></a>04015 {
- <a name="l04016"></a>04016 Byte *front = frontMem;
- <a name="l04017"></a>04017 Byte *back = backMem +
- <a name="l04018"></a>04018 backBorder +
- <a name="l04019"></a>04019 (backBorder * backRowBytes);
- <a name="l04020"></a>04020 Byte *f = front, *b = back;
- <a name="l04021"></a>04021 <span class="keywordtype">long</span> xx, yy;
- <a name="l04022"></a>04022
- <a name="l04023"></a>04023 Byte nw, n, ne;
- <a name="l04024"></a>04024 Byte ww, w, c, e, ee;
- <a name="l04025"></a>04025 Byte sw, s, se;
- <a name="l04026"></a>04026 <span class="keywordflow">for</span> (yy = 0;
- <a name="l04027"></a>04027 yy < height;
- <a name="l04028"></a>04028 f += screenRowBytes,
- <a name="l04029"></a>04029 b += backRowBytes,
- <a name="l04030"></a>04030 yy++) {
- <a name="l04031"></a>04031
- <a name="l04032"></a>04032 <span class="comment">// .. __ .. .. ..</span>
- <a name="l04033"></a>04033 <span class="comment">// __ n ne .. ..</span>
- <a name="l04034"></a>04034 <span class="comment">// w c e ee ..</span>
- <a name="l04035"></a>04035 <span class="comment">// __ s se .. ..</span>
- <a name="l04036"></a>04036 <span class="comment">// .. __ .. .. ..</span>
- <a name="l04037"></a>04037
- <a name="l04038"></a>04038 n = b[-1 + -backRowBytes];
- <a name="l04039"></a>04039 ne = b[-backRowBytes];
- <a name="l04040"></a>04040 w = b[-2];
- <a name="l04041"></a>04041 c = b[-1];
- <a name="l04042"></a>04042 e = b[0];
- <a name="l04043"></a>04043 ee = b[1];
- <a name="l04044"></a>04044 s = b[-1 + backRowBytes];
- <a name="l04045"></a>04045 se = b[backRowBytes];
- <a name="l04046"></a>04046
- <a name="l04047"></a>04047 <span class="keywordflow">for</span> (xx = 0;
- <a name="l04048"></a>04048 xx < width;
- <a name="l04049"></a>04049 xx++) {
- <a name="l04050"></a>04050 <span class="comment">// .. .. NN .. ..</span>
- <a name="l04051"></a>04051 <span class="comment">// .. nw n NE ..</span>
- <a name="l04052"></a>04052 <span class="comment">// ww w c e EE</span>
- <a name="l04053"></a>04053 <span class="comment">// .. sw s SE ..</span>
- <a name="l04054"></a>04054 <span class="comment">// .. .. SS .. ..</span>
- <a name="l04055"></a>04055
- <a name="l04056"></a>04056 nw = n;
- <a name="l04057"></a>04057 n = ne;
- <a name="l04058"></a>04058 ne = b[xx + 1 + -backRowBytes];
- <a name="l04059"></a>04059 ww = w;
- <a name="l04060"></a>04060 w = c;
- <a name="l04061"></a>04061 c = e;
- <a name="l04062"></a>04062 e = ee;
- <a name="l04063"></a>04063 ee = b[xx + 2];
- <a name="l04064"></a>04064 sw = s;
- <a name="l04065"></a>04065 s = se;
- <a name="l04066"></a>04066 se = b[xx + 1 + backRowBytes];
- <a name="l04067"></a>04067
- <a name="l04068"></a>04068 <span class="keywordflow">switch</span> (OPCODE(c)) {
- <a name="l04069"></a>04069 <span class="keywordflow">case</span> OPCODE_NORTH:
- <a name="l04070"></a>04070 <span class="keywordflow">break</span>;
- <a name="l04071"></a>04071 <span class="keywordflow">case</span> OPCODE_EAST:
- <a name="l04072"></a>04072 <span class="keywordflow">break</span>;
- <a name="l04073"></a>04073 <span class="keywordflow">case</span> OPCODE_SOUTH:
- <a name="l04074"></a>04074 <span class="keywordflow">break</span>;
- <a name="l04075"></a>04075 <span class="keywordflow">case</span> OPCODE_WEST:
- <a name="l04076"></a>04076 <span class="keywordflow">break</span>;
- <a name="l04077"></a>04077 <span class="keywordflow">case</span> OPCODE_NORTHMIRROR:
- <a name="l04078"></a>04078 <span class="keywordflow">break</span>;
- <a name="l04079"></a>04079 <span class="keywordflow">case</span> OPCODE_EASTMIRROR:
- <a name="l04080"></a>04080 <span class="keywordflow">break</span>;
- <a name="l04081"></a>04081 <span class="keywordflow">case</span> OPCODE_SOUTHMIRROR:
- <a name="l04082"></a>04082 <span class="keywordflow">break</span>;
- <a name="l04083"></a>04083 <span class="keywordflow">case</span> OPCODE_WESTMIRROR:
- <a name="l04084"></a>04084 <span class="keywordflow">break</span>;
- <a name="l04085"></a>04085 <span class="keywordflow">case</span> OPCODE_SPACE:
- <a name="l04086"></a>04086 <span class="keywordflow">break</span>;
- <a name="l04087"></a>04087 <span class="keywordflow">case</span> OPCODE_MAGIC:
- <a name="l04088"></a>04088 <span class="keywordflow">break</span>;
- <a name="l04089"></a>04089 <span class="keywordflow">case</span> OPCODE_METAL:
- <a name="l04090"></a>04090 <span class="keywordflow">break</span>;
- <a name="l04091"></a>04091 <span class="keywordflow">case</span> OPCODE_MICROPHONE:
- <a name="l04092"></a>04092 <span class="keywordflow">break</span>;
- <a name="l04093"></a>04093 <span class="keywordflow">case</span> OPCODE_SPEAKER:
- <a name="l04094"></a>04094 <span class="keywordflow">break</span>;
- <a name="l04095"></a>04095 <span class="keywordflow">case</span> OPCODE_INPUT:
- <a name="l04096"></a>04096 <span class="keywordflow">break</span>;
- <a name="l04097"></a>04097 <span class="keywordflow">case</span> OPCODE_OUTPUT:
- <a name="l04098"></a>04098 <span class="keywordflow">break</span>;
- <a name="l04099"></a>04099 <span class="keywordflow">case</span> OPCODE_RANDOM:
- <a name="l04100"></a>04100 <span class="keywordflow">break</span>;
- <a name="l04101"></a>04101 }
- <a name="l04102"></a>04102 }
- <a name="l04103"></a>04103 }
- <a name="l04104"></a>04104
- <a name="l04105"></a>04105 <span class="preprocessor">#ifdef DOSOUND</span>
- <a name="l04106"></a>04106 <span class="preprocessor"></span> SoundEvent::PlayQueue(gui);
- <a name="l04107"></a>04107 <span class="preprocessor">#endif</span>
- <a name="l04108"></a>04108 <span class="preprocessor"></span>}
- <a name="l04109"></a>04109
- <a name="l04110"></a>04110
- <a name="l04111"></a>04111 <span class="keywordtype">void</span> CellEngine::n_spinsonly()
- <a name="l04112"></a>04112 {
- <a name="l04113"></a>04113
- <a name="l04114"></a>04114 <span class="preprocessor">#define SPINSONLY ( \</span>
- <a name="l04115"></a>04115 <span class="preprocessor"> ((((xx + x) ^ (yy + y) ^ phase) & 1) </span><span class="comment">/* spatio-temporal phase */</span> \
- <a name="l04116"></a>04116 ? c <span class="comment">/* stay the same if true */</span> \
- <a name="l04117"></a>04117 : (((SUM4REG(1) != 2) <span class="comment">/* can we not flip? */</span> \
- <a name="l04118"></a>04118 ? (c & 1) <span class="comment">/* no flip */</span> \
- <a name="l04119"></a>04119 : ((c ^ 1) & 1) <span class="comment">/* do flip */</span> \
- <a name="l04120"></a>04120 ) \
- <a name="l04121"></a>04121 ) \
- <a name="l04122"></a>04122 ) \
- <a name="l04123"></a>04123 )
- <a name="l04124"></a>04124
- <a name="l04125"></a>04125 CAM_MASKED_REG_LOOP(SPINSONLY)
- <a name="l04126"></a>04126 }
- <a name="l04127"></a>04127
- <a name="l04128"></a>04128
- <a name="l04129"></a>04129 <span class="keywordtype">void</span> CellEngine::n_spinsbank()
- <a name="l04130"></a>04130 {
- <a name="l04131"></a>04131 <span class="keywordtype">long</span> bonds;
- <a name="l04132"></a>04132
- <a name="l04133"></a>04133 <span class="preprocessor">#define SPINSBANK ( \</span>
- <a name="l04134"></a>04134 <span class="preprocessor"> ((((xx + x) ^ (yy + y) ^ phase) & 1) </span><span class="comment">/* spatio-temporal phase */</span> \
- <a name="l04135"></a>04135 ? c <span class="comment">/* stay the same if true */</span> \
- <a name="l04136"></a>04136 : (((c & 3) ^ <span class="comment">/* else xor center with the following */</span> \
- <a name="l04137"></a>04137 ((bonds = SUM4REG(1)), \
- <a name="l04138"></a>04138 (bonds = ((c & 1) <span class="comment">/* if center then subtract from 4 */</span> \
- <a name="l04139"></a>04139 ? (4 - bonds) \
- <a name="l04140"></a>04140 : (bonds))), \
- <a name="l04141"></a>04141 (((bonds == 0) || <span class="comment">/* case 0, 4 */</span> \
- <a name="l04142"></a>04142 (bonds == 4)) \
- <a name="l04143"></a>04143 ? 0 <span class="comment">/* xor with 0 */</span> \
- <a name="l04144"></a>04144 : ((bonds == 2) <span class="comment">/* case 2 */</span> \
- <a name="l04145"></a>04145 ? 1 <span class="comment">/* xor with 1 */</span> \
- <a name="l04146"></a>04146 : ((bonds == 1) <span class="comment">/* case 1 */</span> \
- <a name="l04147"></a>04147 ? ((c & 2) <span class="comment">/* can we get from bank? */</span> \
- <a name="l04148"></a>04148 ? 0 <span class="comment">/* xor with 0 */</span> \
- <a name="l04149"></a>04149 : 3 <span class="comment">/* xor with 3 */</span> \
- <a name="l04150"></a>04150 ) \
- <a name="l04151"></a>04151 : ((c & 2) <span class="comment">/* can we put to bank? */</span> \
- <a name="l04152"></a>04152 ? 3 <span class="comment">/* xor with 3 */</span> \
- <a name="l04153"></a>04153 : 0 <span class="comment">/* xor with 0 */</span> \
- <a name="l04154"></a>04154 ) \
- <a name="l04155"></a>04155 ) \
- <a name="l04156"></a>04156 ) \
- <a name="l04157"></a>04157 ) \
- <a name="l04158"></a>04158 ) \
- <a name="l04159"></a>04159 ) \
- <a name="l04160"></a>04160 ) \
- <a name="l04161"></a>04161 ) \
- <a name="l04162"></a>04162 )
- <a name="l04163"></a>04163
- <a name="l04164"></a>04164 CAM_MASKED_REG_LOOP(SPINSBANK)
- <a name="l04165"></a>04165 }
- <a name="l04166"></a>04166
- <a name="l04167"></a>04167
- <a name="l04168"></a>04168
- <a name="l04169"></a>04169 <span class="keywordtype">void</span> CellEngine::n_spinsheat()
- <a name="l04170"></a>04170 {
- <a name="l04171"></a>04171 <span class="keywordtype">long</span> bonds;
- <a name="l04172"></a>04172 <span class="keywordtype">long</span> heat;
- <a name="l04173"></a>04173 <span class="keywordtype">long</span> error = 0;
- <a name="l04174"></a>04174
- <a name="l04175"></a>04175 <span class="preprocessor">#define SPINSHEAT ( \</span>
- <a name="l04176"></a>04176 <span class="preprocessor"> (error += SUM8REG(0x7f) + frob), \</span>
- <a name="l04177"></a>04177 <span class="preprocessor"> (error = ((error < 0) \</span>
- <a name="l04178"></a>04178 <span class="preprocessor"> ? 0 \</span>
- <a name="l04179"></a>04179 <span class="preprocessor"> : ((error > (0x7f << 3)) \</span>
- <a name="l04180"></a>04180 <span class="preprocessor"> ? (0x7f << 3) \</span>
- <a name="l04181"></a>04181 <span class="preprocessor"> : error))), \</span>
- <a name="l04182"></a>04182 <span class="preprocessor"> (c = (((error >> 3) & 0x7f) | (c & 0x80))), \</span>
- <a name="l04183"></a>04183 <span class="preprocessor"> (error &= 0x07), \</span>
- <a name="l04184"></a>04184 <span class="preprocessor"> (unsigned char)((((xx + x) ^ (yy + y) ^ phase) & 1) </span><span class="comment">/* spatio-temporal phase */</span> \
- <a name="l04185"></a>04185 ? c <span class="comment">/* stay the same if true */</span> \
- <a name="l04186"></a>04186 : ((bonds = (SUM4REG(0x80) >> 7)), \
- <a name="l04187"></a>04187 (bonds = ((c & 0x80) <span class="comment">/* if center then subtract from 4 */</span> \
- <a name="l04188"></a>04188 ? (4 - bonds) \
- <a name="l04189"></a>04189 : (bonds))), \
- <a name="l04190"></a>04190 (heat = (c & 0x7f)), \
- <a name="l04191"></a>04191 (((bonds == 0) || <span class="comment">/* case 0, 4 */</span> \
- <a name="l04192"></a>04192 (bonds == 4)) \
- <a name="l04193"></a>04193 ? c <span class="comment">/* xor with 0 */</span> \
- <a name="l04194"></a>04194 : ((bonds == 2) <span class="comment">/* case 2 */</span> \
- <a name="l04195"></a>04195 ? (c ^ 0x80) <span class="comment">/* xor with 1 */</span> \
- <a name="l04196"></a>04196 : ((bonds == 1) <span class="comment">/* case 1 */</span> \
- <a name="l04197"></a>04197 ? (((heat >= low) && \
- <a name="l04198"></a>04198 (heat >= inflation)) <span class="comment">/* can we get from bank? */</span> \
- <a name="l04199"></a>04199 ? c <span class="comment">/* xor with 0 */</span> \
- <a name="l04200"></a>04200 : ((c ^ 0x80) - inflation) <span class="comment">/* flip and debit */</span> \
- <a name="l04201"></a>04201 ) \
- <a name="l04202"></a>04202 : (((heat <= high) && \
- <a name="l04203"></a>04203 (heat < 0x80 - inflation)) <span class="comment">/* can we put to bank? */</span> \
- <a name="l04204"></a>04204 ? ((c ^ 0x80) + inflation) <span class="comment">/* flip and credit */</span> \
- <a name="l04205"></a>04205 : c <span class="comment">/* xor with 0 */</span> \
- <a name="l04206"></a>04206 ) \
- <a name="l04207"></a>04207 ) \
- <a name="l04208"></a>04208 ) \
- <a name="l04209"></a>04209 ) \
- <a name="l04210"></a>04210 ) \
- <a name="l04211"></a>04211 ) \
- <a name="l04212"></a>04212 )
- <a name="l04213"></a>04213
- <a name="l04214"></a>04214 CAM_MASKED_REG_LOOP(SPINSHEAT)
- <a name="l04215"></a>04215 }
- <a name="l04216"></a>04216
- <a name="l04217"></a>04217
- <a name="l04218"></a>04218 <span class="keywordtype">void</span> CellEngine::n_spinglass()
- <a name="l04219"></a>04219 {
- <a name="l04220"></a>04220
- <a name="l04221"></a>04221 <span class="preprocessor">#define SPINGLASS ( \</span>
- <a name="l04222"></a>04222 <span class="preprocessor"> ((((xx + x) ^ (yy + y) ^ phase) & 1) </span><span class="comment">/* spatio-temporal phase */</span> \
- <a name="l04223"></a>04223 ? c <span class="comment">/* stay the same if true */</span> \
- <a name="l04224"></a>04224 : (((((((n >> 7) ^ (c >> 0)) & 1) + \
- <a name="l04225"></a>04225 (((w >> 7) ^ (c >> 1)) & 1) + \
- <a name="l04226"></a>04226 (((s >> 7) ^ (s >> 0)) & 1) + \
- <a name="l04227"></a>04227 (((e >> 7) ^ (e >> 1)) & 1)) != 2) \
- <a name="l04228"></a>04228 ? (c & 1) <span class="comment">/* stay the same if energy != 2 */</span> \
- <a name="l04229"></a>04229 : ((c & 1) ^ 0x80) <span class="comment">/* flip if energy == 2 */</span> \
- <a name="l04230"></a>04230 ) \
- <a name="l04231"></a>04231 ) \
- <a name="l04232"></a>04232 ) \
- <a name="l04233"></a>04233 )
- <a name="l04234"></a>04234
- <a name="l04235"></a>04235 CAM_MASKED_REG_LOOP(SPINGLASS)
- <a name="l04236"></a>04236 }
- <a name="l04237"></a>04237
- <a name="l04238"></a>04238
- <a name="l04239"></a>04239 <span class="keyword">static</span> Byte GlassBondsTable[16] = {
- <a name="l04240"></a>04240 0x00, <span class="comment">// 00 -\ 00</span>
- <a name="l04241"></a>04241 <span class="comment">// 00 -/ 00</span>
- <a name="l04242"></a>04242
- <a name="l04243"></a>04243 0x01, <span class="comment">// 00 -\ 00</span>
- <a name="l04244"></a>04244 <span class="comment">// 10 -/ 10</span>
- <a name="l04245"></a>04245
- <a name="l04246"></a>04246 0x02, <span class="comment">// 10 -\ 10</span>
- <a name="l04247"></a>04247 <span class="comment">// 00 -/ 00</span>
- <a name="l04248"></a>04248
- <a name="l04249"></a>04249 0x0c, <span class="comment">// 10 -\ 01</span>
- <a name="l04250"></a>04250 <span class="comment">// 10 -/ 01</span>
- <a name="l04251"></a>04251
- <a name="l04252"></a>04252 0x04, <span class="comment">// 00 -\ 00</span>
- <a name="l04253"></a>04253 <span class="comment">// 01 -/ 01</span>
- <a name="l04254"></a>04254
- <a name="l04255"></a>04255 0x0a, <span class="comment">// 00 -\ 11</span>
- <a name="l04256"></a>04256 <span class="comment">// 11 -/ 00</span>
- <a name="l04257"></a>04257
- <a name="l04258"></a>04258 0x09, <span class="comment">// 10 -\ 01</span>
- <a name="l04259"></a>04259 <span class="comment">// 01 -/ 10</span>
- <a name="l04260"></a>04260
- <a name="l04261"></a>04261 0x07, <span class="comment">// 10 -\ 10</span>
- <a name="l04262"></a>04262 <span class="comment">// 11 -/ 11</span>
- <a name="l04263"></a>04263
- <a name="l04264"></a>04264 0x08, <span class="comment">// 01 -\ 01</span>
- <a name="l04265"></a>04265 <span class="comment">// 00 -/ 00</span>
- <a name="l04266"></a>04266
- <a name="l04267"></a>04267 0x06, <span class="comment">// 01 -\ 10</span>
- <a name="l04268"></a>04268 <span class="comment">// 10 -/ 01</span>
- <a name="l04269"></a>04269
- <a name="l04270"></a>04270 0x05, <span class="comment">// 11 -\ 00</span>
- <a name="l04271"></a>04271 <span class="comment">// 00 -/ 11</span>
- <a name="l04272"></a>04272
- <a name="l04273"></a>04273 0x0b, <span class="comment">// 11 -\ 11</span>
- <a name="l04274"></a>04274 <span class="comment">// 10 -/ 10</span>
- <a name="l04275"></a>04275
- <a name="l04276"></a>04276 0x03, <span class="comment">// 01 -\ 10</span>
- <a name="l04277"></a>04277 <span class="comment">// 01 -/ 10</span>
- <a name="l04278"></a>04278
- <a name="l04279"></a>04279 0x0d, <span class="comment">// 01 -\ 01</span>
- <a name="l04280"></a>04280 <span class="comment">// 11 -/ 11</span>
- <a name="l04281"></a>04281
- <a name="l04282"></a>04282 0x0e, <span class="comment">// 11 -\ 11</span>
- <a name="l04283"></a>04283 <span class="comment">// 01 -/ 01</span>
- <a name="l04284"></a>04284
- <a name="l04285"></a>04285 0x0f <span class="comment">// 11 -\ 11</span>
- <a name="l04286"></a>04286 <span class="comment">// 11 -/ 11</span>
- <a name="l04287"></a>04287
- <a name="l04288"></a>04288 };
- <a name="l04289"></a>04289
- <a name="l04290"></a>04290
- <a name="l04291"></a>04291 <span class="keywordtype">void</span> CellEngine::n_glassbonds()
- <a name="l04292"></a>04292 {
- <a name="l04293"></a>04293
- <a name="l04294"></a>04294 <span class="comment">// 0 1 2 3</span>
- <a name="l04295"></a>04295 <span class="comment">// c cw ccw opp</span>
- <a name="l04296"></a>04296 <span class="comment">// 0x1 0x2 0x4 0x8</span>
- <a name="l04297"></a>04297
- <a name="l04298"></a>04298 <span class="preprocessor">#define MARG \</span>
- <a name="l04299"></a>04299 <span class="preprocessor"> (phase \</span>
- <a name="l04300"></a>04300 <span class="preprocessor"> ? (((xx + x) & 1) \</span>
- <a name="l04301"></a>04301 <span class="preprocessor"> ? (((yy + y) & 1) \</span>
- <a name="l04302"></a>04302 <span class="preprocessor"> ? ( </span><span class="comment">/* p1 x1 y1 = c e s se */</span> \
- <a name="l04303"></a>04303 ((c & 0x80) >> 7) | \
- <a name="l04304"></a>04304 ((e & 0x80) >> 6) | \
- <a name="l04305"></a>04305 ((s & 0x80) >> 5) | \
- <a name="l04306"></a>04306 ((se & 0x80) >> 4) \
- <a name="l04307"></a>04307 ) \
- <a name="l04308"></a>04308 : ( <span class="comment">/* p1 x1 y0 = c n e ne */</span> \
- <a name="l04309"></a>04309 ((c & 0x80) >> 7) | \
- <a name="l04310"></a>04310 ((n & 0x80) >> 6) | \
- <a name="l04311"></a>04311 ((e & 0x80)>> 5) | \
- <a name="l04312"></a>04312 ((ne & 0x80) >> 4) \
- <a name="l04313"></a>04313 ) \
- <a name="l04314"></a>04314 ) \
- <a name="l04315"></a>04315 : (((yy + y) & 1) \
- <a name="l04316"></a>04316 ? ( <span class="comment">/* p1 x0 y1 = c s w sw */</span> \
- <a name="l04317"></a>04317 ((c & 0x80) >> 7) | \
- <a name="l04318"></a>04318 ((s & 0x80) >> 6) | \
- <a name="l04319"></a>04319 ((w & 0x80) >> 5) | \
- <a name="l04320"></a>04320 ((sw & 0x80) >> 4) \
- <a name="l04321"></a>04321 ) \
- <a name="l04322"></a>04322 : ( <span class="comment">/* p1 x0 y0 = c w n nw */</span> \
- <a name="l04323"></a>04323 ((c & 0x80) >> 7) | \
- <a name="l04324"></a>04324 ((w & 0x80) >> 6) | \
- <a name="l04325"></a>04325 ((n & 0x80) >> 5) | \
- <a name="l04326"></a>04326 ((nw & 0x80) >> 4) \
- <a name="l04327"></a>04327 ) \
- <a name="l04328"></a>04328 ) \
- <a name="l04329"></a>04329 ) \
- <a name="l04330"></a>04330 : (((xx + x) & 1) \
- <a name="l04331"></a>04331 ? (((yy + y) & 1) \
- <a name="l04332"></a>04332 ? ( <span class="comment">/* p0 x1 y1 = c w n nw */</span> \
- <a name="l04333"></a>04333 ((c & 0x80) >> 7) | \
- <a name="l04334"></a>04334 ((w & 0x80) >> 6) | \
- <a name="l04335"></a>04335 ((n & 0x80) >> 5) | \
- <a name="l04336"></a>04336 ((nw & 0x80) >> 4) \
- <a name="l04337"></a>04337 ) \
- <a name="l04338"></a>04338 : ( <span class="comment">/* p0 x1 y0 = c s w sw */</span> \
- <a name="l04339"></a>04339 ((c & 0x80) >> 7) | \
- <a name="l04340"></a>04340 ((s & 0x80) >> 6) | \
- <a name="l04341"></a>04341 ((w & 0x80) >> 5) | \
- <a name="l04342"></a>04342 ((sw & 0x80) >> 4) \
- <a name="l04343"></a>04343 ) \
- <a name="l04344"></a>04344 ) \
- <a name="l04345"></a>04345 : (((yy + y) & 1) \
- <a name="l04346"></a>04346 ? ( <span class="comment">/* p0 x0 y1 = c n e ne */</span> \
- <a name="l04347"></a>04347 ((c & 0x80) >> 7) | \
- <a name="l04348"></a>04348 ((n & 0x80) >> 6) | \
- <a name="l04349"></a>04349 ((e & 0x80) >> 5) | \
- <a name="l04350"></a>04350 ((ne & 0x80) >> 4) \
- <a name="l04351"></a>04351 ) \
- <a name="l04352"></a>04352 : ( <span class="comment">/* p0 x0 y0 = c e s se */</span> \
- <a name="l04353"></a>04353 ((c & 0x80) >> 7) | \
- <a name="l04354"></a>04354 ((e & 0x80) >> 6) | \
- <a name="l04355"></a>04355 ((s & 0x80) >> 5) | \
- <a name="l04356"></a>04356 ((se & 0x80) >> 4) \
- <a name="l04357"></a>04357 ) \
- <a name="l04358"></a>04358 ) \
- <a name="l04359"></a>04359 ) \
- <a name="l04360"></a>04360 )
- <a name="l04361"></a>04361
- <a name="l04362"></a>04362 <span class="preprocessor">#define GLASSBONDS ( \</span>
- <a name="l04363"></a>04363 <span class="preprocessor"> ((c </span><span class="comment">/* >> 1*/</span> ) & 0x7f) | \
- <a name="l04364"></a>04364 ((GlassBondsTable[MARG] & 1) << 7) \
- <a name="l04365"></a>04365 )
- <a name="l04366"></a>04366
- <a name="l04367"></a>04367 CAM_MASKED_REG_LOOP(GLASSBONDS)
- <a name="l04368"></a>04368
- <a name="l04369"></a>04369 }
- <a name="l04370"></a>04370
- <a name="l04371"></a>04371
- <a name="l04372"></a>04372 <span class="comment">// 0 1 2 3</span>
- <a name="l04373"></a>04373 <span class="comment">// c cw ccw opp</span>
- <a name="l04374"></a>04374 <span class="comment">// 0x1 0x2 0x4 0x8</span>
- <a name="l04375"></a>04375
- <a name="l04376"></a>04376 <span class="comment">// cw opp 2 8</span>
- <a name="l04377"></a>04377 <span class="comment">// c ccw 1 4</span>
- <a name="l04378"></a>04378
- <a name="l04379"></a>04379 <span class="keyword">static</span> Byte GlassHeatTable[16] = {
- <a name="l04380"></a>04380
- <a name="l04381"></a>04381 0x00, <span class="comment">// 00 -\ 00</span>
- <a name="l04382"></a>04382 <span class="comment">// 00 -/ 00</span>
- <a name="l04383"></a>04383
- <a name="l04384"></a>04384 0x03, <span class="comment">// 00 -\ 00 00</span>
- <a name="l04385"></a>04385 <span class="comment">// 10 -/ 10 ? 00</span>
- <a name="l04386"></a>04386
- <a name="l04387"></a>04387 0x00, <span class="comment">// 10 -\ 10</span>
- <a name="l04388"></a>04388 <span class="comment">// 00 -/ 00</span>
- <a name="l04389"></a>04389
- <a name="l04390"></a>04390 0x00, <span class="comment">// 10 -\ 01</span>
- <a name="l04391"></a>04391 <span class="comment">// 10 -/ 01</span>
- <a name="l04392"></a>04392
- <a name="l04393"></a>04393 0x00, <span class="comment">// 00 -\ 00</span>
- <a name="l04394"></a>04394 <span class="comment">// 01 -/ 01</span>
- <a name="l04395"></a>04395
- <a name="l04396"></a>04396 0x00, <span class="comment">// 00 -\ 11</span>
- <a name="l04397"></a>04397 <span class="comment">// 11 -/ 00</span>
- <a name="l04398"></a>04398
- <a name="l04399"></a>04399 0x01, <span class="comment">// 10 -\ 01</span>
- <a name="l04400"></a>04400 <span class="comment">// 01 -/ 10</span>
- <a name="l04401"></a>04401
- <a name="l04402"></a>04402 0x01, <span class="comment">// 10 -\ 10</span>
- <a name="l04403"></a>04403 <span class="comment">// 11 -/ 11</span>
- <a name="l04404"></a>04404
- <a name="l04405"></a>04405 0x00, <span class="comment">// 01 -\ 01</span>
- <a name="l04406"></a>04406 <span class="comment">// 00 -/ 00</span>
- <a name="l04407"></a>04407
- <a name="l04408"></a>04408 0x00, <span class="comment">// 01 -\ 10</span>
- <a name="l04409"></a>04409 <span class="comment">// 10 -/ 01</span>
- <a name="l04410"></a>04410
- <a name="l04411"></a>04411 0x01, <span class="comment">// 11 -\ 00</span>
- <a name="l04412"></a>04412 <span class="comment">// 00 -/ 11</span>
- <a name="l04413"></a>04413
- <a name="l04414"></a>04414 0x01, <span class="comment">// 11 -\ 11</span>
- <a name="l04415"></a>04415 <span class="comment">// 10 -/ 10</span>
- <a name="l04416"></a>04416
- <a name="l04417"></a>04417 0x01, <span class="comment">// 01 -\ 10</span>
- <a name="l04418"></a>04418 <span class="comment">// 01 -/ 10</span>
- <a name="l04419"></a>04419
- <a name="l04420"></a>04420 0x01, <span class="comment">// 01 -\ 01</span>
- <a name="l04421"></a>04421 <span class="comment">// 11 -/ 11</span>
- <a name="l04422"></a>04422
- <a name="l04423"></a>04423 0x02, <span class="comment">// 11 -\ 11 11</span>
- <a name="l04424"></a>04424 <span class="comment">// 01 -/ 01 ? 11</span>
- <a name="l04425"></a>04425
- <a name="l04426"></a>04426 0x01 <span class="comment">// 11 -\ 11</span>
- <a name="l04427"></a>04427 <span class="comment">// 11 -/ 11</span>
- <a name="l04428"></a>04428
- <a name="l04429"></a>04429 };
- <a name="l04430"></a>04430
- <a name="l04431"></a>04431
- <a name="l04432"></a>04432 <span class="keywordtype">void</span> CellEngine::n_glassheat()
- <a name="l04433"></a>04433 {
- <a name="l04434"></a>04434 <span class="keywordtype">int</span> code;
- <a name="l04435"></a>04435 <span class="keywordtype">int</span> error = 0;
- <a name="l04436"></a>04436
- <a name="l04437"></a>04437 <span class="preprocessor">#define GLASSHEAT ( \</span>
- <a name="l04438"></a>04438 <span class="preprocessor"> (code = GlassHeatTable[MARG]), \</span>
- <a name="l04439"></a>04439 <span class="preprocessor"> (error += SUM8REG(0x7f) + frob), \</span>
- <a name="l04440"></a>04440 <span class="preprocessor"> (error = ((error < 0) \</span>
- <a name="l04441"></a>04441 <span class="preprocessor"> ? 0 \</span>
- <a name="l04442"></a>04442 <span class="preprocessor"> : ((error > (0x7f << 3)) \</span>
- <a name="l04443"></a>04443 <span class="preprocessor"> ? (0x7f << 3) \</span>
- <a name="l04444"></a>04444 <span class="preprocessor"> : error))), \</span>
- <a name="l04445"></a>04445 <span class="preprocessor"> ((code == 2) \</span>
- <a name="l04446"></a>04446 <span class="preprocessor"> ? (((error >= low) && \</span>
- <a name="l04447"></a>04447 <span class="preprocessor"> (error >= inflation)) </span><span class="comment">/* can we get from bank? */</span> \
- <a name="l04448"></a>04448 ? (error -= inflation, code ^= 1) <span class="comment">/* flip and debit */</span> \
- <a name="l04449"></a>04449 : 0 \
- <a name="l04450"></a>04450 ) \
- <a name="l04451"></a>04451 : ((code == 3) \
- <a name="l04452"></a>04452 ? (((error <= high) && \
- <a name="l04453"></a>04453 (error < (0x80 << 3) - inflation)) <span class="comment">/* can we put to bank? */</span> \
- <a name="l04454"></a>04454 ? (error += inflation, code ^= 1) <span class="comment">/* flip and credit */</span> \
- <a name="l04455"></a>04455 : 0 \
- <a name="l04456"></a>04456 ) \
- <a name="l04457"></a>04457 : 0 \
- <a name="l04458"></a>04458 ) \
- <a name="l04459"></a>04459 ), \
- <a name="l04460"></a>04460 (code = ((code << 7) & 0x80) | \
- <a name="l04461"></a>04461 ((error >> 3) & 0x7f)), \
- <a name="l04462"></a>04462 (error &= 0x07), \
- <a name="l04463"></a>04463 code \
- <a name="l04464"></a>04464 )
- <a name="l04465"></a>04465
- <a name="l04466"></a>04466 CAM_MASKED_REG_LOOP(GLASSHEAT)
- <a name="l04467"></a>04467
- <a name="l04468"></a>04468 }
- <a name="l04469"></a>04469
- <a name="l04470"></a>04470
- <a name="l04471"></a>04471 <span class="preprocessor">#if 0</span>
- <a name="l04472"></a>04472 <span class="preprocessor"></span>
- <a name="l04473"></a>04473 FUNCTION JCRule(Oldstate,NW,N,NE,W,Self,E,SW,S,SE:integer):integer;
- <a name="l04474"></a>04474 CONST
- <a name="l04475"></a>04475 RN=127; L=2; U=2; K=2; Y=2;
- <a name="l04476"></a>04476 VAR EightSum,NewState:integer;
- <a name="l04477"></a>04477 BEGIN {Function}
- <a name="l04478"></a>04478 EightSum:=NW+N+NE+E+SE+S+SW+W; ]
- <a name="l04479"></a>04479 NewState:=0;
- <a name="l04480"></a>04480 IF (OldState=0) AND
- <a name="l04481"></a>04481 (L<=EightSum) AND (EightSum<=U) THEN
- <a name="l04482"></a>04482 NewState:=1;
- <a name="l04483"></a>04483 IF (OldState=1) THEN
- <a name="l04484"></a>04484 IF (K<=EightSum) AND (EightSum<=Y) THEN
- <a name="l04485"></a>04485 NewState:=1
- <a name="l04486"></a>04486 ELSE
- <a name="l04487"></a>04487 NewState:=2;
- <a name="l04488"></a>04488 IF NOT(odd(OldState)) AND
- <a name="l04489"></a>04489 (0<OldState)AND(OldState<2*RN) THEN
- <a name="l04490"></a>04490 NewState:=OldState+2;
- <a name="l04491"></a>04491 JCRule:=NewState
- <a name="l04492"></a>04492 END; {Function}
- <a name="l04493"></a>04493
- <a name="l04494"></a>04494 <span class="preprocessor">#endif</span>
- <a name="l04495"></a>04495 <span class="preprocessor"></span>
- <a name="l04496"></a>04496
- <a name="l04497"></a>04497 <span class="keywordtype">void</span> CellEngine::n_faders()
- <a name="l04498"></a>04498 {
- <a name="l04499"></a>04499 <span class="keywordtype">long</span> sum;
- <a name="l04500"></a>04500 <span class="keywordtype">long</span> state;
- <a name="l04501"></a>04501
- <a name="l04502"></a>04502 <span class="preprocessor">#define FADERS ( \</span>
- <a name="l04503"></a>04503 <span class="preprocessor"> (sum = SUM8REG(1)), \</span>
- <a name="l04504"></a>04504 <span class="preprocessor"> ( ((c == 0) && (sum == 2)) \</span>
- <a name="l04505"></a>04505 <span class="preprocessor"> ? (state = 1) \</span>
- <a name="l04506"></a>04506 <span class="preprocessor"> : (state = 0)), \</span>
- <a name="l04507"></a>04507 <span class="preprocessor"> ( (c == 1) \</span>
- <a name="l04508"></a>04508 <span class="preprocessor"> ? ((sum == 2) \</span>
- <a name="l04509"></a>04509 <span class="preprocessor"> ? (state = 1) \</span>
- <a name="l04510"></a>04510 <span class="preprocessor"> : (state = 2)) \</span>
- <a name="l04511"></a>04511 <span class="preprocessor"> : 0), \</span>
- <a name="l04512"></a>04512 <span class="preprocessor"> ( (((c & 1) == 0) && \</span>
- <a name="l04513"></a>04513 <span class="preprocessor"> (0 < c) && \</span>
- <a name="l04514"></a>04514 <span class="preprocessor"> (c < (unsigned char)(frob & 0xff))) \</span>
- <a name="l04515"></a>04515 <span class="preprocessor"> ? (state = c + 2) \</span>
- <a name="l04516"></a>04516 <span class="preprocessor"> : 0), \</span>
- <a name="l04517"></a>04517 <span class="preprocessor"> (unsigned char)state)</span>
- <a name="l04518"></a>04518 <span class="preprocessor"></span>
- <a name="l04519"></a>04519 CAM_MASKED_REG_LOOP(FADERS)
- <a name="l04520"></a>04520 }
- <a name="l04521"></a>04521
- <a name="l04522"></a>04522
- <a name="l04523"></a>04523 <span class="comment">// This is a wavy version of flaming marble.</span>
- <a name="l04524"></a>04524 <span class="comment">// We define four different convolution kernels, that diffuse</span>
- <a name="l04525"></a>04525 <span class="comment">// the heat in different directions (nw, n, ne, and side to side),</span>
- <a name="l04526"></a>04526 <span class="comment">// and select between then based on the phase (0 to 3).</span>
- <a name="l04527"></a>04527 <span class="comment">// What defines the phase?</span>
- <a name="l04528"></a>04528 <span class="comment">// There are several interesting defintions.</span>
- <a name="l04529"></a>04529 <span class="comment">// Generally, we don't want to change phase too often, and we</span>
- <a name="l04530"></a>04530 <span class="comment">// want to do it in interesting patterns so the heat flows nicely.</span>
- <a name="l04531"></a>04531 <span class="comment">// The right shifting lowers the frequency of the phase changes.</span>
- <a name="l04532"></a>04532 <span class="comment">// The anding with 3 is because there are only 4 phases.</span>
- <a name="l04533"></a>04533 <span class="comment">// (y >> 2) & 3:</span>
- <a name="l04534"></a>04534 <span class="comment">// Vertically driven phase.</span>
- <a name="l04535"></a>04535 <span class="comment">// Horizontally synchronized vertical waves.</span>
- <a name="l04536"></a>04536 <span class="comment">// ((x + y) >> 2) & 3:</span>
- <a name="l04537"></a>04537 <span class="comment">// Vertically and horizontally driven phase.</span>
- <a name="l04538"></a>04538 <span class="comment">// Sheared diamond synchronized waves.</span>
- <a name="l04539"></a>04539 <span class="comment">// ((x + y + c) >> 2) & 3:</span>
- <a name="l04540"></a>04540 <span class="comment">// Vertically, horizontally, and smoothly varying</span>
- <a name="l04541"></a>04541 <span class="comment">// temperature driven phase.</span>
- <a name="l04542"></a>04542 <span class="comment">// Diamonds smoothly shifting phase with the heat contours.</span>
- <a name="l04543"></a>04543 <span class="comment">// Interesting feedback driving heat flow direction by heat.</span>
- <a name="l04544"></a>04544
- <a name="l04545"></a>04545 <span class="comment">// New interactive harble using joystick hubba.</span>
- <a name="l04546"></a>04546
- <a name="l04547"></a>04547 <span class="preprocessor">#define HARBLE(nw, n, ne, w, c, e, sw, s, se) \</span>
- <a name="l04548"></a>04548 <span class="preprocessor"> switch ((((xx - yy) >> 3) + (((xx - yy * 2 - 1) ^ (xx * 2 + yy + 1)) >> 2) + ((c + (hubba >> 4)) >> 2)) & 7) { \</span>
- <a name="l04549"></a>04549 <span class="preprocessor"> case 0: \</span>
- <a name="l04550"></a>04550 <span class="preprocessor"> error += (frob + (c << 3) + w + sw + s + s + s + s + se + e); \</span>
- <a name="l04551"></a>04551 <span class="preprocessor"> break; \</span>
- <a name="l04552"></a>04552 <span class="preprocessor"> case 1: \</span>
- <a name="l04553"></a>04553 <span class="preprocessor"> error += (frob + (c << 3) + nw + w + sw + sw + sw + sw + s + se); \</span>
- <a name="l04554"></a>04554 <span class="preprocessor"> break; \</span>
- <a name="l04555"></a>04555 <span class="preprocessor"> case 2: \</span>
- <a name="l04556"></a>04556 <span class="preprocessor"> error += (frob + (c << 3) + n + nw + w + w + w + w + sw + s); \</span>
- <a name="l04557"></a>04557 <span class="preprocessor"> break; \</span>
- <a name="l04558"></a>04558 <span class="preprocessor"> case 3: \</span>
- <a name="l04559"></a>04559 <span class="preprocessor"> error += (frob + (c << 3) + ne + n + nw + nw + nw + nw + w + sw); \</span>
- <a name="l04560"></a>04560 <span class="preprocessor"> break; \</span>
- <a name="l04561"></a>04561 <span class="preprocessor"> case 4: \</span>
- <a name="l04562"></a>04562 <span class="preprocessor"> error += (frob + (c << 3) + e + ne + n + n + n + n + nw + w); \</span>
- <a name="l04563"></a>04563 <span class="preprocessor"> break; \</span>
- <a name="l04564"></a>04564 <span class="preprocessor"> case 5: \</span>
- <a name="l04565"></a>04565 <span class="preprocessor"> error += (frob + (c << 3) + se + e + ne + ne + ne + ne + n + nw); \</span>
- <a name="l04566"></a>04566 <span class="preprocessor"> break; \</span>
- <a name="l04567"></a>04567 <span class="preprocessor"> case 6: \</span>
- <a name="l04568"></a>04568 <span class="preprocessor"> error += (frob + (c << 3) + s + se + e + e + e + e + ne + n); \</span>
- <a name="l04569"></a>04569 <span class="preprocessor"> break; \</span>
- <a name="l04570"></a>04570 <span class="preprocessor"> case 7: \</span>
- <a name="l04571"></a>04571 <span class="preprocessor"> error += (frob + (c << 3) + sw + s + se + se + se + se + e + ne); \</span>
- <a name="l04572"></a>04572 <span class="preprocessor"> break; \</span>
- <a name="l04573"></a>04573 <span class="preprocessor"> } \</span>
- <a name="l04574"></a>04574 <span class="preprocessor"> result = error >> 4; \</span>
- <a name="l04575"></a>04575 <span class="preprocessor"> error &= 0x0f;</span>
- <a name="l04576"></a>04576 <span class="preprocessor"></span>
- <a name="l04577"></a>04577 <span class="keywordtype">void</span> CellEngine::n_harble()
- <a name="l04578"></a>04578 {
- <a name="l04579"></a>04579 QUAD *front = (QUAD *)frontMem;
- <a name="l04580"></a>04580 QUAD *back = (QUAD *)(backMem +
- <a name="l04581"></a>04581 (backBorder - 1) +
- <a name="l04582"></a>04582 ((backBorder - 1) * backRowBytes));
- <a name="l04583"></a>04583 <span class="keywordtype">long</span> backline = backRowBytes >> 2;
- <a name="l04584"></a>04584 <span class="keywordtype">long</span> backstride = backline - ((width >> 2) + 1);
- <a name="l04585"></a>04585 <span class="keywordtype">long</span> frontstride = (screenRowBytes >> 2) - (width >> 2);
- <a name="l04586"></a>04586 <span class="keywordtype">long</span> xsteps = width >> 2;
- <a name="l04587"></a>04587 <span class="keywordtype">long</span> yy;
- <a name="l04588"></a>04588
- <a name="l04589"></a>04589 total = 0;
- <a name="l04590"></a>04590
- <a name="l04591"></a>04591 <span class="keywordflow">for</span> (yy = height;
- <a name="l04592"></a>04592 yy > 0;
- <a name="l04593"></a>04593 back += backstride,
- <a name="l04594"></a>04594 front += frontstride,
- <a name="l04595"></a>04595 yy--) {
- <a name="l04596"></a>04596 <span class="keyword">register</span> QUAD b1, b2;
- <a name="l04597"></a>04597 <span class="keyword">register</span> QUAD c1, c2;
- <a name="l04598"></a>04598 <span class="keyword">register</span> QUAD d1, d2;
- <a name="l04599"></a>04599 <span class="keywordtype">long</span> error = 0;
- <a name="l04600"></a>04600 <span class="keywordtype">long</span> xx;
- <a name="l04601"></a>04601
- <a name="l04602"></a>04602 b2 = back[0];
- <a name="l04603"></a>04603 c2 = back[backline];
- <a name="l04604"></a>04604 d2 = back[backline << 1];
- <a name="l04605"></a>04605 back++;
- <a name="l04606"></a>04606
- <a name="l04607"></a>04607 <span class="keywordflow">for</span> (xx = xsteps;
- <a name="l04608"></a>04608 xx > 0;
- <a name="l04609"></a>04609 xx--) {
- <a name="l04610"></a>04610 <span class="keywordtype">long</span> result, cells = 0;
- <a name="l04611"></a>04611
- <a name="l04612"></a>04612 b1 = b2; b2 = back[0];
- <a name="l04613"></a>04613 c1 = c2; c2 = back[backline];
- <a name="l04614"></a>04614 d1 = d2; d2 = back[backline << 1];
- <a name="l04615"></a>04615 back++;
- <a name="l04616"></a>04616
- <a name="l04617"></a>04617 HARBLE( BYTE0(b1), BYTE1(b1), BYTE2(b1),
- <a name="l04618"></a>04618 BYTE0(c1), BYTE1(c1), BYTE2(c1),
- <a name="l04619"></a>04619 BYTE0(d1), BYTE1(d1), BYTE2(d1) );
- <a name="l04620"></a>04620 total += result;
- <a name="l04621"></a>04621 SETBYTE0(cells, result);
- <a name="l04622"></a>04622
- <a name="l04623"></a>04623 HARBLE( BYTE1(b1), BYTE2(b1), BYTE3(b1),
- <a name="l04624"></a>04624 BYTE1(c1), BYTE2(c1), BYTE3(c1),
- <a name="l04625"></a>04625 BYTE1(d1), BYTE2(d1), BYTE3(d1) );
- <a name="l04626"></a>04626 total += result;
- <a name="l04627"></a>04627 SETBYTE1(cells, result);
- <a name="l04628"></a>04628
- <a name="l04629"></a>04629 HARBLE( BYTE2(b1), BYTE3(b1), BYTE0(b2),
- <a name="l04630"></a>04630 BYTE2(c1), BYTE3(c1), BYTE0(c2),
- <a name="l04631"></a>04631 BYTE2(d1), BYTE3(d1), BYTE0(d2) );
- <a name="l04632"></a>04632 total += result;
- <a name="l04633"></a>04633 SETBYTE2(cells, result);
- <a name="l04634"></a>04634
- <a name="l04635"></a>04635 HARBLE( BYTE3(b1), BYTE0(b2), BYTE1(b2),
- <a name="l04636"></a>04636 BYTE3(c1), BYTE0(c2), BYTE1(c2),
- <a name="l04637"></a>04637 BYTE3(d1), BYTE0(d2), BYTE1(d2) );
- <a name="l04638"></a>04638 total += result;
- <a name="l04639"></a>04639 SETBYTE3(cells, result);
- <a name="l04640"></a>04640
- <a name="l04641"></a>04641 *front = cells;
- <a name="l04642"></a>04642 front++;
- <a name="l04643"></a>04643 }
- <a name="l04644"></a>04644 }
- <a name="l04645"></a>04645 }
- <a name="l04646"></a>04646
- <a name="l04647"></a>04647
- <a name="l04648"></a>04648 <span class="comment">// From Intel's paper on the Perlin noise function at:</span>
- <a name="l04649"></a>04649 <span class="comment">// http://www.pentium.com/drg/mmx/appnotes/proctex.htm</span>
- <a name="l04650"></a>04650 <span class="comment">//</span>
- <a name="l04651"></a>04651 <span class="comment">// Procedure C_Noise()</span>
- <a name="l04652"></a>04652 <span class="comment">// Inputs: u_init, v_init: starting u and v parameters into the image.</span>
- <a name="l04653"></a>04653 <span class="comment">// du, dv: the incremental change to u_init and v_init.</span>
- <a name="l04654"></a>04654 <span class="comment">// ddu, ddv: the incremental change to du and dv.</span>
- <a name="l04655"></a>04655 <span class="comment">// Num_Pix: number of pixels in the scan line to draw.</span>
- <a name="l04656"></a>04656 <span class="comment">// screen_buffer: Pointer to the screen buffer.</span>
- <a name="l04657"></a>04657 <span class="comment">// Output: 16 bit pixels are drawn to the screen.</span>
- <a name="l04658"></a>04658
- <a name="l04659"></a>04659 <span class="preprocessor">#define random1(i) ((i * i) & 65535) //GREAT! 1 MMX(tm) instr</span>
- <a name="l04660"></a>04660 <span class="preprocessor"></span><span class="preprocessor">#define random2(i) (((i * i) & 65535) >> 2)</span>
- <a name="l04661"></a>04661 <span class="preprocessor"></span>
- <a name="l04662"></a>04662 <span class="keyword">static</span> <span class="keywordtype">void</span> C_Noise(
- <a name="l04663"></a>04663 <span class="keywordtype">long</span> u_init,
- <a name="l04664"></a>04664 <span class="keywordtype">long</span> v_init,
- <a name="l04665"></a>04665 <span class="keywordtype">long</span> du,
- <a name="l04666"></a>04666 <span class="keywordtype">long</span> dv,
- <a name="l04667"></a>04667 <span class="keywordtype">long</span> ddu,
- <a name="l04668"></a>04668 <span class="keywordtype">long</span> ddv,
- <a name="l04669"></a>04669 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *screen_buffer,
- <a name="l04670"></a>04670 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count)
- <a name="l04671"></a>04671 {
- <a name="l04672"></a>04672 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> color;
- <a name="l04673"></a>04673 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> bx0, bx1, by0, by1;
- <a name="l04674"></a>04674 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> rx0, ry0;
- <a name="l04675"></a>04675
- <a name="l04676"></a>04676 <span class="comment">// Original Perlin's noise program used an array g[512][2].</span>
- <a name="l04677"></a>04677 <span class="comment">// This program replaces the array with real-time calculations.</span>
- <a name="l04678"></a>04678 <span class="comment">// The results are stored into variables of the form g_b##_#.</span>
- <a name="l04679"></a>04679
- <a name="l04680"></a>04680 <span class="keywordtype">short</span> g_b00_0; <span class="comment">// Used to replace array g[b00][0]</span>
- <a name="l04681"></a>04681 <span class="keywordtype">short</span> g_b00_1; <span class="comment">// Used to replace array g[b00][1]</span>
- <a name="l04682"></a>04682 <span class="keywordtype">short</span> g_b01_0; <span class="comment">// replaces array g[b01][0]</span>
- <a name="l04683"></a>04683 <span class="keywordtype">short</span> g_b01_1; <span class="comment">// replaces array g[b01][1]</span>
- <a name="l04684"></a>04684 <span class="keywordtype">short</span> g_b10_0; <span class="comment">// replaces array g[b10][0]</span>
- <a name="l04685"></a>04685 <span class="keywordtype">short</span> g_b10_1; <span class="comment">// replaces array g[b10][1]</span>
- <a name="l04686"></a>04686 <span class="keywordtype">short</span> g_b11_0; <span class="comment">// replaces array g[b11][0]</span>
- <a name="l04687"></a>04687 <span class="keywordtype">short</span> g_b11_1; <span class="comment">// replaces array g[b11][1]</span>
- <a name="l04688"></a>04688
- <a name="l04689"></a>04689 <span class="comment">// Used to replace array: b00 = p[p[bx0] + by0];</span>
- <a name="l04690"></a>04690 <span class="keywordtype">short</span> b00;
- <a name="l04691"></a>04691 <span class="keywordtype">short</span> b01;
- <a name="l04692"></a>04692 <span class="keywordtype">short</span> b10;
- <a name="l04693"></a>04693 <span class="keywordtype">short</span> b11;
- <a name="l04694"></a>04694
- <a name="l04695"></a>04695 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> i;
- <a name="l04696"></a>04696 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> u_16bit, v_16bit;
- <a name="l04697"></a>04697 <span class="keywordtype">signed</span> <span class="keywordtype">short</span> rx1, ry1;
- <a name="l04698"></a>04698 <span class="keywordtype">signed</span> <span class="keywordtype">short</span> sx, sy;
- <a name="l04699"></a>04699 <span class="keywordtype">signed</span> <span class="keywordtype">long</span> color_p0, color_p1, color_p2, color_p3;
- <a name="l04700"></a>04700 <span class="keywordtype">signed</span> <span class="keywordtype">long</span> color_y0, color_y1;
- <a name="l04701"></a>04701
- <a name="l04702"></a>04702 <span class="comment">// Inner loop for the scan line. "count" pixels will be drawn.</span>
- <a name="l04703"></a>04703 <span class="keywordflow">for</span> (i = 0; i < count; i++) {
- <a name="l04704"></a>04704 <span class="comment">// Convert the u and v parameters from 10.22 to 8.8 format.</span>
- <a name="l04705"></a>04705 u_16bit = (short)(u_init >> 14);
- <a name="l04706"></a>04706 v_16bit = (short)(v_init >> 14);
- <a name="l04707"></a>04707
- <a name="l04708"></a>04708 <span class="comment">// Imagine having a square of the type</span>
- <a name="l04709"></a>04709 <span class="comment">// p0---p1 Where p0 = (bx0, by0) +----> U</span>
- <a name="l04710"></a>04710 <span class="comment">// |(u,v)| p1 = (bx1, by0) |</span>
- <a name="l04711"></a>04711 <span class="comment">// | | p2 = (bx0, by1) | Coordinate System</span>
- <a name="l04712"></a>04712 <span class="comment">// p2---p3 p3 = (bx1, by1) V</span>
- <a name="l04713"></a>04713 <span class="comment">// The u, v point in 2D texture space is bounded by this rectangle.</span>
- <a name="l04714"></a>04714
- <a name="l04715"></a>04715 <span class="comment">// Goal: determine the color of the points p0, p1, p2, p3.</span>
- <a name="l04716"></a>04716 <span class="comment">// Then the color of the point (u, v) will be found by linear interpolation.</span>
- <a name="l04717"></a>04717
- <a name="l04718"></a>04718 <span class="comment">// First step: Get the 2D coordinates of the points p0, p1, p2, p3.</span>
- <a name="l04719"></a>04719
- <a name="l04720"></a>04720 <span class="comment">// Same as Perlin's original code except floating point</span>
- <a name="l04721"></a>04721 <span class="comment">// is converted over to fixed integer.</span>
- <a name="l04722"></a>04722
- <a name="l04723"></a>04723 <span class="comment">// Process the x component.</span>
- <a name="l04724"></a>04724 bx0 = u_16bit >> 8; <span class="comment">// Integer part of u, x component of p0 and p2.</span>
- <a name="l04725"></a>04725 bx1 = bx0 + 1; <span class="comment">// Integer part of u + 1, x component of p1 and p3.</span>
- <a name="l04726"></a>04726
- <a name="l04727"></a>04727 <span class="comment">// Process the y component.</span>
- <a name="l04728"></a>04728 by0 = v_16bit >> 8; <span class="comment">// Integer part of v, y component of p0 and p1.</span>
- <a name="l04729"></a>04729 by1 = by0 + 1; <span class="comment">// Integer part of v + 1, y component of p2 and p3.</span>
- <a name="l04730"></a>04730
- <a name="l04731"></a>04731 <span class="comment">// Next, we need vectors pointing from each point in the square above and</span>
- <a name="l04732"></a>04732 <span class="comment">// ending at the (u,v) coordinate located inside the square.</span>
- <a name="l04733"></a>04733 <span class="comment">// The vector (rx0, ry0) goes from P0 to the (u,v) coordinate.</span>
- <a name="l04734"></a>04734 <span class="comment">// The vector (rx1, ry0) goes from P1 to the (u,v) coordinate.</span>
- <a name="l04735"></a>04735 <span class="comment">// The vector (rx0, ry1) goes from P2 to the (u,v) coordinate.</span>
- <a name="l04736"></a>04736 <span class="comment">// The vector (rx1, ry1) goes from P3 to the (u,v) coordinate.</span>
- <a name="l04737"></a>04737
- <a name="l04738"></a>04738 <span class="comment">// Process the x component.</span>
- <a name="l04739"></a>04739 rx0 = u_16bit & 255; <span class="comment">// Fractional part of u. (0.0 <= rx0 < 1.0) or (0 <= rx0 < 255) for fixed math.</span>
- <a name="l04740"></a>04740 rx1 = rx0 - 256; <span class="comment">// Fractional part of u + 1. (-1.0 < rx1 <= 0.0) or (-255 < rx1 <= 0) for fixed math.</span>
- <a name="l04741"></a>04741
- <a name="l04742"></a>04742 <span class="comment">// Process the y component.</span>
- <a name="l04743"></a>04743 ry0 = v_16bit & 255; <span class="comment">// Fractional part of v. (0.0 <= ry0 < 1.0) or (0 <= ry0 < 255) for fixed math.</span>
- <a name="l04744"></a>04744 ry1 = ry0 - 256; <span class="comment">// Fractional part of v + 1. (-1.0 < rx1 <= 0.0) or (-255 < rx1 <= 0) for fixed math.</span>
- <a name="l04745"></a>04745
- <a name="l04746"></a>04746 <span class="comment">// Next, calculate the dropoff component about the point p0.</span>
- <a name="l04747"></a>04747
- <a name="l04748"></a>04748 <span class="comment">// Same as Perlin's original code except floating point</span>
- <a name="l04749"></a>04749 <span class="comment">// is converted over to fixed integer. The ">> 1" is used to</span>
- <a name="l04750"></a>04750 <span class="comment">// avoid overflow when the values are multiplied together.</span>
- <a name="l04751"></a>04751 <span class="comment">// This is not a problem in "C" but will be in the MMX implementation.</span>
- <a name="l04752"></a>04752
- <a name="l04753"></a>04753 sx = (((rx0 * rx0) >> 1) * ((1536 - (rx0 << 2)))) >> 16;
- <a name="l04754"></a>04754 sy = (((ry0 * ry0) >> 1) * ((1536 - (ry0 << 2)))) >> 16;
- <a name="l04755"></a>04755
- <a name="l04756"></a>04756 <span class="comment">// Now, for each point p0, p1, p2, p3 in the square above, image having</span>
- <a name="l04757"></a>04757 <span class="comment">// a unit gradiant vector pointing in any random direction. This step</span>
- <a name="l04758"></a>04758 <span class="comment">// attaches a unit gradiant vector to each point of the square. This is</span>
- <a name="l04759"></a>04759 <span class="comment">// done by precalculating 256, random, uniform, unit vectors. Then to attach</span>
- <a name="l04760"></a>04760 <span class="comment">// the gradiant vector to a point, an index into the array is needed. The</span>
- <a name="l04761"></a>04761 <span class="comment">// index is acquired from the x and y coordinates of the square corner point.</span>
- <a name="l04762"></a>04762 <span class="comment">// The algorithm used is called "Folding Over".</span>
- <a name="l04763"></a>04763 <span class="comment">// b00, b10, b01, and b11 contain indexes for a gradiant vector for each</span>
- <a name="l04764"></a>04764 <span class="comment">// corner of the square shown above.</span>
- <a name="l04765"></a>04765
- <a name="l04766"></a>04766 <span class="comment">// This is where the code differs from Perlins.</span>
- <a name="l04767"></a>04767 <span class="comment">// Rather than use arrays p[] and g[][], the values are</span>
- <a name="l04768"></a>04768 <span class="comment">// calculated real-time. Here random1() replaces array p[].</span>
- <a name="l04769"></a>04769 <span class="comment">// Perlin's equivalent: b00 = p[p[bx0] + by0];</span>
- <a name="l04770"></a>04770
- <a name="l04771"></a>04771 b00 = random1((random1(bx0) + by0));
- <a name="l04772"></a>04772 b01 = random1((random1(bx0) + by1));
- <a name="l04773"></a>04773 b10 = random1((random1(bx1) + by0));
- <a name="l04774"></a>04774 b11 = random1((random1(bx1) + by1));
- <a name="l04775"></a>04775
- <a name="l04776"></a>04776 <span class="comment">// Here, random2() replaces array g[][].</span>
- <a name="l04777"></a>04777 <span class="comment">// Perlin's equivalent: g_b00_0 = g[b00][0];</span>
- <a name="l04778"></a>04778
- <a name="l04779"></a>04779 g_b00_0 = (random2(b00) & 511) - 256;
- <a name="l04780"></a>04780 g_b01_0 = (random2(b01) & 511) - 256;
- <a name="l04781"></a>04781 g_b10_0 = (random2(b10) & 511) - 256;
- <a name="l04782"></a>04782 g_b11_0 = (random2(b11) & 511) - 256;
- <a name="l04783"></a>04783
- <a name="l04784"></a>04784 g_b00_1 = (random2((b00 + 1)) & 511) - 256;
- <a name="l04785"></a>04785 g_b01_1 = (random2((b01 + 1)) & 511) - 256;
- <a name="l04786"></a>04786 g_b10_1 = (random2((b10 + 1)) & 511) - 256;
- <a name="l04787"></a>04787 g_b11_1 = (random2((b11 + 1)) & 511) - 256;
- <a name="l04788"></a>04788
- <a name="l04789"></a>04789 <span class="comment">// Now, for each point in the square shown above, calculate the dot</span>
- <a name="l04790"></a>04790 <span class="comment">// product of the gradiant vector and the vector going from each square</span>
- <a name="l04791"></a>04791 <span class="comment">// corner point to the (u,v) point inside the square.</span>
- <a name="l04792"></a>04792
- <a name="l04793"></a>04793 <span class="comment">// Same as Perlin's original code.</span>
- <a name="l04794"></a>04794
- <a name="l04795"></a>04795 color_p0 = rx0 * g_b00_0 + ry0 * g_b00_1;
- <a name="l04796"></a>04796 color_p1 = rx1 * g_b10_0 + ry0 * g_b10_1;
- <a name="l04797"></a>04797 color_p2 = rx0 * g_b01_0 + ry1 * g_b01_1;
- <a name="l04798"></a>04798 color_p3 = rx1 * g_b11_0 + ry1 * g_b11_1;
- <a name="l04799"></a>04799
- <a name="l04800"></a>04800 <span class="comment">// color_p0, color_p1, ... are the colors of the points p0, p1, p2, p3.</span>
- <a name="l04801"></a>04801 <span class="comment">// Now use linear interpolation to get the color of the point (sx, sy) inside</span>
- <a name="l04802"></a>04802 <span class="comment">// the square.</span>
- <a name="l04803"></a>04803
- <a name="l04804"></a>04804 <span class="comment">// Interpolation along the X axis.</span>
- <a name="l04805"></a>04805
- <a name="l04806"></a>04806 color_y0 = color_p0 + sx * ((color_p1 - color_p0) >> 8);
- <a name="l04807"></a>04807 color_y1 = color_p2 + sx * ((color_p3 - color_p2) >> 8);
- <a name="l04808"></a>04808
- <a name="l04809"></a>04809 <span class="comment">// Interpolation along the Y axis.</span>
- <a name="l04810"></a>04810 <span class="comment">// Output is from -256 to +256, so a 256 color offset is added and</span>
- <a name="l04811"></a>04811 <span class="comment">// the final result is divided by 2. (>>1). (0 <= next_color < 256).</span>
- <a name="l04812"></a>04812
- <a name="l04813"></a>04813 <span class="comment">// Same as Perlin's original code except the output is</span>
- <a name="l04814"></a>04814 <span class="comment">// converted from fixed point to regular integer. Also</span>
- <a name="l04815"></a>04815 <span class="comment">// since the output ranges from -256 to +256, a 256 offest</span>
- <a name="l04816"></a>04816 <span class="comment">// is added to make the range from 0 to 511. This offset</span>
- <a name="l04817"></a>04817 <span class="comment">// is the 65536 value. Then the 0 to 511 is scaled down.</span>
- <a name="l04818"></a>04818 <span class="comment">// to a range of 0 to 255.</span>
- <a name="l04819"></a>04819
- <a name="l04820"></a>04820 color =
- <a name="l04821"></a>04821 (<span class="keywordtype">unsigned</span> char)
- <a name="l04822"></a>04822 ((color_y0 +
- <a name="l04823"></a>04823 65536 +
- <a name="l04824"></a>04824 (sy * ((color_y1 - color_y0) >> 8))
- <a name="l04825"></a>04825 ) >> 9);
- <a name="l04826"></a>04826
- <a name="l04827"></a>04827 *(screen_buffer) = color;
- <a name="l04828"></a>04828
- <a name="l04829"></a>04829 u_init += du; <span class="comment">// New u for calc the color of the next pixel</span>
- <a name="l04830"></a>04830 v_init += dv; <span class="comment">// New v for calc the color of the next pixel</span>
- <a name="l04831"></a>04831 du += ddu; <span class="comment">// New du for calc the color of the next pixel</span>
- <a name="l04832"></a>04832 dv += ddv; <span class="comment">// New dv for calc the color of the next pixel</span>
- <a name="l04833"></a>04833
- <a name="l04834"></a>04834 screen_buffer++; <span class="comment">// Advance 1 pixel.</span>
- <a name="l04835"></a>04835 } <span class="comment">// for x</span>
- <a name="l04836"></a>04836
- <a name="l04837"></a>04837 } <span class="comment">// C_Noise()</span>
- <a name="l04838"></a>04838
- <a name="l04839"></a>04839
- <a name="l04840"></a>04840 <span class="keywordtype">void</span> CellEngine::n_perlin()
- <a name="l04841"></a>04841 {
- <a name="l04842"></a>04842 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *front = frontMem;
- <a name="l04843"></a>04843 <span class="keywordtype">long</span> yy;
- <a name="l04844"></a>04844 <span class="keywordtype">long</span> u = pointax;
- <a name="l04845"></a>04845 <span class="keywordtype">long</span> v = pointay;
- <a name="l04846"></a>04846 <span class="keywordtype">long</span> du = pointbx * frob;
- <a name="l04847"></a>04847 <span class="keywordtype">long</span> dv = pointby * frob;
- <a name="l04848"></a>04848 <span class="keywordtype">long</span> ddu = pointcx;
- <a name="l04849"></a>04849 <span class="keywordtype">long</span> ddv = pointcy;
- <a name="l04850"></a>04850
- <a name="l04851"></a>04851 <span class="keywordflow">for</span> (yy = 0;
- <a name="l04852"></a>04852 yy < height;
- <a name="l04853"></a>04853 front += screenRowBytes,
- <a name="l04854"></a>04854 yy++) {
- <a name="l04855"></a>04855
- <a name="l04856"></a>04856 C_Noise(
- <a name="l04857"></a>04857 u,
- <a name="l04858"></a>04858 v,
- <a name="l04859"></a>04859 du,
- <a name="l04860"></a>04860 dv,
- <a name="l04861"></a>04861 ddu,
- <a name="l04862"></a>04862 ddv,
- <a name="l04863"></a>04863 front,
- <a name="l04864"></a>04864 width);
- <a name="l04865"></a>04865
- <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>
- <a name="l04867"></a>04867
- <a name="l04868"></a>04868 u += dv;
- <a name="l04869"></a>04869 v -= du;
- <a name="l04870"></a>04870 } <span class="comment">// for yy</span>
- <a name="l04871"></a>04871 }
- <a name="l04872"></a>04872
- <a name="l04873"></a>04873
- <a name="l04874"></a>04874 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> MARG_RULE_DIFFUSION(
- <a name="l04875"></a>04875 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c,
- <a name="l04876"></a>04876 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cw,
- <a name="l04877"></a>04877 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ccw,
- <a name="l04878"></a>04878 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> opp,
- <a name="l04879"></a>04879 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> r,
- <a name="l04880"></a>04880 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> p)
- <a name="l04881"></a>04881 {
- <a name="l04882"></a>04882 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> result = 0;
- <a name="l04883"></a>04883 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> wall =
- <a name="l04884"></a>04884 (c | cw | ccw | opp) & 2;
- <a name="l04885"></a>04885 <span class="keywordflow">if</span> (wall) {
- <a name="l04886"></a>04886 <span class="keywordflow">if</span> (c & 3) {
- <a name="l04887"></a>04887 result = 2;
- <a name="l04888"></a>04888 } <span class="comment">// if</span>
- <a name="l04889"></a>04889 } <span class="keywordflow">else</span> {
- <a name="l04890"></a>04890 result =
- <a name="l04891"></a>04891 (((r & 1) ? cw : ccw) & 1) |
- <a name="l04892"></a>04892 (c & 2);
- <a name="l04893"></a>04893 } <span class="comment">// if</span>
- <a name="l04894"></a>04894
- <a name="l04895"></a>04895 <span class="keywordflow">return</span> result;
- <a name="l04896"></a>04896 }
- <a name="l04897"></a>04897
- <a name="l04898"></a>04898
- <a name="l04899"></a>04899 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> MARG_RULE_GAS(
- <a name="l04900"></a>04900 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c,
- <a name="l04901"></a>04901 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cw,
- <a name="l04902"></a>04902 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ccw,
- <a name="l04903"></a>04903 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> opp,
- <a name="l04904"></a>04904 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> r,
- <a name="l04905"></a>04905 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> p)
- <a name="l04906"></a>04906 {
- <a name="l04907"></a>04907 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> result = 0;
- <a name="l04908"></a>04908 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> collision =
- <a name="l04909"></a>04909 ((c & 1) == (opp & 1)) &&
- <a name="l04910"></a>04910 ((cw & 1) == (ccw & 1)) &&
- <a name="l04911"></a>04911 ((c & 1) != (cw & 1));
- <a name="l04912"></a>04912 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> frozen =
- <a name="l04913"></a>04913 (c | cw | ccw | opp) & 2;
- <a name="l04914"></a>04914 <span class="keywordflow">if</span> (frozen) {
- <a name="l04915"></a>04915 <span class="keywordflow">if</span> (c & 3) {
- <a name="l04916"></a>04916 result = 2;
- <a name="l04917"></a>04917 } <span class="comment">// if</span>
- <a name="l04918"></a>04918 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (collision) {
- <a name="l04919"></a>04919 result = cw;
- <a name="l04920"></a>04920 } <span class="keywordflow">else</span> {
- <a name="l04921"></a>04921 result = opp;
- <a name="l04922"></a>04922 } <span class="comment">// if</span>
- <a name="l04923"></a>04923
- <a name="l04924"></a>04924 <span class="keywordflow">return</span> result;
- <a name="l04925"></a>04925 }
- <a name="l04926"></a>04926
- <a name="l04927"></a>04927
- <a name="l04928"></a>04928 <span class="keywordtype">void</span> CellEngine::n_dendrite()
- <a name="l04929"></a>04929 {
- <a name="l04930"></a>04930 Byte *front = frontMem;
- <a name="l04931"></a>04931 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *nw;
- <a name="l04932"></a>04932 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *ne;
- <a name="l04933"></a>04933 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *sw;
- <a name="l04934"></a>04934 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *se;
- <a name="l04935"></a>04935 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data = front;
- <a name="l04936"></a>04936 <span class="keywordtype">int</span> xx, yy;
- <a name="l04937"></a>04937 <span class="comment">// nw ne</span>
- <a name="l04938"></a>04938 <span class="comment">// sw se</span>
- <a name="l04939"></a>04939 <span class="keywordflow">for</span> (yy = 0; yy < height; yy += 2) {
- <a name="l04940"></a>04940 <span class="keywordflow">if</span> (phase == 0) {
- <a name="l04941"></a>04941 nw = data;
- <a name="l04942"></a>04942 ne = nw + 1;
- <a name="l04943"></a>04943 sw = data + screenRowBytes;
- <a name="l04944"></a>04944 se = sw + 1;
- <a name="l04945"></a>04945 } <span class="keywordflow">else</span> {
- <a name="l04946"></a>04946 se = data;
- <a name="l04947"></a>04947 sw = se + (width - 1);
- <a name="l04948"></a>04948 ne = data +
- <a name="l04949"></a>04949 ((yy == 0)
- <a name="l04950"></a>04950 ? ((height - 1) * screenRowBytes)
- <a name="l04951"></a>04951 : (-screenRowBytes));
- <a name="l04952"></a>04952 nw = ne + (width - 1);
- <a name="l04953"></a>04953 } <span class="comment">// if</span>
- <a name="l04954"></a>04954
- <a name="l04955"></a>04955 <span class="keywordflow">for</span> (xx = 0; xx < width; xx += 2) {
- <a name="l04956"></a>04956 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> nw0 = *nw;
- <a name="l04957"></a>04957 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ne0 = *ne;
- <a name="l04958"></a>04958 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> sw0 = *sw;
- <a name="l04959"></a>04959 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> se0 = *se;
- <a name="l04960"></a>04960 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> r = (<span class="keywordtype">unsigned</span> char)Rand8();
- <a name="l04961"></a>04961
- <a name="l04962"></a>04962 <span class="comment">// nw ne</span>
- <a name="l04963"></a>04963 <span class="comment">// sw se</span>
- <a name="l04964"></a>04964
- <a name="l04965"></a>04965 <span class="comment">// MARG_RULE(c, cw, ccw, opp, r, phase)</span>
- <a name="l04966"></a>04966
- <a name="l04967"></a>04967 <span class="preprocessor">#if 1</span>
- <a name="l04968"></a>04968 <span class="preprocessor"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> collision =
- <a name="l04969"></a>04969 ((nw0 & 1) == (ne0 & 1)) &&
- <a name="l04970"></a>04970 ((sw0 & 1) == (se0 & 1)) &&
- <a name="l04971"></a>04971 ((nw0 & 1) != (sw0 & 1));
- <a name="l04972"></a>04972 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> frozen =
- <a name="l04973"></a>04973 (nw0 | ne0 | sw0 | se0) & 128;
- <a name="l04974"></a>04974 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> nw1, ne1, sw1, se1;
- <a name="l04975"></a>04975 <span class="comment">// nw ne</span>
- <a name="l04976"></a>04976 <span class="comment">// sw se</span>
- <a name="l04977"></a>04977 <span class="keywordflow">if</span> (frozen) {
- <a name="l04978"></a>04978 <span class="keywordtype">int</span> t = ticks >> 4;
- <a name="l04979"></a>04979 nw1 =
- <a name="l04980"></a>04980 (nw0 == 0)
- <a name="l04981"></a>04981 ? 0
- <a name="l04982"></a>04982 : ((nw0 & 128)
- <a name="l04983"></a>04983 ? nw0
- <a name="l04984"></a>04984 : (t | 128));
- <a name="l04985"></a>04985 ne1 =
- <a name="l04986"></a>04986 (ne0 == 0)
- <a name="l04987"></a>04987 ? 0
- <a name="l04988"></a>04988 : ((ne0 & 128)
- <a name="l04989"></a>04989 ? ne0
- <a name="l04990"></a>04990 : (t | 128));
- <a name="l04991"></a>04991 sw1 =
- <a name="l04992"></a>04992 (sw0 == 0)
- <a name="l04993"></a>04993 ? 0
- <a name="l04994"></a>04994 : ((sw0 & 128)
- <a name="l04995"></a>04995 ? sw0
- <a name="l04996"></a>04996 : (t | 128));
- <a name="l04997"></a>04997 se1 =
- <a name="l04998"></a>04998 (se0 == 0)
- <a name="l04999"></a>04999 ? 0
- <a name="l05000"></a>05000 : ((se0 & 128)
- <a name="l05001"></a>05001 ? se0
- <a name="l05002"></a>05002 : (t | 128));
- <a name="l05003"></a>05003
- <a name="l05004"></a>05004 <span class="preprocessor">#if 1</span>
- <a name="l05005"></a>05005 <span class="preprocessor"></span> <span class="keywordtype">int</span> count =
- <a name="l05006"></a>05006 ((nw1 & 128) + (ne1 & 128) +
- <a name="l05007"></a>05007 (sw1 & 128) + (se1 & 128)) >> 7;
- <a name="l05008"></a>05008
- <a name="l05009"></a>05009 <span class="keywordflow">if</span> (count > 0) {
- <a name="l05010"></a>05010 <span class="comment">// static int countHeatMod[5] = { 0, -20, -5, 10, 30 };</span>
- <a name="l05011"></a>05011 <span class="keyword">static</span> <span class="keywordtype">int</span> countHeatMod[5] = { 0, -1, 0, 0, 0 };
- <a name="l05012"></a>05012 <span class="keywordtype">int</span> avg =
- <a name="l05013"></a>05013 ((((nw1 & 128) ? (nw1 & 127) : 0) +
- <a name="l05014"></a>05014 ((ne1 & 128) ? (ne1 & 127) : 0) +
- <a name="l05015"></a>05015 ((sw1 & 128) ? (sw1 & 127) : 0) +
- <a name="l05016"></a>05016 ((se1 & 128) ? (se1 & 127) : 0) +
- <a name="l05017"></a>05017 <span class="comment">// countHeatMod[count] +</span>
- <a name="l05018"></a>05018 <span class="comment">// frob +</span>
- <a name="l05019"></a>05019 0) / count) +
- <a name="l05020"></a>05020 frob +
- <a name="l05021"></a>05021 countHeatMod[count] +
- <a name="l05022"></a>05022 0;
- <a name="l05023"></a>05023 <span class="keywordflow">if</span> (nw1 & 128) {
- <a name="l05024"></a>05024 nw1 = avg | 128; <span class="comment">// (((nw1 & 127) + avg) >> 1) | 128;</span>
- <a name="l05025"></a>05025 } <span class="comment">// if</span>
- <a name="l05026"></a>05026 <span class="keywordflow">if</span> (ne1 & 128) {
- <a name="l05027"></a>05027 ne1 = avg | 128; <span class="comment">// (((ne1 & 127) + avg) >> 1) | 128;</span>
- <a name="l05028"></a>05028 } <span class="comment">// if</span>
- <a name="l05029"></a>05029 <span class="keywordflow">if</span> (sw1 & 128) {
- <a name="l05030"></a>05030 sw1 = avg | 128; <span class="comment">// (((sw1 & 127) + avg) >> 1) | 128;</span>
- <a name="l05031"></a>05031 } <span class="comment">// if</span>
- <a name="l05032"></a>05032 <span class="keywordflow">if</span> (se1 & 128) {
- <a name="l05033"></a>05033 se1 = avg | 128; <span class="comment">// (((se1 & 127) + avg) >> 1) | 128;</span>
- <a name="l05034"></a>05034 } <span class="comment">// if</span>
- <a name="l05035"></a>05035 } <span class="comment">// if</span>
- <a name="l05036"></a>05036 <span class="preprocessor">#endif</span>
- <a name="l05037"></a>05037 <span class="preprocessor"></span>
- <a name="l05038"></a>05038 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (collision) {
- <a name="l05039"></a>05039 <span class="keywordflow">if</span> (r & 16) {
- <a name="l05040"></a>05040 <span class="comment">// Rotate clockwise</span>
- <a name="l05041"></a>05041 nw1 = sw0;
- <a name="l05042"></a>05042 ne1 = nw0;
- <a name="l05043"></a>05043 se1 = ne0;
- <a name="l05044"></a>05044 sw1 = se0;
- <a name="l05045"></a>05045 } <span class="keywordflow">else</span> {
- <a name="l05046"></a>05046 <span class="comment">// Rotate counter-clockwise</span>
- <a name="l05047"></a>05047 nw1 = ne0;
- <a name="l05048"></a>05048 ne1 = se0;
- <a name="l05049"></a>05049 se1 = sw0;
- <a name="l05050"></a>05050 sw1 = nw0;
- <a name="l05051"></a>05051 } <span class="comment">// if</span>
- <a name="l05052"></a>05052 } <span class="keywordflow">else</span> {
- <a name="l05053"></a>05053 <span class="keywordflow">if</span> (r & 7) {
- <a name="l05054"></a>05054 <span class="comment">// Flip opposite</span>
- <a name="l05055"></a>05055 nw1 = se0;
- <a name="l05056"></a>05056 ne1 = sw0;
- <a name="l05057"></a>05057 se1 = nw0;
- <a name="l05058"></a>05058 sw1 = ne0;
- <a name="l05059"></a>05059 } <span class="keywordflow">else</span> {
- <a name="l05060"></a>05060 <span class="keywordflow">if</span> (r & 16) {
- <a name="l05061"></a>05061 <span class="comment">// Rotate clockwise</span>
- <a name="l05062"></a>05062 nw1 = sw0;
- <a name="l05063"></a>05063 ne1 = nw0;
- <a name="l05064"></a>05064 se1 = ne0;
- <a name="l05065"></a>05065 sw1 = se0;
- <a name="l05066"></a>05066 } <span class="keywordflow">else</span> {
- <a name="l05067"></a>05067 <span class="comment">// Rotate counter-clockwise</span>
- <a name="l05068"></a>05068 nw1 = ne0;
- <a name="l05069"></a>05069 ne1 = se0;
- <a name="l05070"></a>05070 se1 = sw0;
- <a name="l05071"></a>05071 sw1 = nw0;
- <a name="l05072"></a>05072 } <span class="comment">// if</span>
- <a name="l05073"></a>05073 } <span class="comment">// if</span>
- <a name="l05074"></a>05074 } <span class="comment">// if</span>
- <a name="l05075"></a>05075 <span class="preprocessor">#else</span>
- <a name="l05076"></a>05076 <span class="preprocessor"></span> <span class="comment">// c cw</span>
- <a name="l05077"></a>05077 <span class="comment">// ccw opp</span>
- <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);
- <a name="l05079"></a>05079
- <a name="l05080"></a>05080 <span class="comment">// ccw c</span>
- <a name="l05081"></a>05081 <span class="comment">// opp cw</span>
- <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);
- <a name="l05083"></a>05083
- <a name="l05084"></a>05084 <span class="comment">// opp ccw</span>
- <a name="l05085"></a>05085 <span class="comment">// cw c</span>
- <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);
- <a name="l05087"></a>05087
- <a name="l05088"></a>05088 <span class="comment">// cw opp</span>
- <a name="l05089"></a>05089 <span class="comment">// c ccw</span>
- <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);
- <a name="l05091"></a>05091
- <a name="l05092"></a>05092 <span class="preprocessor">#endif</span>
- <a name="l05093"></a>05093 <span class="preprocessor"></span>
- <a name="l05094"></a>05094 <span class="preprocessor">#if 0</span>
- <a name="l05095"></a>05095 <span class="preprocessor"></span> <span class="keywordtype">int</span> nwgas = ((nw1 > 0) && (nw1 < 128));
- <a name="l05096"></a>05096 <span class="keywordtype">int</span> negas = ((ne1 > 0) && (ne1 < 128));
- <a name="l05097"></a>05097 <span class="keywordtype">int</span> swgas = ((sw1 > 0) && (sw1 < 128));
- <a name="l05098"></a>05098 <span class="keywordtype">int</span> segas = ((se1 > 0) && (se1 < 128));
- <a name="l05099"></a>05099 <span class="keywordtype">int</span> gasses = nwgas + negas + swgas + segas;
- <a name="l05100"></a>05100 <span class="keywordflow">if</span> (gasses > 1) {
- <a name="l05101"></a>05101 <span class="keywordtype">int</span> total =
- <a name="l05102"></a>05102 (nwgas ? nw1 : 0) +
- <a name="l05103"></a>05103 (negas ? ne1 : 0) +
- <a name="l05104"></a>05104 (swgas ? sw1 : 0) +
- <a name="l05105"></a>05105 (segas ? se1 : 0) +
- <a name="l05106"></a>05106 leftover;
- <a name="l05107"></a>05107 <span class="keywordflow">if</span> ((Rand8() & 15) == 0) {
- <a name="l05108"></a>05108 total += frob;
- <a name="l05109"></a>05109 } <span class="comment">// if</span>
- <a name="l05110"></a>05110 <span class="keywordtype">int</span> avg =
- <a name="l05111"></a>05111 (total / gasses) & 127;
- <a name="l05112"></a>05112 leftover =
- <a name="l05113"></a>05113 total % gasses;
- <a name="l05114"></a>05114 <span class="keywordflow">while</span> (avg <= 0) avg += 127;
- <a name="l05115"></a>05115 <span class="keywordflow">if</span> (nwgas) nw1 = avg;
- <a name="l05116"></a>05116 <span class="keywordflow">if</span> (negas) ne1 = avg;
- <a name="l05117"></a>05117 <span class="keywordflow">if</span> (swgas) sw1 = avg;
- <a name="l05118"></a>05118 <span class="keywordflow">if</span> (segas) se1 = avg;
- <a name="l05119"></a>05119 } <span class="comment">// if</span>
- <a name="l05120"></a>05120 <span class="preprocessor">#endif</span>
- <a name="l05121"></a>05121 <span class="preprocessor"></span>
- <a name="l05122"></a>05122 *nw = nw1;
- <a name="l05123"></a>05123 *ne = ne1;
- <a name="l05124"></a>05124 *sw = sw1;
- <a name="l05125"></a>05125 *se = se1;
- <a name="l05126"></a>05126
- <a name="l05127"></a>05127 nw = ne + 1;
- <a name="l05128"></a>05128 sw = se + 1;
- <a name="l05129"></a>05129 ne = ne + 2;
- <a name="l05130"></a>05130 se = se + 2;
- <a name="l05131"></a>05131 } <span class="comment">// for xx</span>
- <a name="l05132"></a>05132
- <a name="l05133"></a>05133 data +=
- <a name="l05134"></a>05134 2 * screenRowBytes;
- <a name="l05135"></a>05135
- <a name="l05136"></a>05136 } <span class="comment">// for yy</span>
- <a name="l05137"></a>05137 }
- <a name="l05138"></a>05138
- <a name="l05139"></a>05139
- <a name="l05140"></a>05140 <span class="keywordtype">void</span> CellEngine::n_vanneal()
- <a name="l05141"></a>05141 {
- <a name="l05142"></a>05142 <span class="keywordtype">long</span> sum;
- <a name="l05143"></a>05143
- <a name="l05144"></a>05144 <span class="keywordflow">if</span> (total < hubba) {
- <a name="l05145"></a>05145 inflation = 1;
- <a name="l05146"></a>05146 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (total == hubba) {
- <a name="l05147"></a>05147 inflation = 0;
- <a name="l05148"></a>05148 } <span class="keywordflow">else</span> {
- <a name="l05149"></a>05149 inflation = -1;
- <a name="l05150"></a>05150 } <span class="comment">// if</span>
- <a name="l05151"></a>05151
- <a name="l05152"></a>05152 total = 0;
- <a name="l05153"></a>05153
- <a name="l05154"></a>05154 <span class="preprocessor">#define VANNEAL ( \</span>
- <a name="l05155"></a>05155 <span class="preprocessor"> (((((sum = inflation + SUM9REG(1)) > 5) || (sum == 4))) ? (total++, 1) : 0) | \</span>
- <a name="l05156"></a>05156 <span class="preprocessor"> ((c&0x7f) << 1))</span>
- <a name="l05157"></a>05157 <span class="preprocessor"></span>
- <a name="l05158"></a>05158 CAM_MASKED_REG_LOOP(VANNEAL)
- <a name="l05159"></a>05159 }
- <a name="l05160"></a>05160
- <a name="l05161"></a>05161
- <a name="l05162"></a>05162 <span class="keywordtype">void</span> CellEngine::n_vanneal8()
- <a name="l05163"></a>05163 {
- <a name="l05164"></a>05164 <span class="keywordtype">long</span> sum0;
- <a name="l05165"></a>05165 <span class="keywordtype">long</span> sum1;
- <a name="l05166"></a>05166 <span class="keywordtype">long</span> sum2;
- <a name="l05167"></a>05167 <span class="keywordtype">long</span> sum3;
- <a name="l05168"></a>05168 <span class="keywordtype">long</span> sum4;
- <a name="l05169"></a>05169 <span class="keywordtype">long</span> sum5;
- <a name="l05170"></a>05170 <span class="keywordtype">long</span> sum6;
- <a name="l05171"></a>05171 <span class="keywordtype">long</span> sum7;
- <a name="l05172"></a>05172
- <a name="l05173"></a>05173 <span class="keywordflow">if</span> (total < hubba) {
- <a name="l05174"></a>05174 inflation = 1;
- <a name="l05175"></a>05175 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (total == hubba) {
- <a name="l05176"></a>05176 inflation = 0;
- <a name="l05177"></a>05177 } <span class="keywordflow">else</span> {
- <a name="l05178"></a>05178 inflation = -1;
- <a name="l05179"></a>05179 } <span class="comment">// if</span>
- <a name="l05180"></a>05180
- <a name="l05181"></a>05181 total = 0;
- <a name="l05182"></a>05182
- <a name="l05183"></a>05183 <span class="preprocessor">#define VANNEAL8 ( \</span>
- <a name="l05184"></a>05184 <span class="preprocessor"> ((((sum0 = inflation + SUM9REG(1)) > 5) || (sum0 == 4)) ? (total++, 1) : 0) | \</span>
- <a name="l05185"></a>05185 <span class="preprocessor"> ((((sum1 = inflation + (SUM9REG(2) >> 1)) > 5) || (sum1 == 4)) ? (total++, 2) : 0) | \</span>
- <a name="l05186"></a>05186 <span class="preprocessor"> ((((sum2 = inflation + (SUM9REG(4) >> 2)) > 5) || (sum2 == 4)) ? (total++, 4) : 0) | \</span>
- <a name="l05187"></a>05187 <span class="preprocessor"> ((((sum3 = inflation + (SUM9REG(8) >> 3)) > 5) || (sum3 == 4)) ? (total++, 8) : 0) | \</span>
- <a name="l05188"></a>05188 <span class="preprocessor"> ((((sum4 = inflation + (SUM9REG(16) >> 4)) > 5) || (sum4 == 4)) ? (total++, 16) : 0) | \</span>
- <a name="l05189"></a>05189 <span class="preprocessor"> ((((sum5 = inflation + (SUM9REG(32) >> 5)) > 5) || (sum5 == 4)) ? (total++, 32) : 0) | \</span>
- <a name="l05190"></a>05190 <span class="preprocessor"> ((((sum6 = inflation + (SUM9REG(64) >> 6)) > 5) || (sum6 == 4)) ? (total++, 64) : 0) | \</span>
- <a name="l05191"></a>05191 <span class="preprocessor"> ((((sum7 = inflation + (SUM9REG(128) >> 7)) > 5) || (sum7 == 4)) ? (total++, 128) : 0))</span>
- <a name="l05192"></a>05192 <span class="preprocessor"></span>
- <a name="l05193"></a>05193 CAM_MASKED_REG_LOOP(VANNEAL8)
- <a name="l05194"></a>05194 }
- <a name="l05195"></a>05195
- <a name="l05196"></a>05196 <span class="preprocessor">#if 0</span>
- <a name="l05197"></a>05197 <span class="preprocessor"></span>
- <a name="l05198"></a>05198 <span class="keywordtype">void</span> CellEngine::n_freaco()
- <a name="l05199"></a>05199 {
- <a name="l05200"></a>05200 <span class="keywordtype">long</span> sum;
- <a name="l05201"></a>05201
- <a name="l05202"></a>05202 <span class="preprocessor">#define FRAIN ( \</span>
- <a name="l05203"></a>05203 <span class="preprocessor"> (((c & 0x03) == 0) \</span>
- <a name="l05204"></a>05204 <span class="preprocessor"> ? ((SUM8REG(1) == 2) ? 1 : 0) \</span>
- <a name="l05205"></a>05205 <span class="preprocessor"> : 0) | \</span>
- <a name="l05206"></a>05206 <span class="preprocessor"> ((c & 1) ? (0xfe) | \</span>
- <a name="l05207"></a>05207 <span class="preprocessor"> : (</span>
- <a name="l05208"></a>05208 <span class="preprocessor"></span> : 0)
- <a name="l05209"></a>05209 ((sum = c % 0xfe),
- <a name="l05210"></a>05210 (c << 1) & 0xfe)) \
- <a name="l05211"></a>05211 )
- <a name="l05212"></a>05212
- <a name="l05213"></a>05213 <span class="preprocessor">#define FRANTILIFE ( \</span>
- <a name="l05214"></a>05214 <span class="preprocessor"> ((sum = SUM8REG(1)), \</span>
- <a name="l05215"></a>05215 <span class="preprocessor"> (((c&1) ? (sum != 5) : (((sum != 5) && (sum != 6)) ? 1 : 0)) | \</span>
- <a name="l05216"></a>05216 <span class="preprocessor"> ((c&0x7f) << 1))))</span>
- <a name="l05217"></a>05217 <span class="preprocessor"></span>
- <a name="l05218"></a>05218 <span class="preprocessor">#define FREACO ( \</span>
- <a name="l05219"></a>05219 <span class="preprocessor"> ((((sum = (SUM9REG(128) >> 7)) > 5) || (sum == 4)) \</span>
- <a name="l05220"></a>05220 <span class="preprocessor"> ? ((FRANTILIFE & 127) | 128) \</span>
- <a name="l05221"></a>05221 <span class="preprocessor"> : (FRAIN & 127)))</span>
- <a name="l05222"></a>05222 <span class="preprocessor"></span>
- <a name="l05223"></a>05223 CAM_MASKED_REG_LOOP(FREACO)
- <a name="l05224"></a>05224 }
- <a name="l05225"></a>05225
- <a name="l05226"></a>05226 <span class="preprocessor">#endif</span>
- <a name="l05227"></a>05227 <span class="preprocessor"></span>
- <a name="l05228"></a>05228
- <a name="l05230"></a>05230 <span class="comment">// von Neumann 29 state cellular automata</span>
- <a name="l05231"></a>05231
- <a name="l05232"></a>05232
- <a name="l05233"></a>05233 <span class="keyword">enum</span> {
- <a name="l05234"></a>05234 U = 0x00,
- <a name="l05235"></a>05235
- <a name="l05236"></a>05236 S = 0x01,
- <a name="l05237"></a>05237 S0 = 0x02,
- <a name="l05238"></a>05238 S1 = 0x03,
- <a name="l05239"></a>05239 S00 = 0x04,
- <a name="l05240"></a>05240 S01 = 0x05,
- <a name="l05241"></a>05241 S10 = 0x06,
- <a name="l05242"></a>05242 S11 = 0x07,
- <a name="l05243"></a>05243 S000 = 0x08,
- <a name="l05244"></a>05244
- <a name="l05245"></a>05245 C00 = 0x10,
- <a name="l05246"></a>05246 C10 = 0x11,
- <a name="l05247"></a>05247 C01 = 0x90,
- <a name="l05248"></a>05248 C11 = 0x91,
- <a name="l05249"></a>05249
- <a name="l05250"></a>05250 OR = 0x20,
- <a name="l05251"></a>05251 OU = 0x21,
- <a name="l05252"></a>05252 OL = 0x22,
- <a name="l05253"></a>05253 OD = 0x23,
- <a name="l05254"></a>05254
- <a name="l05255"></a>05255 SR = 0x40,
- <a name="l05256"></a>05256 SU = 0x41,
- <a name="l05257"></a>05257 SL = 0x42,
- <a name="l05258"></a>05258 SD = 0x43,
- <a name="l05259"></a>05259
- <a name="l05260"></a>05260 ORX = 0xa0,
- <a name="l05261"></a>05261 OUX = 0xa1,
- <a name="l05262"></a>05262 OLX = 0xa2,
- <a name="l05263"></a>05263 ODX = 0xa3,
- <a name="l05264"></a>05264
- <a name="l05265"></a>05265 SRX = 0xc0,
- <a name="l05266"></a>05266 SUX = 0xc1,
- <a name="l05267"></a>05267 SLX = 0xc2,
- <a name="l05268"></a>05268 SDX = 0xc3,
- <a name="l05269"></a>05269
- <a name="l05270"></a>05270 DM = 0x03, <span class="comment">// direction mask</span>
- <a name="l05271"></a>05271 RD = 0x00, <span class="comment">// right direction</span>
- <a name="l05272"></a>05272 UD = 0x01, <span class="comment">// up direction</span>
- <a name="l05273"></a>05273 LD = 0x02, <span class="comment">// left direction</span>
- <a name="l05274"></a>05274 DD = 0x03, <span class="comment">// down direction</span>
- <a name="l05275"></a>05275 EX = 0x80, <span class="comment">// excited</span>
- <a name="l05276"></a>05276 NX = 0x7f, <span class="comment">// not excited</span>
- <a name="l05277"></a>05277
- <a name="l05278"></a>05278 };
- <a name="l05279"></a>05279
- <a name="l05280"></a>05280
- <a name="l05281"></a>05281 <span class="keyword">typedef</span> <span class="keyword">struct </span>StateInfo {
- <a name="l05282"></a>05282 <span class="keyword">const</span> <span class="keywordtype">char</span> *name;
- <a name="l05283"></a>05283 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> code;
- <a name="l05284"></a>05284 } StateInfo;
- <a name="l05285"></a>05285
- <a name="l05286"></a>05286 <span class="keyword">const</span> <span class="keywordtype">int</span> JVNSTATES = 29;
- <a name="l05287"></a>05287 StateInfo states[JVNSTATES] = {
- <a name="l05288"></a>05288 { <span class="stringliteral">"U"</span>, U },
- <a name="l05289"></a>05289
- <a name="l05290"></a>05290 { <span class="stringliteral">"S"</span>, S },
- <a name="l05291"></a>05291 { <span class="stringliteral">"S0"</span>, S0 },
- <a name="l05292"></a>05292 { <span class="stringliteral">"S1"</span>, S1 },
- <a name="l05293"></a>05293 { <span class="stringliteral">"S00"</span>, S00 },
- <a name="l05294"></a>05294 { <span class="stringliteral">"S01"</span>, S01 },
- <a name="l05295"></a>05295 { <span class="stringliteral">"S10"</span>, S10 },
- <a name="l05296"></a>05296 { <span class="stringliteral">"S11"</span>, S11 },
- <a name="l05297"></a>05297 { <span class="stringliteral">"S000"</span>, S000 },
- <a name="l05298"></a>05298
- <a name="l05299"></a>05299 { <span class="stringliteral">"C00"</span>, C00 },
- <a name="l05300"></a>05300 { <span class="stringliteral">"C10"</span>, C10 },
- <a name="l05301"></a>05301 { <span class="stringliteral">"C01"</span>, C01 },
- <a name="l05302"></a>05302 { <span class="stringliteral">"C11"</span>, C11 },
- <a name="l05303"></a>05303
- <a name="l05304"></a>05304 { <span class="stringliteral">"OR"</span>, OR },
- <a name="l05305"></a>05305 { <span class="stringliteral">"OU"</span>, OU },
- <a name="l05306"></a>05306 { <span class="stringliteral">"OL"</span>, OL },
- <a name="l05307"></a>05307 { <span class="stringliteral">"OD"</span>, OD },
- <a name="l05308"></a>05308
- <a name="l05309"></a>05309 { <span class="stringliteral">"SR"</span>, SR },
- <a name="l05310"></a>05310 { <span class="stringliteral">"SU"</span>, SU },
- <a name="l05311"></a>05311 { <span class="stringliteral">"SL"</span>, SL },
- <a name="l05312"></a>05312 { <span class="stringliteral">"SD"</span>, SD },
- <a name="l05313"></a>05313
- <a name="l05314"></a>05314 { <span class="stringliteral">"ORX"</span>, ORX },
- <a name="l05315"></a>05315 { <span class="stringliteral">"OUX"</span>, OUX },
- <a name="l05316"></a>05316 { <span class="stringliteral">"OLX"</span>, OLX },
- <a name="l05317"></a>05317 { <span class="stringliteral">"ODX"</span>, ODX },
- <a name="l05318"></a>05318
- <a name="l05319"></a>05319 { <span class="stringliteral">"SRX"</span>, SRX },
- <a name="l05320"></a>05320 { <span class="stringliteral">"SUX"</span>, SUX },
- <a name="l05321"></a>05321 { <span class="stringliteral">"SLX"</span>, SLX },
- <a name="l05322"></a>05322 { <span class="stringliteral">"SDX"</span>, SDX },
- <a name="l05323"></a>05323 };
- <a name="l05324"></a>05324
- <a name="l05325"></a>05325
- <a name="l05326"></a>05326 <span class="keyword">static</span> <span class="keywordtype">bool</span> jvnInitialized = <span class="keyword">false</span>;
- <a name="l05327"></a>05327 <span class="keyword">const</span> <span class="keywordtype">char</span> *codeToName[256];
- <a name="l05328"></a>05328
- <a name="l05329"></a>05329
- <a name="l05330"></a>05330 <span class="comment">/* Return 1 if pointed by an excited special transmission state,</span>
- <a name="l05331"></a>05331 <span class="comment"> else returns 0. */</span>
- <a name="l05332"></a>05332 <span class="keywordtype">int</span> sp(Byte right, Byte up, Byte left, Byte down)
- <a name="l05333"></a>05333 {
- <a name="l05334"></a>05334 <span class="keywordflow">return</span> (
- <a name="l05335"></a>05335 (right == SLX) ||
- <a name="l05336"></a>05336 (up == SDX) ||
- <a name="l05337"></a>05337 (left == SRX) ||
- <a name="l05338"></a>05338 (down == SUX)
- <a name="l05339"></a>05339 );
- <a name="l05340"></a>05340 }
- <a name="l05341"></a>05341
- <a name="l05342"></a>05342
- <a name="l05343"></a>05343 <span class="comment">/* Return 1 if pointed by an excited ordinary transmission state,</span>
- <a name="l05344"></a>05344 <span class="comment"> else returns 0. */</span>
- <a name="l05345"></a>05345 <span class="keywordtype">int</span> op(Byte right, Byte up, Byte left, Byte down)
- <a name="l05346"></a>05346 {
- <a name="l05347"></a>05347 <span class="keywordflow">return</span> (
- <a name="l05348"></a>05348 (right == OLX) ||
- <a name="l05349"></a>05349 (up == ODX) ||
- <a name="l05350"></a>05350 (left == ORX) ||
- <a name="l05351"></a>05351 (down == OUX)
- <a name="l05352"></a>05352 );
- <a name="l05353"></a>05353 }
- <a name="l05354"></a>05354
- <a name="l05355"></a>05355
- <a name="l05356"></a>05356 <span class="comment">/* Return 1 if pointed by an excited transmission state (ordinary or special),</span>
- <a name="l05357"></a>05357 <span class="comment"> else returns 0. */</span>
- <a name="l05358"></a>05358 <span class="keywordtype">int</span> osp(Byte right, Byte up, Byte left, Byte down)
- <a name="l05359"></a>05359 {
- <a name="l05360"></a>05360 <span class="keywordflow">return</span> (
- <a name="l05361"></a>05361 (right == OLX) ||
- <a name="l05362"></a>05362 (right == SLX) ||
- <a name="l05363"></a>05363 (up == ODX) ||
- <a name="l05364"></a>05364 (up == SDX) ||
- <a name="l05365"></a>05365 (left == ORX) ||
- <a name="l05366"></a>05366 (left == SRX) ||
- <a name="l05367"></a>05367 (down == OUX) ||
- <a name="l05368"></a>05368 (down == SUX)
- <a name="l05369"></a>05369 );
- <a name="l05370"></a>05370 }
- <a name="l05371"></a>05371
- <a name="l05372"></a>05372
- <a name="l05373"></a>05373 <span class="comment">/* Return 1 if well pointed by an excited ordinary transmission state,</span>
- <a name="l05374"></a>05374 <span class="comment"> else returns 0. */</span>
- <a name="l05375"></a>05375 <span class="keywordtype">int</span> wop(Byte state, Byte right, Byte up, Byte left, Byte down)
- <a name="l05376"></a>05376 {
- <a name="l05377"></a>05377 state &= DM;
- <a name="l05378"></a>05378 <span class="keywordflow">return</span> (
- <a name="l05379"></a>05379 ((right == OLX) &&
- <a name="l05380"></a>05380 (state != RD)) ||
- <a name="l05381"></a>05381 ((up == ODX) &&
- <a name="l05382"></a>05382 (state != UD)) ||
- <a name="l05383"></a>05383 ((left == ORX) &&
- <a name="l05384"></a>05384 (state != LD)) ||
- <a name="l05385"></a>05385 ((down == OUX) &&
- <a name="l05386"></a>05386 (state != DD))
- <a name="l05387"></a>05387 );
- <a name="l05388"></a>05388 }
- <a name="l05389"></a>05389
- <a name="l05390"></a>05390
- <a name="l05391"></a>05391 <span class="comment">/* Return 1 if well pointed by an excited special transmission state,</span>
- <a name="l05392"></a>05392 <span class="comment"> else returns 0. */</span>
- <a name="l05393"></a>05393 <span class="keywordtype">int</span> wsp(Byte state, Byte right, Byte up, Byte left, Byte down)
- <a name="l05394"></a>05394 {
- <a name="l05395"></a>05395 state &= DM;
- <a name="l05396"></a>05396 <span class="keywordflow">return</span> (
- <a name="l05397"></a>05397 ((right == SLX) &&
- <a name="l05398"></a>05398 (state != RD)) ||
- <a name="l05399"></a>05399 ((up == SDX) &&
- <a name="l05400"></a>05400 (state != UD)) ||
- <a name="l05401"></a>05401 ((left == SRX) &&
- <a name="l05402"></a>05402 (state != LD)) ||
- <a name="l05403"></a>05403 ((down == SUX) &&
- <a name="l05404"></a>05404 (state != DD))
- <a name="l05405"></a>05405 );
- <a name="l05406"></a>05406 }
- <a name="l05407"></a>05407
- <a name="l05408"></a>05408
- <a name="l05409"></a>05409 <span class="comment">/* Return 1 if well flanked by an excited (not next excited) confluent state,</span>
- <a name="l05410"></a>05410 <span class="comment"> else returns 0. */</span>
- <a name="l05411"></a>05411 <span class="keywordtype">int</span> wce(Byte state, Byte right, Byte up, Byte left, Byte down)
- <a name="l05412"></a>05412 {
- <a name="l05413"></a>05413 state &= DM;
- <a name="l05414"></a>05414 <span class="keywordflow">return</span> (
- <a name="l05415"></a>05415 (((right == C10) || (right == C11)) &&
- <a name="l05416"></a>05416 (state != RD)) ||
- <a name="l05417"></a>05417 (((up == C10) || (up == C11)) &&
- <a name="l05418"></a>05418 (state != UD)) ||
- <a name="l05419"></a>05419 (((left == C10) || (left == C11)) &&
- <a name="l05420"></a>05420 (state != LD)) ||
- <a name="l05421"></a>05421 (((down == C10) || (down == C11)) &&
- <a name="l05422"></a>05422 (state != DD))
- <a name="l05423"></a>05423 );
- <a name="l05424"></a>05424 }
- <a name="l05425"></a>05425
- <a name="l05426"></a>05426
- <a name="l05427"></a>05427 <span class="comment">/* Return excited confluent state. */</span>
- <a name="l05428"></a>05428 Byte cascade(Byte right, Byte up, Byte left, Byte down)
- <a name="l05429"></a>05429 {
- <a name="l05430"></a>05430 <span class="keywordflow">return</span> ( ((right == OLX) || (up == ODX) || (left == ORX) || (down == OUX)) &&
- <a name="l05431"></a>05431 !((right == OL) || (up == OD) || (left == OR) || (down == OU)) );
- <a name="l05432"></a>05432 }
- <a name="l05433"></a>05433
- <a name="l05434"></a>05434
- <a name="l05435"></a>05435 <span class="comment">/* Return excited confluent state. */</span>
- <a name="l05436"></a>05436 Byte excite(Byte state)
- <a name="l05437"></a>05437 {
- <a name="l05438"></a>05438 <span class="keywordflow">if</span> ((state == C00) || (state == C10)) {
- <a name="l05439"></a>05439 <span class="keywordflow">return</span> C01;
- <a name="l05440"></a>05440 } <span class="keywordflow">else</span> {
- <a name="l05441"></a>05441 <span class="keywordflow">return</span> C11;
- <a name="l05442"></a>05442 } <span class="comment">// if</span>
- <a name="l05443"></a>05443 }
- <a name="l05444"></a>05444
- <a name="l05445"></a>05445
- <a name="l05446"></a>05446 <span class="comment">/* Return decayed confluent state. */</span>
- <a name="l05447"></a>05447 Byte decay(Byte state)
- <a name="l05448"></a>05448 {
- <a name="l05449"></a>05449 <span class="keywordflow">if</span> ((state == C00) || (state == C10)) {
- <a name="l05450"></a>05450 <span class="keywordflow">return</span> C00;
- <a name="l05451"></a>05451 } <span class="keywordflow">else</span> {
- <a name="l05452"></a>05452 <span class="keywordflow">return</span> C10;
- <a name="l05453"></a>05453 } <span class="comment">// if</span>
- <a name="l05454"></a>05454 }
- <a name="l05455"></a>05455
- <a name="l05456"></a>05456
- <a name="l05457"></a>05457 <span class="comment">/*</span>
- <a name="l05458"></a>05458 <span class="comment"></span>
- <a name="l05459"></a>05459 <span class="comment"> Instructions to the construction arm:</span>
- <a name="l05460"></a>05460 <span class="comment"></span>
- <a name="l05461"></a>05461 <span class="comment"> Bits Construct</span>
- <a name="l05462"></a>05462 <span class="comment"></span>
- <a name="l05463"></a>05463 <span class="comment"> 1111 C00</span>
- <a name="l05464"></a>05464 <span class="comment"></span>
- <a name="l05465"></a>05465 <span class="comment"> 10000 OR</span>
- <a name="l05466"></a>05466 <span class="comment"> 10001 OU</span>
- <a name="l05467"></a>05467 <span class="comment"> 1001 OL</span>
- <a name="l05468"></a>05468 <span class="comment"> 1010 OD</span>
- <a name="l05469"></a>05469 <span class="comment"></span>
- <a name="l05470"></a>05470 <span class="comment"> 1011 SR</span>
- <a name="l05471"></a>05471 <span class="comment"> 1100 SU</span>
- <a name="l05472"></a>05472 <span class="comment"> 1101 SL</span>
- <a name="l05473"></a>05473 <span class="comment"> 1110 SD</span>
- <a name="l05474"></a>05474 <span class="comment"></span>
- <a name="l05475"></a>05475 <span class="comment"> */</span>
- <a name="l05476"></a>05476
- <a name="l05477"></a>05477 <span class="keywordtype">void</span> CellEngine::n_jvn29()
- <a name="l05478"></a>05478 {
- <a name="l05479"></a>05479 <span class="keywordflow">if</span> (!jvnInitialized) {
- <a name="l05480"></a>05480 jvnInitialized = <span class="keyword">true</span>;
- <a name="l05481"></a>05481
- <a name="l05482"></a>05482 <span class="keywordtype">int</span> i;
- <a name="l05483"></a>05483 <span class="keywordflow">for</span> (i = 0; i < 256; i++) {
- <a name="l05484"></a>05484 codeToName[i] = NULL;
- <a name="l05485"></a>05485 }
- <a name="l05486"></a>05486 <span class="keywordflow">for</span> (i = 0; i < JVNSTATES; i++) {
- <a name="l05487"></a>05487 codeToName[states[i].code] = states[i].name;
- <a name="l05488"></a>05488 }
- <a name="l05489"></a>05489 }
- <a name="l05490"></a>05490
- <a name="l05491"></a>05491 Byte *front = frontMem;
- <a name="l05492"></a>05492 Byte *back = backMem +
- <a name="l05493"></a>05493 backBorder +
- <a name="l05494"></a>05494 (backBorder * backRowBytes);
- <a name="l05495"></a>05495 Byte *f = front, *b = back;
- <a name="l05496"></a>05496 <span class="keywordtype">long</span> xx, yy;
- <a name="l05497"></a>05497
- <a name="l05498"></a>05498 Byte up, down, left, right, state;
- <a name="l05499"></a>05499 <span class="keywordflow">for</span> (yy = 0;
- <a name="l05500"></a>05500 yy < height;
- <a name="l05501"></a>05501 f += screenRowBytes,
- <a name="l05502"></a>05502 b += backRowBytes,
- <a name="l05503"></a>05503 yy++) {
- <a name="l05504"></a>05504
- <a name="l05505"></a>05505 state = b[-1];
- <a name="l05506"></a>05506 right = b[0];
- <a name="l05507"></a>05507
- <a name="l05508"></a>05508 <span class="keywordflow">for</span> (xx = 0;
- <a name="l05509"></a>05509 xx < width;
- <a name="l05510"></a>05510 xx++) {
- <a name="l05511"></a>05511
- <a name="l05512"></a>05512 up = b[xx + -backRowBytes];
- <a name="l05513"></a>05513 down = b[xx + backRowBytes];
- <a name="l05514"></a>05514 left = state;
- <a name="l05515"></a>05515 state = right;
- <a name="l05516"></a>05516 right = b[xx + 1];
- <a name="l05517"></a>05517
- <a name="l05518"></a>05518 Byte nextstate = state;
- <a name="l05519"></a>05519
- <a name="l05520"></a>05520 <span class="keywordflow">switch</span> (state) {
- <a name="l05521"></a>05521
- <a name="l05522"></a>05522
- <a name="l05523"></a>05523 <span class="keywordflow">case</span> U: <span class="comment">// unexcited state</span>
- <a name="l05524"></a>05524 {
- <a name="l05525"></a>05525 <span class="keywordflow">if</span> ((right == U) && (up == U) && (left == U) && (down == U)) {
- <a name="l05526"></a>05526 <span class="comment">// no change</span>
- <a name="l05527"></a>05527 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05528"></a>05528 nextstate = S;
- <a name="l05529"></a>05529 } <span class="keywordflow">else</span> {
- <a name="l05530"></a>05530 <span class="comment">// no change</span>
- <a name="l05531"></a>05531 } <span class="comment">// if</span>
- <a name="l05532"></a>05532 <span class="keywordflow">break</span>;
- <a name="l05533"></a>05533 } <span class="comment">// case</span>
- <a name="l05534"></a>05534
- <a name="l05535"></a>05535 <span class="keywordflow">case</span> OR: <span class="comment">// ordinary states</span>
- <a name="l05536"></a>05536 <span class="keywordflow">case</span> OU:
- <a name="l05537"></a>05537 <span class="keywordflow">case</span> OL:
- <a name="l05538"></a>05538 <span class="keywordflow">case</span> OD:
- <a name="l05539"></a>05539 <span class="keywordflow">case</span> ORX:
- <a name="l05540"></a>05540 <span class="keywordflow">case</span> OUX:
- <a name="l05541"></a>05541 <span class="keywordflow">case</span> OLX:
- <a name="l05542"></a>05542 <span class="keywordflow">case</span> ODX:
- <a name="l05543"></a>05543 {
- <a name="l05544"></a>05544 <span class="keywordflow">if</span> (sp(right, up, left, down)) {
- <a name="l05545"></a>05545 nextstate = U; <span class="comment">// blank</span>
- <a name="l05546"></a>05546 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (wce(state, right, up, left, down) ||
- <a name="l05547"></a>05547 wop(state, right, up, left, down)) {
- <a name="l05548"></a>05548 nextstate |= EX; <span class="comment">// excited</span>
- <a name="l05549"></a>05549 } <span class="keywordflow">else</span> {
- <a name="l05550"></a>05550 nextstate &= NX; <span class="comment">// not excited</span>
- <a name="l05551"></a>05551 } <span class="comment">// if</span>
- <a name="l05552"></a>05552 <span class="keywordflow">break</span>;
- <a name="l05553"></a>05553 } <span class="comment">// case</span>
- <a name="l05554"></a>05554
- <a name="l05555"></a>05555 <span class="keywordflow">case</span> SR: <span class="comment">// special states</span>
- <a name="l05556"></a>05556 <span class="keywordflow">case</span> SU:
- <a name="l05557"></a>05557 <span class="keywordflow">case</span> SL:
- <a name="l05558"></a>05558 <span class="keywordflow">case</span> SD:
- <a name="l05559"></a>05559 <span class="keywordflow">case</span> SRX:
- <a name="l05560"></a>05560 <span class="keywordflow">case</span> SUX:
- <a name="l05561"></a>05561 <span class="keywordflow">case</span> SLX:
- <a name="l05562"></a>05562 <span class="keywordflow">case</span> SDX:
- <a name="l05563"></a>05563 {
- <a name="l05564"></a>05564 <span class="keywordflow">if</span> (op(right, up, left, down)) {
- <a name="l05565"></a>05565 nextstate = U; <span class="comment">// blank</span>
- <a name="l05566"></a>05566 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (wce(state, right, up, left, down) ||
- <a name="l05567"></a>05567 wsp(state, right, up, left, down)) {
- <a name="l05568"></a>05568 nextstate |= EX; <span class="comment">// excited</span>
- <a name="l05569"></a>05569 } <span class="keywordflow">else</span> {
- <a name="l05570"></a>05570 nextstate &= NX; <span class="comment">// not excited</span>
- <a name="l05571"></a>05571 } <span class="comment">// if</span>
- <a name="l05572"></a>05572 <span class="keywordflow">break</span>;
- <a name="l05573"></a>05573 } <span class="comment">// case</span>
- <a name="l05574"></a>05574
- <a name="l05575"></a>05575 <span class="keywordflow">case</span> C00:
- <a name="l05576"></a>05576 <span class="keywordflow">case</span> C10:
- <a name="l05577"></a>05577 <span class="keywordflow">case</span> C01:
- <a name="l05578"></a>05578 <span class="keywordflow">case</span> C11:
- <a name="l05579"></a>05579 {
- <a name="l05580"></a>05580 <span class="keywordflow">if</span> (sp(right, up, left, down)) {
- <a name="l05581"></a>05581 nextstate = U; <span class="comment">// blank</span>
- <a name="l05582"></a>05582 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cascade(right, up, left, down)) {
- <a name="l05583"></a>05583 nextstate = excite(state);
- <a name="l05584"></a>05584 } <span class="keywordflow">else</span> {
- <a name="l05585"></a>05585 nextstate = decay(state);
- <a name="l05586"></a>05586 } <span class="comment">// if</span>
- <a name="l05587"></a>05587 <span class="keywordflow">break</span>;
- <a name="l05588"></a>05588 } <span class="comment">// case</span>
- <a name="l05589"></a>05589
- <a name="l05590"></a>05590 <span class="keywordflow">case</span> S: <span class="comment">// sensitized state</span>
- <a name="l05591"></a>05591 {
- <a name="l05592"></a>05592 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05593"></a>05593 nextstate = S1;
- <a name="l05594"></a>05594 } <span class="keywordflow">else</span> {
- <a name="l05595"></a>05595 nextstate = S0;
- <a name="l05596"></a>05596 } <span class="comment">// if</span>
- <a name="l05597"></a>05597 <span class="keywordflow">break</span>;
- <a name="l05598"></a>05598 } <span class="comment">// case</span>
- <a name="l05599"></a>05599
- <a name="l05600"></a>05600 <span class="keywordflow">case</span> S0: <span class="comment">// sensitized state</span>
- <a name="l05601"></a>05601 {
- <a name="l05602"></a>05602 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05603"></a>05603 nextstate = S01;
- <a name="l05604"></a>05604 } <span class="keywordflow">else</span> {
- <a name="l05605"></a>05605 nextstate = S00;
- <a name="l05606"></a>05606 } <span class="comment">// if</span>
- <a name="l05607"></a>05607 <span class="keywordflow">break</span>;
- <a name="l05608"></a>05608 } <span class="comment">// case</span>
- <a name="l05609"></a>05609
- <a name="l05610"></a>05610 <span class="keywordflow">case</span> S1: <span class="comment">// sensitized state</span>
- <a name="l05611"></a>05611 {
- <a name="l05612"></a>05612 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05613"></a>05613 nextstate = S11;
- <a name="l05614"></a>05614 } <span class="keywordflow">else</span> {
- <a name="l05615"></a>05615 nextstate = S10;
- <a name="l05616"></a>05616 } <span class="comment">// if</span>
- <a name="l05617"></a>05617 <span class="keywordflow">break</span>;
- <a name="l05618"></a>05618 } <span class="comment">// case</span>
- <a name="l05619"></a>05619
- <a name="l05620"></a>05620 <span class="keywordflow">case</span> S00: <span class="comment">// sensitized state</span>
- <a name="l05621"></a>05621 {
- <a name="l05622"></a>05622 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05623"></a>05623 nextstate = OL;
- <a name="l05624"></a>05624 } <span class="keywordflow">else</span> {
- <a name="l05625"></a>05625 nextstate = S000;
- <a name="l05626"></a>05626 } <span class="comment">// if</span>
- <a name="l05627"></a>05627 <span class="keywordflow">break</span>;
- <a name="l05628"></a>05628 } <span class="comment">// case</span>
- <a name="l05629"></a>05629
- <a name="l05630"></a>05630 <span class="keywordflow">case</span> S01: <span class="comment">// sensitized state</span>
- <a name="l05631"></a>05631 {
- <a name="l05632"></a>05632 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05633"></a>05633 nextstate = SR;
- <a name="l05634"></a>05634 } <span class="keywordflow">else</span> {
- <a name="l05635"></a>05635 nextstate = OD;
- <a name="l05636"></a>05636 } <span class="comment">// if</span>
- <a name="l05637"></a>05637 <span class="keywordflow">break</span>;
- <a name="l05638"></a>05638 } <span class="comment">// case</span>
- <a name="l05639"></a>05639
- <a name="l05640"></a>05640 <span class="keywordflow">case</span> S10: <span class="comment">// sensitized state</span>
- <a name="l05641"></a>05641 {
- <a name="l05642"></a>05642 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05643"></a>05643 nextstate = SL;
- <a name="l05644"></a>05644 } <span class="keywordflow">else</span> {
- <a name="l05645"></a>05645 nextstate = SU;
- <a name="l05646"></a>05646 } <span class="comment">// if</span>
- <a name="l05647"></a>05647 <span class="keywordflow">break</span>;
- <a name="l05648"></a>05648 } <span class="comment">// case</span>
- <a name="l05649"></a>05649
- <a name="l05650"></a>05650 <span class="keywordflow">case</span> S11: <span class="comment">// sensitized state</span>
- <a name="l05651"></a>05651 {
- <a name="l05652"></a>05652 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05653"></a>05653 nextstate = C00;
- <a name="l05654"></a>05654 } <span class="keywordflow">else</span> {
- <a name="l05655"></a>05655 nextstate = SD;
- <a name="l05656"></a>05656 } <span class="comment">// if</span>
- <a name="l05657"></a>05657 <span class="keywordflow">break</span>;
- <a name="l05658"></a>05658 } <span class="comment">// case</span>
- <a name="l05659"></a>05659
- <a name="l05660"></a>05660 <span class="keywordflow">case</span> S000: <span class="comment">// sensitized state</span>
- <a name="l05661"></a>05661 {
- <a name="l05662"></a>05662 <span class="keywordflow">if</span> (osp(right, up, left, down)) {
- <a name="l05663"></a>05663 nextstate = OU;
- <a name="l05664"></a>05664 } <span class="keywordflow">else</span> {
- <a name="l05665"></a>05665 nextstate = OR;
- <a name="l05666"></a>05666 } <span class="comment">// if</span>
- <a name="l05667"></a>05667 <span class="keywordflow">break</span>;
- <a name="l05668"></a>05668 } <span class="comment">// case</span>
- <a name="l05669"></a>05669
- <a name="l05670"></a>05670 <span class="keywordflow">default</span>:
- <a name="l05671"></a>05671 {
- <a name="l05672"></a>05672 nextstate = U;
- <a name="l05673"></a>05673 <span class="keywordflow">break</span>;
- <a name="l05674"></a>05674 } <span class="comment">// case</span>
- <a name="l05675"></a>05675
- <a name="l05676"></a>05676 } <span class="comment">// switch</span>
- <a name="l05677"></a>05677
- <a name="l05678"></a>05678 f[xx] = nextstate;
- <a name="l05679"></a>05679
- <a name="l05680"></a>05680 } <span class="comment">// for xx</span>
- <a name="l05681"></a>05681 } <span class="comment">// for yy</span>
- <a name="l05682"></a>05682
- <a name="l05683"></a>05683 }
- <a name="l05684"></a>05684
- </pre></div></div>
- <hr size="1"><address style="text-align: right;"><small>Generated on Wed Feb 2 09:19:21 2011 for Micropolis by
- <a href="http://www.doxygen.org/index.html">
- <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
- </body>
- </html>