

<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.amigaos.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%C3%96lrick+Lefebvre</id>
	<title>AmigaOS Documentation Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.amigaos.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%C3%96lrick+Lefebvre"/>
	<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/wiki/Special:Contributions/%C3%96lrick_Lefebvre"/>
	<updated>2026-05-27T19:13:03Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=How_to_create_an_AmigaOS_4_library&amp;diff=8542</id>
		<title>How to create an AmigaOS 4 library</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=How_to_create_an_AmigaOS_4_library&amp;diff=8542"/>
		<updated>2016-04-21T21:05:31Z</updated>

		<summary type="html">&lt;p&gt;Ölrick Lefebvre: Sample tutor on how to create an OS4 library from scratch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to create an OS4 library&lt;br /&gt;
&lt;br /&gt;
This simple tutorial is based on the creation of my first library.&lt;br /&gt;
&lt;br /&gt;
Big thanks to Alexandre Balaban, TonyW and Andy Broad Blues for their advices and explanations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Create a descriptive xml file =&lt;br /&gt;
To generate the skeleton of the library we first need to create an xml file describing it.&lt;br /&gt;
You may have a look in SDK:Include/interfaces to get inspiration.&lt;br /&gt;
&lt;br /&gt;
== The header ==&lt;br /&gt;
At the beginning you describe the type of document.&lt;br /&gt;
For my sample I got inspired by one generated by fdtrans&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE library SYSTEM &amp;quot;library.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The library tag ==&lt;br /&gt;
The all library description is contained in the library tag.&lt;br /&gt;
First you need to enter the name of the library, the name of its base structure and the name of the library file&lt;br /&gt;
 &amp;lt;library name=&amp;quot;sample&amp;quot; basename=&amp;quot;SampleBase&amp;quot; openname=&amp;quot;sample.library&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The include tags ===&lt;br /&gt;
You use these tags to specify the include files required for the declaration of your methods signature.&lt;br /&gt;
If your methods use custom types, you should add your own new include&lt;br /&gt;
 &amp;lt;include&amp;gt;exec/types.h&amp;lt;/include&amp;gt;&lt;br /&gt;
 &amp;lt;include&amp;gt;test/sample.h&amp;lt;/include&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 In that case, don&#039;t forget to place your include in SDK:local/common/include&lt;br /&gt;
&lt;br /&gt;
=== The interface tag ===&lt;br /&gt;
This tag defines an interface of your library. You should at least declare the &amp;quot;main&amp;quot; interface.&lt;br /&gt;
 &amp;lt;interface name=&amp;quot;main&amp;quot; version=&amp;quot;1.0&amp;quot; struct=&amp;quot;SampleIFace&amp;quot; prefix=&amp;quot;_sample_&amp;quot; asmprefix=&amp;quot;ISample&amp;quot; global=&amp;quot;ISample&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==== Interface methods ====&lt;br /&gt;
In the interface section you add a method tag for each method of your library you want to publish.&amp;lt;br&amp;gt;&lt;br /&gt;
Note: you must provide at least Obtain, Release, Expunge and Clone&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Obtain&amp;quot; result=&amp;quot;uint32&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Release&amp;quot; result=&amp;quot;uint32&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Expunge&amp;quot; result=&amp;quot;void&amp;quot; status=&amp;quot;unimplemented&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Clone&amp;quot; result=&amp;quot;struct SampleIFace *&amp;quot;/&amp;gt;&lt;br /&gt;
===== method properties =====&lt;br /&gt;
* name: the name of the method to publish&lt;br /&gt;
* result: the data type returne by your method&lt;br /&gt;
* status: allows you to specify that a method is not implemented&lt;br /&gt;
&lt;br /&gt;
====== arg tags ======&lt;br /&gt;
Each argument of a method must be declared with an arg tag. You specify the name and the type properties&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Addition&amp;quot; result=&amp;quot;myInt&amp;quot;&amp;gt;&lt;br /&gt;
 			&amp;lt;arg name=&amp;quot;value1&amp;quot; type=&amp;quot;myInt&amp;quot;/&amp;gt;&lt;br /&gt;
 			&amp;lt;arg name=&amp;quot;value2&amp;quot; type=&amp;quot;myInt&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;/method&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once you&#039;re finished with the description your file should look like this:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE library SYSTEM &amp;quot;library.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;library name=&amp;quot;sample&amp;quot; basename=&amp;quot;SampleBase&amp;quot; openname=&amp;quot;sample.library&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;include&amp;gt;exec/types.h&amp;lt;/include&amp;gt;&lt;br /&gt;
 	&amp;lt;include&amp;gt;test/sample.h&amp;lt;/include&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;interface name=&amp;quot;main&amp;quot; version=&amp;quot;1.0&amp;quot; struct=&amp;quot;SampleIFace&amp;quot; prefix=&amp;quot;_sample_&amp;quot; asmprefix=&amp;quot;ISample&amp;quot; global=&amp;quot;ISample&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Obtain&amp;quot; result=&amp;quot;uint32&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Release&amp;quot; result=&amp;quot;uint32&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Expunge&amp;quot; result=&amp;quot;void&amp;quot; status=&amp;quot;unimplemented&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Clone&amp;quot; result=&amp;quot;struct SampleIFace *&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 		&amp;lt;method name=&amp;quot;Addition&amp;quot; result=&amp;quot;myInt&amp;quot;&amp;gt;&lt;br /&gt;
 			&amp;lt;arg name=&amp;quot;value1&amp;quot; type=&amp;quot;myInt&amp;quot;/&amp;gt;&lt;br /&gt;
 			&amp;lt;arg name=&amp;quot;value2&amp;quot; type=&amp;quot;myInt&amp;quot;/&amp;gt;&lt;br /&gt;
 		&amp;lt;/method&amp;gt;&lt;br /&gt;
 	&amp;lt;/interface&amp;gt;&lt;br /&gt;
 &amp;lt;/library&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Generate the skeleton with IDLTool =&lt;br /&gt;
Open a shell in the drawer where your XML file resides and launch IDLTool so that it generates all you need&lt;br /&gt;
 idltool -a sample.xml &lt;br /&gt;
&lt;br /&gt;
== copy the includes at the right place ==&lt;br /&gt;
Now you have an include drawer which you&#039;ll can put in SDK:local/common/include&lt;br /&gt;
Note: you may delay this and use the local includes while debugging your library.&lt;br /&gt;
 &amp;gt; copy include/#? SDK:local/common/include all&lt;br /&gt;
        proto (Rép.)&lt;br /&gt;
           sample.h..copié.&lt;br /&gt;
        inline4 (Rép.)&lt;br /&gt;
           sample.h..copié.&lt;br /&gt;
        interfaces (Rép.)&lt;br /&gt;
           sample.i..copié.&lt;br /&gt;
           sample.h..copié.&lt;br /&gt;
&lt;br /&gt;
If you have an include required for the signature of your methods, you can add it too.&lt;br /&gt;
 #ifndef TEST_SAMPLE_H&lt;br /&gt;
 #define TEST_SAMPLE_H&lt;br /&gt;
 &lt;br /&gt;
 typedef int myInt; &lt;br /&gt;
 &lt;br /&gt;
 #endif // TEST_SAMPLE_H&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; makedir SDK:local/common/include/test&lt;br /&gt;
 &amp;gt; copy test/#? SDK:local/common/include/test&lt;br /&gt;
   sample.h..copié.&lt;br /&gt;
&lt;br /&gt;
== add the revision info ==&lt;br /&gt;
Go into the &amp;lt;library&amp;gt;_files drawer, sample_files in my example.&lt;br /&gt;
Now use bumprev to generate revision files.&lt;br /&gt;
 &amp;gt; bumprev 1.1 sample.library&lt;br /&gt;
 bumprev: Creating new file &amp;quot;sample.library_rev.rev&amp;quot;.&lt;br /&gt;
 bumprev: Bumped &amp;quot;sample.library&amp;quot; to version 1.1.&lt;br /&gt;
