<?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-551282639507073126</id><updated>2011-12-22T13:34:31.769-08:00</updated><category term='beer'/><category term='Jupiter Ace'/><category term='failosophy'/><category term='small'/><category term='hot irons'/><category term='assembler'/><category term='french polishing'/><category term='mouse guts'/><category term='ufat2'/><category term='library'/><category term='8255'/><category term='mmm'/><category term='ST'/><category term='eye strain'/><category term='retro computer museum'/><category term='acorn atom'/><category term='LED'/><category term='software master'/><category term='bakewell tart'/><category term='Chuckie egg'/><category term='dac'/><category term='de-yellowing'/><category term='yellowing'/><category term='antex'/><category term='PROGMEM'/><category term='wingasm'/><category term='Double Choc Chip Muffins'/><category term='IO'/><category term='high voltage programming'/><category term='efficient'/><category term='sio2sd'/><category term='6502 second processor'/><category term='PIC'/><category term='6502'/><category term='cassette'/><category term='vic20'/><category term='cassette interface'/><category term='gaming'/><category term='c64'/><category term='DevicePrint'/><category term='video ram replacement'/><category term='compact flash'/><category term='video head'/><category term='filesystem'/><category term='retro hard-on'/><category term='POV'/><category term='ts1000'/><category term='avr'/><category term='BBC micro'/><category term='arduino shield'/><category term='oscilloscopes'/><category term='weewee'/><category term='Max6956'/><category term='wodges of IO'/><category term='Apple ][ 2 two'/><category term='arcade spinner'/><category term='pcm'/><category term='fuse'/><category term='jiffydos'/><category term='Master 128'/><category term='bird&apos;s nest'/><category term='rom box'/><category term='eeprom'/><category term='FAT'/><category term='string'/><category term='sd2iec'/><category term='vc20'/><category term='sd'/><category term='wire library'/><category term='porn'/><category term='Atari 800'/><category term='tweaking'/><category term='BBC 6502 second processor'/><category term='sd2mmc'/><category term='Acorn BBC Micro'/><category term='stray capacitance'/><category term='microcode'/><category term='fuses'/><category term='cake'/><category term='if'/><category term='proto shield'/><category term='Apple 2e'/><category term='fram'/><category term='heroic failure'/><category term='arduino'/><category term='zxpander'/><category term='soldering'/><category term='joey beltram'/><category term='glue'/><category term='c128'/><category term='MMC'/><category term='6522'/><category term='silliness'/><category term='mmc2iec'/><category term='seadragon'/><category term='spi'/><category term='lego robot'/><category term='spi software master'/><category term='PCB'/><category term='QL'/><category term='google chrome'/><category term='techadventure'/><category term='mmc interface'/><category term='test equipment porn'/><category term='lying'/><category term='zx81'/><category term='matron'/><category term='mmbeeb'/><category term='zx spectrum'/><category term='cadsoft eagle'/><category term='turtle cheesecake'/><category term='atmel'/><category term='Spectrum 128'/><category term='RCM'/><title type='text'>Arduino Nut</title><subtitle type='html'>Sorted by Squirrels.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></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-551282639507073126.post-7636705168006868319</id><published>2011-03-15T14:52:00.000-07:00</published><updated>2011-03-17T07:51:30.422-07:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-gMeSZg-9an8/TX_fppgMw3I/AAAAAAAABg0/Y_FcSy1gwHI/s1600/working.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://4.bp.blogspot.com/-gMeSZg-9an8/TX_fppgMw3I/AAAAAAAABg0/Y_FcSy1gwHI/s400/working.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5584427969571242866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I always use this program as the benchmark test. If you've ever owned a ZX81 then you know what it is. It has such a strong resonance with me. The first time it loaded from tape after the tense 6 minutes of FSK madness it almost stopped my heart. And then I played it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fast forward 30 years...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ladies and Gentlemen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ZXpand.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/-jH5Ui-50ekU/TX_jCzOmMdI/AAAAAAAABhE/8rZht-dZdWg/s400/front.JPG" style="cursor:pointer; cursor:hand;width: 400px; height: 162px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5584431700213379538" /&gt;&lt;img src="http://4.bp.blogspot.com/-LNruw1ZNaw0/TX_jDPISytI/AAAAAAAABhM/PCe_b3o13MA/s400/back.JPG" style="cursor:pointer; cursor:hand;width: 400px; height: 159px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5584431707703134930" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Allow 28 days for delivery...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...or &lt;a href="http://cgi.ebay.co.uk/ws/eBayISAPI.dll?ViewItem&amp;amp;item=350448200844"&gt;get one in 10&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;See previous post for links to further information.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&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/551282639507073126-7636705168006868319?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7636705168006868319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7636705168006868319' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7636705168006868319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7636705168006868319'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2011/03/i-always-use-this-program-as-benchmark.html' title=''/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-gMeSZg-9an8/TX_fppgMw3I/AAAAAAAABg0/Y_FcSy1gwHI/s72-c/working.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-4141954840583089684</id><published>2011-03-15T00:41:00.000-07:00</published><updated>2011-03-15T04:20:09.060-07:00</updated><title type='text'>ZXpand Issue 1</title><content type='html'>&lt;div&gt;Rex lies in wait.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-vC93njm5N0M/TX8Yq9qmfkI/AAAAAAAABgY/Lo4lAILjTxk/s1600/DSCF4505.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 152px;" src="http://3.bp.blogspot.com/-vC93njm5N0M/TX8Yq9qmfkI/AAAAAAAABgY/Lo4lAILjTxk/s400/DSCF4505.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5584209189349523010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-wUvwdzsJTb4/TX8YqxPy3hI/AAAAAAAABgQ/IteejWkqIYs/s1600/DSCF4502.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 150px;" src="http://3.bp.blogspot.com/-wUvwdzsJTb4/TX8YqxPy3hI/AAAAAAAABgQ/IteejWkqIYs/s400/DSCF4502.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5584209186015862290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class="MsoPlainText"&gt;More details and a draft manual appear on &lt;a href="http://www.rwapsoftware.co.uk/zx812.html"&gt;http://www.rwapsoftware.co.uk/zx812.html&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-4141954840583089684?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/4141954840583089684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=4141954840583089684' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4141954840583089684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4141954840583089684'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2011/03/zxpand-issue-1.html' title='ZXpand Issue 1'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-vC93njm5N0M/TX8Yq9qmfkI/AAAAAAAABgY/Lo4lAILjTxk/s72-c/DSCF4505.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8263114423153827520</id><published>2011-03-14T14:49:00.001-07:00</published><updated>2011-03-14T15:05:31.257-07:00</updated><title type='text'>Making things</title><content type='html'>&lt;div&gt;I love making things. Tonight I made this thing:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Do3OLRx1y8U/TX6Npp4MJ9I/AAAAAAAABf8/flc2lXpDHds/s1600/DSCF4490.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://3.bp.blogspot.com/-Do3OLRx1y8U/TX6Npp4MJ9I/AAAAAAAABf8/flc2lXpDHds/s400/DSCF4490.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5584056334741678034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a twin ROM switcher, or rather 2 twin ROM switchers, one of which is destined for a C64. JiffyDOS enhanced kernal in one side, regular kernal ROM in the other. SPDT switch added to the pads with a common centre and it's cake time! I'll post a minimal entry when it's looking a little more complete.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been making PCBs for a few months now and I'm getting to the stage where I need to start investing in some beginner++  equipment. I have a ghetto UV exposure box that some kind soul freecycled a few years back. It just about does the job but it only has one tube and that makes getting an even exposure hard. You can see on this board that one side is either overexposed, overdeveloped,  overunderdeveloped or underoverexposed. Or something. I'll never know, I guess. I suppose seeing that the traces have disappeared then either the negative wasn't pressed closely enough to the PCB or it was overexposed. Reviewing what I did this evening I find it hard to see how I could overexpose one edge like that. That is the mystery and marvel of this process - you have to aim for a zen-like approach otherwise it will end in tears.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Still I think it'll work. I designed this mainly so that I could try out the new PCB material that I sourced. It's a lot cheaper than the usual gear that I score &lt;schnooort&gt;. Even with my relatively inexperienced dabbling I know I have to get a feel for how it reacts to the chemicals. See? Zen again. The design has a lot of traces weaving through the space between pads. It scared me a little while I was eagling it. Ha but now who's the daddy eh?!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway now I've rambled and the board appears to have dried of natural causes I'm off to drill it. Super!&lt;/div&gt;&lt;div&gt;&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/551282639507073126-8263114423153827520?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8263114423153827520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8263114423153827520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8263114423153827520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8263114423153827520'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2011/03/making-things.html' title='Making things'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Do3OLRx1y8U/TX6Npp4MJ9I/AAAAAAAABf8/flc2lXpDHds/s72-c/DSCF4490.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6759212282331788469</id><published>2011-03-11T14:37:00.000-08:00</published><updated>2011-03-15T04:13:59.636-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zxpander'/><category scheme='http://www.blogger.com/atom/ns#' term='zx81'/><title type='text'>Presenting: ZXpand!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Rt5JJLEePig/TXqkZNIaHjI/AAAAAAAABfk/Il54Kz2kvvw/s1600/PROTO1.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 224px;" src="http://3.bp.blogspot.com/-Rt5JJLEePig/TXqkZNIaHjI/AAAAAAAABfk/Il54Kz2kvvw/s400/PROTO1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5582955441007762994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;It's only taken me about 3 years.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the test fitting of ZXpander prototype 1. You can clearly see that there are some sockets empty. Well, I didn't want to overwhelm the poor old chap.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And yes, it worked! Eventually. After being hacked around so badly that the poor thing's mother didn't even recognise it. It ended up carrying another chip and looking somewhat like Joseph Merrick. But let's not get ahead of ourselves! This was P1, after all. Things are supposed to change. So to P2! Fast forward to only 9 months ago!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My good friend and inspiration Ramoth had been extolling the virtue of programmable logic. He has made the transition to the state of the art while I, comme d'habitude, crept in at the lower, and rather more obsolete level. I decided that I could just about cope with GALs and maybe, just maybe these would provide the answer to my overcrowded board problem! For that is what I had. I couldn't lay out the board to any degree of satisfaction now that 7 TTL chips were required.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So one eBay purchase of the most basic programmer capable of writing GAL fuse maps later, I was dipping my toe into the confusing and contrary world of programmable logic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The best thing about setting out to work with obsolete technology is the complete lack of any decent documentation and sample code. Oh hang on, that's not the best thing is it. That's the _worst_ thing. Ho hum. Still, after having crawled inch by bloody inch up the steepest learning curve I've ever encountered since girls, I managed to make P2 work. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's its good side...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/-Yd0bfQViKq0/TXqpe_rGcaI/AAAAAAAABfs/2T9HMRGuylk/s400/DSCF4479.JPG" style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5582961038032531874" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;5 TTL chips lighter, this one only required some very delicate hacking...&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/-a4ezcTVRHhI/TXqqL1oyaDI/AAAAAAAABf0/baPHjrhS6fc/s400/DSCF4483.JPG" style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5582961808432588850" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JESUS! What have you done to it man!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well it needed some ICSPing. And an extra AND gate. And the 'get it quick' prototype board from PCBTrain doesn't get solder mask, so ... it's not pretty. I realise this. But you know what?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=hvgdcpwpknY"&gt;It works.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;P3 is immanent. Watch this space!&lt;/div&gt;&lt;div&gt;&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/551282639507073126-6759212282331788469?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6759212282331788469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6759212282331788469' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6759212282331788469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6759212282331788469'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2011/03/presenting-zxpander.html' title='Presenting: ZXpand!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Rt5JJLEePig/TXqkZNIaHjI/AAAAAAAABfk/Il54Kz2kvvw/s72-c/PROTO1.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-7124155510550910424</id><published>2010-02-18T15:05:00.001-08:00</published><updated>2010-02-18T15:17:21.683-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tweaking'/><category scheme='http://www.blogger.com/atom/ns#' term='zx81'/><category scheme='http://www.blogger.com/atom/ns#' term='soldering'/><title type='text'>DMAybe</title><content type='html'>&lt;div&gt;This little cutie is the dogs dinner pudding.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/S33HxkGRf1I/AAAAAAAABJA/Myqgsm53Kz8/s1600-h/DMACONTROLLER.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/S33HxkGRf1I/AAAAAAAABJA/Myqgsm53Kz8/s400/DMACONTROLLER.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5439723579250933586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've wired and programmed the controller to assert /BUSRQ, wait for /BUSAK and then have its wicked wicked way with the address, data and /WR lines. Thus effecting some access to memory directly for the uC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not enough unfortunately. I'd forgotten that my internal 32K expansion requires /MREQ to be asserted in order to enable the memory decoder. Which would explain why it doesn't work :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That and the phantom blips on the /RD line that I'm seeing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/S33JKJC08iI/AAAAAAAABJI/1_C9IbKCAvk/s1600-h/phantom.bmp"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 189px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/S33JKJC08iI/AAAAAAAABJI/1_C9IbKCAvk/s400/phantom.bmp" border="0" alt="" id="BLOGGER_PHOTO_ID_5439725100997079586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't know yet whether this is the ZX81's ULA interfering or some pedigree chum-based effect that would go away if I soldered the thing more carefully..!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;I'm glad I've built a prototype - even if it is kind of awful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;I'm off to do some more soldering and a bit of firmware tweaking. Be right back.&lt;/div&gt;&lt;div&gt;&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/551282639507073126-7124155510550910424?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7124155510550910424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7124155510550910424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7124155510550910424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7124155510550910424'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2010/02/dmaybe.html' title='DMAybe'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6_haRsOYg8/S33HxkGRf1I/AAAAAAAABJA/Myqgsm53Kz8/s72-c/DMACONTROLLER.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-963612399643849638</id><published>2010-02-14T02:26:00.000-08:00</published><updated>2010-02-14T03:12:06.801-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cadsoft eagle'/><category scheme='http://www.blogger.com/atom/ns#' term='zx81'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><title type='text'>Laid out cold</title><content type='html'>&lt;div&gt;Here is the manually routed board according to the schematic posted last week.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/S3fScvXAaKI/AAAAAAAABHg/SwdMtMUDTBU/s1600-h/6965.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/S3fScvXAaKI/AAAAAAAABHg/SwdMtMUDTBU/s400/6965.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5438046466264295586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've learned a lot in the past few weeks. This layout is the result of having the patience to &lt;a href="http://www.youtube.com/watch?v=No2ukc5V4EM"&gt;rip it up&lt;/a&gt; and start again. Multiple times. I think this is the 4th iteration so far.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've broken a few rules along the way, I'm sure, but having looked at  the Gerber files in a suitable viewer I think, at least electrically, it might work. When I say work I mean not go on fire. There are no bits overlapping when they shouldn't, no vias encroaching uncomfortably on one another's personal space, and no wires with insufficient clearance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having two layers to work on at board-house resolution makes things significantly easier than working at home-brew resolution on single-side designs. Sticking to a few rules which at first seemed punitive and arbitrary has produced a good result. One layer has tracks running horizontally, the other has them vertical. It's hard to describe how this makes things easier but once you start routing it surely does. Some board houses restrict the number of vias you can use, but the one I intend to use has &lt;a href="http://www.youtube.com/watch?v=aFd5Cci_pE4"&gt;no limit&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I find this activity strangely relaxing. If I knew what a zen-like state was then I think this may approach that. It's rare these days that I get into any kind of zone but taking time out to sit with Eagle for an hour gets me really close.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I finished routing this board despite the fact that I decided to use a different IO expander halfway through due to the fact that:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;MAX6956 are nearly £10 each to buy...&lt;/li&gt;&lt;li&gt;...when you can actually source them from somewhere.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The MAX has some nice features, not merely the fact that the IO pins line up reasonably neatly with the address lines on the RAM chip. And the fact I've &lt;a href="http://arduinonut.blogspot.com/2008/10/tier-jerker.html"&gt;used it before&lt;/a&gt; helps too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I have aligned myself with the Microchip &lt;a href="http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en023499"&gt;MCP23x17&lt;/a&gt;. It's a 16 port expander with either I2C or SPI interfaces. If the SPI version can live peacefully with the MMC interface then I'll choose that - it can be driven faster than the I2C version. There will be times when I'll be reading from MMC and simultaneously driving address lines via the expander. The MMC transfers have to happen in a stream and unless I can cache an entire sector's worth of data in one go then the actions will have to be interleaved. If that's not possible then I'll be looking out for a bit-banged I2C implementation. The I2C and SPI pins and registers are shared on the PIC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course I'll have to try all this out before I commit to FR4. This is the dogs-dinner prototype. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/S3fYwIOU_WI/AAAAAAAABHw/pFqiDTUDXBw/s1600-h/woofwoof.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/S3fYwIOU_WI/AAAAAAAABHw/pFqiDTUDXBw/s400/woofwoof.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5438053396426063202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/S3fYvuD7vPI/AAAAAAAABHo/EG-rlbfHDgk/s1600-h/withprog.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/S3fYvuD7vPI/AAAAAAAABHo/EG-rlbfHDgk/s400/withprog.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5438053389403143410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's not going to be any MMC on there for the moment - the idea is that I'll be using the board to try some elementary DMA by driving the address and data lines on the ZX81. Once I get that working I'll turn my attention to trying simultaneous expander and card access. That can be done on a breadboard though.&lt;/div&gt;&lt;div&gt;&lt;br /&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/551282639507073126-963612399643849638?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/963612399643849638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=963612399643849638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/963612399643849638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/963612399643849638'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2010/02/laid-out-cold.html' title='Laid out cold'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/S3fScvXAaKI/AAAAAAAABHg/SwdMtMUDTBU/s72-c/6965.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6774679859809416117</id><published>2010-02-08T14:04:00.000-08:00</published><updated>2010-02-10T12:31:37.783-08:00</updated><title type='text'>ZX81 MMC Redux</title><content type='html'>I like a good faff and I suspect you do too. Don't be ashamed. We all do it. However I've done rather too much of it recently and I'm going a little blind.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I want one of these:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/S3MXbtuKbFI/AAAAAAAABGY/KKueLXKxWGQ/s1600-h/schema.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/S3MXbtuKbFI/AAAAAAAABGY/KKueLXKxWGQ/s400/schema.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5436714940063444050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://bbmmc.googlegroups.com/web/zxpicmmc-fullmonty.sch"&gt;Eagle schematic here&lt;/a&gt; (you might need to right-click-save-as)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I'm going to have to bite the bullet and make one. I've decided that the simplicity of bit-banging is all very well and good but sometimes ambition should be allowed free reign.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With that in mind may I present 'The ZX81MMCRAMANDIO Board'!! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;Ahem I'll be sacking the marketing man later.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a combined 32K RAM, SD/MMC and IO interface for a ZX81. 32K of static ram from 8K-40K will give true hires capability. A jumper will allow the on-board RAM to be disabled on those machines already internally expanded. It will be able to perform some basic DMA and be able to fill the machine's RAM with code and data from the SD/MMC card. This eliminates the need for loading of firmware from cassette or having external ROM. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Z80 processor has a rather endearing ability to hold itself off the bus when requested. I'll be using this facility to effect the DMA. Simply assert the BUSRQ line and the Z80 lifts its legs obligingly from the circuit. At this point the uC will use some chip or other (a MAX6965 in this first design but I'll have to change this - too expensive) to drive the address lines of the RAM whilst jeffing program data into its bytey cells. The ZX81 will need to be in FAST mode (ha!) whilst this in progress in order that the ULA be quieted and diverted from its usual NMI generation duties which would spoil things rather.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a project I've been promising for way too long now and finally I think it's time to commit a design to PCB for manufacture. Follow me if you will. I think it'll be rather fun :)  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll publish all my materials along the way if you want to play too. As I'm planning to make some of these to sell I'm afraid I'll have to assert some rights though - these ones look quite nice.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-nc/2.5/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc/2.5/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;This work is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-nc/2.5/"&gt;Creative Commons Attribution-Noncommercial 2.5 Generic License&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Feel free to remix, rework or improve, doodle dawdle or derive. Comments welcomed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TTFN!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-6774679859809416117?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6774679859809416117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6774679859809416117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6774679859809416117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6774679859809416117'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2010/02/zx81-mmc-redux.html' title='ZX81 MMC Redux'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/S3MXbtuKbFI/AAAAAAAABGY/KKueLXKxWGQ/s72-c/schema.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8632966303359930544</id><published>2010-01-20T04:33:00.000-08:00</published><updated>2010-01-20T04:39:25.177-08:00</updated><title type='text'>Pinout heaven</title><content type='html'>I was thinking the other day about how difficult it can be to find information about a particular pinout for some obscure system or other. I was vaguely considering collecting these useful nuggets and publishing them myself but, for goodness' sake, I can't even add new items to my blog..!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was with some relief that I found this site detailing vintage consoles and computers:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.6502.co.uk/colmods.htm"&gt;http://www.6502.co.uk/colmods.htm&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.6502.co.uk/colmods.htm"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'd love to know what a propellent actuated device is...&lt;/div&gt;&lt;div&gt;&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/551282639507073126-8632966303359930544?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8632966303359930544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8632966303359930544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8632966303359930544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8632966303359930544'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2010/01/pinout-heaven.html' title='Pinout heaven'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-7298703750034163213</id><published>2009-11-20T13:41:00.000-08:00</published><updated>2009-11-20T14:11:54.959-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mmm'/><category scheme='http://www.blogger.com/atom/ns#' term='test equipment porn'/><category scheme='http://www.blogger.com/atom/ns#' term='oscilloscopes'/><title type='text'>I didn't want to leave.</title><content type='html'>&lt;div&gt;I visited an amazing shop a while ago. I wanted an oscilloscope and the local supermarket was right out, apparently, so a quick search on teh interwebs and this goldmine was revealed... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SwcNdxyYfJI/AAAAAAAABBM/GTUqGH0pHSI/s1600/candystoresweetshop.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SwcNdxyYfJI/AAAAAAAABBM/GTUqGH0pHSI/s400/candystoresweetshop.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5406304682913594514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There was more around the corner and behind the outcrop on the right. And even then all stock wasn't accounted for. Despite this the owner knew every item intimately. Well, not in the biblical sense. Ahem.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;This is what I went home with:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SwcOnqzsCjI/AAAAAAAABB4/FUCcetaqiS8/s1600/mybaby.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SwcOnqzsCjI/AAAAAAAABB4/FUCcetaqiS8/s400/mybaby.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5406305952350341682" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SwcOnqzsCjI/AAAAAAAABB4/FUCcetaqiS8/s1600/mybaby.jpg"&gt;&lt;/a&gt;The top one - a Tektronix 465B. Yes, of course I wanted it *all*, but, you know, space. The prices were stupendous and it was obvious that the owner was a real true equipment geek. There were instruments in the rear recesses of the shop which were straight out of a gothic horror - brass spheres held aloft a glass tube encased in a brass and rosewood cabinet - an actual piece of test equipment used for measuring kilovolts on overhead wires. Huge knife bladed switches and variable resistors where the resistance was set by inserting plugs at intervals along parallel copper bars... And a pile of meters and programmers and signal generators and... what the... I have no idea what some of these things were.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And the smell... Divine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Anyways. That was a while ago. I offered to advertise the establishment but the proprietor was busy enough without the additional traffic. But I'm sure that if you were within visiting distance of Reading, England and you asked...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.stewart-of-reading.co.uk/"&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;http://www.stewart-of-reading.co.uk/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&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/551282639507073126-7298703750034163213?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7298703750034163213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7298703750034163213' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7298703750034163213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7298703750034163213'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/11/i-didnt-want-to-leave.html' title='I didn&apos;t want to leave.'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_E6_haRsOYg8/SwcNdxyYfJI/AAAAAAAABBM/GTUqGH0pHSI/s72-c/candystoresweetshop.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-9142647807999744805</id><published>2009-10-08T12:21:00.000-07:00</published><updated>2009-10-21T14:38:56.060-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC'/><category scheme='http://www.blogger.com/atom/ns#' term='microcode'/><category scheme='http://www.blogger.com/atom/ns#' term='acorn atom'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><title type='text'>PL8-2, R2D2's Dad.</title><content type='html'>My children used to refer to C3PO as R2D2's dad. Funny how those minds work, isn't it.&lt;br /&gt;&lt;br /&gt;I used to think that real fun could never be anything other than corporeal.&lt;br /&gt;&lt;br /&gt;That just goes to show. &lt;span style="font-style:italic;"&gt;This&lt;/span&gt; is the most fun that I've had in a while :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/whaMETv52aeVyJEuSox5Ng?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_E6_haRsOYg8/Ss48vA2v3QI/AAAAAAAAA6I/x6zkCxFvliU/s400/DSCF3244.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's the V2 incarnation (can that be right? There's no meat here..!) of the PL8 MMC interface.&lt;br /&gt;&lt;br /&gt;Here she is, in full component-side glory.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AqmIISRwq8oWe3yrCq4UeA?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_E6_haRsOYg8/Ss487RoFsJI/AAAAAAAAA6M/KMEIJKFOmfA/s400/DSCF3249.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The TTL is a simple read/write decoder. The port onto which this fits provides rough address decoding. I wish it would shave. I hate the chafing.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/WIhnCgfnzhdU2kcoAhY9iA?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_E6_haRsOYg8/Ss49JFse8eI/AAAAAAAAA6s/SrgnByTA0fQ/s400/DSCF3254.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;But I do so love the wiring.&lt;br /&gt;&lt;br /&gt;It's a PIC - one of those manly sorts with the parallel slave port. I know it's terribly incorrect to use the word slave - oops I used it again! sorry! but that's just what it is. So the parallel slave port behaves like a chunk of selection logic and wakes the PIC when a read or write occurs. There are /RD and /WR lines. The microcode on the PIC  latches data ready to be presented on a port when the /RD line is asserted. No delay, it behaves just as a latch would. Similarly asserting the /WR line will latch the values present on the data bus to a register. Interrupts ensure that these events are recognisable and the remainder of the uC code is shuffling data to and fro.&lt;br /&gt;&lt;br /&gt;The performance of this type of interface is already documented in another post &lt;&gt;  &lt;cough&gt;milliseconds to load programs &lt;&gt; so&lt;cough&gt; I won't go into it here.&lt;br /&gt;&lt;br /&gt;Needless to say schematics and code, both micro and 6502,  are available if you'd like them.&lt;/cough&gt;&lt;/cough&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-9142647807999744805?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/9142647807999744805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=9142647807999744805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9142647807999744805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9142647807999744805'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/10/pl8-2-r2d2s-dad.html' title='PL8-2, R2D2&apos;s Dad.'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_E6_haRsOYg8/Ss48vA2v3QI/AAAAAAAAA6I/x6zkCxFvliU/s72-c/DSCF3244.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-4992193299514264362</id><published>2009-10-08T12:04:00.000-07:00</published><updated>2009-10-08T12:19:39.206-07:00</updated><title type='text'>Atom VRAM mod</title><content type='html'>I have really struggled with the question 'should I modify this rare vintage micro or leave it as-is?'&lt;br /&gt;&lt;br /&gt;Well. The thing about the Atom was that it invited modification.&lt;br /&gt;&lt;br /&gt;So I came.&lt;br /&gt;&lt;br /&gt;To the party that is, the one that the Atom invited me to. Honestly. Some people.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/GPtPwF2CzgINRCN2v3gicA?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_E6_haRsOYg8/Ss45xQPyhdI/AAAAAAAAA5U/A3V7BGDRonQ/s800/DSCF3242.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the truncated version of the ill-conceived all-in-one memory board that I started some while ago. It's simply VRAM. Nice. Witness the burned-off resist at or about pin 15. Ahem. Ah well, it's all for the greater good. 2114s are not exactly super-rare, but they use so much wattage. It's not green, it really isn't.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-4992193299514264362?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/4992193299514264362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=4992193299514264362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4992193299514264362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4992193299514264362'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/10/atom-vram-mod.html' title='Atom VRAM mod'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_E6_haRsOYg8/Ss45xQPyhdI/AAAAAAAAA5U/A3V7BGDRonQ/s72-c/DSCF3242.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-7697142526431754538</id><published>2009-10-06T13:21:00.000-07:00</published><updated>2009-10-06T13:29:55.158-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RCM'/><category scheme='http://www.blogger.com/atom/ns#' term='retro computer museum'/><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>Retro Computer Museum Open Day 2009</title><content type='html'>The organisation most commonly known as The Retro Computer Museum are having another all-day gaming event. For those in the UK willing to travel to Leicester you should &lt;a href="http://www.retrocomputermuseum.co.uk/"&gt;visit their site&lt;/a&gt; and get the low-down.&lt;br /&gt;&lt;br /&gt;I'll be taking a boot load of kit to fiddle with over the course of the day and I might even indulge in a little gaming. I'm mad like that, me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-7697142526431754538?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7697142526431754538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7697142526431754538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7697142526431754538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7697142526431754538'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/10/retro-computer-museum-open-day-2009.html' title='Retro Computer Museum Open Day 2009'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-5305973368922688748</id><published>2009-10-06T13:10:00.000-07:00</published><updated>2009-10-06T13:35:05.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chuckie egg'/><category scheme='http://www.blogger.com/atom/ns#' term='mmbeeb'/><category scheme='http://www.blogger.com/atom/ns#' term='Acorn BBC Micro'/><title type='text'>MMBeeb</title><content type='html'>Not a voluptuous expression of joy for a broadcaster, but one of these...&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/O5OaiBlz3RsdYveo5Jv-LQ?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_E6_haRsOYg8/Srp2pad5kHI/AAAAAAAAAzo/y-Eegoiiwxk/s400/DSCF3221.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;... being an MMBeeb board. I have mentioned them before, but I've improved the design somewhat since then. This is from the last batch. SMT components and a rather cheeky regulator placement make these the tiniest and most comely batch yet. I like to make each one different, unique. Electrically they're identical but each has its own character. I like to talk to them when I'm alone.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/lu1vuTfpkGqv5-owJFGUPg?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_E6_haRsOYg8/Srp22ccLXgI/AAAAAAAAAzs/bY58JqKBQQs/s400/DSCF3230.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;An MMBeeb board plugs into the user port of a BBC Micro and coupled with some smart coding by the original creator &lt;a href="http://members.lycos.co.uk/mmbeeb/"&gt;Martin Mather&lt;/a&gt; gives the contemporary BBC Micro user the ability to have at their disposal literally thousands of disk images all instantly selectable and appearing as though a genuine 5.25" disk.&lt;br /&gt;&lt;br /&gt;They're fast too, programs load in seconds. G'orn there &lt;a href="http://www.repton3.co.uk/chuckieegg.aspx"&gt;Chuckie Egg!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-5305973368922688748?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/5305973368922688748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=5305973368922688748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5305973368922688748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5305973368922688748'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/10/mmbeeb.html' title='MMBeeb'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_E6_haRsOYg8/Srp2pad5kHI/AAAAAAAAAzo/y-Eegoiiwxk/s72-c/DSCF3221.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6275727084457698364</id><published>2009-09-14T02:19:00.001-07:00</published><updated>2009-10-06T13:10:23.735-07:00</updated><title type='text'>Mending</title><content type='html'>Finally I've had some movement towards finishing a job. Really, it's been a long time :)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A poorly Atom belonging to a friend required a key switch fix. The keyboard on Atom motherboards of issues 1..4 is a strange all-in-one affair where the switch mechanism is a pair of counter-wound springs which connect when a weedy plastic plunger depresses them. They are puny and prone to breaking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only effective fix is to cut out the broken part and insert a new switch, as I believe I have blogged about before. This would be a new challenge as the switches I replaced before were at the end of a row and were changed as a unit. This time I would attempt a single unit as I have run out of replacement parts to do the two adjacent switches...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/TTOPMssHdz3Cu_F9QmEfcg?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_E6_haRsOYg8/Sq6TzRFbgJI/AAAAAAAAAt4/dOK1IRAIo94/s400/DSCF3170.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This is the first time I've used my callipers and I must say they're jolly useful.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Eg9bXqXDRulGOJx64VTYtA?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_E6_haRsOYg8/Sq6UK9ICJfI/AAAAAAAAAuY/ZNBsb58-eMU/s400/DSCF3172.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Here's the replacement switch ready to be dropped in. The antennae were added so that the tiny whisker-like wires at the base of the switch would register correctly with the holes on the PCB. The replacement part is ever-so-teensily different from the one it's replacing, so registration wasn't guaranteed when sliding the piece into the anxiously awaiting gap. When the sides of the switch were coated with superglue that would have been a problem. The extensions fell away as expected when the solder joints were applied.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/00AfjLDpImCKu-bzRbPuAg?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_E6_haRsOYg8/Sq6VGLs5qnI/AAAAAAAAAvQ/YSg5P0PqOYw/s400/DSCF3178.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Hurrah!&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/QJmuI5PIcXnOI9UKNhHIIA?authkey=Gv1sRgCJrZq-X_1ePLXw&amp;amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_E6_haRsOYg8/Sq6V1a4HSDI/AAAAAAAAAwI/o6vF4jZ5oJg/s400/DSCF3181.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&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/551282639507073126-6275727084457698364?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6275727084457698364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6275727084457698364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6275727084457698364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6275727084457698364'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/09/mending.html' title='Mending'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_E6_haRsOYg8/Sq6TzRFbgJI/AAAAAAAAAt4/dOK1IRAIo94/s72-c/DSCF3170.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-1850632935066648162</id><published>2009-09-08T06:00:00.000-07:00</published><updated>2009-09-08T06:03:30.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lego robot'/><title type='text'>Grzzzzzz!</title><content type='html'>&lt;img src="http://photos-c.ak.fbcdn.net/photos-ak-sf2p/v126/94/90/584888125/n584888125_321042_6703.jpg" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With a Pic for a brain and a mouse for motion tracking you should consider your hiding options before the head-mounted laser gets added. &lt;a href="http://www.myrobotoverlord.com/riot-robot-design.html"&gt;You have been warned!&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&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/551282639507073126-1850632935066648162?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/1850632935066648162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=1850632935066648162' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/1850632935066648162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/1850632935066648162'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/09/grzzzzzz.html' title='Grzzzzzz!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-2095956424027824742</id><published>2009-06-23T08:30:00.000-07:00</published><updated>2009-06-23T09:11:11.788-07:00</updated><title type='text'>Learning as you go</title><content type='html'>FAIL!&lt;br /&gt;&lt;br /&gt;The board was a brave attempt, but I should have trusted my instincts which said 'This shouldn't work. There's strange voodoo happening.' Here's the inspiration:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SkD5ypTFC4I/AAAAAAAAAn0/6-i4azM0v3M/s1600-h/8khoog.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 205px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SkD5ypTFC4I/AAAAAAAAAn0/6-i4azM0v3M/s400/8khoog.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5350551005790800770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The 8K video RAM replacement chip is wired such that /OE and /CE are both tied low. Aha, it's being controlled by CE2! Nope. That's tied high. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the type of board that I was working from. You see on the left how pins 28 &amp;amp; 26, 22 &amp;amp; 20 are tied?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SkD6jIZr8ZI/AAAAAAAAAoE/xK9N7qgEbu8/s1600-h/8khoogprint-an.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 211px; height: 250px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SkD6jIZr8ZI/AAAAAAAAAoE/xK9N7qgEbu8/s400/8khoogprint-an.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5350551838773735826" /&gt;&lt;/a&gt;&lt;img src="http://2.bp.blogspot.com/_E6_haRsOYg8/SkD-dpNReVI/AAAAAAAAAoU/iBEJe9O0glw/s400/6264.JPG" style="cursor:pointer; cursor:hand;width: 296px; height: 400px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5350556142547335506" /&gt;&lt;br /&gt;&lt;br /&gt;Hmm. It works because the address lines from the video RAM to the VDC are isolated from the rest of the system by some bus buffers. Unless the video RAM is being accessed by the processor it remains 'firewalled', with data presented to the bus constantly. This isn't a problem as the VDC only reads. Reads from the CPU side are also OK as the firewall is only opened as the CPU wants data on the bus. Accessing the video memory on the Atom produces snow. This will be why, then! The data in the memory location you're accessing is displayed by the VDC instead of the data at the current scan position. I'm still not 100% sure how this all works so I'll pore over the schematic with a nice cup of tea and a sticky coconut macaroon later.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SkD8Hh40WvI/AAAAAAAAAoM/q_Dj5peRhfE/s1600-h/fw.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 326px; height: 400px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SkD8Hh40WvI/AAAAAAAAAoM/q_Dj5peRhfE/s400/fw.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5350553563602115314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The upshot of this is that any memory expected to live on the CPU side of the tracks cannot share address lines with the video RAM. You will not be able to access the memory as the firewall is only opened for addresses in the VDC range.&lt;br /&gt;&lt;br /&gt;I'm strangely unperturbed by this failure. I expect it's because I know that electrically everything checks out. It's just the mechanical arrangement that's wrong.&lt;br /&gt;&lt;br /&gt;Onward to plan 2!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&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/551282639507073126-2095956424027824742?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/2095956424027824742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=2095956424027824742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2095956424027824742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2095956424027824742'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/06/learning-as-you-go.html' title='Learning as you go'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/SkD5ypTFC4I/AAAAAAAAAn0/6-i4azM0v3M/s72-c/8khoog.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8401947760200702356</id><published>2009-06-21T14:12:00.000-07:00</published><updated>2009-06-21T14:38:57.506-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video ram replacement'/><category scheme='http://www.blogger.com/atom/ns#' term='bakewell tart'/><category scheme='http://www.blogger.com/atom/ns#' term='acorn atom'/><category scheme='http://www.blogger.com/atom/ns#' term='fram'/><title type='text'>Happy Father's Day!</title><content type='html'>The Atom needs some non-volatile random access storage. I ran out of suitable patience burning EPROMs when updating the firmware for the new MMC board. The old firmware was developed with the aid of an MMC simulation that I shoehorned into the &lt;a href="http://www.mess.org/"&gt;MESS emulator&lt;/a&gt;. The simulator allowed me to code against a just-accurate-enough model of an MMC card in SPI mode. The new interface doesn't have such a luxury yet. So I got thinking, and decided that the 32kx8 FRAMs that I got from &lt;a href="http://www.ramtron.com/products/nonvolatile-memory/parallel.aspx"&gt;Ramtron&lt;/a&gt; recently would do as an EPROM replacement. But I'd still need the firmware in EPROM available to bootstrap from... Hmm. I'd also been meaning to build a copy of a neat videoram replacement card that I found in an Atom belonging to a friend. So that was that, really. Or rather, &lt;span style="font-style:italic;"&gt;this&lt;/span&gt; is that:&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/Sj6i5KXNOKI/AAAAAAAAAnk/hfkROIeMO4o/s1600-h/HFD.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 310px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/Sj6i5KXNOKI/AAAAAAAAAnk/hfkROIeMO4o/s400/HFD.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5349892510280661154" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;At the moment it's only the video ram replacement side of the equation. The flying lead takes A10,11,12 from the main board. The rest of the signals are picked up from the vacated 2114 sockets. The empty socket is going to take the FRAM and some decoding logic will live adjacent, unless I can find suitable signals to pick up from the motherboard.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not all underbellies are soft; This was quite hard, actually:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/Sj6i5bjhObI/AAAAAAAAAns/AfWsl_dbYTo/s1600-h/hfdi.JPG"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/Sj6i5bjhObI/AAAAAAAAAns/AfWsl_dbYTo/s1600-h/hfdi.JPG" style="text-decoration: none;"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/Sj6i5bjhObI/AAAAAAAAAns/AfWsl_dbYTo/s400/hfdi.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5349892514895706546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I shall return with news of FRAM. Dear, dear FRAM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&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/551282639507073126-8401947760200702356?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8401947760200702356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8401947760200702356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8401947760200702356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8401947760200702356'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/06/happy-fathers-day.html' title='Happy Father&apos;s Day!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/Sj6i5KXNOKI/AAAAAAAAAnk/hfkROIeMO4o/s72-c/HFD.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-3277251687016275904</id><published>2009-06-18T11:05:00.001-07:00</published><updated>2009-06-19T01:12:23.870-07:00</updated><title type='text'>AtoMMC 2.0</title><content type='html'>What's going on here then?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/SjqD9kc0P4I/AAAAAAAAAms/42ye4Pv62ww/s1600-h/ss.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SjqD9kc0P4I/AAAAAAAAAms/42ye4Pv62ww/s400/ss.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5348732601235685250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's see ... that's:&lt;br /&gt;&lt;br /&gt;Acorn Atom Rev.4 with PL8 fitted +&lt;br /&gt;Microchip PIC 16f77 +&lt;br /&gt;74ls00 +&lt;br /&gt;Custom firmware +&lt;br /&gt;DScaler 4.1.15 +&lt;br /&gt;Saleae Logic 1.0.21&lt;br /&gt;&lt;br /&gt;&lt;div&gt;An equation that = Joy.&lt;br /&gt;&lt;br /&gt;Here's the trace of SPI activity whilst loading the above program from MMC. Click for a larger view. Go on. I know you want to.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SjqCGKyLulI/AAAAAAAAAmI/83GU-0z7hKc/s1600-h/loadgalaxians.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SjqCGKyLulI/AAAAAAAAAmI/83GU-0z7hKc/s400/loadgalaxians.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5348730549941549650" /&gt;&lt;/a&gt;&lt;br /&gt;That'll be ~5k of Galaxians loading in ... ooh let me see now...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SjqEybhcsNI/AAAAAAAAAm0/PxjxKt1wmkc/s1600-h/loadgalaxiansdetail.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 262px; height: 195px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SjqEybhcsNI/AAAAAAAAAm0/PxjxKt1wmkc/s400/loadgalaxiansdetail.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5348733509372260562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Oh yes. &lt;b&gt;0.3 seconds&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://arduinonut.blogspot.com/2008/09/lash-up.html"&gt;The previous board&lt;/a&gt; sat cuddled up to the VIA and all of the SPI communication was performed by banging bits against one another. This board takes bytes at a time, like a man. These are then passed on to the inboard SPI hardware and the reply posted back.&lt;br /&gt;&lt;br /&gt;Some PICs, like the one used here, have what's called a &lt;a href="http://ww1.microchip.com/downloads/en/DeviceDoc/31010a.pdf"&gt;parallel slave port&lt;/a&gt;. You access it like any other bus-based device. It has /EN, /OE and /WR lines which directly control the state of one of its 8-bit data ports. With no valid control signals present the chip sits happily processing with the PS port data lines in a high impedance state. Enabling the chip and clocking /WR will latch the data found on the port at that time. Similarly asserting /OE with the chip enabled will take the port out of high impedance state and present latched data to the bus. There are separate latches for reading and writing. The reception and recovery of data can cause an interrupt. &lt;i&gt;Very&lt;/i&gt; handy. Having been an AVR freak for a long time now since migrating away from PICs I'm starting to see their appeal once more. There. Ah sayed it. I Love PICs. Again. I don't know why I fell out of love with them, I suppose it was becasue they felt rough and ready. AVRs were sexier. With better development tools. I digress.&lt;br /&gt;&lt;br /&gt;So with &lt;a href="http://bbmmc.googlegroups.com/web/atommc2.16f77.asm"&gt;appropriate code written&lt;/a&gt;, and some &lt;a href="http://forum.6502.org/viewtopic.php?p=7714&amp;amp;sid=7100bf7462dd5cba0fa49de534f4b14f"&gt;neat decoding logic&lt;/a&gt; in place to translate the 6502's r/wr signal to separate /RD and /WR signals away we go. Fortunately I'm a reasonable programmer and the AtoMMC firmware that I wrote for the VIA interface was device independent. After as long as it took to recompile and burn a new EPROM, I had a new working driver for the new working hardware.&lt;br /&gt;&lt;br /&gt;In all the round-trip time from presenting a byte to the chip to receiving a reply is as long as it takes to process the following 16 cycles:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~&lt;br /&gt;;&lt;br /&gt;; spi transfer&lt;br /&gt;;&lt;br /&gt;; on entry&lt;br /&gt;;  A = byte to transmit&lt;br /&gt;;&lt;br /&gt;; on exit&lt;br /&gt;;  A = received byte, Y preserved, X trashed&lt;br /&gt;;&lt;br /&gt;xferbyte:&lt;br /&gt;    sta $b400&lt;br /&gt;    nop&lt;br /&gt;    nop&lt;br /&gt;    nop&lt;br /&gt;    nop&lt;br /&gt;    lda $b400&lt;br /&gt;    rts&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Quite a big difference from the original code..&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~;~~&lt;br /&gt;;&lt;br /&gt;; spi transfer&lt;br /&gt;;&lt;br /&gt;; on entry&lt;br /&gt;;  A = byte to transmit&lt;br /&gt;;&lt;br /&gt;; on exit&lt;br /&gt;;  A = received byte, Y preserved, X trashed&lt;br /&gt;;&lt;br /&gt;xferbyte:&lt;br /&gt;    stx XBTEMP&lt;br /&gt;    sty XBTEMP+1&lt;br /&gt;&lt;br /&gt;    ldy #8&lt;br /&gt;&lt;br /&gt;xb_xferbit:&lt;br /&gt;    sta XBTEMP+2      ; ZP write .. faster than PHA&lt;br /&gt;&lt;br /&gt;    and #MOSI         ; present data, CS is low&lt;br /&gt;    ora #CLK          ; bring clock high&lt;br /&gt;    sta VIA&lt;br /&gt;&lt;br /&gt;    ldx VIA           ; read data&lt;br /&gt;&lt;br /&gt;    eor #CLK          ; bring clock low&lt;br /&gt;    sta VIA&lt;br /&gt;&lt;br /&gt;    txa               ; rx'd data into carry&lt;br /&gt;    ror a&lt;br /&gt;&lt;br /&gt;    lda XBTEMP+2&lt;br /&gt;    rol a             ; 7&amp;lt;-next bit, 0&amp;lt;-rx'd data&lt;br /&gt;&lt;br /&gt;    dey&lt;br /&gt;    bne xb_xferbit&lt;br /&gt;&lt;br /&gt;    ldy XBTEMP+1&lt;br /&gt;    ldx XBTEMP&lt;br /&gt;    rts&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;All this joy has happened relatively quickly since receiving my logic analyser. I don't know how I coped without it. Having a window onto the private world of your signals is more revealing than the televisual programme 'Katie and Peter'. Speaking of feeling dirty I must admit that I used to feel the idea of attaching a peripheral processor arguably more powerful than the host computer to be anathema. However now I'm over the initial revulsion I have to admit I quite like it. Again I digress. So for a perfect example of how having an analyser helps, let's look at the behaviour of  the flip-flop that I programmed to change whenever a SPI transfer completes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/SjqkWbhx8wI/AAAAAAAAAnE/LVMqT44cbio/s1600-h/4nop.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 261px;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SjqkWbhx8wI/AAAAAAAAAnE/LVMqT44cbio/s400/4nop.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5348768212709405442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You might be able to see it in the thumbnail here, but click for more pixels. The top two signals are enable and write. Taking the falling edge of the write line, when data is latched from the bus and passed to the SPI hardware, we see that the third line, rdy, is flipped about 12 microseconds later indicating that data is ready for reading. The writes occur at about 16 microsecond intervals. Remember the 16 clock code earlier? Aah yes. That code was generating this trace. I could probably drop a couple of NOPs to push things a little faster but I want a small comfort zone. I could also use a faster SPI clock. I'll perhaps experiment with that another time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mmm. Katie and Peter. Dirty boy. Go to your basket.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rapidly scribbled and then&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-3277251687016275904?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/3277251687016275904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=3277251687016275904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3277251687016275904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3277251687016275904'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/06/acorn-atom-rev.html' title='AtoMMC 2.0'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6_haRsOYg8/SjqD9kc0P4I/AAAAAAAAAms/42ye4Pv62ww/s72-c/ss.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8873990799725761587</id><published>2009-06-08T12:14:00.000-07:00</published><updated>2009-06-08T12:40:39.616-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seadragon'/><category scheme='http://www.blogger.com/atom/ns#' term='sio2sd'/><category scheme='http://www.blogger.com/atom/ns#' term='Atari 800'/><title type='text'>Brokenated XC-Special</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1jqTULdMI/AAAAAAAAAlo/O1uHQvUF6Bg/s1600-h/DSCF2632.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1jqTULdMI/AAAAAAAAAlo/O1uHQvUF6Bg/s400/DSCF2632.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5345037911149212866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's have a little look, shall we? You might feel a sharp scratch... Aah yes that'll be it, then. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1mUyVZyKI/AAAAAAAAAl4/hCWh2xhiES8/s1600-h/DSCF2640.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1mUyVZyKI/AAAAAAAAAl4/hCWh2xhiES8/s320/DSCF2640.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5345040840053606562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I should really conjure up some more robust button scheme. The key switches give the buttons a better feel than the standard tact-switch. Fixing them however has been a case of applying epoxy until they no longer give way. Unfortunately plastic to metal isn't an optimum bond and this is the third time I've had to get the mending kit out. Here's an exploded view:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1ki5yNAvI/AAAAAAAAAlw/S2H3P4r8dgQ/s1600-h/DSCF2635.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1ki5yNAvI/AAAAAAAAAlw/S2H3P4r8dgQ/s400/DSCF2635.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5345038883548365554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's where the magic happens: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1m63RFUEI/AAAAAAAAAmA/8zXraAfvtB4/s1600-h/DSCF2643.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/Si1m63RFUEI/AAAAAAAAAmA/8zXraAfvtB4/s320/DSCF2643.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5345041494212694082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I shall be playing a quick round of &lt;a href="http://www.youtube.com/watch?v=SbKKW0cwGXs"&gt;Sea Dragon&lt;/a&gt; when this glue has gorn orf.&lt;br /&gt;&lt;br /&gt;Thank you Atari for deciding serial was the way. You too, Commodore. We can laugh about it now but at the time it was terrible..!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-8873990799725761587?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8873990799725761587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8873990799725761587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8873990799725761587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8873990799725761587'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/06/brokenated-xc-special.html' title='Brokenated XC-Special'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/Si1jqTULdMI/AAAAAAAAAlo/O1uHQvUF6Bg/s72-c/DSCF2632.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-4158964803735256477</id><published>2009-06-07T08:02:00.000-07:00</published><updated>2009-06-08T01:40:34.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vic20'/><category scheme='http://www.blogger.com/atom/ns#' term='sd2mmc'/><category scheme='http://www.blogger.com/atom/ns#' term='c64'/><category scheme='http://www.blogger.com/atom/ns#' term='sd2iec'/><category scheme='http://www.blogger.com/atom/ns#' term='vc20'/><title type='text'>FTW!</title><content type='html'>A little vulgar I know, but it's an adequate expression of how I'm feeling right now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;a href="http://www.c64-wiki.com/index.php/SD2IEC"&gt;SD2IEC&lt;/a&gt; is working beautifully. Up to this point it was suffering from some syndrome resulting in erratic behaviour at best to a more normal position of outright refusal to work. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I could make things work sometimes by shimmying wires around, so this seemed to be the obvious first move. I stripped all the long wires away and remade the connections. It's often easier to see where a wire should be routed second time around...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While I was at it the ceramic resonator that I used originally was swapped out for a proper crystal. As I've got &lt;a href="http://cmdrkey.com/cbm/prodinfo/jiffydos.html"&gt;JiffyDOS&lt;/a&gt; in all my C= machines it is necessary to have an accurate clock source. Fastloaders demand cycle-accurate timing and both the internal RC oscillator and resonators are lacking in the accuracy department, to coin a contemporary phrase.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I reworked the cable too as the original one was made from some CAT5 (yellow, yum!) and had been shortened a couple of times to try and increase reliability. The resulting splices were ugly so had to go.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The result of all this industry? Bing bing bing bing Jackpot! Solid, speedy loading. C128, C64 and VC20 all enjoying the flowing bits.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SiwXCF3raTI/AAAAAAAAAlY/LXKpqz83jD8/s1600-h/DSCF2626.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SiwXCF3raTI/AAAAAAAAAlY/LXKpqz83jD8/s400/DSCF2626.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5344672182484822322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The cassette case is a scaling back of the original scope. I was going to mount it inside a &lt;a href="http://www.zimmers.net/anonftp/pub/cbm/pictures/manuals/c2n.gif"&gt;C2N datasette player&lt;/a&gt;, hence the fashioning of the board into a rough cassette tape shape. This was because my first SD floppy emulator was a &lt;a href="http://sio2sd.gucio.pl/index_en.html"&gt;SIO2SD&lt;/a&gt; board for 8-bit Ataris, built into the shell of an &lt;a href="http://www.homecomputershop.nl/images/Atari%20XC12.jpg"&gt;XC12&lt;/a&gt; (Ugly, ugly brute) cassette player, which I may well present soon as I have to go back inside it to repair a keyswitch. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the board, naked and from behind - exactly how I like it:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SiwVIb_gP8I/AAAAAAAAAlI/N9s_u57Lips/s1600-h/DSCF2619.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SiwVIb_gP8I/AAAAAAAAAlI/N9s_u57Lips/s400/DSCF2619.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5344670092479184834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SiwVu03WJWI/AAAAAAAAAlQ/dqiAdmU9SUc/s1600-h/DSCF2621.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SiwVu03WJWI/AAAAAAAAAlQ/dqiAdmU9SUc/s400/DSCF2621.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5344670751990883682" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am constantly in awe at the fine people who produce these fine projects. If I had to doff my hat every time the awe swelled within, I would be doffing almost continually. &lt;a href="http://www.pontoppidan.info/lars/index.php?proj=mmc2iec"&gt;Lars P&lt;/a&gt;, &lt;a href="http://www.forum64.de/wbb3/index.php?page=Thread&amp;amp;threadID=28488"&gt;Unseen&lt;/a&gt; and countless others, you know who you are, you have my deepest admiration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The features of this device are too many to mention, who would have thought that an ATMega644p, some discrete components and a few hours soldering oculd have produced a wonderful thing like this?! I'm thinking that the SD/MMC bootloader might have to be employed in the Arduino board when I get a 328 to play with...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Considered,&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-4158964803735256477?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/4158964803735256477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=4158964803735256477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4158964803735256477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4158964803735256477'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/06/ftw.html' title='FTW!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/SiwXCF3raTI/AAAAAAAAAlY/LXKpqz83jD8/s72-c/DSCF2626.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-3763757630190563119</id><published>2009-06-05T12:03:00.001-07:00</published><updated>2009-06-07T12:57:05.245-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lying'/><category scheme='http://www.blogger.com/atom/ns#' term='beer'/><category scheme='http://www.blogger.com/atom/ns#' term='porn'/><category scheme='http://www.blogger.com/atom/ns#' term='acorn atom'/><category scheme='http://www.blogger.com/atom/ns#' term='rom box'/><title type='text'>Thrice nay!</title><content type='html'>It's a nonsense title for a post, but I was just thinking of Frankie Howerd. &lt;div&gt;&lt;br /&gt;&lt;div&gt;I have a shameful admission. I lied in my last post, or at least mislead you, dear reader. There were 5 projects - though I suppose the scale of this one didn't really register on the need to win scale. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I made a mega-rom adapter for my Atom. I haven't inserted a large image for a while (Matron!), so here goes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/SiwbfN4Ai0I/AAAAAAAAAlg/cuxIynb9j9A/s1600-h/DSCF2604.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SiwbfN4Ai0I/AAAAAAAAAlg/cuxIynb9j9A/s400/DSCF2604.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5344677080896408386" /&gt;&lt;/a&gt;&lt;div&gt;The mega-rom! In an Atom! It allows me to page in one of 16 4k images into the address space allocated to utility software in the Atom's address map. The switch carried with dignity at the end of the cable allows a user to perform the magic. But you probably worked that out. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Don't you just &lt;i&gt;love&lt;/i&gt; the green and yellow striped electrical tape? I was speaking to an electronics fashion pundit at the RCM event and they told me &lt;i&gt;(in the strictest confidence)&lt;/i&gt; that this years projects simply must have green and yellow electrical tape! Being the capricious sort that I am I simply have to agree, at least for today.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/Silto88eQ0I/AAAAAAAAAkQ/jiis68Z0bcE/s1600-h/DSCF2607.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_E6_haRsOYg8/Silto88eQ0I/AAAAAAAAAkQ/jiis68Z0bcE/s400/DSCF2607.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343922983173768002" style="cursor: pointer; width: 400px; height: 300px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have been expanding my horizons, not to mention my old computers - ha ha, with contraptions such as this, fabricated with board spacers and socket strip. These nifty connectors are ideal for making up adapters like the one above.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SilwK61uoII/AAAAAAAAAkY/WVFiKwHocEY/s1600-h/DSCF2610.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_E6_haRsOYg8/SilwK61uoII/AAAAAAAAAkY/WVFiKwHocEY/s400/DSCF2610.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343925765747417218" style="cursor: pointer; width: 400px; height: 300px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SilwK61uoII/AAAAAAAAAkY/WVFiKwHocEY/s1600-h/DSCF2610.JPG"&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="color:#333333;"&gt;Pictured: A board spacer is sized up by an interested socket strip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've tried a number of different makes but these are by far the best - If I were Victor Kyam I'd buy the company. Which is &lt;a href="http://www.samtec.com/"&gt;SamTec&lt;/a&gt; if you're interested. No, I'm not receiving a back-hander. Though if you're reading, SamTec - well let's just say I'm &lt;i&gt;interested&lt;/i&gt;... ;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a slight wrinkle in the construction of these boards. The socket has to be mounted on the same side as the pads. I've yet to find a supplier of through-hole plated proto-board, but when I do I'll use it for this purpose. In the mean time, I use one of two methods. The first involves a 'cost efficient' socket - the pressed pin variety. Splay its legs akimbo and apply solder. Place it right-side-up on the padded side of the (woeful , now I think of it) protoboard that my local electronics supply chain provides. It rhymes with Craplin if you're wondering. Affix to the board with a swift application of iron. Bingo! The 2532 adapter for the tier jerker was manufactured using this method. Apply your eyes to the previous post for a fine example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second method, as used here, involves the socket strip. Place this adjacent to the spacer, at chip's width naturally, and solder the pad to the socket where it meets the board. You need a fine iron and a steady hand for this so no beer or porn beforehand. Ooh which reminds me... What?? Oh hush, I'm not soldering tonight.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/Sil2q-QUMjI/AAAAAAAAAkg/MviEvII-F-k/s1600-h/DSCF2617.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_E6_haRsOYg8/Sil2q-QUMjI/AAAAAAAAAkg/MviEvII-F-k/s400/DSCF2617.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343932913489818162" style="cursor: pointer; width: 400px; height: 300px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here you see socket strip and spacer conjoined with solder bridges. Which are surprisingly hard to make intentionally!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lordy I've wittered on long enough. I have an SD2IEC to attend to. Please excuse me :¬)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&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/551282639507073126-3763757630190563119?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/3763757630190563119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=3763757630190563119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3763757630190563119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3763757630190563119'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/06/thrice-nay.html' title='Thrice nay!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6_haRsOYg8/SiwbfN4Ai0I/AAAAAAAAAlg/cuxIynb9j9A/s72-c/DSCF2604.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8252840475873913598</id><published>2009-06-05T04:31:00.001-07:00</published><updated>2009-06-05T13:33:48.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wingasm'/><category scheme='http://www.blogger.com/atom/ns#' term='RCM'/><category scheme='http://www.blogger.com/atom/ns#' term='failosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='acorn atom'/><title type='text'>A third-class ticket to despair and back</title><content type='html'>&lt;div&gt;I couldn't make it work. I tried... Alas the Fail was strong in this one.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The spectrum wanted its CF adapter. I wanted to oblige. I tried a number of different cards which all appeared to be lacking in Win. I had checked over the wiring a number of times and, although not entirely convinced it would help, I thus set about rewiring the beast.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Guess what! Still no Win. The board resolutely refused to&lt;/div&gt;&lt;div&gt; play nicely and so I took a step back and considered all the possible failure points. Too much stray capacitance? A dry joint? Lack of understanding? The list goes on. At last I decided to cut my losses and re-work the board as an IDE interface. Several tens of minutes later, having used an entire roll of desoldering wick, the board was bare but for the edge connector.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a good job I only regularly watch one TV programme (The Apprentice, with S'ralan), as I could get on with some burning myself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The result:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_E6_haRsOYg8/SikKn703zwI/AAAAAAAAAjw/oRv_Mj0FDHw/s320/IDE-BACK.jpg" style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5343814114042433282" /&gt;&lt;img src="http://1.bp.blogspot.com/_E6_haRsOYg8/SikKxVwobjI/AAAAAAAAAj4/-JP-MpGnDaw/s320/IDE-FRONT.jpg" style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5343814275622792754" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Joy! I'd carefully checked each connection as it was made and I was certain they were all good. I'm bouyed by the assurances of my meter, and sure of at last securing a payment of success to offset the miserable week spent futilely poking at the CF board. Apply power, insert device -&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Misery.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With heavy heart I put this project aside until some future time when I can muster the strength of character to return to the joyless debugging. It didn't get much better than this for weeks. I've started four more projects since, each more resoundingly failful than the last!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So that, dear reader, is why there have been no updates. I'm afraid I don't have the strength of character to tell of my winless ways. I can't even bear to tell you what they are. I do intend to return, though, this time with bigger guns. More on that later.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I needed was something simple to rejuvinate my mojo. To get me to the power-pill so I can start to chase those ghosts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My opportunity came at a recent retro-computer themed event where I met up with a number of people thus far only identifiable by a 24x24 pixel avatar and psychologically revealing nickname. Amongst these a contact who keeps me fuelled with rare Acorn Atom goodies. In this case I was knighted with a home-built rom-box, containing a couple of eproms. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/_E6_haRsOYg8/Sil_HE5WlGI/AAAAAAAAAk4/YNpmkL4FPLY/s400/DSCF2597.JPG" style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 300px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5343942192401912930" /&gt;&lt;div&gt;Forget the soviet nuclear-warhead launching switches! The mysterious dials and socketry - this is truly a thing of beauty. But like most beautiful things, it's what's inside that counts. And that was going to be ME. The dumping challenge was on! [If you or someone you know built this rom-box, then please get in touch!]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once retrieved from the secure caress of their sockets the lovely ceramic packaged gold legged EPROMS were quivering in the palm of my hand like frightened baby Meerkats. These chips are ancient and JEDEC incompatible. 2532s. 32Kbit arranged as 4K x 8. Here is the adapter I built to allow me to read the eproms using the glorious &lt;a href="http://arduinonut.blogspot.com/2008/10/tier-jerker.html"&gt;tier jerker&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SikIt821mAI/AAAAAAAAAjY/T8HAC4mGj0Y/s1600-h/tb2top.jpg" style="text-decoration: none;"&gt;&lt;img src="http://4.bp.blogspot.com/_E6_haRsOYg8/SikIt821mAI/AAAAAAAAAjY/T8HAC4mGj0Y/s400/tb2top.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5343812018375071746" style="cursor: pointer; width: 400px; height: 276px; " /&gt;&lt;/a&gt;&lt;img src="http://4.bp.blogspot.com/_E6_haRsOYg8/SikIgyyl7rI/AAAAAAAAAjQ/_WLiopX-fhs/s200/tb2bot.jpg" style="cursor:pointer; cursor:hand;width: 200px; height: 165px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5343811792334614194" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And in situ:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/SikJo8NMX1I/AAAAAAAAAjo/1sUuPcyh3JY/s1600-h/tb2inplace.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_E6_haRsOYg8/SikJo8NMX1I/AAAAAAAAAjo/1sUuPcyh3JY/s320/tb2inplace.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5343813031812685650" style="cursor: pointer; width: 320px; height: 250px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As it turned out they contained images of programmers' toolkits. I must admit I was hoping for a rare find, however the images in question are already well known. But that is by-the-by. The thing is an hour had been spent with a soldering iron, a further hour spent reconfiguring the client application to draw the data PC-ward by the magic of electon in serial cable, and then some moments of joy - as the contraption worked. Worked?? WORKED!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I believe my drought is ended. The rains of win are falling, filling drained butts of enthusiasm. I shall venture forth and tackle the next item - Upgrading my SD2IEC in order to take advantage of the JiffyDos-enabled commodore machines at my disposal...&lt;/div&gt;&lt;div&gt;&lt;br /&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/551282639507073126-8252840475873913598?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8252840475873913598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8252840475873913598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8252840475873913598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8252840475873913598'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/06/third-class-ticket-to-despair-and-back.html' title='A third-class ticket to despair and back'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/SikKn703zwI/AAAAAAAAAjw/oRv_Mj0FDHw/s72-c/IDE-BACK.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-2977070066140159391</id><published>2009-03-04T12:19:00.001-08:00</published><updated>2009-03-04T12:42:46.535-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bird&apos;s nest'/><category scheme='http://www.blogger.com/atom/ns#' term='eye strain'/><category scheme='http://www.blogger.com/atom/ns#' term='zx spectrum'/><category scheme='http://www.blogger.com/atom/ns#' term='compact flash'/><title type='text'>Why?</title><content type='html'>Why do I do this to myself?&lt;br /&gt;&lt;br /&gt;I've been meaning to start on the ZX Spectrum Compact Flash project for a while now. &lt;a href="http://members.tripod.com/~piters/zx.htm"&gt;This site&lt;/a&gt; has some great stuff. Pera Putnik is a bit of a star in my humble opinion.&lt;br /&gt;&lt;br /&gt;First things first - the terror inducing removal of the incumbent spectrum ROM with a Dremel cut-off disk. No pictures of this process exist as it's so fraught that taking a snap is all but impossible even with the most advanced image stabilisation techniques. The process is thus: (I'm shaking jut thinking about writing it..)&lt;br /&gt;&lt;br /&gt;Cut through legs at top of ROM with Dremel. Remove remainder of legs with iron, wick and sucker. Solder in socket. Insert ROM. Relax. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/Sa7mOg62pHI/AAAAAAAAAgU/-haHXMK9n4g/s1600-h/DSCF2145.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/Sa7mOg62pHI/AAAAAAAAAgU/-haHXMK9n4g/s400/DSCF2145.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5309434147745735794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The wire here is A14, I've used a 32k EPROM with 2 images burned in; the regular ROM and PP's CF OS. There's &lt;a href="http://members.tripod.com/~piters/chedem.avi"&gt;a splendid video&lt;/a&gt; that shows the thing in action. I can swap between the 2 with a simple flick of a switch.&lt;br /&gt;&lt;br /&gt;Pictured below is a SparkFun CF Breakout board connected to some protoboard with pin headers. The edge connector there is soldered on one side, and I made connections to the second, floating row of pins using some 90 degree header.  Click the pictures for the full &lt;del&gt;resolution&lt;/del&gt; horror.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/Sa7jCE9CFEI/AAAAAAAAAf8/U8bhZR1iEog/s1600-h/DSCF2154.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/Sa7jCE9CFEI/AAAAAAAAAf8/U8bhZR1iEog/s400/DSCF2154.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5309430635545367618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/Sa7jW-d5PiI/AAAAAAAAAgE/cxXyERbaiww/s1600-h/DSCF2157.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/Sa7jW-d5PiI/AAAAAAAAAgE/cxXyERbaiww/s400/DSCF2157.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5309430994581405218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This hangs off the back of the spectrum. Now all I have to do is wire it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/Sa7kf1hZvcI/AAAAAAAAAgM/U_CRXG8Q_84/s1600-h/DSCF2170.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/Sa7kf1hZvcI/AAAAAAAAAgM/U_CRXG8Q_84/s400/DSCF2170.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5309432246310649282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Blisters aside, it's getting harder to do stuff like this as my old eyes are gradually losing their ability to focus at close range. It was fun though. And I've had an idea about a soldering station with built-in magnifier...&lt;br /&gt;&lt;br /&gt;Now all I have to do is get it to work!&lt;br /&gt;&lt;br /&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-2977070066140159391?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/2977070066140159391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=2977070066140159391' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2977070066140159391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2977070066140159391'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/03/why.html' title='Why?'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_E6_haRsOYg8/Sa7mOg62pHI/AAAAAAAAAgU/-haHXMK9n4g/s72-c/DSCF2145.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-2776457369459009209</id><published>2009-03-04T02:42:00.000-08:00</published><updated>2009-03-04T02:44:14.724-08:00</updated><title type='text'>Cult of Done</title><content type='html'>Pretending you know what you're doing is almost the same as knowing what you are doing, so just accept that you know what you're doing even if you don't and do it.&lt;br /&gt;&lt;br /&gt;Read, Loved and&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-2776457369459009209?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/2776457369459009209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=2776457369459009209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2776457369459009209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2776457369459009209'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/03/cult-of-done.html' title='Cult of Done'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-1773748782594390368</id><published>2009-02-11T08:09:00.001-08:00</published><updated>2009-02-11T08:28:19.812-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BBC micro'/><category scheme='http://www.blogger.com/atom/ns#' term='techadventure'/><category scheme='http://www.blogger.com/atom/ns#' term='6502 second processor'/><category scheme='http://www.blogger.com/atom/ns#' term='mmbeeb'/><title type='text'>MMmm.. Beeb!</title><content type='html'>I linked to the excellent &lt;a href="http://members.lycos.co.uk/mmbeeb/"&gt;MMBeeb&lt;/a&gt; project in an earlier post. It's been at the top of my project list again as I'm taking a pile of BBC B computers to &lt;a href="http://www.techadventure.org/"&gt;TechAdventure&lt;/a&gt; which I'll be attending at the end of the month. I'm hoping to talk about MMC, old computers and the conjoining of the two. I'll have a table full of retro equipment to show, and some to sell.&lt;br /&gt;&lt;br /&gt;As one of the first MMC projects I undertook, the MMBeeb board was a stepping stone that led much further than I expected. Whilst revisiting it in the light of all the knowledge I've acquired since then I've come to the conclusion that there are some subtle bugs with the original hardware. I'm hoping to contact the originator of the project and see what he thinks. I'll post an update here as soon as I've determined if I'm on the right path. In the mean time enjoy the view:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SZL7CtIxyyI/AAAAAAAAAfM/aHfbV2XPoWM/s1600-h/MMFRONT.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 343px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SZL7CtIxyyI/AAAAAAAAAfM/aHfbV2XPoWM/s400/MMFRONT.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5301575735263218466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SZL7PPKfRfI/AAAAAAAAAfU/NIxTTEtkvy0/s1600-h/MMBACK.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SZL7PPKfRfI/AAAAAAAAAfU/NIxTTEtkvy0/s400/MMBACK.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5301575950555629042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The revised circuit uses the same standard resistor divider as used on every other MMC interface I've ever made and a 3v3 regulator. That's it. It's not the hardware that makes MMBeeb special though - it's the software. It's a stupendously slick DFS conversion that integrates smoothly into a system. It also works with a second processor, which is an indication of the care and attention to detail that Martin has put into his work. And for the few paltry Great British Pounds that it costs for one of these you'd be crazy not to..!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-1773748782594390368?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/1773748782594390368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=1773748782594390368' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/1773748782594390368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/1773748782594390368'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/02/mmmm-beeb.html' title='MMmm.. Beeb!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/SZL7CtIxyyI/AAAAAAAAAfM/aHfbV2XPoWM/s72-c/MMFRONT.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6186612903565589259</id><published>2009-02-11T04:22:00.000-08:00</published><updated>2009-04-15T08:37:34.667-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Double Choc Chip Muffins'/><category scheme='http://www.blogger.com/atom/ns#' term='DevicePrint'/><category scheme='http://www.blogger.com/atom/ns#' term='ufat2'/><title type='text'>Libraries</title><content type='html'>It's all go at the moment. Last weekend I attended my first DorkBot London meeting. I must confess I didn't really know what to expect but spent a very pleasant, if cold, day in the company of feverishly soldering artists and makers. I spoke to many people about uFat and the new DevicePrint library. This is some code that allows formatted textual output to a buffer in memory and thus onto some form of persistent storage...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SZLGMyys_eI/AAAAAAAAAfE/hwKv11gkbUY/s1600-h/cwu.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 312px; height: 312px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SZLGMyys_eI/AAAAAAAAAfE/hwKv11gkbUY/s400/cwu.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5301517634463661538" /&gt;&lt;/a&gt;&lt;br /&gt;You can get the new library here &lt;span style="font-weight:bold;"&gt;&lt;a href="http://micro-hacker.googlegroups.com/web/SMB_LIBRARIES_2009-04-15.zip"&gt;SMB_LIBRARIES&lt;/a&gt;&lt;/span&gt;. It adheres to the principles introduced in uFat:- it is lightweight and device agnostic. It should work with any storage medium as long as there is a function available to write a 512 byte sector.&lt;br /&gt;&lt;br /&gt;The the code is initialised with a pointer to a buffer, some basic information about the destination sector area, and a writer function. From that point on you are free to use the familiar .print() functions which are best known in their Serial library incarnation. The Arduino base library provides you with so much more than a blinking LED ;)&lt;br /&gt;&lt;br /&gt;As usual (1) - there is copious documentation in the form of comments and an example sketch configured to use MMC storage for you to play with. If you wanted to try it out without any devices available then you could always change the write proxy routine to dump the stored data to serial.&lt;br /&gt;&lt;br /&gt;As usual (2) - comments welcome!&lt;br /&gt;&lt;br /&gt;Toasted and&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-6186612903565589259?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6186612903565589259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6186612903565589259' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6186612903565589259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6186612903565589259'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/02/libraries.html' title='Libraries'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/SZLGMyys_eI/AAAAAAAAAfE/hwKv11gkbUY/s72-c/cwu.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-9041634166301326867</id><published>2009-01-30T07:04:00.000-08:00</published><updated>2009-01-30T13:06:14.065-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='antex'/><category scheme='http://www.blogger.com/atom/ns#' term='matron'/><category scheme='http://www.blogger.com/atom/ns#' term='french polishing'/><category scheme='http://www.blogger.com/atom/ns#' term='hot irons'/><category scheme='http://www.blogger.com/atom/ns#' term='google chrome'/><title type='text'>Chrome Tips</title><content type='html'>Two chrome tips for you:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SYMb1_KVAhI/AAAAAAAAAXk/wN16kEnmCZE/s1600-h/55.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 30px; height: 160px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SYMb1_KVAhI/AAAAAAAAAXk/wN16kEnmCZE/s400/55.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5297108201019605522" /&gt;&lt;/a&gt;1. The Type 55 0.5mm tip for my new favourite tool-in-the-box - an Antex XS 25 watt soldering iron! Ahem, while not &lt;span style="font-style:italic;"&gt;exactly&lt;/span&gt; chrome, it does go shiny when tinned! I've only ever used my old workhorse cheap-and-cheerful 50 watt iron before now, which as far as I was concerned was as good as it got. So I was dubious when I was given this little gem to try. Imagine my surprise when I saw the difference that this iron/tip combination makes. I must say I'm absolutely astounded. It manages to pump much more heat into a joint than my supposedly more powerful iron that joints form instantly and cleanly. I'll never use another iron again ... &lt;sighs dreamily&gt;&lt;br /&gt;&lt;br /&gt;2. If you're having trouble downloading updates to the ever-so-likeable Google Chrome browser due to proxy issues or similar, then try this. Locate the event viewer for your Windoes system. This is usually in the Administrative Tools section of your control panel. There may well be an entry from the update manager which looks like this (click for a full resolution image):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SYMcZ_6Au1I/AAAAAAAAAXs/WEvWD2h4SjM/s1600-h/application.bmp"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SYMcZ_6Au1I/AAAAAAAAAXs/WEvWD2h4SjM/s400/application.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5297108819694893906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You will see the URL to which the update service is attempting a connection. Cut and paste this into your favourite browser's address bar. In my case the download hoops are presented and I can duly jump through them, ending up with a newly polished chrome tool. Matron!&lt;br /&gt;&lt;br /&gt;Double entendre added then&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-9041634166301326867?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/9041634166301326867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=9041634166301326867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9041634166301326867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9041634166301326867'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/01/chrome-tips.html' title='Chrome Tips'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/SYMb1_KVAhI/AAAAAAAAAXk/wN16kEnmCZE/s72-c/55.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-7448490535442337572</id><published>2009-01-22T06:02:00.000-08:00</published><updated>2009-10-06T12:46:28.512-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='PROGMEM'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='turtle cheesecake'/><category scheme='http://www.blogger.com/atom/ns#' term='ufat2'/><title type='text'>Say Hello to uFat2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SXh-nYEZseI/AAAAAAAAAW4/Cnza_g9OOks/s1600-h/op.bmp"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 381px; height: 257px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SXh-nYEZseI/AAAAAAAAAW4/Cnza_g9OOks/s400/op.bmp" border="0" alt="" id="BLOGGER_PHOTO_ID_5294120576914928098" /&gt;&lt;/a&gt;There has been a flurry of activity recently and a number of uFat users have been in touch, which is nice! In response to this I think it's about time that I posted my latest updates. The code is thoroughly commented and should answer most questions.&lt;br /&gt;&lt;br /&gt;Most notably I have broken the dependency on a particular device library. Now you can use any code capable of reading 512byte sectors from any FAT formatted device.&lt;br /&gt;&lt;br /&gt;Since a number of you dear readers asked about traversing FAT directories I've abstracted this requirement into a core feature. By providing a function callback you can now process FAT directory entries to your heart's desire!&lt;br /&gt;&lt;br /&gt;It's still a lightweight library but there may be new ideas here for some beginner programmers. I don't think there's anything that should scare anyone though. Concepts such as pointers to functions and PROGMEM data storage are used throughout, but you should be able to use this as it stands without this knowledge. The example sketch should cover the most obvious use cases of printing a listing of files and updating a file on the card.&lt;br /&gt;&lt;br /&gt;I developed this under the latest IDE at time of writing which is Arduino-0012. As usual, I'm happy to help with any problems or queries you might have.&lt;br /&gt;&lt;br /&gt;Here's the goods: &lt;span&gt;&lt;a href="http://micro-hacker.googlegroups.com/web/SMB_LIBRARIES_2009-04-15.zip"&gt;&lt;b&gt;SMB_LIBRARIES&lt;/b&gt;&lt;/a&gt; and for pudding: The &lt;a href="http://micro-hacker.googlegroups.com/web/DevicePrintDemo.zip?gda=XPJQCUUAAADuPR1pQumvMC9HOwqOcMiFWorKfcgBlMW0oy5tAFMRU6lkfWx4DzuT6oSo-J2d1_C-ncxEZ4rCAxOtc9DB4LrTGu1iLHeqhw4ZZRj3RjJ_-A"&gt;&lt;b&gt;demo sketch&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;Refer to the header files for usage, tips, and perhaps a LOL or two. If you're lucky ;)&lt;br /&gt;&lt;br /&gt;Written, admired and duly&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-7448490535442337572?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7448490535442337572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7448490535442337572' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7448490535442337572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7448490535442337572'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2009/01/there-has-been-flurry-of-activity.html' title='Say Hello to uFat2'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_E6_haRsOYg8/SXh-nYEZseI/AAAAAAAAAW4/Cnza_g9OOks/s72-c/op.bmp' height='72' width='72'/><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8169024773890730798</id><published>2008-12-01T11:42:00.000-08:00</published><updated>2008-12-01T12:15:54.441-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yellowing'/><category scheme='http://www.blogger.com/atom/ns#' term='de-yellowing'/><title type='text'>Goodbye yellow brick!</title><content type='html'>I've been reading about de-yellowing old equipment. Quite a few of my older babies have significant discolouration issues. Until recently I followed with the received wisdom, that once a plastic item has yellowed there's no going back. Chemical changes within the plastic produce the effect, and no amount of scrubbing will ever return your creamy commodore, beigey beeb or tawny tandy to its former glory. So imagine my surprise when I stumbled upon this &lt;a href="http://www.vintage-computer.com/vcforum/showthread.php?t=12566"&gt;wonderful posting&lt;/a&gt; over at the vintage computer forums. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Old computer enthusiasm and chemistry wizardry have come up with a recipe for undoing the supposedly permanent effects of UV and fire retardants!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm definitely going to try this out, as soon as I can get hold of the requisite chemicals...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/STRBOtTJpII/AAAAAAAAAVY/3tZLFT50oAw/s1600-h/explosion.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 276px; height: 276px;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/STRBOtTJpII/AAAAAAAAAVY/3tZLFT50oAw/s400/explosion.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5274912784491586690" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-8169024773890730798?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8169024773890730798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8169024773890730798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8169024773890730798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8169024773890730798'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/12/goodbye-yellow-brick.html' title='Goodbye yellow brick!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/STRBOtTJpII/AAAAAAAAAVY/3tZLFT50oAw/s72-c/explosion.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-5276862846112471695</id><published>2008-11-15T13:43:00.001-08:00</published><updated>2008-11-15T14:22:30.587-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ST'/><category scheme='http://www.blogger.com/atom/ns#' term='retro hard-on'/><category scheme='http://www.blogger.com/atom/ns#' term='ts1000'/><category scheme='http://www.blogger.com/atom/ns#' term='QL'/><category scheme='http://www.blogger.com/atom/ns#' term='c128'/><category scheme='http://www.blogger.com/atom/ns#' term='Jupiter Ace'/><category scheme='http://www.blogger.com/atom/ns#' term='BBC 6502 second processor'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple ][ 2 two'/><category scheme='http://www.blogger.com/atom/ns#' term='zx81'/><category scheme='http://www.blogger.com/atom/ns#' term='Atari 800'/><title type='text'>For your eyes, ears only. Oh, and everyone else's too.</title><content type='html'>Intrigued by something I've done? Want some? Just ask. I can't post every bit of code that I write, every schematic. But if you want some help or encouragement then just contact me. I'm always pleased if I can be of some use.&lt;br /&gt;&lt;br /&gt;Switch.&lt;br /&gt;&lt;br /&gt;I was working a few extra hours this weekend as my code finger was a bit slow last week. It's not often this happens, unlike in my previous life - scratch that - sentence, in the games industry (I'm not bitter - just astounded at how long it took me to realise how ugly it is). Bizarrely I had a camera with me so I took the liberty and a photo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SR9Hd5mj1yI/AAAAAAAAALM/Dmiyl1_kkMc/s1600-h/DSCF1748.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SR9Hd5mj1yI/AAAAAAAAALM/Dmiyl1_kkMc/s400/DSCF1748.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5269008668051101474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;You know that you can click the pic for a higher resolution version, yes?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The museum has grown a little.. The master has been swapped out for a regular B. It has got a second processor attached though, and you can see its tiny appendage - an MMBeeb interface. Marvellous stuff by Martin Mathers. It's sitting on top of, yes it has to be said - a cardboard box - and quite the largest piece of retro peripheral that I own. A dual 5.25 inch floppy drive. Look at the size of that thing! It has an unbelievably long cable attached too - 10 metres at least - which by any stretch of the imagination shouldn't work. That's quantum physics for you! Probably.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;OH! How I wish that Jupiter Ace was mine, alas it's not. It belongs to Mr Cliff. B'stard. ;) This one has a few yellow marks but it still works. Especially after the keyboard contacts got a firm rubbing with an eraser.. Win! Only about 8000 of these were sold. We loaded up some software a while ago and it was fairly obvious why this was a niche machine. If you come across an emulator then try 'fish and flutterer'. It's pure class.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-5276862846112471695?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/5276862846112471695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=5276862846112471695' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5276862846112471695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5276862846112471695'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/11/for-your-eyes-ears-only-oh-and-everyone.html' title='For your eyes, ears only. Oh, and everyone else&apos;s too.'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/SR9Hd5mj1yI/AAAAAAAAALM/Dmiyl1_kkMc/s72-c/DSCF1748.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-7972410584899091941</id><published>2008-11-06T01:25:00.000-08:00</published><updated>2008-11-15T13:39:56.036-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vic20'/><category scheme='http://www.blogger.com/atom/ns#' term='c128'/><category scheme='http://www.blogger.com/atom/ns#' term='c64'/><category scheme='http://www.blogger.com/atom/ns#' term='jiffydos'/><title type='text'>It only takes a Jiffy</title><content type='html'>As I now have the uncanny ability to burn EPROMS &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;using only the power of my mind&lt;/span&gt; and, well, err, some equipment, I needed to try it out with something.&lt;br /&gt;&lt;br /&gt;Since my SD2IEC (currently broken) supports the JiffyDos turboloader, I decided to upgrade my C= machines with new kernels (Or is it kernals? The two spellings seem interchangable in the world of Commodore, but I'll stick with the former). This upgrady action might give me the impetus required to fix it.&lt;br /&gt;&lt;br /&gt;The '128 was easy enough, the ROM chips used were pin-for-pin compatible with modern 27c types. The VIC needed a small adapter board and some leg-bendy, jump-wiry action. The real fun started when I cracked open the '64c. This later model of '64 has serious cost reduction issues - like a lack of sockets for ROM chips. At least the chips they used were, like in the '128 model that followed, pin compatible with modern EPROMs.&lt;br /&gt;&lt;br /&gt;Undaunted I considered desoldering the chip and adding the socket, but that wouldn't have been hacky enough, would it? :D&lt;br /&gt;&lt;br /&gt;So I got out my side-cutters and removed the power leg. Covered the wound with a small sticking plaster (band-aid for our international readers) and patched a wire from the PCB stub to the power leg of my EPROM.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_E6_haRsOYg8/SRK7Y_Z32rI/AAAAAAAAAK0/L0WHPowBqo0/s1600-h/powercut.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5265476952360737458" style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand; HEIGHT: 328px" alt="" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SRK7Y_Z32rI/AAAAAAAAAK0/L0WHPowBqo0/s400/powercut.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Next I bent the EPROM's pins slightly under itself, giving it a bow-legged aspect that I found rather pleasing. This newly lamed chip was then spring-loaded piggy-back fashion over the top of the incumbent ROM.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_E6_haRsOYg8/SRK75Fdt5SI/AAAAAAAAAK8/PAfmFFteXdY/s1600-h/cuddle.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5265477503743288610" style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand; HEIGHT: 285px" alt="" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SRK75Fdt5SI/AAAAAAAAAK8/PAfmFFteXdY/s400/cuddle.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Like so! Isn't that sweet :) It's giving the other one a special cuddle!&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I powered the old girl up and ... nothing. Black screen. Panic sets in. Turn it off and on again. Despair. Slump back onto my ample rear and hello! What's this?! I hadn't been waiting long enough for the machine to boot - I forgot that they take a second or two. It worked! &lt;coughs&gt;Of course I knew it would..;)&lt;br /&gt;&lt;br /&gt;I briefly considered holding the new chip in place with some gaffer tape, but that didn't give me a warm feeling. It would also have meant that the gaffer could have escaped. And we didn't want that either. So I decided a semi-permanent arrangement of solder to two diagonally opposite legs would do the job.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_E6_haRsOYg8/SRK9PawN-kI/AAAAAAAAALE/vkq6d_G9fLU/s1600-h/solderleg.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5265478986926783042" style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; CURSOR: hand; HEIGHT: 316px" alt="" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SRK9PawN-kI/AAAAAAAAALE/vkq6d_G9fLU/s400/solderleg.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Yes I know it's a blob, but it was early in the morning!&lt;/coughs&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-7972410584899091941?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7972410584899091941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7972410584899091941' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7972410584899091941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7972410584899091941'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/11/it-only-takes-jiffy.html' title='It only takes a Jiffy'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6_haRsOYg8/SRK7Y_Z32rI/AAAAAAAAAK0/L0WHPowBqo0/s72-c/powercut.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8219628297448074719</id><published>2008-10-21T12:22:00.001-07:00</published><updated>2008-10-21T12:47:42.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silliness'/><category scheme='http://www.blogger.com/atom/ns#' term='eeprom'/><category scheme='http://www.blogger.com/atom/ns#' term='proto shield'/><category scheme='http://www.blogger.com/atom/ns#' term='Max6956'/><title type='text'>Tier Jerker</title><content type='html'>The Finished Shield:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SP4trfOngcI/AAAAAAAAAHE/Kj2NFx4-ahM/s1600-h/DSCF1591.JPG"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SP4trfOngcI/AAAAAAAAAHE/Kj2NFx4-ahM/s400/DSCF1591.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5259691639955751362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;40 lines of IO plus a number of the Arduino's lines brought out to header sockets. A couple of status LEDs and we're done. I've taken the PORTC lines, AKA the analog inputs A0-A5 and D2-D7 to the back of the board. As it is, the shield's pass-through connectors are offset by 50 mil, making piggy-back boards impossible to make cleanly out of proto-board. The power lines and D8-D13 have their pass-throughs in place, as they are essential for my MMC sail.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Linguine Layout:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SP4tGoorP-I/AAAAAAAAAG8/JvkRmXCODKg/s1600-h/DSCF1594.JPG"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SP4tGoorP-I/AAAAAAAAAG8/JvkRmXCODKg/s400/DSCF1594.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5259691006825807842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I love kynar wire! Did I ever mention that?? :D The enamel coated copper wire is great too. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The EEProm Topper:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SP4uGoV9pPI/AAAAAAAAAHM/L-gPIxHvsBk/s1600-h/DSCF1599.JPG"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SP4uGoV9pPI/AAAAAAAAAHM/L-gPIxHvsBk/s400/DSCF1599.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5259692106258949362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a a scavenged megabit chip. My first application for this board will be to program this. As it slots into the IO card so it will fit into a small adapter board that I have in mind to enable it to emulate a 64k ROM to transfer code to my burner. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Assembled Wedding Cake:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SP4usQubXqI/AAAAAAAAAHU/XxWh5XOU4pU/s1600-h/DSCF1604.JPG"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SP4usQubXqI/AAAAAAAAAHU/XxWh5XOU4pU/s400/DSCF1604.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5259692752754138786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Silly! But that's what I like about it. An antidote to the misery happening in the world today ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-8219628297448074719?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8219628297448074719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8219628297448074719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8219628297448074719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8219628297448074719'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/10/tier-jerker.html' title='Tier Jerker'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_E6_haRsOYg8/SP4trfOngcI/AAAAAAAAAHE/Kj2NFx4-ahM/s72-c/DSCF1591.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-3183584628966056593</id><published>2008-10-09T13:56:00.000-07:00</published><updated>2008-10-09T14:10:35.726-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino shield'/><category scheme='http://www.blogger.com/atom/ns#' term='wodges of IO'/><title type='text'>Shields ... On?</title><content type='html'>Up you blaggard! Up!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SO5wxfwgKYI/AAAAAAAAAFk/GuITXxQRq7I/s1600-h/DSCF1523.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SO5wxfwgKYI/AAAAAAAAAFk/GuITXxQRq7I/s400/DSCF1523.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255261810828781954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No, on second thoughts 'on' is definitely more appropriate in this case. As I mentioned in a previous post I'm crystalising the max expander board. It's about time I ruined my eyes and lungs with some close work.&lt;br /&gt; &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SO5wxqteS1I/AAAAAAAAAFs/LhS7DXg7v1g/s1600-h/DSCF1525.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SO5wxqteS1I/AAAAAAAAAFs/LhS7DXg7v1g/s400/DSCF1525.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255261813768866642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll be putting two of the blighters on this board. Seeing as I'm down there anyway I reasoned that 40 lines is better than 20, what.&lt;br /&gt;&lt;br /&gt;I didn't see any sense in making this a fixed purpose board, hence I'm opening up the lines with SIL sockets so further adapters can be inserted. The 1st will be a programmer for some of the megabit EEPROMs that I've salvaged from a couple of P2 motherboards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-3183584628966056593?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/3183584628966056593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=3183584628966056593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3183584628966056593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3183584628966056593'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/10/shields-on.html' title='Shields ... On?'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/SO5wxfwgKYI/AAAAAAAAAFk/GuITXxQRq7I/s72-c/DSCF1523.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-2700662143407013117</id><published>2008-09-20T14:39:00.000-07:00</published><updated>2008-09-21T00:20:58.540-07:00</updated><title type='text'>New Logic Analyser Brainstorm</title><content type='html'>Twin 4040s. 128k static RAM. A line buffer, probably in the region of the number 244. Something related to Arduino in a vague fashion.&lt;br /&gt;&lt;br /&gt;8 data lines connected to the buffer, and from there onto the RAM chip. The 4040s provide the address generation.&lt;br /&gt;&lt;br /&gt;Press a button or otherwise glean a clue about an appropriate time to start sampling from some logic or other. Reset the addressing logic. While ram not full:- increment address, latch data into the buffer and then write it to the RAM. When RAM full, await instructions to download via serial.&lt;br /&gt;&lt;br /&gt;Could work, non?&lt;br /&gt;&lt;br /&gt;Alternatively there seems to be a little logic analyser war happening right now - I'd back &lt;a href="http://www.saleae.com/logic/"&gt;this regime&lt;/a&gt;. If you earn in dollars, then it's offering quite good value for money. If you earn in English pounds then you're laughing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-2700662143407013117?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/2700662143407013117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=2700662143407013117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2700662143407013117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2700662143407013117'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/09/new-logic-analyser-brainstorm.html' title='New Logic Analyser Brainstorm'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-2819398098294840408</id><published>2008-09-19T12:15:00.000-07:00</published><updated>2008-10-07T12:36:12.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wire library'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='Max6956'/><category scheme='http://www.blogger.com/atom/ns#' term='stray capacitance'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><category scheme='http://www.blogger.com/atom/ns#' term='weewee'/><title type='text'>Programmer Redux</title><content type='html'>The drop-in centre for stray capacitance was closed by the health and safety after it was shorted by a stream of wee created by a Superintended Nindo. At least I &lt;span style="font-style:italic;"&gt;think&lt;/span&gt; that's what I heard. I could be wrong. Whatever happened, all the residents must have all come to join with the raving mass I already had, the result of which is that the board resolutely refused to work again after my last witless ramblings.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SNQAmtUtQ5I/AAAAAAAAADY/FZRQHvy_47k/s1600-h/17-chip_capacitor.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SNQAmtUtQ5I/AAAAAAAAADY/FZRQHvy_47k/s200/17-chip_capacitor.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5247820130794947474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pictured: Stray capacitance gathering&lt;br&gt;ready to frustrate my EEPROMming.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So - I started again!&lt;br /&gt;&lt;br /&gt;The code was as much of a lash-up as the board, so I gutted it in favour of a &lt;a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3503"&gt;Max6956&lt;/a&gt; IO expander cum LED display driver. 20 gorgeous lines of GPIO, all driven by the Wire library and 2 lines off the Arduino. 12 Address lines, 8 data lines - Pimms o'clock! It's so much cleaner now without having to clock data around scratchy shift registers. I might actually show it to you.&lt;br /&gt;&lt;br /&gt;The board came together in about 40 minutes and the code didn't take long at all because I already had a working sketch that drove the beastie. And to my immense relief it worked first time, and reliably every time since. I think I may well solidify this design onto one of the Arduino shield PCBs that I bought from &lt;a href="http://www.adafruit.com/"&gt;Lady Ada&lt;/a&gt; aeons ago 'in case I ever needed one'.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SOu5I8B9uAI/AAAAAAAAAFc/C95qS0ej4Dg/s1600-h/DSCF1501.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SOu5I8B9uAI/AAAAAAAAAFc/C95qS0ej4Dg/s400/DSCF1501.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5254496953462274050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see here the new MMC sail, #4 in a series of many. My favorite one so far, this has more than the requisite 6 resistors. I got a smart colleague to recommend a way to get an LED to flash in response to the clock line clocking. He told me that a monostable would do the trick and here it is. Why not just pop an LED on the line? Well, I'd done that already and sometimes that clock line might be left high. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SOu4MXW64yI/AAAAAAAAAFU/ma-sCF5zZZI/s1600-h/DSCF1494.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SOu4MXW64yI/AAAAAAAAAFU/ma-sCF5zZZI/s400/DSCF1494.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5254495912825905954" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-2819398098294840408?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/2819398098294840408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=2819398098294840408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2819398098294840408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2819398098294840408'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/09/programmer-redux.html' title='Programmer Redux'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/SNQAmtUtQ5I/AAAAAAAAADY/FZRQHvy_47k/s72-c/17-chip_capacitor.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-7622500931134114581</id><published>2008-09-16T11:55:00.000-07:00</published><updated>2008-10-07T12:36:50.597-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eeprom'/><category scheme='http://www.blogger.com/atom/ns#' term='mmc interface'/><category scheme='http://www.blogger.com/atom/ns#' term='acorn atom'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>Lash-up!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SNABwJZpVdI/AAAAAAAAAC4/-Ej00fLiQIc/s1600-h/eepromprog.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SNABwJZpVdI/AAAAAAAAAC4/-Ej00fLiQIc/s400/eepromprog.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246695492555462098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What a mess! But it works - sometimes :) All that stray capacitance - well someone's got to give it a home.&lt;br /&gt;&lt;br /&gt;This is what I'm forced to do because the &lt;a href="http://matthieu.benoit.free.fr/119.htm"&gt;Stag PP39 EPROM programmer&lt;/a&gt; that I was so generously given by a fellow &lt;a href="http://www.freecycle.org/"&gt;FreeCycler&lt;/a&gt; works well, but for its serial connection. Ho hum. Wanting to burn an EPROM to hold the driver code for the Atom MMC interface was the necessity that was the mother of this frightful invention. In a fit of pique I had the  idea that I should create a 3-step process: Burn my code into an EEPROM, transfer this to the programmer's buffer, and thence into an EPROM! Why not just use the EEPROM for my project? An astute question, esteemed reader. Well the type of EPROM expected by the Atom is an olde-fashioned marque with a subtly different pin-out to the more contemporary (read: standard) 27x series. Luckily the PP39 can burn the &lt;a href="http://www.jrok.com/datasheet/TMS2532.pdf"&gt;2532&lt;/a&gt; that was required. Even luckier I suppose is the fact that I had one of these! An adapter board can be made to facilitate the harmonious interfacing of the disparate breeds, but this would involve less lashing-up, you see? And we all need a jolly good lashing from time to time. &lt;br /&gt;&lt;br /&gt;I digress. What you see before you (or more correctly &lt;span style="font-style:italic;"&gt;above&lt;/span&gt;) is an ls299 accompanied by a brace of ls164 shift registers. These in turn are connected to an 8k Atmel EEPROM. In the driving seat you see the Arduino and - naturally - a poor but functional MMC interface. The 164s are in charge of address generation, and the 299 has bi-directional data line duties. It's a simple and effective design which I have referenced before.&lt;br /&gt;&lt;br /&gt;I've developed the Atom MMC driver in assembler, naturally. This time I opted for cross assembly. If you saw the code attached to my previous post (my - is that the time?) you may well understand why - the inline assembler is hard work with its terse labelling syntax. I develop and assemble on a PC, using a custom Visual Studio workspace and a freeware 6502 assembler. The resulting binary is debugged as far as possible using Wouter Ras' brilliant though tricksy DOS &lt;a href="http://www.stairwaytohell.com/atom/wouterras/"&gt;Atom emulator&lt;/a&gt;. When I'm happy with the code it gets put on the MMC card and burned to the EEPROM using a subtle combination of swearing, crossed fingers and sacrificial chickens. The burning process needs to be attempted a fair number of times (the stray capacitance, bless) until the verify step passes and I can be sure the lash-up has worked. Once transferred to the programmer, the code fizzles its way onto a freshly UV-cooked EPROM and then into its warm and welcoming bed - Socket IC24. And so to work:&lt;br /&gt;&lt;br /&gt;Presenting - the MMC adapter I built to fit on the venerable machine's expansion port, as visible here.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SNAVZsPL39I/AAAAAAAAADA/_PQQGE_QUNw/s1600-h/target.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SNAVZsPL39I/AAAAAAAAADA/_PQQGE_QUNw/s400/target.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246717097002393554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And in situ:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SNAbqy70LsI/AAAAAAAAADI/u2woqkeUqdM/s1600-h/fitten.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SNAbqy70LsI/AAAAAAAAADI/u2woqkeUqdM/s400/fitten.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246723987927740098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Goodness - that &lt;span style="font-style:italic;"&gt;is&lt;/span&gt; the time! Two and a half months this post has taken me! Either that or my post-Sachertorte coma was deeper than usual... Whatever, forgive me. I am off to play Atom Invaders - which now loads in under 3 seconds, a far cry from the original 5 minutes of the tape version!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-7622500931134114581?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7622500931134114581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7622500931134114581' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7622500931134114581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7622500931134114581'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/09/lash-up.html' title='Lash-up!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/SNABwJZpVdI/AAAAAAAAAC4/-Ej00fLiQIc/s72-c/eepromprog.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-1095605496839376849</id><published>2008-07-01T08:59:00.000-07:00</published><updated>2008-09-16T07:30:02.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='6522'/><category scheme='http://www.blogger.com/atom/ns#' term='acorn atom'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><title type='text'>He's at it again!</title><content type='html'>I'm getting back into the Atom swing! After a fruitless hour measuring incorrect logic levels at the Atom's expansion port I was on the verge of giving up. I had been prodding the VIA, according to available documentation, and getting nowhere. All I wanted was a toggly bit. Was that too much to ask for? That's when I decided to do some chip swapping. &lt;br /&gt;&lt;br /&gt;It takes me longer than most people to get to this point as I'm a software person at heart and so blame that first ;)&lt;br /&gt;&lt;br /&gt;I just happened to have a vintage 6522 VIA lying on my desk so I swapped the chips over. Joy! I was flipping bits like a demon. Naturally my thoughts turned to MMC...&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;10@=0&lt;br /&gt;20!#208=!#208+3&lt;br /&gt;30V=#B800&lt;br /&gt;40W=#FFF4&lt;br /&gt;50T=#80&lt;br /&gt;60DIM LL(13),C(6)&lt;br /&gt;70F.N=0TO13;LL(N)=#FFFF;N.N&lt;br /&gt;80F.N=1TO2; DIM P(-1)&lt;br /&gt;90P.&amp;quot;PASS &amp;quot;N',$21&lt;br /&gt;100[&lt;br /&gt;110\ main&lt;br /&gt;120:LL0 LDA @#0&lt;br /&gt;130STA C+1; STA C+2; STA C+3; STA C+4&lt;br /&gt;140LDA @#95; STA C+0&lt;br /&gt;150JSR LL3&lt;br /&gt;160LDA @#40+#0; JSR LL7&lt;br /&gt;170LDA @CH&amp;quot;1&amp;quot;; SBC @0; JMP W&lt;br /&gt;180\ select card&lt;br /&gt;190:LL1 LDA @0; STA V; RTS&lt;br /&gt;200\ deselect card&lt;br /&gt;210:LL2 LDA @#20; STA V; RTS&lt;br /&gt;220\ init hw and go spi&lt;br /&gt;230:LL3 LDA @0; STA V+#C&lt;br /&gt;240LDA @#FE; STA V+2&lt;br /&gt;250LDA @#20; STA V&lt;br /&gt;260LDY @10&lt;br /&gt;270:LL4 LDA @#FF; JSR LL5; DEY; BNE LL4&lt;br /&gt;280RTS&lt;br /&gt;290\ xferbyte&lt;br /&gt;300:LL5 STX T+0; STY T+1; LDY @8&lt;br /&gt;310:LL6 PHA; AND @#80; STA V&lt;br /&gt;320ORA @#40; STA V&lt;br /&gt;330LDX V; AND @#BF; STA V&lt;br /&gt;340TXA; ROR A&lt;br /&gt;350PLA; ROL A&lt;br /&gt;360DEY; BNE LL6&lt;br /&gt;370PHA; JSR #F7FA; PLA&lt;br /&gt;380LDY T+1; LDX T+0;&lt;br /&gt;390RTS&lt;br /&gt;400\ command&lt;br /&gt;410:LL7 STA C+5; LDY @5&lt;br /&gt;420:LL8 LDA C,Y; JSR LL5; DEY; BPL LL8&lt;br /&gt;430:LL9 LDA @#FF; JSR LL5; AND @#FF; CLC; BPL LL10&lt;br /&gt;440DEY; BNE LL9;&lt;br /&gt;450SEC&lt;br /&gt;460:LL10 RTS&lt;br /&gt;470]&lt;br /&gt;480P.$6&lt;br /&gt;490NE.N&lt;br /&gt;500END&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you're an ex-atommer or you've been around BBC micros you might recognise this. If you don't then I can tell you it's some Atom basic with inline assembler. The Atom's Basic dialect was hard on the eyes but lightning fast. By the standards of the day, naturally ;)&lt;br /&gt;&lt;br /&gt;The built-in assembler gave the user of this machine an instant boost when learning to program. No fussing with 3rd party apps, loading the assembler or machine code, or the attendant problems with cassettes. Turn on. Assemble. Bam! (Which is as it happens almost quite literally what happened to my 1st Atom over 20 years ago...) Now if only it was that easy for the kids of today - it was much better in the old days - I remember when all this was fields etc. etc.&lt;br /&gt;&lt;br /&gt;The above listing is code to bit-bang SPI to an MMC card attached via the simplest of hardware harnesses to the rear expansion connector of the Atom. I'm looking at making a ROM based solution that hooks into the OS's filing system vectors. It's all quite primitive at the moment but I'm hoping it'll solidify. Get in touch if you have any experience of developing this kind of Atom program. I'd love to talk to you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-1095605496839376849?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/1095605496839376849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=1095605496839376849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/1095605496839376849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/1095605496839376849'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/07/hes-at-it-again.html' title='He&apos;s at it again!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-5621234710709663456</id><published>2008-06-28T03:04:00.000-07:00</published><updated>2008-06-29T11:50:32.017-07:00</updated><title type='text'>It's gone all doubley-spaced!</title><content type='html'>(edit)&lt;br /&gt;The listings are back!&lt;br /&gt;&lt;br /&gt;&lt;del&gt;Apologies about the listings, esteemed reader, they appear to have lost their formatting and become double-spaced. I'm looking into it but in the mean time, please bear with me!&lt;/del&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-5621234710709663456?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/5621234710709663456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=5621234710709663456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5621234710709663456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5621234710709663456'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/06/its-gone-all-doubley-spaced.html' title='It&apos;s gone all doubley-spaced!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-9136848799112434086</id><published>2008-06-26T13:15:00.001-07:00</published><updated>2008-12-09T05:21:26.227-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='acorn atom'/><title type='text'>Atom Power!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SGP5TwmvZ6I/AAAAAAAAACo/EJRDjYL4t6k/s1600-h/800px-Acorn_atom_zx1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SGP5TwmvZ6I/AAAAAAAAACo/EJRDjYL4t6k/s400/800px-Acorn_atom_zx1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5216286911285389218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;She's arrived! After many years of fussing and prevaricating I've finally taken the plunge and bought myself an Atom. The prices were rocketing in the bay of E, and I reckoned on the time being nigh. This one was advertised as having a broken key and otherwise with little hope of receiving a working box I decided on taking a punt and fixing it up if necessary. I've always loved this machine. I owned one as a boy although it was only a half-populated board without a case. It still did the business though!&lt;br /&gt;&lt;br /&gt;I must admit to being a little saddened when I opened the wrapping. It was grubby and half of the keys appeared to be smashed in, sitting a good 6-7mm lower than their neighbours. The 1st thing was to open it up and check the power supply status. The Atom was infamous for overheating and many owners bypassed the internal regulators in favour of feeding it a regulated 5v diet. As was indeed the case with this one. It had received some tweaks in its time, but I was really happy to see the work was all of a high standard. These were all what I call 'magazine hacks' - the electronic equivalent of a one-liner joke. Single wire patches for enabling an eighth bit on the printer port, joining some lines to an external socket for wiring a joystick, nothing major. I was chuffed to see that it was fully expanded memory and support-chip wise. 12K RAM &amp; 12K ROM plus a utility kit that I'm still having trouble finding any info about. I'll have to resort to a disassembler I think. No colour board but then I wouldn't ever have even contemplated that. Too rare.&lt;br /&gt;&lt;br /&gt;The mother and key boards were in a real state. I think it had been stored on top of kitchen cupboards at some point in its life and it had received a good layering of yellow grease and fibres. Some keys were sticking and this was the main reason. I've since scrubbed it with a toothbrush and plenty of warm soapy water and now you'd never know! I was shy of putting it in the dishwasher as some people recommend, this may be ok for generic PC keyboards but rare vintage '80s hardware... &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SGQDURm0ryI/AAAAAAAAACw/HyiB8zTIOuw/s1600-h/crufty+atom.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SGQDURm0ryI/AAAAAAAAACw/HyiB8zTIOuw/s400/crufty+atom.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5216297915260383010" /&gt;&lt;/a&gt;At some point in its history the three keys in the lower left had been replaced. They were replaced with high quality keyswitches, which - well I never - made the keycaps sit higher. What had happened was that the previous owner had raised the original keycaps with superglue to match the height of the replacements. The original mechanism is a cheap spring-based creation which I've only ever seen in Atoms ... and a keypad that I was given recently! That was handy, wasn't it! So I hacked the keypad and replaced the switches with something contemporary and far more suitable. And the same height! The caps all came off and were cleaned and repaired where necessary.&lt;br /&gt;&lt;br /&gt;The machine is now clean and tidy, ready for work.&lt;br /&gt;&lt;br /&gt;One tough trick was finding a plug to fit the odd power socket dimensions. It's some olde fashioned imperial jack size. Eventually located with the assistance of an Atom owning colleague I was able to juice the old girl. To my immense surprise it eventually reset and presented me with the very comforting words:&lt;br /&gt;&lt;br /&gt;ACORN ATOM&lt;br /&gt;&gt;&lt;br /&gt;&lt;br /&gt;Joy!&lt;br /&gt;&lt;br /&gt;A computer's no good without software, right? Like all good '80s machines this one needs some square-wave goodness. I couldn't locate any software to generate the required signals that worked on a modern PC, so being handy with a compiler I got to work. I'm pleased I did all the work on ACE - the techniques transferred instantly and I had a program to translate raw program dumps into WAVS. And text files into raw dumps. And vice versa. &lt;br /&gt;&lt;br /&gt;I'll be happy to pass these on to anyone that wants them. &lt;a href="http://groups.google.com/group/micro-hacker/web/atom.rar"&gt;The source can be found here&lt;/a&gt;. It's vanilla C++. I'll be happy to help with porting, compiling or whatever.&lt;br /&gt;&lt;br /&gt;There looks to be a new site emerging that could eventually be a must-see for any Atom fans. I'm speaking in the future tense as it's not there yet but I've spoken with the masters and they're promising big things. &lt;a href="http://www.acornpreservation.org/"&gt;Watch this space.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you're an Atom fan, get in touch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-9136848799112434086?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/9136848799112434086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=9136848799112434086' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9136848799112434086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9136848799112434086'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/06/atom-power.html' title='Atom Power!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/SGP5TwmvZ6I/AAAAAAAAACo/EJRDjYL4t6k/s72-c/800px-Acorn_atom_zx1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8601408398075787289</id><published>2008-05-15T05:06:00.000-07:00</published><updated>2008-12-09T05:21:26.882-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cadsoft eagle'/><category scheme='http://www.blogger.com/atom/ns#' term='PCB'/><category scheme='http://www.blogger.com/atom/ns#' term='8255'/><category scheme='http://www.blogger.com/atom/ns#' term='zx81'/><category scheme='http://www.blogger.com/atom/ns#' term='IO'/><title type='text'>IO, IO it's off to work we go!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SCwnt2zaiAI/AAAAAAAAACQ/sz4GQaUwFIg/s1600-h/zxio_brd.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SCwnt2zaiAI/AAAAAAAAACQ/sz4GQaUwFIg/s400/zxio_brd.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5200575338464839682" /&gt;&lt;/a&gt;&lt;br /&gt;This is my 1st attempt at getting a PCB made. It was rushed so please excuse any glaring stupidity :)&lt;br /&gt;&lt;br /&gt;A colleague was having some PCBs manufactured and had a little space left on the plate so I knocked this together during a lunch hour. I'm pretty pleased so far - the boards have come back and, despite being less than optimally packed, they're quite neat.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/SCyom2zaiCI/AAAAAAAAACg/o-eHCXFjUmY/s1600-h/zxio.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/SCyom2zaiCI/AAAAAAAAACg/o-eHCXFjUmY/s400/zxio.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5200717055205738530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a ZX81 IO board. As I'm sure you've already worked out, esteemed reader! The 8255 is a general purpose IO controller and it's mapped to the Z80 IO space at ports 0x07 and 0x17. I'll be attaching the MMC card to it later :)&lt;br /&gt;&lt;br /&gt;I've included links to the schematic and board files in case you want to fire up Eagle and have a play. This is a package with a very steep learning curve. I've been playing with it for about a year and I can only now say that I'm beginning to become confident. Version 5 has just been released which adds some polish to the mix. It wouldn't be uncharitable to say that the package weas a little rough around the edges before..! I haven't pushed V5 much - and it's likely I never will :) - but you can just tell that there's been some love and attention lavished. Hurrah for CadSoft!&lt;br /&gt;&lt;br /&gt;Click the schematic for a very high res version. Or get the binaries from &lt;a href="http://groups.google.com/group/micro-hacker/web/zx_io.zip"&gt;HERE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'll let you know how it works out when the SMT 74s arrive!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SCwpwGzaiBI/AAAAAAAAACY/IRdS_voK6WM/s1600-h/zxio_sch.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SCwpwGzaiBI/AAAAAAAAACY/IRdS_voK6WM/s400/zxio_sch.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5200577576142800914" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-8601408398075787289?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8601408398075787289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8601408398075787289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8601408398075787289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8601408398075787289'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/05/io-io-its-off-to-work-we-go.html' title='IO, IO it&apos;s off to work we go!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/SCwnt2zaiAI/AAAAAAAAACQ/sz4GQaUwFIg/s72-c/zxio_brd.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-5549606273108760490</id><published>2008-05-02T11:25:00.001-07:00</published><updated>2008-12-09T05:21:26.992-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QL'/><category scheme='http://www.blogger.com/atom/ns#' term='Master 128'/><category scheme='http://www.blogger.com/atom/ns#' term='c128'/><category scheme='http://www.blogger.com/atom/ns#' term='sio2sd'/><category scheme='http://www.blogger.com/atom/ns#' term='sd2iec'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple 2e'/><category scheme='http://www.blogger.com/atom/ns#' term='Spectrum 128'/><category scheme='http://www.blogger.com/atom/ns#' term='zx81'/><category scheme='http://www.blogger.com/atom/ns#' term='Atari 800'/><title type='text'>Average bits 10.2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/SBtc4WTs38I/AAAAAAAAACI/p534CISz-Jo/s1600-h/minimuseum.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" target="_null" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SBtc4WTs38I/AAAAAAAAACI/p534CISz-Jo/s400/minimuseum.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5195848718232641474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;May I present some of my non-human babies. Continued thanks go to my employers - you know who you are - for allowing the museum to exist on my desk.&lt;br /&gt;&lt;br /&gt;The C128 rear-left has a proto-board built &lt;a target="_null" href="http://www.c64-wiki.com/index.php/SD2IEC"&gt;SD2IEC card&lt;/a&gt; installed inside the tape drive. I shaped the PCB like a cassette. Press eject and you can insert an SD card into the presented slot. Cheesy but fun :)&lt;br /&gt;&lt;br /&gt;The Apple //e front left is my latest baby. I'm awaiting a prototype board from the states so I can build an &lt;a href="http://s.guillard.free.fr/Apple2IDE/Apple2IDE.htm" target="_null"&gt;IDE card&lt;/a&gt;. They're ridiculously simple to build, it seems.&lt;br /&gt;&lt;br /&gt;The centre column contains a QL, an STe, a Spectrum 128 and a BBC Master 128 with &lt;a href="http://mmbeeb.mysite.wanadoo-members.co.uk/source.html" target="_null"&gt;MMBeeb interface&lt;/a&gt;. They're nice, but not my favourites. Especially as the Sinclair machines require attention due to defective membranes. A pathology known around these parts as the curse of Clive.&lt;br /&gt;&lt;br /&gt;No, the favourite machine honour belongs to the Atari 800. This is another machine with a &lt;a target="_null" href="http://sio2sd.gucio.pl/index_en.html"&gt;SD card interface&lt;/a&gt; secreted away in a hacked tape drive. I dreamed.. no.. &lt;span style="font-style:italic;"&gt;seriously fantasised&lt;/span&gt; about this machine when I was pecking away at my ZX81. (Not pictured - it's on the bench at the moment having an &lt;a href="http://www.robsonfamily.dsl.pipex.com/mmc/mmc.htm" target="_null"&gt;SD card and keyboard upgrade&lt;/a&gt;, natch)&lt;br /&gt;&lt;br /&gt;One thing tends to be common amongst these machines and that's the addition of SD card interfaces.. My hat goes off to the engineers linked in this post. MMBeeb was my first exposure to the practice, which gave me enough of a kick-start to design my own interface for the zx81. &lt;a target="_null"  href="http://en.wikipedia.org/wiki/3D_Monster_Maze"&gt;Monster maze&lt;/a&gt; loads in 6 seconds. Bliss!&lt;br /&gt;&lt;br /&gt;I guess it remains to be said - &lt;span style="font-weight:bold;"&gt;I AM 8-BIT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And proud :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-5549606273108760490?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/5549606273108760490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=5549606273108760490' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5549606273108760490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5549606273108760490'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/05/average-bits-102.html' title='Average bits 10.2'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6_haRsOYg8/SBtc4WTs38I/AAAAAAAAACI/p534CISz-Jo/s72-c/minimuseum.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6148446382111066653</id><published>2008-04-27T12:01:00.000-07:00</published><updated>2008-12-09T05:21:27.356-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arcade spinner'/><category scheme='http://www.blogger.com/atom/ns#' term='mouse guts'/><category scheme='http://www.blogger.com/atom/ns#' term='glue'/><category scheme='http://www.blogger.com/atom/ns#' term='string'/><category scheme='http://www.blogger.com/atom/ns#' term='video head'/><title type='text'>Like a record baby!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/SBTcOGTs35I/AAAAAAAAABw/v3gxmTQUPTI/s1600-h/0004.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SBTcOGTs35I/AAAAAAAAABw/v3gxmTQUPTI/s320/0004.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5194018405034549138" /&gt;&lt;/a&gt;I've been inspired by someone or other's homebuilt spinner. I probably saw it on &lt;a href="http://www.makezine.com/"&gt;Make&lt;/a&gt; or &lt;a href="http://www.hackaday.com/"&gt;Hack-a-day&lt;/a&gt;, I forget. If you aren't familiar with the aforementioned input device it's like, well you know, like an arcade game control that could be found on such classics as Tempest, Arkanoid, Cameltry and many many more. You spin it. Hence the name.&lt;br /&gt;&lt;br /&gt;I had to have a go. I have a project stack 100 deep at the moment and no time to do anything, so I needed a quick fix, a micro-project if you will. And this seemed like the perfect candidate.&lt;br /&gt;&lt;br /&gt;So the obligatory VCR head was pulled from a dead Matsui. This particular model had a wonderful head motor mechanism that came apart very easily and cleanly, leaving no random sprue like some I've been near. It also furnished me with convenient screw holes. The motor shaft has a metal disk at the end which was just the right size for some idle tweaking. There's something very relaxing and .. zen I suppose .. about VCR head motor mechanisms. I suggest everyone try hefting one and idly spinning away a few minutes :)&lt;br /&gt;&lt;br /&gt;An old USB mouse was inspected and found to be of the correct vintage - ball era. The  optical encoder disks were removed and the pcb ritually prepared. The left/right encoder was severed and the traces replaced with kynar wire. Did I already say that this stuff has changed my life? I did have to modify my wire strippers to nip away that micro-fine insulation and I must admit the very act made me feel quite hardcore!&lt;br /&gt;&lt;br /&gt;So with the emitter/receiver pair free to do their thing I started to try and mount the encoder disk on the base of the motor. What a nightmare. I tried different adhesives and when the little black brolly wasn't teetering drunkenly on the shaft or resolutely embracing my fingers it was wholly and utterly eccentric. In the end I liberated one of the tiny rare earth magnets from a sneakily swiped Magnetix stick. To this I super-glued the encoder on its truncated shaft. This could then be pinged onto the end of the shaft and repositioned easily whilst still holding position. When it was rotating as centrally as I thought it could, out came the hot glue. One quick spin draged a glistening thread of glue from the gun like silk from a spider's arse. And there was the disk in place, semi-permanently fixed. Result!&lt;br /&gt;&lt;br /&gt;To mount the spinner I chose a CD 'cake box'. I'll leave the details of mounting the motor to your imagination as I am wont to do. All I will say is knife and screws were involved, but not my friend the rocket scientist.&lt;br /&gt;&lt;br /&gt;So with the motor mounted all that needed to be achieved was the solid mounting of the transceiver pair. Tip #2: Don't use stiff wire. I thought that this would be simple, quick and give me plenty lattitide to position the payload precisely in space with little play. Wrong. It bounced around like Katie Price on a trampoline. So I did what I always do at moments like this - reach for the Lego. A small 1x2 hinge, a 1x8 plate and some more hot glue later I had the PCB shard mounted in the right position. More hot glue saw it fixed and locked. Game on! &lt;br /&gt;&lt;br /&gt;[Click for a much, much bigger view! Erk!]&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/SBTfn2Ts36I/AAAAAAAAAB4/CVPLywUMZT4/s1600-h/DSCF2174.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/SBTfn2Ts36I/AAAAAAAAAB4/CVPLywUMZT4/s320/DSCF2174.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194022145951063970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cuts on your fingertips are painful. Rough-edged spinning steel disks attached to a momentum powerhouse cause cuts. Thinks needed :) The rubber 'tyre' that encased the middle mouse wheel was promptly repurposed. An almost perfect fit! I was understandably quite chuffed. While in the heightened state of chuff I figured some buttons might be useful too, in order to  save splitting control between the keyboard and spinner when necessary. So off to the  bits box and one feisty rummage later we have control! And the old BBC Master computer has 2 less keys.&lt;br /&gt;&lt;br /&gt;One leisurely wiring of these buttons to the mouse PCB switch pads and there we have it. One spinner. It may not be pretty, but it was a project! And it works great with Tempest :D&lt;br /&gt;&lt;br /&gt;[Click for a much, much bigger view! Zoinks!]&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/SBThEGTs37I/AAAAAAAAACA/IXxIcX9Q9j8/s1600-h/DSCF2175.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/SBThEGTs37I/AAAAAAAAACA/IXxIcX9Q9j8/s320/DSCF2175.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194023730793996210" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-6148446382111066653?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6148446382111066653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6148446382111066653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6148446382111066653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6148446382111066653'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/04/like-record-baby.html' title='Like a record baby!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6_haRsOYg8/SBTcOGTs35I/AAAAAAAAABw/v3gxmTQUPTI/s72-c/0004.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-138405406128231694</id><published>2008-04-13T01:00:00.000-07:00</published><updated>2009-02-20T02:20:34.931-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='efficient'/><category scheme='http://www.blogger.com/atom/ns#' term='small'/><category scheme='http://www.blogger.com/atom/ns#' term='filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='sd'/><category scheme='http://www.blogger.com/atom/ns#' term='FAT'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><title type='text'>u-Fat filesystem</title><content type='html'>Not a truncated attempt at a verbal slight, but a solution to PC compatible file access  for micro-controllers!&lt;br /&gt;&lt;br /&gt;Many FAT file system implementations are, by necessity, too large to take a place in micro-controller applications. Long file names, fragmented files, the FAT tables - no wonder a 'proper' solution weighs in at many K of code and buffers. One solution is to carry out raw access to the card, but this then involves compromises when getting the data off the card onto the desktop.&lt;br /&gt;&lt;br /&gt;My solution is to reduce weight of code by applying stringent use restrictions:&lt;br /&gt;&lt;br /&gt;Only 16 files (potentially), named in 8.3 format, pre-allocated and contiguous.&lt;br /&gt;&lt;br /&gt;This enables us to locate the start sector of the file and read/write to it as we wish. The files can be freely swapped between PC and micro controller application using standard operating system commands. To reach this state of nirvana all that needs to be done is format the card before copying the pre-allocated files to it.&lt;br /&gt;&lt;br /&gt;The only external requirement for servicing the code is a function that reads sectors, using logical block addressing, from your chosen FAT device. If you look in the ACE post previously the code zip there includes a complete MMC solution.&lt;br /&gt;&lt;br /&gt;I found a &lt;a target="__null" href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1206874649/1#1"&gt;schematic on the arduino site&lt;/a&gt; that is almost identical to my own and comes very highly recommended. If you haven't got a card reader that you can cannibalise then edge connector works well too. It's a common way of doing it and there are many good examples around - &lt;a target="__null" href="http://homepage.ntlworld.com/seanellis/images/mmcserial_photo.jpg"&gt;you can find one here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's the header which shows just how micro micro can be!&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt; /*&lt;br /&gt; /  Microfat.&lt;br /&gt; /&lt;br /&gt; /  Developed by Charlie Robson in 2008.&lt;br /&gt; /&lt;br /&gt; /  This is the bare minimum* functionality required to read and write data&lt;br /&gt; /  to a FAT formatted device. In this case, an MMC card.&lt;br /&gt; /&lt;br /&gt; /  Rather than build a fully-featured FAT implimentation this will allow&lt;br /&gt; /  the user to locate sectors associated with a file on the device, and&lt;br /&gt; /  read and write to them in a brute force manner. No error checking, no&lt;br /&gt; /  long filenames, not even any support for fragmented files :) This is&lt;br /&gt; /  raw access, we only deal with existing files.&lt;br /&gt; /&lt;br /&gt; /  What you do get is a very lightweight module for extremely limited&lt;br /&gt; /  environments. Arduino has 2k of SRAM. Holding the sector of FAT data&lt;br /&gt; /  needed to traverse a fragged file would instantly gobble up 1/4&lt;br /&gt; /  of that. Enough said. Another benefit to not using the FAT is that&lt;br /&gt; /  there's no need to worry about whether a device is FAT12 or 16.&lt;br /&gt; /&lt;br /&gt; /  To use:&lt;br /&gt; /    Format a card.&lt;br /&gt; /    Make a file big enough to hold all the data you expect to write.&lt;br /&gt; /    Copy to the card.&lt;br /&gt; /&lt;br /&gt; /  With the MMC module started up, call initialise. This will cache some&lt;br /&gt; /  relevant information about the card such as the sector location of the&lt;br /&gt; /  root directory and data area.&lt;br /&gt; /&lt;br /&gt; /  Call locateFileStart, passing the name of the file which is providing&lt;br /&gt; /  the backing store for your transfers, and assuming the file is found&lt;br /&gt; /  in the directory you'll receive its start sector and file size.&lt;br /&gt; /&lt;br /&gt; /  Now feel free to read and write data to and from the sectors allocated&lt;br /&gt; /  to the file. Code carefully though - stray writes can twat your card!&lt;br /&gt; /&lt;br /&gt; /  Enjoy :) &lt;br /&gt; /&lt;br /&gt; /  *Massive understatement!&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#ifndef __MICROFAT_H__&lt;br /&gt;#define __MICROFAT_H__&lt;br /&gt;&lt;br /&gt;// some data structures we'll be encountering on our travels.&lt;br /&gt;&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;  byte bootable;&lt;br /&gt;  byte chsAddrOfFirstSector[3];&lt;br /&gt;  byte partitionType;&lt;br /&gt;  byte chsAddrOfLastSector[3];&lt;br /&gt;  uint32_t lbaAddrOfFirstSector;&lt;br /&gt;  uint32_t partitionLengthSectors;&lt;br /&gt;}&lt;br /&gt;partition_record;&lt;br /&gt;&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;  byte jump[3];&lt;br /&gt;  char oemName[8];&lt;br /&gt;  uint16_t bytesPerSector;&lt;br /&gt;  byte sectorsPerCluster;&lt;br /&gt;  uint16_t reservedSectors;&lt;br /&gt;  byte fatCopies;&lt;br /&gt;  uint16_t rootDirectoryEntries;&lt;br /&gt;  uint16_t totalFilesystemSectors;&lt;br /&gt;  byte mediaDescriptor;&lt;br /&gt;  uint16_t sectorsPerFAT;&lt;br /&gt;  uint16_t sectorsPerTrack;&lt;br /&gt;  uint16_t headCount;&lt;br /&gt;&lt;br /&gt;  uint32_t hiddenSectors;&lt;br /&gt;  uint32_t totalFilesystemSectors2;&lt;br /&gt;  byte logicalDriveNum;&lt;br /&gt;  byte reserved;&lt;br /&gt;  byte extendedSignature;&lt;br /&gt;  uint32_t partitionSerialNum;&lt;br /&gt;  char volumeLabel[11];&lt;br /&gt;  char fsType[8];&lt;br /&gt;  byte bootstrapCode[447];&lt;br /&gt;  byte signature[2];&lt;br /&gt;}&lt;br /&gt;boot_sector;&lt;br /&gt;&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;  char filespec[11];&lt;br /&gt;  byte attributes;&lt;br /&gt;  byte reserved[10];&lt;br /&gt;  uint16_t time;&lt;br /&gt;  uint16_t date;&lt;br /&gt;  uint16_t startCluster;&lt;br /&gt;  uint32_t fileSize;&lt;br /&gt;}&lt;br /&gt;directory_entry;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace microfat&lt;br /&gt;{&lt;br /&gt;  // Cache some relevant info about the card.&lt;br /&gt;  //&lt;br /&gt;  bool initialise(byte* buffer);&lt;br /&gt;&lt;br /&gt;  // Get start sector, file size for given filename. Returns false if the file&lt;br /&gt;  // is not found in the directory.&lt;br /&gt;  //&lt;br /&gt;  bool locateFileStart(const char* filename, unsigned long&amp;amp; sector, unsigned long&amp;amp; size);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#endif // __MICROFAT_H__&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now for the meat:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;#include &amp;lt;wprogram.h&amp;gt;&lt;br /&gt;#include &amp;quot;microfat.h&amp;quot;&lt;br /&gt;#include &amp;quot;mmc.h&amp;quot;&lt;br /&gt;&lt;br /&gt;// Data which remains constant over one session. Re-initialise if&lt;br /&gt;// the card is changed.&lt;br /&gt;//&lt;br /&gt;static struct&lt;br /&gt;{&lt;br /&gt;  uint16_t sectorsPerCluster;&lt;br /&gt;&lt;br /&gt;  uint32_t rootDirSect, cluster2;&lt;br /&gt;&lt;br /&gt;  byte* buffer;&lt;br /&gt;}&lt;br /&gt;vars;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bool microfat::initialise(byte* buffer)&lt;br /&gt;{&lt;br /&gt;  vars.buffer = buffer;&lt;br /&gt;&lt;br /&gt;  if (RES_OK != mmc::readSectors(vars.buffer, 0, 1))&lt;br /&gt;  {&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  partition_record* p = (partition_record*)&amp;amp;vars.buffer[0x1be];&lt;br /&gt;  long bootSector = p-&amp;gt;lbaAddrOfFirstSector;&lt;br /&gt;&lt;br /&gt;  if (RES_OK != mmc::readSectors(vars.buffer, bootSector, 1))&lt;br /&gt;  {&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  boot_sector* b = (boot_sector*)vars.buffer;&lt;br /&gt;&lt;br /&gt;  if (BYTESPERSECTOR != b-&amp;gt;bytesPerSector)&lt;br /&gt;  {&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  vars.sectorsPerCluster = b-&amp;gt;sectorsPerCluster;&lt;br /&gt;  vars.rootDirSect = bootSector + b-&amp;gt;reservedSectors + (b-&amp;gt;fatCopies * b-&amp;gt;sectorsPerFAT);&lt;br /&gt;&lt;br /&gt;  long dirBytes = b-&amp;gt;rootDirectoryEntries * 32;&lt;br /&gt;  long dirSects = dirBytes / BYTESPERSECTOR;&lt;br /&gt;&lt;br /&gt;  if (dirBytes % BYTESPERSECTOR != 0)&lt;br /&gt;  {&lt;br /&gt;    ++dirSects;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  vars.cluster2 = vars.rootDirSect + dirSects;&lt;br /&gt;&lt;br /&gt;  return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Get start sector for given filename.&lt;br /&gt;//&lt;br /&gt;// Returns false if the specified file wasn't found in the directory.&lt;br /&gt;// Short filenames only. Be aware that the directory fills up with 'deleted'&lt;br /&gt;// filenames. Rather than deleting too many files try a quick reformat.&lt;br /&gt;//&lt;br /&gt;bool microfat::locateFileStart(const char* filename, uint32_t&amp;amp; sector, uint32_t&amp;amp; size)&lt;br /&gt;{&lt;br /&gt;  if (RES_OK == mmc::readSectors(vars.buffer, vars.rootDirSect, 1))&lt;br /&gt;  {&lt;br /&gt;    // The filenames are stored in [8][3] format. No dot, all upper case. &lt;br /&gt;    // Names shorter than 8 chars are padded with spaces.&lt;br /&gt;    //&lt;br /&gt;    // Cook the supplied name. fred.txt -&amp;gt; FRED----TXT&lt;br /&gt;    //&lt;br /&gt;    char cookedName[11];&lt;br /&gt;    for(int i = 0; i &amp;lt; 12; ++i)&lt;br /&gt;    {&lt;br /&gt;      cookedName[i] = 0x20;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    for (int i = 0, j = 0; i &amp;lt; 12 &amp;amp;&amp;amp; filename[i]; ++i)&lt;br /&gt;    {&lt;br /&gt;      if (filename[i] != '.')&lt;br /&gt;      {&lt;br /&gt;        // Force char to uppercase. Cheesy I know :)&lt;br /&gt;        //&lt;br /&gt;        cookedName[j] = filename[i] &amp;gt;= 96 ? filename[i] - 32 : filename[i];&lt;br /&gt;        ++j;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;        // Continue cooking chars at the extension position&lt;br /&gt;        //&lt;br /&gt;        j = 8;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    for (int i = 0; i &amp;lt; BYTESPERSECTOR; i += 32)&lt;br /&gt;    {&lt;br /&gt;      directory_entry* de = (directory_entry*)&amp;amp;vars.buffer[i];&lt;br /&gt;&lt;br /&gt;      // Don't match with deleted or system/volname/subdir/hidden files&lt;br /&gt;      //&lt;br /&gt;      if (de-&amp;gt;filespec[0] != 0xe5 &amp;amp;&amp;amp; (de-&amp;gt;attributes &amp;amp; 0x1e) == 0 &amp;amp;&amp;amp; memcmp(cookedName, de-&amp;gt;filespec, 11) == 0)&lt;br /&gt;      {&lt;br /&gt;        sector = vars.cluster2 + ((de-&amp;gt;startCluster-2) * vars.sectorsPerCluster);&lt;br /&gt;        size = de-&amp;gt;fileSize;&lt;br /&gt;        return true;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Which as you can see is smaller than the header - due in no small measure to the size of the FAT structure definitions.&lt;br /&gt;&lt;br /&gt;As it stands this code could be improved by using non-static file info structures - only one is supported right now but the change would be trivial. Also allowing the filename search to traverse the entire root directory space would allow access to more files. However I don't really see the utility in ths -wherever I've used this code I've never needed more than one file :)&lt;br /&gt;&lt;br /&gt;As usual any Qs are welcome.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/SZ6D5CpcFOI/AAAAAAAAAfc/gMel3sZUjgw/s1600-h/mmc_card.bmp"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 84px; height: 109px;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/SZ6D5CpcFOI/AAAAAAAAAfc/gMel3sZUjgw/s400/mmc_card.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5304822427075482850" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-138405406128231694?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/138405406128231694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=138405406128231694' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/138405406128231694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/138405406128231694'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/04/ufat.html' title='u-Fat filesystem'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_E6_haRsOYg8/SZ6D5CpcFOI/AAAAAAAAAfc/gMel3sZUjgw/s72-c/mmc_card.bmp' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-5514561373120414553</id><published>2008-04-06T03:00:00.000-07:00</published><updated>2008-12-09T05:21:27.526-08:00</updated><title type='text'>More ACEness</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/R_igFLOjOeI/AAAAAAAAABo/BLtBQnblcXg/s1600-h/defenders.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/R_igFLOjOeI/AAAAAAAAABo/BLtBQnblcXg/s200/defenders.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5186070981690735074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a more portable command-line driven utility to generate wav files ready for ACE's ears. There's a tiny enhancement that ramps up the volume during the lead-in which should prevent the kind of pants-wetting shock that I keep delivering to myself :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;/*&lt;br /&gt;* Support code for ACE - the arduino cassette engine&lt;br /&gt;*&lt;br /&gt;* Example code to write a wav file which can be played to&lt;br /&gt;* a microcontroller running the ACE software.&lt;br /&gt;*&lt;br /&gt;* Should be fairly portable unlike the original example.&lt;br /&gt;*&lt;br /&gt;* Enjoy.&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;fstream&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef unsigned char uint8_t;&lt;br /&gt;&lt;br /&gt;// adjust these to control endiannesses.&lt;br /&gt;//&lt;br /&gt;static const int ENDIAN0 = 0;&lt;br /&gt;static const int ENDIAN1 = 1;&lt;br /&gt;static const int ENDIAN2 = 2;&lt;br /&gt;static const int ENDIAN3 = 3;&lt;br /&gt;&lt;br /&gt;static const int ENDIAN0_S = 0;&lt;br /&gt;static const int ENDIAN1_S = 1;&lt;br /&gt;&lt;br /&gt;// desired wave structure - AHEM THESE ARE READ-ONLY&lt;br /&gt;// - THEY CAN'T BE CHANGED WITHOUT FUTZING THE CODE. SORRY.&lt;br /&gt;//&lt;br /&gt;static const int CHANNELS = 2;&lt;br /&gt;static const int SAMPLERATE = 44100;&lt;br /&gt;static const int BITSPERSAMPLE = 16;&lt;br /&gt;&lt;br /&gt;// this is as loud as we can get. not quite 11,&lt;br /&gt;// but approaching it.&lt;br /&gt;//&lt;br /&gt;static const double maxLevel = (double)SHRT_MAX * 1.0;&lt;br /&gt;static const short maxLevelS = (short)maxLevel;&lt;br /&gt;static const double minLevel = (double)SHRT_MIN * 1.0;&lt;br /&gt;static const short minLevelS = (short)minLevel;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// number of samples per cycle. 60 samples = 1 low or 2 high cycles.&lt;br /&gt;//&lt;br /&gt;static const int f1 = 60;&lt;br /&gt;static const int f1cyc = 1;&lt;br /&gt;static const int f2 = f1 / 2;&lt;br /&gt;static const int f2cyc = f1cyc * 2;&lt;br /&gt;&lt;br /&gt;// useful values, maybe&lt;br /&gt;//&lt;br /&gt;static const int usPerCycle = (int)(((double)f1 / 44100) * 1000000.0);&lt;br /&gt;static const int usPerHalfCycle = (int)(((double)f1 / 44100) * 500000.0);&lt;br /&gt;static const int usPerQuarterCycle = (int)(((double)f1 / 44100) * 250000.0);&lt;br /&gt;static const int usPerEighthCycle = (int)(((double)f1 / 44100) * 125000.0);&lt;br /&gt;&lt;br /&gt;static const int baudrate = (1000000 / usPerCycle);&lt;br /&gt;&lt;br /&gt;// 8 + stop + start;&lt;br /&gt;//&lt;br /&gt;static const int bitsPerFrame = 10;&lt;br /&gt;&lt;br /&gt;static const int samplesPerBit = f1 * f1cyc;&lt;br /&gt;static const int samplesPerFrame = bitsPerFrame * samplesPerBit;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static const int LOW_BIT = 0;&lt;br /&gt;static const int HIGH_BIT = !LOW_BIT;&lt;br /&gt;&lt;br /&gt;static const int LEADIN_BIT = LOW_BIT;&lt;br /&gt;static const int START_BIT = !LEADIN_BIT;&lt;br /&gt;static const int STOP_BIT = !START_BIT;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// NASTY HACK FOR WRITING WAVS. PLEASE LOOK AWAY NOW.&lt;br /&gt;&lt;br /&gt;void CreateWaveFile(std::ostream&amp;amp; output)&lt;br /&gt;{&lt;br /&gt;    char chars[4];&lt;br /&gt;&lt;br /&gt;    output &amp;lt;&amp;lt; &amp;quot;RIFF&amp;quot;;&lt;br /&gt;    *(int*)chars = 16;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0] &amp;lt;&amp;lt; chars[ENDIAN1] &amp;lt;&amp;lt; chars[ENDIAN2] &amp;lt;&amp;lt; chars[ENDIAN3];&lt;br /&gt;&lt;br /&gt;    output &amp;lt;&amp;lt; &amp;quot;WAVE&amp;quot;;&lt;br /&gt;    output &amp;lt;&amp;lt; &amp;quot;fmt &amp;quot;;&lt;br /&gt;&lt;br /&gt;    *(int*)chars = 16;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0] &amp;lt;&amp;lt; chars[ENDIAN1] &amp;lt;&amp;lt; chars[ENDIAN2] &amp;lt;&amp;lt; chars[ENDIAN3];&lt;br /&gt;&lt;br /&gt;    *(short*)chars = 1;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0_S] &amp;lt;&amp;lt; chars[ENDIAN1_S];&lt;br /&gt;&lt;br /&gt;    *(short*)chars = CHANNELS;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0_S] &amp;lt;&amp;lt; chars[ENDIAN1_S];&lt;br /&gt;&lt;br /&gt;    *(int*)chars = SAMPLERATE;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0] &amp;lt;&amp;lt; chars[ENDIAN1] &amp;lt;&amp;lt; chars[ENDIAN2] &amp;lt;&amp;lt; chars[ENDIAN3];&lt;br /&gt;&lt;br /&gt;    *(int*)chars = (int)(SAMPLERATE*(BITSPERSAMPLE/8*CHANNELS));&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0] &amp;lt;&amp;lt; chars[ENDIAN1] &amp;lt;&amp;lt; chars[ENDIAN2] &amp;lt;&amp;lt; chars[ENDIAN3];&lt;br /&gt;&lt;br /&gt;    *(short*)chars = (short)(BITSPERSAMPLE/8*CHANNELS);&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0_S] &amp;lt;&amp;lt; chars[ENDIAN1_S];&lt;br /&gt;&lt;br /&gt;    *(short*)chars = (short)BITSPERSAMPLE;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0_S] &amp;lt;&amp;lt; chars[ENDIAN1_S];&lt;br /&gt;&lt;br /&gt;    output &amp;lt;&amp;lt; &amp;quot;data&amp;quot;;&lt;br /&gt;    *(int*)chars = 0;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0] &amp;lt;&amp;lt; chars[ENDIAN1] &amp;lt;&amp;lt; chars[ENDIAN2] &amp;lt;&amp;lt; chars[ENDIAN3];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void FinaliseWaveFile(std::ostream&amp;amp; output, size_t bytesWrit)&lt;br /&gt;{&lt;br /&gt;    char chars[4];&lt;br /&gt;&lt;br /&gt;    output.seekp(40);&lt;br /&gt;&lt;br /&gt;    *(int*)chars = (int)bytesWrit;&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0] &amp;lt;&amp;lt; chars[ENDIAN1] &amp;lt;&amp;lt; chars[ENDIAN2] &amp;lt;&amp;lt; chars[ENDIAN3];&lt;br /&gt;&lt;br /&gt;    output.seekp(4);&lt;br /&gt;&lt;br /&gt;    *(int*)chars = (int)(bytesWrit + 36);&lt;br /&gt;    output &amp;lt;&amp;lt; chars[ENDIAN0] &amp;lt;&amp;lt; chars[ENDIAN1] &amp;lt;&amp;lt; chars[ENDIAN2] &amp;lt;&amp;lt; chars[ENDIAN3];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// OK IT'S SAFE TO LOOK AGAIN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// here we represent:&lt;br /&gt;//&lt;br /&gt;//   0 bit as 1 cycle of low frequency,&lt;br /&gt;//   1 bit as 2 cycles of high frequency&lt;br /&gt;//&lt;br /&gt;// where the high frequency is double that of the low.&lt;br /&gt;//&lt;br /&gt;void OutputBit(std::ostream&amp;amp; output, int bit, size_t&amp;amp; written,&lt;br /&gt;    short maxval = maxLevelS, short minval = minLevelS)&lt;br /&gt;{&lt;br /&gt;    // default to low&lt;br /&gt;    //&lt;br /&gt;    int cycles = f1cyc;&lt;br /&gt;    int samplesPerCycle = f1;&lt;br /&gt;&lt;br /&gt;    if (bit != 0)&lt;br /&gt;    {&lt;br /&gt;        cycles = f2cyc;&lt;br /&gt;        samplesPerCycle = f2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // generate square pulse, start with rising edge&lt;br /&gt;    //&lt;br /&gt;    for (int i = 0; i &amp;lt; cycles; ++i)&lt;br /&gt;    {&lt;br /&gt;        for (int j = 0; j &amp;lt; samplesPerCycle / 2; ++j)&lt;br /&gt;        {&lt;br /&gt;            // high [1] period&lt;br /&gt;            //&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(maxval &amp;amp; 0xff);&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(maxval &amp;gt;&amp;gt; 8);&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(maxval &amp;amp; 0xff);&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(maxval &amp;gt;&amp;gt; 8);&lt;br /&gt;            written += 4;&lt;br /&gt;        }&lt;br /&gt;        for (int j = 0; j &amp;lt; samplesPerCycle / 2; ++j)&lt;br /&gt;        {&lt;br /&gt;            // low [0] period&lt;br /&gt;            //&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(minval &amp;amp; 0xff);&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(minval &amp;gt;&amp;gt; 8);&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(minval &amp;amp; 0xff);&lt;br /&gt;            output &amp;lt;&amp;lt; uint8_t(minval &amp;gt;&amp;gt; 8);&lt;br /&gt;            written += 4;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// outputs a start bit, 8 data bits and a stop bit&lt;br /&gt;//&lt;br /&gt;void OutputByte(std::ostream&amp;amp; output, uint8_t value, size_t&amp;amp; written)&lt;br /&gt;{&lt;br /&gt;    OutputBit(output, START_BIT, written);&lt;br /&gt;&lt;br /&gt;    for (int i = 0; i &amp;lt; 8; ++i)&lt;br /&gt;    {&lt;br /&gt;        OutputBit(output, (value &amp;amp; 0x80) ? HIGH_BIT : LOW_BIT, written);&lt;br /&gt;        value &amp;lt;&amp;lt;= 1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    OutputBit(output, STOP_BIT, written);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// outputs a lead train of bits, terminated with a start bit.&lt;br /&gt;//&lt;br /&gt;void OutputLeader(std::ostream&amp;amp; output, int milliseconds, size_t&amp;amp; written)&lt;br /&gt;{&lt;br /&gt;    int microseconds = (milliseconds * 1000) - usPerCycle;;&lt;br /&gt;&lt;br /&gt;    // this is a bit of a decoration - &lt;br /&gt;    // ramp up the volume during the 1st half of the leader. this might&lt;br /&gt;    // prevent some unexpected eardrum-rupture events.. and yes, i know&lt;br /&gt;    // that volume should be ramped non-linearly :) this will do for&lt;br /&gt;    // the time being.&lt;br /&gt;    //&lt;br /&gt;    double vol = 0, ramp = 1.0 / (microseconds/(usPerCycle*2));&lt;br /&gt;&lt;br /&gt;    while (microseconds &amp;gt;= 0)&lt;br /&gt;    {&lt;br /&gt;        OutputBit(output, LEADIN_BIT, written, (short)(vol * maxLevel), (short)(vol * minLevel));&lt;br /&gt;        vol += ramp;&lt;br /&gt;        vol = __min(vol, 1.0);&lt;br /&gt;        &lt;br /&gt;        microseconds -= usPerCycle;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    OutputBit(output, START_BIT, written);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void main (int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;    if (argc &amp;lt; 3)&lt;br /&gt;    {&lt;br /&gt;        std::cout &amp;lt;&amp;lt; &amp;quot;Usage: makewav [input file] [output file]&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    std::ifstream inner(argv[1], std::ios_base::binary);&lt;br /&gt;    if (!inner.is_open())&lt;br /&gt;    {&lt;br /&gt;        std::cout &amp;lt;&amp;lt; &amp;quot;Could not open input file.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    std::ofstream outer(argv[2], std::ios_base::binary);&lt;br /&gt;    if (!outer.is_open())&lt;br /&gt;    {&lt;br /&gt;        std::cout &amp;lt;&amp;lt; &amp;quot;Could not open output file.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // write wav header&lt;br /&gt;    //&lt;br /&gt;    CreateWaveFile(outer);&lt;br /&gt;&lt;br /&gt;    // determine input file size&lt;br /&gt;    //&lt;br /&gt;    inner.seekg(0, std::ios_base::end);&lt;br /&gt;    size_t size = (size_t)inner.tellg();&lt;br /&gt;    inner.seekg(0);&lt;br /&gt;&lt;br /&gt;    size_t pc = 0;&lt;br /&gt;    size_t written = 0;&lt;br /&gt;&lt;br /&gt;    // file is structured:&lt;br /&gt;    //   some seconds of leader&lt;br /&gt;    //   size msb&lt;br /&gt;    //   size lsb&lt;br /&gt;    //   {&lt;br /&gt;    //    data[512]&lt;br /&gt;    //    some milliseconds of leader&lt;br /&gt;    //   }&lt;br /&gt;&lt;br /&gt;    OutputLeader(outer, 2000, written);&lt;br /&gt;&lt;br /&gt;    OutputByte(outer, uint8_t(size &amp;gt;&amp;gt; 8), written);&lt;br /&gt;    OutputByte(outer, uint8_t(size &amp;amp; 0xff), written);&lt;br /&gt;&lt;br /&gt;    while (pc != size)&lt;br /&gt;    {&lt;br /&gt;        // dummy data - replace this with either read from buffer indexed by [pc]&lt;br /&gt;        // or a byte get from the file to be encoded&lt;br /&gt;        // &lt;br /&gt;        OutputByte(outer, inner.get(), written);&lt;br /&gt;&lt;br /&gt;        ++pc;&lt;br /&gt;        if (pc % 512 == 0 &amp;amp;&amp;amp; pc != size)&lt;br /&gt;        {&lt;br /&gt;            OutputLeader(outer, 50, written);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    FinaliseWaveFile(outer, written);&lt;br /&gt;&lt;br /&gt;    outer.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-5514561373120414553?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/5514561373120414553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=5514561373120414553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5514561373120414553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/5514561373120414553'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/04/more-aceness.html' title='More ACEness'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/R_igFLOjOeI/AAAAAAAAABo/BLtBQnblcXg/s72-c/defenders.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-8158709078567367457</id><published>2008-04-03T12:13:00.000-07:00</published><updated>2008-12-09T05:21:27.820-08:00</updated><title type='text'>No, really!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/R_UtP7OjOdI/AAAAAAAAABg/cNW7l2uanl0/s1600-h/st.bmp"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/R_UtP7OjOdI/AAAAAAAAABg/cNW7l2uanl0/s200/st.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5185100297607002578" /&gt;&lt;/a&gt;&lt;br /&gt;Mrs. Edna Welthorpe of Hatheringon under Nicely wrote in to let me know that she'd seen through 'my little April fool joke'.&lt;br /&gt;&lt;br /&gt;Well, Mrs. Wellthorpe, the joke is indeed on you. The ACE posting is 100% genuine :)&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-8158709078567367457?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/8158709078567367457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=8158709078567367457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8158709078567367457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/8158709078567367457'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/04/no-really.html' title='No, really!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/R_UtP7OjOdI/AAAAAAAAABg/cNW7l2uanl0/s72-c/st.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6567215503545455591</id><published>2008-04-01T12:11:00.000-07:00</published><updated>2008-12-09T05:21:27.978-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pcm'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='cassette'/><category scheme='http://www.blogger.com/atom/ns#' term='cassette interface'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><title type='text'>Awesome mix #6</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/R_KQmrOjOcI/AAAAAAAAABY/K74WKHEPP7M/s1600-h/cassie.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/R_KQmrOjOcI/AAAAAAAAABY/K74WKHEPP7M/s200/cassie.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5184365115170044354" /&gt;&lt;/a&gt;I've been laid up with a succession of minor bugs of the viral kind and subsequently there's been no movement on the hardware front. I think it's time to post something though and with that in mind please be upstanding for the one - the only - ACE!&lt;br /&gt;&lt;br /&gt;That's the Arduino Cassette Engine to me and you.&lt;br /&gt;&lt;br /&gt;Hankering after some old-skool interfacing? Got the urge for PCM? &lt;a target="_null" href="http://groups.google.com/group/micro-hacker/web/cassie.zip"&gt;Here's some Arduino code&lt;/a&gt; to read a data stream encoded in a frequency shift keyed manner. As usual I'm presenting this in its completely raw form. There are plenty of comments in the code and enough information to allow any intermediate level programmer to get started. If you think it's useful but don't have a clue where to begin adapting it then, as always, I'll be happy to help. The code is my testbed which reads blocks of data and writes them to an MMC card. The MMC code is a minimal set adapted from the SD2IEC source. (Thanks guys!)&lt;br /&gt;&lt;br /&gt;I haven't had a chance to make the schematic or perfboard layout for the interface but it'll soon come.&lt;br /&gt;&lt;br /&gt;Also included in the archive is the c# app that creates demo data to be read. It was adapted from another application I wrote to get data from binary images into my zx81 which explains the cockamamy structure. And the icon! If you have problems downloading let me know.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Beware of the output from SquareWave - it's as loud as it can possibly be. Make sure that volumes are turned right down before running it. You have been warned!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enough blabber - here's the skinny ripped right from the code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt; /*&lt;br /&gt; /  'Arduino Cassette Engine'.&lt;br /&gt; /&lt;br /&gt; /  Developed by Charlie Robson in 2008.&lt;br /&gt; /&lt;br /&gt; /  This is half of a solution for getting data into an arduino. The other&lt;br /&gt; /  half being code to generate frequency shift keyed (FSK) data in the form&lt;br /&gt; /  of WAV files which should be widely playable. These can be recorded or&lt;br /&gt; /  otherwise electronically distributed. Why do it this way? 1. Because it's&lt;br /&gt; /  funny. 2. Having given an updatable arduino-powered 'toy' to someone, I&lt;br /&gt; /  can't expect them to re-program the device by traditional means in order&lt;br /&gt; /  to update it. Everyone has a means of playing a sound!&lt;br /&gt; /&lt;br /&gt; /  On with the show.&lt;br /&gt; /&lt;br /&gt; /  The data is encoded like so:&lt;br /&gt; /&lt;br /&gt; /    Lead-in&lt;br /&gt; /    High byte of data length&lt;br /&gt; /    Low byte of data length&lt;br /&gt; /    {&lt;br /&gt; /     Data[0 &amp;lt; size &amp;lt;= 512]&lt;br /&gt; /     (Lead-in)&lt;br /&gt; /    }&lt;br /&gt; /&lt;br /&gt; /  Lead-in is a train of bits terminated with a start bit. This means the lead-in&lt;br /&gt; /  bit needs to be the logical complement of the start bit.&lt;br /&gt; /&lt;br /&gt; /  Every byte is represented by 10 bits - a start bit, 8 data bits, and a stop&lt;br /&gt; /  bit. The start and stop bits are complementary.&lt;br /&gt; /&lt;br /&gt; /  Data arrives in 512 byte blocks. Each block except the last is followed by a&lt;br /&gt; /  short period, about 25 milliseconds, of lead-in. This is to allow processing time&lt;br /&gt; /  on each block as it arrives.&lt;br /&gt; /&lt;br /&gt; /  Decoding a data bit is done something like so:&lt;br /&gt; /&lt;br /&gt; /    Await a rising edge then take 2 samples at a period which will allow us&lt;br /&gt; /    to distinguish a 0 or 1 bit. Sampling 2 identical values yields a 0 bit.&lt;br /&gt; /    Delay so the next bit read will occur when the signal is in a low period.&lt;br /&gt; /&lt;br /&gt; /  Following is a picture of a '0' bit, or low frequency cycle, followed by&lt;br /&gt; /  a '1' bit or high frequency cycle, with some important times noted.&lt;br /&gt; /&lt;br /&gt; /    The X shows a rough expected time at which we start the bit reading.&lt;br /&gt; /    The 0 shows relative time zero, when we detect the rising edge.&lt;br /&gt; /    The + signs show the times at which we sample.&lt;br /&gt; /    The * shows the earliest time at which we can await a new bit. IOW, X.&lt;br /&gt; /&lt;br /&gt; /        __`_____`__             __&lt;br /&gt; /       &amp;#124;  `     `  &amp;#124;           &amp;#124;&lt;br /&gt; /       &amp;#124;  `     `  &amp;#124;           &amp;#124;&lt;br /&gt; /       &amp;#124;  `     `  &amp;#124;     `     &amp;#124;&lt;br /&gt; /     ` &amp;#124;  `     `  &amp;#124;     `     &amp;#124;&lt;br /&gt; /   __`_&amp;#124;  `     `  &amp;#124; ____`_____&amp;#124;&lt;br /&gt; /     ` `  `     `        ` &lt;br /&gt; /     X 0  +     +        *&lt;br /&gt; /     ` `__`__   `   _____`&lt;br /&gt; /     ` &amp;#124;  `  &amp;#124;  `  &amp;#124;     &amp;#124;&lt;br /&gt; /     ` &amp;#124;  `  &amp;#124;  `  &amp;#124;     &amp;#124;&lt;br /&gt; /       &amp;#124;     &amp;#124;     &amp;#124;     &amp;#124;&lt;br /&gt; /       &amp;#124;     &amp;#124;     &amp;#124;     &amp;#124;     &amp;#124;&lt;br /&gt; /   ____&amp;#124;     &amp;#124;_____&amp;#124;     &amp;#124;_____&amp;#124;&lt;br /&gt; /       `&lt;br /&gt; /       `&lt;br /&gt; /       &amp;#124;-----------------------&amp;#124; = usPerCycle        = 1360uS&lt;br /&gt; /       &amp;#124;-----------&amp;#124;             = usPerHalfCycle    = 680uS&lt;br /&gt; /       &amp;#124;-----&amp;#124;                   = usPerQuarterCycle = 340uS&lt;br /&gt; /       &amp;#124;--&amp;#124;                      = usPerEighthCycle  = 170uS&lt;br /&gt; /&lt;br /&gt; /&lt;br /&gt; /  It's assumed that the audio signal is connected to PORTB-0 which is&lt;br /&gt; /  digital pin 8. If you'd like to change that, then replace occurrences&lt;br /&gt; /  of...&lt;br /&gt; /&lt;br /&gt; /      PINB &amp;amp; 1&lt;br /&gt; /&lt;br /&gt; /  ... with the direct bit-access for your implementation. I do it this&lt;br /&gt; /  way because it's slightly faster than digitalRead()ing. If you do change&lt;br /&gt; /  the port you'll also need to change the logic in readBit as this relies&lt;br /&gt; /  on the fact that we work with bit 0. &lt;br /&gt; /&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-6567215503545455591?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6567215503545455591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6567215503545455591' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6567215503545455591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6567215503545455591'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/04/awesome-mix-6.html' title='Awesome mix #6'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/R_KQmrOjOcI/AAAAAAAAABY/K74WKHEPP7M/s72-c/cassie.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-7509578818088171793</id><published>2008-03-26T06:41:00.000-07:00</published><updated>2008-04-03T14:09:15.286-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spi'/><category scheme='http://www.blogger.com/atom/ns#' term='software master'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><title type='text'>Itnrtaenrslfeearvse!d</title><content type='html'>Some back-of-the-envelope calculations later I'm looking at about an 8-10khz playback rate. At 10khz I'll be needing to feed the DAC a new sample about every 100uS. Each byte transfer over the SPI bus takes up to 40uS. By breaking up the transfer process into interleavable chunks we should be able to achieve the required rate - but waaiiiit a minute. The DAC requires a 16bit transfer. So I guess I'm looking at 8khz. I know I could get better by using serial EEPROM, FRAM, SRAM, BLUEJAM or whatever. But that isn't the point! I always like to just have a go and make what I've got work.&lt;br /&gt;&lt;br /&gt;If you're familiar with transferring data from MMC you'll know that there are command blocks involved in the process. These are 48bit monsters. It might be that with the latency involved in sending the commands and the MMCs reply delay we are looking at even less than the 8khz as a replay rate. We'd need to be pushing a sample out as fast as we can read them which means the time taken for sending command blocks would cause glitches.&lt;br /&gt;&lt;br /&gt;I'll have to do some more sums and see how long we can sustain continuous playback with some buffering. With the Arduino's 2k of SRAM we could possibly hold 1024 pre-loaded samples whilst reading a new sector from the card... My head is saying about 3.5 seconds - roughly 50 sectors of 512 bytes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-7509578818088171793?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/7509578818088171793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=7509578818088171793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7509578818088171793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/7509578818088171793'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/itnrtaenrslfeearvsed.html' title='Itnrtaenrslfeearvse!d'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6879460818600498122</id><published>2008-03-25T07:06:00.000-07:00</published><updated>2008-12-09T05:21:28.296-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dac'/><category scheme='http://www.blogger.com/atom/ns#' term='spi'/><category scheme='http://www.blogger.com/atom/ns#' term='spi software master'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><category scheme='http://www.blogger.com/atom/ns#' term='joey beltram'/><title type='text'>SPI vs SPI</title><content type='html'>I've taken the software spi master code as published by Atmel and converted it into c++ to allow it to be modified. I spent a frustrating couple of days, a few moments at a time, trying to work out why MMC card access was broken when using the software master. It turned out to be that I was sampling the input on the falling edge of the clock. This was most likely due to some subtle detail lost when reading the original AVR ASM code, or dense stupidity :) I found it using, my now favourite tool in the box, the parallel port logic analyzer.&lt;br /&gt;&lt;br /&gt;I've upgraded the software so that the grabber runs under 2K, XP and (probably) up. This is way more convenient than having to have a machine booted into DOS as I'm sure you can imagine. I've also worked on the viewer app so that you can zoom in to waveforms and see information like sample position and time - both absolute and relative to a marker.&lt;br /&gt;&lt;br /&gt;Features, creepy in their nature, keep suggesting themselves and I'm having a hard time keeping off the code, which is presented in source and precompiled form, &lt;a target="_null" href="http://micro-hacker.googlegroups.com/web/GraphaTape.rar?gda=sqr2rT8AAAA2M8P5_RlH2p6JqsCN0yborICQwmK18iJ4l1R4_xoCgGG1qiJ7UbTIup-M2XPURDRLnQksMUDtk8bi3i98U1NW"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Usual caveats apply, use at own risk, no responsibility taken for damage to potted plants ahem ahem.&lt;br /&gt;&lt;br /&gt;Here's a couple of shots showing both the soft and hardware waveforms as snaffled up by the analyser. The ordering of channels is different as the pin assignments are different in the two modes. The cursor in both cases is poised at the moment that we expect our first byte of data back from the card. As you can see if sampling is done on the falling clock edge then a mis-read will occur. The incoming bits will be read as 0xfe,0x03 instead of 0xff,0x01. Bugger!&lt;br /&gt;&lt;br /&gt;Soft:&lt;br /&gt;&lt;a target="_null" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_E6_haRsOYg8/R-kMqvshO7I/AAAAAAAAABE/jDiZe6O-HHg/s1600-h/grapha_soft.bmp"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_E6_haRsOYg8/R-kMqvshO7I/AAAAAAAAABE/jDiZe6O-HHg/s320/grapha_soft.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5181686774763699122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;'Ard:&lt;br /&gt;&lt;a target="_null" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/R-kNB_shO8I/AAAAAAAAABM/wXOP80dHJY0/s1600-h/grapha_hard.bmp"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/R-kNB_shO8I/AAAAAAAAABM/wXOP80dHJY0/s320/grapha_hard.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5181687174195657666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As always, these posts are just a little flavour of the cake that is the tortured analogy for my development hobby. If you want the full recipe, then an email or comment will do the job.&lt;br /&gt;&lt;br /&gt;And while you're considering that, there's &lt;a target="_null" href="http://micro-hacker.googlegroups.com/web/k.a.o.s.-i_can%27t_stop_%28hard_core_mix%29.mp3?gda=P1irxmAAAAA2M8P5_RlH2p6JqsCN0yboczQ4C94g_f7LwTfxM9QfYmG1qiJ7UbTIup-M2XPURDRPLvMtxe5qCGJVOJSwny74npV6XzXbdEihpPlUJY-V9P6_svZ8PCyj7LhwBF6uLC0"&gt;this&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-6879460818600498122?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6879460818600498122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6879460818600498122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6879460818600498122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6879460818600498122'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/spi-vs-spi.html' title='SPI vs SPI'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6_haRsOYg8/R-kMqvshO7I/AAAAAAAAABE/jDiZe6O-HHg/s72-c/grapha_soft.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-6816864182716991610</id><published>2008-03-17T06:22:00.000-07:00</published><updated>2008-03-17T06:51:27.218-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='if'/><title type='text'>Sampling</title><content type='html'>I've had a weekend away from thinking about maladjusted fuses, and now I'm feeling much, much, better. I had occasion to add some flashing pulsing coloured lighting to the cardboard rocket that I built with my boys on Saturday morning so naturally the Arduino came out. It's amazing how something as inconsequential as some modicum of lighting can transform the lifeless cardboard tube into a dynamic play area.&lt;br /&gt;&lt;br /&gt;While I was at it I thought that it would be easy to add some silver-foil capacitive switches which would trigger sound effects. With my collection of freebie chips in front of me now I can see that I have a brace of &lt;a href="http://ww1.microchip.com/downloads/en/DeviceDoc/21897a.pdf" target="_NULL"&gt;MCP4922 DAC&lt;/a&gt;s that I ordered from MicroChip a while ago that remained unused. These are SPI compatible 12bit DACs which should be trivial to connect up and drive.&lt;br /&gt;&lt;br /&gt;I'm imagining a circuit with both a DAC and some form of persistent storage on an SPI bus. I'll probably go for SD/MMC as I'm familiar with driving these and I have some solid code to work with. Most likely I'll be using a software SPI master as the DACs are unbuffered. This way I can read from the MMC and write to the DACs in an interleaved fashion which will give me greater flexibility in coding and control over playback rate.&lt;br /&gt;&lt;br /&gt;MicroChip have a relaxed attitude to people requesting samples that I wish other companies would follow. They must go by the assumption that the more people experience using their parts the better. Word of mouth is a powerful advertising medium after all. If you've never thought of doing this I recommend giving it a &lt;a href="http://sample.microchip.com/Default.aspx?testCookies=true" target="_NULL"&gt;try&lt;/a&gt;. What's to lose? :)&lt;br /&gt;&lt;br /&gt;Another company that's sample-friendly is &lt;a href="http://www.maxim-ic.com/" target="_NULL"&gt;Dallas/Maxim&lt;/a&gt; - makers of the ever-so useful &lt;a href="http://hackedgadgets.com/2007/02/19/how-to-make-a-dual-supply-rs-232-to-ttl-level-converter/" target="_NULL"&gt;Max232/3&lt;/a&gt; serial level converters amongst other devices.&lt;br /&gt;&lt;br /&gt;The trick with sampling is to have the time to sit and browse the entire product range. After all you might be inspired when you see that &lt;a href="http://para.maxim-ic.com/cache/en/search/4362.html" target="_NULL"&gt;digital potentiometer&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-6816864182716991610?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/6816864182716991610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=6816864182716991610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6816864182716991610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/6816864182716991610'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/sampling.html' title='Sampling'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-3000312223391447431</id><published>2008-03-14T07:06:00.000-07:00</published><updated>2008-12-09T05:21:28.438-08:00</updated><title type='text'>More poking...no more joy.</title><content type='html'>Hmm. The waveforms look about right.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_E6_haRsOYg8/R9qGooSi3YI/AAAAAAAAAA8/EC3-lLuZACc/s1600-h/waveform.bmp"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_E6_haRsOYg8/R9qGooSi3YI/AAAAAAAAAA8/EC3-lLuZACc/s200/waveform.bmp" alt="" id="BLOGGER_PHOTO_ID_5177598754183896450" border="0" /&gt;&lt;/a&gt;There wasn't any software that would drive the parallel port breakout cable that I built. (Yes, I know it's ironic given my previous statement about how I wasn't prepared to solder up another DB25!!)&lt;br /&gt;&lt;br /&gt;So I ended up crashing together an app in OpenWatcom for DOS to do the grabbing, and a C# program to display the data. Talk about a technology clash! I think at this point unless anyone can point out the problem with the attached code I'm going to concede defeat! For now ;)&lt;br /&gt;&lt;br /&gt;ChaN's programmer is looking a lot more like the next project. I have a couple of old TTL-stuffed boards that I've been meaning to get the &lt;a target="_none" href="http://www.uchobby.com/index.php/2006/09/01/scrounging-a-3com-super-stack-ii/"&gt;hot-air gun aimed towards&lt;/a&gt;. The need for a '299 for the programmer means I might just do that this weekend.&lt;br /&gt;&lt;br /&gt;All this to recover a £3.25 microcontroller? No! Just for the sheer amusement!!&lt;br /&gt;&lt;br /&gt;Here's the final draft of the code. I've been over it so many times now I've gone codeblind so if you see any howlers please keep your derision to good-humoured banter  :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;// XA1 XA0   Action when XTAL1 is Pulsed&lt;br /&gt;// --- ---   ---------------------------&lt;br /&gt;//  0   0    Load Flash or EEPROM Address (High or low address byte determined by BS1)&lt;br /&gt;//  0   1    Load Data (High or Low data byte for Flash determined by BS1)&lt;br /&gt;//  1   0    Load Command&lt;br /&gt;//  1   1    No Action, Idle&lt;br /&gt;//&lt;br /&gt;const byte XA_LOAD_ADDR = B00;&lt;br /&gt;const byte XA_LOAD_DATA = B01;&lt;br /&gt;const byte XA_LOAD_CMND = B10;&lt;br /&gt;const byte XA_NOP       = B11;&lt;br /&gt;&lt;br /&gt;const byte CMD_ERASE      = B10000000;&lt;br /&gt;const byte CMD_WRITE_FUSE = B01000000;&lt;br /&gt;const byte CMD_READ_SIG   = B00001000;&lt;br /&gt;const byte CMD_READ_FUSE  = B00000100;&lt;br /&gt;&lt;br /&gt;#define DLY delayMicroseconds(100)&lt;br /&gt;&lt;br /&gt;inline void SETB(byte x)&lt;br /&gt;{&lt;br /&gt;  PORTB &amp;#124;= _BV(x);&lt;br /&gt;  DLY;&lt;br /&gt;}&lt;br /&gt;inline void SETD(byte x)&lt;br /&gt;{&lt;br /&gt;  PORTD &amp;#124;= _BV(x);&lt;br /&gt;  DLY;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void CLRB(byte x)&lt;br /&gt;{&lt;br /&gt;  PORTB &amp;amp;= ~_BV(x);&lt;br /&gt;  DLY;&lt;br /&gt;}&lt;br /&gt;inline void CLRD(byte x)&lt;br /&gt;{&lt;br /&gt;  PORTD &amp;amp;= ~_BV(x);&lt;br /&gt;  DLY;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// PORTB&lt;br /&gt;&lt;br /&gt;#define PIN_BS1 0&lt;br /&gt;#define PIN_XA0 1&lt;br /&gt;#define PIN_XA1 2&lt;br /&gt;#define PIN_BS2 3&lt;br /&gt;#define PIN_PAGEL 4&lt;br /&gt;#define PIN_POWERTOCHIP 5&lt;br /&gt;&lt;br /&gt;#define SET_BS1 SETB(PIN_BS1)&lt;br /&gt;#define CLR_BS1 CLRB(PIN_BS1)&lt;br /&gt;&lt;br /&gt;void SET_XA(byte xtal_action)&lt;br /&gt;{&lt;br /&gt;  PORTB &amp;amp;= ~(_BV(PIN_XA1)&amp;#124;_BV(PIN_XA0));&lt;br /&gt;  PORTB &amp;#124;= xtal_action &amp;lt;&amp;lt; PIN_XA0;&lt;br /&gt;  DLY;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CLR_XA()&lt;br /&gt;{&lt;br /&gt;  PORTB &amp;amp;= ~(_BV(PIN_XA1)&amp;#124;_BV(PIN_XA0));&lt;br /&gt;  DLY;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SET_BS2 SETB(PIN_BS2)&lt;br /&gt;#define CLR_BS2 CLRB(PIN_BS2)&lt;br /&gt;&lt;br /&gt;#define SET_PAGEL SETB(PIN_PAGEL)&lt;br /&gt;#define CLR_PAGEL CLRB(PIN_PAGEL)&lt;br /&gt;&lt;br /&gt;#define SET_POWERTOCHIP SETB(PIN_POWERTOCHIP)&lt;br /&gt;#define CLR_POWERTOCHIP CLRB(PIN_POWERTOCHIP)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// PORTD&lt;br /&gt;&lt;br /&gt;#define PIN_XTAL1 2&lt;br /&gt;#define PIN_RDYNOTBSY 3&lt;br /&gt;#define PIN_OE 4&lt;br /&gt;#define PIN_WR 5&lt;br /&gt;&lt;br /&gt;//  &amp;lt;- PORTD3 rdy/bsy&lt;br /&gt;//&lt;br /&gt;void AWAIT_READY()&lt;br /&gt;{&lt;br /&gt;  while ((PIND &amp;amp; _BV(PIN_RDYNOTBSY)) == 1);&lt;br /&gt;  long time = millis();&lt;br /&gt;  while ((PIND &amp;amp; _BV(PIN_RDYNOTBSY)) == 0);&lt;br /&gt;  Serial.println(millis()-time,DEC);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SET_OE SETD(PIN_OE)&lt;br /&gt;#define CLR_OE CLRD(PIN_OE)&lt;br /&gt;&lt;br /&gt;#define SET_WR SETD(PIN_WR)&lt;br /&gt;#define CLR_WR CLRD(PIN_WR)&lt;br /&gt;&lt;br /&gt;void PULSE_WR(bool wait = true);&lt;br /&gt;void PULSE_WR(bool wait)&lt;br /&gt;{&lt;br /&gt;  PORTD &amp;amp;= ~_BV(PIN_WR);&lt;br /&gt;  delayMicroseconds(100);&lt;br /&gt;  PORTD &amp;#124;= _BV(PIN_WR);&lt;br /&gt;  if (wait)&lt;br /&gt;  {&lt;br /&gt;    AWAIT_READY();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SET_XTAL1 SETD(PIN_XTAL1)&lt;br /&gt;#define CLR_XTAL1 CLRD(PIN_XTAL1)&lt;br /&gt;&lt;br /&gt;void PULSE_XTAL(bool wait = true);&lt;br /&gt;void PULSE_XTAL(bool wait)&lt;br /&gt;{&lt;br /&gt;  PORTD &amp;#124;= _BV(PIN_XTAL1);&lt;br /&gt;  delayMicroseconds(100);&lt;br /&gt;  PORTD &amp;amp;= ~_BV(PIN_XTAL1);&lt;br /&gt;  if (wait)&lt;br /&gt;  {&lt;br /&gt;    AWAIT_READY();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// &amp;lt;-&amp;gt; PORTD6...7 will be used as DATA6...7&lt;br /&gt;// &amp;lt;-&amp;gt; PORTC0...5 will be used as DATA0...5&lt;br /&gt;//&lt;br /&gt;void SET_DATA_IN(void)&lt;br /&gt;{&lt;br /&gt;  DDRC &amp;amp;= B11000000;&lt;br /&gt;  DDRD &amp;amp;= B00111111;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;byte GET_DATA()&lt;br /&gt;{&lt;br /&gt;  return (PORTC &amp;amp; B00111111) &amp;#124; (PORTD &amp;amp; B11000000);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void SET_DATA(byte data)&lt;br /&gt;{&lt;br /&gt;  DDRC &amp;#124;= B00111111;&lt;br /&gt;  PORTC = (PORTC &amp;amp; B11000000) &amp;#124; (data &amp;amp; B00111111);&lt;br /&gt;&lt;br /&gt;  DDRD &amp;#124;= B11000000;&lt;br /&gt;  PORTD = (PORTD &amp;amp; B00111111) &amp;#124; (data &amp;amp; B11000000);&lt;br /&gt;&lt;br /&gt;  DLY;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;//&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void LOAD_COMMAND(byte command)&lt;br /&gt;{&lt;br /&gt;  SET_XA(XA_LOAD_CMND);&lt;br /&gt;  SET_DATA(command);&lt;br /&gt;  PULSE_XTAL(); &lt;br /&gt;  CLR_XA();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void LOAD_ADDRESS(byte address)&lt;br /&gt;{&lt;br /&gt;  SET_XA(XA_LOAD_ADDR);&lt;br /&gt;  SET_DATA(address);&lt;br /&gt;  PULSE_XTAL(); &lt;br /&gt;  CLR_XA();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void LOAD_DATA(byte data, bool low)&lt;br /&gt;{&lt;br /&gt;  SET_XA(XA_LOAD_DATA);&lt;br /&gt;  if (!low)&lt;br /&gt;  {&lt;br /&gt;    SET_BS1;&lt;br /&gt;  }&lt;br /&gt;  SET_DATA(data);&lt;br /&gt;  PULSE_XTAL(); &lt;br /&gt;  CLR_XA();&lt;br /&gt;  CLR_BS1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;byte GET_SIG(byte offset)&lt;br /&gt;{&lt;br /&gt;  LOAD_COMMAND(CMD_READ_SIG);&lt;br /&gt;  LOAD_ADDRESS(offset);&lt;br /&gt;  SET_DATA_IN();&lt;br /&gt;  CLR_OE;&lt;br /&gt;  byte x = GET_DATA();&lt;br /&gt;  SET_OE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void PROG_ENABLE(void)&lt;br /&gt;{&lt;br /&gt;  SET_POWERTOCHIP;&lt;br /&gt;  delayMicroseconds(100);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void PROG_DISABLE(void)&lt;br /&gt;{&lt;br /&gt;  CLR_POWERTOCHIP;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void PROG_ENABLE_PROPER(void)&lt;br /&gt;{&lt;br /&gt;  SET_XTAL1;&lt;br /&gt;  CLR_XTAL1;&lt;br /&gt;  SET_XTAL1;&lt;br /&gt;  CLR_XTAL1;&lt;br /&gt;  SET_XTAL1;&lt;br /&gt;  CLR_XTAL1;&lt;br /&gt;&lt;br /&gt;  SET_POWERTOCHIP;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;//&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;void setup(void)&lt;br /&gt;{&lt;br /&gt;  Serial.begin(115200);&lt;br /&gt;&lt;br /&gt;  // PORTB 5...0 all outputs. Zero the ports before setting them as outputs&lt;br /&gt;  // to prevent spikes.&lt;br /&gt;  //&lt;br /&gt;  PORTB = 0;&lt;br /&gt;  DDRB &amp;#124;= B00111111;&lt;br /&gt;&lt;br /&gt;  // Not interested in DATA pins, they'll get set later as required&lt;br /&gt;  //&lt;br /&gt;  // PORTD0/1 are rx/tx: leave alone&lt;br /&gt;  // PORTD3 is input&lt;br /&gt;  // D6/7 are set on demand&lt;br /&gt;  // the rest are output&lt;br /&gt;  //&lt;br /&gt;  PORTD = 0;&lt;br /&gt;  DDRD = (DDRD &amp;amp; B11110111) &amp;#124; B00110100;&lt;br /&gt;&lt;br /&gt;  // bring the active low pins to their inactive state.&lt;br /&gt;  //&lt;br /&gt;  SET_OE;&lt;br /&gt;  SET_WR;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void loop(void)&lt;br /&gt;{&lt;br /&gt;  Serial.println(&amp;quot;Fuser 1.0 Ready.&amp;quot;);&lt;br /&gt;  while(!Serial.available());&lt;br /&gt;  if (Serial.read() == 'p')&lt;br /&gt;  {&lt;br /&gt;    Serial.println(&amp;quot;Sig: &amp;quot;);&lt;br /&gt;&lt;br /&gt;    PROG_ENABLE_PROPER();&lt;br /&gt;    Serial.println(GET_SIG(0),HEX);&lt;br /&gt;    Serial.println(GET_SIG(1),HEX);&lt;br /&gt;    Serial.println(GET_SIG(2),HEX);&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;    Serial.println(&amp;quot;Burn: &amp;quot;);&lt;br /&gt;&lt;br /&gt;    PROG_ENABLE();&lt;br /&gt;&lt;br /&gt;    delay(2);&lt;br /&gt;&lt;br /&gt;    Serial.println(&amp;quot;Erase: &amp;quot;);&lt;br /&gt;&lt;br /&gt;    LOAD_COMMAND(CMD_ERASE);&lt;br /&gt;    PULSE_WR();&lt;br /&gt;&lt;br /&gt;    Serial.println(&amp;quot;Lo fuse: &amp;quot;);&lt;br /&gt;&lt;br /&gt;    LOAD_COMMAND(CMD_WRITE_FUSE);&lt;br /&gt;    LOAD_DATA(0xE1, true);&lt;br /&gt;    PULSE_WR();&lt;br /&gt;&lt;br /&gt;    Serial.println(&amp;quot;Hi fuse: &amp;quot;);&lt;br /&gt;&lt;br /&gt;    LOAD_COMMAND(CMD_WRITE_FUSE);&lt;br /&gt;    LOAD_DATA(0x99, false);&lt;br /&gt;    PULSE_WR();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  PROG_DISABLE();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-3000312223391447431?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/3000312223391447431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=3000312223391447431' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3000312223391447431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3000312223391447431'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/more-pokingno-more-joy.html' title='More poking...no more joy.'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_E6_haRsOYg8/R9qGooSi3YI/AAAAAAAAAA8/EC3-lLuZACc/s72-c/waveform.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-9019987376450975552</id><published>2008-03-13T15:05:00.001-07:00</published><updated>2008-03-13T15:10:34.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroic failure'/><title type='text'>Heroic failure!</title><content type='html'>I've slapped it all into shape and electrically things look solid - but no joy.&lt;br /&gt;&lt;br /&gt;Result: Heroic failure!&lt;br /&gt;&lt;br /&gt;I'll probably poke around a bit more before consigning this to the 'nearly works' pile as I get the same nonsense results with a known good chip. So you never know.&lt;br /&gt;&lt;br /&gt;This might be the time to get my &lt;a href="http://www.xs4all.nl/%7Ejwasys/old/diy2.html"&gt;cheap-as-chips parallel-port logic analyzer&lt;/a&gt; built... It's easy to see how my project stack grows :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-9019987376450975552?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/9019987376450975552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=9019987376450975552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9019987376450975552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9019987376450975552'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/heroic-failure.html' title='Heroic failure!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-2238716942773145541</id><published>2008-03-13T00:41:00.000-07:00</published><updated>2008-12-09T05:21:28.715-08:00</updated><title type='text'>Spaghetti</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/R9jbR4Si3XI/AAAAAAAAAA0/1b2tstlHrhA/s1600-h/DSCF2093.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/R9jbR4Si3XI/AAAAAAAAAA0/1b2tstlHrhA/s320/DSCF2093.JPG" alt="" id="BLOGGER_PHOTO_ID_5177128871876812146" border="0" /&gt;&lt;/a&gt;Here's the basic harness wired into the Arduino board. The three-pin header is the power connector, ready to accept +12, gnd and +5v connections from the transistor switch contraption that I'll put together on a breadboard later.&lt;br /&gt;&lt;br /&gt;I used very fine enamelled wire cohabiting the protoboard holes with the socket pins. A good application of heat and solder later - bingo!&lt;br /&gt;&lt;br /&gt;To connect the wire to the header pins I put a tiny blob of solder on the iron tip and insert the cut end of the wire. Within a second or so the enamel melts and you can see the solder flow around the wire. It's then ready to fix it to its destination.&lt;br /&gt;&lt;br /&gt;And what better to listen to whilst soldering than &lt;a href="http://groups.google.com/group/micro-hacker/web/channel+x+-+rave+the+rhythm+%28structure+1%29.mp3"&gt;some very fine oldskool belgian&lt;/a&gt; &lt;a href="http://musika-kaverna.ibelgique.com/b-universe.htm"&gt;skizzo&lt;/a&gt;??&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-2238716942773145541?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/2238716942773145541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=2238716942773145541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2238716942773145541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2238716942773145541'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/spaghetti.html' title='Spaghetti'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/R9jbR4Si3XI/AAAAAAAAAA0/1b2tstlHrhA/s72-c/DSCF2093.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-2098053234469756720</id><published>2008-03-12T06:45:00.000-07:00</published><updated>2008-03-13T00:41:29.081-07:00</updated><title type='text'>Arduino to planet fuser</title><content type='html'>Here's how I plan to wire the fuser board to my Diecimila:&lt;br /&gt;&lt;br /&gt;[Apologies to some viewers: I've just looked here using IE7 and the diagram is flummoxed. Adjust the font size downwards and things will look a little better]&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;     Target - atmega32&lt;br /&gt;                         ____ ____&lt;br /&gt;            |    pb0   =|    U    |=   pa0   |  bs2&lt;br /&gt;            |      1   =|         |=&lt;br /&gt;          / |      2   =|         |=&lt;br /&gt;      DATA  |      3   =|         |=&lt;br /&gt;          \ |      4   =|         |=&lt;br /&gt;            |      5   =|         |=&lt;br /&gt;            |      6   =|         |=&lt;br /&gt;            |      7   =|         |=&lt;br /&gt;               reset   =|         |=   aref&lt;br /&gt;                 vcc   =|         |=   gnd&lt;br /&gt;                 gnd   =|         |=   avcc&lt;br /&gt;                       =|         |=&lt;br /&gt;     xtal1  |  xtal1   =|         |=&lt;br /&gt;                 pd0   =|         |=&lt;br /&gt;  rdy/~bsy  |      1   =|         |=&lt;br /&gt;       ~oe  |      2   =|         |=&lt;br /&gt;       ~wr  |      3   =|         |=&lt;br /&gt;       bs1  |      4   =|         |=&lt;br /&gt;       xa0  |      5   =|         |=&lt;br /&gt;       xa1  |      6   =|_________|=   pd7   |  pagel&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Diecimila - pin assignment&lt;br /&gt;&lt;br /&gt;  ANA-IN5  |o|  DATA5&lt;br /&gt;        4  |o|      4&lt;br /&gt;        3  |o|      3&lt;br /&gt;        2  |o|      2&lt;br /&gt;        1  |o|      1&lt;br /&gt;        0  |o|      0&lt;br /&gt;&lt;br /&gt;  D0 [rx]  |o|  -&lt;br /&gt;   1 [tx]  |o|  -&lt;br /&gt;   2       |o|  xtal1&lt;br /&gt;   3       |o|  rdy/~bsy&lt;br /&gt;   4       |o|  ~oe&lt;br /&gt;   5       |o|  ~wr&lt;br /&gt;   6       |o|  DATA6&lt;br /&gt;   7       |o|  DATA7&lt;br /&gt;&lt;br /&gt;  D8       |o|  bs1&lt;br /&gt;   9       |o|  xa0&lt;br /&gt;  10       |o|  xa1&lt;br /&gt;  11       |o|  bs2&lt;br /&gt;  12       |o|  pagel&lt;br /&gt;  13       |o|  juice&lt;br /&gt;  gnd      |o|  -&lt;br /&gt;  aref     |o|  -&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The power switching is going to be implemented identically to how &lt;a href="http://elm-chan.org/"&gt;ChaN&lt;/a&gt; implements his. I'm lazy that way! Which is to say, The Good Way. Why reinvent?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-2098053234469756720?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/2098053234469756720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=2098053234469756720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2098053234469756720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/2098053234469756720'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/arduino-to-planet-fuser.html' title='Arduino to planet fuser'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-9118148679330691742</id><published>2008-03-11T10:24:00.000-07:00</published><updated>2008-03-14T07:29:00.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atmel'/><category scheme='http://www.blogger.com/atom/ns#' term='fuses'/><category scheme='http://www.blogger.com/atom/ns#' term='high voltage programming'/><category scheme='http://www.blogger.com/atom/ns#' term='avr'/><title type='text'>The plan to blow all the fuses</title><content type='html'>The aims of this mini project are quite humble: Build an out-of-circuit parallel mode programmer lite which can whip a borked avr back into something like its factory condition ready for in-circuit programming. At the moment I'm going to concentrate on one chip only and if it all works, and there's sufficient interest, I'll think about expanding the scope.&lt;br /&gt;&lt;br /&gt;I'm not going to go into depth - this is just really a sketch of what's happening in my bonce right now. I'll be abstracting quite heavily and using my own terms because it doesn't make sense to just repeat all the detail in the datasheets. Code and schematics will be posted as and when available.&lt;br /&gt;&lt;br /&gt;All the information I needed for V0.1 is in the &lt;a href="http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf"&gt;atmega32 data sheet&lt;/a&gt;. It looks like it'll be quite easy to reset the fuses.&lt;br /&gt;&lt;br /&gt;I've &lt;a href="http://elm-chan.org/works/avrx/report_e.html"&gt;come across a design&lt;/a&gt; for a parallel port programmer which looks like it would be simple to build but I don't relish the thought of soldering up yet another DB25 connector. So I've decided to drive this project with an Arduino. I'm imagining nothing more than a socket on some stripboard connected to some header pins that will mate with my Diecimila, some power regulation and switching. I would have built a shield but for whatever reason the designers of the board decided to use a &lt;a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1190586589"&gt;non-standard spacing&lt;/a&gt; between 2 sets of sockets which makes building shields on protoboard difficult. Grrrr.&lt;br /&gt;&lt;br /&gt;The procedure will simply be:- Erase chip, reset fuses. Job done. The chip erase step has the effect of resetting any lock bits. As one of the locks controls our ability to write fuses this is essential. The state of the EEPROM will be indeterminate after this step, however, as there is a fuse controlling whether the erase cycle also clears EEPROM. And we don't know how this is set.&lt;br /&gt;&lt;br /&gt;There are two ways to enter high voltage programming mode. The first involves gently tickling a port but it relies upon the clock settings for the chip being set to external. I think this might have been how I borked my chip, but as I couldn't ressurect it with an attached clock signal this could well not not be the case. So I'm going to go for the second method. Brute force!&lt;br /&gt;&lt;br /&gt;Powering up the target with 12v @ 250uA on its reset line, logic low on four specific pins and a wait of 100uS should be enough for it to become willing to accept programming commands. Which are loaded thus:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Set the 'mode select' pins to 'load command'.&lt;/li&gt;&lt;li&gt;Present the desired command to the DATA pins.&lt;/li&gt;&lt;li&gt;Pulse the clock pin to latch the command. All pulses need to last at least 250nS.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Commands are executed by giving a pulse to ~wr. Progress can be tracked by monitoring the rdy/~bsy pin, which will go low until the action has finished.&lt;br /&gt;&lt;br /&gt;Addresses are loaded in the same manner, we just substitute 'load address' as the mode.&lt;br /&gt;&lt;br /&gt;All the dirty details of the required pulsing is clearly outlined in the timing waveform diagrams in the data sheet.&lt;br /&gt;&lt;br /&gt;In order to check how the hardware and code is functioning I'll read the signature bytes of the chip as my first step.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Load the 'read signature' command.&lt;/li&gt;&lt;li&gt;Load the address of the desired signature byte, 0-2, to be accessed.&lt;/li&gt;&lt;li&gt;Set ~oe low.&lt;/li&gt;&lt;li&gt;The target presents the requested byte on the DATA bits.&lt;/li&gt;&lt;li&gt;Set ~oe high.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;When this is returning what I expect then we'll start on the fuses. First though - some erasing.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Load 'erase chip' command.&lt;/li&gt;&lt;li&gt;Pulse ~wr.&lt;/li&gt;&lt;li&gt;Wait for the command to complete. This will take between 7-9mS.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Once this is done happily then we're ready to blow the fuses! We'll do low, then high.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Load the 'write fuse' command.&lt;/li&gt;&lt;li&gt;Load DATA with the low fuse byte.&lt;/li&gt;&lt;li&gt;Give ~wr a pulse and wait for rdy/~bsy to indicate the process has completed.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;For general write operations this will take between 3-5mS.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Load the 'write fuse' command.&lt;/li&gt;&lt;li&gt;Load DATA with the high fuse value. &lt;/li&gt;&lt;li&gt;Give ~wr a pulse and wait for rdy/~bsy.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And that should be that!&lt;br /&gt;&lt;br /&gt;I'll let you know how I get on :)&lt;br /&gt;&lt;br /&gt;Here's an untested arduino sketch that I've hacked up, which should give a better idea of the specifics. It should be read in concert with the data sheet chapter 'Memory programming'.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;/* CUT DUE TO ITS TEMPORARY NATURE - PLEASE SEE LATER POST */&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-9118148679330691742?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/9118148679330691742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=9118148679330691742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9118148679330691742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/9118148679330691742'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/plan-to-blow-all-fuses.html' title='The plan to blow all the fuses'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-3628837392649314710</id><published>2008-03-07T05:43:00.001-08:00</published><updated>2008-12-09T05:21:29.133-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fuse'/><category scheme='http://www.blogger.com/atom/ns#' term='avr'/><category scheme='http://www.blogger.com/atom/ns#' term='mmc2iec'/><category scheme='http://www.blogger.com/atom/ns#' term='sd2iec'/><title type='text'>Retro Heaven</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6_haRsOYg8/R9epAISi3WI/AAAAAAAAAAs/Uk3FvxuS7b0/s1600-h/sd2iecanbb.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_E6_haRsOYg8/R9epAISi3WI/AAAAAAAAAAs/Uk3FvxuS7b0/s320/sd2iecanbb.jpg" alt="" id="BLOGGER_PHOTO_ID_5176792116376034658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've just hacked together an MMC2IEC interface on my breadboard. Thanks &lt;a href="http://pontoppidan.info/lars/index.php?proj=mmc2iec" target="_blank"&gt;Lars&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's a serial device that pretends to be a commodore 1541 disk drive. It uses SD card storage and disk images to deliver retrogaming goodness to my '128. This is #4 of 4 in my &lt;span style="font-style: italic;"&gt;old computers that I've added flash storage to&lt;/span&gt; series. Seriously - if you have old computers and a few spare hours it's worth the solder burns.&lt;br /&gt;&lt;br /&gt;Having got that device working in its original Lars form I noticed that the open source design has been picked up by a couple of other bods who have taken it to another level. Details are scant, &lt;a href="http://www.forum64.de/wbb3/index.php?page=Thread&amp;amp;threadID=21242" target="_blank"&gt;unless you speak German&lt;/a&gt;, but I've managed to scrape enough information together to upgrade Lars' original hardware design with some improved firmware called SD2IEC. This supports many more features such as high capacity cards, disk switching, some fastloaders and JiffyDos which should speed things up considerably. Which if you've ever used a C64 disk system you'll know is a must. Some details in English are &lt;a href="http://www.c64-wiki.com/index.php/MMC2IEC" target="_blank"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;During the process of upgrading I managed to half-brick an AVR chip. Unlike PICs they are easy to render unprogrammable by changing their configuration fuses in an an unfavourable way.  My mistake was  not reading the output of &lt;a href="http://palmavr.sourceforge.net/cgi-bin/fc.cgi" target="_blank"&gt;this avr fuse calculator&lt;/a&gt; carefully enough. Instead of making the AVR desire an external resonator, I made it lust for Clock. Which is different. I've done this a couple of times before with some 168s. In the aftermath of that embarrassing mistake I did some research and found that usually these chips can be resurrected.&lt;br /&gt;&lt;br /&gt;If you program a chip to expect a clock, then it should be possible to reprogram it as long as the relevant signal is present. I usually program chips in a little home-made ISP cradle which doesn't have a clock available. For the 168s it proved possible to get them going again by dropping them in my Deicimilia board before attempting to reset the fuses.&lt;br /&gt;&lt;br /&gt;The mega32 hasn't responded to this trick though. I used an Arduino to provide what I thought was a good clock to no avail. It's going to need something a little more ... high voltage. AVRs can be programmed using SPI in-circuit, or by more conventional parallel means out-of-circuit. Programming serially you need a well configured support circuit for the chip. Using a parallel programmer you can reset fuses that would prevent SPI from working. So here's my next project - an avr fuse reset device. A cut-down high voltage parallel programmer that only has one job - to reset the fuses to a factory fresh state. Insert AVR, press button, bingo! At least in theory :)&lt;br /&gt;&lt;br /&gt;I'm off to grab some of &lt;a href="http://www.atmel.com/dyn/products/app_notes.asp?family_id=607" target="_blank"&gt;Atmel's brilliant application notes&lt;/a&gt;. Then it'll be time for a nice sit down and some strawberry cheesecake.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-3628837392649314710?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/3628837392649314710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=3628837392649314710' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3628837392649314710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/3628837392649314710'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/retro-heaven.html' title='Retro Heaven'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6_haRsOYg8/R9epAISi3WI/AAAAAAAAAAs/Uk3FvxuS7b0/s72-c/sd2iecanbb.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-551282639507073126.post-4256169576731419480</id><published>2008-03-01T08:05:00.000-08:00</published><updated>2009-03-23T06:17:23.480-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='LED'/><category scheme='http://www.blogger.com/atom/ns#' term='POV'/><category scheme='http://www.blogger.com/atom/ns#' term='cake'/><category scheme='http://www.blogger.com/atom/ns#' term='zx81'/><category scheme='http://www.blogger.com/atom/ns#' term='MMC'/><title type='text'>Hello, world!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_E6_haRsOYg8/R8mcZ1znepI/AAAAAAAAAAY/RAgg0rVeaYQ/s1600-h/vanillaslice.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_E6_haRsOYg8/R8mcZ1znepI/AAAAAAAAAAY/RAgg0rVeaYQ/s320/vanillaslice.jpg" alt="" id="BLOGGER_PHOTO_ID_5172837614765963922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I want somewhere to doodle about the mucking around I'm doing with &lt;a href="http://www.arduino.cc/"&gt;Arduin&lt;/a&gt;&lt;a href="http://www.arduino.cc/"&gt;o&lt;/a&gt;. This, as you might well have guessed by now, is it.&lt;br /&gt;&lt;br /&gt;If you don't dig digital, if you aren't amorous with analog... Oh forget it. It's going to be spoddy!&lt;br /&gt;&lt;br /&gt;I'm off to town for a vanilla slice, but when I get back I'll play with this blog thing a little more and start posting about the microcontroller hackery I've been getting up to in the last few months or so.&lt;br /&gt;&lt;br /&gt;If you like &lt;a href="http://en.wikipedia.org/wiki/Persistence_of_vision"&gt;POV&lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/Persistence_of_vision"&gt; toys&lt;/a&gt;, &lt;a href="http://groups.google.com/group/micro-hacker/web/DSCF2100.JPG"&gt;LED&lt;/a&gt;&lt;a href="http://groups.google.com/group/micro-hacker/web/DSCF2100.JPG"&gt; tokens&lt;/a&gt; &lt;a href="http://groups.google.com/group/micro-hacker/web/DSCF2097.JPG"&gt;of love&lt;/a&gt;, &lt;a href="http://www.old-computers.com/museum/computer.asp?c=263"&gt;zx81&lt;/a&gt;s, shoehorning data on and off &lt;a href="http://en.wikipedia.org/wiki/MultiMediaCard"&gt;MMC cards&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Frequency-shift_keying"&gt;FSK&lt;/a&gt; cassette interfaces then I'm sure you'll be &lt;a href="http://en.wikipedia.org/wiki/Rivet"&gt;riveted&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If not - well, &lt;a href="http://www.channel4.com/food/recipes/chefs/nigella-lawson/chocolate-cloud-cake-recipe_p_1.html"&gt;there will be cake&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/551282639507073126-4256169576731419480?l=arduinonut.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arduinonut.blogspot.com/feeds/4256169576731419480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=551282639507073126&amp;postID=4256169576731419480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4256169576731419480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/551282639507073126/posts/default/4256169576731419480'/><link rel='alternate' type='text/html' href='http://arduinonut.blogspot.com/2008/03/hello-world.html' title='Hello, world!'/><author><name>charlie robson</name><uri>https://profiles.google.com/116570586095011758241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-r8yS-D1AjA4/AAAAAAAAAAI/AAAAAAAAAAA/GhhkrxZDUMk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6_haRsOYg8/R8mcZ1znepI/AAAAAAAAAAY/RAgg0rVeaYQ/s72-c/vanillaslice.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
