<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8692544567824462186</id><updated>2011-11-27T18:44:03.404-05:00</updated><category term='mobile'/><category term='building'/><category term='console'/><category term='ngaro'/><category term='io'/><category term='retro'/><category term='bugfixes'/><category term='iphone'/><category term='package'/><category term='javascript'/><category term='java'/><category term='documentation'/><category term='web'/><category term='classes'/><category term='windows'/><category term='performance'/><category term='modules'/><category term='image'/><category term='release'/><category term='wm5'/><category term='svn'/><category term='library'/><title type='text'>RetroNews</title><subtitle type='html'>News from the world of Retro</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-5710408576570058144</id><published>2010-05-16T14:59:00.002-04:00</published><updated>2010-05-16T15:15:06.163-04:00</updated><title type='text'>Parsing Prefixes</title><content type='html'>&lt;p&gt;Luke (&lt;em&gt;docl&lt;/em&gt; in the #retro irc channel) has contributed an update to the prefix handling code that adds support for parsing prefixes. This allows for some interesting stuff we couldn't do before:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  : __$ ( $-n ) hex &gt;number decimal ;&lt;br /&gt;  : __% ( $-n ) binary &gt;number decimal ;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;These allow for parsing numbers as hex or binary, based on a prefix. Luke has gone much further though:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;{&lt;br /&gt;   variable end&lt;br /&gt;   : pad 1024 here + ;&lt;br /&gt;   : keep (  -  ) @compiler 0; drop keepString literal, ;&lt;br /&gt;   : &gt;pad ( $-$ ) pad over getLength 1+ copy pad keep ;&lt;br /&gt;   : &gt;$   ( n-  ) !@end end ++ ;&lt;br /&gt;   : "?   (  -f ) @end @1- char: " = ;&lt;br /&gt;   : chop ( $-$ ) end -- 0 !@end ;&lt;br /&gt;   : ";   ( $-$ ) "? if chop &gt;pad rdrop ;then ;&lt;br /&gt;   : __"  ( "-a )&lt;br /&gt;       dup dup getLength + !end&lt;br /&gt;       "; 32 &gt;$ repeat "; key dup emit &gt;$ again ; parsing prefix&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;With this, we can do strings without a leading space:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  : hello ( - ) "hello, world!" type cr ;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Luke's &lt;span style="font-family:courier new;"&gt;__"&lt;/span&gt; is now part of RetroForth 10.6. I've also added &lt;span style="font-family:courier new;"&gt;__$&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;__#&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;__%&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;__'&lt;/span&gt; (parsing hex, decimal, binary, and single characters). This restores more of the functionality dropped between 9.3 and 10.0, and adds some new features to the table.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-5710408576570058144?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/5710408576570058144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=5710408576570058144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5710408576570058144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5710408576570058144'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/05/parsing-prefixes.html' title='Parsing Prefixes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-7156516384800138253</id><published>2010-05-02T18:12:00.003-04:00</published><updated>2010-05-02T18:31:45.881-04:00</updated><title type='text'>Prefixes</title><content type='html'>The Rx Core now has prefixes, and they're better than ever before. For those who aren't familiar with them from Retro 9.x, a prefix is a single character that is placed before a name. The notfound handler will check to see if a word exists without the prefix; if so, it passes the xt of the word on the stack to a prefix handler word.&lt;br /&gt;&lt;br /&gt;Ok, so in Retro we have five basic prefixes: &lt;span style="font-weight:bold;"&gt;@ ! + - &amp;amp;&lt;/span&gt;&lt;span&gt; these correspond to fetch, store, increment by, decrement by, and address of.&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;@&lt;/b&gt; and &lt;b&gt;!&lt;/b&gt; correspond to &lt;b&gt;@&lt;/b&gt; and &lt;b&gt;!&lt;/b&gt; (pretty obvious); &lt;b&gt;+&lt;/b&gt; and &lt;b&gt;-&lt;/b&gt; corespond to &lt;b&gt;+!&lt;/b&gt; and &lt;b&gt;-!&lt;/b&gt;; and &lt;b&gt;&amp;amp;&lt;/b&gt; corresponds to either &lt;b&gt;'&lt;/b&gt; or &lt;b&gt;[']&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Their usage is intended to help cleanup code flow a bit. We can do things like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  &amp;amp;words execute&lt;/b&gt; &lt;i&gt;( execute 'words' )&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  @here&lt;/b&gt; &lt;i&gt;( return the value at 'here' )&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  @foo +bar&lt;/b&gt; &lt;i&gt;( increment 'bar' by the value in 'foo' )&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;If you want to define more prefixes, it's easy to do. For instance, say we want a prefix that returns the dictionary header of a word. &lt;b&gt;notfound&lt;/b&gt; will give us the xt, so we can lay down a stub:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;b&gt;  : __~ ( a-d ) ; immediate prefix&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Note the two _ characters. This is a common attribute of prefix names: the must be three characters long, and start with two underscores. The word &lt;b&gt;prefix&lt;/b&gt; moves our word to the &lt;b&gt;prefixes&lt;/b&gt; vocabulary. This isn't necessary, but does prove useful by making it easy to disable prefixes globally.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, so filling in the details:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;  : __~ ( a-d ) xt-&gt;d ; immediate prefix&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;At first glance this looks ok. Testing it reveals a problem:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;b&gt;  : __~ ( a-d ) xt-&gt;d ; immediate prefix&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  : foo ~words ;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  foo .s&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  reset&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  foo .s&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;To fix this we need to compile as a literal into a definition. Still pretty easy as far as things go because &lt;b&gt;.data&lt;/b&gt; will do this for us:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;b&gt;  : __~ ( a-d ) xt-&gt;d .data ; immediate prefix&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  : foo ~words ;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  foo .s&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  reset&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;  foo .s&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Now we have a working prefix. Take a look at at the implementation of the default prefixes to get ideas on implementing more complex ones. Careful use can enable significant cleanups to messy code, but in some cases it will be better to use discrete words to aid overall readability. Like all advanced features, prefixes should be learned, then used where they will help.&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-7156516384800138253?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/7156516384800138253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=7156516384800138253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7156516384800138253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7156516384800138253'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/05/prefixes.html' title='Prefixes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3522776644383802296</id><published>2010-05-01T20:51:00.001-04:00</published><updated>2010-05-01T20:53:56.185-04:00</updated><title type='text'>Fossil and Captchas</title><content type='html'>I've begun moving to Fossil for my version control needs. &lt;br /&gt;&lt;br /&gt;Rx Core: http://rx-core.org/dev/rx.fossil&lt;br /&gt;&lt;br /&gt;Retro Forth: http://rx-core.org/dev/retroforth.fossil&lt;br /&gt;&lt;br /&gt;The pastebin was clogged with spam posts. I deleted over 2k of them, and added a captcha to hopefully reduce the number of new ones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3522776644383802296?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3522776644383802296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3522776644383802296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3522776644383802296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3522776644383802296'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/05/fossil-and-captchas.html' title='Fossil and Captchas'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-6907092870838502054</id><published>2010-04-24T22:23:00.002-04:00</published><updated>2010-04-24T22:27:11.136-04:00</updated><title type='text'>Simplifying Things</title><content type='html'>Now that the VM code has been condensed and simplified, I'm turning my focus to the image. No new features, but I want a simple build process, with things bound a bit more tightly.&lt;br /&gt;&lt;br /&gt;The work in progress can be found at http://drop.io/retroforth&lt;br /&gt;&lt;br /&gt;So far I have a working VM, single file for building a new base image, and makefile to automate the process. I've moved files, sockets, and canvas words into this, so the core stuff now includes all the basics needed. I'll probably move 'words' here as well.&lt;br /&gt;&lt;br /&gt;Overall it seems to be working out nicely, so I'll keep going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-6907092870838502054?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/6907092870838502054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=6907092870838502054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6907092870838502054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6907092870838502054'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/simplifying-things.html' title='Simplifying Things'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-4817880845129414932</id><published>2010-04-21T22:48:00.002-04:00</published><updated>2010-04-21T22:54:23.686-04:00</updated><title type='text'>Shrinking the VM</title><content type='html'>I'm working on a simplified C implementation of Ngaro; no major changes, but I'm hoping for something a bit easier to use as a base for future experiments. (And hopefully a bit easier to adapt as a skeleton for new ports, etc).&lt;br /&gt;&lt;br /&gt;The new code is one file (retro.c), and is 841 lines long. It still has all the major stuff (console i/o, file i/o, sockets, etc), but drops the statistics tracking, endian conversion, and runtime disassembly tracing. It works nicely on my OS X box; I'll be testing on other platforms in the near future.&lt;br /&gt;&lt;br /&gt;Expect to see this checked into the repository within the next day or so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-4817880845129414932?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/4817880845129414932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=4817880845129414932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/4817880845129414932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/4817880845129414932'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/shrinking-vm.html' title='Shrinking the VM'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-144990864728595156</id><published>2010-04-17T22:18:00.001-04:00</published><updated>2010-04-17T22:55:01.867-04:00</updated><title type='text'>Online Demonstration</title><content type='html'>It's live and all links point to it now.&lt;br /&gt;&lt;br /&gt;The code for rebuilding the retroImage.js is now in the repository.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-144990864728595156?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/144990864728595156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=144990864728595156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/144990864728595156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/144990864728595156'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/online-demonstration.html' title='Online Demonstration'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3163274072359557966</id><published>2010-04-17T10:41:00.002-04:00</published><updated>2010-04-17T12:10:29.895-04:00</updated><title type='text'>Preparing to deploy updated online demonstration</title><content type='html'>One of the more fun parts of Retro is the online demo. Thanks to the Ngaro JS implementation, it's really easy to test Retro without needing to install it.&lt;br /&gt;&lt;br /&gt;Unfortunately, the existing demo is now quite old. It's running a 10.2/10.3 hybrid image, which is far out of date. As part of the work done on 10.5, the various forthlets have been updated to run on the latest image, and I'm now doing final tests of a new image + current Ngaro at http://rx-core.org/jsvm/&lt;br /&gt;&lt;br /&gt;Soon this will be rolled out to all mirrors and replace the existing demos. Also, it'll be integrated into the repo, so deploying updates should be easier in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3163274072359557966?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3163274072359557966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3163274072359557966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3163274072359557966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3163274072359557966'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/preparing-to-deploy-updated-online.html' title='Preparing to deploy updated online demonstration'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2200004266700290162</id><published>2010-04-17T10:17:00.002-04:00</published><updated>2010-04-17T10:41:08.451-04:00</updated><title type='text'>Decompiling code in 9.2.10</title><content type='html'>&lt;div&gt;&lt;b&gt;Disclaimer&lt;/b&gt;&lt;b&gt;:&lt;/b&gt; &lt;i&gt;The following code sucks. Badly. Please don't consider this typical of what I write; it's a quick hack I threw together in the last hour or so using parts of earlier code written many years ago.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the start of the decompiler for Retro 9.2.10. It's based in part on a decompiler from 8.x, and has a few bits from earlier releases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: h. ( n- ) base @ swap hex . base ! ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Displays numbers in hexadecimal format, saving and restoring the &lt;b&gt;base&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: lit 1 ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;' lit 1+ @ ' lit 1+ + cell+ constant dolit&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This one provides a constant pointing to the internal routine that pushes numbers to the stack. It's definitely not portable, but works. A bit of explanation is in order. Retro 9.x and earlier were coded in assembly for x86 processors. The compiled code is (generally) a series of call, jump, and return instructions. But the calls/jumps are relative, so we can't just fetch the target, we need to adjust it to the actual base address. So:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Compiled code is basically:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  call dolit&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dd 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  ret&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Call is one byte on x86, so:  &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;' lit 1+&lt;/span&gt; will get us to the target (4 bytes). We &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;@&lt;/span&gt; this, then add the address of the call target (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;' lit 1+ +&lt;/span&gt;), and finally adjust by the size of the call target (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cell+&lt;/span&gt;). Kind of messy, but it works.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;variable xt&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;variable d&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;variable flag&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: scan ( - )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  last repeat @ 0; dup :xt @ xt @ =if d ! -1 flag ! ;then again&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: xt-&gt;d ( a-df )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  xt ! 0 flag ! 0 d ! scan d @ flag @ ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To resolve names, we have a word to get the dictionary entry and a success/failure flag from a base address. The use of variables here is due to laziness.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;variable addr&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This holds the current address being decompiled.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: shift ( n- ) addr +! ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Advance the addr variable by some arbitrary number of bytes. Each handler will invoke this to cover the byte range being decompiled.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: .name ( - )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  1 shift here addr @ @ addr @ + cell+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup dolit =if ." &lt;&gt;" drop cr ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup xt-&gt;d&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  if :name unpack type cr ;then drop h. cr ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An ugly way to display either a word name or the address being called/jumped to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: tab 9 emit ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: comment tab ." ( " later ."  )" cr ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Output formatting. Ideally &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;tab&lt;/span&gt; would be more intelligent and try to keep columns lined up properly, but that's not crucial. The &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;comment&lt;/span&gt; word uses later to wrap output in parenthesis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new', serif; "&gt;: call,  ." call "  .name 4 shift ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: jmp,   ." jmp  "  .name 4 shift ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new', serif; "&gt;: ret,   ." ret"    cr  1 shift ;                              &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: lodsd, ." lodsd" tab  comment ." drop"   1 shift ;          &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: inc,   ." inc eax"    comment ." 1+"     1 shift ;          &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: dec,   ." dec eax"    comment ." 1-"     1 shift ;          &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: stc,   ." stc"        comment ." false"  1 shift ;          &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: clc,   ." clc"        comment ." true"   1 shift ;          &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: push,  ." push eax"       1 shift comment ." &gt;r";&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: mov,   ." mov [esi],eax"  2 shift cr ;                    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: pop,   ." pop eax"        1 shift comment ." r&gt;" ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: or,    ." or eax, eax"    2 shift comment ." or" ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: swap,  1+ ." xchg eax, [esi]"  comment ." swap"  2 shift ;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: nip,   2 + ." add esi, 4"      comment ." nip"   3 shift ;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: .name 1 shift here addr @ @ addr @ + cell+ h. ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: jz,    ." jz   "  .name  ." &lt;&gt;if" 1 shift cr ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: jng,   ." jng  "  .name  ." &lt;if"&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: jnz,   ." jnz  "  .name  ." =if" 1 shift cr ;                     &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: jnl,   ." jnl  "  .name  ." &gt;if" 1 shift cr ;                     &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: cmp,   ." cmp eax, [esi]" 1+ comment ." (if)"   2 shift ;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: nop,   ." nop"               comment ." then"   1 shift ;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: add,   ." add eax,[esi]"     comment             2 shift ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: sub,   ." sub [esi],eax"     comment             2 shift ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: mul,   ." mul dword [esi]"   comment             2 shift ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: show_it dup c@ &gt;r dup 1+ r type r&gt; dup 1+ shift + ;         &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: string, ." string"      tab  comment             show_it ;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;A bunch of words to handle various sequences used. This was all ripped (with minor changes) from 8.x.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: lookup ( n-n )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  addr @ h. tab&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $e8 =if call,  ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $e9 =if jmp,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $c3 =if ret,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $ad =if lodsd, ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $40 =if inc,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $48 =if dec,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $f9 =if stc,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $f8 =if clc,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $50 =if push,  ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $89 =if mov,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $58 =if pop,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $09 =if or,    ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $87 =if swap,  ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $83 =if nip,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $74 =if jz,    ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $7e =if jng,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $75 =if jnz,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $7d =if jnl,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $3b =if cmp,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $90 =if nop,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $03 =if add,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $29 =if sub,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $f7 =if mul,   ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dup $eb =if string,  ;then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  ." Unknown: " dup h. 1 shift cr ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I really hate this part. This is a huge if/then block to call the handlers for each starting byte. It'd be better to use a jump table (which was done in 8.x), but this was quicker to implement for testing purposes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: see ( n"- ) ' addr ! for addr @ c@ lookup drop next ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A wrapper word to invoke the decompiler. Pass it the number of instructions to decompile, and follow it by the name of a word:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: big 1 2 + . ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;5 foo big&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, so that's that. It's at least partially functional, but still has lots of work needed. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2200004266700290162?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2200004266700290162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2200004266700290162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2200004266700290162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2200004266700290162'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/decompiling-code-in-9210.html' title='Decompiling code in 9.2.10'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-6794196742437344809</id><published>2010-04-12T22:54:00.002-04:00</published><updated>2010-04-13T00:02:30.593-04:00</updated><title type='text'>A bit of life in 9.x</title><content type='html'>A user on the comp.lang.forth is working on a fork of the 9.x codebase with a focus on moving even more out of the initial assembly kernel. While I'm not supporting continued use of 9.x; I am writing a crude decompiler/disassembler for use with the fork.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-6794196742437344809?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/6794196742437344809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=6794196742437344809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6794196742437344809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6794196742437344809'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/bit-of-life-in-9x.html' title='A bit of life in 9.x'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-133837034763431238</id><published>2010-04-11T09:24:00.002-04:00</published><updated>2010-04-11T09:49:08.479-04:00</updated><title type='text'>More on Prefixes</title><content type='html'>In the last post, I briefly touched on the overall implementation of prefixes. I'll try to cover them in a bit more detail now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Retro's listener will call &lt;b&gt;notfound&lt;/b&gt; when a word name is not found, and when the input token can not be converted to a number in the current &lt;b&gt;base&lt;/b&gt;. Prior to 10.6, &lt;b&gt;notfound&lt;/b&gt; just displays some sort of error message. In 10.6, it has been rewritten and extended to do additional checks related to prefixes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The code:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;label: ___   " ___" $,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: get      ( $-$  ) dup, @, ___ # 2 # +, !, 1+, ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: try      (  -   )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   TIB # get find&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   if d-&gt;xt @, ___ # find&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;      if dup, d-&gt;xt @, swap, d-&gt;class @, with-class&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;         pop, pop, 2drop ; then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;       drop,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  then drop, ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: filter   (  -   ) TIB # getLength 2 # &gt;if try then ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: notfound (  -   ) filter char: ? # emit cr ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, first thing to note is that the syntax looks a bit unusual. This is written using the metacompiler, which introduces some new rules:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;t:&lt;/b&gt; instead of &lt;b&gt;:&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;#&lt;/b&gt; following numbers/constants&lt;/li&gt;&lt;li&gt;&lt;b&gt;,&lt;/b&gt; following opcode names&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Getting this out of the way, we can proceed to break it down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;label: ___   " ___" $,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This line creates a constant pointing to a string containing three underscores. This string is modified later, with the last underscore replaced by a prefix character.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: get      ( $-$  ) dup, @, ___ # 2 # +, !, 1+, ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;get&lt;/b&gt; receives a string from the stack; moves the first character into the last position of &lt;b&gt;___&lt;/b&gt; and then returns the rest of the provided string.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: try      (  -   )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   TIB # get find&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   if d-&gt;xt @, ___ # find&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;      if dup, d-&gt;xt @, swap, d-&gt;class @, with-class&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;         pop, pop, 2drop ; then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;       drop,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  then drop, ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the largest part of the prefix handling. It passes the token in &lt;b&gt;tib&lt;/b&gt; to &lt;b&gt;get&lt;/b&gt; and then searches for the name (sans the prefix character) in the dictionary.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If found, the xt of the word is returned, and a search is done for &lt;b&gt;__X&lt;/b&gt;, where &lt;b&gt;&lt;i&gt;X&lt;/i&gt;&lt;/b&gt; is the prefix character. If this is found, the xt and class of the prefix handler are pushed to the stack, and &lt;b&gt;with-class&lt;/b&gt; is called to execute everything. Also, if found, control is passed directly back to the listener.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If not found, the stack is cleaned up and control passes back to the &lt;b&gt;notfound&lt;/b&gt; handler.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: filter   (  -   ) TIB # getLength 2 # &gt;if try then ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To ensure that the prefixes are not searched for with single character tokens we have a simple &lt;b&gt;filter&lt;/b&gt; word. A subtle note here: &lt;b&gt;&gt;if&lt;/b&gt; and &lt;b&gt;&lt;if&gt;&lt;/if&gt;&lt;/b&gt; in Retro are &lt;i&gt;inclusive&lt;/i&gt;, so this is actually checking for &lt;i&gt;2 or greater length&lt;/i&gt;, &lt;b&gt;not&lt;/b&gt; &lt;i&gt;length greater than 2&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: notfound (  -   ) filter char: ? # emit cr ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And finally the &lt;b&gt;notfound&lt;/b&gt; word itself. It calls &lt;b&gt;filter&lt;/b&gt;, which then calls &lt;b&gt;try&lt;/b&gt;, and so on. If the token + prefix are not found, a ? is displayed and control is returned to the listener.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, now for the prefixes that are provided by default:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: __&amp;amp; ( a-n ) .data ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;b&gt;Usage:&lt;/b&gt;  &amp;amp;name&lt;/div&gt;&lt;div&gt;&lt;b&gt;Action:&lt;/b&gt; Return the address (xt) of the word.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Similar To:&lt;/b&gt; ['] name&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: __+ ( a-  ) .data ' +! # .word ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Usage:&lt;/b&gt;  +name&lt;/div&gt;&lt;div&gt;&lt;b&gt;Action:&lt;/b&gt; Add a value from the stack to the value stored at name's xt field.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Similar To:&lt;/b&gt; name +!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: __- ( a-  ) .data ' -! # .word ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Usage:&lt;/b&gt;  -name&lt;/div&gt;&lt;div&gt;&lt;b&gt;Action:&lt;/b&gt; Subtract a value from the value stored at name's xt field.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Similar To:&lt;/b&gt; name -!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: __@ ( a-n ) .data ' @  # .word ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Usage:&lt;/b&gt;  @name&lt;/div&gt;&lt;div&gt;&lt;b&gt;Action:&lt;/b&gt; Return the value stored at the address (xt) field of the word.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Similar To:&lt;/b&gt; name @&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t: __! ( a-n ) .data ' !  # .word ;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Usage:&lt;/b&gt;  !name&lt;/div&gt;&lt;div&gt;&lt;b&gt;Action:&lt;/b&gt; Store a value to the address field of a name&lt;/div&gt;&lt;div&gt;&lt;b&gt;Similar To:&lt;/b&gt; name !&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to create your own prefixes, you can do this as well. For a simple example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;: __~ ( a- ) .data ` :see ; immediate prefix&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will create a new ~ prefix that shows decompiled code for the word. Note the &lt;b&gt;prefix&lt;/b&gt; at the end of the definition. This is optional, but moves the new prefix handler to the &lt;b&gt;prefixes&lt;/b&gt; vocabulary, allowing it to be grouped cleanly with the other prefixes.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-133837034763431238?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/133837034763431238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=133837034763431238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/133837034763431238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/133837034763431238'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/more-on-prefixes.html' title='More on Prefixes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-5185967338941576601</id><published>2010-04-10T21:10:00.002-04:00</published><updated>2010-04-10T21:35:29.402-04:00</updated><title type='text'>Prefixes</title><content type='html'>I introduced prefixes in the 9.x releases. They were a basic shortcut technique: add a single character before a name to alter the behavior. The original code used a non-editable table for determining which characters were valid and the new behaviors the prefixes would introduce. When adding prefixes to the current Retro, I took a different approach.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Prefixes are handled by words, with a consistent naming format: &lt;b&gt;__&lt;i&gt;X&lt;/i&gt;&lt;/b&gt; where &lt;i&gt;X&lt;/i&gt; is the prefix character. I also added a &lt;b&gt;prefixes&lt;/b&gt; vocabulary, allowing the prefixes to be toggled on and off simply.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;notfound&lt;/b&gt; error handler was extended to search for prefix words if a name isn't found in the dictionary. If the prefix is found, and the rest of the name is found, the word is passed to the prefix handler.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The end result is a clean, extensible way of handling, adding, and replacing prefixes. Plus, they can easily be disabled or enabled as desired.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-5185967338941576601?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/5185967338941576601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=5185967338941576601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5185967338941576601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5185967338941576601'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/prefixes.html' title='Prefixes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-4374588253772691820</id><published>2010-04-10T16:16:00.002-04:00</published><updated>2010-04-10T18:21:49.089-04:00</updated><title type='text'>The State of the Forth - April 2010</title><content type='html'>Though I haven't updated this blog in almost a year, I am still actively working on Retro.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The stable release is now 10.5. Since the last update here, Retro has seen a lot of major changes:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;profiling&lt;/li&gt;&lt;li&gt;files&lt;/li&gt;&lt;li&gt;sockets&lt;/li&gt;&lt;li&gt;fully cross-platform canvas (javascript, sdl)&lt;/li&gt;&lt;li&gt;nestable vocabularies&lt;/li&gt;&lt;li&gt;time device&lt;/li&gt;&lt;li&gt;reorganized library&lt;/li&gt;&lt;li&gt;new examples&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Platform support currently stands at:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Windows (via Mono and .NET)&lt;/li&gt;&lt;li&gt;Cellphones (J2ME/MIDP)&lt;/li&gt;&lt;li&gt;Linux&lt;/li&gt;&lt;li&gt;BSD&lt;/li&gt;&lt;li&gt;BeOS&lt;/li&gt;&lt;li&gt;MacOS X&lt;/li&gt;&lt;li&gt;AIX&lt;/li&gt;&lt;li&gt;iPhoneOS (jailbroke devices)&lt;/li&gt;&lt;li&gt;Browsers (Opera, FireFox, Safari, Chrome)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;There is also an Emacs Lisp implementation that can run 10.4 and older images; I hope to have it updated for 10.6 and beyond in the near future.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;10.6 (in the new git repository) has added support for word prefixes, and some cleanups to the core.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-4374588253772691820?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/4374588253772691820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=4374588253772691820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/4374588253772691820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/4374588253772691820'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2010/04/state-of-forth-april-2010.html' title='The State of the Forth - April 2010'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3799255728533737388</id><published>2009-06-04T14:35:00.002-04:00</published><updated>2009-06-04T14:44:47.736-04:00</updated><title type='text'>10.1, and some new stuff</title><content type='html'>10.1 is out. Nothing major, but it has some cleanups and bugfixes. It's worth switching to IMO.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Beyond that, 10.2 is being worked on. The development branches (now with live snapshots) has a .NET implementation of the VM, reduced memory requirements, new tools to shrink a saved image, and the start of a debugging tool (already capable of decompiling most compiled code). In the optional modules, I've started work on extending the compiler to generate smaller, faster code.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3799255728533737388?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3799255728533737388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3799255728533737388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3799255728533737388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3799255728533737388'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2009/06/101-and-some-new-stuff.html' title='10.1, and some new stuff'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-8941601805436008617</id><published>2009-04-28T13:11:00.002-04:00</published><updated>2009-04-28T13:15:14.969-04:00</updated><title type='text'>does&gt;</title><content type='html'>&lt;span class="Apple-style-span"   style="  line-height: 14px; font-family:Monaco;font-size:11px;"&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 115%/normal Monaco, 'Courier New', monospace; line-height: 1.4em; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; "&gt;&lt;div class="line" id="LC1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;A few days ago, someone in the IRC channel asked about implementing does&gt;&lt;/div&gt;&lt;div class="line" id="LC1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;The code below provides an implementation, though it does require my extensions&lt;/div&gt;&lt;div class="line" id="LC1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;package to be loaded first.&lt;/div&gt;&lt;div class="line" id="LC1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;{{&lt;/div&gt;&lt;div class="line" id="LC2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;  : reclass last @ d-&gt;class ! ;&lt;/div&gt;&lt;div class="line" id="LC3" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;  : .does compiler @ -1 =if swap literal, compile pop drop ;; then drop ;&lt;/div&gt;&lt;div class="line" id="LC4" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;---reveal---&lt;/div&gt;&lt;div class="line" id="LC5" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;  macro: does&gt;&lt;/div&gt;&lt;div class="line" id="LC6" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;    1 , here 0 ,         ( compile address of code after does&gt; [will be patched] )&lt;/div&gt;&lt;div class="line" id="LC7" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;    ['] reclass compile  ( compile a call to reclass, which assigns the code     )&lt;/div&gt;&lt;div class="line" id="LC8" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;                         ( after does&gt; as the class handler for the word.        )&lt;/div&gt;&lt;div class="line" id="LC9" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;    ['] ;; execute       ( compile an exit, so no code following does&gt; will be   )&lt;/div&gt;&lt;div class="line" id="LC10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;                         ( executed when the create/does&gt; sequence is run.       )&lt;/div&gt;&lt;div class="line" id="LC11" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;    here swap !          ( Patch the address from the 1 , here 0 , line to the   )&lt;/div&gt;&lt;div class="line" id="LC12" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;                         ( actual start of the code for the does&gt; action.        )&lt;/div&gt;&lt;div class="line" id="LC13" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;    here literal,        ( Compile the address following does&gt; as a literal so   )&lt;/div&gt;&lt;div class="line" id="LC14" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;                         ( it can be used by the .does class.                    )&lt;/div&gt;&lt;div class="line" id="LC15" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;    ['] .does compile    ( And finally, compile a call to the .does class, which )&lt;/div&gt;&lt;div class="line" id="LC16" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;                         ( will take care of compile-time and interpret-time bits)&lt;/div&gt;&lt;div class="line" id="LC17" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;  ;&lt;/div&gt;&lt;div class="line" id="LC18" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;}}&lt;/div&gt;&lt;div class="line" id="LC18" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-8941601805436008617?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/8941601805436008617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=8941601805436008617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/8941601805436008617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/8941601805436008617'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2009/04/does.html' title='does&gt;'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-9085861771890649718</id><published>2009-02-18T13:58:00.002-05:00</published><updated>2009-02-18T14:06:21.758-05:00</updated><title type='text'>Back on IRC</title><content type='html'>After a long break from IRC due to connectivity problems, I will now be back on a regular basis.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even better, I now have an irc-via-email client, which means that I am now able to monitor the #retro channel continually throughout the day, so if you have questions, I'll be able to respond far more quickly.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-9085861771890649718?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/9085861771890649718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=9085861771890649718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/9085861771890649718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/9085861771890649718'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2009/02/back-on-irc.html' title='Back on IRC'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-8626339654547029505</id><published>2009-01-25T19:17:00.004-05:00</published><updated>2009-01-25T19:44:38.042-05:00</updated><title type='text'>Misc. Updates and an introduction to Motu</title><content type='html'>10.0 (Stable) has been out for a while now, and I'm nearing completion on 10.0.1 (documentation updates to cover missing words, a fixed version of ' and movement of a few state variables to specific places at the start of the image).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In addition, I've been working on reviving an app I first created back in the Retro 7 days. The current incarnation of this is Motu, a notepad with a Retro system built in. I used to use it to keep notes and bits of code I was working on together.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Motu is implemented as a client-side web app, storing data in a cookie, and allowing trial and debugging of code. I've tested it in Safari, FireFox, and Chrome. (It will *not* work in IE). Chrome users need to start Chrome with the --enable-file-cookies flag for this to work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Motu uses a 10.0.1 (development) image, and needs access to the state variables I mentioned earlier (it uses them to allow resetting the image to a default state without a restart). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can get a copy of Motu from the git repository:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;git clone git://github.com/crcx/motu&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-8626339654547029505?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/8626339654547029505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=8626339654547029505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/8626339654547029505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/8626339654547029505'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2009/01/misc-updates-and-introduction-to-motu.html' title='Misc. Updates and an introduction to Motu'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2538631611155246497</id><published>2008-12-24T23:55:00.002-05:00</published><updated>2008-12-25T11:54:25.737-05:00</updated><title type='text'>GIT repository open (at last)</title><content type='html'>I've still had problems with BerliOS, so I setup a repository at github.com&lt;br /&gt;&lt;br /&gt;To checkout a copy:&lt;br /&gt;&lt;br /&gt; git clone git://github.com/crcx/retro10&lt;br /&gt;&lt;br /&gt;This is up to date with my latest source, so anyone with patches pending should check them against this and then send them in.&lt;br /&gt;&lt;br /&gt;For inclusion in the 10.0-stable release, I'll be needing the code/patches by Dec. 31st. (The release should be finished and made public by January 5, 2009)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2538631611155246497?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2538631611155246497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2538631611155246497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2538631611155246497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2538631611155246497'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/12/git-repository-open-at-last.html' title='GIT repository open (at last)'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-7783215320718763763</id><published>2008-12-23T18:58:00.002-05:00</published><updated>2008-12-23T23:27:22.249-05:00</updated><title type='text'>Nearly there</title><content type='html'>I'm almost done cleaning up the source tree for the 10.0-stable release.&lt;br /&gt;&lt;br /&gt;It'll include: C implementations (mine and Mat's) for console and framebuffer, javascript vm, Toka, Retro source, and docs.&lt;br /&gt;&lt;br /&gt;The library will be made into a second download.&lt;br /&gt;&lt;br /&gt;Binaries will be provided for various systems. If you have requests please let me know so I can obtain the relevant systems for building.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-7783215320718763763?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/7783215320718763763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=7783215320718763763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7783215320718763763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7783215320718763763'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/12/nearly-there.html' title='Nearly there'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3008859042940140734</id><published>2008-11-30T15:15:00.003-05:00</published><updated>2008-11-30T15:36:08.725-05:00</updated><title type='text'>Getting closer to a stable release</title><content type='html'>I'm finally planning to do a stable release (hopefully in late December or early January) for the 10th generation of Retro.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's almost ready. The core language is solid, and will see few if any changes. The library still needs works, but it's getting closer. The documentation is a bit light, but has been well received by those who have read it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A big step forward: as of today a separate image file is no longer needed to get started with Retro. The VM will still try to load a &lt;span class="Apple-style-span" style="font-style: italic;"&gt;retroImage&lt;/span&gt; (or another file, if specified on the command line), but if one can't be found, it'll initialize the stable image from an internal function. If you use the internal image and save your session, a new separate retroImage will be created.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For those wanting to try it out, grab a copy from &lt;a href="http://rx-core.org/retro-10.tar.gz"&gt;http://rx-core.org/retro-10.tar.gz&lt;/a&gt; and run '&lt;span class="Apple-style-span" style="font-style: italic;"&gt;make vm&lt;/span&gt;'.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Another update: I'm working on setting up a code repository at Berlios, hopefully this will be ready later this week. This repo will be open to all contributors, so keep an eye out for the announcement when it's ready.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3008859042940140734?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3008859042940140734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3008859042940140734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3008859042940140734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3008859042940140734'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/11/getting-closer-to-stable-release.html' title='Getting closer to a stable release'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-6441096055522446291</id><published>2008-11-07T14:32:00.005-05:00</published><updated>2008-11-07T16:12:19.443-05:00</updated><title type='text'>Some notes on my block editor</title><content type='html'>In my previous post I mentioned my block editor. This is a small editor that I've used for several years now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My image contains 1024 blocks of 512 characters each. The blocks are formatted as 8 lines, with 64 character per line. The editor allows the user to enter text on each line, or at a particular place in the line. You can delete lines, or the entire block. It is possible to evaluate code contained in a block. Editing is done through a set of short words.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Though primitive, it's served me well through the years. I see it as a decent starting point for a better editor (in fact, in older Retro systems, this editor was extended to have a VI-style modal editing model and a syntax-highlighted viewer). I'll post more details on it in the near future.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-6441096055522446291?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/6441096055522446291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=6441096055522446291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6441096055522446291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6441096055522446291'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/11/some-notes-on-my-block-editor.html' title='Some notes on my block editor'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-5463312190687278793</id><published>2008-10-30T15:42:00.002-04:00</published><updated>2008-10-30T15:52:05.842-04:00</updated><title type='text'>Things I'm working on...</title><content type='html'>&lt;div&gt;I've been having trouble with my internet connection, so here's an overview of what I'm working on:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Core&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Exposed &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;ok&lt;/span&gt; (to allow control of the prompt)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Expanded the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;forth94&lt;/span&gt; (ANS FORTH) layer. Now more compliant with the spec :)&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Additions&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;extras/bootstrap.retro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;extras/retro.nanorc&lt;br /&gt;&lt;/li&gt;&lt;li&gt;library/debug.retro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;library/does.retro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;library/date.retro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;library/math.retro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;library/value.retro&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Removals&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;  core: removed unused bits left over from old compile-time module support&lt;br /&gt;&lt;/li&gt;&lt;li&gt;  cross compiler: removed unused bits left over from old compile-time module support&lt;br /&gt;&lt;/li&gt;&lt;li&gt;  library/square-root.retro [merged with library/math.retro]&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Documentation&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Tutorial&lt;/li&gt;&lt;/ul&gt;The bootstrap.reto is my personal startup file, which includes the block editor I've used for the last several years.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-5463312190687278793?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/5463312190687278793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=5463312190687278793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5463312190687278793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5463312190687278793'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/10/things-im-working-on.html' title='Things I&apos;m working on...'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3952887778351127120</id><published>2008-10-22T13:52:00.002-04:00</published><updated>2008-10-22T14:03:14.903-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='bugfixes'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Release 2008.10.22</title><content type='html'>I've finally finished work on a new build. This has a few changes and should help me make it easier to extend Retro in the future.&lt;div&gt;&lt;ul&gt;&lt;li&gt;Three VMs included&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Console [&lt;span class="Apple-style-span" style="font-style: italic;"&gt;curses backend&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;Framebuffer [&lt;span class="Apple-style-span" style="font-style: italic;"&gt;SDL backend&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;JavaScript&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Major Bugs Fixed:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Saving of images now works reliably on Windows&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Scrolling works properly in the console build&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Compile-time modules replaced by a new library of modules that can be loaded from the command line&lt;/li&gt;&lt;li&gt;The core now reserves a smaller piece of memory for its own use (10k rather than 32k), leaving a little more room for applications&lt;/li&gt;&lt;li&gt;Small improvements to the 1994 ANS FORTH layer&lt;/li&gt;&lt;li&gt;Documentation has received some minor updates to formatting and a little explanation of how to load modules at the command line.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Documentation is included in PDF and ePub formats. Additional formats can be found on &lt;a href="http://www.feedbooks.com/userbook/1004"&gt;feedbooks.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This release also has an updated binary package with console binaries for Linux (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;x86-32, x86-64, and Alpha&lt;/span&gt;), MacOS X (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Intel&lt;/span&gt;), and Windows.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3952887778351127120?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3952887778351127120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3952887778351127120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3952887778351127120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3952887778351127120'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/10/release-20081022.html' title='Release 2008.10.22'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3208864808693951271</id><published>2008-09-20T20:43:00.008-04:00</published><updated>2008-09-21T10:31:07.074-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Release 2008.09.21</title><content type='html'>Major changes in this release&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Support for loading code from a normal text file&lt;br /&gt;&lt;i&gt;This only works for console implementation&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Use&lt;/span&gt; &lt;b&gt;./ngaro --with filename&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Improved screen clearing&lt;br /&gt;&lt;i&gt;Trying to display a negative character code clears the display.&lt;br /&gt;This allows a cleaner, more portable way of clearing the display without relying on particular escape sequences being emulated.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Console source trees merged&lt;/li&gt;&lt;li&gt;Cleanups to I/O handling in the console implementation&lt;/li&gt;&lt;li&gt;Curses-backend used for console implementation by default&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The most significant of these is the addition of &lt;b&gt;--with&lt;/b&gt; to the console implementation. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The binary package will be updated within the next few days.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3208864808693951271?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3208864808693951271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3208864808693951271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3208864808693951271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3208864808693951271'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/09/release-20080921.html' title='Release 2008.09.21'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-5564887764783930537</id><published>2008-09-01T20:30:00.003-04:00</published><updated>2008-09-01T20:36:34.754-04:00</updated><title type='text'>Binary Package</title><content type='html'>I just uploaded a set of binaries for Retro. This contains the standard image, the current documentation, and prebuilt copies of the Ngaro VM for many systems.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Console&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Linux (x86, x86-64, and Alpha)&lt;/li&gt;&lt;li&gt;Mac OS X (Intel)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Framebuffer&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Windows (x86, tested on XP SP3)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The Linux binaries are statically linked, so should work on pretty much any distro for the listed architectures. The OS X build is dynamically linked and built on OS X 10.5. The Windows build includes the SDL.dll and should work on most Windows systems without problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I couldn't produce static cross-platform binaries with the framebuffer as some of the Linux systems don't have the SDL libraries and the one that does lacks support for building static SDL applications. For OS X, the framebuffer support is not working yet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'd like to expand the number of platforms I can provide binaries for sometime soon. (Perhaps I'll try to get my old box with the BSD's on it up and running again.). For now this should make trying Retro even easier.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-5564887764783930537?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/5564887764783930537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=5564887764783930537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5564887764783930537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5564887764783930537'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/09/binary-package.html' title='Binary Package'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-9173480872081294608</id><published>2008-08-31T10:27:00.002-04:00</published><updated>2008-08-31T11:01:53.395-04:00</updated><title type='text'>Release 2008.08.31</title><content type='html'>Well, I've finally pushed out a new release.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is primarily a cleanup of the core source tree. Some highlights:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Build scripts replaced by Makefiles&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Documentation is now included&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The default image name is now &lt;span class="Apple-style-span" style="font-style: italic;"&gt;retroImage&lt;/span&gt;&lt;/li&gt;&lt;li&gt;VM's attempt to load &lt;span class="Apple-style-span" style="font-style: italic;"&gt;retroImage&lt;/span&gt; if no image name is specified&lt;/li&gt;&lt;li&gt;Win32 implementation now separate from the standard framebuffer source&lt;/li&gt;&lt;li&gt;Assembler is now separate from the Retro source&lt;/li&gt;&lt;li&gt;Modules renamed and organized better&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;In addition to the above changes, I've revamped the site a little. It now makes trying Retro easier through use of the javascript implementation of Ngaro.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also new is an image builder. Rather than provide a static image, this allows you to select the modules you want in your custom image.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-9173480872081294608?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/9173480872081294608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=9173480872081294608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/9173480872081294608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/9173480872081294608'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/08/release-20080831.html' title='Release 2008.08.31'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-1006545739577526309</id><published>2008-07-27T13:20:00.002-04:00</published><updated>2008-07-27T13:22:32.260-04:00</updated><title type='text'>Release 2008.07.27</title><content type='html'>&lt;p&gt;I've pushed the latest release (2008.07.27) online. This has a few nice improvments, including inlining of primitive words, the latest JavaScript implementation of Ngaro, and lots of internal cleanups.&lt;/p&gt;&lt;p&gt;Due to changes on repo.or.cz, I've been unable to push changes to the GIT repository for a while now. I'm looking for a solution, and hope to be able to resume putting changes into a VCS soon.&lt;/p&gt;&lt;p&gt;The Windows installer has not been updated yet due to hardware problems on the single Windows box I have. I'm hoping to be able to have an updated installer later this week.&lt;/p&gt;&lt;p&gt;The Dashboard widget and Retro Online are now running the latest code with improved reliability and improved interfaces. Users of the Dashboard widget should definitely update as this fixes some resource usage issues and offers significantly greater performance.&lt;/p&gt;&lt;p&gt;Anyway, download the latest snapshot or image and enjoy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-1006545739577526309?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/1006545739577526309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=1006545739577526309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1006545739577526309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1006545739577526309'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/07/release-20080727.html' title='Release 2008.07.27'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-1157852407453118532</id><published>2008-07-21T17:04:00.001-04:00</published><updated>2008-07-21T17:04:52.889-04:00</updated><title type='text'>Retro Widget for Apple's Dashboard
</title><content type='html'>I've adapted the 3rd generation of the Javascript implementation of Ngaro to run as a Dashboard widget. It's running a standard image, and works quite nicely.&lt;br /&gt;&lt;br /&gt;If this proves useful, I'll look into supporting other widget platforms in the future.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://s3.retroforth.org/retro-dashboard.zip"&gt;Get the Retro Dashboard Widget&lt;/a&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-1157852407453118532?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/1157852407453118532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=1157852407453118532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1157852407453118532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1157852407453118532'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/07/retro-widget-for-apple-dashboard.html' title='Retro Widget for Apple&amp;#39;s Dashboard&#xA;'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-1628346154777206391</id><published>2008-07-19T22:32:00.002-04:00</published><updated>2008-07-19T22:38:57.620-04:00</updated><title type='text'>Misc. Updates</title><content type='html'>Due to some ongoing health issues, I haven't been as active as I'd like. Hopefully these will be resolved soon and I'll be able to do some serious work on supporting the extended Ngaro VM, expanding the modules, and further improving the documentation.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For now, a few minor updates:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;I've begun updating &lt;a href="http://ngaro.jottit.com"&gt;http://ngaro.jottit.com&lt;/a&gt; using the material from the Retro docs as a base. It can now be edited by anyone, so all those working on Ngaro implementations can contribute.&lt;/li&gt;&lt;li&gt;&lt;a href="http://s3.retroforth.org/jsvm3/index.html"&gt;jsvm3&lt;/a&gt;: An updated version of the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Ngaro in Javascript&lt;/span&gt;, this is primarily based on an updated I/O model that allows an even closer approximation of the console builds. This is new, and needs testing.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-1628346154777206391?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/1628346154777206391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=1628346154777206391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1628346154777206391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1628346154777206391'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/07/misc-updates.html' title='Misc. Updates'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2869655239592820623</id><published>2008-07-07T17:01:00.002-04:00</published><updated>2008-07-07T17:35:01.761-04:00</updated><title type='text'>Improving Performance</title><content type='html'>&lt;p&gt;While looking over Mat's extensions to Ngaro I had a thought about inlining the handful of words which correspond to Ngaro instructions. A few tests showed enough promise that I've added a new &lt;strong&gt;.inline&lt;/strong&gt; class to Retro.&lt;/p&gt;&lt;p&gt;The primitives will only be inlined if they are not revectored. This ensures that they will behave as closely to normal Forth words as possible. Devectoring a &lt;strong&gt;.inline&lt;/strong&gt; word will restore the original behaviour. &lt;em&gt;This is not intended for user code, and is only useful if you are adding new opcodes to your Ngaro VM.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Anyway, a look at the benchmarks:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Switched VM&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Before:&lt;br /&gt;&lt;em&gt;- Recursive FIB (39)... 208.0144 seconds&lt;br /&gt;- Countdown Loop (1,000,000)... 12.228482 seconds&lt;br /&gt;- Nest/Unnest (256 million pairs)... 42.299306 seconds&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Now:&lt;br /&gt;&lt;em&gt;- Recursive FIB (39)... 85.860101 seconds&lt;br /&gt;- Countdown Loop (1,000,000)... 12.38329 seconds&lt;br /&gt;- Nest/Unnest (256 million pairs)... 30.796164 seconds&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Threaded VM&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Before:&lt;br /&gt;&lt;em&gt;- Recursive FIB (39)... 130.537818 seconds&lt;br /&gt;- Countdown Loop (1,000,000)... 8.325312 seconds&lt;br /&gt;- Nest/Unnest (256 million pairs)... 27.092447 second&lt;/em&gt;&lt;em&gt;s&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Now:&lt;br /&gt;&lt;em&gt;- Recursive FIB (39)... 51.989871 seconds&lt;br /&gt;- Countdown Loop (1,000,000)... 8.292265 seconds&lt;br /&gt;- Nest/Unnest (256 million pairs)... 17.577663 seconds&lt;/em&gt;&lt;/p&gt;&lt;p&gt;I'll update the documentation to cover the new class in the near future. If you don't want to wait for a new release, you can get this code from the GIT repository. See &lt;a href="http://repo.or.cz/w/retro.git"&gt;http://repo.or.cz/w/retro.git&lt;/a&gt; for details.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2869655239592820623?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2869655239592820623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2869655239592820623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2869655239592820623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2869655239592820623'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/07/improving-performance.html' title='Improving Performance'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3089779852734078161</id><published>2008-07-06T12:09:00.002-04:00</published><updated>2008-07-06T12:16:10.999-04:00</updated><title type='text'>Site Changes</title><content type='html'>&lt;p&gt;I've begun reworking the layout of the Retro website. This should be completed within the next few days.&lt;/p&gt;&lt;p&gt;Some highlights of the new design so far:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Cleaner organization&lt;/li&gt;&lt;li&gt;Downloads on the right, will remain easier to spot&lt;/li&gt;&lt;li&gt;Automatically updated links to recent discussions on the mailing list and recent commits to the main GIT repository. (Updated hourly)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Coming soon:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;New documentation page, which will allow downloading the documentation in various formats (text, word doc, pdf, html) as well as viewing it online.&lt;/li&gt;&lt;li&gt;The News page will have links to the blogs of those involved in Retro's development, as well as displaying the most recent posts (updated hourly) from each blog.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Possibilities:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Web access to the #retro channel on irc.freenode.net&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3089779852734078161?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3089779852734078161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3089779852734078161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3089779852734078161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3089779852734078161'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/07/site-changes.html' title='Site Changes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-903035297695511929</id><published>2008-06-29T19:00:00.003-04:00</published><updated>2008-06-29T19:02:23.931-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='classes'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Release 2008.06.29</title><content type='html'>&lt;p&gt;This is a minor update with the updated word class handling (so you can try code from my previous posts) and a few minor fixes and improvements to the source. I've also updated the online interpreter to use both the latest Ngaro.js and image.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-903035297695511929?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/903035297695511929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=903035297695511929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/903035297695511929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/903035297695511929'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/release-20080629.html' title='Release 2008.06.29'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-5701779185853378000</id><published>2008-06-25T21:45:00.002-04:00</published><updated>2008-06-25T21:49:18.399-04:00</updated><title type='text'>Switched to GIT</title><content type='html'>&lt;p&gt;I've switched to using GIT for the Retro source repository. Relevant information follows:&lt;/p&gt;&lt;p&gt;To obtain a copy:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  git clone git://repo.or.cz/retro.git&lt;/span&gt; &lt;/p&gt;&lt;p&gt;The repository can be browsed at:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  http://repo.or.cz/w/retro.git&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-5701779185853378000?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/5701779185853378000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=5701779185853378000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5701779185853378000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5701779185853378000'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/switched-to-git.html' title='Switched to GIT'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2074841706123850870</id><published>2008-06-19T23:12:00.003-04:00</published><updated>2008-06-21T21:44:00.368-04:00</updated><title type='text'>Adding New Word Classes</title><content type='html'>&lt;p&gt;In my previous post I discussed the concept of word classes. In this post I'll show how to define and add a word class to Retro. &lt;em&gt;This assumes that you know Forth, and have some experience with Retro. Consult the documentation if you have questions on the words used.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;For this example, we'll create a class for strings with the following behaviour:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If interpreting, display the string&lt;/li&gt;&lt;li&gt;If compiling, compile the code needed to display the string&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Retro has a convention of using a &lt;strong&gt;.&lt;/strong&gt; as the first character of a class name. We'll call our new class &lt;strong&gt;.string&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;On entry to a class handler, the &lt;em&gt;address (xt) &lt;/em&gt;of the word or data element is on the stack. The compiler state (often important to class handlers) is stored in a variable named &lt;strong&gt;compiler&lt;/strong&gt;. With this in mind, we'll define our class:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  : .string ( xt -- )&lt;br /&gt;    compiler @ 0 =if type ;; then&lt;br /&gt;    1 , , ['] type compile ;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The compile-time portion is a bit trickier than the interpret time since it has to lay down the proper code in the target definition. In this case a &lt;strong&gt;LIT&lt;/strong&gt; instruction (&lt;em&gt;opcode 1&lt;/em&gt;) is laid down, followed by the &lt;em&gt;xt&lt;/em&gt; of the string. This is followed by code to lay down a call to &lt;strong&gt;type&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;We now need a creator word to attach this class to a value. For this example we'll define &lt;strong&gt;displayString:&lt;/strong&gt; to take a form like the one shown below.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  string-addr displayString: name&lt;/span&gt;&lt;/p&gt;&lt;p&gt;New dictionary entries are made using &lt;strong&gt;create&lt;/strong&gt;, so we'll use that and change the class to our new &lt;strong&gt;.string&lt;/strong&gt; handler.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  : displayString: ( string-addr -- )&lt;br /&gt;    create ['] .string last @ d-&gt;class !&lt;br /&gt;    keepString last @ d-&gt;xt ! ;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This uses &lt;strong&gt;create&lt;/strong&gt; to make a new word, then sets the &lt;em&gt;class&lt;/em&gt; to &lt;strong&gt;.string&lt;/strong&gt; and the &lt;em&gt;xt&lt;/em&gt; of the word to the string. It also makes the string permanent using &lt;strong&gt;keepString&lt;/strong&gt;. &lt;strong&gt;last&lt;/strong&gt; is a variable pointing to the most recently created dictionary entry. The words &lt;strong&gt;d-&gt;class&lt;/strong&gt; and &lt;strong&gt;d-&gt;xt&lt;/strong&gt; are dictionary field accessors and are used to provide portable access to fields in the dictionary.&lt;/p&gt;&lt;p&gt;We can now test our new class:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;  " hello, world!" displayString: hello&lt;br /&gt;  hello&lt;br /&gt;  : foo hello cr ;   foo&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2074841706123850870?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2074841706123850870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2074841706123850870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2074841706123850870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2074841706123850870'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/adding-new-word-classes.html' title='Adding New Word Classes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-1124508399918199819</id><published>2008-06-19T19:15:00.005-04:00</published><updated>2008-06-19T20:00:18.775-04:00</updated><title type='text'>Introduction to Word Classes</title><content type='html'>&lt;p&gt;There are many ways to code a Forth interpreter. When I inherited Retro, there were two separate dictionaries, one for normal words and data, and one for compiler macros. There were two internal token processing loops, one for interpret time and one for compile time. This lead to some confusion as the compiler macro dictionary was only visible when compiling words, and preceeded the normal dictionary. When new functionality (inlining, etc) was added, more dictionaries and internal loops had to be coded.&lt;/p&gt;&lt;p&gt;Some Forths solve this by having flags in the dictionary headers and having the token processor use these to select the proper functionality. This still requires changes to the kernel to handle new flags and add the behaviour in the proper places.&lt;/p&gt;&lt;p&gt;Helmar Wodtke introduced me to a simpler approach which he calls &lt;em&gt;word classes&lt;/em&gt;. In this approach each dictionary entry gets an additional value, a pointer to a &lt;em&gt;class handler&lt;/em&gt;. Class handlers are just words that take an &lt;em&gt;execution token&lt;/em&gt; (in Retro this is just the &lt;em&gt;address&lt;/em&gt; of a word) and do something with it.&lt;/p&gt;&lt;p&gt;A default Retro build has three classes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;.word&lt;/strong&gt;&lt;br /&gt;At compile time, compile a call to the word. At interpret time, execute the word.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;.macro&lt;/strong&gt;&lt;br /&gt;Execute the word. The word may compile code or add data into the heap based on any form of system state.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;.data&lt;/strong&gt;&lt;br /&gt;Return the address or value associated with the requested token.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These cover the core functionality required for a small Forth implementation.&lt;/p&gt;&lt;p&gt;In the next post we'll look at how to define new classes and use them to extend Retro's functionality.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-1124508399918199819?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/1124508399918199819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=1124508399918199819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1124508399918199819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1124508399918199819'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/introduction-to-word-classes.html' title='Introduction to Word Classes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2476702245269107373</id><published>2008-06-14T19:14:00.003-04:00</published><updated>2008-06-14T19:35:27.926-04:00</updated><title type='text'>Release 2008.06.14</title><content type='html'>I've finally pushed a new release. This is current as of 7:15 pm (EST) and includes the stable releases of Ngaro (C, JavaScript) as well as current source and build scripts.&lt;br /&gt;&lt;br /&gt;I also updated the binary release for Windows. It's now an MSI installer package.&lt;br /&gt;&lt;br /&gt;Some of the more signficant enhancments:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ngaro&lt;br /&gt;Gained a new I/O port for queries of emulated devices&lt;br /&gt;C implementations now have more flexible command line processing&lt;br /&gt;Updated threaded C implementation&lt;/li&gt;&lt;li&gt;Retro&lt;br /&gt;Minor bugfixes&lt;br /&gt;All non-data words are now vectors&lt;br /&gt;Now detects hardware settings using the new I/O port in Ngaro&lt;br /&gt;Word classes exposed&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Updated benchmarks&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The documentation has been updated to reflect the changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2476702245269107373?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2476702245269107373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2476702245269107373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2476702245269107373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2476702245269107373'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/release-20080614.html' title='Release 2008.06.14'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-6022167387795406605</id><published>2008-06-12T22:24:00.002-04:00</published><updated>2008-06-12T22:28:46.828-04:00</updated><title type='text'>Exposing Word Classes</title><content type='html'>I've been using word classes in Retro 10's implementation since the beginning. This allows a simple, consistent means of controlling the behavior of words.&lt;br /&gt;&lt;br /&gt;Until today it was not possible to define a custom word class. Now you can, but it's not automatic. You'll have to redefine &lt;span style="font-weight: bold;"&gt;with-class&lt;/span&gt;, but take care to handle the existing classes (&lt;span style="font-weight: bold;"&gt;.word&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;.macro&lt;/span&gt;, and &lt;span style="font-weight: bold;"&gt;.data&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;I'll try to document this sometime soon, but take a look in the Retro source to see how it's done if you wish to experiment with it. The code supporting this is in the SVN repository.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-6022167387795406605?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/6022167387795406605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=6022167387795406605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6022167387795406605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6022167387795406605'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/exposing-word-classes.html' title='Exposing Word Classes'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-7032897708261988603</id><published>2008-06-12T19:05:00.003-04:00</published><updated>2008-06-12T22:24:42.147-04:00</updated><title type='text'>Ngaro Updates</title><content type='html'>With recent work on Ngaro it's become possible to run Retro on many smaller systems (including phones and pdas). This has lead to a need for supporting smaller memory configurations and screen sizes.&lt;br /&gt;&lt;br /&gt;To help reduce the work involved involved in adapting Retro to these devices, I've set I/O port 5 as a hardware query device. This can be queried by writing specific values, waiting, then reading back the result.&lt;br /&gt;&lt;br /&gt;Since some implementations are likely to support optional hardware devices in the future, they can use this to provide Retro with information about these devices.&lt;br /&gt;&lt;br /&gt;In the SVN repository the C implementations of Ngaro have been adapted to support this. I'm working on the JavaScript implementations and should have them ready tomorrow.&lt;br /&gt;&lt;br /&gt;The initial capabilities that can be detected are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; -1&lt;/span&gt;   &lt;span style="font-style: italic;"&gt;Get Amount of Memory&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; -2&lt;/span&gt;   &lt;span style="font-style: italic;"&gt;Get Framebuffer Address (0 if not supported)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; -3&lt;/span&gt;   &lt;span style="font-style: italic;"&gt;Get Framebuffer Width (0 if not supported)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; -4&lt;/span&gt;   &lt;span style="font-style: italic;"&gt;Get Framebuffer Height&lt;/span&gt;&lt;span style="font-style: italic;"&gt; (0 if not supported)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;I've updated the Retro source to detect the framebuffer settings on startup and use them rather than relying on hardcoded values. Retro also detects the amount of memory being provided, but the memory map still needs to be configured in the source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-7032897708261988603?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/7032897708261988603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=7032897708261988603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7032897708261988603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7032897708261988603'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/ngaro-updates.html' title='Ngaro Updates'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2192210111911837037</id><published>2008-06-06T10:37:00.002-04:00</published><updated>2008-06-06T10:43:33.777-04:00</updated><title type='text'>Improving Ngaro in JavaScript</title><content type='html'>Ngaro in JavaScript (&lt;span style="font-style: italic;"&gt;jsvm&lt;/span&gt;) has been working nicely for quite a while now. Today I did a little more work to help improve the interface. It's now using the innerhtml to remove the textarea for the output. I've tweaked the &lt;span style="font-weight: bold;"&gt;ngaro.js&lt;/span&gt; a bit to handle newlines properly with this. The tracing and error log is not supported yet, but I expect to work that out in the near future.&lt;br /&gt;&lt;br /&gt;Feel free to &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://retroforth.org/jsvm/"&gt;take a look&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2192210111911837037?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2192210111911837037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2192210111911837037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2192210111911837037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2192210111911837037'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/improving-ngaro-in-javascript.html' title='Improving Ngaro in JavaScript'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-1814550138271394213</id><published>2008-06-06T09:27:00.002-04:00</published><updated>2008-06-06T09:36:12.418-04:00</updated><title type='text'>Retro meets J2ME</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.nigol.cz/retro/screenretro.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.nigol.cz/retro/screenretro.png" alt="" border="0" /&gt;&lt;/a&gt;Martin Polak has ported the Ngaro VM to mobile devices with J2ME support. This is another great step forward as it makes Retro even more accessible to developers.&lt;br /&gt;&lt;br /&gt;The sources are in the subversion repository and I'm working on making it buildable using Retro's standard build scripts.&lt;br /&gt;&lt;br /&gt;Martin has provided a source and binary package at  &lt;a href="http://www.nigol.cz/retro/Retroforth.zip" target="_blank"&gt;http://www.nigol.cz/retro&lt;wbr&gt;/Retroforth.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To try building it you'll need to be using MacOS X and Ant. Of course, you'll also need the relevant Java libraries and development tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-1814550138271394213?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/1814550138271394213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=1814550138271394213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1814550138271394213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1814550138271394213'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/06/retro-meets-j2me.html' title='Retro meets J2ME'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-5643749254257884839</id><published>2008-05-25T20:57:00.003-04:00</published><updated>2008-05-25T21:15:06.182-04:00</updated><title type='text'>Benchmarking Retro</title><content type='html'>Retro now has a small, but working, set of benchmarks. This is in the svn repo and can be found in &lt;span style="font-weight: bold;"&gt;bin/bench&lt;/span&gt;. To use the benchmarks, you'll need a console build of Ngaro, a Retro image, a Unix-like host system, and Perl.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  cd bin/bench&lt;br /&gt;./make-image&lt;br /&gt;./run-bench&lt;/pre&gt;&lt;br /&gt;The timings for each test will be displayed when the test completes. There are currently three tests:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Recursive FIB&lt;/li&gt;&lt;li&gt;Countdown Loop&lt;/li&gt;&lt;li&gt;Call/Return (nesting) Pairs&lt;/li&gt;&lt;/ul&gt;I expect to see this grow into a more complete set of benchmarks in the future. For now, this should suffice for basic performance testing.&lt;br /&gt;&lt;br /&gt;Initial results:&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Host:&lt;/span&gt; ZenWalk 5 (Linux)&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;GCC:&lt;/span&gt; 4.1.2&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;CPU:&lt;/span&gt; Pentium 4 2.8GHz (1 core)&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;RAM:&lt;/span&gt; 1.5gb&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Switched VM:&lt;/span&gt;&lt;br /&gt;     Recursive FIB (39)... 225.540318 seconds&lt;br /&gt;     Countdown Loop (1,000,000)... 13.616979 seconds&lt;br /&gt;     Nest/Unnest (256 million pairs)... 36.356847 seconds&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Threaded VM:&lt;/span&gt;&lt;br /&gt;     Recursive FIB (39)... 212.555673 seconds&lt;br /&gt;     Countdown Loop (1,000,000)... 13.995988 seconds&lt;br /&gt;     Nest/Unnest (256 million pairs)... 33.026269 seconds&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-5643749254257884839?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/5643749254257884839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=5643749254257884839' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5643749254257884839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5643749254257884839'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/benchmarking-retro.html' title='Benchmarking Retro'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-7637776233022875387</id><published>2008-05-25T19:50:00.002-04:00</published><updated>2008-05-25T19:55:23.643-04:00</updated><title type='text'>Updated Documentation</title><content type='html'>I have finished the initial updates to Retro's documentation. This is an ongoing process, in which I have been merging all of my notes and separate pieces of documentation into a single, cohesive reference.&lt;br /&gt;&lt;br /&gt;Many sections have been expanded, and some new areas were added. I think it's a definite step forward and invite everyone to &lt;a href="http://docs.google.com/View?docid=dhs99d59_9d4r9k9cz&amp;amp;pli=1"&gt;Check it out&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-7637776233022875387?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/7637776233022875387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=7637776233022875387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7637776233022875387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/7637776233022875387'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/updated-documentation.html' title='Updated Documentation'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-6697654340138322657</id><published>2008-05-24T11:18:00.003-04:00</published><updated>2008-05-24T11:52:22.980-04:00</updated><title type='text'>Loading text files into an image</title><content type='html'>While Retro has no direct access to the host system, it is possible to load text files into an image and then save the results, or use it interactively. The process assumes that you are running on some form of Unix. It's pretty simple:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;./build&lt;br /&gt;cd bin&lt;br /&gt;cat filename | ./ngaro forth.image&lt;/pre&gt;&lt;br /&gt;Or, for interactive mode:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cat filename - | ./ngaro forth.image&lt;/pre&gt;&lt;br /&gt;There is a limiting factor. The standard Retro image only recognizes space as valid whitespace, so any use of tabs or newlines will cause problems. This can be fixed by starting your code with the following line. This should be one single line. Be sure to include a space at the end of the line:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;: fix dup 10 =if drop 32 then dup 13 =if drop 32 then&lt;br /&gt;dup 9 =if drop 32 then ; ' fix is (remap-keys)&lt;/pre&gt;&lt;br /&gt;If you want, this can be disabled later by doing:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;devector remap-keys&lt;/pre&gt;&lt;br /&gt;If you aren't going to drop to an interactive prompt, end with &lt;span style="font-weight: bold;"&gt;bye&lt;/span&gt;. Be sure to &lt;span style="font-weight: bold;"&gt;save&lt;/span&gt; your state if you want any changes to be present when you next load your Retro image.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-6697654340138322657?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/6697654340138322657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=6697654340138322657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6697654340138322657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6697654340138322657'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/loading-text-files-into-image.html' title='Loading text files into an image'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2738283568029679033</id><published>2008-05-23T18:49:00.003-04:00</published><updated>2008-05-23T19:01:55.778-04:00</updated><title type='text'>Threaded Execution in the Ngaro VM</title><content type='html'>Thanks to Matthias Schirm there's a new implementation of Ngaro. It's written in C, and supports the text console devices. His implementation uses threaded execution, which is faster. He is working on further performance improvements. (&lt;span style="font-style: italic;"&gt;This will likely become the default console build later this summer.&lt;/span&gt;) At present it does not work with the SDL-backed I/O; I will try to figure out why later on.&lt;br /&gt;&lt;br /&gt;I've not done any significant benchmarking, but he did provide some numbers:&lt;br /&gt;&lt;pre&gt;  : test dup for dup . CR 1 – next ; 1000000 test bye&lt;/pre&gt;ngaro (old):&lt;br /&gt;&lt;pre&gt;  real  [s] 35,47&lt;br /&gt;user [s] 8,27&lt;br /&gt;sys  [s] 1,07&lt;br /&gt;&lt;/pre&gt;ngaro (new):&lt;br /&gt;&lt;pre&gt; real: [s]  35,13&lt;br /&gt;user [s]  7,46&lt;br /&gt;sys  [s]  1,34&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;  : fib dup 1 &gt;if dup 1 RECURSE swap 2 RECURSE + EXIT then drop 1 ; 39 fib bye&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ngaro (old):&lt;br /&gt;&lt;pre&gt; real  [s]  131,23&lt;br /&gt;user [s]  131,21&lt;br /&gt;sys  [s]  0,03&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;ngaro (new):&lt;br /&gt;&lt;pre&gt; real  [s]  77,95&lt;br /&gt;user [s]  77,67&lt;br /&gt;sys  [s]  0,04&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is a clear improvement and should continue to get better. I've begun to work on a small benchmark package; once done it'll be easier to test performance tweaks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2738283568029679033?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2738283568029679033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2738283568029679033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2738283568029679033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2738283568029679033'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/threaded-execution-in-ngaro-vm.html' title='Threaded Execution in the Ngaro VM'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-662599225987582602</id><published>2008-05-11T19:04:00.003-04:00</published><updated>2008-05-11T19:17:14.384-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='package'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Retro on Windows</title><content type='html'>Retro has been supported on Windows for a few weeks now. My access to Windows has been very limited, but I finally have a working XP install on my main development box.&lt;br /&gt;&lt;br /&gt;I'll be revising the &lt;a href="http://docs.google.com/View?docid=dhs99d59_19drc3dshs&amp;amp;pli=1"&gt;Windows Build Instructions&lt;/a&gt; later today, to help clarify a few points and point out the exact files I'm using. In addition, I've built a new &lt;a href="http://retroforth.org/retro10.msi"&gt;installable package for Retro 10&lt;/a&gt;. This is a standard MSI package, so should install on XP and Vista machines without problems. It includes all necessary dependencies. I expect to replace the binary package on retroforth.org with this later this week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-662599225987582602?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/662599225987582602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=662599225987582602' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/662599225987582602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/662599225987582602'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/retro-on-windows.html' title='Retro on Windows'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-5618686555873601941</id><published>2008-05-10T13:34:00.005-04:00</published><updated>2008-05-19T05:48:55.358-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='io'/><title type='text'>Release 2008.05.10</title><content type='html'>This is a pretty small release. I've been very busy (and a bit sick), so haven't had time to do much.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The video refresh port is now set properly after outputting a character&lt;/li&gt;&lt;li&gt;Ngaro JS now supports the video refresh port&lt;/li&gt;&lt;li&gt;Ngaro JS now stores the video output apart from the form output textarea&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Strings are now rendered after all characters are drawn to the video buffer rather than character by character&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;update&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;enable/disable screen redraws&lt;/span&gt;) was added&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;redraw&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;redraw the screen if update is on&lt;/span&gt;) is now in the dictionary&lt;/li&gt;&lt;li&gt;Graphics module now does video updates after drawing shapes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Removed the FFI from Toka.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;As shown, most of my time has been spent in enabling proper use of the video refresh support provided by Ngaro. This allows a noticeable performance increase in bits that are text heavy (try &lt;span style="font-weight: bold;"&gt;words&lt;/span&gt;) by delaying renders until the output is finished. It's also helpful with graphics, allowing filled shapes to be rendered more quickly.&lt;br /&gt;&lt;br /&gt;I also removed the FFI functionality from Toka for this release. The FFI words are not used by the cross-compiler, and serves only to slow down the build of Toka and increase the number of dependencies. (&lt;span style="font-style: italic;"&gt;This only affects the copy of Toka included in the Retro package; the full Toka still has FFI&lt;/span&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-5618686555873601941?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/5618686555873601941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=5618686555873601941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5618686555873601941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/5618686555873601941'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/release-20050510.html' title='Release 2008.05.10'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-1077462890225055044</id><published>2008-05-04T10:32:00.006-04:00</published><updated>2008-05-04T11:38:19.988-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='wm5'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Retro on Mobile Devices</title><content type='html'>I have scaled down the UI elements in Ngaro JS and am now able to run Retro on some mobile devices.&lt;br /&gt;&lt;br /&gt;I have confirmation that it works properly on (platform, browser):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows Mobile 5 (&lt;span style="font-style: italic;"&gt;Minimo&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Apple iPhone (&lt;span style="font-style: italic;"&gt;Mobile Safari&lt;/span&gt;)&lt;/li&gt;&lt;/ul&gt;You can check out &lt;a href="http://retroforth.org/mobile/"&gt;Retro Mobile&lt;/a&gt; online, or &lt;a href="http://retroforth.org/mobile/mobile.zip"&gt;download the files&lt;/a&gt; to copy to your device for offline use.&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://retroforth.org/mobile"&gt;Retro Mobile&lt;/a&gt; (http://retroforth.org/mobile)&lt;/li&gt;&lt;li&gt;&lt;a href="http://retroforth.org/mobile/mobile.zip"&gt;Download Retro Mobile&lt;/a&gt; (zip, http://retroforth.org/mobile/mobile.zip)&lt;/li&gt;&lt;li&gt;&lt;a href="http://retroforth.org/mobile/mobile.tar.gz"&gt;Download Retro Mobile&lt;/a&gt; (tar.gz, http://retroforth.org/mobile/mobile.tar.gz)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mozilla.org/projects/minimo/"&gt;Minimo&lt;/a&gt; (http://www.mozilla.org/projects/minimo/)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-1077462890225055044?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/1077462890225055044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=1077462890225055044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1077462890225055044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/1077462890225055044'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/retro-on-mobile-devices.html' title='Retro on Mobile Devices'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2343068838980512502</id><published>2008-05-03T17:23:00.002-04:00</published><updated>2008-05-03T17:32:17.393-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Release 2008.05.03</title><content type='html'>This release primarily focuses on the build system, but does bring some minor updates to Retro, the modules, and Ngaro.&lt;br /&gt;&lt;br /&gt;The build system:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Refactored, now has separate functions for each step of the build system&lt;/li&gt;&lt;li&gt;The &lt;span style="font-style: italic;"&gt;clean&lt;/span&gt; script has been merged in&lt;/li&gt;&lt;li&gt;Accepts various command line options allowing more control over the build&lt;/li&gt;&lt;li&gt;Basic help (pass &lt;span style="font-style: italic;"&gt;--help&lt;/span&gt;) to see&lt;/li&gt;&lt;li&gt;Several bugs were fixed in &lt;span style="font-style: italic;"&gt;fix-image&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Memory usage of &lt;span style="font-style: italic;"&gt;fix-image&lt;/span&gt; was reduced&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;image2js.toka&lt;/span&gt; is now commented&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;For the modules:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;COUNT&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;R@&lt;/span&gt; were added to &lt;span style="font-style: italic;"&gt;forth94&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;forth83&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Retro:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;for&lt;/span&gt; / &lt;span style="font-style: italic;"&gt;next&lt;/span&gt; loops have been added&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And as finally, Ngaro:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Added a &lt;span style="font-style: italic;"&gt;Clear Display&lt;/span&gt; button.&lt;/li&gt;&lt;/ul&gt;Nothing too impressive, but the updated build script will be easier for me to maintain and extend in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2343068838980512502?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2343068838980512502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2343068838980512502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2343068838980512502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2343068838980512502'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/release-20080503.html' title='Release 2008.05.03'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-4569134050647192919</id><published>2008-05-03T10:17:00.004-04:00</published><updated>2008-05-10T13:36:37.888-04:00</updated><title type='text'>Loops</title><content type='html'>I've implemented simple for/next loops now. The code below can be entered into a running Retro instance, then you can save the image to get them. (They will also be in the release due later today).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;macro: for here 5 , ;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;" &gt;macro: next 6 , 27 , 25 , 8 , , ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For those who are curious, this involves two compiler macros, which inline raw machine code into the words using the macros. As an example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;: foo 10 for 98 emit next ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will compile to:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;foo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  lit 10&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;foo.1:       ( 'for' )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  push&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;lit 98&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  call emit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;pop        ( 'next' )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  1-&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  jump foo.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;There is a limitation that should be mentioned: when the loop counter reaches zero, the word will exit. Factor loops out if this is a problem for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-4569134050647192919?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/4569134050647192919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=4569134050647192919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/4569134050647192919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/4569134050647192919'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/05/loops.html' title='Loops'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-6470223666491990681</id><published>2008-04-28T19:35:00.004-04:00</published><updated>2008-05-03T10:41:09.666-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>SVN Repo (and Trac)</title><content type='html'>Retro now has a Subversion repository at &lt;a href="http://svn2.assembla.com/svn/retro"&gt;http://svn2.assembla.com/svn/retro&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The repository can be browsed via &lt;a href="http://trac2.assembla.com/retro/browser"&gt;Trac&lt;/a&gt;. Please be aware that this is primarily intended for my use, but could be useful to anyone wanting to stay current with my work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-6470223666491990681?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/6470223666491990681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=6470223666491990681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6470223666491990681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/6470223666491990681'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/svn-repo-and-trac.html' title='SVN Repo (and Trac)'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3149012545721387650</id><published>2008-04-28T12:59:00.005-04:00</published><updated>2008-05-03T10:41:47.160-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='building'/><title type='text'>Current Work</title><content type='html'>A few minor updates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href="http://retroforth.org/build"&gt;image builder&lt;/a&gt; now builds an &lt;span style="font-style: italic;"&gt;image.js&lt;/span&gt; for use with the Ngaro JS&lt;/li&gt;&lt;li&gt;Ngaro JS now has a &lt;span style="font-style: italic;"&gt;Clear Display&lt;/span&gt; button which may be of some use&lt;/li&gt;&lt;/ul&gt;I've rewritten the build script for Retro. It's now got a number of internal functions, which have allowed some minor cleanups and the addition of a few new features, including basic help (pass &lt;span style="font-style: italic;"&gt;--help&lt;/span&gt; to the script to see a list of all flags provided now). This will be included in the &lt;span style="font-style: italic;"&gt;2008.05.03&lt;/span&gt; release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3149012545721387650?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3149012545721387650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3149012545721387650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3149012545721387650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3149012545721387650'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/current-work.html' title='Current Work'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-8201246487647488721</id><published>2008-04-27T09:33:00.002-04:00</published><updated>2008-04-27T09:40:09.198-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><category scheme='http://www.blogger.com/atom/ns#' term='building'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Image Builder</title><content type='html'>As mentioned in my post on the &lt;span style="font-style: italic;"&gt;2008.04.26&lt;/span&gt; release, I am working on an online image builder.&lt;br /&gt;&lt;br /&gt;I have finished a quick prototype. It will allow you to select from the majority of the modules that are included in the latest release and build an image including them. This does not save images for long, so download quickly. (&lt;span style="font-style: italic;"&gt;The download will be replaced by the next image that is built&lt;/span&gt;.)&lt;br /&gt;&lt;br /&gt;The image builder will also provide a copy of the image map and the build log. It does not build the image for Ngaro JS yet.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://retroforth.org/build"&gt;Give it a try.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-8201246487647488721?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/8201246487647488721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=8201246487647488721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/8201246487647488721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/8201246487647488721'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/image-builder.html' title='Image Builder'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-9133677081990813580</id><published>2008-04-24T22:21:00.006-04:00</published><updated>2008-04-27T09:40:36.319-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='io'/><category scheme='http://www.blogger.com/atom/ns#' term='console'/><title type='text'>Release 2008.04.26</title><content type='html'>From this point on, I'm going to try to do a release at the end of any week that sees improvements to the Retro codebase.&lt;br /&gt;&lt;br /&gt;This week brings a couple of minor changes and improvements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ngaro JS now included in the package&lt;/li&gt;&lt;li&gt;A tool (in Toka) to build an image.js for Ngaro JS&lt;br /&gt;(&lt;span style="font-style: italic;"&gt;This does not work properly on 64-bit systems, I'll try to fix in the next week or two&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A new &lt;span style="font-weight: bold;"&gt;(remap-keys)&lt;/span&gt; hook has been added to allow alteration of the values returned by &lt;span style="font-weight: bold;"&gt;key&lt;/span&gt; before they can be processed by other words&lt;/li&gt;&lt;li&gt;New &lt;span style="font-style: italic;"&gt;whitespace&lt;/span&gt; module, which uses &lt;span style="font-weight: bold;"&gt;(remap-keys)&lt;/span&gt; to convert &lt;span style="font-style: italic;"&gt;TAB&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;CR&lt;/span&gt;, and &lt;span style="font-style: italic;"&gt;LF&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;SPACE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;retro.config&lt;/span&gt;&lt;/span&gt; renamed to &lt;span style="font-style: italic;"&gt;extensions&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Minor cleanups to start organizing the modules&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;My short term plans are to finish organizing the module sources, and to put up an online tool for building a custom &lt;span style="font-style: italic;"&gt;forth.image&lt;/span&gt; without requiring anything other than a web browser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-9133677081990813580?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/9133677081990813580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=9133677081990813580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/9133677081990813580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/9133677081990813580'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/release-20080426.html' title='Release 2008.04.26'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3151357135524664014</id><published>2008-04-24T22:07:00.002-04:00</published><updated>2008-04-24T22:10:16.605-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retro'/><category scheme='http://www.blogger.com/atom/ns#' term='io'/><category scheme='http://www.blogger.com/atom/ns#' term='console'/><title type='text'>Possible change to 'key'</title><content type='html'>As mentioned by Snoopy42 on #retro, the Retro 10 system has been ignoring any whitespace separators other than space. Since this can be a problem, I've modified &lt;span style="font-weight: bold;"&gt;key&lt;/span&gt; to convert other whitespace forms (return, tab) into spaces. I'm not sure I like this, so stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3151357135524664014?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3151357135524664014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3151357135524664014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3151357135524664014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3151357135524664014'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/possible-change-to-key.html' title='Possible change to &apos;key&apos;'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2250516311922619040</id><published>2008-04-24T18:52:00.005-04:00</published><updated>2008-05-03T10:41:32.100-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Ngaro JS performance improvements</title><content type='html'>The Ngaro in JavaScript (&lt;span style="font-style: italic;"&gt;jsvm&lt;/span&gt;) is now fast enough to actually be useable. It's still slower than the Java and C implementations, but I'm now comfortable with the performance.&lt;br /&gt;&lt;br /&gt;Now to apply some CSS to improve the look and feel a bit....&lt;br /&gt;&lt;br /&gt;For those who are curious about what I did, all it took was:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Put in a loop to call vm_process() more than once per 10ms interval&lt;/li&gt;&lt;/ul&gt;I also experimented a bit with loop unrolling, but didn't notice enough of a payoff for the code duplication it brought.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2250516311922619040?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2250516311922619040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2250516311922619040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2250516311922619040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2250516311922619040'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/ngaro-js-performance-improvements.html' title='Ngaro JS performance improvements'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-3615711045312643586</id><published>2008-04-21T20:17:00.005-04:00</published><updated>2008-04-21T20:57:21.451-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ngaro'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>New Implementations of Ngaro</title><content type='html'>I've been planning to write implementations of Ngaro in other languages for a while now. Over the last few days, I have (&lt;span style="font-style: italic;"&gt;with input from erider in the #keow channel on irc.freenode.net&lt;/span&gt;) written two new Ngaro implementations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JavaScript&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first implementation was done in JavaScript. It presents a form-based interface that allows for a crude approximation of the tty console I/O model. Though brutally slow and memory hungry, it does work and seems quite reliable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While far from my favorite language, I recognize that Java is fairly widespread, so yesterday I wrote a quick and dirty implementation in Java. This is running as a Java applet, and still has some bugs in the I/O device emulation, but does work. It does have an advantage over the JavaScript: this one is very fast.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Future&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'll be cleaning up and working on merging the source for these into the main Retro codebase. Beyond this, I hope to eventually get the JavaScript implementation to run at an acceptable speed. The Java version is fast enough, and will hopefully have its bugs ironed out soon.&lt;br /&gt;&lt;br /&gt;Eventually I'd like to have a couple of variations on the Java implementation. It would be nice to run Retro on a Java-capable cell phone or pda, and having an offline version would be useful as well. Given enough time, it's possible that the full graphical console I/O devices could be emulated.&lt;br /&gt;&lt;br /&gt;Looking out even further, I am currently doing some research on .NET; an implementation of Ngaro for .NET could also be a big help in improving platform support.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;References&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://charleschilders.com/ngaro/jsvm"&gt;http://charleschilders.com/ngaro/jsvm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://charleschilders.com/ngaro/java"&gt;http://charleschilders.com/ngaro/java&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-3615711045312643586?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/3615711045312643586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=3615711045312643586' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3615711045312643586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/3615711045312643586'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/new-implementations-of-ngaro.html' title='New Implementations of Ngaro'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8692544567824462186.post-2621192722071978195</id><published>2008-04-21T19:59:00.000-04:00</published><updated>2008-04-21T20:02:23.127-04:00</updated><title type='text'>RetroNews, 2.0</title><content type='html'>A few years ago I kept a blog of news and musings related to RetroForth. I stopped updating it and it faded away after the RetroForth 9.x series and my long pause from development.&lt;br /&gt;&lt;br /&gt;Since I'm now actively working on Retro again, I've decided to restart blogging as a means of sharing what I'm working on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8692544567824462186-2621192722071978195?l=retroforth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://retroforth.blogspot.com/feeds/2621192722071978195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8692544567824462186&amp;postID=2621192722071978195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2621192722071978195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8692544567824462186/posts/default/2621192722071978195'/><link rel='alternate' type='text/html' href='http://retroforth.blogspot.com/2008/04/retronews-20.html' title='RetroNews, 2.0'/><author><name>Charles Childers</name><uri>http://www.blogger.com/profile/12104378362063552074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