&lt;br /&gt;
bumprev doesn&#039;t accept &#039;0&#039; values, but you may modify the *_rev file afterward. &lt;br /&gt;
&lt;br /&gt;
== tune init.c ==&lt;br /&gt;
IDLTool has generated source files in the &amp;lt;library&amp;gt;_files drawer.&lt;br /&gt;
First you have a init.c file and a drawer for each interface with a source file for each method declared in your xml file, except the methods tagged as &#039;unimplemented&#039;.&lt;br /&gt;
Your first task is to edit init.c and define your library&#039;s base structure.&lt;br /&gt;
You will find a struct Library definition, rename it and enhanced it with private data if needed&lt;br /&gt;
&lt;br /&gt;
 struct Library&lt;br /&gt;
 {&lt;br /&gt;
     struct Library libNode;&lt;br /&gt;
     BPTR segList;&lt;br /&gt;
     /* If you need more data fields, add them here */&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct SampleBase&lt;br /&gt;
 {&lt;br /&gt;
     struct Library libNode;&lt;br /&gt;
     BPTR segList;&lt;br /&gt;
     /* If you need more data fields, add them here */&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you enhanced it, it&#039;s interesting to move it in a new header so that you can declare it in other source files.&lt;br /&gt;
In that case, don&#039;t forget to add the include directive in init.c.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;exec/exec.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;dos/dos.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;exec/types.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;test/sample.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;proto/sample.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;samplebase.h&lt;br /&gt;
&lt;br /&gt;
samplebase.h&lt;br /&gt;
 #ifndef SAMPLEBASE_H&lt;br /&gt;
 #define SAMPLEBASE_H&lt;br /&gt;
 &lt;br /&gt;
 struct SampleBase&lt;br /&gt;
 {&lt;br /&gt;
     struct Library libNode;&lt;br /&gt;
     BPTR segList;&lt;br /&gt;
     /* If you need more data fields, add them here */&lt;br /&gt;
     struct Library *UtilityBase;&lt;br /&gt;
     struct UtilityIFace *IUtility;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 #endif // SAMPLEBASE_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you must edit init.c to replace the (struct Library *) casts to your library type, (struct SampleBase *) in my case.&lt;br /&gt;
To help you find the needed places, just use make:&lt;br /&gt;
 &amp;gt; make&lt;br /&gt;
 gcc  -Wall -O3    -c -o init.o init.c&lt;br /&gt;
 init.c: In function &#039;libOpen&#039;:&lt;br /&gt;
 init.c:66: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c: In function &#039;libExpunge&#039;:&lt;br /&gt;
 init.c:94: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:96: error: &#039;struct Library&#039; has no member named &#039;segList&#039;&lt;br /&gt;
 init.c:105: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c: In function &#039;libInit&#039;:&lt;br /&gt;
 init.c:116: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:117: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:118: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:119: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:120: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:121: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:122: error: &#039;struct Library&#039; has no member named &#039;libNode&#039;&lt;br /&gt;
 init.c:124: error: &#039;struct Library&#039; has no member named &#039;segList&#039;&lt;br /&gt;
 make: *** [init.o] Error 1&lt;br /&gt;
&lt;br /&gt;
Now you have the functions which use a libBase variable typed as a (struct Library *) instead of your own base, just correct the declarations and check with make.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; make&lt;br /&gt;
 gcc  -Wall -O3    -c -o init.o init.c&lt;br /&gt;
 gcc   -nostartfiles -o sample.library main/Obtain.o main/Release.o main/Clone.o main/Addition.o  init.o &lt;br /&gt;
&lt;br /&gt;
Once make succeeds, you get a brand new library&lt;br /&gt;
 &amp;gt; list sample.library &lt;br /&gt;
 sample.library                 6510 ----rwed Aujourd&#039;hui 18:13:21&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= get the interfaces you need =&lt;br /&gt;
&lt;br /&gt;
Now that your library skeleton is validated, you have to implement your methods, but you may need acces to other libraries interfaces for it.&lt;br /&gt;
When you compile a regular program, the startup code adds global variables for some libraries (i.e. IExec), but in the case of a library, you don&#039;t have these, so it&#039;s up to you to do it.&lt;br /&gt;
&lt;br /&gt;
Except for Newlib, it&#039;s a good practice to store your opened libraries and interfaces in you libbase by extended it.&lt;br /&gt;
On the other hand, using global references allows your code to look like regular code.&lt;br /&gt;
&lt;br /&gt;
== IExec ==&lt;br /&gt;
In libInit() you get a (struct Interface *) which you can keep for your library use. No need to call Obtain() on it, as Exec isn&#039;t going away.&lt;br /&gt;
You may copy it to a global variable or to your libbase.&lt;br /&gt;
&lt;br /&gt;
=== global IExec ===&lt;br /&gt;
At the beginning of init.c add a global definition:&lt;br /&gt;
 struct ExecIFace *IExec = NULL;&lt;br /&gt;
In libInit(), comment out the &amp;quot;struct ExecIFace *IExec UNUSED&amp;quot; line and copy the exec argument to your variable&lt;br /&gt;
 IExec = (struct ExecIFace *)exec;&lt;br /&gt;
To access it from your sources, just include proto/exec.h as it contains a declaration for such a global interface.&lt;br /&gt;
In your code you can use method calls like&lt;br /&gt;
 IExec-&amp;gt;OpenLibrary()&lt;br /&gt;
&lt;br /&gt;
=== IExec libbase property ===&lt;br /&gt;
Extend your libbase structure to add a property to it&lt;br /&gt;
 #ifndef SAMPLEBASE_H&lt;br /&gt;
 #define SAMPLEBASE_H&lt;br /&gt;
 &lt;br /&gt;
 struct SampleBase&lt;br /&gt;
 {&lt;br /&gt;
     struct Library libNode;&lt;br /&gt;
     BPTR segList;&lt;br /&gt;
     /* If you need more data fields, add them here */&lt;br /&gt;
     struct ExecIFace *IExec;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 #endif // SAMPLEBASE_H&lt;br /&gt;
In libInit(), copy the exec argument to your variable&lt;br /&gt;
 libBase-&amp;gt;IExec = (struct ExecIFace *)exec;&lt;br /&gt;
To access it from your sources, just include your &amp;quot;samplebase.h&amp;quot;.&lt;br /&gt;
In your code you can get the interface from the libBase through the interface pointer of your library passed to your methods&lt;br /&gt;
 struct SampleIFace * _sample_Clone(struct SampleIFace *Self)&lt;br /&gt;
 {&lt;br /&gt;
 ...&lt;br /&gt;
     ((struct SampleBase *)(Self-&amp;gt;Data.LibBase))-&amp;gt;IExec-&amp;gt;AllocVecTags()&lt;br /&gt;
&lt;br /&gt;
== INewlib ==&lt;br /&gt;
If you use functions from libc and compile with newlib (default), the compiler will complain about an undefined INewlib.&lt;br /&gt;
That&#039;s because your library does not have the startup code which opens newlib.library and gets an interface from it.&lt;br /&gt;
The solution is almost the same as for a global IExec.&lt;br /&gt;
At the beginning of init.c add global definitions:&lt;br /&gt;
 struct Library *NewlibBase = NULL;&lt;br /&gt;
 struct Interface *INewlib = NULL;&lt;br /&gt;
In libInit(), open the library and get a &amp;quot;main&amp;quot; interface where the skeleton says it&lt;br /&gt;
 /* Add additional init code here if you need it. */&lt;br /&gt;
 NewlibBase = IExec-&amp;gt;OpenLibrary(&amp;quot;newlib.library&amp;quot;, 53);&lt;br /&gt;
 if(!NewlibBase)&lt;br /&gt;
 {&lt;br /&gt;
     CleanLibContext(&amp;quot;Can&#039;t open V53 newlib.library&amp;quot;);&lt;br /&gt;
     return NULL;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 INewlib = (struct Interface *)IExec-&amp;gt;GetInterface(NewlibBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
 if(!INewlib)&lt;br /&gt;
 {&lt;br /&gt;
     CleanLibContext(&amp;quot;Can&#039;t get newlib main interface&amp;quot;);&lt;br /&gt;
     return NULL;&lt;br /&gt;
 }&lt;br /&gt;
CleanLibContext() may look like this:&lt;br /&gt;
 void CleanLibContext(const char *msg)&lt;br /&gt;
 {&lt;br /&gt;
     IExec-&amp;gt;DebugPrintF(&amp;quot;%s\n&amp;quot;, msg);&lt;br /&gt;
     if(NewlibBase)&lt;br /&gt;
     {&lt;br /&gt;
         if(INewlib)&lt;br /&gt;
         {&lt;br /&gt;
             IExec-&amp;gt;DropInterface(INewlib);&lt;br /&gt;
             INewlib = NULL;&lt;br /&gt;
         }&lt;br /&gt;
         IExec-&amp;gt;CloseLibrary(NewlibBase);&lt;br /&gt;
         NewlibBase = NULL;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
Now you can enjoy libc functions.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;NB: Do not make a call to a libc function before getting your interface, it&#039;s bad !&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In libExpunge() you must clean up your resources after the dedicated comment:&lt;br /&gt;
 /* Undo what the init code did */&lt;br /&gt;
  CleanLibContext(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== other libraries ==&lt;br /&gt;
Now you should have a pretty clear idea of how to do it for whatever library.&lt;br /&gt;
* define pointers for the library and the interface,&lt;br /&gt;
* open the library and get the interface in libInit()&lt;br /&gt;
** if you get an error while opening the library or getting the interface, clean up your resources and return NULL in libInit()&lt;br /&gt;
* in libExpunge() close everything opened&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Implement your library&#039;s methods =&lt;br /&gt;
IDLTool has generated a source file for each of the declared methods.&lt;br /&gt;
You just fill them with your code.&amp;lt;br&amp;gt;&lt;br /&gt;
This is a profundly trivial example&lt;br /&gt;
 myInt _sample_Addition(struct SampleIFace *Self,&lt;br /&gt;
        myInt value1,&lt;br /&gt;
        myInt value2)&lt;br /&gt;
 {&lt;br /&gt;
     return (value1 + value2);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Test your library =&lt;br /&gt;
Once your library is built, it&#039;s time to check each method with a simple test program.&lt;br /&gt;
 #include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;proto/sample.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char *argv[])&lt;br /&gt;
 {&lt;br /&gt;
     myInt val1, val2, res;&lt;br /&gt;
     &lt;br /&gt;
     struct Library *SampleBase = NULL;&lt;br /&gt;
     struct SampleIFace *ISample = NULL;&lt;br /&gt;
     &lt;br /&gt;
     SampleBase = (struct Library *)IExec-&amp;gt;OpenLibrary(&amp;quot;sample.library&amp;quot;, 0);&lt;br /&gt;
     if(!SampleBase)&lt;br /&gt;
         return -1;&lt;br /&gt;
         &lt;br /&gt;
     ISample = (struct SampleIFace *)IExec-&amp;gt;GetInterface(SampleBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
     if(!ISample)&lt;br /&gt;
     {&lt;br /&gt;
         IExec-&amp;gt;CloseLibrary(SampleBase);&lt;br /&gt;
         return -2;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     val1 = 123;&lt;br /&gt;
     val2 = 321;&lt;br /&gt;
     res = ISample-&amp;gt;Addition(val1, val2);&lt;br /&gt;
     printf(&amp;quot;%ld + %ld = %ld\n&amp;quot;, val1, val2, res);&lt;br /&gt;
     &lt;br /&gt;
     IExec-&amp;gt;DropInterface((struct Interface *)ISample);&lt;br /&gt;
     IExec-&amp;gt;CloseLibrary(SampleBase);&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Build it, copy your library in the same drawer (except if you already put it in Libs:) and test it&lt;br /&gt;
 9.test&amp;gt; gcc -g -o tst_sample tst_sample.c&lt;br /&gt;
 9.test&amp;gt; tst_sample &lt;br /&gt;
 123 + 321 = 444&lt;br /&gt;
&lt;br /&gt;
Et voila !&lt;br /&gt;
&lt;br /&gt;
Hope this article will help you create much usefull libraries.&lt;/div&gt;</summary>
		<author><name>Ölrick Lefebvre</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=8541</id>
		<title>Tutorials:Main</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=8541"/>
		<updated>2016-04-21T20:42:19Z</updated>

		<summary type="html">&lt;p&gt;Ölrick Lefebvre: /* General */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tutorials =&lt;br /&gt;
&lt;br /&gt;
Tutorials have been provided by various authors.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
[[The Hacking Way: Part 1 - First Steps]]&lt;br /&gt;
&lt;br /&gt;
[[The Right Tool for the Job (Shared Objects)]]&lt;br /&gt;
&lt;br /&gt;
[[How to Build Stubs for 68k Libraries]]&lt;br /&gt;
&lt;br /&gt;
[[How to create an OS4 library]]&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
&lt;br /&gt;
[[How to install a hardware interrupt]]&lt;br /&gt;
&lt;br /&gt;
[[How to open and use the exec debug interface]]&lt;br /&gt;
&lt;br /&gt;
[[GDB for Beginners]]&lt;br /&gt;
&lt;br /&gt;
[[Using Crash-Logs for Debugging]]&lt;br /&gt;
&lt;br /&gt;
[[Debug Logging on AmigaOS]]&lt;br /&gt;
&lt;br /&gt;
[[Redirecting Debug Output to the Serial Port on Startup]]&lt;br /&gt;
&lt;br /&gt;
[[Advanced Serial Debugging Guide]]&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&lt;br /&gt;
[[BOOPSI Gadget Help Strings]]&lt;br /&gt;
&lt;br /&gt;
[[BOOPSI Popup Menus - Part 1]]&lt;br /&gt;
&lt;br /&gt;
[[BOOPSI Popup Menus - Part 2]]&lt;br /&gt;
&lt;br /&gt;
[[BOOPSI Popup Menus - Part 3]]&lt;br /&gt;
&lt;br /&gt;
[[Screen Programming]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2015 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2015 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2014 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2014 Programming Seminar]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2013 ==&lt;br /&gt;
	&lt;br /&gt;
[[AmiWest 2013 Programming Conference Synopsis]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
	&lt;br /&gt;
[[AmiWest 2013 Lesson 1|AmiWest Lesson 1: How to Crash]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2013 Lesson 2|AmiWest Lesson 2: Interpreting Crash Reports]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2013 Lesson 3|AmiWest Lesson 3: ProcTree Redux]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2013 Lesson 4|AmiWest Lesson 4: Simple IP Clients &amp;amp; Servers]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2013 Lesson 5|AmiWest Lesson 5: Bars&amp;amp;Pipes Tools]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2012 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]] [https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Introduction-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 1|AmiWest Lesson 1: Coding Basics]] [https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson01-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 2|AmiWest Lesson 2: AmigaOS Fundamentals]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson02-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 3|AmiWest Lesson 3: Input and Output]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson03-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 4|AmiWest Lesson 4: ProcTree]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson04-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 5|AmiWest Lesson 5: MIDI]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson05-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 6|AmiWest Lesson 6: Application Library - Not Presented]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 7|AmiWest Lesson 7: Screen Blanker]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson07-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 8|AmiWest Lesson 8: ARexx Ports]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson08-360.mp4 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Support]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Wrap-Up-360.mp4 - Video]&lt;/div&gt;</summary>
		<author><name>Ölrick Lefebvre</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Updating_Nemo_firmware&amp;diff=7872</id>
		<title>Updating Nemo firmware</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Updating_Nemo_firmware&amp;diff=7872"/>
		<updated>2015-04-09T10:07:34Z</updated>

		<summary type="html">&lt;p&gt;Ölrick Lefebvre: Add link to jumper picture&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Be aware of the risks==&lt;br /&gt;
A brutal interruption of the update of the firmware may lead your computer to be as useful as a brick. To avoid this, you have to make sure to minimize the risks:&lt;br /&gt;
*keep any animals away (cats, dogs, bugs, children, wife, grandma...),&lt;br /&gt;
*make sure nobody&#039;s about to blow a fuse in the house (wife not drying her hair while the washing machine is on, while the electric fryer in on, while the oven is on, while the child&#039;s discovering electricity is fun by playing with the electric heater...),&lt;br /&gt;
*make sure no storm is hereabout, ready to raise a power failure,&lt;br /&gt;
*make sure no strike has been announced at your electricity supplier,&lt;br /&gt;
*(add here any other good sense measure to ensure 10 minutes of power stability).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Firmware revisions==&lt;br /&gt;
Currently, the way to identify firmware revision is a bit &amp;quot;unusual&amp;quot;.&lt;br /&gt;
===Original firmware (2011-07-05)===&lt;br /&gt;
That&#039;s the revision delivered with Nemo to the Betatest team. This is the revision of the rescue BIOS.&amp;lt;br&amp;gt;&lt;br /&gt;
In the serial debug log, it signs like that:&lt;br /&gt;
 CFE version PAS-2.0.30 for NEMO (64bit,MP,BE,PPC)&lt;br /&gt;
 Build Date: Tue Jul  5 16:09:15 BST 2011 (andrew@hercules)&lt;br /&gt;
 Copyright (C) 2000,2001,2002,2003,2004,2005 Broadcom Corporation.&lt;br /&gt;
 Portions Copyright (C) 2005-2008 PA Semi, Inc.&lt;br /&gt;
 Portions Copyright (C) 2010 Hyperion Entertainment CVBA&lt;br /&gt;
&lt;br /&gt;
Take note of the date.&amp;lt;br&amp;gt;&lt;br /&gt;
An alternative way to identify it, is that it doesn&#039;t support the menu command:&lt;br /&gt;
 CFE&amp;gt; menu&lt;br /&gt;
 Invalid command: &amp;quot;menu&amp;quot;&lt;br /&gt;
 Available commands: ...&lt;br /&gt;
&lt;br /&gt;
===Menu Firmware (2011-08-22)===&lt;br /&gt;
This is the second revision, made available to the Betatest team to setup boot menus.&amp;lt;br&amp;gt;&lt;br /&gt;
In the serial debug log, it signs like that:&lt;br /&gt;
 CFE version PAS-2.0.30 for NEMO (64bit,MP,BE,PPC)&lt;br /&gt;
 Build Date: Mon Aug 22 14:30:17 CEST 2011 (hfrieden@jumpgate)&lt;br /&gt;
 Copyright (C) 2000,2001,2002,2003,2004,2005 Broadcom Corporation.&lt;br /&gt;
 Portions Copyright (C) 2005-2008 PA Semi, Inc.&lt;br /&gt;
 Portions Copyright (C) 2010 Hyperion Entertainment CVBA&lt;br /&gt;
Deja vu ? Take a closer look at the date.&amp;lt;br&amp;gt;&lt;br /&gt;
An alternative way to identify it, is that it does support the menu command:&lt;br /&gt;
 CFE&amp;gt; menu&lt;br /&gt;
 Loader:elf Filesys:amigafs Dev:ide0.1 File:amigaboot.of Options:(null)&lt;br /&gt;
The size of the corresponding BIN file is 915248 bytes.&lt;br /&gt;
&lt;br /&gt;
===AEon Firmware (2012-06-08)===&lt;br /&gt;
This is the third revision.&amp;lt;br&amp;gt;&lt;br /&gt;
In the serial debug log, it signs like that:&lt;br /&gt;
 CFE version PAS-2.0.30 for NEMO (64bit,MP,BE,PPC)&lt;br /&gt;
 Build Date: Fri Jun  8 16:04:49 CEST 2012 (hfrieden@jumpgate)&lt;br /&gt;
 Copyright (C) 2000,2001,2002,2003,2004,2005 Broadcom Corporation.&lt;br /&gt;
 Portions Copyright (C) 2005-2008 PA Semi, Inc.&lt;br /&gt;
 Portions Copyright (C) 2010 Hyperion Entertainment CVBA&lt;br /&gt;
Once again, you&#039;ve got to check the date.&amp;lt;br&amp;gt;&lt;br /&gt;
You can visually identify it as there is now the AEon logo on top of &amp;quot;X1000&amp;quot; on the boot screen.&amp;lt;br&amp;gt;&lt;br /&gt;
The size of the corresponding BIN file is 939968 bytes.&lt;br /&gt;
&lt;br /&gt;
==Upgrade procedure==&lt;br /&gt;
===Get the firmware BIN file===&lt;br /&gt;
Well if you&#039;re not a beta tester, you&#039;ll have to find a regular way to get it.&lt;br /&gt;
===Put it on a media available to CFE===&lt;br /&gt;
You can put in on a CD, on a USB stick, on a Compact Flash card or a TFTP server.&amp;lt;br&amp;gt;&lt;br /&gt;
Make it simple, make it safe, just put it on a FAT32 formatted USB stick, no philosophical debate please.&amp;lt;br&amp;gt;&lt;br /&gt;
Make sure your copy is correct, check it with md5sum or any other useful tool.&lt;br /&gt;
===Flash===&lt;br /&gt;
*Power up Nemo,&lt;br /&gt;
*if you have a menu configured, press &#039;F&#039; to go to CFE prompt,&lt;br /&gt;
*plug your USB stick, CFE should detect it&lt;br /&gt;
 CFE&amp;gt; port 0:1/3 released (full speed)&lt;br /&gt;
 USB: New device connected to bus 2 hub 1 port 1 (full speed)&lt;br /&gt;
 USB bus 2 device 2: vendor 0951 product 1625 class 08: Mass-Storage Device&lt;br /&gt;
 USBMASS: Unit 0 connected&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
*check availability of your file&lt;br /&gt;
 CFE&amp;gt; dir -fatfs usbdisk0:/&lt;br /&gt;
 CFE.BIN                  915248&lt;br /&gt;
 X1000_Menu.pdf           122391&lt;br /&gt;
 X1000_Menu.pdf.info      13168&lt;br /&gt;
 X1000_Reflash.pdf        670531&lt;br /&gt;
 X1000_Reflash.pdf.info   13168&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
*load the BIN file&lt;br /&gt;
 CFE&amp;gt; load -raw -fatfs -max=0x8000000 usbdisk0:cfe.bin&lt;br /&gt;
 Loader:raw Filesys:fat Dev:usbdisk0 File:cfe.bin Options:(null)&lt;br /&gt;
 Loading: .. 915248 bytes read&lt;br /&gt;
 Entry at 0x0000000020000000&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt; &lt;br /&gt;
*take note of these two values, they may differ:&lt;br /&gt;
**bytes read: that&#039;s the size of your bin, it may change for each revision, in our example it&#039;s 915248&lt;br /&gt;
**entry: that&#039;s the address where the file is loaded, it may change too, 0x20000000 in our example&lt;br /&gt;
*starting from here, you won&#039;t be able to go back, so make sure you&#039;re ready and take a deep breath&lt;br /&gt;
*erase the current content of the flash&lt;br /&gt;
 CFE&amp;gt; spi erase&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
copy your loaded image with the previouly noted entry and size values&lt;br /&gt;
 CFE&amp;gt; spi copy 0xf00000 0x20000000 915248&lt;br /&gt;
                        &amp;lt;  entry &amp;gt; &amp;lt;size&amp;gt;&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
NOTE:	The copy can take several seconds, almost one minute in fact. Be patient, DO NOT SHUTDOWN OR RESET your machine while it is copying: it is NOT DEAD OR CRASHED!! Doing so would put you in an awkward position where you&#039;ll have bricked your X-1000. The solution would to follow the rescue procedure below.&lt;br /&gt;
&lt;br /&gt;
*when you get back to the prompt, you can check the ROM signature (55AA55AA)&lt;br /&gt;
 CFE&amp;gt; spi read 0xf00000 32&lt;br /&gt;
 00F00000% 55AA55AA 43464531 436F6D6D 6F6E2046&lt;br /&gt;
 00F00010% 69726D77 61726520 456E7669 726F6E6D&lt;br /&gt;
 00F00020% 656E742C 20286329 20323030 34204272&lt;br /&gt;
 00F00030% 6F616463 6F6D2043&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
*now you can cold boot Nemo and check the revision.&lt;br /&gt;
==In case Murphy was right once again==&lt;br /&gt;
Nemo has a dual flash EPROM chips to offer you a safety belt. In case you broke your BIOS, you are able to activate the rescue BIOS which will allow you to try a new update. The choice between normal and rescue BIOS is activated with a jumper located between the DIMM4 slot and the rear USB connector (here in the Normal position):[https://dl.dropboxusercontent.com/u/30631303/Amiga/Setting_Board/bios.jpg BIOS Jumper]&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to join the BIOS club, don&#039;t forget the three rules:&lt;br /&gt;
*you don&#039;t put a jumper on the RESCUE WrEn pins,&lt;br /&gt;
*you DON&#039;T put a jumper on the RESCUE WrEn pins,&lt;br /&gt;
*YOU DON&#039;T PUT A JUMPER ON THE RESCUE WrEn PINS !&lt;br /&gt;
===Rescue guide===&lt;br /&gt;
To use the Rescue BIOS and recover your Normal BIOS, here is how to do it:&lt;br /&gt;
*power down Nemo,&lt;br /&gt;
*put the BIOS jumper in Rescue mode,&lt;br /&gt;
*power up Nemo,&lt;br /&gt;
*once you get CFE prompt, move carefully your BIOS jumper from Rescue to Normal (carefully means here: avoid any shortcut, I&#039;m obviously talking about electricity),&lt;br /&gt;
*follow the standard BIOS update procedure,&lt;br /&gt;
*if you get to the end, then you&#039;ve rescued your BIOS, Champagne !&lt;/div&gt;</summary>
		<author><name>Ölrick Lefebvre</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Updating_Nemo_firmware&amp;diff=7870</id>
		<title>Updating Nemo firmware</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Updating_Nemo_firmware&amp;diff=7870"/>
		<updated>2015-04-08T12:15:27Z</updated>

		<summary type="html">&lt;p&gt;Ölrick Lefebvre: Nemo firmware upgrade and rescue guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Be aware of the risks==&lt;br /&gt;
A brutal interruption of the update of the firmware may lead your computer to be as useful as a brick. To avoid this, you have to make sure to minimize the risks:&lt;br /&gt;
*keep any animals away (cats, dogs, bugs, children, wife, grandma...),&lt;br /&gt;
*make sure nobody&#039;s about to blow a fuse in the house (wife not drying her hair while the washing machine is on, while the electric fryer in on, while the oven is on, while the child&#039;s discovering electricity is fun by playing with the electric heater...),&lt;br /&gt;
*make sure no storm is hereabout, ready to raise a power failure,&lt;br /&gt;
*make sure no strike has been announced at your electricity supplier,&lt;br /&gt;
*(add here any other good sense measure to ensure 10 minutes of power stability).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Firmware revisions==&lt;br /&gt;
Currently, the way to identify firmware revision is a bit &amp;quot;unusual&amp;quot;.&lt;br /&gt;
===Original firmware (2011-07-05)===&lt;br /&gt;
That&#039;s the revision delivered with Nemo to the Betatest team. This is the revision of the rescue BIOS.&amp;lt;br&amp;gt;&lt;br /&gt;
In the serial debug log, it signs like that:&lt;br /&gt;
 CFE version PAS-2.0.30 for NEMO (64bit,MP,BE,PPC)&lt;br /&gt;
 Build Date: Tue Jul  5 16:09:15 BST 2011 (andrew@hercules)&lt;br /&gt;
 Copyright (C) 2000,2001,2002,2003,2004,2005 Broadcom Corporation.&lt;br /&gt;
 Portions Copyright (C) 2005-2008 PA Semi, Inc.&lt;br /&gt;
 Portions Copyright (C) 2010 Hyperion Entertainment CVBA&lt;br /&gt;
&lt;br /&gt;
Take note of the date.&amp;lt;br&amp;gt;&lt;br /&gt;
An alternative way to identify it, is that it doesn&#039;t support the menu command:&lt;br /&gt;
 CFE&amp;gt; menu&lt;br /&gt;
 Invalid command: &amp;quot;menu&amp;quot;&lt;br /&gt;
 Available commands: ...&lt;br /&gt;
&lt;br /&gt;
===Menu Firmware (2011-08-22)===&lt;br /&gt;
This is the second revision, made available to the Betatest team to setup boot menus.&amp;lt;br&amp;gt;&lt;br /&gt;
In the serial debug log, it signs like that:&lt;br /&gt;
 CFE version PAS-2.0.30 for NEMO (64bit,MP,BE,PPC)&lt;br /&gt;
 Build Date: Mon Aug 22 14:30:17 CEST 2011 (hfrieden@jumpgate)&lt;br /&gt;
 Copyright (C) 2000,2001,2002,2003,2004,2005 Broadcom Corporation.&lt;br /&gt;
 Portions Copyright (C) 2005-2008 PA Semi, Inc.&lt;br /&gt;
 Portions Copyright (C) 2010 Hyperion Entertainment CVBA&lt;br /&gt;
Deja vu ? Take a closer look at the date.&amp;lt;br&amp;gt;&lt;br /&gt;
An alternative way to identify it, is that it does support the menu command:&lt;br /&gt;
 CFE&amp;gt; menu&lt;br /&gt;
 Loader:elf Filesys:amigafs Dev:ide0.1 File:amigaboot.of Options:(null)&lt;br /&gt;
The size of the corresponding BIN file is 915248 bytes.&lt;br /&gt;
&lt;br /&gt;
===AEon Firmware (2012-06-08)===&lt;br /&gt;
This is the third revision.&amp;lt;br&amp;gt;&lt;br /&gt;
In the serial debug log, it signs like that:&lt;br /&gt;
 CFE version PAS-2.0.30 for NEMO (64bit,MP,BE,PPC)&lt;br /&gt;
 Build Date: Fri Jun  8 16:04:49 CEST 2012 (hfrieden@jumpgate)&lt;br /&gt;
 Copyright (C) 2000,2001,2002,2003,2004,2005 Broadcom Corporation.&lt;br /&gt;
 Portions Copyright (C) 2005-2008 PA Semi, Inc.&lt;br /&gt;
 Portions Copyright (C) 2010 Hyperion Entertainment CVBA&lt;br /&gt;
Once again, you&#039;ve got to check the date.&amp;lt;br&amp;gt;&lt;br /&gt;
You can visually identify it as there is now the AEon logo on top of &amp;quot;X1000&amp;quot; on the boot screen.&amp;lt;br&amp;gt;&lt;br /&gt;
The size of the corresponding BIN file is 939968 bytes.&lt;br /&gt;
&lt;br /&gt;
==Upgrade procedure==&lt;br /&gt;
===Get the firmware BIN file===&lt;br /&gt;
Well if you&#039;re not a beta tester, you&#039;ll have to find a regular way to get it.&lt;br /&gt;
===Put it on a media available to CFE===&lt;br /&gt;
You can put in on a CD, on a USB stick, on a Compact Flash card or a TFTP server.&amp;lt;br&amp;gt;&lt;br /&gt;
Make it simple, make it safe, just put it on a FAT32 formatted USB stick, no philosophical debate please.&amp;lt;br&amp;gt;&lt;br /&gt;
Make sure your copy is correct, check it with md5sum or any other useful tool.&lt;br /&gt;
===Flash===&lt;br /&gt;
*Power up Nemo,&lt;br /&gt;
*if you have a menu configured, press &#039;F&#039; to go to CFE prompt,&lt;br /&gt;
*plug your USB stick, CFE should detect it&lt;br /&gt;
 CFE&amp;gt; port 0:1/3 released (full speed)&lt;br /&gt;
 USB: New device connected to bus 2 hub 1 port 1 (full speed)&lt;br /&gt;
 USB bus 2 device 2: vendor 0951 product 1625 class 08: Mass-Storage Device&lt;br /&gt;
 USBMASS: Unit 0 connected&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
*check availability of your file&lt;br /&gt;
 CFE&amp;gt; dir -fatfs usbdisk0:/&lt;br /&gt;
 CFE.BIN                  915248&lt;br /&gt;
 X1000_Menu.pdf           122391&lt;br /&gt;
 X1000_Menu.pdf.info      13168&lt;br /&gt;
 X1000_Reflash.pdf        670531&lt;br /&gt;
 X1000_Reflash.pdf.info   13168&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
*load the BIN file&lt;br /&gt;
 CFE&amp;gt; load -raw -fatfs -max=0x8000000 usbdisk0:cfe.bin&lt;br /&gt;
 Loader:raw Filesys:fat Dev:usbdisk0 File:cfe.bin Options:(null)&lt;br /&gt;
 Loading: .. 915248 bytes read&lt;br /&gt;
 Entry at 0x0000000020000000&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt; &lt;br /&gt;
*take note of these two values, they may differ:&lt;br /&gt;
**bytes read: that&#039;s the size of your bin, it may change for each revision, in our example it&#039;s 915248&lt;br /&gt;
**entry: that&#039;s the address where the file is loaded, it may change too, 0x20000000 in our example&lt;br /&gt;
*starting from here, you won&#039;t be able to go back, so make sure you&#039;re ready and take a deep breath&lt;br /&gt;
*erase the current content of the flash&lt;br /&gt;
 CFE&amp;gt; spi erase&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
copy your loaded image with the previouly noted entry and size values&lt;br /&gt;
 CFE&amp;gt; spi copy 0xf00000 0x20000000 915248&lt;br /&gt;
                        &amp;lt;  entry &amp;gt; &amp;lt;size&amp;gt;&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
NOTE:	The copy can take several seconds, almost one minute in fact. Be patient, DO NOT SHUTDOWN OR RESET your machine while it is copying: it is NOT DEAD OR CRASHED!! Doing so would put you in an awkward position where you&#039;ll have bricked your X-1000. The solution would to follow the rescue procedure below.&lt;br /&gt;
&lt;br /&gt;
*when you get back to the prompt, you can check the ROM signature (55AA55AA)&lt;br /&gt;
 CFE&amp;gt; spi read 0xf00000 32&lt;br /&gt;
 00F00000% 55AA55AA 43464531 436F6D6D 6F6E2046&lt;br /&gt;
 00F00010% 69726D77 61726520 456E7669 726F6E6D&lt;br /&gt;
 00F00020% 656E742C 20286329 20323030 34204272&lt;br /&gt;
 00F00030% 6F616463 6F6D2043&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt;&lt;br /&gt;
*now you can cold boot Nemo and check the revision.&lt;br /&gt;
==In case Murphy was right once again==&lt;br /&gt;
Nemo has a dual flash EPROM chips to offer you a safety belt. In case you broke your BIOS, you are able to activate the rescue BIOS which will allow you to try a new update. The choice between normal and rescue BIOS is activated with a jumper located between the DIMM4 slot and the rear USB connector (here in the Normal position):BIOS Jumper&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to join the BIOS club, don&#039;t forget the three rules:&lt;br /&gt;
*you don&#039;t put a jumper on the RESCUE WrEn pins,&lt;br /&gt;
*you DON&#039;T put a jumper on the RESCUE WrEn pins,&lt;br /&gt;
*YOU DON&#039;T PUT A JUMPER ON THE RESCUE WrEn PINS !&lt;br /&gt;
===Rescue guide===&lt;br /&gt;
To use the Rescue BIOS and recover your Normal BIOS, here is how to do it:&lt;br /&gt;
*power down Nemo,&lt;br /&gt;
*put the BIOS jumper in Rescue mode,&lt;br /&gt;
*power up Nemo,&lt;br /&gt;
*once you get CFE prompt, move carefully your BIOS jumper from Rescue to Normal (carefully means here: avoid any shortcut, I&#039;m obviously talking about electricity),&lt;br /&gt;
*follow the standard BIOS update procedure,&lt;br /&gt;
*if you get to the end, then you&#039;ve rescued your BIOS, Champagne !&lt;/div&gt;</summary>
		<author><name>Ölrick Lefebvre</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmigaOne_X1000&amp;diff=7869</id>
		<title>AmigaOne X1000</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmigaOne_X1000&amp;diff=7869"/>
		<updated>2015-04-08T11:49:48Z</updated>

		<summary type="html">&lt;p&gt;Ölrick Lefebvre: Added link to the firmware update page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The AmigaOne X1000 is a powerful PowerPC-based high-end computer now available for AmigaOS.&lt;br /&gt;
&lt;br /&gt;
= Key Specifications =&lt;br /&gt;
&lt;br /&gt;
* ATX form factor&lt;br /&gt;
&lt;br /&gt;
* Dual core PWRficient PA6T-1682M 1.8 Ghz PowerISA v2.04+ CPU&lt;br /&gt;
&lt;br /&gt;
* Xena Co-processor running at 500 Mhz with a XCore XS1-L2 124 SDS&lt;br /&gt;
&lt;br /&gt;
* ATI Radeon HD 1GB 4650 Graphics Card&lt;br /&gt;
&lt;br /&gt;
* 7.1 channel HD Audio&lt;br /&gt;
&lt;br /&gt;
* Memory 4xDDR2 SDRAM Slots&lt;br /&gt;
&lt;br /&gt;
* 10 USB 2.0&lt;br /&gt;
&lt;br /&gt;
* 1x Gigabit Ethernet&lt;br /&gt;
&lt;br /&gt;
* A range of PCIe and PCI slots&lt;br /&gt;
&lt;br /&gt;
* A Xorro and Compact Flash slot&lt;br /&gt;
&lt;br /&gt;
* 2x RS-232 serial ports&lt;br /&gt;
&lt;br /&gt;
* 4x SATA2 connectors&lt;br /&gt;
&lt;br /&gt;
* 1x PATA connector&lt;br /&gt;
&lt;br /&gt;
* 1x JTAG connector&lt;br /&gt;
&lt;br /&gt;
= Manufacturer =&lt;br /&gt;
&lt;br /&gt;
[http://www.a-eon.com A-Eon Technology] is the manufacturer of the AmigaOne X1000 motherboard.&lt;br /&gt;
&lt;br /&gt;
[http://www.amigakit.com AmigaKit] is the worldwide distributor of the AmigaOne X1000 System.&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting Tips =&lt;br /&gt;
&lt;br /&gt;
== X1000 CFE Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please remember to refer to CFE&#039;s documentation located in SYS:Documentation/X1000_CFE.pdf for information on boot configuration.&lt;br /&gt;
&lt;br /&gt;
== Where does Kickstart load from? ==&lt;br /&gt;
&lt;br /&gt;
As soon as the &amp;quot;amigaboot.of&amp;quot; loader begins, it scans all the available AmigaOS partitions it can find. Specifically, the SATA CD-ROM and SATA drive connected to Port1, SATA2 and IDE devices are scanned for partitions which are set as AmigaOS bootable, using the FFS2 or SFS file systems and containing an AmigaOS system. Kickstart from the partition with the highest priority is then loaded. After Kickstart is loaded, ALL drives will be scanned again and Workbench from the highest priority bootable drive will load. If your highest priority bootable drive is not connected to Port1, SATA2 then a kickstart from another drive will be loaded.&lt;br /&gt;
&lt;br /&gt;
So, if you add another drive with bootable partitions, you may need to swap SATA cables to get the kickstart to load from the right place.&lt;br /&gt;
&lt;br /&gt;
== X1000 Won&#039;t Reboot Reliably ==&lt;br /&gt;
&lt;br /&gt;
# Turn off power to PSU.&lt;br /&gt;
# Remove plug from PSU.&lt;br /&gt;
# Remove power connector from the motherboard.&lt;br /&gt;
# Take out one RAM card leaving only one to the right of the PA6T CPU (i.e. 3rd slot from the left).&lt;br /&gt;
# While the RAM card is out check the slots 2 &amp;amp; 3 for dust build up (the CPU fan blows dust onto them) and use a small clean brush to remove it.&lt;br /&gt;
# Plug power connector back on to the motherboard.&lt;br /&gt;
# Connect PSU power &amp;amp; switch on PSU.&lt;br /&gt;
# Turn on X1000.&lt;br /&gt;
&lt;br /&gt;
If the X1000 boots up to Workbench, press and hold the power button for 3-5 seconds &amp;amp; it should shut off.&lt;br /&gt;
&lt;br /&gt;
==X1000 locks up randomly and doesn&#039;t boot reliably==&lt;br /&gt;
&lt;br /&gt;
I had this problem for a few months and finally tracked it down to loose SATA power connectors.&lt;br /&gt;
&lt;br /&gt;
I had a PSU Modding kit and made a new power lead, MOLEX to 4 SATA, all on the same lead, spaced to fit 4 drives perfectly with no bent wires.&lt;br /&gt;
&lt;br /&gt;
The new connectors are a much tighter fit and since I changed the lead I&#039;ve not had a single random lockup and reliable booting.&lt;br /&gt;
&lt;br /&gt;
If you get the insufficient memory error in CFE this is a sign the DVD cable is loose. &lt;br /&gt;
&lt;br /&gt;
==X1000 CPU temperatures are rising==&lt;br /&gt;
&lt;br /&gt;
# Clean both fan  filters on the front fan openings.&lt;br /&gt;
# Clean the fan filter UNDER the power supply unit.&lt;br /&gt;
&lt;br /&gt;
==X1000 fails to boot, &amp;quot;Loading&amp;quot; indicator goes full red and then stops==&lt;br /&gt;
&lt;br /&gt;
# This will happen when booting an older workbench with a newer graphics card.&lt;br /&gt;
# You&#039;ll need to update your PCIGraphics.card and RadeonHD.chip, or revert to an HD4000 series graphics card.&lt;br /&gt;
&lt;br /&gt;
==X1000 fails to boot==&lt;br /&gt;
&lt;br /&gt;
May also happen if non-bootable media is left in the CD/DVD drive.&lt;br /&gt;
&lt;br /&gt;
==X1000 fails to boot, &amp;quot;Failed to load amigaboot.of: Insufficient memory&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
# Relax your memory isn&#039;t fried.&lt;br /&gt;
# Check the SATA cable to your DVDRW drive (top left on the motherboard)&lt;br /&gt;
# Don&#039;t forget to check the power cable too.&lt;br /&gt;
&lt;br /&gt;
For some reason CFE reports insufficient memory errors when it can&#039;t find an optical drive.&lt;br /&gt;
&lt;br /&gt;
If checking cables doesn&#039;t correct the problem, check that CFE is able to read the amigaboot.of bootloader. Generally it can read it from an installation CD, a hard disk partition, or even from an internal CompactFlash, but there are constraints which you should be aware of:&lt;br /&gt;
* CFE can only boot on sata drives connected to [http://dl.dropbox.com/u/30631303/Amiga/Setting_Board/Sata.jpg Sata0 or Sata2 connectors], so check that your DVD drive and your system hardisk are connected to these.&lt;br /&gt;
* CFE can only read a few file systems among which &lt;br /&gt;
** ISO for CDs &lt;br /&gt;
** FFS2, ext2 or FAT for hard disks or CompactFlash&lt;br /&gt;
* CFE can&#039;t detect filesystems, they must be specified in the boot command&lt;br /&gt;
** for a CD: &#039;&#039;-fs=isofs&#039;&#039;&lt;br /&gt;
** for an AmigaOS FFS partition: &#039;&#039;-fs=amigafs&#039;&#039;&lt;br /&gt;
* CFE must find an amigaboot.of file on the unit indicated by the boot command, it&#039;s up to you to check that it&#039;s available&lt;br /&gt;
=== Checking the boot command ===&lt;br /&gt;
The boot menu is configured through a set of MENU_x_LABEL/MENU_x_COMMAND pairs. If one of the entry doesn&#039;t work, you have to check that:&lt;br /&gt;
* the unit exists,&lt;br /&gt;
* the filesystem is correct,&lt;br /&gt;
* the amigaboot.of file is present.&lt;br /&gt;
&lt;br /&gt;
==== checking the units ====&lt;br /&gt;
At CFE prompt, display your menu commands with the &#039;&#039;printenv&#039;&#039; command, you may get such menu entries:&lt;br /&gt;
 MENU_0_COMMAND=setenv amigaboot_quiet Y ;boot -fs=amigafs ide0.0:amigaboot.of &lt;br /&gt;
 MENU_1_COMMAND=setenv amigaboot_quiet Y ;boot -fs=iso atapi0.1:amigaboot.of&lt;br /&gt;
To check what CFE may access, type the &#039;&#039;show device&#039;&#039; command. (NB: hard disks are displayed as ide units and CD/DVD drives as atapi units)&lt;br /&gt;
For example:&lt;br /&gt;
 CFE&amp;gt; show devices&lt;br /&gt;
 Device Name          Description&lt;br /&gt;
 -------------------  ---------------------------------------------------------&lt;br /&gt;
 uart0                NS16550 UART at 0xFCFF03F8&lt;br /&gt;
 pcconsole0           PC Console (USB/VESA)&lt;br /&gt;
 eeprom0              Microchip 24LC128 EEPROM on SMBus channel 0 dev 0x57&lt;br /&gt;
 eth0                 PA Semi Ethernet (ge3) at 0xE00A3000 (02-00-E0-0A-30-00)&lt;br /&gt;
 flash0.os            SPI flash at FFE00000 offset 00000000 size 1024KB&lt;br /&gt;
 flash0.boot          SPI flash at FFE00000 offset 00100000 size 1024KB&lt;br /&gt;
 therm0               TI TMP423 Thermal Sensor on SMBus channel 0 dev 0x4C&lt;br /&gt;
 cf0                  CompactFlash ATA disk unit 0 at 0xF0000000&lt;br /&gt;
 atapi0.0             PCI IDE disk unit 0 at I/O 0000 (PCI:E0590000)&lt;br /&gt;
 ide0.1               PCI IDE disk unit 1 at I/O 0000 (PCI:E0590000)&lt;br /&gt;
 eth1                 RTL8139 Ethernet at 0xA0310000 (00-50-fc-1f-1f-de)&lt;br /&gt;
 usbdisk0             USB Disk unit 0&lt;br /&gt;
 usbdisk1             USB Disk unit 1&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt; &lt;br /&gt;
In this example you should notice that CFE does not see ide0.0 and atapi0.1 but ide0.1 and atapi0.0. In this case, it means the menu commands are based ont the hard disk being connected on Sata0 and the CD drive on Sata2, but in fact it&#039;s connected the other way around.&lt;br /&gt;
Either you modify the menu commands, or you swap the cables on the Sata connectors 0 and 2.&lt;br /&gt;
&lt;br /&gt;
==== checking filesystem ====&lt;br /&gt;
Once your units are correctly identified, you should check the filesystem is correct with the &#039;&#039;dir&#039;&#039; command.&lt;br /&gt;
Note that the error message may be different depending on the type of unit and the filesystem. Just keep in mind that if the command status is 0, the filesystem is correct.&lt;br /&gt;
* trying to read an SFS/02 partition:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs ide0.1,prod:&lt;br /&gt;
 Could not init file system: Unsupported function&lt;br /&gt;
 *** command status = -19&lt;br /&gt;
* trying to read a wrong unit:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs ide0.0:&lt;br /&gt;
 Could not init file system: Insufficient memory&lt;br /&gt;
 *** command status = -5&lt;br /&gt;
* trying to read a FAT partition as FFS:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs cf0:&lt;br /&gt;
 Could not init file system: File not found&lt;br /&gt;
 *** command status = -18&lt;br /&gt;
* trying to read an FFS partition as FAT:&lt;br /&gt;
 CFE&amp;gt; dir -fs=fat ide0.1:&lt;br /&gt;
 Could not init file system: File system not recognized&lt;br /&gt;
 *** command status = -29&lt;br /&gt;
&lt;br /&gt;
* and finally finding the Grail:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs ide0.1:&lt;br /&gt;
 Directory&lt;br /&gt;
    amigaboot.of                        51420      ------------r---&lt;br /&gt;
 &lt;br /&gt;
 51420 bytes in 1 files&lt;br /&gt;
 0 directories&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
==== finding amigaboot.of ====&lt;br /&gt;
Once you get the &#039;&#039;dir&#039;&#039; command working, make sure it lists the amigaboot.of file like in the example above, as CFE will load it and pass control to it to continue the boot process, either to present a second boot menu based on kicklayouts or to directly load the kickstart.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==X1000 won&#039;t boot (black screen, no boot at all) with only 3 LEDs lighting on motherboard==&lt;br /&gt;
&lt;br /&gt;
Check the CMOS battery.&lt;br /&gt;
&lt;br /&gt;
== X1000 Keyboard does not work while booting==&lt;br /&gt;
&lt;br /&gt;
Plug the keyboard into the USB connector closest to the white audio jack.&lt;br /&gt;
&lt;br /&gt;
This is &amp;quot;upper left&amp;quot; as you look at the back of the case. (ref Sys:documentation/X1000_QuickstartGuide.pdf page 9)&lt;br /&gt;
&lt;br /&gt;
Do not plug a keyboard with a built in hub in that socket, CFE does not approve.&lt;br /&gt;
&lt;br /&gt;
==Creating a new boot CD step by step==&lt;br /&gt;
&lt;br /&gt;
This is taken from a post on Amigaworld.net by Lyle Hazelwood.&lt;br /&gt;
&lt;br /&gt;
If you have upgraded to a newer graphics card, any old boot  CDs that don&#039;t have the new RadeonHD drivers will not boot. Here is a simple way to create a more useful CD.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to go back to a compatible graphics card to get running long enough to do this. I hope your original video card is still available to you.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
You have a Bootable Recovery CD, like &amp;quot;AmigaOS 4.1 Update 5&amp;quot;. Your current Workbench has been upgraded with the new RadeonHD drivers. You have a blank CDROM disk and a drive capable of burning it.&lt;br /&gt;
&lt;br /&gt;
=== Step by step ===&lt;br /&gt;
&lt;br /&gt;
1. Check SYS:Utilities for &amp;quot;AmiDVD&amp;quot;. If not there, insert the recovery CD and run the &amp;quot;Extras Installer&amp;quot;, then select AmiDVD and allow it to install.&lt;br /&gt;
&lt;br /&gt;
2. With the recovery CD still in the drive, open a Shell and enter the following commands:&lt;br /&gt;
 MakeDir RAM:BootVol&lt;br /&gt;
 Copy CD0: RAM:BootVol ALL CLONE&lt;br /&gt;
 Copy SYS:Kickstart/PCIGraphics.card RAM:BootVol/System/Kickstart&lt;br /&gt;
 Copy SYS:Kickstart/RadeonHD.chip RAM:BootVol/System/Kickstart&lt;br /&gt;
&lt;br /&gt;
Then make a note of the exact volume name of CD0:. Mine was &amp;quot;AmigaOS 4.1 Update 5&amp;quot; for this example.&lt;br /&gt;
&lt;br /&gt;
3. Now remove the recovery CD and replace it with a blank CD-ROM.&lt;br /&gt;
&lt;br /&gt;
4. Open SYS:Utilities/AmiDVD/AmiDVD&lt;br /&gt;
&lt;br /&gt;
5. From the &amp;quot;CreateImage&amp;quot; Tab, Set source to RAM:BootVol, then set VolumeName to &amp;quot;AmigaOS 4.1 Update 5&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
6. Select Bootable AmigaOS4 and finally select &amp;quot;Create Image&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
7. Now on to tab2, &amp;quot;Burn Image&amp;quot;, and click on &amp;quot;Burn CD-R&amp;quot;&lt;br /&gt;
&lt;br /&gt;
That&#039;s it! The resulting disk should be identical to the original but will boot properly with newer graphics cards.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Remember|text=This new boot image is under the same agreement that the RadeonHD drivers were distributed under. It is NOT OK to share this disk with others.}}&lt;br /&gt;
&lt;br /&gt;
==Intermittent power on/off problems==&lt;br /&gt;
&lt;br /&gt;
Check all PCI(e) cards are securely in their slots.&lt;br /&gt;
&lt;br /&gt;
==Problems updating your Kickstart==&lt;br /&gt;
&lt;br /&gt;
Kickstart will load from the highest priority bootable partition on THE FIRST DRIVE ONLY.&lt;br /&gt;
If your highest priority bootable drive is on a second SATA disk, then that will boot over the kickstart found on Disk1.&lt;br /&gt;
&lt;br /&gt;
= Updating Nemo&#039;s Firmware =&lt;br /&gt;
&lt;br /&gt;
Warning, this procedure is not harmless and should only be done when you know exactly what you are doing.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Updating Nemo firmware]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= AmigaOS 4.1 Final Edition FAQ =&lt;br /&gt;
&lt;br /&gt;
Insert documentation here...&lt;/div&gt;</summary>
		<author><name>Ölrick Lefebvre</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmigaOne_X1000&amp;diff=7500</id>
		<title>AmigaOne X1000</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmigaOne_X1000&amp;diff=7500"/>
		<updated>2014-04-12T17:26:13Z</updated>

		<summary type="html">&lt;p&gt;Ölrick Lefebvre: ADD: checking CFE can access amigaboot.of&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The AmigaOne X1000 is a powerful PowerPC-based high-end computer now available for AmigaOS.&lt;br /&gt;
&lt;br /&gt;
= Key Specifications =&lt;br /&gt;
&lt;br /&gt;
* ATX form factor&lt;br /&gt;
&lt;br /&gt;
* Dual core PWRficient PA6T-1682M 1.8 Ghz PowerISA v2.04+ CPU&lt;br /&gt;
&lt;br /&gt;
* Xena Co-processor running at 500 Mhz with a XCore XS1-L2 124 SDS&lt;br /&gt;
&lt;br /&gt;
* ATI Radeon HD 1GB 4650 Graphics Card&lt;br /&gt;
&lt;br /&gt;
* 7.1 channel HD Audio&lt;br /&gt;
&lt;br /&gt;
* Memory 4xDDR2 SDRAM Slots&lt;br /&gt;
&lt;br /&gt;
* 10 USB 2.0&lt;br /&gt;
&lt;br /&gt;
* 1x Gigabit Ethernet&lt;br /&gt;
&lt;br /&gt;
* A range of PCIe and PCI slots&lt;br /&gt;
&lt;br /&gt;
* A Xorro and Compact Flash slot&lt;br /&gt;
&lt;br /&gt;
* 2x RS-232 serial ports&lt;br /&gt;
&lt;br /&gt;
* 4x SATA2 connectors&lt;br /&gt;
&lt;br /&gt;
* 1x PATA connector&lt;br /&gt;
&lt;br /&gt;
* 1x JTAG connector&lt;br /&gt;
&lt;br /&gt;
= Manufacturer =&lt;br /&gt;
&lt;br /&gt;
[http://www.a-eon.com A-Eon Technology] is the manufacturer of the AmigaOne X1000 motherboard.&lt;br /&gt;
&lt;br /&gt;
[http://www.amigakit.com AmigaKit] is the worldwide distributor of the AmigaOne X1000 System.&lt;br /&gt;
&lt;br /&gt;
= Frequently Asked Questions =&lt;br /&gt;
&lt;br /&gt;
== When will Mixer be upgraded to support the X1000? ==&lt;br /&gt;
&lt;br /&gt;
The X1000&#039;s HDAudio chip does not support monitoring. As such, the Mixer will never work on the X1000 since the hardware does not exist.&lt;br /&gt;
&lt;br /&gt;
A software only solution may be possible to allow for monitoring but that will use up system resources and may or may not work with Mixer.&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting Tips =&lt;br /&gt;
&lt;br /&gt;
== X1000 CFE Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please remember to refer to CFE&#039;s documentation located in SYS:Documentation/X1000_CFE.pdf for information on boot configuration.&lt;br /&gt;
&lt;br /&gt;
== X1000 Won&#039;t Reboot Reliably ==&lt;br /&gt;
&lt;br /&gt;
# Turn off power to PSU.&lt;br /&gt;
# Remove plug from PSU.&lt;br /&gt;
# Remove power connector from the motherboard.&lt;br /&gt;
# Take out one RAM card leaving only one to the right of the PA6T CPU (i.e. 3rd slot from the left).&lt;br /&gt;
# While the RAM card is out check the slots 2 &amp;amp; 3 for dust build up (the CPU fan blows dust onto them) and use a small clean brush to remove it.&lt;br /&gt;
# Plug power connector back on to the motherboard.&lt;br /&gt;
# Connect PSU power &amp;amp; switch on PSU.&lt;br /&gt;
# Turn on X1000.&lt;br /&gt;
&lt;br /&gt;
If the X1000 boots up to Workbench, press and hold the power button for 3-5 seconds &amp;amp; it should shut off.&lt;br /&gt;
&lt;br /&gt;
==X1000 CPU temperatures are rising==&lt;br /&gt;
&lt;br /&gt;
# Clean both fan  filters on the front fan openings.&lt;br /&gt;
# Clean the fan filter UNDER the power supply unit.&lt;br /&gt;
&lt;br /&gt;
==X1000 fails to boot, &amp;quot;Loading&amp;quot; indicator goes full red and then stops==&lt;br /&gt;
&lt;br /&gt;
# This will happen when booting an older workbench with a newer graphics card.&lt;br /&gt;
# You&#039;ll need to update your PCIGraphics.card and RadeonHD.chip, or revert to an HD4000 series graphics card.&lt;br /&gt;
&lt;br /&gt;
==X1000 fails to boot==&lt;br /&gt;
&lt;br /&gt;
May also happen if non-bootable media is left in the CD/DVD drive.&lt;br /&gt;
&lt;br /&gt;
==X1000 fails to boot, &amp;quot;Failed to load amigaboot.of: Insufficient memory&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
# Relax your memory isn&#039;t fried.&lt;br /&gt;
# Check the SATA cable to your DVDRW drive (top left on the motherboard)&lt;br /&gt;
# Don&#039;t forget to check the power cable too.&lt;br /&gt;
&lt;br /&gt;
For some reason CFE reports insufficient memory errors when it can&#039;t find an optical drive.&lt;br /&gt;
&lt;br /&gt;
If checking cables doesn&#039;t correct the problem, check that CFE is able to read the amigaboot.of bootloader. Generally it can read it from an installation CD, a hard disk partition, or even from an internal CompactFlash, but there are constraints which you should be aware of:&lt;br /&gt;
* CFE can only boot on sata drives connected to [http://dl.dropbox.com/u/30631303/Amiga/Setting_Board/Sata.jpg Sata0 or Sata2 connectors], so check that your DVD drive and your system hardisk are connected to these.&lt;br /&gt;
* CFE can only read a few file systems among which &lt;br /&gt;
** ISO for CDs &lt;br /&gt;
** FFS2, ext2 or FAT for hard disks or CompactFlash&lt;br /&gt;
* CFE can&#039;t detect filesystems, they must be specified in the boot command&lt;br /&gt;
** for a CD: &#039;&#039;-fs=isofs&#039;&#039;&lt;br /&gt;
** for an AmigaOS FFS partition: &#039;&#039;-fs=amigafs&#039;&#039;&lt;br /&gt;
* CFE must find an amigaboot.of file on the unit indicated by the boot command, it&#039;s up to you to check that it&#039;s available&lt;br /&gt;
=== Checking the boot command ===&lt;br /&gt;
The boot menu is configured through a set of MENU_x_LABEL/MENU_x_COMMAND pairs. If one of the entry doesn&#039;t work, you have to check that:&lt;br /&gt;
* the unit exists,&lt;br /&gt;
* the filesystem is correct,&lt;br /&gt;
* the amigaboot.of file is present.&lt;br /&gt;
&lt;br /&gt;
==== checking the units ====&lt;br /&gt;
At CFE prompt, display your menu commands with the &#039;&#039;printenv&#039;&#039; command, you may get such menu entries:&lt;br /&gt;
 MENU_0_COMMAND=setenv amigaboot_quiet Y ;boot -fs=amigafs ide0.0:amigaboot.of &lt;br /&gt;
 MENU_1_COMMAND=setenv amigaboot_quiet Y ;boot -fs=iso atapi0.1:amigaboot.of&lt;br /&gt;
To check what CFE may access, type the &#039;&#039;show device&#039;&#039; command. (NB: hard disks are displayed as ide units and CD/DVD drives as atapi units)&lt;br /&gt;
For example:&lt;br /&gt;
 CFE&amp;gt; show devices&lt;br /&gt;
 Device Name          Description&lt;br /&gt;
 -------------------  ---------------------------------------------------------&lt;br /&gt;
 uart0                NS16550 UART at 0xFCFF03F8&lt;br /&gt;
 pcconsole0           PC Console (USB/VESA)&lt;br /&gt;
 eeprom0              Microchip 24LC128 EEPROM on SMBus channel 0 dev 0x57&lt;br /&gt;
 eth0                 PA Semi Ethernet (ge3) at 0xE00A3000 (02-00-E0-0A-30-00)&lt;br /&gt;
 flash0.os            SPI flash at FFE00000 offset 00000000 size 1024KB&lt;br /&gt;
 flash0.boot          SPI flash at FFE00000 offset 00100000 size 1024KB&lt;br /&gt;
 therm0               TI TMP423 Thermal Sensor on SMBus channel 0 dev 0x4C&lt;br /&gt;
 cf0                  CompactFlash ATA disk unit 0 at 0xF0000000&lt;br /&gt;
 atapi0.0             PCI IDE disk unit 0 at I/O 0000 (PCI:E0590000)&lt;br /&gt;
 ide0.1               PCI IDE disk unit 1 at I/O 0000 (PCI:E0590000)&lt;br /&gt;
 eth1                 RTL8139 Ethernet at 0xA0310000 (00-50-fc-1f-1f-de)&lt;br /&gt;
 usbdisk0             USB Disk unit 0&lt;br /&gt;
 usbdisk1             USB Disk unit 1&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
 CFE&amp;gt; &lt;br /&gt;
In this example you should notice that CFE does not see ide0.0 and atapi0.1 but ide0.1 and atapi0.0. In this case, it means the menu commands are based ont the hard disk being connected on Sata0 and the CD drive on Sata2, but in fact it&#039;s connected the other way around.&lt;br /&gt;
Either you modify the menu commands, or you swap the cables on the Sata connectors 0 and 2.&lt;br /&gt;
&lt;br /&gt;
==== checking filesystem ====&lt;br /&gt;
Once your units are correctly identified, you should check the filesystem is correct with the &#039;&#039;dir&#039;&#039; command.&lt;br /&gt;
Note that the error message may be different depending on the type of unit and the filesystem. Just keep in mind that if the command status is 0, the filesystem is correct.&lt;br /&gt;
* trying to read an SFS/02 partition:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs ide0.1,prod:&lt;br /&gt;
 Could not init file system: Unsupported function&lt;br /&gt;
 *** command status = -19&lt;br /&gt;
* trying to read a wrong unit:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs ide0.0:&lt;br /&gt;
 Could not init file system: Insufficient memory&lt;br /&gt;
 *** command status = -5&lt;br /&gt;
* trying to read a FAT partition as FFS:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs cf0:&lt;br /&gt;
 Could not init file system: File not found&lt;br /&gt;
 *** command status = -18&lt;br /&gt;
* trying to read an FFS partition as FAT:&lt;br /&gt;
 CFE&amp;gt; dir -fs=fat ide0.1:&lt;br /&gt;
 Could not init file system: File system not recognized&lt;br /&gt;
 *** command status = -29&lt;br /&gt;
&lt;br /&gt;
* and finally finding the Grail:&lt;br /&gt;
 CFE&amp;gt; dir -fs=amigafs ide0.1:&lt;br /&gt;
 Directory&lt;br /&gt;
    amigaboot.of                        51420      ------------r---&lt;br /&gt;
 &lt;br /&gt;
 51420 bytes in 1 files&lt;br /&gt;
 0 directories&lt;br /&gt;
 *** command status = 0&lt;br /&gt;
==== finding amigaboot.of ====&lt;br /&gt;
Once you get the &#039;&#039;dir&#039;&#039; command working, make sure it lists the amigaboot.of file like in the example above, as CFE will load it and pass control to it to continue the boot process, either to present a second boot menu based on kicklayouts or to directly load the kickstart.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==X1000 won&#039;t boot (black screen, no boot at all) with only 3 LEDs lighting on motherboard==&lt;br /&gt;
&lt;br /&gt;
Check the CMOS battery.&lt;br /&gt;
&lt;br /&gt;
== X1000 Keyboard does not work while booting==&lt;br /&gt;
&lt;br /&gt;
Plug the keyboard into the USB connector closest to the white audio jack.&lt;br /&gt;
&lt;br /&gt;
This is &amp;quot;upper left&amp;quot; as you look at the back of the case. (ref Sys:documentation/X1000_QuickstartGuide.pdf page 9)&lt;br /&gt;
&lt;br /&gt;
Do not plug a keyboard with a built in hub in that socket, CFE does not approve.&lt;br /&gt;
&lt;br /&gt;
==Creating a new boot CD step by step==&lt;br /&gt;
&lt;br /&gt;
This is taken from a post on Amigaworld.net by Lyle Hazelwood.&lt;br /&gt;
&lt;br /&gt;
If you have upgraded to a newer graphics card, any old boot  CDs that don&#039;t have the new RadeonHD drivers will not boot. Here is a simple way to create a more useful CD.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to go back to a compatible graphics card to get running long enough to do this. I hope your original video card is still available to you.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
You have a Bootable Recovery CD, like &amp;quot;AmigaOS 4.1 Update 5&amp;quot;. Your current Workbench has been upgraded with the new RadeonHD drivers. You have a blank CDROM disk and a drive capable of burning it.&lt;br /&gt;
&lt;br /&gt;
=== Step by step ===&lt;br /&gt;
&lt;br /&gt;
1. Check SYS:Utilities for &amp;quot;AmiDVD&amp;quot;. If not there, insert the recovery CD and run the &amp;quot;Extras Installer&amp;quot;, then select AmiDVD and allow it to install.&lt;br /&gt;
&lt;br /&gt;
2. With the recovery CD still in the drive, open a Shell and enter the following commands:&lt;br /&gt;
 MakeDir RAM:BootVol&lt;br /&gt;
 Copy CD0: RAM:BootVol ALL CLONE&lt;br /&gt;
 Copy SYS:Kickstart/PCIGraphics.card RAM:BootVol/System/Kickstart&lt;br /&gt;
 Copy SYS:Kickstart/RadeonHD.chip RAM:BootVol/System/Kickstart&lt;br /&gt;
&lt;br /&gt;
Then make a note of the exact volume name of CD0:. Mine was &amp;quot;AmigaOS 4.1 Update 5&amp;quot; for this example.&lt;br /&gt;
&lt;br /&gt;
3. Now remove the recovery CD and replace it with a blank CD-ROM.&lt;br /&gt;
&lt;br /&gt;
4. Open SYS:Utilities/AmiDVD/AmiDVD&lt;br /&gt;
&lt;br /&gt;
5. From the &amp;quot;CreateImage&amp;quot; Tab, Set source to RAM:BootVol, then set VolumeName to &amp;quot;AmigaOS 4.1 Update 5&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
6. Select Bootable AmigaOS4 and finally select &amp;quot;Create Image&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
7. Now on to tab2, &amp;quot;Burn Image&amp;quot;, and click on &amp;quot;Burn CD-R&amp;quot;&lt;br /&gt;
&lt;br /&gt;
That&#039;s it! The resulting disk should be identical to the original but will boot properly with newer graphics cards.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Remember|text=This new boot image is under the same agreement that the RadeonHD drivers were distributed under. It is NOT OK to share this disk with others.}}&lt;br /&gt;
&lt;br /&gt;
==Intermittent power on/off problems==&lt;br /&gt;
&lt;br /&gt;
Check all PCI(e) cards are securely in their slots.&lt;/div&gt;</summary>
		<author><name>Ölrick Lefebvre</name></author>
	</entry>
</feed>