<?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-1960834595462451398</id><updated>2012-01-27T16:02:02.024-08:00</updated><title type='text'>DGOS</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5230092705481593913</id><published>2012-01-22T14:10:00.001-08:00</published><updated>2012-01-22T14:18:14.461-08:00</updated><title type='text'>source</title><content type='html'>I simply haven't the time to work on DGOS anymore, sadly. If anyone is actually interested I can disclose the source.&lt;br /&gt;&lt;br /&gt;Current state:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;kernel&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Multithreading &amp; Multitasking&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Protected memory&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Code pages can be shared between processes&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Support for kernel modules, including loading and unloading&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Drivers for some hardware: HDD, flash, ram, timers, display, sound, touch&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;support for userspace applications &amp; libraries&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;ARMv4 &amp; ARMv5 support, including emulation of some v5 instructions under v4&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Pluggable VFS &amp; block device layer with NAND support&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Userspace&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Heap code to support allocation &amp; memory management&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Ability to load dynamic libraries in ELF format&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Currently posted libraries&lt;ul&gt;&lt;br /&gt;   &lt;li&gt;libjpeg&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;libpng&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;zlib&lt;/li&gt;&lt;br /&gt;  &lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;New libraries:&lt;ul&gt;&lt;br /&gt;   &lt;li&gt;GfxLib: load images in jpeg &amp; png formats, show semitransparent layers onscreen, etc&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;RtLib: runtime for DGOS (VFS calls, other syscalls)&lt;/li&gt;&lt;br /&gt;  &lt;/ul&gt;&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;PalmOS loader to run DGOS from inside palmOS&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Work to do: wifi drivers (can wrap palmos ones), finish palmos compatibility layer, etc...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5230092705481593913?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5230092705481593913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5230092705481593913' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5230092705481593913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5230092705481593913'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2012/01/source.html' title='source'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-280337632093544588</id><published>2010-10-13T22:07:00.000-07:00</published><updated>2010-10-13T22:09:28.355-07:00</updated><title type='text'>why DGOS?</title><content type='html'>I get it. people have moved on form palm devices and nobody cares. why go on? mostly because i want to, but also because palm hardware is quite capable still. i have a friend help me on some stuff now, to make things a bit faster. does anyone care still?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-280337632093544588?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/280337632093544588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=280337632093544588' title='98 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/280337632093544588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/280337632093544588'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/10/why-dgos.html' title='why DGOS?'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>98</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-4806019058850430375</id><published>2010-08-24T16:00:00.001-07:00</published><updated>2010-08-30T14:23:42.364-07:00</updated><title type='text'>Android?</title><content type='html'>While playing around with Linux I accidentally made Android work on Palms. Is this of value to anyone?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE: "first success"&lt;br /&gt; &lt;img src="http://sphotos.ak.fbcdn.net/hphotos-ak-ash2/hs197.ash2/46051_10100213087437880_1939605_59396996_5567400_n.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-4806019058850430375?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/4806019058850430375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=4806019058850430375' title='69 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4806019058850430375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4806019058850430375'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/08/android.html' title='Android?'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>69</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2233572627437558042</id><published>2010-06-20T21:42:00.001-07:00</published><updated>2010-06-20T21:42:27.873-07:00</updated><title type='text'>not dead</title><content type='html'>i promise this isn't dead. i still work on this. font rendering is still a huge pain in the ass! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2233572627437558042?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2233572627437558042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2233572627437558042' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2233572627437558042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2233572627437558042'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/06/not-dead.html' title='not dead'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6886216652336051321</id><published>2010-06-04T00:59:00.001-07:00</published><updated>2010-06-04T01:47:06.623-07:00</updated><title type='text'>where i've been</title><content type='html'>WHY haven't I updated the blog?&lt;br /&gt;I've been working hard on this: &lt;a href="http://www.kno.com"&gt;http://www.kno.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6886216652336051321?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6886216652336051321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6886216652336051321' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6886216652336051321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6886216652336051321'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/06/where-ive-been.html' title='where i&apos;ve been'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8072389854683179802</id><published>2010-03-23T22:55:00.001-07:00</published><updated>2010-03-23T22:55:36.653-07:00</updated><title type='text'>lack of time</title><content type='html'>working in a startup, i have very little time lately, sadly.&lt;br /&gt;&lt;br /&gt;still working on this once in a while though...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8072389854683179802?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8072389854683179802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8072389854683179802' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8072389854683179802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8072389854683179802'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/03/lack-of-time.html' title='lack of time'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7039778153276676704</id><published>2010-03-02T01:50:00.001-08:00</published><updated>2010-03-02T01:50:27.000-08:00</updated><title type='text'>Meh</title><content type='html'>My messing around with FAT code broke fat12...fixing it&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7039778153276676704?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7039778153276676704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7039778153276676704' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7039778153276676704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7039778153276676704'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/03/meh.html' title='Meh'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-3691637140780477578</id><published>2010-02-22T01:46:00.000-08:00</published><updated>2010-02-22T01:47:11.957-08:00</updated><title type='text'>FAT</title><content type='html'>did some optimizations on fat code. it is much faster now :)&lt;br /&gt;also it's been converted into a proper module instead of the weird half-module state it's been in&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-3691637140780477578?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/3691637140780477578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=3691637140780477578' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3691637140780477578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3691637140780477578'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/02/fat.html' title='FAT'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5917070204829232008</id><published>2010-02-16T23:54:00.000-08:00</published><updated>2010-02-16T23:55:54.946-08:00</updated><title type='text'>UI 2</title><content type='html'>Who knew photoshopping many small images could be so time consuming. I created the 45 images today that make up all the images needed for buttons (button is 9 images, and there are 5 states: on off disabled, focused, focused&amp;on)&lt;br /&gt;&lt;br /&gt;Anyone want to take over the graphic design?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5917070204829232008?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5917070204829232008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5917070204829232008' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5917070204829232008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5917070204829232008'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/02/ui-2.html' title='UI 2'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5791609000874603038</id><published>2010-02-16T02:05:00.000-08:00</published><updated>2010-02-16T02:09:46.305-08:00</updated><title type='text'>UI :)</title><content type='html'>Just a small photo before i go to bed. I finally got around to drawing up the UI images so now a simple form can render :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.palmpowerups.com/priv/dgos-form.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Note the subtle shadow. The ui is composed of PNG images with alpha blending. This means that ALL of the UI can be semi-transparent and have pretty shadows.&lt;br /&gt;&lt;br /&gt;The final compositing is done by GfxLib's GfxLibLayer class.&lt;br /&gt;&lt;br /&gt;Much much more UI shots soon... (as soon as I draw the other UI elements)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5791609000874603038?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5791609000874603038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5791609000874603038' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5791609000874603038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5791609000874603038'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/02/ui.html' title='UI :)'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8593730668781414180</id><published>2010-02-14T23:54:00.001-08:00</published><updated>2010-02-14T23:54:35.386-08:00</updated><title type='text'>Freetype</title><content type='html'>...is a pain in the rear...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8593730668781414180?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8593730668781414180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8593730668781414180' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8593730668781414180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8593730668781414180'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/02/freetype.html' title='Freetype'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5070913703639580936</id><published>2010-02-05T01:59:00.000-08:00</published><updated>2010-02-05T02:01:41.449-08:00</updated><title type='text'>fonts</title><content type='html'>porting FreeType...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5070913703639580936?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5070913703639580936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5070913703639580936' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5070913703639580936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5070913703639580936'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/02/fonts.html' title='fonts'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2656748134240243044</id><published>2010-02-03T00:08:00.003-08:00</published><updated>2010-02-03T00:37:38.933-08:00</updated><title type='text'>T|E2 NAND chip &amp; general project status</title><content type='html'>TE|2's NAND chip was connected in a rather weird way, but I made it work. TX's partition manager reads its partitions just fine too :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've been posting less statuses since I've been somewhat occupied with someone :) and thus have less time to code.&lt;br /&gt;&lt;br /&gt;Also, expect to see a little UI demo soon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2656748134240243044?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2656748134240243044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2656748134240243044' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2656748134240243044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2656748134240243044'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/02/te2-nand-chip-general-project-status.html' title='T|E2 NAND chip &amp; general project status'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5882973527094093094</id><published>2010-01-22T00:51:00.001-08:00</published><updated>2010-01-22T00:54:10.234-08:00</updated><title type='text'>PXA270 USB</title><content type='html'>I wish nothing but pain on the designers and implementers of the PXA270 USB gadget module. This thing has more bugs than features!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5882973527094093094?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5882973527094093094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5882973527094093094' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5882973527094093094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5882973527094093094'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/01/pxa270-usb.html' title='PXA270 USB'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5625506496675972254</id><published>2010-01-21T01:09:00.001-08:00</published><updated>2010-01-21T01:09:35.902-08:00</updated><title type='text'>TX USB</title><content type='html'>TX USB is showing signs of life. Mass storage, here we come&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5625506496675972254?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5625506496675972254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5625506496675972254' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5625506496675972254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5625506496675972254'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/01/tx-usb.html' title='TX USB'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5043504215187722108</id><published>2010-01-13T23:23:00.000-08:00</published><updated>2010-01-13T23:24:06.503-08:00</updated><title type='text'>join?</title><content type='html'>anyone want to help develop DGOS? ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5043504215187722108?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5043504215187722108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5043504215187722108' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5043504215187722108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5043504215187722108'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/01/join.html' title='join?'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2403019078856507562</id><published>2010-01-03T23:36:00.001-08:00</published><updated>2010-01-03T23:37:02.004-08:00</updated><title type='text'>TxFFS driver</title><content type='html'>The driver is done, and I am not quite sure why it isn't exactly working, but I feel I am close. The format my driver produces looks very much like TX's format, but not quite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2403019078856507562?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2403019078856507562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2403019078856507562' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2403019078856507562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2403019078856507562'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2010/01/txffs-driver.html' title='TxFFS driver'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6327702738969681045</id><published>2009-12-27T12:30:00.000-08:00</published><updated>2009-12-27T13:48:30.471-08:00</updated><title type='text'>T|X internal storage</title><content type='html'>TX internal storage is a NAND flash chip. This is difficult for a few reasons, mostly, because NAND needs wear-leveling, and special filesystems, neither of which is standardized. There isn't even a standard way to lay out a partition table! Thus to get TX internal storage to work there are three components to be created: BlockDevice driver to talk to the NAND chip, PartitionManager plugin to figure out the partitions on the device, and filesystem driver for the FS used in the TX (something called "BFFS").&lt;br /&gt;&lt;br /&gt;I am happy to report that the first two pats are complete and working. The third is harder, however I've had some help from a programmer in China (irc handle tech_junkie_chz_5481), who seems to know a lot about this BFFS and has helped me craft a driver for it all in one night. The testing is going to start soon.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS: Hello from Buenos Aires!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6327702738969681045?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6327702738969681045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6327702738969681045' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6327702738969681045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6327702738969681045'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/tx-internal-storage.html' title='T|X internal storage'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6593068245073588953</id><published>2009-12-17T22:34:00.000-08:00</published><updated>2009-12-17T22:38:26.826-08:00</updated><title type='text'>UiLib</title><content type='html'>Did some work on UiLib and various UI components.&lt;br /&gt;&lt;br /&gt;Now off to a 2-week vacation :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6593068245073588953?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6593068245073588953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6593068245073588953' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6593068245073588953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6593068245073588953'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/uilib.html' title='UiLib'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6777634491541150754</id><published>2009-12-16T03:55:00.001-08:00</published><updated>2009-12-16T04:01:20.230-08:00</updated><title type='text'>E2 final update</title><content type='html'>T|E2 now boot reliably into DGOS. Now i will go back to userspace work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6777634491541150754?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6777634491541150754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6777634491541150754' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6777634491541150754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6777634491541150754'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/e2-final-update.html' title='E2 final update'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6259653208617045163</id><published>2009-12-13T13:28:00.000-08:00</published><updated>2009-12-13T13:29:34.605-08:00</updated><title type='text'>T|E2</title><content type='html'>T|E2's processor is a generation older then TX's and LD's (and htu slacks some features DGOS kernel uses), but the kernel comes up (somewhat) on it. Will work today on making that 100%&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6259653208617045163?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6259653208617045163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6259653208617045163' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6259653208617045163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6259653208617045163'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/te2.html' title='T|E2'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6485210541266893419</id><published>2009-12-12T03:41:00.000-08:00</published><updated>2009-12-12T03:44:50.925-08:00</updated><title type='text'>TX NAND further updates</title><content type='html'>TX NAND speaks to me just fine, AND i am able to parse palm's strange partition table, ECC codes, as well as bad block chains. Next: parsing their filesystem used on the TX: It's called "blunk flash file system" and getting an official copy of the spec for it costs $15,000&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6485210541266893419?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6485210541266893419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6485210541266893419' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6485210541266893419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6485210541266893419'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/tx-nand-further-updates.html' title='TX NAND further updates'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8652555498893753792</id><published>2009-12-11T01:52:00.000-08:00</published><updated>2009-12-11T12:16:53.884-08:00</updated><title type='text'>TX NAND speaketh...</title><content type='html'>...and it says CE F1 80 15&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[for those who have no idea what that means - the TX internal storage driver had been started, and just successfully spoke to the flash chip. Those numbers are the chip's ID number]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8652555498893753792?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8652555498893753792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8652555498893753792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8652555498893753792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8652555498893753792'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/tx-nand-speaketh.html' title='TX NAND speaketh...'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-908055756122139971</id><published>2009-12-10T01:13:00.001-08:00</published><updated>2009-12-11T01:56:21.469-08:00</updated><title type='text'>Update</title><content type='html'>My new job is getting me into habit of daily status updates, so here goes :).&lt;br /&gt;&lt;br /&gt;LD usb driver still being stubborn, TX internal memory chip can be read/written/erased, but data is still somewhat cryptic, next demo will demonstrate a functionality like CardExport, but under DGOS on an LD, and the one after that will be a TX demo. Lots of work needs to be done on the UI, and I welcome all takers, who want to make an effort to develop/help with the UI design/programming (I am just one man, working an average of 45 minutes a day on this, afterall)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-908055756122139971?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/908055756122139971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=908055756122139971' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/908055756122139971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/908055756122139971'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/update.html' title='Update'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-4591464715789100619</id><published>2009-12-08T02:20:00.000-08:00</published><updated>2009-12-08T02:21:28.942-08:00</updated><title type='text'>Small update</title><content type='html'>A small but important bug was fixed in module makefiles, and lifedrive USB driver has been split off into its own module, and some more work was done on it. now it's maybe 60% done :)&lt;br /&gt;&lt;br /&gt;Look for more updates soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-4591464715789100619?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/4591464715789100619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=4591464715789100619' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4591464715789100619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4591464715789100619'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/small-update.html' title='Small update'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7507994950759122378</id><published>2009-12-07T02:17:00.000-08:00</published><updated>2009-12-07T02:31:38.502-08:00</updated><title type='text'>GfxLib transparency works well</title><content type='html'>A small video. Shows two semitransparent layers interacting using GfxLib. Also shown is the boot process. Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hO427nPwDYQ&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/hO427nPwDYQ&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The quickly-written and messy source code to this simple test app is as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include &amp;lt;kTypes.h&amp;gt;&lt;br /&gt;#include &amp;lt;errors.h&amp;gt;&lt;br /&gt;#include &amp;lt;RtLib.h&amp;gt;&lt;br /&gt;#include &amp;lt;GfxLib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static char __x[128];&lt;br /&gt;#define printf(...)   do{sprintf(__x,__VA_ARGS__);_DGOS_DEBUG_TMP_printStr(__x);}while(0)&lt;br /&gt;#define perr(...)   do{printf(__VA_ARGS__); while(1) SchedYield();}while(0)&lt;br /&gt;&lt;br /&gt;int _start(){&lt;br /&gt;   &lt;br /&gt;   GfxImage* i;&lt;br /&gt;   GfxLayer* L;&lt;br /&gt;   GfxLayer* L2;&lt;br /&gt;   UInt32 iw, ih, sw = 324, sh = 484;&lt;br /&gt;   Int32 x = 0, y = 0, dx = 1, dy = 1;&lt;br /&gt;   UInt16* d;&lt;br /&gt;   Err e;&lt;br /&gt;   &lt;br /&gt;   printf("TEST RUNNING\n");&lt;br /&gt;   &lt;br /&gt;   if(!GfxLayersInit(GFX_LIB_ROTATION_NORMAL)){&lt;br /&gt;      perr("cannot init GfxLayers\n");&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   printf("setting color\n");&lt;br /&gt;   GfxLayersSetBackground(GfxColorMakeRGB(192,255,192));&lt;br /&gt;   &lt;br /&gt;   printf("creating layer\n");&lt;br /&gt;   L2 = GfxLayerCreate(0, 0, 324, 484);&lt;br /&gt;   if(!L2) perr("cannot create layer with bg\n");&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;   printf("calculating layer\n");&lt;br /&gt;   printf("L=0x%08x\n", L2);&lt;br /&gt;   printf("I=0x%08x\n", GfxLayerGetImage(L2));&lt;br /&gt;   printf("D=0x%08x\n", GfxImageGetData(GfxLayerGetImage(L2)));&lt;br /&gt;   printf("A=0x%08x\n", GfxImageGetAlpha(GfxLayerGetImage(L2)));&lt;br /&gt;   &lt;br /&gt;   d = GfxImageGetData(GfxLayerGetImage(L2));&lt;br /&gt;   MemSet(GfxImageGetAlpha(GfxLayerGetImage(L2)), 324*484, 0xFF);&lt;br /&gt;&lt;br /&gt;   for(y = 0; y &amp;lt; 484; y++){&lt;br /&gt;      for(x = 0; x &amp;lt; 324; x++){&lt;br /&gt;         UInt32 r,g,b;&lt;br /&gt;         &lt;br /&gt;         r = y * 256 / 484;&lt;br /&gt;         g = y * 256 / 484;&lt;br /&gt;         b = y * 256 / 484;&lt;br /&gt;         &lt;br /&gt;         r = ((r * x) + (256 * (323 - x))) / 323;&lt;br /&gt;         g = ((256 * x) + (g * (323 - x))) / 323;&lt;br /&gt;         &lt;br /&gt;         &lt;br /&gt;         *d++ = (((y / 10) &amp;amp; 1) == ((x / 10) &amp;amp; 1)) ? \&lt;br /&gt;                  GfxColorMakeRGB(r,g,b) : \&lt;br /&gt;                  GfxColorMakeRGB(0,0,b);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   printf("drawing layer\n");&lt;br /&gt;   GfxLayerRedraw(L2);&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   printf("loading img\n");&lt;br /&gt;   &lt;br /&gt;   e = GfxLibLoadPng(3,L"/test.png", &amp;amp;i, false);&lt;br /&gt;   if(e) perr("cannot load image: 0x%04x\n",e);&lt;br /&gt;   &lt;br /&gt;   GfxImageGetDimensions(i, &amp;amp;iw, &amp;amp;ih);&lt;br /&gt;&lt;br /&gt;   printf("img is %dx%d\n",iw,ih);&lt;br /&gt;   &lt;br /&gt;   L = GfxLayerCreateWithImage(0, 0, i);&lt;br /&gt;   if(!L) perr("cannot create layer with image\n");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   x = 0;&lt;br /&gt;   y = 0;&lt;br /&gt;&lt;br /&gt;   while(1){&lt;br /&gt;      &lt;br /&gt;      x += dx;&lt;br /&gt;      y += dy;&lt;br /&gt;      &lt;br /&gt;      if((x + iw &amp;gt;= sw) || x &amp;lt;0){&lt;br /&gt;         dx = -dx;&lt;br /&gt;         x += 2 * dx;&lt;br /&gt;      }&lt;br /&gt;      if((y + ih &amp;gt;= sh) || y &amp;lt; 0){&lt;br /&gt;         dy = -dy;&lt;br /&gt;         y += 2 * dy;&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;      GfxLayerSetLocation(L, x, y);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   while(1) SchedYield();   //idle well&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7507994950759122378?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7507994950759122378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7507994950759122378' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7507994950759122378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7507994950759122378'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/gfxlib-transparency-works-well.html' title='GfxLib transparency works well'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8743728115891001977</id><published>2009-12-02T00:03:00.000-08:00</published><updated>2009-12-02T00:25:41.804-08:00</updated><title type='text'>Demo Time?</title><content type='html'>Perhaps it's time for a small demo? Perhaps a video of the boot process on an LD or a TX? Or maybe a small demo of a simple doodling app. While hardly impressive by itself, both of these build on an entirely new OS, which makes them impressive.&lt;br /&gt;&lt;br /&gt;Or perhaps wait till the UI lib is finished, and a new semi-transparent UI can be demoed as well?&lt;br /&gt;&lt;br /&gt;Or perhaps both?&lt;br /&gt;&lt;br /&gt;What do you think. Comment to reply.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[currently LD is the most supported device, with TX close behind given that it is so similar. T|E2 was tested a few times and worked reasonably well, to some extent, but lately it doesn't. I think my new scheduler code is to blame. I'll look inot it later.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8743728115891001977?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8743728115891001977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8743728115891001977' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8743728115891001977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8743728115891001977'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/12/remo-time.html' title='Demo Time?'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2565076142727788395</id><published>2009-11-27T23:50:00.000-08:00</published><updated>2009-11-28T00:03:45.110-08:00</updated><title type='text'>on GfxLib and alpha-blending</title><content type='html'>GfxLib has seen some new code added to it. This is the general graphics library for the OS, providing basic drawing (like lines and rectangles), as well as advanced drawing (&lt;a href="http://en.wikipedia.org/wiki/Alpha_compositing"&gt;alpha-blended&lt;/a&gt; images). The alpha-blending code exists in multiple versions ,to take advantage of different processors. The "generic C" version can pull off 15 frames per second on alpha-blending a fullscreen image on 324x484 resolution. This version will run on any ARM processor ever used in Palm devices. The "fast" version requires a ARMv5 processor (like one in iQue, Zodiac) and can pull off 21 frames per second on the same fullscreen alpha-blended image. The "WMMX" version requires an XScale CPU (like one in LifeDrive, TX) and uses Intel's WMMX (their MMX for mobile) and is twice as fast as the "genereic C" version, managing a whopping 30 frames per second on fullscreen alpha-blending test.&lt;br /&gt;&lt;br /&gt;These FPS numbers may seem low, but remember that (1) it is rare to redraw the fullscreen, generally only the changed area needs redrawing, (2) these might become faster as I optimize them more (3) comparing to more modern hardware is pointless, since almost all modern hardware has graphics acceleration chips and PalmOS devices do not (with the exception of the Zodiac, but I am not supporting it anyways for now)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For the technically curious: C version processes one pixel at a time. ARMv5 version processes two pixels at a time, using the "Enhanced DSP instructions" that this architecture provides (SMUL&amp;lt;x&amp;gt;&amp;lt;y&amp;gt; and SMLA&amp;lt;x&amp;gt;&amp;lt;y&amp;gt;) to do the parallel multiplication. The WMMX version processes four pixels at a time and makes heavy use of WMMX instructions (TBCST, WLDR, WSTR, WUNPACKEL, WSUB, WAND, WOR, WSLL, WSLR, WMUL, WMAC) to do parallel processing of al four pixels.&lt;br /&gt;&lt;br /&gt;Also a rather large (9%) speedup was attained by strategically placed "PLD" instructions, that instruct the D-cache to pre-load data into the cache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2565076142727788395?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2565076142727788395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2565076142727788395' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2565076142727788395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2565076142727788395'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/11/on-gfxlib-and-lapha-blending.html' title='on GfxLib and alpha-blending'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7748122091986005048</id><published>2009-11-22T12:22:00.000-08:00</published><updated>2009-11-22T12:26:28.211-08:00</updated><title type='text'>PalmOS-based loader</title><content type='html'>PalmOS-based loader has been rewritten and now is finished. It loads DGOS as if it was just another PalmOS app. You tap it, it evicts PalmOS from ram and loads the DGOS kernel in under a second. It even has a [somewhat] cute icon:&lt;br /&gt;&lt;img src="http://www.palmpowerups.com/images/DGOS_loader.gif" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7748122091986005048?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7748122091986005048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7748122091986005048' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7748122091986005048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7748122091986005048'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/11/palmos-based-loader.html' title='PalmOS-based loader'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-4782980460983458709</id><published>2009-11-17T17:48:00.000-08:00</published><updated>2009-11-20T10:28:05.971-08:00</updated><title type='text'>Simplicity</title><content type='html'>Here is a simple kernel module, demonstrating how easy it is to write and build one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;kmod.c&lt;/strong&gt;&lt;br /&gt;&lt;pre class=class="brush: cpp"&gt;&lt;br /&gt;#include &amp;lt;kernel.h&gt;&lt;br /&gt;#include &amp;lt;errors.h&gt;&lt;br /&gt;#include &amp;lt;timers.h&gt;&lt;br /&gt;#include &amp;lt;usrProcess.h&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Err kmod_main(UInt32 reason, void* data){&lt;br /&gt; &lt;br /&gt; UInt64 time = timersGetTicks64();&lt;br /&gt; &lt;br /&gt; if (reason == K_MOD_LOADED){&lt;br /&gt;  &lt;br /&gt;  charsPrintF("Module loaded at 0x%08lx\n", time);&lt;br /&gt; }&lt;br /&gt; else if(reason == K_MOD_UNLOADED){&lt;br /&gt;  &lt;br /&gt;  charsPrintF("Module unloaded at 0x%08lx\n", time);&lt;br /&gt; }&lt;br /&gt; else{&lt;br /&gt;  &lt;br /&gt;  charsPrintF("Module called with unknown command (0x%x,0x%08x)\n", reason, data); &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return errNone;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Makefile&lt;/strong&gt;&lt;br /&gt;&lt;pre class="brush: bash"&gt;&lt;br /&gt;LIBNAME = kmod.kmod&lt;br /&gt;CC = arm-linux-elf-gcc&lt;br /&gt;FLAGS = -O4 -fpic  -fshort-wchar -mthumb-interwork&lt;br /&gt;SLIBS = &lt;br /&gt;DLIBS = ../KernelLib/KernelLib.lib&lt;br /&gt;CCFLAGS = $(FLAGS) -I../Src/public -I../Src&lt;br /&gt;LDFLAGS = $(FLAGS) -nostartfiles -nodefaultlibs -nostdlib $(DLIBS) $(SLIBS) \&lt;br /&gt;          -Wl,-shared -Wl,-soname,$(LIBNAME)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;kmod.kmod: kmod.o&lt;br /&gt; $(CC) kmod.o -o kmod.kmod $(LDFLAGS) -e kmod_main&lt;br /&gt;&lt;br /&gt;kmod.o: kmod.c&lt;br /&gt; $(CC) $(CCFLAGS) -o kmod.o -c kmod.c&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt; rm -rf *.o kmod.kmod&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-4782980460983458709?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/4782980460983458709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=4782980460983458709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4782980460983458709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4782980460983458709'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/11/simplicity.html' title='Simplicity'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-1682672358721187778</id><published>2009-11-16T23:25:00.000-08:00</published><updated>2009-11-16T23:26:09.706-08:00</updated><title type='text'>funny code fragments</title><content type='html'>&lt;pre&gt;&lt;br /&gt;Err elfUnload(Process* p, void* base){&lt;br /&gt; &lt;br /&gt; if(p == taskGetKernelProcess()) {&lt;br /&gt;  &lt;br /&gt;  Panic("ELF unload in kernel not implemented. why are you trying it anyways?");&lt;br /&gt; }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-1682672358721187778?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/1682672358721187778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=1682672358721187778' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1682672358721187778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1682672358721187778'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/11/funny-code-fragments.html' title='funny code fragments'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7909251971823711814</id><published>2009-11-12T22:17:00.000-08:00</published><updated>2009-11-12T22:18:27.983-08:00</updated><title type='text'>Networking</title><content type='html'>Wifi chipset in lifedrive and tx is not documented. i do not plan to reverse engineeer it. I plan to run the palmos driver in a palmos container layer, and use it to talk to the wifi chip. palmos supports one raw socket per interface, thus giving me all the network access i need, and the DGOS networking stack can then use that interface to talk to the wifi chip directly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7909251971823711814?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7909251971823711814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7909251971823711814' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7909251971823711814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7909251971823711814'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/11/networking.html' title='Networking'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-693955772845842037</id><published>2009-10-15T00:14:00.000-07:00</published><updated>2009-10-15T00:20:25.244-07:00</updated><title type='text'>initfs</title><content type='html'>When DGOS boots, it has no filesystem or device drivers. This is a problem since the filesystem and block device drivers are modules - files on the filesystem. We are thus left with a chicken-and-egg scenario that we need the filesystem access to load modules and we need the filesystem modules to have filesystem access. This is solved using initfs. This is a simple flat filesystem in ram that has just the bare minimum modules required to bring up the filesystem and device support needed to load the rest of the system. The bootloader loads two files to RAM. The kernel and the initfs image. The kernel then uses the initfs image to load the modules needed to access the main filesystem. initfs memory is then freed, and with this new ability to read the filesystem the kernel can go on booting.&lt;br /&gt;&lt;br /&gt;DGOS used to have a very simple initfs FS and init_blk block device in it. I decided to replace initfs with just FAT, since it is simple, and there is little harm in compiling it into the kernel. This also means that the initfs image for most devices will now contain just one module - the block device driver for SD card (or in the case of lifedrive - two: SD and HDD drivers). FAT driver will now be part of the kernel and thus doesn ot need to be a module in initfs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-693955772845842037?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/693955772845842037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=693955772845842037' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/693955772845842037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/693955772845842037'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/10/initfs.html' title='initfs'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-4979381271063416983</id><published>2009-10-14T12:18:00.000-07:00</published><updated>2009-10-14T12:19:57.285-07:00</updated><title type='text'>Artwork [or some likeness thereof]</title><content type='html'>&lt;img src="http://dmitrygrinberg.com/dgos/Startup.jpg" style="border: 1px solid black;"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-4979381271063416983?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/4979381271063416983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=4979381271063416983' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4979381271063416983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4979381271063416983'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/10/artwork-or-some-likeness-thereos.html' title='Artwork [or some likeness thereof]'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-9130912676162173356</id><published>2009-09-23T22:01:00.001-07:00</published><updated>2009-09-23T22:01:33.452-07:00</updated><title type='text'>FAT32?</title><content type='html'>done&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-9130912676162173356?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/9130912676162173356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=9130912676162173356' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/9130912676162173356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/9130912676162173356'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/09/fat32.html' title='FAT32?'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2334491763742347397</id><published>2009-09-07T23:17:00.000-07:00</published><updated>2009-09-07T23:18:18.960-07:00</updated><title type='text'>Project is alive</title><content type='html'>I've been having lots of personal things to deal with lately, hence no updates here, but project is moving forward :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2334491763742347397?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2334491763742347397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2334491763742347397' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2334491763742347397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2334491763742347397'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/09/project-is-alive.html' title='Project is alive'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6114825924577340202</id><published>2009-08-11T18:59:00.001-07:00</published><updated>2009-08-11T18:59:32.625-07:00</updated><title type='text'>FAT32.n+1</title><content type='html'>Busy at work lately, so had little time to work on the FAT code, but the dir code now works well, and file code is almost done as well...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6114825924577340202?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6114825924577340202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6114825924577340202' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6114825924577340202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6114825924577340202'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/08/fat32n1.html' title='FAT32.n+1'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7832412761428934786</id><published>2009-07-28T11:25:00.001-07:00</published><updated>2009-07-28T11:25:39.886-07:00</updated><title type='text'>FAT32 again</title><content type='html'>FAT32 work is still going on. Yes it's a pain in the ass, but it's moving. LFN code is written. FAT code is written. Just file and dir code left&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7832412761428934786?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7832412761428934786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7832412761428934786' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7832412761428934786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7832412761428934786'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/07/fat32-again.html' title='FAT32 again'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2284077884503894763</id><published>2009-07-20T13:02:00.000-07:00</published><updated>2009-07-20T13:05:01.640-07:00</updated><title type='text'>FAT32</title><content type='html'>FAT32 is a terrible filesystem. Fat16 and 12 are ok because the FAT is small enough to fit in memory (max 128K) so that it can be fast. FAT32 FAT can be up to 256 MB in size, and cannot be fit in memory. Since FAT32 does not feature a free cluster bitmap, finding free clusters on a moderately-filled FS can be a big pain. My FAT32 driver attempts to optimize this by creating a compressed free-cluster bitmap in memory and fills it lazily as FAT sectors are read for general use. This means that the longer one uses a FAT32 volume, the faster file creation and writes get. This is a strict improvement over most other FAT32 drivers, which start slow ad remain slow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2284077884503894763?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2284077884503894763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2284077884503894763' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2284077884503894763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2284077884503894763'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/07/fat32_20.html' title='FAT32'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-3468654122432062999</id><published>2009-07-17T12:38:00.000-07:00</published><updated>2009-07-17T12:56:37.578-07:00</updated><title type='text'>General Project Status</title><content type='html'>I get asked a lot what the project status is, and when i can release a beta. First let me say that this question is rather pointless. No, not because I want to be cruel and keep it a secret. It's because I really do not know and have no way of knowing. I work on this in my free time, so while I can estimate the percentage completion of the project, I cannot estimate the time remaining because I do not have any hard time commitment to this project.&lt;br /&gt;&lt;br /&gt;That being said, it is also worthwhile to point out that normally a whole modern OS (even a simple one) is work for hundreds of engineers and a year or two of work, while I am just one guy and working in my free time.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;The heart of any OS is the kernel. It provides memory, scheduling, storage, and arbitration of other resources. DGOS kernel is written from the ground up by me over the last few months. IT provides full protected-memory processes with multitasking and support for multiple hardware storage and filesystem drivers. It has a plugin architecture, which functions in a way not unlike the way microsoft windows drivers work. The kernel works, and I do not forsee much more work in it coming up, since all new things will be loadable kernel plugins, and not work on the kernel itself. The kernel is written in C and arm assembly and is compiled by the metrowerks codewarrior compiler. All plugins have to be compiled by GCC. (There is no support in CodeWarrior to produce working plugins, though with enough effort, it can be done)&lt;br /&gt;&lt;br /&gt;Close to the kernel are the drivers. They provide various services and methods to work with hardware. DGOS kernel currently best supports the PXA270 processor (such as the one in a Palm LifeDrive). There are drivers for timers, real time clock, LCD, sound and touchscreen, the notification LEDs, the built-in hard disk, and the SD card. This, of course, leaves out WiFi, Bluetooth, and USB. Work on USB is ongoing, and WiFi and bluetooth will be done later or provided by PalmOS drivers wrapped in special DGOS wrappers (not unlike ndiswrapper does on linux). Currently written drivers are in the kernel, all future ones will be loadable plugins.&lt;br /&gt;&lt;br /&gt;Above the kernel sits RtLib. It's the userspace library that wraps the usually-strangely-called system calls into ARM-EABI compatible function calls, as well as providing basinc runtime services like heap management. You can read all about it in a recent post about RtLib =&gt; [&lt;a href="http://dgosblog.blogspot.com/2009/07/on-architecture-rtlib.html"&gt;here&lt;/a&gt;] &lt;=  . RtLib is still being written, but it already provides many useable things, and simple apps have run on top of it.&lt;br /&gt;&lt;br /&gt;Userspace apps run on top of RtLib and may use any number of other libraries, as they wish. Currently two uch libraries exist. The DGOS port of jpeglib (which is interesting in that it required no code changes and built form the original source just fine, and ran) and GfxLib (which is a simple library that currently provides abilities to draw rectangles, lines, circles, and a very very simple fixed-width font). In the future it will probably be expanded slightly, but in general it's expected to be the basic simple drawing library.&lt;br /&gt;&lt;br /&gt;The UI will be provided by UiLib, which still needs to be written. Luckily this is not a huge effort, since a lot of SkinUI code can (and will) be reused for it. &lt;br /&gt;&lt;br /&gt;PalmOS compatibility will be provided by an application whose job will be to &lt;ul&gt;&lt;li&gt;Provide a full R9-table of functions that NAtive PalmOS apps need&lt;/li&gt;&lt;li&gt;Host such apps and handle their hardware accesses in appropriate ways&lt;/li&gt;&lt;li&gt;Parse and access PalmOS's data structures on disk, so that PalmOS and DGOS can share PalmOS files(reboot into PalmOS and your datebook has the entries you just added in DGOS&lt;/li&gt;&lt;li&gt;Allow Palm's PACE to run, or implement DGOS's own version of PACE&lt;/li&gt;&lt;li&gt;Provide access to things like network and expansion cards&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Of course no OS is complete without its own userspace apps, and an SDK. The SDK is hard since putting one together is a monumental task. Luckily for DGOS this is not hard, since almost any linux library will run on DGOS is recompiled for it. Of course the UI toolkit will be different, BUT to PalmOS programmers the UI apiw ill be familiar and simple, so the SDK will be a mix of linux standard APIs and PalmOS UI apis, with a mix-in of user-requested features I choose to implement.&lt;br /&gt;&lt;br /&gt;So so summarize, the project is doing well, and there is a chance of a release of something of interest to developers (but likely not to final users yet) really soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-3468654122432062999?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/3468654122432062999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=3468654122432062999' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3468654122432062999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3468654122432062999'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/07/general-project-status.html' title='General Project Status'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-325405859721938128</id><published>2009-07-14T09:04:00.001-07:00</published><updated>2009-07-14T09:04:47.534-07:00</updated><title type='text'>FAT32</title><content type='html'>the fat32 library i had apparently is more worthless than i had imagined, and i had pointlessly spent time outfitting it with LFN support. Writing a new one now&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-325405859721938128?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/325405859721938128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=325405859721938128' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/325405859721938128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/325405859721938128'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/07/fat32.html' title='FAT32'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7454169164937269783</id><published>2009-07-13T22:40:00.000-07:00</published><updated>2009-07-13T22:55:32.472-07:00</updated><title type='text'>On Architecture: RtLib</title><content type='html'>RtLib is the main runtime library that all apps will dynamically link against. While it is technically possible to write a DGOS app that does not use RtLib, it's needlessly complicated and pointless(One would have to do manual heap management, manually initialize all libraries, manually get and parse app params, manually make systemcalls, and not use any delay-loaded dynamic libraries). It provides useful things like&lt;ul&gt;&lt;LI&gt;Runtime functions needed for support of float and double types (no need for each app to have a local copy and waste memory on it)&lt;/li&gt;&lt;LI&gt;Systemcall wrappers (like VfsFileOpen or GetCurTid)&lt;/li&gt;&lt;LI&gt;Memory management (like malloc, free, and realloc)&lt;/li&gt;&lt;LI&gt;Other commonly useful things (like CreateThread or CreateProcess)&lt;/li&gt;&lt;LI&gt;Manual library management(RtLibLibLoad, RtLibLibUnload, RtLibLibFindSym)&lt;/li&gt;&lt;LI&gt;Syncronization primitives (like mutexes, semaphores, mailboxes, events, and request queues)&lt;/li&gt;&lt;LI&gt;Startup code (init libraries, init heap, allow libraries to self-initialize, get app command and parameter block from the kernel, find main(), call main() )&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;It is currently my intention to make RtLib open source, just like all other non-kernel pieces of the OS.&lt;br /&gt;Just like all non-kernel components of the OS, RtLib is compiled using the arm-elf-gcc toolchain (I use version 4.2.3). As a sidenote, the kernel is compiled using CodeWarrior, but all loadable kernel modules will be written using GCC as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7454169164937269783?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7454169164937269783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7454169164937269783' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7454169164937269783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7454169164937269783'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/07/on-architecture-rtlib.html' title='On Architecture: RtLib'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-848569836463924949</id><published>2009-07-12T09:55:00.003-07:00</published><updated>2009-07-12T09:57:39.216-07:00</updated><title type='text'>Work Continues</title><content type='html'>I'm back from my vacation, and work goes on. Now will be doing some RtLib work for app startup.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-848569836463924949?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/848569836463924949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=848569836463924949' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/848569836463924949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/848569836463924949'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/07/work-continues.html' title='Work Continues'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-4655345632219971518</id><published>2009-06-25T02:06:00.001-07:00</published><updated>2009-06-25T02:06:29.523-07:00</updated><title type='text'>Module Loader.3</title><content type='html'>Unloading stuff works too :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-4655345632219971518?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/4655345632219971518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=4655345632219971518' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4655345632219971518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4655345632219971518'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/module-loader3.html' title='Module Loader.3'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8210246609348161451</id><published>2009-06-24T01:35:00.000-07:00</published><updated>2009-06-24T01:41:03.661-07:00</updated><title type='text'>Module Loader.2</title><content type='html'>Just did some testing and bug fixing. Module loader works as expected. Here's some technical info.&lt;br /&gt;&lt;br /&gt;Each process has a list of loaded modules in it, including a reference count. When module A depends on module B, and A is loaded B is loaded automatically. If it was already a loaded (perhaps an already-loaded module C depended on it), its reference count gets incremented. This all assures that when all modules depending on a certain module are unloaded, it can as well be unloaded, so as to free up the address space it takes up. The per-process module list is just a linked list, containing base address, module name (not path), and a pointer to the system-global list.&lt;br /&gt;&lt;br /&gt;The system-global module list is what enables memory sharing of code and read-only data between processes loading the same module. It is a hashtable, indexed by a hash of the PATH of  the module. This means that process A can load library A version X from path Y ad process B can load library A version Z from path T and they will not collide. The global table entries also have reference count, but this is per-process. This means that if 2 processes load module A, it's ref count in global table will be 2. If one process loads the module 5 times, the global reference count will still be 1. In any case the point is that when no more processes have a module loaded, we can evict it from memory, and free it up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8210246609348161451?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8210246609348161451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8210246609348161451' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8210246609348161451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8210246609348161451'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/module-loader2.html' title='Module Loader.2'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7825239312538435551</id><published>2009-06-23T13:59:00.000-07:00</published><updated>2009-06-23T14:00:43.578-07:00</updated><title type='text'>Module Loader</title><content type='html'>Module loader appears to be complete. It now shared code and rodata pages between processes, and r/w data is shared using COW pages. This significantly reduces use of physical memory and is thus good. Now work moves on to testing this, and then to pagefile code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7825239312538435551?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7825239312538435551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7825239312538435551' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7825239312538435551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7825239312538435551'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/module-loader.html' title='Module Loader'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2967473304894598306</id><published>2009-06-22T00:01:00.001-07:00</published><updated>2009-06-22T00:02:14.594-07:00</updated><title type='text'>COW &amp; memory sharing</title><content type='html'>COW(copy on write) memory has been implemented, and I am 90% of the way there to implement code &amp; data sharing between processes that load the same modules (thus saving valuable physical memory)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2967473304894598306?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2967473304894598306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2967473304894598306' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2967473304894598306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2967473304894598306'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/cow-memory-sharing.html' title='COW &amp; memory sharing'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2153013872400096161</id><published>2009-06-20T02:09:00.000-07:00</published><updated>2009-06-20T02:10:15.579-07:00</updated><title type='text'>Sector Cache</title><content type='html'>A simple sector cache has been added for block devices, causing a great increase in I/O throughput. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2153013872400096161?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2153013872400096161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2153013872400096161' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2153013872400096161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2153013872400096161'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/sector-cache.html' title='Sector Cache'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5383302217067757598</id><published>2009-06-17T12:43:00.000-07:00</published><updated>2009-06-17T12:44:27.532-07:00</updated><title type='text'>Debugging &amp; USB</title><content type='html'>To help me debug userspace apps, the kernel has a builtin GDB stub, that allows debugging of any app on the device using the serial port. Unfortunately my PC has no serial port and I have no USBtoSerial adapters, so I am now writing the USB driver code, so that I can debug using USB.&lt;br /&gt;&lt;br /&gt;This should be a useful tool for all other developers too, of course.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5383302217067757598?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5383302217067757598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5383302217067757598' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5383302217067757598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5383302217067757598'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/debugging-usb.html' title='Debugging &amp; USB'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7755630555170217815</id><published>2009-06-12T01:15:00.000-07:00</published><updated>2009-06-12T01:16:08.948-07:00</updated><title type='text'>IT WORKS!!!</title><content type='html'>The kernel can now load libraries and executables, which can link dynamically to each other.&lt;br /&gt;&lt;br /&gt;This works as expected! This is a huge step, and now work on RtLib resumes&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7755630555170217815?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7755630555170217815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7755630555170217815' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7755630555170217815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7755630555170217815'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/it-works.html' title='IT WORKS!!!'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8709695393635142209</id><published>2009-06-11T15:28:00.000-07:00</published><updated>2009-06-11T15:30:00.616-07:00</updated><title type='text'>ElfLoader works!</title><content type='html'>May the man who created the Arm version of the Elf standard burn in hell! But despite his best efforts at creating the most convoluted and impossible to load binary format in the world I have written a loader for it. So far the loader can load and relocate an executable and any shared libraries it needs, including function calls between them!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8709695393635142209?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8709695393635142209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8709695393635142209' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8709695393635142209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8709695393635142209'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/elfloader-works.html' title='ElfLoader works!'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5534731621865982933</id><published>2009-06-08T13:00:00.001-07:00</published><updated>2009-06-08T13:01:11.663-07:00</updated><title type='text'>ELF.3</title><content type='html'>The elf loader is well on track, and the continuing work on it has helped uncover some bugs in the VAD code (which upon closer inspection were bugs in the AVL tree code that is the storage for the VAD tree)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5534731621865982933?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5534731621865982933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5534731621865982933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5534731621865982933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5534731621865982933'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/elf3.html' title='ELF.3'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5806931756903829540</id><published>2009-06-05T23:24:00.000-07:00</published><updated>2009-06-05T23:26:40.212-07:00</updated><title type='text'>ELF.2</title><content type='html'>After spending more than 20 hours trying to do a build of gcc crosscompiler. Nothing worked. After a LOT of work, i managed to build gcc/gdb for target arm-elf, host linux-i686.&lt;br /&gt;&lt;br /&gt;Now continuing work on the DGOS elf loader...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5806931756903829540?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5806931756903829540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5806931756903829540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5806931756903829540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5806931756903829540'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/elf2.html' title='ELF.2'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-1882351275293918363</id><published>2009-06-05T00:57:00.000-07:00</published><updated>2009-06-05T00:58:21.195-07:00</updated><title type='text'>ELF</title><content type='html'>I implementing an ELF loader for the kernel. This will allow usage of unmodified arm-elf-gcc to make DGOS apps, libraries, and kernel modules.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-1882351275293918363?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/1882351275293918363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=1882351275293918363' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1882351275293918363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1882351275293918363'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/elf.html' title='ELF'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7299595655318158985</id><published>2009-06-04T01:03:00.001-07:00</published><updated>2009-06-04T01:03:50.535-07:00</updated><title type='text'>RtLib</title><content type='html'>RtLib got a lot of work done on it, it now loads to the init process, as expected, and heap management as well as thread management work well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7299595655318158985?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7299595655318158985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7299595655318158985' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7299595655318158985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7299595655318158985'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/rtlib.html' title='RtLib'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-3341954935158223642</id><published>2009-06-02T02:12:00.000-07:00</published><updated>2009-06-02T02:14:18.073-07:00</updated><title type='text'>Block Devices, PartitionManager, Loadable FSs/BlockDeviceDrivers</title><content type='html'>Block device manager got a few fixes and improvements, including ability to notify many clients about addition/removal of devices.&lt;br /&gt;&lt;br /&gt;Parititon manager was separated out from VFS code and is now a separate component. This makes it easier to use.&lt;br /&gt;&lt;br /&gt;Block device drivers and filesystems can now be implemented as loadable kernel modules, which can make future support of other FSs and devices easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-3341954935158223642?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/3341954935158223642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=3341954935158223642' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3341954935158223642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3341954935158223642'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/06/block-devices-partitionmanager-loadable.html' title='Block Devices, PartitionManager, Loadable FSs/BlockDeviceDrivers'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8857902078188772983</id><published>2009-05-31T00:00:00.001-07:00</published><updated>2009-05-31T01:17:49.096-07:00</updated><title type='text'>VADs, stack guards, signals, libraries</title><content type='html'>VADs are now working, this means that pagefaults can now be sorted based on cause and handled thusly. Thereforw non-committed stacks now work, stack guards work, and user processes are notified of pagefaults and are given a chance to handle them.&lt;br /&gt;&lt;br /&gt;Also some more work was done on library support, and unloading now works too, as well ask keeping track of all such actions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8857902078188772983?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8857902078188772983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8857902078188772983' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8857902078188772983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8857902078188772983'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/05/vads-stack-guards-signals.html' title='VADs, stack guards, signals, libraries'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5474455080294413857</id><published>2009-05-29T09:18:00.000-07:00</published><updated>2009-05-29T09:19:31.061-07:00</updated><title type='text'>usrCallback</title><content type='html'>usrCallback module was just added to the kernel. It allows the kernel to call a function in a user app and get back some results, just like a normal callback, but while respecting all kernel-user boundaries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5474455080294413857?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5474455080294413857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5474455080294413857' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5474455080294413857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5474455080294413857'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/05/usrcallback.html' title='usrCallback'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-3474925049281903647</id><published>2009-05-29T00:53:00.000-07:00</published><updated>2009-05-29T00:54:15.532-07:00</updated><title type='text'>DBF update2</title><content type='html'>RtLib is now a DBF library and loads well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-3474925049281903647?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/3474925049281903647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=3474925049281903647' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3474925049281903647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/3474925049281903647'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/05/dbf-update2.html' title='DBF update2'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6121852495963868697</id><published>2009-05-28T02:03:00.001-07:00</published><updated>2009-05-28T02:05:14.775-07:00</updated><title type='text'>DBF format and loader</title><content type='html'>DBF is the binary format used by DGOS. It is simple, and almost any ARM compiler cna be made to emit it. It allows for libraries and executables that may or may not be compiler as position-independent code. All libraries and applications always have read-write access to their globals, and code is write-protected, as any good OS should so.&lt;br /&gt;&lt;br /&gt;The kernel DBF loader code is now written and works.&lt;br /&gt;RtLib work is proceeding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6121852495963868697?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6121852495963868697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6121852495963868697' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6121852495963868697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6121852495963868697'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/05/dbf-format-and-loader.html' title='DBF format and loader'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-4904019792514922010</id><published>2009-05-27T00:55:00.000-07:00</published><updated>2009-05-27T13:02:24.922-07:00</updated><title type='text'>Kernel fixes</title><content type='html'>A few kernel bugs were fixed (a serious kernel stack corruption by a stray DMA was a fun one to track down).&lt;br /&gt;&lt;br /&gt;The SD/SDHC/SDXC/MMC driver in the kernel now works very well, and integrated with the block device manager and the FS manager gladly mounts volumes on it.&lt;br /&gt;&lt;br /&gt;Now back to working on RtLib&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[also the GDB stub in kernel is almost complete, so debugging RtLib and user apps will be nice and easy]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-4904019792514922010?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/4904019792514922010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=4904019792514922010' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4904019792514922010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4904019792514922010'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/05/kernel-fixes.html' title='Kernel fixes'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-9019740156759396742</id><published>2009-04-16T01:52:00.001-07:00</published><updated>2009-04-16T01:53:00.662-07:00</updated><title type='text'>AC97.2</title><content type='html'>Touchscreen works very well using the new DMA driver for AC97&lt;br /&gt;&lt;br /&gt;in fact it can even distinguish between stylus and finger press :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-9019740156759396742?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/9019740156759396742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=9019740156759396742' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/9019740156759396742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/9019740156759396742'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/04/ac972.html' title='AC97.2'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-1027350025303407944</id><published>2009-04-13T01:59:00.000-07:00</published><updated>2009-04-13T13:41:39.661-07:00</updated><title type='text'>AC97</title><content type='html'>Got AC97 to work with DMA, so now audio works, and touchscreen data is sent to the memory without CPU involvement :). Calibration works well, and the pressure-sensitivity of the panel is used too, so instead of the plain boring (X,Y) coordinates, DGOS provides (X,Y and Z) Where Z is the force user is applying to the touchscreen. It can be used for better flow in note-taking applications for example, or for sensing finger presses for gesture analysis [finger generates bigger Z values]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-1027350025303407944?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/1027350025303407944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=1027350025303407944' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1027350025303407944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1027350025303407944'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/04/ac97.html' title='AC97'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-7689625247538027765</id><published>2009-03-11T16:09:00.001-07:00</published><updated>2009-03-11T16:09:57.627-07:00</updated><title type='text'>Sorry for the delays</title><content type='html'>Sorry for the delays&lt;br /&gt;&lt;br /&gt;I will now dedicate a lot more time to DGOS. I also welcome any and all developers who would like to help with this effort. If you would like to help, please email me at dmitrygr@gmail.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-7689625247538027765?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/7689625247538027765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=7689625247538027765' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7689625247538027765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/7689625247538027765'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/03/sorry-for-delays.html' title='Sorry for the delays'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-4012702316738314726</id><published>2009-02-10T17:50:00.001-08:00</published><updated>2009-02-10T17:50:44.317-08:00</updated><title type='text'>Updates</title><content type='html'>Had a lot less time lately thanks to my work and a new hobby (rc airplanes)&lt;br /&gt;&lt;br /&gt;Some work was done still. VFS is working and stable. Init code is being made&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-4012702316738314726?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/4012702316738314726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=4012702316738314726' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4012702316738314726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/4012702316738314726'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2009/02/updates.html' title='Updates'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2488951619964403853</id><published>2008-12-09T00:57:00.000-08:00</published><updated>2008-12-09T01:03:27.029-08:00</updated><title type='text'>FAT VFS library is mostly done</title><content type='html'>FAT VFS library is mostly done, and of course supports things that lack in PalmOS like correct size reporting for big volumes and file moving without a need to copy it and then delete the original (it supports FAT-only move). Also kernel threads can now easily call VFS functions directly, just like user level threads. Block device layer has received an update, and now has DlkDevV2-compliant drivers for SDHC cards, lifedrive built-in HDD, and TX's and T5's built-in NAND flash.&lt;br /&gt;&lt;br /&gt;Work has started on RtLib rewrite. RtLib is the runtime library that all DGOS applications and Subsystems load by default. It provides user-level callable interfaces to kernel functions (things like VFS, Thread manipulation, etc). All &lt;b&gt;native&lt;/b&gt; DGOS apps will use functions in RtLib to do what they do, and all PalmOS apps wil lcall native PalmOS api, which will be directed to PSS (PalmSubSystem) which then translates the parameters to what RtLib uses, and calls RtLib. This way the programmers who choose to code for DGOS directly do not have to be tied to PalmOS's archaic API structure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2488951619964403853?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2488951619964403853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2488951619964403853' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2488951619964403853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2488951619964403853'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2008/12/fat-vfs-library-is-mostly-done.html' title='FAT VFS library is mostly done'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-6155621290626485341</id><published>2008-11-18T23:33:00.000-08:00</published><updated>2008-11-18T23:41:33.491-08:00</updated><title type='text'>On filesystems</title><content type='html'>Some PalmOS thigns will not work on DGOS. Specifically I am talking about SlotDrivers and FsLibs. Why? Specifically because:&lt;UL&gt;&lt;LI&gt;In DGOS, for efficiency reasons, the driver model is differet from PalmOS&lt;/LI&gt;&lt;LI&gt;Drivers are in kernel space in DGOS, so they can make very quick system calls, and admitting any PalmOS code into kernel space is a bad idea because it was never written to be even thread safe&lt;/LI&gt;&lt;LI&gt;Porting an existing driver to DGOS is not hard&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;Filesystems are created as a kernel module, and register themselves with the DGOS kernel using the &lt;U&gt;vfsRegisterFs&lt;/U&gt;() function, which takes, as a parameter, a pointer to a &lt;U&gt;VfsFS&lt;/U&gt; structure. This structure is a table of function pointers and an FS name.&lt;br /&gt;&lt;br /&gt;The module provides this, and from then on, until it is unregistered using &lt;U&gt;vfsUnregisterFs&lt;/U&gt;(), it can be used to mount and format filesystems.&lt;br /&gt;&lt;br /&gt;Here it is in details:&lt;br /&gt;&lt;br /&gt;&lt;div style="border:solid black 1px; width:600px; overflow:auto; font-size:12px"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;#define VFS_OPEN_MODE_READ                  1&lt;br /&gt;#define VFS_OPEN_MODE_RW                    2&lt;br /&gt;#define VFS_OPEN_MODE_EXCLUSIVE             4&lt;br /&gt;&lt;br /&gt;#define VFS_SEEK_SET                        0&lt;br /&gt;#define VFS_SEEK_CUR                        1&lt;br /&gt;#define VFS_SEEK_END                        2&lt;br /&gt;&lt;br /&gt;#define FILE_ATTR_HIDDEN                    0x00000001&lt;br /&gt;#define FILE_ATTR_SYSTEM                    0x00000002&lt;br /&gt;#define FILE_ATTR_READONLY                  0x00000004&lt;br /&gt;#define FILE_ATTR_ARCHIVE                   0x00000008&lt;br /&gt;&lt;br /&gt;#define VFS_FS_NAME_SZ                      16&lt;br /&gt;&lt;br /&gt;typedef Err (*VfsVolInitFn)        (void** fsData);&lt;br /&gt;typedef Err (*VfsVolDeinitFn)      (void* fsData);&lt;br /&gt;&lt;br /&gt;typedef Err (*VfsFsMountFn)        (void* fsData,UInt32 blkDev);&lt;br /&gt;typedef Err (*VfsFsUnmountFn)      (void* fsData);&lt;br /&gt;typedef Err (*VfsFsSizesFn)        (void* fsData,UInt64* free,UInt64* used,UInt64* total);    //in bytes&lt;br /&gt;typedef Err (*VfsFsInfoFn)         (void* fsData,VfsFsInfo* info);&lt;br /&gt;typedef Err (*VfsFsCreate)         (void* fsData,UInt32 blkDev);&lt;br /&gt;typedef Err (*VfsFsGetLabel)       (void* fsData,wchar_t* label,UInt32* size /* in / out */);&lt;br /&gt;typedef Err (*VfsFsSetLabel)       (void* fsData,const wchar_t* label);&lt;br /&gt;&lt;br /&gt;typedef Err (*VfsFileCreateFn)     (void* fsData,const wchar_t* path);&lt;br /&gt;typedef Err (*VfsFileDeleteFn)     (void* fsData,const wchar_t* path);&lt;br /&gt;typedef Err (*VfsFileRenameFn)     (void* fsData,const wchar_t* oldPath,const wchar_t* newPath);        //MUST handle moving files too, not just renaming&lt;br /&gt;&lt;br /&gt;typedef Err (*VfsFileOpenFn)       (void* fsData,const wchar_t* path,UInt32 mode,void** openFileData);&lt;br /&gt;typedef Err (*VfsFileCloseFn)      (void* fsData,void* openFileData);&lt;br /&gt;typedef Err (*VfsFileReadFn)       (void* fsData,void* openFileData,void* buf,UInt32 bytes,UInt32* done);&lt;br /&gt;typedef Err (*VfsFileWriteFn)      (void* fsData,void* openFileData,const void* buf,UInt32 bytes,UInt32* done);&lt;br /&gt;typedef Err (*VfsFileSeekFn)       (void* fsData,void* openFileData,UInt32 whence,Int32 offset);&lt;br /&gt;typedef Err (*VfsFileTellFn)       (void* fsData,void* openFileData,UInt32* position);&lt;br /&gt;typedef Err (*VfsFileGetAttrFn)    (void* fsData,void* openFileData,UInt32* attr);&lt;br /&gt;typedef Err (*VfsFileSetAttrFn)    (void* fsData,void* openFileData,UInt32 attr);&lt;br /&gt;typedef Err (*VfsFileGetDateFn)    (void* fsData,void* openFileData,UInt32* create,UInt32* mod,UInt32* access);    //null to not get&lt;br /&gt;typedef Err (*VfsFileSetDateFn)    (void* fsData,void* openFileData,UInt32* create,UInt32* mod,UInt32* access);    //null to not set&lt;br /&gt;typedef Err (*VfsFileGetSizeFn)    (void* fsData,void* openFileData,UInt32* sz);&lt;br /&gt;typedef Err (*VfsFileSetSizeFn)    (void* fsData,void* openFileData,UInt32 sz);&lt;br /&gt;&lt;br /&gt;typedef Err (*VfsDirCreateFn)      (void* fsData,const wchar_t* path);&lt;br /&gt;typedef Err (*VfsDirDeleteFn)      (void* fsData,const wchar_t* path);&lt;br /&gt;typedef Err (*VfsDirOpenFn)        (void* fsData,const wchar_t* path,void** openDirData);&lt;br /&gt;typedef Err (*VfsDirCloseFn)       (void* fsData,void* openDirData);&lt;br /&gt;typedef Err (*VfsDirEnumeFn)       (void* fsData,void* openDirData,UInt32* iterator,VfsDirEntry* entry);&lt;br /&gt;&lt;br /&gt;typedef struct{&lt;br /&gt;    &lt;br /&gt;    wchar_t                 fsName[VFS_FS_NAME_SZ];&lt;br /&gt;    &lt;br /&gt;    //vol ops&lt;br /&gt;    VfsVolInitFn            volInit;&lt;br /&gt;    VfsVolDeinitFn          volDeinit;&lt;br /&gt;    &lt;br /&gt;    //FS ops&lt;br /&gt;    VfsFsMountFn            fsMount;&lt;br /&gt;    VfsFsUnmountFn          fsUnmount;&lt;br /&gt;    VfsFsSizesFn            fsSizes;        //used,free,total&lt;br /&gt;    VfsFsInfoFn             fsInfo;&lt;br /&gt;    VfsFsCreate             fsCreate;       //format a disk&lt;br /&gt;    VfsFsGetLabel           fsGetLabel;&lt;br /&gt;    VfsFsSetLabel           fsSetLabel;&lt;br /&gt;    &lt;br /&gt;    //ops on unopened files&lt;br /&gt;    VfsFileCreateFn         fileCreate;&lt;br /&gt;    VfsFileDeleteFn         fileDelete;&lt;br /&gt;    VfsFileRenameFn         fileRename;&lt;br /&gt;    &lt;br /&gt;    //ops on opened files&lt;br /&gt;    VfsFileOpenFn           fileOpen;&lt;br /&gt;    VfsFileCloseFn          fileClose;&lt;br /&gt;    VfsFileReadFn           fileRead;&lt;br /&gt;    VfsFileWriteFn          fileWrite;&lt;br /&gt;    VfsFileSeekFn           fileSeek;&lt;br /&gt;    VfsFileTellFn           fileTell;&lt;br /&gt;    VfsFileGetAttrFn        fileGetAttr;&lt;br /&gt;    VfsFileSetAttrFn        fileSetAttr;&lt;br /&gt;    VfsFileGetDateFn        fileGetDates;&lt;br /&gt;    VfsFileSetDateFn        fileSetDates;&lt;br /&gt;    VfsFileGetSizeFn        fileGetSize;&lt;br /&gt;    VfsFileSetSizeFn        fileSetSize;    //resize&lt;br /&gt;    &lt;br /&gt;    //ops on unopened dirs&lt;br /&gt;    VfsDirCreateFn          dirCreate;&lt;br /&gt;    VfsDirDeleteFn          dirDelete;&lt;br /&gt;    &lt;br /&gt;    //open on open dirs&lt;br /&gt;    VfsDirOpenFn            dirOpen;&lt;br /&gt;    VfsDirCloseFn           dirClose;&lt;br /&gt;    VfsDirEnumeFn           dirEnumerate;&lt;br /&gt;    &lt;br /&gt;}VfsFS;&lt;/PRE&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-6155621290626485341?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/6155621290626485341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=6155621290626485341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6155621290626485341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/6155621290626485341'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2008/11/on-filesystems.html' title='On filesystems'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-2396329874178941262</id><published>2008-11-12T01:18:00.000-08:00</published><updated>2008-11-12T01:25:21.412-08:00</updated><title type='text'>On the current bootloader and the boot process</title><content type='html'>The current bootloader is a hack on top of the PalmPowerups bootloader as used in PowerDrive. Booting while holding down the [home] key enters it, and it waits for a FAT32-formatted card [FAT12 and 16 NOT supported] card to be inserted containing a file called "kernel" in its root folder. The reason for lack of support for FAT12 and FAT16 is that the bootloader is NOT using my FAT driver, but in fact another one, under BSD license, which only supports FAT32 (and barely so).&lt;br /&gt;&lt;br /&gt;After th ekernel is loaded from card into ram, the bootloader jumps to it.&lt;br /&gt;&lt;br /&gt;The kernel copies itself to a known location in ram (the start of physical ram) and jumps to itself there. Once there it enables the MMU, and caches, and sets up the memory map for itself. Kernel space on DGOS begins at 0xE0000000. All lower addresses are available for use by user applications. This will allow a lot of PalmOS apps to run unmodified, that rely on memory addresses like 0x8xxxxxxx and 0xACxxxxxx being available to them.&lt;br /&gt;&lt;br /&gt;Once the memory space is all setup, the LCD driver re-initializes the LCD (which has been on this entire time). LCD is initialized very early to enable printing debug messages to it. After that other peripherals are brought up, like LifeDrive's internal HDD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-2396329874178941262?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/2396329874178941262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=2396329874178941262' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2396329874178941262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/2396329874178941262'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2008/11/on-current-bootloader-and-boot-process.html' title='On the current bootloader and the boot process'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-5171801532786585775</id><published>2008-11-12T01:15:00.000-08:00</published><updated>2008-11-12T01:17:44.900-08:00</updated><title type='text'>A few more pieces</title><content type='html'>The kernel rewrite is going well.&lt;br /&gt;&lt;br /&gt;Finished the block device manager and cache.&lt;br /&gt;The RTC driver is working as well (smallest driver in the whole OS)&lt;br /&gt;The FAT32 driver is also shaping up quite well.&lt;br /&gt;The module manager is up and running, and thus all drivers are now separate modules (with the exception of the SDHC and the FAT32 drivers, since they are needed to read the card and thus to load further modules. This requirement will eventually go away, as the bootloader will be modified to load the default block device and default filesystem drivers into ram by itself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-5171801532786585775?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/5171801532786585775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=5171801532786585775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5171801532786585775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/5171801532786585775'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2008/11/few-more-pieces.html' title='A few more pieces'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-1826055030539368882</id><published>2008-11-09T14:27:00.000-08:00</published><updated>2008-11-09T14:29:06.692-08:00</updated><title type='text'>Unicode</title><content type='html'>System string and locale manager has been rewritten to sully support unicode. All applications will thus support unicode by default, without any need for additional code by the programmer. For legacy apps (like PalmOS) a default encoding will need to be specified since they use 8-bit characters.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-1826055030539368882?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/1826055030539368882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=1826055030539368882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1826055030539368882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/1826055030539368882'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2008/11/unicode.html' title='Unicode'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-16653408549656490</id><published>2008-11-09T01:43:00.001-08:00</published><updated>2008-11-09T01:43:42.619-08:00</updated><title type='text'>filesystems</title><content type='html'>i am working on implementing FAT12/16/32/exFAT support working now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-16653408549656490?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/16653408549656490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=16653408549656490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/16653408549656490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/16653408549656490'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2008/11/filesystems.html' title='filesystems'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1960834595462451398.post-8575766776519361192</id><published>2008-11-02T13:55:00.000-08:00</published><updated>2008-11-02T14:17:30.628-08:00</updated><title type='text'>DGOS blog</title><content type='html'>This blog will follow the creation of DGOS. My operating system for mobile devices. It is currently being developed on a Palm LifeDrive. I will post here interesting pieces of code, ideas, or design decisions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today's post shows how easy it is to drive device drivers in DGOS. This is the COMPLETE source code for the hard drive driver in the LD. Note a complete lack of synchronization primitives, or anything else. The OS handles that for the driver.&lt;br /&gt;&lt;br /&gt;Note that the only entry point into the driver is "hddInit"&lt;br /&gt;Requests and responses are handled by the "requestQ" primitive. It is smart, blocking the driver thread while waiting for requests and blocking requesting threads while waiting for responses. While this driver is single-threaded, multithreaded drivers can use it too, since this primitive is thread-safe.&lt;br /&gt;&lt;br /&gt;&lt;div style="border:solid black 1px; width:600px; overflow:auto; font-size:12px"&gt;&lt;pre&gt;#include "HDD.h"&lt;br /&gt;#include "task.h"&lt;br /&gt;#include "blockDev.h"&lt;br /&gt;#include "requestQ.h"&lt;br /&gt;#include "kHeap.h"&lt;br /&gt;#include "timers.h"&lt;br /&gt;#include "gpio.h"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define MCIO0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map[14])&lt;br /&gt;#define MECR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map[ 5])&lt;br /&gt;&lt;br /&gt;typedef struct{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blkDevID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reqQID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;manuf[32];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prod[32];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial[32];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numBlocks;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}HddGlobals;&lt;br /&gt;&lt;br /&gt;typedef struct{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8 err_or_features;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//addr = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8 numSectors;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//addr = 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8 lba_0_7;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//addr = 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8 lba_8_15;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//addr = 4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8 lba_16_23;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//addr = 5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8 lba_24_31;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//addr = 6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8 status_or_cmd;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//addr = 7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}HddCmd;&lt;br /&gt;&lt;br /&gt;static void hddPrvReadSec(volatile void* base,UInt8* buf);&lt;br /&gt;static void hddPrvWriteSec(volatile void* base,UInt8* buf);&lt;br /&gt;&lt;br /&gt;static Err hddPrvWaitForDriveReady(volatile void* hddBase){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* statusField = ((volatile UInt8*)hddBase) + 0x17;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* errField &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= ((volatile UInt8*)hddBase) + 0x11;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 t,v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = timersGetTicks();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v = *statusField;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(v == 0x50){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//ready&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return errNone;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}while(timersGetTicks() - t &lt; timersTicksPerMsec() * 500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0xFF00 + *errField;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static Err hddPrvWaitForNotBusy(volatile void* hddBase){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* statusField = ((volatile UInt8*)hddBase) + 0x17;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* errField &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= ((volatile UInt8*)hddBase) + 0x11;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 t,v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = timersGetTicks();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v = *statusField;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(v &amp; 0x80){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//busy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(v &amp; 1){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return errNone;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}while(timersGetTicks() - t &lt; timersTicksPerMsec() * 500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0xFF00 + *errField;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static Err hddPrvWaitForReadyForData(volatile void* hddBase){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* statusField = ((volatile UInt8*)hddBase) + 0x17;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* errField &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= ((volatile UInt8*)hddBase) + 0x11;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 t,v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = timersGetTicks();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v = *statusField;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!(v &amp; 0x08)){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//not ready for dat&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(v &amp; 1){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return errNone;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}while(timersGetTicks() - t &lt; timersTicksPerMsec() * 1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0xFF00 + *errField;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static Err hddPrvCmd(volatile void* hddBase,HddCmd* cmd){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* p = hddBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForDriveReady(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) return e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x11] = cmd-&gt;err_or_features;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x12] = cmd-&gt;numSectors;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x13] = cmd-&gt;lba_0_7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x14] = cmd-&gt;lba_8_15;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x15] = cmd-&gt;lba_16_23;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x16] = cmd-&gt;lba_24_31;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x17] = cmd-&gt;status_or_cmd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForNotBusy(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;err_or_features &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x11];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;numSectors&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x12];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_0_7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x13];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_8_15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x14];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_16_23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x15];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_24_31&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x16];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;status_or_cmd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x17];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return e;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static Err hddPrvCmd_read(volatile void* hddBase,HddCmd* cmd,UInt32 numSectors,UInt8* buf){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* p = hddBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForDriveReady(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) return e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x11] = cmd-&gt;err_or_features;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x12] = cmd-&gt;numSectors;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x13] = cmd-&gt;lba_0_7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x14] = cmd-&gt;lba_8_15;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x15] = cmd-&gt;lba_16_23;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x16] = cmd-&gt;lba_24_31;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x17] = cmd-&gt;status_or_cmd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(numSectors--){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForNotBusy(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForReadyForData(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddPrvReadSec(hddBase,buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf += 512;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;err_or_features &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x11];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;numSectors&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x12];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_0_7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x13];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_8_15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x14];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_16_23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x15];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_24_31&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x16];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;status_or_cmd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x17];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return e;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static Err hddPrvCmd_write(volatile void* hddBase,HddCmd* cmd,UInt32 numSectors,UInt8* buf){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt8* p = hddBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForDriveReady(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) return e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x11] = cmd-&gt;err_or_features;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x12] = cmd-&gt;numSectors;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x13] = cmd-&gt;lba_0_7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x14] = cmd-&gt;lba_8_15;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x15] = cmd-&gt;lba_16_23;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x16] = cmd-&gt;lba_24_31;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[0x17] = cmd-&gt;status_or_cmd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(numSectors--){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForNotBusy(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvWaitForReadyForData(hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddPrvWriteSec(hddBase,(UInt8*)buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf += 512;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;err_or_features &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x11];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;numSectors&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x12];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_0_7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x13];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_8_15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x14];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_16_23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x15];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;lba_24_31&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x16];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd-&gt;status_or_cmd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= p[0x17];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return e;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//MemMove that also does a byteswap16() on each moved halfword. Useful since device identification strings are byte-swapped in response.&lt;br /&gt;static asm memSwapCopy(void* dstP,void* srcP,UInt32 len){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//only even lengths please&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV R2,R2,LSR #1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;loop:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRB R3, [R1],#1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRB R12,[R1],#1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRB R3, [R0,#1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRB R12,[R0],#2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SUBS R2,R2,#1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BNE  loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BX   LR&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Err hddPrvReadDriveID(HddGlobals* g){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HddCmd cmd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 bufP[128];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8* buf = (UInt8*)bufP;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.lba_24_31 = 0xE0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.status_or_cmd = 0xEC;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//drive identify [OPTIONAL cmd]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = hddPrvCmd_read(g-&gt;hddBase,&amp;cmd,1,buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e) return e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemSet(g-&gt;serial,sizeof(g-&gt;serial),0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memSwapCopy(g-&gt;serial,buf + 20,20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemSet(g-&gt;manuf,sizeof(g-&gt;manuf),0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memSwapCopy(g-&gt;manuf,buf + 46,8);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemSet(g-&gt;prod,sizeof(g-&gt;prod),0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memSwapCopy(g-&gt;prod,buf + 54,31);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g-&gt;numBlocks = *(UInt32*)(buf + 120);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return errNone;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void hddPrvDrivePower(Boolean on){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpioSetState(115,on);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void hddPrvDriveReset(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpioSetState(98,false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taskDelay(taskGetCurTask(),2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpioSetState(98,true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void hddPrvDriveInit(HddGlobals* g){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddPrvDrivePower(true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taskDelay(taskGetCurTask(),2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddPrvDriveReset();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taskDelay(taskGetCurTask(),20);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddPrvReadDriveID(g);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static Err hddReadWriteBlocks(HddGlobals* g,UInt32 first,UInt32 num,void* bufP,UInt32* numDone,Boolean write){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err (*func)(volatile void* hddBase,HddCmd* cmd,UInt32 numSectors,UInt8* buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 numSec,done = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt8* buf = bufP;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HddCmd cmd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func = write?hddPrvCmd_write:hddPrvCmd_read;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(((UInt32)bufP) &amp; 3) Panic("non-word aligned buffer address");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(num){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numSec = num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(numSec &gt; 255) numSec = 255;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.status_or_cmd = write?0x30:0x20;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.lba_0_7 = first;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.lba_8_15 = first &gt;&gt; 8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.lba_16_23 = first &gt;&gt; 16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.lba_24_31 = (first &gt;&gt; 24) | 0xE0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.numSectors = numSec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.err_or_features = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = func(g-&gt;hddBase,&amp;cmd,numSec,buf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(e){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*numDone = done;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return e;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf += 512 * numSec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num -= numSec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return errNone;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void hddPrvIfaceInit(HddGlobals* g){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt32* map;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map = mmuMapReq(true,0x48000000,1,MAP_PERM_SYS_RW);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(map == MMU_INVALID_PTR) Panic("Cannot map in memory controller");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MCIO0 = 0x1460D;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MECR &amp;=~ 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//no PC-cars inserted&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MECR |= 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//two PC-card slots&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MECR |= 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//PC-card(s) inserted&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mmuMapRel((void*)map,1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpioSetFunc(115,0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpioSetDir(115,GPIO_DIR_OUT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpioSetFunc(98,0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gpioSetDir(98,GPIO_DIR_OUT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void* hddPrvThread(void* gP){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HddGlobals* g = gP;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BlkDevCmd* c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 devID,reqQID,reqH;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char* buf;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 theirMemH;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blkDevCreate("Internal HDD",&amp;devID,&amp;reqQID);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g-&gt;blkDevID = devID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g-&gt;reqQID = reqQID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddPrvIfaceInit(g);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddPrvDriveInit(g);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(1){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charsPrintF("getting request\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;requestQserviceGet(taskGetCurTask(),reqQID,&amp;reqH,(void**)&amp;c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charsPrintF("request gotten\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charsPrintF("cmd=%d\n",c-&gt;cmd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c-&gt;error = errNone;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch(c-&gt;cmd){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case CMD_READ_BLOCKS:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf = taskMapInTheirMem(c-&gt;data.blocks.requestingProcess,c-&gt;data.blocks.buffer,c-&gt;data.blocks.numBlocks * 512,&amp;theirMemH);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blkDevNotifyOp(devID,true,false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c-&gt;error = hddReadWriteBlocks(g,c-&gt;data.blocks.firstBlock,c-&gt;data.blocks.numBlocks,buf,&amp;c-&gt;data.blocks.numBlocks,false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blkDevNotifyOp(devID,false,false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taskUnmapTheirMem(buf,theirMemH);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case CMD_WRITE_BLOCKS:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf = taskMapInTheirMem(c-&gt;data.blocks.requestingProcess,c-&gt;data.blocks.buffer,c-&gt;data.blocks.numBlocks * 512,&amp;theirMemH);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blkDevNotifyOp(devID,true,true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c-&gt;error = hddReadWriteBlocks(g,c-&gt;data.blocks.firstBlock,c-&gt;data.blocks.numBlocks,buf,&amp;c-&gt;data.blocks.numBlocks,true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blkDevNotifyOp(devID,false,true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taskUnmapTheirMem(buf,theirMemH);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case CMD_QUERY_INFO:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c-&gt;data.info.numBlocks = g-&gt;numBlocks;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c-&gt;data.info.removable = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c-&gt;data.info.inserted = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c-&gt;data.info.writeable = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case CMD_QUERY_MANUF_NAME:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemMove(c-&gt;data.manufName,g-&gt;manuf,sizeof(g-&gt;manuf));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case CMD_QUERY_PROD_NAME:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemMove(c-&gt;data.prodName,g-&gt;prod,sizeof(g-&gt;prod));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case CMD_QUERY_SERIAL_NUM:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemMove(c-&gt;data.serialNum,g-&gt;serial,sizeof(g-&gt;serial));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Panic("Unknown cmd to HDD driver");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;requestQserviceDone(reqH);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void hddInit(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread* t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HddGlobals* g;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt32* hddBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g = kHeapAlloc(sizeof(HddGlobals));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!g) Panic("Cannot alloc HDD globals");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hddBase = mmuMapReq(true,0x20000000,1,MAP_PERM_SYS_RW);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(hddBase == MMU_INVALID_PTR) Panic("Cannot map in HDD controller");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charsPrintF("hddBase=0x%08lx\n",hddBase);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g-&gt;hddBase = (UInt32*)hddBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = taskNewKernelThread(&amp;hddPrvThread,g,PAGE_SIZE,DEFAULT_BLOCK_DRV_PRIORITY);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;taskUnblockThread(t);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charsPrintF("done\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/////////////////   ASM CODE   ////////////////////////////////&lt;br /&gt;&lt;br /&gt;//optimzed for speed from this C code:&lt;br /&gt;//void hddPrvReadSec(volatile void* base,UInt8* buf){&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt16* p = base;&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt16* dst = (UInt16*)buf;&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 left = 256;&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p += 5; //point it to I/O address&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(left--) *dst++ = *p;&lt;br /&gt;//}&lt;br /&gt;//advantage is that this ASM version reads 32 bytes at once&lt;br /&gt;static asm void hddPrvReadSec(volatile void* base,UInt8* buf){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STMFD SP!,{R4-R11,LR}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ADD   R0,R0,#0x10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R12,#16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;loop:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R2, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R3, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R4, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R5, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R6, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R7, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R8, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R9, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R10,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R11,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R2, R2, R3, LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R3, R4, R5, LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R4, R6, R7, LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R5, R8, R9, LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R6 ,R10,R11,LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R7, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R8, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R9, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R10,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  R11,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDRH  LR, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R7, R7, R8, LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R8, R9, R10,LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORR   R9, R11,LR, LSL #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STMIA R1!,{R2-R9}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//32 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SUBS  R12,R12,#1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BNE   loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;exit:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDMFD SP!,{R4-R11,LR}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BX    LR&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//optimzed for speed from this C code:&lt;br /&gt;//void hddPrvWriteSec(volatile void* base,UInt8* buf){&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volatile UInt16* p = base;&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt16* src = (UInt16*)buf;&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 left = 256;&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p += 5; //point it to I/O address&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(left--) *p = *src++;&lt;br /&gt;//}&lt;br /&gt;//advantage is that this ASM version writes 32 bytes at once&lt;br /&gt;static asm void hddPrvWriteSec(volatile void* base,UInt8* buf){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STMFD SP!,{R4-R11,LR}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ADD   R0,R0,#0x10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R12,#16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;loop:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDMIA R1!,{R2-R9}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//32 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R10,R2, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R11,R3, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   LR ,R4, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R2, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R10,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R3, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R11,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R4, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  LR, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R2, R5, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R3, R6, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R4, R7, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R10,R8, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MOV   R11,R9, LSR #16&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R5, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R2, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R6, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R3, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R7, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R4, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R8, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R10,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R9, [R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STRH  R11,[R0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SUBS  R12,R12,#1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BNE   loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;exit:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LDMFD SP!,{R4-R11,LR}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BX    LR&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1960834595462451398-8575766776519361192?l=dgosblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dgosblog.blogspot.com/feeds/8575766776519361192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1960834595462451398&amp;postID=8575766776519361192' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8575766776519361192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1960834595462451398/posts/default/8575766776519361192'/><link rel='alternate' type='text/html' href='http://dgosblog.blogspot.com/2008/11/dgos-blog.html' title='DGOS blog'/><author><name>Dmitry Grinberg</name><uri>http://www.blogger.com/profile/00873149223196980536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_V_bf2uAw_Vw/R3gb-VHqiyI/AAAAAAAAAAg/bhwFoZwf_V8/S220/n1939605_38629044_1911.jpg'/></author><thr:total>2</thr:total></entry></feed>
