

<?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=Steven+Solie</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=Steven+Solie"/>
	<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/wiki/Special:Contributions/Steven_Solie"/>
	<updated>2026-06-02T07:34:00Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Exec_Memory_Allocation&amp;diff=12391</id>
		<title>Exec Memory Allocation</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Exec_Memory_Allocation&amp;diff=12391"/>
		<updated>2024-04-03T16:02:39Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exec Memory Allocation ==&lt;br /&gt;
&lt;br /&gt;
Exec manages all of the free memory currently available in the system. Using a slab allocation system, Exec keeps track of memory and provides the functions to allocate and access it.&lt;br /&gt;
&lt;br /&gt;
When an application needs some memory, it can either declare the memory statically within the program or it can ask Exec for some memory. When Exec receives a request for memory, it searches its free memory regions to find a suitably sized block that matches the size and attributes requested.&lt;br /&gt;
&lt;br /&gt;
Prior to AmigaOS 4.0, the OS did not make use of the CPU&#039;s memory management unit and used memory &amp;quot;as-is&amp;quot;. That is, if you have different memory expansions plugged into your system, the memory will be seen as chunks located somewhere in the 4 gigabyte address space. Since version 4.0, the MMU will be used to &amp;quot;map&amp;quot; memory pages from their physical location to a virtual address. There are multiple reasons why this is better than using the verbatim physical addresses - among other things it reduces the effect of &amp;quot;memory fragmentation&amp;quot; and simplifies the possibility to swap currently unused memory pages to persistent storage such as a hard disk.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;downside&amp;quot; is that the virtual address of a memory block is almost never identical to the physical address. This isn&#039;t much of a downside, since an application will never really need to care about it. If an application allocates a block of memory of n bytes, it will get a pointer back that points to at least n continuous addresses as expected. The pages that &amp;quot;fill&amp;quot; this memory block may come from different physical locations scattered throughout the physical memory but a program will never noticed that. For all intent and purpose, the application sees a single continuous block of memory.&lt;br /&gt;
&lt;br /&gt;
=== Program Address Space ===&lt;br /&gt;
&lt;br /&gt;
It is important to remember that, just like in classic AmigaOS, a single address space is used for all programs. Sometimes the mention of an MMU can lead people to assume that each process on the Amiga will have its own personal, partitioned address space. The following two programs demonstrate that, even though they are separate processes, it is possible to read and write another&#039;s memory. The memory locations are the same virtual address and that virtual address maps onto the same physical address.&lt;br /&gt;
&lt;br /&gt;
This program has a global variable. It prints out the virtual address of the global, the value at that address (which can be optionally specified), waits for a keypress and, finally, prints out the value at that same address again in case it has been externally updated (which is done by the subsequent program listing):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
volatile char x = 127;&lt;br /&gt;
&lt;br /&gt;
/* Usage: a [VAL] */&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    if(argc==2)&lt;br /&gt;
        x = (char)atoi(argv[1]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Virtual Address    of `x&#039;: %p\n&amp;quot;, (void*)&amp;amp;x);&lt;br /&gt;
    printf(&amp;quot;Dereferenced Value of `x&#039;: %d\n&amp;quot;, x);&lt;br /&gt;
    (void)getchar();&lt;br /&gt;
    printf(&amp;quot;Final Value        of `x&#039;: %d\n&amp;quot;, x);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This program reads in an address as an argument and prints the value at that address even though it does not &amp;quot;own&amp;quot; the memory. By adding an additional argument, this program can also write to that &amp;quot;foreign&amp;quot; address. After this program is complete, you can press a key on the previous program and see that the value changed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Usage: b ADDR [VAL_TO_WRITE] */&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    if(!(argc==2 || argc==3))&lt;br /&gt;
        return 10;&lt;br /&gt;
&lt;br /&gt;
    volatile char *byte = (volatile char*)strtol(argv[1],NULL,16);&lt;br /&gt;
    printf(&amp;quot;Selected Virtual Address    : %p\n&amp;quot;,(void*)byte);&lt;br /&gt;
    printf(&amp;quot;Dereferenced Value of Address: %d\n&amp;quot;,*byte);&lt;br /&gt;
    if(argc==3)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Writing Value `%d&#039; to Address: %p\n&amp;quot;,atoi(argv[2]),(void*)byte);&lt;br /&gt;
        *byte=(char)atoi(argv[2]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Slab allocation ===&lt;br /&gt;
&lt;br /&gt;
[[File:SlabDiagram.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
The AmigaOS memory architecture is based on the &amp;quot;slab allocator&amp;quot; system or &amp;quot;object cache&amp;quot;. In essence, the slab allocator only allocates objects of a single size, allocating these in larger batches (&amp;quot;slabs&amp;quot;) from the low-level page allocator. These slabs are then divided up into buffers of the required size, and kept within a list in the slab allocator.&lt;br /&gt;
&lt;br /&gt;
Allocating an object with the slab allocator becomes a process of simple node removal: the first node in the first slab containing free nodes is removed and returned for use. Since the slab allocator keeps free slabs or partially free slabs in a separate list from the full slabs, this operation can be carried out in constant time. Freeing memory is accomplished by returning the buffer to its cache, and adding it to its original slab&#039;s free list. Slabs that are completely free can be returned to the system&#039;s page pool (this operation is actually driven by demand, and timestamps are used to avoid unnecessary loading of data, or &amp;quot;thrashing&amp;quot;). External fragmentation is minimal, and internal fragmentation is controlled and guaranteed not to exceed a certain amount.&lt;br /&gt;
&lt;br /&gt;
=== Object caching ===&lt;br /&gt;
&lt;br /&gt;
The slab allocator can also be used to cache objects. In the real world a lot of memory allocation operations will be used to allocate the same object. The system has a number of data structures which are allocated frequently (semaphores, message ports and the like). Every time such structures are allocated, they must be initialised, and when they are deleted again, they must be cleaned up. It&#039;s likely, however, that such a structure will be needed again in the future, so that it can be kept in its initialised state and re-used later. This further reduces the load on the allocator routines, and thus improves system performance.&lt;br /&gt;
&lt;br /&gt;
The object caches work on memory that has already been mapped into the virtual memory space.&lt;br /&gt;
&lt;br /&gt;
=== More Advantages ===&lt;br /&gt;
&lt;br /&gt;
Another advantage is the possibility to improve CPU cache usage. Usually, most objects have &amp;quot;hot spots&amp;quot;, i.e. they have a few fields that are used often. Since most of the time a little memory is left unused in a slab (the object size might not be a multiple of the slab size), this additional memory can be used to &amp;quot;shift&amp;quot; the hot spots by a few bytes to optimise the memory structure, leading to better cache usage.&lt;br /&gt;
&lt;br /&gt;
Finally, the system can be expanded to multiple CPUs with next to no overhead. On multi-CPU system, these expanded slab allocators scale almost linearly with the number of CPUs employed, making it the ideal choice for such systems.&lt;br /&gt;
&lt;br /&gt;
The combination of object caching and keeping caches for different memory blocks (for AllocVec/FreeVec emulation) makes the memory management more efficient, faster, and generally more future-proof than the old free list approach used in AmigaOS 3.x and earlier.&lt;br /&gt;
&lt;br /&gt;
See Wikipedia for more information on [http://en.wikipedia.org/wiki/Slab_allocation slab allocator systems].&lt;br /&gt;
&lt;br /&gt;
=== Physical page allocation ===&lt;br /&gt;
&lt;br /&gt;
Every memory location in a computer system has its own, unique address. That is, there is a byte location at address x where you can store and retrieve a single byte. This address is fixed; there is no way to change it without physically changing the hardware. Therefore, this address is called the “physical” address.&lt;br /&gt;
&lt;br /&gt;
The physical address of a memory page is most often completely irrelevant to the application. The CPU will typically only see the virtual address. AmigaOS will take care of assigning virtual addresses to memory paging. This is often called “mapping” a page. Only in very special cases will the physical address be relevant. For example, device drivers that want to pass memory to a hardware device via DMA. Since the MMU is part of the CPU, any external hardware like an IDE controller will not see the virtual but only physical addresses.&lt;br /&gt;
&lt;br /&gt;
A common operation in memory allocation is the assignment of virtual addresses to physical memory locations. Allocation of physical memory is usually done differently from virtual allocations, since it&#039;s necessary to free up only part of the allocation (when for example the pager kicks in).&lt;br /&gt;
&lt;br /&gt;
The de-facto standard in allocation of physical pages is a method invented by Knuth, called [http://en.wikipedia.org/wiki/Buddy_memory_allocation the &amp;quot;buddy system&amp;quot;]. Basically every modern operating system uses it and AmigaOS is no exception.&lt;br /&gt;
&lt;br /&gt;
Buddy systems are in essence size-segregated free lists. To allocate, the system searches for a free block of at least the size of the allocation. Then, if the block is too large, it&#039;s split into two even-sized blocks. These blocks are called &amp;quot;buddies&amp;quot;. One block is returned to it&#039;s appropriate free list, and the other is considered further, maybe splitting it further until it&#039;s size matches that of the allocation.&lt;br /&gt;
&lt;br /&gt;
In a buddy system, it&#039;s easy to determine whether the &amp;quot;buddy&amp;quot; is free or not, because it&#039;s address can simply be decided based on the address of the block to be freed.&lt;br /&gt;
&lt;br /&gt;
=== Virtual address space allocation ===&lt;br /&gt;
&lt;br /&gt;
Most CPUs come with a special unit that is called a &amp;quot;memory management unit&amp;quot; or &amp;quot;MMU&amp;quot; for short. The MMU&#039;s primary job is to rearrange the physical memory within the 4 gigabytes of address space in a way that is convenient for the operating system and/or applications. To do that effectively, it divides the memory into blocks (called &amp;quot;pages&amp;quot;). For every page the MMU has an entry in a table that specifies where the CPU should &amp;quot;see&amp;quot; this page, and what special attributes the page has. The address where the CPU &amp;quot;sees&amp;quot; this page is a 32 bit address as well, but since the memory is not really located there, we call that a &amp;quot;virtual&amp;quot; address.&lt;br /&gt;
&lt;br /&gt;
AmigaOS uses a resource map allocator for allocating virtual address space. Basically this is a means of managing a set of resources (not necessarily memory). For performance reason, it uses several optimization techniques.&lt;br /&gt;
&lt;br /&gt;
For one, all free resource blocks are held in space-segregated lists, i.e. there is a list for each power-of-two resource group. This makes allocations a lot faster by providing an upper and lower bound for a search. For example, if you want to allocate a block of 2^10 bytes, you can basically skip searching any block below 2^10 bytes in size simply because it won&#039;t fit. Similarly, you don&#039;t need to search for blocks that are larger than, say, twice the size of the block, since there might still be blocks of a size near to what we need. Size-segregated free lists help narrow down the search, making the search itself faster and the result better in terms of fragmentation.&lt;br /&gt;
&lt;br /&gt;
In addition, the resource maps use object caches for accelerating &amp;quot;small&amp;quot; allocations. Most allocations are below a certain size. For example, the virtual addresses are always allocated in chunks of at least one &amp;quot;page&amp;quot; in memory (4096 bytes). So it&#039;s common to allocate blocks of one, two, four, or eight pages. The object caches provide an easy method for keeping these common sizes, making every allocation of these sizes an exact fit, further reducing fragmentation.&lt;br /&gt;
&lt;br /&gt;
=== Page cache ===&lt;br /&gt;
&lt;br /&gt;
A lot of the time spent in allocating memory was spent looking for the appropriate pages in memory. A 256 MB memory system has 65536 4KB pages. These pages have to be searched for from time to time. Originally, hash tables were used but it turned out that distributing 65536 page entries over a few hash buckets still produced lists of several thousand pages that had to be traversed to find a page. The hash table was replaced with a radix tree. These trees are rather broad, but shallow, making traversal very fast. In usual circumstances, the tree does not grow more than 4 to 5 levels in depth, making searching of a page a matter of maximum 4 to 5 compare operations.&lt;br /&gt;
&lt;br /&gt;
=== Pager ===&lt;br /&gt;
&lt;br /&gt;
AmigaOS has the possibility to swap out parts of memory to disk in order to free up more memory for other applications. This feature allows applications to use more memory than is actually physically installed in the system.&lt;br /&gt;
&lt;br /&gt;
Paging is commonly referred to as &amp;quot;virtual memory&amp;quot; by users and sometimes even software developers. The fact AmigaOS uses virtual memory does not imply the use of the pager.&lt;br /&gt;
&lt;br /&gt;
The system can be tuned to different strategies, either page out only on demand (for highly interactive tasks), or based on other needs (lots of free memory in core for disk caches etc.).&lt;br /&gt;
&lt;br /&gt;
The optimized data structures allow the memory system to operate at a very high speed.&lt;br /&gt;
&lt;br /&gt;
The time for a memory allocation is now in the order of a few microseconds. This is especially true for small allocation (below 8096 bytes). During system testing it was observed that by the time the system has booted up to Workbench, there have already been 40,000 allocations to the global memory pool below 2096 bytes.&lt;br /&gt;
&lt;br /&gt;
== Memory Functions ==&lt;br /&gt;
&lt;br /&gt;
Normally, an application uses the AllocVecTags() function to ask for memory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
void *AllocVecTags(uint32 size, uint32 tag1, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The size argument is the amount of memory the application needs and the tag list specifies the type of memory and any special memory characteristics (described later). If AllocVecTags() is successful, it returns a pointer to a block of memory. The memory allocation will fail if the system cannot find a big enough block with the requested attributes. If AllocVecTags() fails, it returns NULL.&lt;br /&gt;
&lt;br /&gt;
Because the system only keeps track of how much free memory is available and not how much is in use, it has no idea what memory has been allocated by any task. This means an application has to explicitly return, or deallocate, any memory it has allocated so the system can reuse it. If an application does not return a block of memory to the system, the system will not be able to reallocate that memory to some other task. That block of memory will be lost until the Amiga is reset. If you are using AllocVecTags() to allocate memory, a call to FreeVec() will return that memory to the system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
void FreeVec(void *memoryBlock);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here memoryBlock is a pointer to the memory block the application is returning to the system. The size of the memory block is tracked internally by the system.&lt;br /&gt;
&lt;br /&gt;
Unlike some compiler memory allocation functions, the Amiga system memory allocation functions return memory blocks that are at least longword aligned. This means that the allocated memory will always start on an address which is at least evenly divisible by four. This alignment makes the memory suitable for any system structures or buffers which require word or long word alignment, and also provides optimal alignment for stacks and memory copying.&lt;br /&gt;
&lt;br /&gt;
=== Memory Types ===&lt;br /&gt;
&lt;br /&gt;
There are three primary types of memory in AmigaOS which are summarized in the following table:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type&lt;br /&gt;
! Use&lt;br /&gt;
|-&lt;br /&gt;
| MEMF_PRIVATE&lt;br /&gt;
| This memory is private and only accessible within the context of the Task which allocated it. Private memory should always be preferred. Private memory is also swappable by default (i.e. not locked). This memory will not be visible to any other address space.&lt;br /&gt;
	In a future version of AmigaOS, it is planned to have Task specific address spaces. This means each task could potentially address up to 4 GB of private memory each.&lt;br /&gt;
|-&lt;br /&gt;
| MEMF_SHARED&lt;br /&gt;
| The memory is shared and accessible by any Task in the system without restriction. This memory can be shared between all address spaces and will always appear at the same address in any address space. Shared memory is locked by default and thus is not swappable.&lt;br /&gt;
|-&lt;br /&gt;
| MEMF_EXECUTABLE&lt;br /&gt;
| The memory is used to store executable PowerPC code. This is used two-fold in AmigaOS. First, it allows the system to determine if a function pointer points to real native PowerPC code as opposed to 68k code which needs to be emulated. Second, it prevents common exploits that use stack overflows to execute malicious code. Executable memory is locked by default and thus is not swappable.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Memory Attributes ===&lt;br /&gt;
&lt;br /&gt;
Memory allocation on AmigaOS has traditionally been rather complicated. Over time, as new hardware models were released, more memory attribute flags were introduced.&lt;br /&gt;
&lt;br /&gt;
All the various memory allocation functions and strategies have been consolidated and distilled into a single AllocVecTags() function call. Programmers are strongly encouraged to stop using any other function to allocate system memory. Using AllocVecTags() is the only way to guarantee future compatibility with more advanced AmigaOS features yet to come.&lt;br /&gt;
&lt;br /&gt;
If an application does not specify any attributes when allocating memory, the system tries to satisfy the request with the fastest memory available on the system memory lists.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Make Sure You Have Memory|text=Always check the result of any memory allocation to be sure the type and amount of memory requested is available. Failure to do so will lead to trying to use an non-valid pointer.}}&lt;br /&gt;
&lt;br /&gt;
==== Using Tags ====&lt;br /&gt;
&lt;br /&gt;
The AllocVecTags() function uses a tag list to define what attributes a block of memory must have. The currently supported tags are listed below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tag (Default)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | AVT_Type&lt;br /&gt;
	(MEMF_PRIVATE)&lt;br /&gt;
|-&lt;br /&gt;
| MEMF_PRIVATE: Allocate from the task private heap. This memory will not be visible to any other address space.&lt;br /&gt;
|-&lt;br /&gt;
| MEMF_SHARED: Allocate from the system shared heap. This memory can be shared between all address spaces and will always appear at the same address in any address space. This memory is locked by default (see AVT_Lock tag below).&lt;br /&gt;
|-&lt;br /&gt;
| MEMF_EXECUTABLE: Allocate memory that is marked executable. This memory is locked by default (see AVT_Lock tag below).&lt;br /&gt;
|-&lt;br /&gt;
| AVT_Contiguous&lt;br /&gt;
	(FALSE)&lt;br /&gt;
| Memory allocated with this property is allocated from a contiguous block of physical memory. This makes the memory suitable for DMA purposes when the DMA device does not support scatter/gather operation. For devices that do support scatter/gather use StartDMA() instead.&lt;br /&gt;
	&#039;&#039;Note:&#039;&#039; Physical pages can move at any time, be removed from memory due to paging or otherwise made unavailable unless the memory pages are locked (see LockMemory() function or AVT_Lock tag).&lt;br /&gt;
|-&lt;br /&gt;
| AVT_Lock&lt;br /&gt;
	(TRUE or FALSE)&lt;br /&gt;
| After allocating memory, lock the associated pages in memory. This will prevent the pages from being moved, swapped out or otherwise being made unavailable. This is useful in conjunction with the AVT_Contiguous tag since it will ensure that the memory will stay contiguous after allocation.&lt;br /&gt;
	This tag defaults to FALSE for MEMF_PRIVATE allocations and to TRUE for MEMF_SHARED or MEMF_EXECUTABLE.&lt;br /&gt;
|-&lt;br /&gt;
| AVT_Alignment&lt;br /&gt;
	(16)&lt;br /&gt;
| Define an alignment constraint for the allocated memory block. The returned memory block will be aligned to the given size (in bytes). It&#039;s virtual address will be at least a multiple of the AVT_Alignment value.&lt;br /&gt;
	&#039;&#039;Note:&#039;&#039; Alignment values must be powers of two. MEMF_EXECUTABLE memory is always aligned to the current page size.&lt;br /&gt;
|-&lt;br /&gt;
| AVT_PhysicalAlignment&lt;br /&gt;
	(16)&lt;br /&gt;
| Define an alignment constraint for the allocated memory block physical address. See AVT_Alignment for more information.&lt;br /&gt;
	&#039;&#039;Note:&#039;&#039; This functionality is mainly used for DMA drivers that require a specific alignment. Alignment values must be powers of two. MEMF_EXECUTABLE memory is always aligned to the current page size.&lt;br /&gt;
|-&lt;br /&gt;
| AVT_ClearWithValue&lt;br /&gt;
| Clear the newly allocated memory with the given byte value. If this tag is not given the memory block is not cleared.&lt;br /&gt;
|-&lt;br /&gt;
| AVT_Wait&lt;br /&gt;
	(TRUE)&lt;br /&gt;
| Wait for the memory subsystem to be available. If TRUE, the calling task will be retired until the memory subsystem is available. This might cause a Forbid() to break. When FALSE and the memory subsystem is not currently available, the function will return immediately and the allocation will fail.&lt;br /&gt;
|-&lt;br /&gt;
| AVT_NoExpunge&lt;br /&gt;
	(FALSE)&lt;br /&gt;
| If allocation fails because of unavailability, prevent invocation of low memory cleanup handlers. The default is FALSE which means that when memory is not available, cleanup handlers are invoked to try and satisfy the allocation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Using Flags ====&lt;br /&gt;
&lt;br /&gt;
The use of memory flags was the only supported way to allocate memory prior to AmigaOS 4.0. It may be still useful to know more about this obsolete system for porting older applications. For more information about the memory flags system see [[Obsolete Exec Memory Allocation]].&lt;br /&gt;
&lt;br /&gt;
=== Allocating System Memory ===&lt;br /&gt;
&lt;br /&gt;
The following examples show how to allocate memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR apointer = IExec-&amp;gt;AllocVecTags(100, TAG_END);&lt;br /&gt;
&lt;br /&gt;
if (apointer == NULL)&lt;br /&gt;
    {  /* COULDN&#039;T GET MEMORY, EXIT */ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllocVecTags() returns the address of the first byte of a memory block that is at least 100 bytes in size or NULL if there is not that much free memory. Because there are no tags specified, private memory is assumed so this memory cannot be shared with any other tasks.&lt;br /&gt;
&lt;br /&gt;
In addition to allocating a block of memory, this function keeps track of the size of the memory block, so your application doesn&#039;t have to remember it when it deallocates that memory block. The AllocVecTags() function allocates a little more memory to store the size of the memory allocation request.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Make No Assumptions|It is not legal to peek the longword in front of the returned memory pointer to find out how big the block is. This has always been illegal regardless of what any other documentation may have stated to the contrary. Your application has access to the memory returned by AllocVecTags() and the only guarantee made is that the returned block has n bytes of continuous address space starting at the returned address. Anything outside this area is not to be touched.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR anotherptr = IExec-&amp;gt;AllocVecTags(1000,&lt;br /&gt;
  AVT_Type, MEMF_SHARED,&lt;br /&gt;
  AVT_Lock, FALSE,&lt;br /&gt;
  AVT_ClearWithValue, 0,&lt;br /&gt;
  TAG_END);&lt;br /&gt;
&lt;br /&gt;
if (anotherptr == NULL)&lt;br /&gt;
    {  /* COULDN&#039;T GET MEMORY, EXIT */ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The example above allocates shared memory which is accessible by any task in the system and clears the memory contents to zero. MEMF_SHARED memory is locked by default for compatibility with the obsolete MEMF_PUBLIC flag. This is by far the most common case when allocating shared memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR lockedmem = IExec-&amp;gt;AllocVecTags(3000,&lt;br /&gt;
  AVT_Type, MEMF_SHARED,&lt;br /&gt;
  TAG_END);&lt;br /&gt;
&lt;br /&gt;
if (lockedmem == NULL)&lt;br /&gt;
    {  /* COULDN&#039;T GET MEMORY, EXIT */ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The example above allocated shared memory which is accessible by any task in the system. MEMF_SHARED memory is locked by default so the underlying memory pages are not moveable and cannot be swapped out. Such memory could be used to share memory between a Process and an interrupt routine for example.&lt;br /&gt;
&lt;br /&gt;
If the system free memory list does not contain enough contiguous memory bytes in an area matching your requirements, AllocVecTags() returns a zero. You &#039;&#039;must&#039;&#039; check for this condition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR yap = IExec-&amp;gt;AllocVec(500, MEMF_CHIP);&lt;br /&gt;
&lt;br /&gt;
if (yap == NULL)&lt;br /&gt;
    {  /* COULDN&#039;T GET MEMORY, EXIT */ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deprecated AllocVec() function is used in the example above because it is the only way to allocate MEMF_CHIP memory on a classic Amiga system.&lt;br /&gt;
&lt;br /&gt;
=== Locking System Memory ===&lt;br /&gt;
&lt;br /&gt;
The LockMem() function is used to explicitly lock a memory block. This function will make sure your memory block is not unmapped, swapped out or somehow made inaccessible. Use this function wisely. If there is no good reason to lock memory then do not do it. It will prevent the memory system from optimizing memory layout and may lead to poor performance. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
IExec-&amp;gt;LockMem(mem, 1000);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before deallocating the memory is must be unlocked as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
IExec-&amp;gt;UnLockMem(mem, 1000);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|title=&#039;&#039;Do not forget to UnlockMem()&#039;&#039;|Failure to unlock memory will have adverse affects on the memory system. Locked memory pages cannot be moved so the system cannot optimize the layout of locked memory pages.}}&lt;br /&gt;
&lt;br /&gt;
Be careful to always match the number of locks and the number of unlocks. If something else may have locked memory in the same page and an extraneous UnlockMem() decreases the lock reference counter to 0, that page can be paged out or moved. If that happens, for example, with data used in an interrupt handler or by the device driver which handles the swap partition the system will crash.&lt;br /&gt;
&lt;br /&gt;
=== Freeing System Memory ===&lt;br /&gt;
&lt;br /&gt;
The following examples free the memory chunks shown in the previous calls to AllocVecTags().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
IExec-&amp;gt;FreeVec(apointer);&lt;br /&gt;
&lt;br /&gt;
IExec-&amp;gt;FreeVec(anotherptr);&lt;br /&gt;
&lt;br /&gt;
IExec-&amp;gt;FreeVec(lockedmem);&lt;br /&gt;
&lt;br /&gt;
IExec-&amp;gt;FreeVec(yap);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A memory block allocated with AllocVecTags() or AllocVec() must be returned to the system pool with the FreeVec() function. This function uses the stored size in the allocation to free the memory block, so there is no need to specify the size of the memory block to free.&lt;br /&gt;
&lt;br /&gt;
Any memory that is locked must be explicitly unlocked with UnlockMem() prior to freeing it. Failure to unlock memory will not cause any immediate problems but any pages which are locked cannot be moved or swapped out which can decrease system performance.&lt;br /&gt;
&lt;br /&gt;
FreeVec() returns no status. However, if you attempt to free a memory block in the middle of a chunk that the system believes is already free, you will cause a system crash. It is also illegal to free the same memory block twice and this will lead to a system crash.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=&#039;&#039;Leave Memory Allocations Out Of Interrupt Code&#039;&#039;|text=Do not allocate or deallocate system memory from within interrupt code. The [[Exec_Interrupts|Exec Interrupts]] section explains that an interrupt may occur at any time, even during a memory allocation process. As a result, system data structures may not be internally consistent at this time.}}&lt;br /&gt;
&lt;br /&gt;
=== Memory may be Locked by Default ===&lt;br /&gt;
&lt;br /&gt;
By default, the system memory allocation routines will allocate MEMF_SHARED and MEMF_EXECUTABLE memory and implicitly lock it. This memory must not be explicitly unlocked. Let the system handle the unlocking internally.&lt;br /&gt;
&lt;br /&gt;
Here is the right way to allocate and free MEMF_SHARED memory:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR ptr = IExec-&amp;gt;AllocVecTags(10,&lt;br /&gt;
           AVT_Type, MEMF_SHARED,&lt;br /&gt;
           TAG_END);&lt;br /&gt;
IExec-&amp;gt;FreeVec(ptr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the wrong way:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR ptr = IExec-&amp;gt;AllocVecTags(10,&lt;br /&gt;
           AVT_Type, MEMF_SHARED,&lt;br /&gt;
           TAG_END);&lt;br /&gt;
IExec-&amp;gt;UnlockMem(ptr, 10);  // Doing this could lead to undefined system behaviour.&lt;br /&gt;
IExec-&amp;gt;FreeVec(ptr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unlocking memory not explicitly locked does not immediately cause any issues. However, in a future version of AmigaOS the memory pages may be handled differently than they are handled today. This could lead to incompatibilities with your applications and AmigaOS. The simple rule is that if you called LockMem() you must also call UnlockMem(). All other times you should not call UnlockMem().&lt;br /&gt;
&lt;br /&gt;
{{Note|Memory locking is done at the page level. Even if a single byte of memory is locked in a page that entire page is locked. The programmer has no control over which pages may be used to satisfy a memory allocation.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|Shared and executable memory is locked implicitly for 68K backwards compatibility reasons. Use AVT_Lock (or equivalent) to ensure your shared and executable memory is not locked. MEMF_PRIVATE memory has no backwards compatibility issues and is always unlocked by default.}}&lt;br /&gt;
&lt;br /&gt;
=== Memory Information Functions ===&lt;br /&gt;
&lt;br /&gt;
The memory information routines AvailMem() and TypeOfMem() can provide the amount of memory available in the system, and the attributes of a particular block of memory.&lt;br /&gt;
&lt;br /&gt;
==== Memory Requirements ====&lt;br /&gt;
&lt;br /&gt;
The same attribute flags used in memory allocation routines are valid for the memory information routines. There is also an additional flag, MEMF_LARGEST, which can be used in the AvailMem() routine to find out what the largest available memory block of a particular type is. Specifying the MEMF_TOTAL flag will return the total amount of memory currently available.&lt;br /&gt;
&lt;br /&gt;
==== Calling Memory Information Functions ====&lt;br /&gt;
&lt;br /&gt;
The following example shows how to find out how much memory of a particular type is available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
uint32 size = IExec-&amp;gt;AvailMem(MEMF_CHIP | MEMF_LARGEST);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AvailMem() returns the size of the largest chunk of available chip memory.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=&#039;&#039;AvailMem() May Not Be Totally Accurate&#039;&#039;|text=Because of multitasking, the return value from AvailMem() may be inaccurate by the time you receive it.}}&lt;br /&gt;
&lt;br /&gt;
The following example shows how to determine the type of memory of a specified memory address.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
uint32 memtype = IExec-&amp;gt;TypeOfMem((APTR)0x090000);&lt;br /&gt;
if ((memtype &amp;amp; MEMF_CHIP) == MEMF_CHIP) {  /*  ... It&#039;s chip memory ...  */   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TypeOfMem() returns the attributes of the memory at a specific address. If it is passed an invalid memory address, TypeOfMem() returns NULL. This routine is normally used to determine if a particular chunk of memory is in chip memory.&lt;br /&gt;
&lt;br /&gt;
=== Using Memory Copy Functions ===&lt;br /&gt;
&lt;br /&gt;
For memory block copies, the CopyMem() and CopyMemQuick() functions can be used.&lt;br /&gt;
&lt;br /&gt;
==== Copying System Memory ====&lt;br /&gt;
&lt;br /&gt;
The following samples show how to use the copying routines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR source = IExec-&amp;gt;AllocVecTags(1000, AVT_ClearWithValue, 0, TAG_END);&lt;br /&gt;
APTR target = IExec-&amp;gt;AllocVecTags(1000, AVT_Type, MEMF_SHARED, TAG_END);&lt;br /&gt;
IExec-&amp;gt;CopyMem(source, target, 1000);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CopyMem() copies the specified number of bytes from the source data region to the target data region. The pointers to the regions can be aligned on arbitrary address boundaries. CopyMem() will attempt to copy the memory as efficiently as it can according to the alignment of the memory blocks, and the amount of data that it has to transfer. These functions are optimized for copying large blocks of memory which can result in unnecessary overhead if used to transfer very small blocks of memory.&lt;br /&gt;
&lt;br /&gt;
CopyMemQuick() is now identical to CopyMem(). In previous versions of the operating system, CopyMemQuick() performed more optimized copying of the specified number of bytes from the source data region to the target data region. The source and target pointers must be longword aligned and the size (in bytes) must be divisible by four. There are no such restrictions starting with AmigaOS 4.0.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=&#039;&#039;Not All Copies Are Supported&#039;&#039;|text=Neither CopyMem() nor CopyMemQuick() supports copying between regions that overlap. For overlapping regions see MoveMem() in the [[Utility Library]].}}&lt;br /&gt;
&lt;br /&gt;
=== System Memory Pools ===&lt;br /&gt;
&lt;br /&gt;
A construct carried over from the AmigaOS 3.x Exec is the memory pool. The code handling memory pools uses an algorithm based on boundary tags and size-segregated memory lists. The speed gain is tremendous: even for the &amp;quot;dumb&amp;quot; case of just allocating 100000 blocks and freeing them again, the speed is ten times faster than the previous implementation. Due to the size-segregated free lists and the easy coalescing due to the boundary tags, real-life performance gain is even higher and would be between 10 and 20 times.&lt;br /&gt;
&lt;br /&gt;
Two types of memory pools are available depending on the needs of the application:&lt;br /&gt;
* [[Exec_Item_Pools|Item Pools]] are built for speed and are used for allocating large numbers of items that are all the same size.&lt;br /&gt;
* Generic [[Exec_Memory_Pools|Memory Pools]] can handle allocations of different sizes at the expense of some speed.&lt;br /&gt;
&lt;br /&gt;
=== Summary of System Controlled Memory Handling Routines ===&lt;br /&gt;
&lt;br /&gt;
; AllocVecTags() and FreeVec()&lt;br /&gt;
: These are system-wide memory allocation and deallocation routines. They use a memory free-list owned and managed by the system.&lt;br /&gt;
&lt;br /&gt;
; LockMem() and UnlockMem()&lt;br /&gt;
: These routines explicitly lock and unlock underlying memory pages.&lt;br /&gt;
&lt;br /&gt;
; AvailMem()&lt;br /&gt;
: This routine returns the number of free bytes in a specified type of memory.&lt;br /&gt;
&lt;br /&gt;
; TypeOfMem()&lt;br /&gt;
: This routine returns the memory attributes of a specified memory address.&lt;br /&gt;
&lt;br /&gt;
; CopyMem() and CopyMemQuick()&lt;br /&gt;
: CopyMem() is a general purpose memory copy routine. CopyMemQuick() is an optimized version of CopyMemQuick(), but has restrictions on the size and alignment of the arguments.&lt;br /&gt;
&lt;br /&gt;
== Allocating DMA Memory ==&lt;br /&gt;
&lt;br /&gt;
Device drivers often use DMA to transfer data to and from the device. The StartDMA(), GetDMAList() and EndDMA() functions are used to create a scatter/gather list suitable for such DMA transfers.&lt;br /&gt;
&lt;br /&gt;
The following conditions are guaranteed to be met when using these DMA functions:&lt;br /&gt;
* The memory region given is guaranteed to be mapped to physical memory.&lt;br /&gt;
* The mapping will not change as long as EndDMA() is not called.&lt;br /&gt;
* All cache entries in this region will be flushed out.&lt;br /&gt;
&lt;br /&gt;
The example code below demonstrates how to perform a DMA write transfer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR addr;&lt;br /&gt;
uint32 size;&lt;br /&gt;
&lt;br /&gt;
/* Tell the system to prepare for DMA */&lt;br /&gt;
uint32 arraySize = IExec-&amp;gt;StartDMA(addr, size, 0);&lt;br /&gt;
if (arraySize &amp;gt; 0)&lt;br /&gt;
{&lt;br /&gt;
    /* The memory area is prepared, allocate and retrieve the DMA list */&lt;br /&gt;
    struct DMAEntry *DMAList = IExec-&amp;gt;AllocSysObject(ASOT_DMAENTRY,&lt;br /&gt;
      ASODMAE_NumEntries,  arraySize,&lt;br /&gt;
      TAG_END);&lt;br /&gt;
&lt;br /&gt;
    if (DMAList != NULL)&lt;br /&gt;
    {&lt;br /&gt;
        IExec-&amp;gt;GetDMAList(addr, size, 0, DMAList);&lt;br /&gt;
 &lt;br /&gt;
        /* Feed the DMA controller and do stuff */&lt;br /&gt;
        ...&lt;br /&gt;
        /* Get rid of the DMAList&#039;s memory */&lt;br /&gt;
 &lt;br /&gt;
        IExec-&amp;gt;EndDMA(addr, size, endFlags);&lt;br /&gt;
        IExec-&amp;gt;FreeSysObject(ASOT_DMAENTRY, DMAList);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        // Note We still call EndDMA() even though the actual&lt;br /&gt;
        // transfer didn&#039;t happen.&lt;br /&gt;
        IExec-&amp;gt;EndDMA(addr, size, DMAF_NoModify);&lt;br /&gt;
&lt;br /&gt;
        IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t allocate DMA list\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t initiate DMA transfer\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Syncing and Memory Access ==&lt;br /&gt;
&lt;br /&gt;
The PowerPC is a pure load/store architecture. That means, it will never operate on memory arguments like x86, to modify data, you have to load, modify and store.&lt;br /&gt;
&lt;br /&gt;
All PowerPC/POWER cpus have a load/store queue, i.e. a queue where load and store operations are queued to reduce memory latency. If more than one store is made to the same long word (i.e. you write the first byte and then the second byte), then those stores are combined. As you can see, this will cause a problem for a chip register since both are written at the same time which is likely not what you want.&lt;br /&gt;
&lt;br /&gt;
Similar for reading: A read might shortcut through the load/store queue and use a value that&#039;s already been read and is present in the load/store queue. Again, for chip registers, this will cause a problem because you might read an old value.&lt;br /&gt;
&lt;br /&gt;
There are two instructions that deal with this: &#039;&#039;&#039;eieio&#039;&#039;&#039; (Ensure In-order Execution of I/O) and &#039;&#039;&#039;sync&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The eieio instruction simply inserts a &amp;quot;barrier&amp;quot; into the load/store queue. When combining &#039;&#039;stores&#039;&#039; the CPU never searches past this barrier for possible combines. This means that the sequence&lt;br /&gt;
&lt;br /&gt;
# store to some address&lt;br /&gt;
# eieio&lt;br /&gt;
# store to some address + 1&lt;br /&gt;
&lt;br /&gt;
will never be combined because of the eieio barrier between them.&lt;br /&gt;
&lt;br /&gt;
The sync instruction will simply halt all execution and flush the load/store queue, executing and finishing all loads and stores.&lt;br /&gt;
&lt;br /&gt;
As you can imagine, sync is MUCH MORE costly than eieio.&lt;br /&gt;
&lt;br /&gt;
=== When to use eieio and sync ===&lt;br /&gt;
&lt;br /&gt;
If you want to write, post fix your writes with an eieio instruction.&lt;br /&gt;
&lt;br /&gt;
If you want to read, prefix your reads with a sync instruction.&lt;br /&gt;
&lt;br /&gt;
This is also where the &amp;quot;GUARDED&amp;quot; memory flag comes in. GUARDED memory simply ensures program order of loads and stores, that is, it&#039;s an implicit eieio.&lt;br /&gt;
&lt;br /&gt;
{{Note|Knowing when and how to use the &#039;&#039;&#039;eieio&#039;&#039;&#039; and &#039;&#039;&#039;sync&#039;&#039;&#039; instructions is somewhat vital for driver developers.}}&lt;br /&gt;
&lt;br /&gt;
== Allocating Multiple Memory Blocks ==&lt;br /&gt;
&lt;br /&gt;
Exec provides the routines AllocTaskMemEntry() and FreeEntry() to allocate multiple memory blocks in a single call.&lt;br /&gt;
&lt;br /&gt;
AllocTaskMemEntry() accepts a data structure called a MemList, which contains the information about the size of the memory blocks to be allocated and the requirements, if any, that you have regarding the allocation.&lt;br /&gt;
&lt;br /&gt;
The MemList structure is found in the include file &amp;lt;exec/memory.h&amp;gt; and is defined as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct MemList&lt;br /&gt;
{&lt;br /&gt;
    struct Node     ml_Node;&lt;br /&gt;
    UWORD           ml_NumEntries;      /* number of MemEntrys */&lt;br /&gt;
    struct MemEntry ml_ME[1];           /* where the MemEntrys begin*/&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; ml_Node&lt;br /&gt;
: allows you to link together multiple MemLists. However, the node is ignored by the routines AllocTaskMemEntry() and FreeEntry().&lt;br /&gt;
&lt;br /&gt;
; ml_NumEntries&lt;br /&gt;
: tells the system how many MemEntry sets are contained in this MemList. Notice that a MemList is a variable-length structure and can contain as many sets of entries as you wish.&lt;br /&gt;
&lt;br /&gt;
The MemEntry structure looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct MemEntry&lt;br /&gt;
{&lt;br /&gt;
    union {&lt;br /&gt;
        ULONG   meu_Reqs;   /* the AllocMem requirements */&lt;br /&gt;
        APTR    meu_Addr;   /* address of your memory */&lt;br /&gt;
        } me_Un;&lt;br /&gt;
    ULONG   me_Length;      /* the size of this request */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sample Code for Allocating Multiple Memory Blocks ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s an example of showing how to use the AllocTaskMemEntry() with multiple blocks of memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// alloctaskmementry.c - example of allocating several memory areas.&lt;br /&gt;
#include &amp;lt;exec/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;exec/memory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/dos.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct MemList *memlist;             /* pointer to a MemList structure        */&lt;br /&gt;
&lt;br /&gt;
struct MemBlocks /* define a new structure because C cannot initialize unions */&lt;br /&gt;
{&lt;br /&gt;
    struct MemList  mn_head;         /* one entry in the header               */&lt;br /&gt;
    struct MemEntry mn_body[3];      /* additional entries follow directly as */&lt;br /&gt;
} memblocks;                         /* part of the same data structure       */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    memblocks.mn_head.ml_NumEntries = 4; /* 4! Since the MemEntry starts at 1! */&lt;br /&gt;
&lt;br /&gt;
    /* Describe the first piece of memory we want.  Because of our MemBlocks structure */&lt;br /&gt;
    /* setup, we reference the first MemEntry differently when initializing it.        */&lt;br /&gt;
    memblocks.mn_head.ml_ME[0].me_Reqs   = MEMF_CLEAR;&lt;br /&gt;
    memblocks.mn_head.ml_ME[0].me_Length = 4000;&lt;br /&gt;
&lt;br /&gt;
    memblocks.mn_body[0].me_Reqs   = MEMF_PRIVATE | MEMF_CLEAR;/* Describe the other pieces of    */&lt;br /&gt;
    memblocks.mn_body[0].me_Length = 100000;                   /* memory we want. Additional      */&lt;br /&gt;
    memblocks.mn_body[1].me_Reqs   = MEMF_SHARED | MEMF_CLEAR; /* MemEntries are initialized this */&lt;br /&gt;
    memblocks.mn_body[1].me_Length = 200000;                   /* way. If we wanted even more en- */&lt;br /&gt;
    memblocks.mn_body[2].me_Reqs   = MEMF_EXECUTABLE;          /* tries, we would need to declare */&lt;br /&gt;
    memblocks.mn_body[2].me_Length = 25000;                    /* a larger MemEntry array in our  */&lt;br /&gt;
                                                               /* MemBlocks structure.            */&lt;br /&gt;
&lt;br /&gt;
    memlist = (struct MemList *)IExec-&amp;gt;AllocTaskMemEntry((struct MemList *)&amp;amp;memblocks);&lt;br /&gt;
&lt;br /&gt;
    if (memlist == NULL)&lt;br /&gt;
    {&lt;br /&gt;
       IDOS-&amp;gt;Printf(&amp;quot;AllocTaskMemEntry FAILED\n&amp;quot;);&lt;br /&gt;
       return RETURN_FAIL;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /* We got all memory we wanted.  Use it and call FreeEntry() to free it */&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;AllocTaskMemEntry succeeded - now freeing all allocated blocks\n&amp;quot;);&lt;br /&gt;
    IExec-&amp;gt;FreeEntry(memlist);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllocTaskMemEntry() returns a pointer to a new MemList of the same size as the MemList that you passed to it. For example, ROM code can provide a MemList containing the requirements of a task and create a RAM-resident copy of the list containing the addresses of the allocated entries. The pointer to the MemList is used as the argument for FreeEntry() to free the memory blocks.&lt;br /&gt;
&lt;br /&gt;
=== Result of Allocating Multiple Memory Blocks ===&lt;br /&gt;
&lt;br /&gt;
The MemList created by AllocTaskMemEntry() contains MemEntry entries. MemEntrys are defined by a union statement, which allows one memory space to be defined in more than one way.&lt;br /&gt;
&lt;br /&gt;
If AllocTaskMemEntry() returns a non-NULL value then all of the meu_Addr positions in the returned MemList will contain valid memory addresses meeting the requirements you have provided. To use this memory area, you would use code similar to the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct MemList *mlist = IExec-&amp;gt;AllocTaskMemEntry(&amp;amp;ML);&lt;br /&gt;
APTR memory = NULL;&lt;br /&gt;
&lt;br /&gt;
if ( mlist != NULL )&lt;br /&gt;
{&lt;br /&gt;
  memory = mlist-&amp;gt;ml_ME[0].me_Un.meu_Addr;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple Memory Blocks and Tasks ===&lt;br /&gt;
&lt;br /&gt;
If you want to take advantage of Exec&#039;s automatic cleanup, use the MemList and AllocTaskMemEntry() facility to do your dynamic memory allocation.&lt;br /&gt;
&lt;br /&gt;
In the Task control block structure, there is a list header named tc_MemEntry.&lt;br /&gt;
&lt;br /&gt;
This is the list header that you initialize to include MemLists that your task has created by call(s) to AllocTaskMemEntry(). Here is a short program segment that handles task memory list header initialization only. It assumes that you have already run AllocTaskMemEntry() as shown in the simple AllocTaskMemEntry() example above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct MemList *ml;&lt;br /&gt;
&lt;br /&gt;
struct Task *tc = IExec-&amp;gt;FindTask(0);&lt;br /&gt;
&lt;br /&gt;
IExec-&amp;gt;AddTail(tc-&amp;gt;tc_MemEntry, ml);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assuming that you have only used the AllocTaskMemEntry() method (or AllocVecTags() and built your own custom MemList), the system now knows where to find the blocks of memory that your task has dynamically allocated. The RemTask() function automatically frees all memory found on tc_MemEntry.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=&#039;&#039;CreateTask() Sets Up A MemList.&#039;&#039;|text=The CreateTask() function, and other system task and process creation functions use a MemList in tc_MemEntry so that the Task structure and stack will be automatically deallocated when the Task is removed.}}&lt;br /&gt;
&lt;br /&gt;
=== Summary of Multiple Memory Blocks Allocation Routines ===&lt;br /&gt;
&lt;br /&gt;
These are routines for allocating and freeing multiple memory blocks with a single call.&lt;br /&gt;
&lt;br /&gt;
This routine initializes memory from data and offset values in a table. Typically only assembly language programs benefit from using this routine. See the SDK for more details.&lt;br /&gt;
&lt;br /&gt;
== Allocating Memory at an Absolute Address ==&lt;br /&gt;
&lt;br /&gt;
For special advanced applications, AllocAbs() is provided. Using AllocAbs(), an application can allocate a memory block starting at a specified absolute memory address. If the memory is already allocated or if there is not enough memory available for the request, AllocAbs() returns a zero.&lt;br /&gt;
&lt;br /&gt;
Be aware that an absolute memory address which happens to be available on one Amiga may not be available on a machine with a different configuration or different operating system revision, or even on the same machine at a different times. For example, a piece of memory that is available during expansion board configuration might not be available at earlier or later times. Here is an example call to AllocAbs():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
APTR absoluteptr = (APTR)IExec-&amp;gt;AllocAbs(10000, 0x2F0000);&lt;br /&gt;
if (!(absoluteptr))&lt;br /&gt;
    { /* Couldn&#039;t get memory, act accordingly. */  }&lt;br /&gt;
&lt;br /&gt;
/* After we&#039;re done using it, we call FreeMem() to free the memory block. */&lt;br /&gt;
IExec-&amp;gt;FreeMem(absoluteptr, 10000);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Function Reference ==&lt;br /&gt;
&lt;br /&gt;
The following are brief descriptions of the Exec functions that handle memory management. See the SDK for details on each call.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Memory Function&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| AllocMem()&lt;br /&gt;
| Allocate memory with specified attributes. &#039;&#039;&#039;This function is obsolete.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| AllocAbs()&lt;br /&gt;
| Allocate memory at a specified location.&lt;br /&gt;
|-&lt;br /&gt;
| AllocTaskMemEntry()&lt;br /&gt;
| Allocate multiple memory blocks.&lt;br /&gt;
|-&lt;br /&gt;
| AllocVec()&lt;br /&gt;
| Allocate memory with specified attributes and keep track of the size. This function is obsolete.&lt;br /&gt;
|-&lt;br /&gt;
| AllocVecTags()&lt;br /&gt;
| Allocate memory with specified attributes defined by tags and keep track of the size. If an application needs to allocate some memory, it will usually use this function.&lt;br /&gt;
|-&lt;br /&gt;
| AvailMem()&lt;br /&gt;
| Return the amount of free memory, given certain conditions.&lt;br /&gt;
|-&lt;br /&gt;
| CopyMem()&lt;br /&gt;
| Copy memory block, which can be non-aligned and of arbitrary length.&lt;br /&gt;
|-&lt;br /&gt;
| CopyMemQuick()&lt;br /&gt;
| Copy aligned memory block.&lt;br /&gt;
|-&lt;br /&gt;
| FreeEntry()&lt;br /&gt;
| Free multiple memory blocks, allocated with AllocTaskMemEntry().&lt;br /&gt;
|-&lt;br /&gt;
| FreeMem()&lt;br /&gt;
| Free a memory block of specified size, allocated with AllocMem() or AllocAbs().&lt;br /&gt;
|-&lt;br /&gt;
| FreeVec()&lt;br /&gt;
| Free a memory block allocated with AllocVecTags() or AllocVec().&lt;br /&gt;
|-&lt;br /&gt;
| InitStruct()&lt;br /&gt;
| Initialize memory from a table.&lt;br /&gt;
|-&lt;br /&gt;
| LockMem()&lt;br /&gt;
| Lock the underlying pages given a memory block address and size.&lt;br /&gt;
|-&lt;br /&gt;
| TypeOfMem()&lt;br /&gt;
| Determine attributes of a specified memory address.&lt;br /&gt;
|-&lt;br /&gt;
| UnlockMem()&lt;br /&gt;
| Unlock the underlying pages given a memory block address and size.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Exec_Signals&amp;diff=12098</id>
		<title>Exec Signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Exec_Signals&amp;diff=12098"/>
		<updated>2021-10-26T03:09:19Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* SIGB_SINGLE Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exec Signals ==&lt;br /&gt;
&lt;br /&gt;
[[Exec Tasks|Tasks]] often need to coordinate with other concurrent system activities (like other [[Exec Tasks|tasks]] and [[Exec Interrupts|interrupts]]). This coordination is handled by Exec through the synchronized exchange of specific event indicators called &#039;&#039;signals&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This is the primary mechanism responsible for all inter-task communication and synchronization on the Amiga. This signal mechanism operates at a low level and is designed for high performance. Signals are used extensively by the Exec message system as a way to indicate the arrival of an inter-task message. The message system is described in more detail in [[Exec Messages and Ports]].&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Not for Beginners.|text=This section concentrates on details about signals that most applications do not need to understand for general Amiga programming. For a general overview of signals, see [[Introduction to Exec]].}}&lt;br /&gt;
&lt;br /&gt;
== The Signal System ==&lt;br /&gt;
&lt;br /&gt;
The signal system is designed to support independent simultaneous events, so several signals can occur at the same time. Each task has 32 independent signals, 16 of which are pre-allocated for use by the operating system. The signals in use by a particular task are represented as bits in a 32-bit field in its Task structure (&amp;amp;lt;exec/tasks.h&amp;amp;gt;). Two other 32-bit fields in the Task structure indicate which signals the task is waiting for, and which signals have been received.&lt;br /&gt;
&lt;br /&gt;
Signals are &#039;&#039;task relative&#039;&#039;. A task can only allocate its own signals, and may only wait on its own signals. In addition, a task may assign its own significance to a particular signal. Signals are not broadcast to all tasks; they are directed only to individual tasks. A signal has meaning to the task that defined it and to those tasks that have been informed of its meaning.&lt;br /&gt;
&lt;br /&gt;
For example, signal bit 12 may indicate a timeout event to one task, but to another task it may indicate a message arrival event. You can never wait on a signal that you did not directly or indirectly allocate yourself, and any other task that wishes to signal you must use a signal that &#039;&#039;you&#039;&#039; allocated.&lt;br /&gt;
&lt;br /&gt;
=== Signal Allocation ===&lt;br /&gt;
&lt;br /&gt;
As mentioned above, a task assigns its own meaning to a particular signal. Because certain system libraries may occasionally require the use of a signal, there is a convention for signal allocation. It is unwise ever to make assumptions about which signals are actually in use.&lt;br /&gt;
&lt;br /&gt;
Before a signal can be used, it must be allocated with the AllocSignal() function. When a signal is no longer needed, it should be freed for reuse with FreeSignal().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
BYTE AllocSignal( LONG signalNum );&lt;br /&gt;
VOID FreeSignal( LONG signalNum );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AllocSignal() marks a signal as being in use and prevents the accidental use of the same signal for more than one event. You may ask for either a specific signal number, or more commonly, you would pass -1 to request the next available signal. The state of the newly allocated signal is cleared (ready for use). Generally it is best to let the system assign you the next free signal. Of the 32 available signals, the lower 16 are reserved for system use (see [[#Reserved_System_Signals|Reserved System Signals]]). This leaves the upper 16 signals free for application programs to allocate. Other subsystems that you may call depend on AllocSignal().&lt;br /&gt;
&lt;br /&gt;
The following example asks for the next free signal to be allocated for its use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
if (-1 == (signal = IExec-&amp;gt;AllocSignal(-1)))&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;no signal bits available\n&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
    {&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;allocated signal number %ld\n&amp;quot;, signal);&lt;br /&gt;
    /* Other code could go here */&lt;br /&gt;
    IExec-&amp;gt;FreeSignal(signal)&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The value returned by AllocSignal() is a signal bit number. This value cannot be used directly in calls to signal-related functions without first being converted to a mask:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
uint32 mask = 1UL &amp;lt;&amp;lt; signal;&lt;br /&gt;
 or&lt;br /&gt;
uint32 mask = (uint32)1 &amp;lt;&amp;lt; signal;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is important to realize that signal bit allocation is relevant &#039;&#039;only&#039;&#039; to the running task. You &#039;&#039;cannot&#039;&#039; allocate a signal from another task. Note that functions which create a signal MsgPort will allocate a signal from the task that calls the function. Such functions include OpenWindow() and AllocSysObject(). For this reason, only the creating task may Wait() (directly or indirectly) on the MsgPort&#039;s signal. Functions which call Wait() include DoIO(), WaitIO() and WaitPort().&lt;br /&gt;
&lt;br /&gt;
=== Waiting for a Signal ===&lt;br /&gt;
&lt;br /&gt;
Signals are most often used to wake up a task upon the occurrence of some external event. Applications call the Exec Wait() function, directly or indirectly, in order to enter a wait state until some external event triggers a signal which awakens the task.&lt;br /&gt;
&lt;br /&gt;
Though signals are usually not used to interrupt an executing task, they can be used this way. Task &#039;&#039;exceptions&#039;&#039;, described in [[Exec_Interrupts|Exec Interrupts]], allow signals to act as a task-local interrupt.&lt;br /&gt;
&lt;br /&gt;
The Wait() function specifies the set of signals that will wake up the task and then puts the task to sleep (into the waiting state).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ULONG Wait( ULONG signalSet );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any one signal or any combination of signals from this set are sufficient to awaken the task. Wait() returns a mask indicating which signals satisfied the Wait() call. Note that when signals are used in conjunction with a message port, a set signal bit does not necessarily mean that there is a message at the message port.&lt;br /&gt;
&lt;br /&gt;
See [[Exec_Messages_and_Ports|Exec Messages and Ports]] for details about proper handling of messages.&lt;br /&gt;
&lt;br /&gt;
Because tasks (and interrupts) normally execute asynchronously, it is often possible to receive a particular signal before a task actually Wait()s for it. In such cases the Wait() will be immediately satisfied, and the task will not be put to sleep.&lt;br /&gt;
&lt;br /&gt;
The Wait() function implicitly clears those signal bits that satisfied the wait condition. This effectively resets those signals for reuse. However, keep in mind that a task might get more signals while it is still processing the previous signal. If the same signal is received multiple times and the signal bit is not cleared between them, some signals will go unnoticed.&lt;br /&gt;
&lt;br /&gt;
Be aware that using Wait() will break a Forbid() or Disable() state. Wait() cannot be used in supervisor mode or within interrupts.&lt;br /&gt;
&lt;br /&gt;
A task may Wait() for a combination of signal bits and will wake up when any of the signals occur. Wait() returns a signal mask specifying which signal or signals were received. Usually the program must check the returned mask for each signal it was waiting on and take the appropriate action for each that occurred. The order in which these bits are checked is often important.&lt;br /&gt;
&lt;br /&gt;
Here is a hypothetical example of a process that is using the console and timer devices, and is waiting for a message from either device and a possible break character issued by the user:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
uint32 consoleSignal = 1L &amp;lt;&amp;lt; ConsolePort-&amp;gt;mp_SigBit;&lt;br /&gt;
uint32 timerSignal   = 1L &amp;lt;&amp;lt; TimerPort-&amp;gt;mp_SigBit;&lt;br /&gt;
uint32 userSignal    = SIGBREAKF_CTRL_C;    /* Defined in &amp;lt;dos/dos.h&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
uint32 signals = IExec-&amp;gt;Wait(consoleSignal | timerSignal | userSignal);&lt;br /&gt;
&lt;br /&gt;
if (signals &amp;amp; consoleSignal)&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;new character\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (signals &amp;amp; timeOutSignal)&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;timeout\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
if (signals &amp;amp; userSignal)&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;User Ctrl-C Abort\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code will put the task to sleep waiting for a new character, or the expiration of a time period, or a &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;Ctrl&amp;lt;/kbd&amp;gt; + &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;C&amp;lt;/kbd&amp;gt; break character issued by the user. Notice that this code checks for an incoming character signal before checking for a timeout. Although a program can check for the occurrence of a particular event by checking whether its signal has occurred, this may lead to busy wait polling. Such polling is wasteful of the processor and is usually harmful to the proper function of the Amiga system. However, if a program needs to do constant processing and also check signals (a compiler for example) SetSignal(0,0) can be used to get a copy of your task&#039;s current signals.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ULONG SetSignal( ULONG newSignals, ULONG signalSet );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SetSignal() can also be used to set or clear the state of the signals. Implementing this can be dangerous and should generally not be done. The following fragment illustrates a possible use of SetSignal().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
uint32 signals = SetSignal(0,0);           /* Get current state of signals */&lt;br /&gt;
&lt;br /&gt;
if (signals &amp;amp; SIGBREAKF_CTRL_C)            /* Check for Ctrl-C.           */&lt;br /&gt;
    {&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;Break\n&amp;quot;);               /* Ctrl-C signal has been set. */&lt;br /&gt;
    IExec-&amp;gt;SetSignal(0, SIGBREAKF_CTRL_C)  /* Clear Ctrl-C signal.        */&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Looking for Break Keys ====&lt;br /&gt;
&lt;br /&gt;
One common usage of signals on the Amiga is for processing a user break. The OS reserves 16 of a tasks 32 signals for system use. Four of those 16 signals are used to tell a task about the &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;Ctrl&amp;lt;/kbd&amp;gt; + &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;C&amp;lt;/kbd&amp;gt;, &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;D&amp;lt;/kbd&amp;gt;, &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;E&amp;lt;/kbd&amp;gt;, and &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;F&amp;lt;/kbd&amp;gt; break keys. An application can process these signals. Usually, only CLI-based programs receive these signals because the Amiga&#039;s console handler is about the only user input source that sets these signals when it sees the &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;Ctrl&amp;lt;/kbd&amp;gt; + &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;C&amp;lt;/kbd&amp;gt;, &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;D&amp;lt;/kbd&amp;gt;, &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;E&amp;lt;/kbd&amp;gt;, and &amp;lt;kbd class=&amp;quot;keyboard-key nowrap&amp;quot; style=&amp;quot;border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #ddd; background-color: #f9f9f9; background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee); background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee); padding: 0.1em 0.3em; font-family: inherit; font-size: 0.85em;&amp;quot;&amp;gt;F&amp;lt;/kbd&amp;gt; key presses.&lt;br /&gt;
&lt;br /&gt;
The signal masks for each of these key presses are defined in &amp;amp;lt;dos/dos.h&amp;amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
SIGBREAKF_CTRL_C&lt;br /&gt;
SIGBREAKF_CTRL_D&lt;br /&gt;
SIGBREAKF_CTRL_E&lt;br /&gt;
SIGBREAKF_CTRL_F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that these are &#039;&#039;bit masks&#039;&#039; and &#039;&#039;&#039;not&#039;&#039;&#039; &#039;&#039;bit numbers&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Signal ===&lt;br /&gt;
&lt;br /&gt;
Signals may be generated from both tasks and system interrupts with the Signal() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
VOID Signal( struct Task *task, ULONG signalSet );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example Signal(tc,mask) would signal the task with the specified mask signals. More than one signal can be specified in the mask. The following example code illustrates Wait() and Signal().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// signals.c&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;exec/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;exec/memory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dos/dos.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/dos.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static CONST_STRPTR VersTag = &amp;quot;$VER: signals 53.1 (20.6.2012)&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
void subtaskcode(void);    /* prototype for our subtask routine */&lt;br /&gt;
&lt;br /&gt;
struct Task *maintask = NULL;&lt;br /&gt;
uint32 mainsig = 0;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  BOOL Done = FALSE;&lt;br /&gt;
  BOOL WaitingForSubtask = TRUE;&lt;br /&gt;
&lt;br /&gt;
  /* We must allocate any special signals we want to receive. */&lt;br /&gt;
  int8 mainsignum = IExec-&amp;gt;AllocSignal(-1);&lt;br /&gt;
  if (mainsignum == -1)&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;No signals available\n&amp;quot;);&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    mainsig = 1U &amp;lt;&amp;lt; mainsignum;        /* subtask can access this global */&lt;br /&gt;
    maintask = IExec-&amp;gt;FindTask(NULL);  /* subtask can access this global */&lt;br /&gt;
&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;We alloc a signal, create a task, wait for signals\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    struct Task *subtask = IDOS-&amp;gt;CreateTaskTags(&amp;quot;subtask&amp;quot;, 0, subtaskcode, 16000, TAG_END);&lt;br /&gt;
&lt;br /&gt;
    if (subtask == NULL)&lt;br /&gt;
        IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t create subtask\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      IDOS-&amp;gt;Printf(&amp;quot;After subtask signals, press CTRL-C or CTRL-D to exit\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      while (!Done || WaitingForSubtask)&lt;br /&gt;
      {&lt;br /&gt;
        /* Wait on the combined mask for all of the signals we are&lt;br /&gt;
         * interested in.  All processes have the CTRL_C thru CTRL_F&lt;br /&gt;
         * signals.  We&#039;re also Waiting on the mainsig we allocated&lt;br /&gt;
         * for our subtask to signal us with.  We could also Wait on&lt;br /&gt;
         * the signals of any ports/windows our main task created ... */&lt;br /&gt;
&lt;br /&gt;
        uint32 wakeupsigs = IExec-&amp;gt;Wait(mainsig | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D);&lt;br /&gt;
&lt;br /&gt;
        /* Deal with all signals that woke us up - may be more than one */&lt;br /&gt;
        if (wakeupsigs &amp;amp; mainsig)&lt;br /&gt;
        {&lt;br /&gt;
          IDOS-&amp;gt;Printf(&amp;quot;Signalled by subtask\n&amp;quot;);&lt;br /&gt;
          WaitingForSubtask = FALSE;   /* OK to kill subtask now */&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (wakeupsigs &amp;amp; SIGBREAKF_CTRL_C)&lt;br /&gt;
        {&lt;br /&gt;
          IDOS-&amp;gt;Printf(&amp;quot;Got CTRL-C signal\n&amp;quot;);&lt;br /&gt;
          Done = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(wakeupsigs &amp;amp; SIGBREAKF_CTRL_D)&lt;br /&gt;
        {&lt;br /&gt;
          IDOS-&amp;gt;Printf(&amp;quot;Got CTRL-D signal\n&amp;quot;);&lt;br /&gt;
          Done = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    IExec-&amp;gt;FreeSignal(mainsignum);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void subtaskcode(void)&lt;br /&gt;
{&lt;br /&gt;
  IExec-&amp;gt;Signal(maintask, mainsig);&lt;br /&gt;
  IExec-&amp;gt;RemTask(0);  // Remove myself from the system. &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reserved System Signals ==&lt;br /&gt;
&lt;br /&gt;
There are 16 signal bits which are reserved for system use. Applications are never allowed to use these signal bits unless explicitly documented (e.g. SIGF_SINGLE).&lt;br /&gt;
&lt;br /&gt;
=== SIGB_ABORT ===&lt;br /&gt;
&lt;br /&gt;
Reserved for system use.&lt;br /&gt;
&lt;br /&gt;
=== SIGB_CHILD ===&lt;br /&gt;
&lt;br /&gt;
Reserved for system use.&lt;br /&gt;
&lt;br /&gt;
=== SIGB_SINGLE (SIGB_BLIT) ===&lt;br /&gt;
&lt;br /&gt;
When a system function needs a Task to stop and IExec-&amp;gt;Wait() for a single signal it will use SIGB_SINGLE.&lt;br /&gt;
&lt;br /&gt;
This signal used to be named SIGB_BLIT when it was used to wait on the classic hardware blitter.&lt;br /&gt;
&lt;br /&gt;
=== SIGB_INTUITION ===&lt;br /&gt;
&lt;br /&gt;
Reserved for system use.&lt;br /&gt;
&lt;br /&gt;
=== SIGB_NET ===&lt;br /&gt;
&lt;br /&gt;
Reserved for system use.&lt;br /&gt;
&lt;br /&gt;
=== SIGB_DOS ===&lt;br /&gt;
&lt;br /&gt;
SIGB_DOS is currently used as the wait signal bit for the embedded message port in the process structure. This message port is initialised by the IDOS-&amp;gt;CreateNewProc() function. This message port is used by default for DosPacket transactions via IDOS-&amp;gt;DoPkt() and IDOS-&amp;gt;WaitPkt() and it is also used for sending the initial ACTION_STARTUP DosPacket for DOS handlers. This message port is also where the workbench.library sends the initial struct WBStartup message to every process it starts.&lt;br /&gt;
&lt;br /&gt;
=== SIGBREAKB_CTRL_C ===&lt;br /&gt;
&lt;br /&gt;
The SIGBREAKB_CTRL_C signal bit is used extensively as the general purpose &amp;quot;Break&amp;quot; signal. It is used by all shell handler commands&lt;br /&gt;
and many applications to invoke a normal exit of the program. It is up to all applications to follow this recommendation.&lt;br /&gt;
&lt;br /&gt;
Applications should never crash or generally misbehave when receiving a SIGBREAKB_CTRL_C signal bit from any source.&lt;br /&gt;
&lt;br /&gt;
=== SIGBREAKB_CTRL_D ===&lt;br /&gt;
&lt;br /&gt;
The SIGBREAKB_CTRL_D signal bit is used mostly by the shell handler to stop execution of a script file or non-interactive stream. It may also be used by applications.&lt;br /&gt;
&lt;br /&gt;
Applications should never crash or generally misbehave when receiving a SIGBREAKB_CTRL_D signal bit from any source.&lt;br /&gt;
&lt;br /&gt;
=== SIGBREAKB_CTRL_E ===&lt;br /&gt;
&lt;br /&gt;
The SIGBREAKB_CTRL_E signal bit is not currently used by the shell handler but may be used by some other handlers, OS subsystems or multi-process applications for general undefined inter process signalling.&lt;br /&gt;
&lt;br /&gt;
Applications should never crash or generally misbehave when receiving a SIGBREAKB_CTRL_E signal bit from any source.&lt;br /&gt;
&lt;br /&gt;
=== SIGBREAKB_CTRL_F ===&lt;br /&gt;
&lt;br /&gt;
The SIGBREAKB_CTRL_E signal bit is not currently used by the shell handler but may be used by some other handlers, OS subsystems or multi-process applications for general undefined inter process signalling.&lt;br /&gt;
&lt;br /&gt;
Applications should never crash or generally misbehave when receiving a SIGBREAKB_CTRL_F signal bit from any source.&lt;br /&gt;
&lt;br /&gt;
== Signalling with SIGB_SINGLE ==&lt;br /&gt;
&lt;br /&gt;
Many of a task&#039;s 32 signal bits are reserved for the operating system&#039;s private use, but, like any good rule, there is an exception. One of these bits, the SIGB_SINGLE bit, can be useful to some applications, if used correctly.&lt;br /&gt;
&lt;br /&gt;
Many system functions need to put their task to sleep while waiting for a single event, which requires using one of the task&#039;s signals. Rather than forcing each of these system functions to allocate a signal, then Wait(), then deallocate the signal, the operating system&lt;br /&gt;
has permanently allocated one signal, the SIGB_SINGLE, for this type of signalling. When a system function needs stop a task to Wait()&lt;br /&gt;
for a single signal, it can use SIGB_SINGLE.&lt;br /&gt;
&lt;br /&gt;
The only purpose a program can use SIGB_SINGLE for is Wait()ing because the task cannot call any system functions while it is using SIGB_SINGLE. A program that calls system functions while using SIGB_SINGLE can cause itself and the operating system serious problems because the system functions can use SIGB_SINGLE as well. If a program calls a system function while using SIGB_SINGLE, two bad&lt;br /&gt;
things can happen:&lt;br /&gt;
&lt;br /&gt;
1) The errant task&#039;s event takes place before the system function waits on SIGB_SINGLE (or while the system function is waiting on&lt;br /&gt;
SIGB_SINGLE). In this case, the system function will think its event has taken place because its signal became set. The errant task will never find out that its event has taken place, as the system function will clear the SIGB_SINGLE bit after Wait()ing on it.&lt;br /&gt;
&lt;br /&gt;
2) The errant task&#039;s event and the system function&#039;s event take place while the system function is waiting on SIGB_SINGLE. In this case,&lt;br /&gt;
the system function will function normally, clear the SIGB_SINGLE bit, and exit. The errant task will never know that its event has&lt;br /&gt;
taken place.&lt;br /&gt;
&lt;br /&gt;
Before Wait()ing on SIGB_SINGLE, clear it using SetSignal():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
IExec-&amp;gt;SetSignal(0, SIGF_SINGLE); // Note SIGF_SINGLE is the bit mask. SIGB_SINGLE is the signal bit.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This step is necessary because it is possible that the last system function that used the SIGB_SINGLE signal did not clear the SIGB_SINGLE bit.&lt;br /&gt;
&lt;br /&gt;
Also, an application should not wait on other signals while it is waiting on SIGB_SINGLE. Waiting on other signals at the same time&lt;br /&gt;
makes it possible for a program to wake up while the SIGB_SINGLE is still outstanding. If this happens, the program will still have to&lt;br /&gt;
go back to sleep, which requires calling a system function.&lt;br /&gt;
&lt;br /&gt;
=== SIGB_SINGLE Example ===&lt;br /&gt;
&lt;br /&gt;
Below is a simple example of using the SIGB_SINGLE signal. It starts a child process and waits for that child process to signal&lt;br /&gt;
the main process using the SIGB_SINGLE signal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// This example program illustrates simple usage of the SIGB_SINGLE&lt;br /&gt;
// signal for &amp;quot;single shot&amp;quot; signalling. This signal is one of the&lt;br /&gt;
// system private signals, but applications can use it in certain&lt;br /&gt;
// cases, but only if used carefully. Specifically, applications&lt;br /&gt;
// should use it only to Wait() on, and using only that signal&lt;br /&gt;
// (applications cannot Wait() on other signals in the same&lt;br /&gt;
// Wait()). Not following these rules can cause serious system&lt;br /&gt;
// problems.&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;exec/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;exec/memory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dos/dosextens.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dos/dostags.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/dos.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int32 childprocesscode(void);      /* prototype for our childprocess routine. */&lt;br /&gt;
&lt;br /&gt;
struct Process *mainprocess = NULL, *childprocess = NULL;&lt;br /&gt;
UBYTE childprocessname[] = &amp;quot;RKM_signal_childprocess&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BPTR output;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    if (output = IDOS-&amp;gt;Open(&amp;quot;CONSOLE:&amp;quot;, MODE_OLDFILE))  /* Open the console for the  */&lt;br /&gt;
                                                        /*            child process. */&lt;br /&gt;
    {&lt;br /&gt;
        mainprocess = (struct Process *)IExec-&amp;gt;FindTask(NULL); /* childprocess can   */&lt;br /&gt;
                                                               /* access this global.*/&lt;br /&gt;
&lt;br /&gt;
        if (childprocess = IDOS-&amp;gt;CreateNewProcTags(&lt;br /&gt;
                    NP_Entry,       childprocesscode,  /* The child process  */&lt;br /&gt;
                    NP_Name,        childprocessname,&lt;br /&gt;
                    NP_Output,      output,&lt;br /&gt;
                    NP_FreeSeglist, FALSE,&lt;br /&gt;
                    NP_CloseOutput, TRUE,&lt;br /&gt;
                    NP_Child,       TRUE,&lt;br /&gt;
                    TAG_END))&lt;br /&gt;
        {&lt;br /&gt;
            IDOS-&amp;gt;Printf(&amp;quot;Main Process: Created a child process and waiting on SIGB_SINGLE.\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            IDOS-&amp;gt;FFlush(IDOS-&amp;gt;Output());  /* Make sure the Printf() above appears      */&lt;br /&gt;
                                           /* in the console window before the child    */&lt;br /&gt;
                                           /* process starts printing to the console. */&lt;br /&gt;
&lt;br /&gt;
            IExec-&amp;gt;SetSignal(0, SIGF_SINGLE);  /* Use SIGF_SINGLE only after */&lt;br /&gt;
                                               /* clearing it.               */&lt;br /&gt;
&lt;br /&gt;
            /* Wake up the child. */&lt;br /&gt;
            IExec-&amp;gt;Signal((struct Task *)childprocess, SIGBREAKF_CTRL_F);&lt;br /&gt;
&lt;br /&gt;
            IExec-&amp;gt;Wait(SIGF_SINGLE);  /* Only use SIGF_SINGLE for Wait()ing and */&lt;br /&gt;
                                       /* Wait on that signal alone!             */&lt;br /&gt;
&lt;br /&gt;
            IDOS-&amp;gt;Printf(&amp;quot;Main Process: Received signal from child.\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            IDOS-&amp;gt;Printf(&amp;quot;Main Process: Can&#039;t create child process. Exiting.\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        IDOS-&amp;gt;Printf(&amp;quot;Main Process: Can&#039;t open CONSOLE:.  Exiting.\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int32 childprocesscode(void)     /* This function is what CreateNewProcTags() */&lt;br /&gt;
{                               /* loads as the child process.  This child   */&lt;br /&gt;
                                /* signals the parent using SIGF_SINGLE.     */&lt;br /&gt;
&lt;br /&gt;
    /* Wait for a startup signal. This is to allow the parent process to&lt;br /&gt;
     * print its banner message and clear SIGF_SINGLE.&lt;br /&gt;
     */&lt;br /&gt;
    IExec-&amp;gt;Wait(SIGBREAKF_CTRL_F);&lt;br /&gt;
&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;Child Process: I&#039;m alive and starting a 5 second TimeDelay()&amp;quot;);&lt;br /&gt;
    IDOS-&amp;gt;FFlush(IDOS-&amp;gt;Output());&lt;br /&gt;
&lt;br /&gt;
    for (uint32 x = 0; x &amp;lt; 5; x++)&lt;br /&gt;
    {&lt;br /&gt;
        IDOS-&amp;gt;Delay(50);        /* Delay for 5 seconds, printing a */&lt;br /&gt;
        IDOS-&amp;gt;Printf(&amp;quot; .&amp;quot;);     /* dot during each second.         */&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    IDOS-&amp;gt;Delay(50);&lt;br /&gt;
&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot; Finished.\n&amp;quot;);&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;Child Process: Signalling main process and exiting.  Bye.\n&amp;quot;);&lt;br /&gt;
    IDOS-&amp;gt;FFlush(IDOS-&amp;gt;Output());&lt;br /&gt;
&lt;br /&gt;
    IExec-&amp;gt;Signal((struct Task *)mainprocess, SIGF_SINGLE);  /* Finished waiting, */&lt;br /&gt;
                                                             /* signal the main   */&lt;br /&gt;
                                                             /* process and exit  */&lt;br /&gt;
                                                             /* child process.    */&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Function Reference ==&lt;br /&gt;
&lt;br /&gt;
The following chart gives a brief description of the Exec functions that control task signalling. See the SDK for details about each call.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Exec Signal Function&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| AllocSignal()&lt;br /&gt;
| Allocate a signal bit.&lt;br /&gt;
|-&lt;br /&gt;
| FreeSignal()&lt;br /&gt;
| Free a signal bit allocated with AllocSignal().&lt;br /&gt;
|-&lt;br /&gt;
| SetSignal()&lt;br /&gt;
| Query or set the state of the signals for the current task.&lt;br /&gt;
|-&lt;br /&gt;
| Signal()&lt;br /&gt;
| Signal a task by setting signal bits in its Task structure.&lt;br /&gt;
|-&lt;br /&gt;
| Wait()&lt;br /&gt;
| Wait for one or more signals from other tasks or interrupts.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=11069</id>
		<title>Tutorials:Main</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=11069"/>
		<updated>2020-01-25T23:04:44Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Amiga Ireland 2020 */&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 AmigaOS 4 library]]&lt;br /&gt;
&lt;br /&gt;
== Amiga Future Programming Articles ==&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: The Development Environment]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Exec - The Kernel]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: DOS - The Data Administrator]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Intuition - The User Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Drawing Graphics]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Transparent Windows]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Datatypes - Making Life Easy]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: GUI Toolkit ReAction]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Utility - Little Helpers]]&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;
== Amiga Ireland 2020 ==&lt;br /&gt;
&lt;br /&gt;
[[Media:Execsg-team.pdf|ExecSG Team Presentation Slides]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2019 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2019 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2018 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2018 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2017 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2017 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2016 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2016 DevCon]]&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]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 1|AmiWest Lesson 1: Coding Basics]] [https://youtu.be/-m3QSN2Q3LI - Video Part 1] [https://youtu.be/gCStZJD5R6o - Video Part 2]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 2|AmiWest Lesson 2: AmigaOS Fundamentals]] [https://youtu.be/0KIsNfIaI_g - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 3|AmiWest Lesson 3: Input and Output]] [https://youtu.be/f6X6Gqhtg_s - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 4|AmiWest Lesson 4: ProcTree]] [https://youtu.be/6bHYHJu9-7o - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 5|AmiWest Lesson 5: MIDI]] [https://youtu.be/_Z-EhEnhh08 - 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://youtu.be/xm9cn1J2pa8 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 8|AmiWest Lesson 8: ARexx Ports]] [https://youtu.be/6osaMcxNhUE - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Support]] [https://youtu.be/NZyl2CsVcgE - Video]&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=File:Execsg-team.pdf&amp;diff=11068</id>
		<title>File:Execsg-team.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=File:Execsg-team.pdf&amp;diff=11068"/>
		<updated>2020-01-25T23:02:40Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: ExecSG Team presentation slides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ExecSG Team presentation slides&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=11067</id>
		<title>Tutorials:Main</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=11067"/>
		<updated>2020-01-25T22:59:02Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Amiga Ireland 2020 */&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 AmigaOS 4 library]]&lt;br /&gt;
&lt;br /&gt;
== Amiga Future Programming Articles ==&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: The Development Environment]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Exec - The Kernel]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: DOS - The Data Administrator]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Intuition - The User Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Drawing Graphics]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Transparent Windows]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Datatypes - Making Life Easy]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: GUI Toolkit ReAction]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Utility - Little Helpers]]&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;
== Amiga Ireland 2020 ==&lt;br /&gt;
&lt;br /&gt;
[[Media:execsg-team.pdf|ExecSG Team Presentation Slides]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2019 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2019 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2018 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2018 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2017 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2017 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2016 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2016 DevCon]]&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]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 1|AmiWest Lesson 1: Coding Basics]] [https://youtu.be/-m3QSN2Q3LI - Video Part 1] [https://youtu.be/gCStZJD5R6o - Video Part 2]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 2|AmiWest Lesson 2: AmigaOS Fundamentals]] [https://youtu.be/0KIsNfIaI_g - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 3|AmiWest Lesson 3: Input and Output]] [https://youtu.be/f6X6Gqhtg_s - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 4|AmiWest Lesson 4: ProcTree]] [https://youtu.be/6bHYHJu9-7o - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 5|AmiWest Lesson 5: MIDI]] [https://youtu.be/_Z-EhEnhh08 - 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://youtu.be/xm9cn1J2pa8 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 8|AmiWest Lesson 8: ARexx Ports]] [https://youtu.be/6osaMcxNhUE - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Support]] [https://youtu.be/NZyl2CsVcgE - Video]&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=11066</id>
		<title>Tutorials:Main</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=11066"/>
		<updated>2020-01-25T22:58:48Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Tutorials */&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 AmigaOS 4 library]]&lt;br /&gt;
&lt;br /&gt;
== Amiga Future Programming Articles ==&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: The Development Environment]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Exec - The Kernel]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: DOS - The Data Administrator]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Intuition - The User Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Drawing Graphics]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Transparent Windows]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Datatypes - Making Life Easy]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: GUI Toolkit ReAction]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Utility - Little Helpers]]&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;
== Amiga Ireland 2020 ==&lt;br /&gt;
&lt;br /&gt;
[[Media:execsg-team.pdf|ExecSG Team Presentation Slides]].&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2019 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2019 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2018 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2018 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2017 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2017 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2016 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2016 DevCon]]&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]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 1|AmiWest Lesson 1: Coding Basics]] [https://youtu.be/-m3QSN2Q3LI - Video Part 1] [https://youtu.be/gCStZJD5R6o - Video Part 2]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 2|AmiWest Lesson 2: AmigaOS Fundamentals]] [https://youtu.be/0KIsNfIaI_g - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 3|AmiWest Lesson 3: Input and Output]] [https://youtu.be/f6X6Gqhtg_s - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 4|AmiWest Lesson 4: ProcTree]] [https://youtu.be/6bHYHJu9-7o - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 5|AmiWest Lesson 5: MIDI]] [https://youtu.be/_Z-EhEnhh08 - 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://youtu.be/xm9cn1J2pa8 - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 8|AmiWest Lesson 8: ARexx Ports]] [https://youtu.be/6osaMcxNhUE - Video]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Support]] [https://youtu.be/NZyl2CsVcgE - Video]&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10976</id>
		<title>DMA Resource</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10976"/>
		<updated>2019-11-27T04:43:22Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Author */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Author ==&lt;br /&gt;
&lt;br /&gt;
Jamie Krueger, BITbyBIT Software Group LLC&amp;lt;br/&amp;gt;&lt;br /&gt;
Copyright (c) 2019 Trevor Dickinson&amp;lt;br/&amp;gt;&lt;br /&gt;
Used by permission.&lt;br /&gt;
&lt;br /&gt;
== DMA Engine ==&lt;br /&gt;
&lt;br /&gt;
Some hardware targets include a DMA engine which can be used for general purpose copying. This article describes the DMA engines available and how to use them.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Features ===&lt;br /&gt;
&lt;br /&gt;
The Direct Memory Access (DMA) Engines found in the NXP/Freescale p5020, p5040 and p1022 System On a Chip (SoC)s, as found in the AmigaONE X5000/20, X5000/40 and A1222 respectively, are quite flexible and powerful. Each of these chips contains two distinct engines with four data channels each. This provides the ability to have a total of eight DMA Channels working at once, with up to two DMA transactions actually being executed at the same time (one on each of the two DMA Engines).&lt;br /&gt;
&lt;br /&gt;
Further, each of the four DMA Channels found in a DMA Engine may be individually programmed to handle either; a single transaction, a &#039;&#039;Chain&#039;&#039; of transactions, or even &#039;&#039;Lists&#039;&#039; of &#039;&#039;Chains&#039;&#039; of transactions. The DMA Engines automatically arbitrate control between each DMA Channel following programmed bandwidth settings for each Channel (typically 1024 bytes).&lt;br /&gt;
&lt;br /&gt;
This means that after completing a transfer of 1024 bytes (for example), the hardware will consider switching to the next Channel to allow it to move another block of data, and so on in a round-robin fashion. If all other DMA Channels on a given DMA Engine are idle when arbitration would take place, the hardware will not arbitrate control to another Channel, but simply continue processing the transaction(s) for the Channel it is on.&lt;br /&gt;
&lt;br /&gt;
=== DMA Copy Memory - Execution Flow Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:DMACopyMem-Diagram.png]]&lt;br /&gt;
&lt;br /&gt;
=== What a call to perform a DMA copy does internally ===&lt;br /&gt;
&lt;br /&gt;
As shown in the above diagram, when the user makes a call to request a memory copy be performed by the DMA hardware, the next available DMA Channel is selected for use and a DMA Transaction (source, destination and size) is constructed. The DMA Transaction is then programmed into the DMA Engine which owns the available DMA Channel.&lt;br /&gt;
&lt;br /&gt;
At this point the calling task will Wait() until it hears the transaction has been completed. It will then return to the caller with the result. This provides a basic &#039;&#039;blocking&#039;&#039; function, which only returns to the caller once that data has been copied. This single tasking behavior is the simplest to use and what is normally expected by most applications using a memory copy function.&lt;br /&gt;
&lt;br /&gt;
=== Diagram of multitasking DMA Copies ===&lt;br /&gt;
&lt;br /&gt;
[[File:DMACopyMem-Multitasking-Diagram.png]]&lt;br /&gt;
&lt;br /&gt;
=== How multiple simultaneous DMA copies are handled ===&lt;br /&gt;
&lt;br /&gt;
When multiple user calls requesting a DMA copy arrive at once, each one is handed to a dedicated DMA Channel handling task for processing. As the diagram above demonstrates, there are two separate DMA Engines available, each with four channels that may be programmed at the same time. The hardware will then arbitrate the actual data move across these channels according to their respective bandwidth settings (usually 1024 bytes).&lt;br /&gt;
&lt;br /&gt;
In the diagram above, a separate color indicates a distinct data path from the caller through the DMA hardware to the system RAM. A dashed line of the matching color indicates an Interrupt line signaling the respective DMA Channel Handler with the completion of the transaction. The handler task then signals back to the original caller, which returns to the user with a success or failure result.&lt;br /&gt;
&lt;br /&gt;
All eight DMA Channels can handle each a single block transaction or an entire chain of block transactions before it signals completion and returns to the original caller. If all eight DMA Channels are busy processing their requested transactions when further DMA copy requests arrive, they will each be assigned a DMA Channel to wait on (managed via a Mutex lock on each Channel) and will block until allowed to add their DMA transaction to the Channel&#039;s queue.&lt;br /&gt;
&lt;br /&gt;
== fsldma.resource ==&lt;br /&gt;
&lt;br /&gt;
The fsldma.resource API is provided automatically in the kernel for all supported machines (Currently the AmigaONE X5000/20, X5000/40 and A1222).&lt;br /&gt;
&lt;br /&gt;
=== The FslDMA API ===&lt;br /&gt;
&lt;br /&gt;
The API provided by the fsldma.resource breaks down into three main parts:&lt;br /&gt;
:* Memory management&lt;br /&gt;
:* Copy Memory functions&lt;br /&gt;
:* Utility / Miscellaneous&lt;br /&gt;
&lt;br /&gt;
==== Memory Management Functions ====&lt;br /&gt;
&lt;br /&gt;
The FslDMA resource API provides convenience functions for the allocation and freeing of &#039;&#039;&#039;DMA Compliant&#039;&#039;&#039; blocks of memory. Two functions are provided for this purpose; DMAAllocPhysicalMemory() and DMAFreePhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
The memory allocation function also includes two Tags based versions of the call to allow for addition variables to be passed into the call using a variable set of Tags or fixed TagList. Currently the only supported Tag is &#039;&#039;FSLDMA_APM_ClearWithValue&#039;&#039;, which is the equivalent to the IExec-&amp;gt;AllocVecTagList() function&#039;s AVT_ClearWithValue tag. If the FSLDMA_APM_ClearWithValue tag is not provided then the requested memory block is cleared with zeroes by default before being returned. DMAAllocPhysicalMemory() returns the &#039;&#039;Physical&#039;&#039; Address pointer to the allocated memory or NULL if it is unable to allocate the requested memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  APTR DMAAllocPhysicalMemoryTagList( uint32 lSize, const struct TagItem *tags );&lt;br /&gt;
  APTR DMAAllocPhysicalMemoryTags( uint32 lSize, uint32 Tag1, ... );&lt;br /&gt;
  APTR DMAAllocPhysicalMemory( uint32 lSize );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The corresponding function to allocating a DMA Compliant memory block is DMAFreePhysicalMemory(). Any memory allocated using DMAAllocPhysicalMemory() must be eventually freed using DMAFreePhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  void DMAFreePhysicalMemory( APTR pPhysicalMemoryBlock );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Copy Memory Functions ====&lt;br /&gt;
&lt;br /&gt;
Two API calls make up the core of the FslDMA API; DMAPhysicalCopyMem() and DMACopyMem().&lt;br /&gt;
Both of these calls will &amp;quot;block&amp;quot; (not return to the user) until after the requested transfer has either succeeded or failed. A value of TRUE is returned upon success and FALSE if an error occurred.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  BOOL DMAPhysicalCopyMem( CONST_APTR pPhysicalSourceBuffer, APTR pPhysicalDestBuffer, uint32 lBufferSize );&lt;br /&gt;
  BOOL DMACopyMem( CONST_APTR pSourceBuffer, APTR pDestBuffer, uint32 lBufferSize );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As the name implies the first (and core version) of the copy memory functions, DMAPhysicalCopyMem(), accepts the Physical Addresses to the source and destination buffers (as returned by DMAAllocPhysicalMemory()), along with an unsigned 32-Bit value for the amount of bytes that should be copied (lBuffsize must be greater than zero(0) and no more than the maximum size of the source and destination buffers).&lt;br /&gt;
&lt;br /&gt;
DMAPhysicalCopyMem() is the most direct an efficient means of using the DMA hardware to effect a single memory copy. The DMACopyMem() function is provided as an alternative way to request a DMA transfer by passing in the &#039;&#039;Virtual Addresses&#039;&#039; to the source and destination buffers instead of the Physical Addresses. DMACopyMem() will attempt to determine if the supplied memory buffers are DMA Compliant and if so it will internally use DMAPhysicalCopyMem() to handle the transaction. If DMACopyMem() determines that the supplied memory is &#039;&#039;&#039;not&#039;&#039;&#039; DMA Compliant it will return FALSE and no data copy will occur.&lt;br /&gt;
&lt;br /&gt;
In theory any &#039;&#039;contiguous&#039;&#039; block of memory from 1 Byte up to 4GB in size may be transferred using either one of these calls. In practice the DMA hardware can directly accept memory blocks up to FSLDMA_MAXBLOCK_SIZE (or 64MB - 1 Byte). Therefore any data blocks greater than FSLDMA_MAXBLOCK_SIZE will automatically be feed to the DMA hardware in a series of smaller chunks. For maximum efficiency transfer sizes should be at least 256 Bytes in size and be an even multiple of 64 Bytes. Odd sizes are handled by the hardware but will degrade performance.&lt;br /&gt;
&lt;br /&gt;
If you are transferring many large blocks of data in series and wish to manually send them to the FslDMA API&#039;s memory copy functions one block at a time, then setting your block sizes to FSLDMA_OPTIMAL_BLKSIZE (or 64 MB - 64 Bytes) and exclusively using DMAPhysicalCopyMem() will provide the fastest transfer speeds will the least amount of CPU overhead.&lt;br /&gt;
&lt;br /&gt;
==== Utility / Miscellaneous Functions ====&lt;br /&gt;
&lt;br /&gt;
The last section to the FslDMA API provides a single convenience function call; DMAGetVirtualAddress().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  APTR DMAGetVirtualAddress( APTR pPhysicalAddress );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The DMAGetVirtualAddress() function returns the Virtual memory location for the Physical memory location that was itself allocated and returned by the DMAAllocPhysicalMemory() function. DMAGetVirtualAddress() will not work on physical addresses returned by IMMU-&amp;gt;GetPhysicalAddress() on memory not allocated using DMAAllocPhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
The main purpose of this function (other then debugging purposes) is to provide the &amp;quot;normal&amp;quot; Virtual Address of memory allocated by the FslDMA API for use by functions that expect &amp;quot;normal&amp;quot; Virtual address locations; for example IExec-&amp;gt;CopyMemQuick().&lt;br /&gt;
&lt;br /&gt;
==== Further reference - The fsldma.resource AutoDoc ====&lt;br /&gt;
&lt;br /&gt;
See the [[http://wiki.amigaos.net/amiga/autodocs/fsldmares.doc.txt fsldma.resource AutoDoc]] file for more details on each API call.&lt;br /&gt;
&lt;br /&gt;
=== Example usage ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;interfaces/fsldma.h&amp;gt;&lt;br /&gt;
// Obtain the fsldma.resource&lt;br /&gt;
struct fslDMAIFace *IfslDMA = IExec-&amp;gt;OpenResource(FSLDMA_NAME);&lt;br /&gt;
if ( NULL != IfslDMA )&lt;br /&gt;
{&lt;br /&gt;
  uint32     lTestSize         = 1024;&lt;br /&gt;
  CONST_APTR pPhysicalSrcAddr  = NULL;&lt;br /&gt;
  APTR       pPhysicalDestAddr = NULL;&lt;br /&gt;
  // Allocate the Source Buffer (for DMA)&lt;br /&gt;
  // and set the contents to 0xB3 (just an example value)&lt;br /&gt;
  pPhysicalSrcAddr = (CONST_APTR)IfslDMA-&amp;gt;DMAAllocPhysicalMemoryTags(lTestSize,&lt;br /&gt;
                                   FSLDMA_APM_ClearWithValue, 0xB3,&lt;br /&gt;
                                   TAG_END);&lt;br /&gt;
  if ( NULL != pPhysicalSrcAddr )&lt;br /&gt;
  {&lt;br /&gt;
    // Allocate the Destination Buffer (for DMA)&lt;br /&gt;
    //  - contents will by cleared by default&lt;br /&gt;
    pPhysicalDestAddr = IfslDMA-&amp;gt;DMAAllocPhysicalMemory(lTestSize);&lt;br /&gt;
    if ( NULL != pPhysicalDestAddr )&lt;br /&gt;
    {&lt;br /&gt;
      // Call IfslDMA-&amp;gt;DMAPhysicalCopyMem()&lt;br /&gt;
      // to perform the memory copy using the DMA hardware&lt;br /&gt;
      if ( TRUE == IfslDMA-&amp;gt;DMAPhysicalCopyMem(pPhysicalSrcAddr,&lt;br /&gt;
                                               pPhysicalDestAddr,lTestSize) )&lt;br /&gt;
      {&lt;br /&gt;
        // Success - Do something with the copied data&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // Fallback and use CPU Copy instead (or do something else)&lt;br /&gt;
        // Since we allocated the memory buffers using the FslDMA API,&lt;br /&gt;
        // which returns the Physical address to that memory, and the&lt;br /&gt;
        // IExec-&amp;gt;CopyMemQuick() function expects the Virtual address,&lt;br /&gt;
        // we first need to obtain the Virtual address for the Physical&lt;br /&gt;
        // ones (using the FslDMA API again) before we can call our&lt;br /&gt;
        // fallback copy function.&lt;br /&gt;
        CONST_APTR pVirtualSrcAddr  = NULL;&lt;br /&gt;
        APTR       pVirtualDestAddr = NULL;&lt;br /&gt;
        pVirtualSrcAddr  = IfslDMA-&amp;gt;DMAGetVirtualAddress((APTR)pPhysicalSrcAddr);&lt;br /&gt;
        pVirtualDestAddr = IfslDMA-&amp;gt;DMAGetVirtualAddress(pPhysicalDestAddr);&lt;br /&gt;
        IExec-&amp;gt;CopyMemQuick(pVirtualSrcAddr,pVirtualDestAddr,lTestSize);&lt;br /&gt;
      }&lt;br /&gt;
      // We *must* use DMAFreePhysicalMemory() to free the memory&lt;br /&gt;
      // that we allocated with DMAAllocPhysicalMemory()&lt;br /&gt;
      IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalDestAddr);&lt;br /&gt;
    }&lt;br /&gt;
    // We *must* use DMAFreePhysicalMemory() to free the memory&lt;br /&gt;
    // that we allocated with DMAAllocPhysicalMemory()&lt;br /&gt;
    IfslDMA-&amp;gt;DMAFreePhysicalMemory((APTR)pPhysicalSrcAddr);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Obtaining the fsldma.resource ====&lt;br /&gt;
&lt;br /&gt;
Breaking the above example down the first thing we do is include the interface header for the fsldma.resource and obtain the resource itself.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;interfaces/fsldma.h&amp;gt;&lt;br /&gt;
struct fslDMAIFace *IfslDMA = IExec-&amp;gt;OpenResource(FSLDMA_NAME);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Allocating DMA Compliant Memory ====&lt;br /&gt;
&lt;br /&gt;
Once we have successfully obtained the DMA resource we can directly use its API. The next step we need to do is to allocate some memory &#039;&#039;&#039;which we know is DMA compliant&#039;&#039;&#039; for use by the resource. The easiest way to accomplish this is to use the IfslDMA-&amp;gt;DMAAllocPhysicalMemory() function. This will automatically take care of ensuring the memory that is returned is properly aligned, contiguous, cache-inhibited and coherent.&lt;br /&gt;
&lt;br /&gt;
We use the Tags version of the allocate memory function first so we can allocate a block of memory for our source buffer and fill it with some test value (in this case the byte value 0xB3).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  pPhysicalSrcAddr = (CONST_APTR)IfslDMA-&amp;gt;DMAAllocPhysicalMemoryTags(lTestSize,&lt;br /&gt;
                                   FSLDMA_APM_ClearWithValue, 0xB3,&lt;br /&gt;
                                   TAG_END);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We also need a destination buffer for our test. Since it only needs to start out being cleared (filled with zeroes), we can use the simplest form of the allocate memory function here as the allocated memory is cleared by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  pPhysicalDestAddr = IfslDMA-&amp;gt;DMAAllocPhysicalMemory(lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== The core function - Copy Physical Memory ====&lt;br /&gt;
&lt;br /&gt;
Now that we have two DMA Compliant memory buffers available we can get to the heart of the API usage and make the call to IfslDMA-&amp;gt;DMAPhysicalCopyMem().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IfslDMA-&amp;gt;DMAPhysicalCopyMem(pPhysicalSrcAddr,pPhysicalDestAddr,lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looking at the full [[#Example usage|Example]] source above you can see that the DMAPhysicalCopyMem() call returns a Boolean value to indicate success or failure. Therefore, TRUE will be returned after the DMA hardware had completed copying the requested data (blocking call) and FALSE will be returned if a problem occurred.&lt;br /&gt;
&lt;br /&gt;
Since the memory buffers we are using were allocated using the FslDMA API and our transfer size was greater than zero and less than or equal to the total size of either buffer, (in others words a legal copy request), there is &#039;&#039;&#039;very&#039;&#039;&#039; little chance that the DMAPhysicalCopyMem() function will fail. In fact, about the only reason the DMA hardware would fail to handle a legal transaction would be if the physical RAM installed in the system was faulty.&lt;br /&gt;
&lt;br /&gt;
So even though it is extremely unlikely for our DMA copy to have failed and returned FALSE, let&#039;s take a look at how we might handle the failure. In other words, falling back and using a CPU based copy function instead to complete the data move.&lt;br /&gt;
&lt;br /&gt;
Since we are reverting back to using a normal system copy memory function here, we first need to obtain the &#039;&#039;Virtual Addresses&#039;&#039; to both our source and destination buffers. This is accomplished by using the DMAGetVirtualAddress() function and passing in the Physical Address that was returned by DMAAllocPhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  CONST_APTR pVirtualSrcAddr  = NULL;&lt;br /&gt;
  APTR       pVirtualDestAddr = NULL;&lt;br /&gt;
  pVirtualSrcAddr  = IfslDMA-&amp;gt;DMAGetVirtualAddress((APTR)pPhysicalSrcAddr);&lt;br /&gt;
  pVirtualDestAddr = IfslDMA-&amp;gt;DMAGetVirtualAddress(pPhysicalDestAddr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have the Virtual Address equivalents to the Physical Addresses that were returned by DMAAllocPhysicalMemory(), we can proceed to call the Exec CopyMemQuick() function to complete the copy. Here we can only trust that the IExec-&amp;gt;CopyMemQuick() call can not fail since it does not return a result code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IExec-&amp;gt;CopyMemQuick(pVirtualSrcAddr,pVirtualDestAddr,lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cleaning up - Freeing DMA Compliant memory ====&lt;br /&gt;
&lt;br /&gt;
It is essential that you free any memory that was allocated using the DMAAllocPhysicalMemory() function using the corresponding DMAFreePhysicalMemory() call. The reason for this is two-fold; first because additional resource tracking is maintained by the FslDMA API whenever it allocates memory which must itself be released, and second because the &#039;&#039;Physical Address&#039;&#039; to the memory is returned by the allocate call and not the &#039;&#039;Virtual Address&#039;&#039;, so if you attempt to pass the address returned by DMAAllocPhysicalMemory() directly into IExec-&amp;gt;FreeVec() it would likely result in a crash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalSrcAddr);&lt;br /&gt;
  IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalDestAddr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
&lt;br /&gt;
Testing DMA memory copies vs their CPU based equivalent indicates that the DMA hardware on all three models (X5000/20, X5000/40 and A1222)&lt;br /&gt;
move data approximately two to three times faster than the CPU does so alone.&lt;br /&gt;
&lt;br /&gt;
It should also be noted that these tests were performed when the CPU was effectively idle. CPU memory copy operations scale down roughly&lt;br /&gt;
equal with the CPU actively scaling up. So the more the CPU is doing, the longer it takes to complete the memory copy.&lt;br /&gt;
&lt;br /&gt;
Conversely, DMA memory copy operation times are far more predictable as they use the same amount of (minimal) CPU overhead for each copy,&lt;br /&gt;
and the actual time it takes the DMA hardware to complete the transaction can be calculated to range from all the DMA Channels being idle,&lt;br /&gt;
to all DMA Channels being busy at once and data moves arbitrating between channels every 1024 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Optimal use of the DMA Engine ===&lt;br /&gt;
&lt;br /&gt;
To gain the best performance from the DMA Engines, block sizes of 256 bytes or more should be used.&lt;br /&gt;
Also, if possible the size should be an even multiple of at least 4 bytes.&lt;br /&gt;
&lt;br /&gt;
Additionally the memory blocks (source and destination) should be aligned to start on a 64 Byte boundary.&lt;br /&gt;
Alignment requirements are one of items taken care of for you by the DMAAllocPhysicalMemory() function.&lt;br /&gt;
&lt;br /&gt;
The DMA Engine can and does handle misaligned and odd sized data blocks by first shifting the minimum&lt;br /&gt;
required bytes to correct the alignment, then taking smaller chunks of data until the largest chunk of&lt;br /&gt;
the block can be moved. It can also handle copies of as little as one byte (don&#039;t do this).&lt;br /&gt;
&lt;br /&gt;
However, this does degrade performance.&lt;br /&gt;
&lt;br /&gt;
In general, the larger the data block the better.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10975</id>
		<title>DMA Resource</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10975"/>
		<updated>2019-11-27T04:42:30Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Author */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Author ==&lt;br /&gt;
&lt;br /&gt;
Jamie Krueger&amp;lt;br/&amp;gt;&lt;br /&gt;
Copyright (c) 2019 Trevor Dickinson&amp;lt;br/&amp;gt;&lt;br /&gt;
Used by permission.&lt;br /&gt;
&lt;br /&gt;
== DMA Engine ==&lt;br /&gt;
&lt;br /&gt;
Some hardware targets include a DMA engine which can be used for general purpose copying. This article describes the DMA engines available and how to use them.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Features ===&lt;br /&gt;
&lt;br /&gt;
The Direct Memory Access (DMA) Engines found in the NXP/Freescale p5020, p5040 and p1022 System On a Chip (SoC)s, as found in the AmigaONE X5000/20, X5000/40 and A1222 respectively, are quite flexible and powerful. Each of these chips contains two distinct engines with four data channels each. This provides the ability to have a total of eight DMA Channels working at once, with up to two DMA transactions actually being executed at the same time (one on each of the two DMA Engines).&lt;br /&gt;
&lt;br /&gt;
Further, each of the four DMA Channels found in a DMA Engine may be individually programmed to handle either; a single transaction, a &#039;&#039;Chain&#039;&#039; of transactions, or even &#039;&#039;Lists&#039;&#039; of &#039;&#039;Chains&#039;&#039; of transactions. The DMA Engines automatically arbitrate control between each DMA Channel following programmed bandwidth settings for each Channel (typically 1024 bytes).&lt;br /&gt;
&lt;br /&gt;
This means that after completing a transfer of 1024 bytes (for example), the hardware will consider switching to the next Channel to allow it to move another block of data, and so on in a round-robin fashion. If all other DMA Channels on a given DMA Engine are idle when arbitration would take place, the hardware will not arbitrate control to another Channel, but simply continue processing the transaction(s) for the Channel it is on.&lt;br /&gt;
&lt;br /&gt;
=== DMA Copy Memory - Execution Flow Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:DMACopyMem-Diagram.png]]&lt;br /&gt;
&lt;br /&gt;
=== What a call to perform a DMA copy does internally ===&lt;br /&gt;
&lt;br /&gt;
As shown in the above diagram, when the user makes a call to request a memory copy be performed by the DMA hardware, the next available DMA Channel is selected for use and a DMA Transaction (source, destination and size) is constructed. The DMA Transaction is then programmed into the DMA Engine which owns the available DMA Channel.&lt;br /&gt;
&lt;br /&gt;
At this point the calling task will Wait() until it hears the transaction has been completed. It will then return to the caller with the result. This provides a basic &#039;&#039;blocking&#039;&#039; function, which only returns to the caller once that data has been copied. This single tasking behavior is the simplest to use and what is normally expected by most applications using a memory copy function.&lt;br /&gt;
&lt;br /&gt;
=== Diagram of multitasking DMA Copies ===&lt;br /&gt;
&lt;br /&gt;
[[File:DMACopyMem-Multitasking-Diagram.png]]&lt;br /&gt;
&lt;br /&gt;
=== How multiple simultaneous DMA copies are handled ===&lt;br /&gt;
&lt;br /&gt;
When multiple user calls requesting a DMA copy arrive at once, each one is handed to a dedicated DMA Channel handling task for processing. As the diagram above demonstrates, there are two separate DMA Engines available, each with four channels that may be programmed at the same time. The hardware will then arbitrate the actual data move across these channels according to their respective bandwidth settings (usually 1024 bytes).&lt;br /&gt;
&lt;br /&gt;
In the diagram above, a separate color indicates a distinct data path from the caller through the DMA hardware to the system RAM. A dashed line of the matching color indicates an Interrupt line signaling the respective DMA Channel Handler with the completion of the transaction. The handler task then signals back to the original caller, which returns to the user with a success or failure result.&lt;br /&gt;
&lt;br /&gt;
All eight DMA Channels can handle each a single block transaction or an entire chain of block transactions before it signals completion and returns to the original caller. If all eight DMA Channels are busy processing their requested transactions when further DMA copy requests arrive, they will each be assigned a DMA Channel to wait on (managed via a Mutex lock on each Channel) and will block until allowed to add their DMA transaction to the Channel&#039;s queue.&lt;br /&gt;
&lt;br /&gt;
== fsldma.resource ==&lt;br /&gt;
&lt;br /&gt;
The fsldma.resource API is provided automatically in the kernel for all supported machines (Currently the AmigaONE X5000/20, X5000/40 and A1222).&lt;br /&gt;
&lt;br /&gt;
=== The FslDMA API ===&lt;br /&gt;
&lt;br /&gt;
The API provided by the fsldma.resource breaks down into three main parts:&lt;br /&gt;
:* Memory management&lt;br /&gt;
:* Copy Memory functions&lt;br /&gt;
:* Utility / Miscellaneous&lt;br /&gt;
&lt;br /&gt;
==== Memory Management Functions ====&lt;br /&gt;
&lt;br /&gt;
The FslDMA resource API provides convenience functions for the allocation and freeing of &#039;&#039;&#039;DMA Compliant&#039;&#039;&#039; blocks of memory. Two functions are provided for this purpose; DMAAllocPhysicalMemory() and DMAFreePhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
The memory allocation function also includes two Tags based versions of the call to allow for addition variables to be passed into the call using a variable set of Tags or fixed TagList. Currently the only supported Tag is &#039;&#039;FSLDMA_APM_ClearWithValue&#039;&#039;, which is the equivalent to the IExec-&amp;gt;AllocVecTagList() function&#039;s AVT_ClearWithValue tag. If the FSLDMA_APM_ClearWithValue tag is not provided then the requested memory block is cleared with zeroes by default before being returned. DMAAllocPhysicalMemory() returns the &#039;&#039;Physical&#039;&#039; Address pointer to the allocated memory or NULL if it is unable to allocate the requested memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  APTR DMAAllocPhysicalMemoryTagList( uint32 lSize, const struct TagItem *tags );&lt;br /&gt;
  APTR DMAAllocPhysicalMemoryTags( uint32 lSize, uint32 Tag1, ... );&lt;br /&gt;
  APTR DMAAllocPhysicalMemory( uint32 lSize );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The corresponding function to allocating a DMA Compliant memory block is DMAFreePhysicalMemory(). Any memory allocated using DMAAllocPhysicalMemory() must be eventually freed using DMAFreePhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  void DMAFreePhysicalMemory( APTR pPhysicalMemoryBlock );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Copy Memory Functions ====&lt;br /&gt;
&lt;br /&gt;
Two API calls make up the core of the FslDMA API; DMAPhysicalCopyMem() and DMACopyMem().&lt;br /&gt;
Both of these calls will &amp;quot;block&amp;quot; (not return to the user) until after the requested transfer has either succeeded or failed. A value of TRUE is returned upon success and FALSE if an error occurred.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  BOOL DMAPhysicalCopyMem( CONST_APTR pPhysicalSourceBuffer, APTR pPhysicalDestBuffer, uint32 lBufferSize );&lt;br /&gt;
  BOOL DMACopyMem( CONST_APTR pSourceBuffer, APTR pDestBuffer, uint32 lBufferSize );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As the name implies the first (and core version) of the copy memory functions, DMAPhysicalCopyMem(), accepts the Physical Addresses to the source and destination buffers (as returned by DMAAllocPhysicalMemory()), along with an unsigned 32-Bit value for the amount of bytes that should be copied (lBuffsize must be greater than zero(0) and no more than the maximum size of the source and destination buffers).&lt;br /&gt;
&lt;br /&gt;
DMAPhysicalCopyMem() is the most direct an efficient means of using the DMA hardware to effect a single memory copy. The DMACopyMem() function is provided as an alternative way to request a DMA transfer by passing in the &#039;&#039;Virtual Addresses&#039;&#039; to the source and destination buffers instead of the Physical Addresses. DMACopyMem() will attempt to determine if the supplied memory buffers are DMA Compliant and if so it will internally use DMAPhysicalCopyMem() to handle the transaction. If DMACopyMem() determines that the supplied memory is &#039;&#039;&#039;not&#039;&#039;&#039; DMA Compliant it will return FALSE and no data copy will occur.&lt;br /&gt;
&lt;br /&gt;
In theory any &#039;&#039;contiguous&#039;&#039; block of memory from 1 Byte up to 4GB in size may be transferred using either one of these calls. In practice the DMA hardware can directly accept memory blocks up to FSLDMA_MAXBLOCK_SIZE (or 64MB - 1 Byte). Therefore any data blocks greater than FSLDMA_MAXBLOCK_SIZE will automatically be feed to the DMA hardware in a series of smaller chunks. For maximum efficiency transfer sizes should be at least 256 Bytes in size and be an even multiple of 64 Bytes. Odd sizes are handled by the hardware but will degrade performance.&lt;br /&gt;
&lt;br /&gt;
If you are transferring many large blocks of data in series and wish to manually send them to the FslDMA API&#039;s memory copy functions one block at a time, then setting your block sizes to FSLDMA_OPTIMAL_BLKSIZE (or 64 MB - 64 Bytes) and exclusively using DMAPhysicalCopyMem() will provide the fastest transfer speeds will the least amount of CPU overhead.&lt;br /&gt;
&lt;br /&gt;
==== Utility / Miscellaneous Functions ====&lt;br /&gt;
&lt;br /&gt;
The last section to the FslDMA API provides a single convenience function call; DMAGetVirtualAddress().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  APTR DMAGetVirtualAddress( APTR pPhysicalAddress );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The DMAGetVirtualAddress() function returns the Virtual memory location for the Physical memory location that was itself allocated and returned by the DMAAllocPhysicalMemory() function. DMAGetVirtualAddress() will not work on physical addresses returned by IMMU-&amp;gt;GetPhysicalAddress() on memory not allocated using DMAAllocPhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
The main purpose of this function (other then debugging purposes) is to provide the &amp;quot;normal&amp;quot; Virtual Address of memory allocated by the FslDMA API for use by functions that expect &amp;quot;normal&amp;quot; Virtual address locations; for example IExec-&amp;gt;CopyMemQuick().&lt;br /&gt;
&lt;br /&gt;
==== Further reference - The fsldma.resource AutoDoc ====&lt;br /&gt;
&lt;br /&gt;
See the [[http://wiki.amigaos.net/amiga/autodocs/fsldmares.doc.txt fsldma.resource AutoDoc]] file for more details on each API call.&lt;br /&gt;
&lt;br /&gt;
=== Example usage ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;interfaces/fsldma.h&amp;gt;&lt;br /&gt;
// Obtain the fsldma.resource&lt;br /&gt;
struct fslDMAIFace *IfslDMA = IExec-&amp;gt;OpenResource(FSLDMA_NAME);&lt;br /&gt;
if ( NULL != IfslDMA )&lt;br /&gt;
{&lt;br /&gt;
  uint32     lTestSize         = 1024;&lt;br /&gt;
  CONST_APTR pPhysicalSrcAddr  = NULL;&lt;br /&gt;
  APTR       pPhysicalDestAddr = NULL;&lt;br /&gt;
  // Allocate the Source Buffer (for DMA)&lt;br /&gt;
  // and set the contents to 0xB3 (just an example value)&lt;br /&gt;
  pPhysicalSrcAddr = (CONST_APTR)IfslDMA-&amp;gt;DMAAllocPhysicalMemoryTags(lTestSize,&lt;br /&gt;
                                   FSLDMA_APM_ClearWithValue, 0xB3,&lt;br /&gt;
                                   TAG_END);&lt;br /&gt;
  if ( NULL != pPhysicalSrcAddr )&lt;br /&gt;
  {&lt;br /&gt;
    // Allocate the Destination Buffer (for DMA)&lt;br /&gt;
    //  - contents will by cleared by default&lt;br /&gt;
    pPhysicalDestAddr = IfslDMA-&amp;gt;DMAAllocPhysicalMemory(lTestSize);&lt;br /&gt;
    if ( NULL != pPhysicalDestAddr )&lt;br /&gt;
    {&lt;br /&gt;
      // Call IfslDMA-&amp;gt;DMAPhysicalCopyMem()&lt;br /&gt;
      // to perform the memory copy using the DMA hardware&lt;br /&gt;
      if ( TRUE == IfslDMA-&amp;gt;DMAPhysicalCopyMem(pPhysicalSrcAddr,&lt;br /&gt;
                                               pPhysicalDestAddr,lTestSize) )&lt;br /&gt;
      {&lt;br /&gt;
        // Success - Do something with the copied data&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // Fallback and use CPU Copy instead (or do something else)&lt;br /&gt;
        // Since we allocated the memory buffers using the FslDMA API,&lt;br /&gt;
        // which returns the Physical address to that memory, and the&lt;br /&gt;
        // IExec-&amp;gt;CopyMemQuick() function expects the Virtual address,&lt;br /&gt;
        // we first need to obtain the Virtual address for the Physical&lt;br /&gt;
        // ones (using the FslDMA API again) before we can call our&lt;br /&gt;
        // fallback copy function.&lt;br /&gt;
        CONST_APTR pVirtualSrcAddr  = NULL;&lt;br /&gt;
        APTR       pVirtualDestAddr = NULL;&lt;br /&gt;
        pVirtualSrcAddr  = IfslDMA-&amp;gt;DMAGetVirtualAddress((APTR)pPhysicalSrcAddr);&lt;br /&gt;
        pVirtualDestAddr = IfslDMA-&amp;gt;DMAGetVirtualAddress(pPhysicalDestAddr);&lt;br /&gt;
        IExec-&amp;gt;CopyMemQuick(pVirtualSrcAddr,pVirtualDestAddr,lTestSize);&lt;br /&gt;
      }&lt;br /&gt;
      // We *must* use DMAFreePhysicalMemory() to free the memory&lt;br /&gt;
      // that we allocated with DMAAllocPhysicalMemory()&lt;br /&gt;
      IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalDestAddr);&lt;br /&gt;
    }&lt;br /&gt;
    // We *must* use DMAFreePhysicalMemory() to free the memory&lt;br /&gt;
    // that we allocated with DMAAllocPhysicalMemory()&lt;br /&gt;
    IfslDMA-&amp;gt;DMAFreePhysicalMemory((APTR)pPhysicalSrcAddr);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Obtaining the fsldma.resource ====&lt;br /&gt;
&lt;br /&gt;
Breaking the above example down the first thing we do is include the interface header for the fsldma.resource and obtain the resource itself.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;interfaces/fsldma.h&amp;gt;&lt;br /&gt;
struct fslDMAIFace *IfslDMA = IExec-&amp;gt;OpenResource(FSLDMA_NAME);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Allocating DMA Compliant Memory ====&lt;br /&gt;
&lt;br /&gt;
Once we have successfully obtained the DMA resource we can directly use its API. The next step we need to do is to allocate some memory &#039;&#039;&#039;which we know is DMA compliant&#039;&#039;&#039; for use by the resource. The easiest way to accomplish this is to use the IfslDMA-&amp;gt;DMAAllocPhysicalMemory() function. This will automatically take care of ensuring the memory that is returned is properly aligned, contiguous, cache-inhibited and coherent.&lt;br /&gt;
&lt;br /&gt;
We use the Tags version of the allocate memory function first so we can allocate a block of memory for our source buffer and fill it with some test value (in this case the byte value 0xB3).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  pPhysicalSrcAddr = (CONST_APTR)IfslDMA-&amp;gt;DMAAllocPhysicalMemoryTags(lTestSize,&lt;br /&gt;
                                   FSLDMA_APM_ClearWithValue, 0xB3,&lt;br /&gt;
                                   TAG_END);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We also need a destination buffer for our test. Since it only needs to start out being cleared (filled with zeroes), we can use the simplest form of the allocate memory function here as the allocated memory is cleared by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  pPhysicalDestAddr = IfslDMA-&amp;gt;DMAAllocPhysicalMemory(lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== The core function - Copy Physical Memory ====&lt;br /&gt;
&lt;br /&gt;
Now that we have two DMA Compliant memory buffers available we can get to the heart of the API usage and make the call to IfslDMA-&amp;gt;DMAPhysicalCopyMem().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IfslDMA-&amp;gt;DMAPhysicalCopyMem(pPhysicalSrcAddr,pPhysicalDestAddr,lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looking at the full [[#Example usage|Example]] source above you can see that the DMAPhysicalCopyMem() call returns a Boolean value to indicate success or failure. Therefore, TRUE will be returned after the DMA hardware had completed copying the requested data (blocking call) and FALSE will be returned if a problem occurred.&lt;br /&gt;
&lt;br /&gt;
Since the memory buffers we are using were allocated using the FslDMA API and our transfer size was greater than zero and less than or equal to the total size of either buffer, (in others words a legal copy request), there is &#039;&#039;&#039;very&#039;&#039;&#039; little chance that the DMAPhysicalCopyMem() function will fail. In fact, about the only reason the DMA hardware would fail to handle a legal transaction would be if the physical RAM installed in the system was faulty.&lt;br /&gt;
&lt;br /&gt;
So even though it is extremely unlikely for our DMA copy to have failed and returned FALSE, let&#039;s take a look at how we might handle the failure. In other words, falling back and using a CPU based copy function instead to complete the data move.&lt;br /&gt;
&lt;br /&gt;
Since we are reverting back to using a normal system copy memory function here, we first need to obtain the &#039;&#039;Virtual Addresses&#039;&#039; to both our source and destination buffers. This is accomplished by using the DMAGetVirtualAddress() function and passing in the Physical Address that was returned by DMAAllocPhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  CONST_APTR pVirtualSrcAddr  = NULL;&lt;br /&gt;
  APTR       pVirtualDestAddr = NULL;&lt;br /&gt;
  pVirtualSrcAddr  = IfslDMA-&amp;gt;DMAGetVirtualAddress((APTR)pPhysicalSrcAddr);&lt;br /&gt;
  pVirtualDestAddr = IfslDMA-&amp;gt;DMAGetVirtualAddress(pPhysicalDestAddr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have the Virtual Address equivalents to the Physical Addresses that were returned by DMAAllocPhysicalMemory(), we can proceed to call the Exec CopyMemQuick() function to complete the copy. Here we can only trust that the IExec-&amp;gt;CopyMemQuick() call can not fail since it does not return a result code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IExec-&amp;gt;CopyMemQuick(pVirtualSrcAddr,pVirtualDestAddr,lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cleaning up - Freeing DMA Compliant memory ====&lt;br /&gt;
&lt;br /&gt;
It is essential that you free any memory that was allocated using the DMAAllocPhysicalMemory() function using the corresponding DMAFreePhysicalMemory() call. The reason for this is two-fold; first because additional resource tracking is maintained by the FslDMA API whenever it allocates memory which must itself be released, and second because the &#039;&#039;Physical Address&#039;&#039; to the memory is returned by the allocate call and not the &#039;&#039;Virtual Address&#039;&#039;, so if you attempt to pass the address returned by DMAAllocPhysicalMemory() directly into IExec-&amp;gt;FreeVec() it would likely result in a crash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalSrcAddr);&lt;br /&gt;
  IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalDestAddr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
&lt;br /&gt;
Testing DMA memory copies vs their CPU based equivalent indicates that the DMA hardware on all three models (X5000/20, X5000/40 and A1222)&lt;br /&gt;
move data approximately two to three times faster than the CPU does so alone.&lt;br /&gt;
&lt;br /&gt;
It should also be noted that these tests were performed when the CPU was effectively idle. CPU memory copy operations scale down roughly&lt;br /&gt;
equal with the CPU actively scaling up. So the more the CPU is doing, the longer it takes to complete the memory copy.&lt;br /&gt;
&lt;br /&gt;
Conversely, DMA memory copy operation times are far more predictable as they use the same amount of (minimal) CPU overhead for each copy,&lt;br /&gt;
and the actual time it takes the DMA hardware to complete the transaction can be calculated to range from all the DMA Channels being idle,&lt;br /&gt;
to all DMA Channels being busy at once and data moves arbitrating between channels every 1024 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Optimal use of the DMA Engine ===&lt;br /&gt;
&lt;br /&gt;
To gain the best performance from the DMA Engines, block sizes of 256 bytes or more should be used.&lt;br /&gt;
Also, if possible the size should be an even multiple of at least 4 bytes.&lt;br /&gt;
&lt;br /&gt;
Additionally the memory blocks (source and destination) should be aligned to start on a 64 Byte boundary.&lt;br /&gt;
Alignment requirements are one of items taken care of for you by the DMAAllocPhysicalMemory() function.&lt;br /&gt;
&lt;br /&gt;
The DMA Engine can and does handle misaligned and odd sized data blocks by first shifting the minimum&lt;br /&gt;
required bytes to correct the alignment, then taking smaller chunks of data until the largest chunk of&lt;br /&gt;
the block can be moved. It can also handle copies of as little as one byte (don&#039;t do this).&lt;br /&gt;
&lt;br /&gt;
However, this does degrade performance.&lt;br /&gt;
&lt;br /&gt;
In general, the larger the data block the better.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10974</id>
		<title>DMA Resource</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10974"/>
		<updated>2019-11-27T04:42:09Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* DMA Engine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Author ==&lt;br /&gt;
&lt;br /&gt;
Jamie Krueger&lt;br /&gt;
Copyright (c) 2019 Trevor Dickinson&lt;br /&gt;
Used by permission.&lt;br /&gt;
&lt;br /&gt;
== DMA Engine ==&lt;br /&gt;
&lt;br /&gt;
Some hardware targets include a DMA engine which can be used for general purpose copying. This article describes the DMA engines available and how to use them.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Features ===&lt;br /&gt;
&lt;br /&gt;
The Direct Memory Access (DMA) Engines found in the NXP/Freescale p5020, p5040 and p1022 System On a Chip (SoC)s, as found in the AmigaONE X5000/20, X5000/40 and A1222 respectively, are quite flexible and powerful. Each of these chips contains two distinct engines with four data channels each. This provides the ability to have a total of eight DMA Channels working at once, with up to two DMA transactions actually being executed at the same time (one on each of the two DMA Engines).&lt;br /&gt;
&lt;br /&gt;
Further, each of the four DMA Channels found in a DMA Engine may be individually programmed to handle either; a single transaction, a &#039;&#039;Chain&#039;&#039; of transactions, or even &#039;&#039;Lists&#039;&#039; of &#039;&#039;Chains&#039;&#039; of transactions. The DMA Engines automatically arbitrate control between each DMA Channel following programmed bandwidth settings for each Channel (typically 1024 bytes).&lt;br /&gt;
&lt;br /&gt;
This means that after completing a transfer of 1024 bytes (for example), the hardware will consider switching to the next Channel to allow it to move another block of data, and so on in a round-robin fashion. If all other DMA Channels on a given DMA Engine are idle when arbitration would take place, the hardware will not arbitrate control to another Channel, but simply continue processing the transaction(s) for the Channel it is on.&lt;br /&gt;
&lt;br /&gt;
=== DMA Copy Memory - Execution Flow Diagram ===&lt;br /&gt;
&lt;br /&gt;
[[File:DMACopyMem-Diagram.png]]&lt;br /&gt;
&lt;br /&gt;
=== What a call to perform a DMA copy does internally ===&lt;br /&gt;
&lt;br /&gt;
As shown in the above diagram, when the user makes a call to request a memory copy be performed by the DMA hardware, the next available DMA Channel is selected for use and a DMA Transaction (source, destination and size) is constructed. The DMA Transaction is then programmed into the DMA Engine which owns the available DMA Channel.&lt;br /&gt;
&lt;br /&gt;
At this point the calling task will Wait() until it hears the transaction has been completed. It will then return to the caller with the result. This provides a basic &#039;&#039;blocking&#039;&#039; function, which only returns to the caller once that data has been copied. This single tasking behavior is the simplest to use and what is normally expected by most applications using a memory copy function.&lt;br /&gt;
&lt;br /&gt;
=== Diagram of multitasking DMA Copies ===&lt;br /&gt;
&lt;br /&gt;
[[File:DMACopyMem-Multitasking-Diagram.png]]&lt;br /&gt;
&lt;br /&gt;
=== How multiple simultaneous DMA copies are handled ===&lt;br /&gt;
&lt;br /&gt;
When multiple user calls requesting a DMA copy arrive at once, each one is handed to a dedicated DMA Channel handling task for processing. As the diagram above demonstrates, there are two separate DMA Engines available, each with four channels that may be programmed at the same time. The hardware will then arbitrate the actual data move across these channels according to their respective bandwidth settings (usually 1024 bytes).&lt;br /&gt;
&lt;br /&gt;
In the diagram above, a separate color indicates a distinct data path from the caller through the DMA hardware to the system RAM. A dashed line of the matching color indicates an Interrupt line signaling the respective DMA Channel Handler with the completion of the transaction. The handler task then signals back to the original caller, which returns to the user with a success or failure result.&lt;br /&gt;
&lt;br /&gt;
All eight DMA Channels can handle each a single block transaction or an entire chain of block transactions before it signals completion and returns to the original caller. If all eight DMA Channels are busy processing their requested transactions when further DMA copy requests arrive, they will each be assigned a DMA Channel to wait on (managed via a Mutex lock on each Channel) and will block until allowed to add their DMA transaction to the Channel&#039;s queue.&lt;br /&gt;
&lt;br /&gt;
== fsldma.resource ==&lt;br /&gt;
&lt;br /&gt;
The fsldma.resource API is provided automatically in the kernel for all supported machines (Currently the AmigaONE X5000/20, X5000/40 and A1222).&lt;br /&gt;
&lt;br /&gt;
=== The FslDMA API ===&lt;br /&gt;
&lt;br /&gt;
The API provided by the fsldma.resource breaks down into three main parts:&lt;br /&gt;
:* Memory management&lt;br /&gt;
:* Copy Memory functions&lt;br /&gt;
:* Utility / Miscellaneous&lt;br /&gt;
&lt;br /&gt;
==== Memory Management Functions ====&lt;br /&gt;
&lt;br /&gt;
The FslDMA resource API provides convenience functions for the allocation and freeing of &#039;&#039;&#039;DMA Compliant&#039;&#039;&#039; blocks of memory. Two functions are provided for this purpose; DMAAllocPhysicalMemory() and DMAFreePhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
The memory allocation function also includes two Tags based versions of the call to allow for addition variables to be passed into the call using a variable set of Tags or fixed TagList. Currently the only supported Tag is &#039;&#039;FSLDMA_APM_ClearWithValue&#039;&#039;, which is the equivalent to the IExec-&amp;gt;AllocVecTagList() function&#039;s AVT_ClearWithValue tag. If the FSLDMA_APM_ClearWithValue tag is not provided then the requested memory block is cleared with zeroes by default before being returned. DMAAllocPhysicalMemory() returns the &#039;&#039;Physical&#039;&#039; Address pointer to the allocated memory or NULL if it is unable to allocate the requested memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  APTR DMAAllocPhysicalMemoryTagList( uint32 lSize, const struct TagItem *tags );&lt;br /&gt;
  APTR DMAAllocPhysicalMemoryTags( uint32 lSize, uint32 Tag1, ... );&lt;br /&gt;
  APTR DMAAllocPhysicalMemory( uint32 lSize );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The corresponding function to allocating a DMA Compliant memory block is DMAFreePhysicalMemory(). Any memory allocated using DMAAllocPhysicalMemory() must be eventually freed using DMAFreePhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  void DMAFreePhysicalMemory( APTR pPhysicalMemoryBlock );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Copy Memory Functions ====&lt;br /&gt;
&lt;br /&gt;
Two API calls make up the core of the FslDMA API; DMAPhysicalCopyMem() and DMACopyMem().&lt;br /&gt;
Both of these calls will &amp;quot;block&amp;quot; (not return to the user) until after the requested transfer has either succeeded or failed. A value of TRUE is returned upon success and FALSE if an error occurred.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  BOOL DMAPhysicalCopyMem( CONST_APTR pPhysicalSourceBuffer, APTR pPhysicalDestBuffer, uint32 lBufferSize );&lt;br /&gt;
  BOOL DMACopyMem( CONST_APTR pSourceBuffer, APTR pDestBuffer, uint32 lBufferSize );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As the name implies the first (and core version) of the copy memory functions, DMAPhysicalCopyMem(), accepts the Physical Addresses to the source and destination buffers (as returned by DMAAllocPhysicalMemory()), along with an unsigned 32-Bit value for the amount of bytes that should be copied (lBuffsize must be greater than zero(0) and no more than the maximum size of the source and destination buffers).&lt;br /&gt;
&lt;br /&gt;
DMAPhysicalCopyMem() is the most direct an efficient means of using the DMA hardware to effect a single memory copy. The DMACopyMem() function is provided as an alternative way to request a DMA transfer by passing in the &#039;&#039;Virtual Addresses&#039;&#039; to the source and destination buffers instead of the Physical Addresses. DMACopyMem() will attempt to determine if the supplied memory buffers are DMA Compliant and if so it will internally use DMAPhysicalCopyMem() to handle the transaction. If DMACopyMem() determines that the supplied memory is &#039;&#039;&#039;not&#039;&#039;&#039; DMA Compliant it will return FALSE and no data copy will occur.&lt;br /&gt;
&lt;br /&gt;
In theory any &#039;&#039;contiguous&#039;&#039; block of memory from 1 Byte up to 4GB in size may be transferred using either one of these calls. In practice the DMA hardware can directly accept memory blocks up to FSLDMA_MAXBLOCK_SIZE (or 64MB - 1 Byte). Therefore any data blocks greater than FSLDMA_MAXBLOCK_SIZE will automatically be feed to the DMA hardware in a series of smaller chunks. For maximum efficiency transfer sizes should be at least 256 Bytes in size and be an even multiple of 64 Bytes. Odd sizes are handled by the hardware but will degrade performance.&lt;br /&gt;
&lt;br /&gt;
If you are transferring many large blocks of data in series and wish to manually send them to the FslDMA API&#039;s memory copy functions one block at a time, then setting your block sizes to FSLDMA_OPTIMAL_BLKSIZE (or 64 MB - 64 Bytes) and exclusively using DMAPhysicalCopyMem() will provide the fastest transfer speeds will the least amount of CPU overhead.&lt;br /&gt;
&lt;br /&gt;
==== Utility / Miscellaneous Functions ====&lt;br /&gt;
&lt;br /&gt;
The last section to the FslDMA API provides a single convenience function call; DMAGetVirtualAddress().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  APTR DMAGetVirtualAddress( APTR pPhysicalAddress );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The DMAGetVirtualAddress() function returns the Virtual memory location for the Physical memory location that was itself allocated and returned by the DMAAllocPhysicalMemory() function. DMAGetVirtualAddress() will not work on physical addresses returned by IMMU-&amp;gt;GetPhysicalAddress() on memory not allocated using DMAAllocPhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
The main purpose of this function (other then debugging purposes) is to provide the &amp;quot;normal&amp;quot; Virtual Address of memory allocated by the FslDMA API for use by functions that expect &amp;quot;normal&amp;quot; Virtual address locations; for example IExec-&amp;gt;CopyMemQuick().&lt;br /&gt;
&lt;br /&gt;
==== Further reference - The fsldma.resource AutoDoc ====&lt;br /&gt;
&lt;br /&gt;
See the [[http://wiki.amigaos.net/amiga/autodocs/fsldmares.doc.txt fsldma.resource AutoDoc]] file for more details on each API call.&lt;br /&gt;
&lt;br /&gt;
=== Example usage ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;interfaces/fsldma.h&amp;gt;&lt;br /&gt;
// Obtain the fsldma.resource&lt;br /&gt;
struct fslDMAIFace *IfslDMA = IExec-&amp;gt;OpenResource(FSLDMA_NAME);&lt;br /&gt;
if ( NULL != IfslDMA )&lt;br /&gt;
{&lt;br /&gt;
  uint32     lTestSize         = 1024;&lt;br /&gt;
  CONST_APTR pPhysicalSrcAddr  = NULL;&lt;br /&gt;
  APTR       pPhysicalDestAddr = NULL;&lt;br /&gt;
  // Allocate the Source Buffer (for DMA)&lt;br /&gt;
  // and set the contents to 0xB3 (just an example value)&lt;br /&gt;
  pPhysicalSrcAddr = (CONST_APTR)IfslDMA-&amp;gt;DMAAllocPhysicalMemoryTags(lTestSize,&lt;br /&gt;
                                   FSLDMA_APM_ClearWithValue, 0xB3,&lt;br /&gt;
                                   TAG_END);&lt;br /&gt;
  if ( NULL != pPhysicalSrcAddr )&lt;br /&gt;
  {&lt;br /&gt;
    // Allocate the Destination Buffer (for DMA)&lt;br /&gt;
    //  - contents will by cleared by default&lt;br /&gt;
    pPhysicalDestAddr = IfslDMA-&amp;gt;DMAAllocPhysicalMemory(lTestSize);&lt;br /&gt;
    if ( NULL != pPhysicalDestAddr )&lt;br /&gt;
    {&lt;br /&gt;
      // Call IfslDMA-&amp;gt;DMAPhysicalCopyMem()&lt;br /&gt;
      // to perform the memory copy using the DMA hardware&lt;br /&gt;
      if ( TRUE == IfslDMA-&amp;gt;DMAPhysicalCopyMem(pPhysicalSrcAddr,&lt;br /&gt;
                                               pPhysicalDestAddr,lTestSize) )&lt;br /&gt;
      {&lt;br /&gt;
        // Success - Do something with the copied data&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        // Fallback and use CPU Copy instead (or do something else)&lt;br /&gt;
        // Since we allocated the memory buffers using the FslDMA API,&lt;br /&gt;
        // which returns the Physical address to that memory, and the&lt;br /&gt;
        // IExec-&amp;gt;CopyMemQuick() function expects the Virtual address,&lt;br /&gt;
        // we first need to obtain the Virtual address for the Physical&lt;br /&gt;
        // ones (using the FslDMA API again) before we can call our&lt;br /&gt;
        // fallback copy function.&lt;br /&gt;
        CONST_APTR pVirtualSrcAddr  = NULL;&lt;br /&gt;
        APTR       pVirtualDestAddr = NULL;&lt;br /&gt;
        pVirtualSrcAddr  = IfslDMA-&amp;gt;DMAGetVirtualAddress((APTR)pPhysicalSrcAddr);&lt;br /&gt;
        pVirtualDestAddr = IfslDMA-&amp;gt;DMAGetVirtualAddress(pPhysicalDestAddr);&lt;br /&gt;
        IExec-&amp;gt;CopyMemQuick(pVirtualSrcAddr,pVirtualDestAddr,lTestSize);&lt;br /&gt;
      }&lt;br /&gt;
      // We *must* use DMAFreePhysicalMemory() to free the memory&lt;br /&gt;
      // that we allocated with DMAAllocPhysicalMemory()&lt;br /&gt;
      IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalDestAddr);&lt;br /&gt;
    }&lt;br /&gt;
    // We *must* use DMAFreePhysicalMemory() to free the memory&lt;br /&gt;
    // that we allocated with DMAAllocPhysicalMemory()&lt;br /&gt;
    IfslDMA-&amp;gt;DMAFreePhysicalMemory((APTR)pPhysicalSrcAddr);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Obtaining the fsldma.resource ====&lt;br /&gt;
&lt;br /&gt;
Breaking the above example down the first thing we do is include the interface header for the fsldma.resource and obtain the resource itself.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;interfaces/fsldma.h&amp;gt;&lt;br /&gt;
struct fslDMAIFace *IfslDMA = IExec-&amp;gt;OpenResource(FSLDMA_NAME);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Allocating DMA Compliant Memory ====&lt;br /&gt;
&lt;br /&gt;
Once we have successfully obtained the DMA resource we can directly use its API. The next step we need to do is to allocate some memory &#039;&#039;&#039;which we know is DMA compliant&#039;&#039;&#039; for use by the resource. The easiest way to accomplish this is to use the IfslDMA-&amp;gt;DMAAllocPhysicalMemory() function. This will automatically take care of ensuring the memory that is returned is properly aligned, contiguous, cache-inhibited and coherent.&lt;br /&gt;
&lt;br /&gt;
We use the Tags version of the allocate memory function first so we can allocate a block of memory for our source buffer and fill it with some test value (in this case the byte value 0xB3).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  pPhysicalSrcAddr = (CONST_APTR)IfslDMA-&amp;gt;DMAAllocPhysicalMemoryTags(lTestSize,&lt;br /&gt;
                                   FSLDMA_APM_ClearWithValue, 0xB3,&lt;br /&gt;
                                   TAG_END);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We also need a destination buffer for our test. Since it only needs to start out being cleared (filled with zeroes), we can use the simplest form of the allocate memory function here as the allocated memory is cleared by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  pPhysicalDestAddr = IfslDMA-&amp;gt;DMAAllocPhysicalMemory(lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== The core function - Copy Physical Memory ====&lt;br /&gt;
&lt;br /&gt;
Now that we have two DMA Compliant memory buffers available we can get to the heart of the API usage and make the call to IfslDMA-&amp;gt;DMAPhysicalCopyMem().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IfslDMA-&amp;gt;DMAPhysicalCopyMem(pPhysicalSrcAddr,pPhysicalDestAddr,lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looking at the full [[#Example usage|Example]] source above you can see that the DMAPhysicalCopyMem() call returns a Boolean value to indicate success or failure. Therefore, TRUE will be returned after the DMA hardware had completed copying the requested data (blocking call) and FALSE will be returned if a problem occurred.&lt;br /&gt;
&lt;br /&gt;
Since the memory buffers we are using were allocated using the FslDMA API and our transfer size was greater than zero and less than or equal to the total size of either buffer, (in others words a legal copy request), there is &#039;&#039;&#039;very&#039;&#039;&#039; little chance that the DMAPhysicalCopyMem() function will fail. In fact, about the only reason the DMA hardware would fail to handle a legal transaction would be if the physical RAM installed in the system was faulty.&lt;br /&gt;
&lt;br /&gt;
So even though it is extremely unlikely for our DMA copy to have failed and returned FALSE, let&#039;s take a look at how we might handle the failure. In other words, falling back and using a CPU based copy function instead to complete the data move.&lt;br /&gt;
&lt;br /&gt;
Since we are reverting back to using a normal system copy memory function here, we first need to obtain the &#039;&#039;Virtual Addresses&#039;&#039; to both our source and destination buffers. This is accomplished by using the DMAGetVirtualAddress() function and passing in the Physical Address that was returned by DMAAllocPhysicalMemory().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  CONST_APTR pVirtualSrcAddr  = NULL;&lt;br /&gt;
  APTR       pVirtualDestAddr = NULL;&lt;br /&gt;
  pVirtualSrcAddr  = IfslDMA-&amp;gt;DMAGetVirtualAddress((APTR)pPhysicalSrcAddr);&lt;br /&gt;
  pVirtualDestAddr = IfslDMA-&amp;gt;DMAGetVirtualAddress(pPhysicalDestAddr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have the Virtual Address equivalents to the Physical Addresses that were returned by DMAAllocPhysicalMemory(), we can proceed to call the Exec CopyMemQuick() function to complete the copy. Here we can only trust that the IExec-&amp;gt;CopyMemQuick() call can not fail since it does not return a result code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IExec-&amp;gt;CopyMemQuick(pVirtualSrcAddr,pVirtualDestAddr,lTestSize);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cleaning up - Freeing DMA Compliant memory ====&lt;br /&gt;
&lt;br /&gt;
It is essential that you free any memory that was allocated using the DMAAllocPhysicalMemory() function using the corresponding DMAFreePhysicalMemory() call. The reason for this is two-fold; first because additional resource tracking is maintained by the FslDMA API whenever it allocates memory which must itself be released, and second because the &#039;&#039;Physical Address&#039;&#039; to the memory is returned by the allocate call and not the &#039;&#039;Virtual Address&#039;&#039;, so if you attempt to pass the address returned by DMAAllocPhysicalMemory() directly into IExec-&amp;gt;FreeVec() it would likely result in a crash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalSrcAddr);&lt;br /&gt;
  IfslDMA-&amp;gt;DMAFreePhysicalMemory(pPhysicalDestAddr);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
&lt;br /&gt;
Testing DMA memory copies vs their CPU based equivalent indicates that the DMA hardware on all three models (X5000/20, X5000/40 and A1222)&lt;br /&gt;
move data approximately two to three times faster than the CPU does so alone.&lt;br /&gt;
&lt;br /&gt;
It should also be noted that these tests were performed when the CPU was effectively idle. CPU memory copy operations scale down roughly&lt;br /&gt;
equal with the CPU actively scaling up. So the more the CPU is doing, the longer it takes to complete the memory copy.&lt;br /&gt;
&lt;br /&gt;
Conversely, DMA memory copy operation times are far more predictable as they use the same amount of (minimal) CPU overhead for each copy,&lt;br /&gt;
and the actual time it takes the DMA hardware to complete the transaction can be calculated to range from all the DMA Channels being idle,&lt;br /&gt;
to all DMA Channels being busy at once and data moves arbitrating between channels every 1024 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Optimal use of the DMA Engine ===&lt;br /&gt;
&lt;br /&gt;
To gain the best performance from the DMA Engines, block sizes of 256 bytes or more should be used.&lt;br /&gt;
Also, if possible the size should be an even multiple of at least 4 bytes.&lt;br /&gt;
&lt;br /&gt;
Additionally the memory blocks (source and destination) should be aligned to start on a 64 Byte boundary.&lt;br /&gt;
Alignment requirements are one of items taken care of for you by the DMAAllocPhysicalMemory() function.&lt;br /&gt;
&lt;br /&gt;
The DMA Engine can and does handle misaligned and odd sized data blocks by first shifting the minimum&lt;br /&gt;
required bytes to correct the alignment, then taking smaller chunks of data until the largest chunk of&lt;br /&gt;
the block can be moved. It can also handle copies of as little as one byte (don&#039;t do this).&lt;br /&gt;
&lt;br /&gt;
However, this does degrade performance.&lt;br /&gt;
&lt;br /&gt;
In general, the larger the data block the better.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10914</id>
		<title>DMA Resource</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=DMA_Resource&amp;diff=10914"/>
		<updated>2019-11-07T04:12:07Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: Created page with &amp;quot;== DMA Engine ==  Some hardware targets include a DMA engine which can be used for general purpose copying. This article describes the DMA engines available and how to use them.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DMA Engine ==&lt;br /&gt;
&lt;br /&gt;
Some hardware targets include a DMA engine which can be used for general purpose copying. This article describes the DMA engines available and how to use them.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Kernel&amp;diff=10913</id>
		<title>Kernel</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Kernel&amp;diff=10913"/>
		<updated>2019-11-07T04:10:04Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Additional Components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exec ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to Exec]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Libraries|Libraries]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Device I/O|Device I/O]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Memory Allocation|Memory Allocation]]&lt;br /&gt;
: [[Exec Memory Pools|Memory Pools]]&lt;br /&gt;
: [[Exec Item Pools|Item Pools]]&lt;br /&gt;
: [[Exec Named Memory|Named Memory]]&lt;br /&gt;
: [[Exec Extended Memory|Extended Memory]]&lt;br /&gt;
: [[Obsolete_Exec_Memory_Allocation|Obsolete Memory Allocation Techniques]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Tasks|Tasks]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Signals|Signals]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Lists and Queues|Lists and Queues]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Messages and Ports|Messages and Ports]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Semaphores|Semaphores]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Mutexes|Mutexes]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Interrupts|Interrupts]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Resources|Resources]]&lt;br /&gt;
&lt;br /&gt;
[[Exec Debug|Debugging Facilities]]&lt;br /&gt;
&lt;br /&gt;
== Additional Components ==&lt;br /&gt;
&lt;br /&gt;
[[Expansion Library]]&lt;br /&gt;
:[[PCI]]&lt;br /&gt;
&lt;br /&gt;
[[Utility Library]]&lt;br /&gt;
:[[Tags]]&lt;br /&gt;
:[[Callback Hooks]]&lt;br /&gt;
:[[String Functions]]&lt;br /&gt;
:[[Date Functions]]&lt;br /&gt;
:[[Named Objects]]&lt;br /&gt;
:[[Data Structures]]&lt;br /&gt;
&lt;br /&gt;
[[DMA Engine]]&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10910</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10910"/>
		<updated>2019-10-22T00:30:37Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 23 (Wednesday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* A-EON&#039;s Enhancer Software Core walkthrough&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* ExecSG DMA Engine&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* A-EON&#039;s Enhancer Software Core Walkthrough - Steven Solie&lt;br /&gt;
* The new &amp;quot;struct&amp;quot; text editor - Mark Ritter&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
* Introducing the fsldma.resource - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10909</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10909"/>
		<updated>2019-10-22T00:30:15Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* A-EON&#039;s Enhancer Software Core walkthrough&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* ExecSG DMA Engine&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Software Core Walkthrough - Steven Solie&lt;br /&gt;
* The new &amp;quot;struct&amp;quot; text editor - Mark Ritter&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
* Introducing the fsldma.resource - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10908</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10908"/>
		<updated>2019-10-21T20:51:38Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 24 (Thursday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* The 3rd party &amp;quot;Enhancer&amp;quot; Software pack or the original Amiga OS API?&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Software Core Walkthrough - Steven Solie&lt;br /&gt;
* The new &amp;quot;struct&amp;quot; text editor - Mark Ritter&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
* Introducing the fsldma.resource - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10901</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10901"/>
		<updated>2019-10-07T03:29:03Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 23 (Wednesday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* The 3rd party &amp;quot;Enhancer&amp;quot; Software pack or the original Amiga OS API?&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Software Core Walkthrough - Steven Solie&lt;br /&gt;
* The new &amp;quot;struct&amp;quot; text editor - Mark Ritter&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10899</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10899"/>
		<updated>2019-10-05T22:31:13Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 23 (Wednesday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* The new Enhancer Software Core&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Software Core Walkthrough - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10898</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10898"/>
		<updated>2019-10-05T22:31:02Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* The new Enhancer Software Core&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Core Walkthrough - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10897</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10897"/>
		<updated>2019-10-05T21:47:55Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* The new Enhancer Core&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Core Walkthrough - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10896</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10896"/>
		<updated>2019-10-05T21:47:36Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* ExecSG past/present/future&lt;br /&gt;
&lt;br /&gt;
* The AmigaOS Daily Driver&lt;br /&gt;
&lt;br /&gt;
* A1222 Graphics Driver&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Core Walkthrough - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10895</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10895"/>
		<updated>2019-10-05T21:42:07Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 24 (Thursday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
Still in development.&lt;br /&gt;
&lt;br /&gt;
Note: The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Core Walkthrough - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
* The Amiga Development Manifesto - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10894</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10894"/>
		<updated>2019-10-05T21:41:34Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 23 (Wednesday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
Still in development.&lt;br /&gt;
&lt;br /&gt;
Note: The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Introducing the ExecSG Team - Steven Solie&lt;br /&gt;
* Enhancer Core Walkthrough - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10889</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10889"/>
		<updated>2019-09-29T23:49:33Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 23 (Wednesday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
Still in development.&lt;br /&gt;
&lt;br /&gt;
Note: The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
* Enhancer Core Walkthrough - Steven Solie&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10888</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10888"/>
		<updated>2019-09-29T23:48:40Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 24 (Thursday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
Still in development.&lt;br /&gt;
&lt;br /&gt;
Note: The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
* Building a graphics driver for the A1222 - Tony Wyatt&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10187</id>
		<title>AmiWest 2019 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2019_DevCon&amp;diff=10187"/>
		<updated>2019-03-18T00:07:29Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: Created page with &amp;quot;= Getting Ready =  Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See AmiWest Setup for complete details on how to get ready.  = Syllabus =...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
&lt;br /&gt;
Still in development.&lt;br /&gt;
&lt;br /&gt;
Note: The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 each day so please be there for 09:00. We&#039;ll have a lunch break around noon. There is no scheduled end time.&lt;br /&gt;
&lt;br /&gt;
== October 23 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
== October 24 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
== October 25 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
AmiWest Classic Day&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=10186</id>
		<title>Tutorials:Main</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=10186"/>
		<updated>2019-03-18T00:01:26Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* AmiWest 2018 */&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 AmigaOS 4 library]]&lt;br /&gt;
&lt;br /&gt;
== Amiga Future Programming Articles ==&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: The Development Environment]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Exec - The Kernel]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: DOS - The Data Administrator]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Intuition - The User Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Drawing Graphics]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Transparent Windows]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Datatypes - Making Life Easy]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: GUI Toolkit ReAction]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Utility - Little Helpers]]&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 2019 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2019 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2018 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2018 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2017 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2017 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2016 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2016 DevCon]]&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 - Not Presented]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 8|AmiWest Lesson 8: ARexx Ports]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson07-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>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmigaOS_Applications&amp;diff=9974</id>
		<title>AmigaOS Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmigaOS_Applications&amp;diff=9974"/>
		<updated>2019-03-03T03:09:44Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Note */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Disclaimer =&lt;br /&gt;
The following list of applications are neither endorsed by nor supported by Hyperion Entertainment. This list is strictly informational only.&lt;br /&gt;
&lt;br /&gt;
= Applications =&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmigaOS_Applications&amp;diff=9973</id>
		<title>AmigaOS Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmigaOS_Applications&amp;diff=9973"/>
		<updated>2019-03-03T03:07:53Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Note */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Note =&lt;br /&gt;
The following list of applications are neither endorsed by nor supported by Hyperion Entertainment. This list is strictly informational only.&lt;br /&gt;
&lt;br /&gt;
= Applications =&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmigaOS_Applications&amp;diff=9972</id>
		<title>AmigaOS Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmigaOS_Applications&amp;diff=9972"/>
		<updated>2019-03-03T03:06:37Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: Created page with &amp;quot;= Note = The following list of applications are neither endorsed by nor supported by Hyperion Entertainment. This list is strictly informational only.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Note =&lt;br /&gt;
The following list of applications are neither endorsed by nor supported by Hyperion Entertainment. This list is strictly informational only.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=UserDoc:Main&amp;diff=9971</id>
		<title>UserDoc:Main</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=UserDoc:Main&amp;diff=9971"/>
		<updated>2019-03-03T03:04:50Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to AmigaOS ==&lt;br /&gt;
&lt;br /&gt;
AmigaOS was born in 1985 and delivered what contemporary personal computer operating systems could only dream of.  As the first &amp;quot;multimedia&amp;quot; operating system, it was trivial for AmigaOS computers to display animations while playing music and reading data from disks.  Such multimedia and multitasking finesse drew many people to this system.  Some of them are famous: [http://www.amigahistory.co.uk/warhol.html Andy Warhol], Sir Arthur C. Clarke, [http://www.polyphoto.com/upchug/AEcastro.html NASA], Hollywood and the TV broadcasting industry, and many others that thought [http://www.youtube.com/watch?v=PWeO5IkCssk only Amiga makes it possible].&lt;br /&gt;
&lt;br /&gt;
Today many people still think AmigaOS has something special that makes it more interesting and rewarding than other systems. This system allows the user to control the computer, not the other way around. It is a system you fully understand that is easier and more flexible to use.  In other words, AmigaOS is &#039;&#039;&#039;more fun&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== AmigaOS:  The flexible operating system ===&lt;br /&gt;
AmigaOS is an operating system:  a collection of efficient programs written to start the computer, let the user control the computer, and present feedback to the user.&lt;br /&gt;
&lt;br /&gt;
AmigaOS is designed with ease of use and flexibility in mind. To begin with, AmigaOS provides a clear view of your computer, your applications and files. A number of methods are available to let your computer serve you, whether graphically with a mouse, using the &amp;quot;Shell&amp;quot; command line, or by some other means the user prefers.&lt;br /&gt;
&lt;br /&gt;
AmigaOS strives to avoid stupid limitations that can be found on other systems. AmigaOS users can organise their files the way they like. There are few limits on file hierarchy, locations and file names.  Drives don&#039;t have to be named with a letter or cryptic names (such as C:, or sda1), your files don&#039;t have to reside in your &amp;quot;Documents&amp;quot; folder and your hard drives aren&#039;t hidden from you. If you&#039;re not writing to drives and you want to &amp;quot;shut down&amp;quot;, why wait for the OS to allow that?  With AmigaOS, just hit the power switch. Done.&lt;br /&gt;
&lt;br /&gt;
An Amiga does not start with pre-installed applications serving some sales conglomerate, marketing organization or their big brother. AmigaOS does not do actions behind the user&#039;s back. As unique as it is today, the AmigaOS computer serves the user and not the other way around. With one of the largest proportions of user-programmers around, the trustworthy AmigaOS user-friendly ethic is mirrored in AmigaOS applications.&lt;br /&gt;
&lt;br /&gt;
Since the first versions more than twenty-five years ago, AmigaOS has also been designed to serve efficiently. Optimizing  applications and OS code has always been the goal of programmers and developers of this operating system.  The result is an operating system and applications that take less space on your hard drives, waste less time loading, consume less memory, require less processing power, and respond more quickly to the user.&lt;br /&gt;
&lt;br /&gt;
And every update of AmigaOS doesn&#039;t demand you must buy newer, more powerful hardware. AmigaOS currently runs on twenty year old 200MHz computers or brand new dual core 1,800MHz computers.  It&#039;s the user&#039;s choice how they want to &#039;&#039;&#039;enjoy&#039;&#039;&#039; AmigaOS.&lt;br /&gt;
&lt;br /&gt;
=== Some AmigaOS features ===&lt;br /&gt;
Here are some of the features of AmigaOS that make it easy to control your computer. Some of these concepts were copied by other operating systems which tend to show they are the correct way of doing things.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Small footprint:&#039;&#039;&#039; AmigaOS can work with 64 MB of memory. On disk, a default installation only takes around 200 MB.  The smaller footprint translates into a more responsive user experience given any hardware.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Straightforward operating system design:&#039;&#039;&#039; With a clear layout and easy to understand names  (Classes, Libs, Fonts, Prefs, Storage, etc.),  you can easily understand what everything in AmigaOS is and what it does for you.  Nothing is hidden from the user and the user is not restricted by AmigaOS.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;User configurable graphic interface:&#039;&#039;&#039;  Using the provided &amp;quot;preferences editors,&amp;quot; the user can dramatically reconfigure how AmigaOS looks, sounds, runs and responds to every user whim.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;File recognition based on file content:&#039;&#039;&#039;  You can name a file &#039;&#039;&#039;whatever you want&#039;&#039;&#039;, even without an extension. Examples: &amp;quot;my file&amp;quot; or &amp;quot;picture of Jay in Santa Clara&amp;quot;.  There is no need to add an extension to explain what the file is, like &amp;quot;.txt&amp;quot; or &amp;quot;.jpg&amp;quot;. AmigaOS really examines the &#039;&#039;&#039;file content&#039;&#039;&#039; to recognise what type of file it is.  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Logical assignments:&#039;&#039;&#039; Easily set and use logical names names for directories located anywhere on your system.  For example, &amp;quot;Auto:&amp;quot; can point to your directory &amp;quot;car show pictures&amp;quot; buried on your media drive.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ram disk concept:&#039;&#039;&#039;  On AmigaOS there is a special disk called the &#039;&#039;&#039;Ram disk&#039;&#039;&#039; which represents a part of your computer memory. This area is not fixed. It automatically grows whenever you store files in it.  For example, it&#039;s a great place to unpack files to install from there, greatly speeding up the installation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Command line and graphical user interfaces:&#039;&#039;&#039;  Both the the graphical user interface (GUI) and command line interface (where you type commands into a window with the keyboard)  can be used to manage AmigaOS, its programs and files.   Both interfaces are intergated with each other so you can easily use command lines from the GUI or open graphical elements from a command line.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ARexx Ports:&#039;&#039;&#039;  Throughout AmigaOS and third party programs, &amp;quot;ARexx&amp;quot; message ports let one application talk with others so that apps work together to serve the user.  AmigaOS also provides the lightweight ARexx and modern Python programming languages that can control AmigaOS and applications with ARexx ports.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Resident Commands:&#039;&#039;&#039; Commands can be made resident, i.e., they are kept in memory so that they can be reused with no loading time.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Restart only the operating system:&#039;&#039;&#039; if you feel the need to restart the system, you can do so by restarting &#039;&#039;&#039;only AmigaOS&#039;&#039;&#039; and not the whole computer.&lt;br /&gt;
&lt;br /&gt;
=== AmigaOS platform targets ===&lt;br /&gt;
&lt;br /&gt;
While the original versions of AmigaOS ran on computers of the eighties using Motorola 68k series CPU chips, the current AmigaOS runs on computers using PowerPC processor chips [http://www.amigaos.net/content/72/supported-hardware hardware]. These can be older Amiga computers (also called &amp;quot;Classic Amigas&amp;quot;) with PPC &amp;quot;accelerator cards&amp;quot; or new generation Amiga PPC computers. &lt;br /&gt;
&lt;br /&gt;
In this guide, we will concentrate on the current AmigaOS running on the [[AmigaOS_Platforms|supported hardware]].&lt;br /&gt;
&lt;br /&gt;
== How does AmigaOS work? - Concepts ==&lt;br /&gt;
&lt;br /&gt;
In this page we will discuss  [[UserDoc:How AmigaOS Works|how AmigaOS works]]:&lt;br /&gt;
&lt;br /&gt;
* [[UserDoc:How_AmigaOS_Works#The_most_important_components|The most important components]] (Exec, AmigaDOS, Intuition...)&lt;br /&gt;
* [[UserDoc:How_AmigaOS_Works#How_is_my_data_stored.3F|how files and data are stored]]&lt;br /&gt;
* [[UserDoc:How_AmigaOS_Works#All_AmigaOS_components|all AmigaOS components are described]]&lt;br /&gt;
* [[UserDoc:How_AmigaOS_Works#AmigaOS_boot_procedure|how AmigaOS is booted on your Amiga computer]]&lt;br /&gt;
* [[Workbench/Prefs|AmigaOS settings programs]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== How to use AmigaOS? ==&lt;br /&gt;
&lt;br /&gt;
AmigaOS is a collection of components that oversee the computer hardware &amp;amp; data and provide the user with easy, understandable tools to manage and use them.&lt;br /&gt;
&lt;br /&gt;
In the following [[UserDoc:Introduction to AmigaOS|Introduction to AmigaOS pages]] we will discuss the basic concepts:&lt;br /&gt;
&lt;br /&gt;
* how to use AmigaOS&lt;br /&gt;
* what the AmigaOS graphic user interface is composed of &lt;br /&gt;
* what interfaces AmigaOS provides, including the [[UserDoc:Workbench|Workbench]], the [[UserDoc:Shell|Shell]] or scripting languages.&lt;br /&gt;
&lt;br /&gt;
From the introduction page, you can continue with more detailed pages on the [[UserDoc:Workbench|Workbench]] and the [[AmigaDOS manual]] .   Now let&#039;s start with this [[UserDoc:Introduction to AmigaOS|Introduction to AmigaOS]].&lt;br /&gt;
&lt;br /&gt;
== Manuals ==&lt;br /&gt;
&lt;br /&gt;
[[AmigaOS Manual]] - AmigaOS Manual&lt;br /&gt;
&lt;br /&gt;
[[Bars &amp;amp; Pipes Professional]] - MIDI Sequencer&lt;br /&gt;
&lt;br /&gt;
== Applications ==&lt;br /&gt;
&lt;br /&gt;
[[AmigaOS Applications]] - Sample list of AmigaOS applications&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmigaKit&amp;diff=9963</id>
		<title>AmigaKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmigaKit&amp;diff=9963"/>
		<updated>2019-02-12T17:10:50Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AmigaKit is an Amiga retailer, distributor and manufacturer based in the UK.&lt;br /&gt;
&lt;br /&gt;
They supply products worldwide from the current generation of Amiga computers and products through to the &#039;Classic&#039; range.&lt;br /&gt;
&lt;br /&gt;
AmigaKit are the official distributor of the [http://wiki.amiga.org/index.php?title=AmigaONE_X5000 AmigaOne X5000].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AmigaKit website:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.amigakit.com&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmigaKit&amp;diff=9962</id>
		<title>AmigaKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmigaKit&amp;diff=9962"/>
		<updated>2019-02-12T17:05:38Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AmigaKit is an Amiga retailer, distributor and manufacturer based in the UK.&lt;br /&gt;
&lt;br /&gt;
They supply products worldwide from the current generation of Amiga computers and products through to the &#039;Classic&#039; range.&lt;br /&gt;
&lt;br /&gt;
AmigaKit are the official distributor of the AmigaOne X5000.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AmigaKit website:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
http://www.amigakit.com&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9855</id>
		<title>Amiga Hardware Manufacturer ID Registry</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9855"/>
		<updated>2018-11-13T03:10:54Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Registry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= How to Obtain a Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Manufacturer&#039;s numbers are assigned by the AmigaOS development team. To obtain your unique manufacturer number use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;br /&gt;
&lt;br /&gt;
Be sure and include your name, email and the type of expansion product you are developing.&lt;br /&gt;
&lt;br /&gt;
= Your Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Attention hardware manufacturers. If you are developing a hardware expansion product for the Classic Amiga (e.g. 500, 2000, 3000) then you will need to obtain a special manufacturer ID number from the AmigaOS development team to identify your product. This manufacturer number is used by the Amiga to link your hardware with its driver software at boot time.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number is part of the special protocol that the Amiga uses to automatically configure all expansion devices on the bus without the user having to cut jumpers or adjust dip switches. This is called auto-config.&lt;br /&gt;
&lt;br /&gt;
At start-up time, the system first polls each board in the system and assigns the board its own address space. If it is a memory board, its RAM is linked into the memory free pool. Later in the boot sequence, after DOS is initialized, the binddrivers program is run. Binddrivers will search the directory SYS:Expansion for the drivers that go with the boards.&lt;br /&gt;
&lt;br /&gt;
To do this binddrivers looks in the Tool Type field of all icon files in SYS:Expansion. If the first seven bytes of the Tool Type field are &amp;quot;PRODUCT&amp;quot;, then this is an icon file for a driver.&lt;br /&gt;
&lt;br /&gt;
Binddrivers will then attempt to match the drivers it has found with the boards that were found earlier. This is where your manufacturer number comes in.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number goes in two places. First, it is burned in hex form into the PAL which is part of ALL auto-config expansion products. Second, it appears in ASCII in the Tool Type field of the icon file for your product&#039;s driver. By matching these two numbers, the Amiga can automatically configure your board and bind it&#039;s software driver into the system as well.&lt;br /&gt;
&lt;br /&gt;
The manufacturer&#039;s number is a 16-bit ID which appears in PAL offsets $10-$17. There is also an 8-bit product number which you assign. The product number is for uniquely identifying different products from the same vendor. The product number will appear in PAL offsets $04-$07. This gives you a total of 24 bits to identify each of your products.&lt;br /&gt;
&lt;br /&gt;
These 24 bits of information in the PAL which identify your product are matched against the information in the Tool Type field of all icon files in the SYS:Expansion drawer. For example, suppose you are manufacturer #1019. You have two products, #1 and #2 which both use the same driver. The icon for your driver for these two products would have a Tool Type set to &amp;quot;PRODUCT=1019/1|1019/2&amp;quot;. This means: I am an icon for a driver that works with product number 1 or 2 from manufacturer 1019, now bind me. Spaces are not legal. Here are two other examples:&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1208/11&lt;br /&gt;
: is the Tool Type for a driver for product 11 from manufacturer number 1208.&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1017&lt;br /&gt;
: is the Tool Type for a driver for any product from manufacturer number 1017.&lt;br /&gt;
&lt;br /&gt;
For an informal explanation of the auto-configuration process, see the chapter on Software Expansion Architecture from the 2nd Annual Amiga Developer&#039;s Conference Notes (available on ADCD 2.1). For the details of timing, power, the PAL equations and PAL address specifications and the expansion library documentation, see sections 3.1 to 3.3 of the A500/A2000 Technical Reference Manual. The original auto-config spec appears in the A1000 Schematics and Expansion Specification.&lt;br /&gt;
&lt;br /&gt;
The auto-config process makes the addition of expansion products to the system very easy. All the user has to do is put the board in any slot and copy the driver from the release disk to his own SYS:Expansion drawer. Everything else is automatic. There are no jumpers or dip switches to set. Best of all, you will get a lot less support calls asking how to make your product work with the XYZ-Corp-battery-backed-clock.&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
Some notes on hardware manufacturer ID assignment.&lt;br /&gt;
&lt;br /&gt;
* Manufacturer ID numbers are assigned free of charge.&lt;br /&gt;
* Please provide the following information when requesting an ID:&lt;br /&gt;
*# Name of the company or person&lt;br /&gt;
*# Postal address/contact address&lt;br /&gt;
*# Name of the contact person, with a corresponding e-mail address&lt;br /&gt;
*# A brief description of the kind of products you want to produce&lt;br /&gt;
* All ID numbers smaller than 5000 must be considered unsafe because no information exists on which numbers exactly were taken during the time Commodore, Inc. disintegrated.&lt;br /&gt;
* ID numbers in the range 8192 to 18841 must be considered unsafe because some hardware developers mistook the numbers assigned to them to be given in hexadecimal format. Hence 0x2000 = 8192 and 0x4999 = 18841.&lt;br /&gt;
&lt;br /&gt;
= Example code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
/* Here is a short program which will tell you   */&lt;br /&gt;
/* about the expansion boards configured in your */&lt;br /&gt;
/* system without you opening up the machine.    */&lt;br /&gt;
/* Code by Bill Koester of CATS                  */&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
#include &amp;lt;libraries/configvars.h&amp;gt;&lt;br /&gt;
#include &amp;lt;libraries/expansion.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct ExpansionBase *ExpansionBase;&lt;br /&gt;
&lt;br /&gt;
void cleanup();&lt;br /&gt;
void printdev();&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   struct ConfigDev *MyConfigDev;&lt;br /&gt;
&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
   /* Open the expansion library,      */&lt;br /&gt;
   /* if there is a problem then exit  */&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   ExpansionBase =(struct ExpansionBase *) OpenLibrary(EXPANSIONNAME,0);&lt;br /&gt;
   if(ExpansionBase==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error opening expansion library!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
   /* Use FindConfigDev to get info on the first */&lt;br /&gt;
   /* expansion board on the list maintained by  */&lt;br /&gt;
   /* Exec.  If there are no expansion boards in */&lt;br /&gt;
   /* the system then exit.                      */&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = NULL;&lt;br /&gt;
&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
  /* FindConfigDev(oldConfigDev,manufacturer,product) */&lt;br /&gt;
  /* oldConfigDev = NULL for the top of the list      */&lt;br /&gt;
  /* manufacturer = -1 for any manufacturer           */&lt;br /&gt;
  /* product      = -1 for any product                */&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = FindConfigDev(NULL,-1,-1);&lt;br /&gt;
&lt;br /&gt;
   if(MyConfigDev==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;No Configured Devices found!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printdev(MyConfigDev);&lt;br /&gt;
&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
   /* OK, there is at least one board,  */&lt;br /&gt;
   /* so loop and get the entire list   */&lt;br /&gt;
   /* printing as we go with printdev() */&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   while(MyConfigDev = FindConfigDev(MyConfigDev,-1,-1))&lt;br /&gt;
   {&lt;br /&gt;
      printdev(MyConfigDev);&lt;br /&gt;
   }&lt;br /&gt;
   cleanup();&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
/* Close up shop...  */&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
void cleanup()&lt;br /&gt;
{&lt;br /&gt;
   if(ExpansionBase)&lt;br /&gt;
      CloseLibrary(ExpansionBase);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
/* Print out the contents of the    */&lt;br /&gt;
/* dev structure for this expansion */&lt;br /&gt;
/* product.                         */&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
void printdev(dev)&lt;br /&gt;
struct ConfigDev *dev;&lt;br /&gt;
{&lt;br /&gt;
   char buff[200];&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Flags          = &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags==NULL)&lt;br /&gt;
      printf(&amp;quot;NULL  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_SHUTUP)&lt;br /&gt;
      printf(&amp;quot;CDF_SHUTUP  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_CONFIGME)&lt;br /&gt;
      printf(&amp;quot;CDF_CONFIGME  &amp;quot;);&lt;br /&gt;
   printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot;Board Address  = %x\n&amp;quot;,dev-&amp;gt;cd_BoardAddr);&lt;br /&gt;
   printf(&amp;quot;Board Size     = %d bytes\n&amp;quot;,dev-&amp;gt;cd_BoardSize);&lt;br /&gt;
   printf(&amp;quot;Slot  Address  = %d\n&amp;quot;,dev-&amp;gt;cd_SlotAddr);&lt;br /&gt;
   printf(&amp;quot;Slot  Size     = %d\n&amp;quot;,dev-&amp;gt;cd_SlotSize);&lt;br /&gt;
   printf(&amp;quot;Driver code at   %x\n&amp;quot;,dev-&amp;gt;cd_Driver);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;er_Type         = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Type);&lt;br /&gt;
   printf(&amp;quot;er_Product      = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Product);&lt;br /&gt;
   printf(&amp;quot;er_Flags        = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Flags);&lt;br /&gt;
   printf(&amp;quot;er_Reserved03   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved03);&lt;br /&gt;
   printf(&amp;quot;er_Manufacturer = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Manufacturer);&lt;br /&gt;
   printf(&amp;quot;er_SerialNumber = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_SerialNumber);&lt;br /&gt;
   printf(&amp;quot;er_InitDiagVec  = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_InitDiagVec);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0c   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0c);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0d   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0d);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0e   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0e);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0f   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0f);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Hit Return to continue:\n&amp;quot;);&lt;br /&gt;
   gets(buff);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Registry =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (decimal)&lt;br /&gt;
! ID (hexadecimal)&lt;br /&gt;
! Manufacturer&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 211&lt;br /&gt;
| 00D3&lt;br /&gt;
| Pacific Peripherals/Profex&lt;br /&gt;
|-&lt;br /&gt;
| 221&lt;br /&gt;
| 00DD&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 256&lt;br /&gt;
| 0100&lt;br /&gt;
| Memphis&lt;br /&gt;
| Originally registered to MacroSystems US&lt;br /&gt;
|-&lt;br /&gt;
| 512&lt;br /&gt;
| 0200&lt;br /&gt;
| 3-State Computertechnik&lt;br /&gt;
|-&lt;br /&gt;
| 513&lt;br /&gt;
| 0201&lt;br /&gt;
| Commodore (Braunschweig)&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| 0202&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
|-&lt;br /&gt;
| 515&lt;br /&gt;
| 0203&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
| Originally registered to Combitech/Macrosystem&lt;br /&gt;
|-&lt;br /&gt;
| 756&lt;br /&gt;
| 02F4&lt;br /&gt;
| Progressive Peripherals &amp;amp; Software&lt;br /&gt;
|-&lt;br /&gt;
| 767&lt;br /&gt;
| 02FF&lt;br /&gt;
| Kolff Computer Supplies&lt;br /&gt;
|-&lt;br /&gt;
| 1001&lt;br /&gt;
| 03E9&lt;br /&gt;
| Tecmar&lt;br /&gt;
|-&lt;br /&gt;
| 1002&lt;br /&gt;
| 03EA&lt;br /&gt;
| Telesys&lt;br /&gt;
|-&lt;br /&gt;
| 1003&lt;br /&gt;
| 03EB&lt;br /&gt;
| The Micro-Forge&lt;br /&gt;
|-&lt;br /&gt;
| 1004&lt;br /&gt;
| 03EC&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
| Originally registered to Card Co. (Supra)&lt;br /&gt;
|-&lt;br /&gt;
| 1005&lt;br /&gt;
| 03ED&lt;br /&gt;
| A-Squared&lt;br /&gt;
|-&lt;br /&gt;
| 1006&lt;br /&gt;
| 03EE&lt;br /&gt;
| Comspec Communications&lt;br /&gt;
|-&lt;br /&gt;
| 1007&lt;br /&gt;
| 03EF&lt;br /&gt;
| HT Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1008&lt;br /&gt;
| 03F0&lt;br /&gt;
| RDS Software&lt;br /&gt;
|-&lt;br /&gt;
| 1009&lt;br /&gt;
| 03F1&lt;br /&gt;
| Anakin Research&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| 03F2&lt;br /&gt;
| MicroBotics&lt;br /&gt;
|-&lt;br /&gt;
| 1011&lt;br /&gt;
| 03F3&lt;br /&gt;
| Bob Krauth&lt;br /&gt;
|-&lt;br /&gt;
| 1012&lt;br /&gt;
| 03F4&lt;br /&gt;
| Access Associates (Alegra)&lt;br /&gt;
|-&lt;br /&gt;
| 1013&lt;br /&gt;
| 03F5&lt;br /&gt;
| Mini Comp Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 1014&lt;br /&gt;
| 03F6&lt;br /&gt;
| Cypress Technology&lt;br /&gt;
|-&lt;br /&gt;
| 1015&lt;br /&gt;
| 03F7&lt;br /&gt;
| Fuller Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1016&lt;br /&gt;
| 03F8&lt;br /&gt;
| Galaxy Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1017&lt;br /&gt;
| 03F9&lt;br /&gt;
| ADA Research&lt;br /&gt;
|-&lt;br /&gt;
| 1018&lt;br /&gt;
| 03FA&lt;br /&gt;
| Computer Service Italia&lt;br /&gt;
|-&lt;br /&gt;
| 1019&lt;br /&gt;
| 03FB&lt;br /&gt;
| Amigo&lt;br /&gt;
|-&lt;br /&gt;
| 1020&lt;br /&gt;
| 03FC&lt;br /&gt;
| Micro-Solutions Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1021&lt;br /&gt;
| 03FD&lt;br /&gt;
| Stacar International&lt;br /&gt;
|-&lt;br /&gt;
| 1022&lt;br /&gt;
| 03FE&lt;br /&gt;
| Video Precisions&lt;br /&gt;
|-&lt;br /&gt;
| 1023&lt;br /&gt;
| 03FF&lt;br /&gt;
| ASDG, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1025&lt;br /&gt;
| 0401&lt;br /&gt;
| Ing. Buero Kalawsky&lt;br /&gt;
|-&lt;br /&gt;
| 1026&lt;br /&gt;
| 0402&lt;br /&gt;
| Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 1027&lt;br /&gt;
| 0403&lt;br /&gt;
| Interplan Unternehmensberatung&lt;br /&gt;
|-&lt;br /&gt;
| 1028&lt;br /&gt;
| 0404&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
| Originally registered to Peter Ohlich&lt;br /&gt;
|-&lt;br /&gt;
| 1030&lt;br /&gt;
| 0406&lt;br /&gt;
| Commodore (Lowell University)&lt;br /&gt;
| Originally registered to Productivity Center&lt;br /&gt;
|-&lt;br /&gt;
| 1041&lt;br /&gt;
| 0411&lt;br /&gt;
| Design Labs&lt;br /&gt;
|-&lt;br /&gt;
| 1042&lt;br /&gt;
| 0412&lt;br /&gt;
| MCS&lt;br /&gt;
|-&lt;br /&gt;
| 1043&lt;br /&gt;
| 0413&lt;br /&gt;
| B. J. Freeman&lt;br /&gt;
|-&lt;br /&gt;
| 1044&lt;br /&gt;
| 0414&lt;br /&gt;
| Side Effects Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1045&lt;br /&gt;
| 0415&lt;br /&gt;
| Oklahoma Personal Comp.&lt;br /&gt;
|-&lt;br /&gt;
| 1046&lt;br /&gt;
| 0416&lt;br /&gt;
| Advanced Micro Innovations&lt;br /&gt;
|-&lt;br /&gt;
| 1047&lt;br /&gt;
| 0417&lt;br /&gt;
| Industrial Support Services&lt;br /&gt;
|-&lt;br /&gt;
| 1048&lt;br /&gt;
| 0418&lt;br /&gt;
| Technisoft&lt;br /&gt;
|-&lt;br /&gt;
| 1049&lt;br /&gt;
| 0419&lt;br /&gt;
| Prolific, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1050&lt;br /&gt;
| 041A&lt;br /&gt;
| Softeam, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1051&lt;br /&gt;
| 041B&lt;br /&gt;
| GRC Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1052&lt;br /&gt;
| 041C&lt;br /&gt;
| David Lai&lt;br /&gt;
|-&lt;br /&gt;
| 1053&lt;br /&gt;
| 041D&lt;br /&gt;
| Ameristar Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 1054&lt;br /&gt;
| 041E&lt;br /&gt;
| Cline Refrigeration&lt;br /&gt;
|-&lt;br /&gt;
| 1055&lt;br /&gt;
| 041F&lt;br /&gt;
| Cardiac Pacemakers, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1056&lt;br /&gt;
| 0420&lt;br /&gt;
| Supra Corp. (Creative Microsystems)&lt;br /&gt;
|-&lt;br /&gt;
| 1057&lt;br /&gt;
| 0421&lt;br /&gt;
| Wayne Diener&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| 0422&lt;br /&gt;
| Computer Systems Associates (CSA)&lt;br /&gt;
|-&lt;br /&gt;
| 1059&lt;br /&gt;
| 0423&lt;br /&gt;
| Trionix, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1060&lt;br /&gt;
| 0424&lt;br /&gt;
| David Lucas&lt;br /&gt;
|-&lt;br /&gt;
| 1061&lt;br /&gt;
| 0425&lt;br /&gt;
| Analog Precision&lt;br /&gt;
| Also assigned to D &amp;amp; L Distributing&lt;br /&gt;
|-&lt;br /&gt;
| 1267&lt;br /&gt;
| 04F3&lt;br /&gt;
| RBM Digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 1282&lt;br /&gt;
| 0502&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
|-&lt;br /&gt;
| 1337&lt;br /&gt;
| 0539&lt;br /&gt;
| Thomas Stenzel (DaFR34K)&lt;br /&gt;
|-&lt;br /&gt;
| 1576&lt;br /&gt;
| 0628&lt;br /&gt;
| Boris Križma&lt;br /&gt;
|-&lt;br /&gt;
| 1761&lt;br /&gt;
| 06E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 1803&lt;br /&gt;
| 070B&lt;br /&gt;
| UAE Amiga Emulator&lt;br /&gt;
|-&lt;br /&gt;
| 2002&lt;br /&gt;
| 07D2&lt;br /&gt;
| Mimetics Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2003&lt;br /&gt;
| 07D3&lt;br /&gt;
| ACDA&lt;br /&gt;
|-&lt;br /&gt;
| 2004&lt;br /&gt;
| 07D4&lt;br /&gt;
| Finn R. Jacobsen&lt;br /&gt;
|-&lt;br /&gt;
| 2005&lt;br /&gt;
| 07D5&lt;br /&gt;
| Elthen Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2006&lt;br /&gt;
| 07D6&lt;br /&gt;
| Nine Tiles Computer Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2007&lt;br /&gt;
| 07D7&lt;br /&gt;
| Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2008&lt;br /&gt;
| 07D8&lt;br /&gt;
| Bell &amp;amp;amp; Howell&lt;br /&gt;
|-&lt;br /&gt;
| 2009&lt;br /&gt;
| 07D9&lt;br /&gt;
| Roland Kochler&lt;br /&gt;
|-&lt;br /&gt;
| 2010&lt;br /&gt;
| 07DA&lt;br /&gt;
| Byte Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2011&lt;br /&gt;
| 07DB&lt;br /&gt;
| Reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2012&lt;br /&gt;
| 07DC&lt;br /&gt;
| DKB, Inc.&lt;br /&gt;
| Previously named Michigan Software&lt;br /&gt;
|-&lt;br /&gt;
| 2013&lt;br /&gt;
| 07DD&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2014&lt;br /&gt;
| 07DE&lt;br /&gt;
| Sysaphus Software&lt;br /&gt;
|-&lt;br /&gt;
| 2015&lt;br /&gt;
| 07DF&lt;br /&gt;
| Digitronics&lt;br /&gt;
|-&lt;br /&gt;
| 2016&lt;br /&gt;
| 07E0&lt;br /&gt;
| Akron Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2017&lt;br /&gt;
| 07E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 2018&lt;br /&gt;
| 07E2&lt;br /&gt;
| Calmos&lt;br /&gt;
|-&lt;br /&gt;
| 2019&lt;br /&gt;
| 07E3&lt;br /&gt;
| Dover Research&lt;br /&gt;
|-&lt;br /&gt;
| 2020&lt;br /&gt;
| 07E4&lt;br /&gt;
| David Krehbiel&lt;br /&gt;
|-&lt;br /&gt;
| 2021&lt;br /&gt;
| 07E5&lt;br /&gt;
| Synergy Peripheral Systems&lt;br /&gt;
| Also known as California Access&lt;br /&gt;
|-&lt;br /&gt;
| 2022&lt;br /&gt;
| 07E6&lt;br /&gt;
| Xetec&lt;br /&gt;
|-&lt;br /&gt;
| 2023&lt;br /&gt;
| 07E7&lt;br /&gt;
| Micron Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2024&lt;br /&gt;
| 07E8&lt;br /&gt;
| CH Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2025&lt;br /&gt;
| 07E9&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2026&lt;br /&gt;
| 07EA&lt;br /&gt;
| Progressive Peripherals &amp;amp;amp; Software&lt;br /&gt;
| Also used by Ateo&lt;br /&gt;
|-&lt;br /&gt;
| 2027&lt;br /&gt;
| 07EB&lt;br /&gt;
| Wicat Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2028&lt;br /&gt;
| 07EC&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2029&lt;br /&gt;
| 07ED&lt;br /&gt;
| Delaware Valley Software&lt;br /&gt;
|-&lt;br /&gt;
| 2030&lt;br /&gt;
| 07EE&lt;br /&gt;
| Palomax&lt;br /&gt;
|-&lt;br /&gt;
| 2031&lt;br /&gt;
| 07EF&lt;br /&gt;
| Incognito Software&lt;br /&gt;
|-&lt;br /&gt;
| 2032&lt;br /&gt;
| 07F0&lt;br /&gt;
| Jadesign&lt;br /&gt;
|-&lt;br /&gt;
| 2033&lt;br /&gt;
| 07F1&lt;br /&gt;
| BVR&lt;br /&gt;
|-&lt;br /&gt;
| 2034&lt;br /&gt;
| 07F2&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2035&lt;br /&gt;
| 07F3&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2036&lt;br /&gt;
| 07F4&lt;br /&gt;
| Atronic&lt;br /&gt;
|-&lt;br /&gt;
| 2037&lt;br /&gt;
| 07F5&lt;br /&gt;
| Scott Karlin&lt;br /&gt;
|-&lt;br /&gt;
| 2038&lt;br /&gt;
| 07F6&lt;br /&gt;
| Howitch&lt;br /&gt;
|-&lt;br /&gt;
| 2039&lt;br /&gt;
| 07F7&lt;br /&gt;
| Sullivan Brothers Visual Engineers&lt;br /&gt;
|-&lt;br /&gt;
| 2040&lt;br /&gt;
| 07F8&lt;br /&gt;
| G I T&lt;br /&gt;
|-&lt;br /&gt;
| 2041&lt;br /&gt;
| 07F9&lt;br /&gt;
| Amigo Business Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2042&lt;br /&gt;
| 07FA&lt;br /&gt;
| Micro E Ab&lt;br /&gt;
|-&lt;br /&gt;
| 2043&lt;br /&gt;
| 07FB&lt;br /&gt;
| Ralph Kruse&lt;br /&gt;
|-&lt;br /&gt;
| 2044&lt;br /&gt;
| 07FC&lt;br /&gt;
| Clearpoint Research&lt;br /&gt;
|-&lt;br /&gt;
| 2045&lt;br /&gt;
| 07FD&lt;br /&gt;
| Kodiak&lt;br /&gt;
|-&lt;br /&gt;
| 2046&lt;br /&gt;
| 07FE&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Phoenix Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2047&lt;br /&gt;
| 07FF&lt;br /&gt;
| No Name Shown&lt;br /&gt;
|-&lt;br /&gt;
| 2048&lt;br /&gt;
| 0800&lt;br /&gt;
| Commodore Braunschweig&lt;br /&gt;
|-&lt;br /&gt;
| 2049&lt;br /&gt;
| 0801&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Elaborate Bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2050&lt;br /&gt;
| 0802&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2051&lt;br /&gt;
| 0803&lt;br /&gt;
| Spartanics&lt;br /&gt;
|-&lt;br /&gt;
| 2052&lt;br /&gt;
| 0804&lt;br /&gt;
| Jochheim Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 2053&lt;br /&gt;
| 0805&lt;br /&gt;
| Trans Data Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2054&lt;br /&gt;
| 0806&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2055&lt;br /&gt;
| 0807&lt;br /&gt;
| Checkpoint Technologies&lt;br /&gt;
| Originally registered to Amiga Solutions&lt;br /&gt;
|-&lt;br /&gt;
| 2056&lt;br /&gt;
| 0808&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2057&lt;br /&gt;
| 0809&lt;br /&gt;
| Advanced Computer Design&lt;br /&gt;
|-&lt;br /&gt;
| 2058&lt;br /&gt;
| 080A&lt;br /&gt;
| Sir Netics&lt;br /&gt;
|-&lt;br /&gt;
| 2059&lt;br /&gt;
| 080B&lt;br /&gt;
| Expert Services&lt;br /&gt;
|-&lt;br /&gt;
| 2060&lt;br /&gt;
| 080C&lt;br /&gt;
| Digital Art Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2061&lt;br /&gt;
| 080D&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2062&lt;br /&gt;
| 080E&lt;br /&gt;
| Expansion Technologies (Expansion Systems)&lt;br /&gt;
|-&lt;br /&gt;
| 2063&lt;br /&gt;
| 080F&lt;br /&gt;
| Alphatech&lt;br /&gt;
|-&lt;br /&gt;
| 2064&lt;br /&gt;
| 0810&lt;br /&gt;
| Edotronik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2065&lt;br /&gt;
| 0811&lt;br /&gt;
| California Access/Synergy&lt;br /&gt;
| Originally registered to Logical Design Works&lt;br /&gt;
|-&lt;br /&gt;
| 2066&lt;br /&gt;
| 0812&lt;br /&gt;
| Bowden, Williams, Full &amp;amp; Assoc.&lt;br /&gt;
|-&lt;br /&gt;
| 2067&lt;br /&gt;
| 0813&lt;br /&gt;
| NES, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2068&lt;br /&gt;
| 0814&lt;br /&gt;
| Amdev&lt;br /&gt;
|-&lt;br /&gt;
| 2069&lt;br /&gt;
| 0815&lt;br /&gt;
| Big Brother Security Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2070&lt;br /&gt;
| 0816&lt;br /&gt;
| Active Circuits Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2071&lt;br /&gt;
| 0817&lt;br /&gt;
| ICD, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2072&lt;br /&gt;
| 0818&lt;br /&gt;
| Multi-Meg Electronique&lt;br /&gt;
|-&lt;br /&gt;
| 2073&lt;br /&gt;
| 0819&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2074&lt;br /&gt;
| 081A&lt;br /&gt;
| The Checkered Ball&lt;br /&gt;
|-&lt;br /&gt;
| 2075&lt;br /&gt;
| 081B&lt;br /&gt;
| Hi Tension Computer Services Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2076&lt;br /&gt;
| 081C&lt;br /&gt;
| Alfa Data&lt;br /&gt;
| Originally assigned to Elmtech Research, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2077&lt;br /&gt;
| 081D&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Clartscreen, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2078&lt;br /&gt;
| 081E&lt;br /&gt;
| Interworks&lt;br /&gt;
|-&lt;br /&gt;
| 2079&lt;br /&gt;
| 081F&lt;br /&gt;
| Galysh Enterprises&lt;br /&gt;
|-&lt;br /&gt;
| 2080&lt;br /&gt;
| 0820&lt;br /&gt;
| Hardital Synthesis&lt;br /&gt;
| Originally registered to Realtime Games Software Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2081&lt;br /&gt;
| 0821&lt;br /&gt;
| GBS&lt;br /&gt;
|-&lt;br /&gt;
| 2082&lt;br /&gt;
| 0822&lt;br /&gt;
| Circum Design Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2083&lt;br /&gt;
| 0823&lt;br /&gt;
| Alberta Micro Electronic Center&lt;br /&gt;
|-&lt;br /&gt;
| 2084&lt;br /&gt;
| 0824&lt;br /&gt;
| Bestech&lt;br /&gt;
|-&lt;br /&gt;
| 2085&lt;br /&gt;
| 0825&lt;br /&gt;
| Lasar Fantasy&lt;br /&gt;
|-&lt;br /&gt;
| 2086&lt;br /&gt;
| 0826&lt;br /&gt;
| Pulsar&lt;br /&gt;
|-&lt;br /&gt;
| 2087&lt;br /&gt;
| 0827&lt;br /&gt;
| Ivis&lt;br /&gt;
|-&lt;br /&gt;
| 2088&lt;br /&gt;
| 0828&lt;br /&gt;
| Applied Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2089&lt;br /&gt;
| 0829&lt;br /&gt;
| Solid-State Design &amp;amp;amp; Development&lt;br /&gt;
|-&lt;br /&gt;
| 2090&lt;br /&gt;
| 082A&lt;br /&gt;
| Vison Quest&lt;br /&gt;
|-&lt;br /&gt;
| 2091&lt;br /&gt;
| 082B&lt;br /&gt;
| Seaview Software&lt;br /&gt;
|-&lt;br /&gt;
| 2092&lt;br /&gt;
| 082C&lt;br /&gt;
| BSC&lt;br /&gt;
| Mistakenly used by ADS (Advanced Development Software)&lt;br /&gt;
|-&lt;br /&gt;
| 2093&lt;br /&gt;
| 082D&lt;br /&gt;
| Bernd Culenfeld&lt;br /&gt;
|-&lt;br /&gt;
| 2094&lt;br /&gt;
| 082E&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2095&lt;br /&gt;
| 082F&lt;br /&gt;
| CEGITES&lt;br /&gt;
|-&lt;br /&gt;
| 2096&lt;br /&gt;
| 0830&lt;br /&gt;
| Quadlite Computers Ltd.&lt;br /&gt;
| Originally registered to EV Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2097&lt;br /&gt;
| 0831&lt;br /&gt;
| Silicon Peace&lt;br /&gt;
|-&lt;br /&gt;
| 2098&lt;br /&gt;
| 0832&lt;br /&gt;
| Black Belt Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2099&lt;br /&gt;
| 0833&lt;br /&gt;
| Village Tronic&lt;br /&gt;
| Originally registerd to Steve Yaeger&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 0834&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 2101&lt;br /&gt;
| 0835&lt;br /&gt;
| Phoenix Micro Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 2102&lt;br /&gt;
| 0836&lt;br /&gt;
| Advanced Systems &amp;amp; Software&lt;br /&gt;
| Orignally assigned to Preferred Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2103&lt;br /&gt;
| 0837&lt;br /&gt;
| Rombo Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2104&lt;br /&gt;
| 0838&lt;br /&gt;
| Impulse Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2105&lt;br /&gt;
| 0839&lt;br /&gt;
| Beta Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2106&lt;br /&gt;
| 083A&lt;br /&gt;
| Memory Expansion System, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2107&lt;br /&gt;
| 083B&lt;br /&gt;
| Vortex Computer Systems GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2108&lt;br /&gt;
| 083C&lt;br /&gt;
| Platypus Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2109&lt;br /&gt;
| 083D&lt;br /&gt;
| Gigatron OHG&lt;br /&gt;
|-&lt;br /&gt;
| 2110&lt;br /&gt;
| 083E&lt;br /&gt;
| PG Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2111&lt;br /&gt;
| 083F&lt;br /&gt;
| New Technologies Group&lt;br /&gt;
|-&lt;br /&gt;
| 2112&lt;br /&gt;
| 0840&lt;br /&gt;
| Interactive Video Systems (IVS)&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2113&lt;br /&gt;
| 0841&lt;br /&gt;
| Vector&lt;br /&gt;
| Originally registered to H. K. Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2114&lt;br /&gt;
| 0842&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to C. H. Helfrich Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 2115&lt;br /&gt;
| 0843&lt;br /&gt;
| Xanadu&lt;br /&gt;
|-&lt;br /&gt;
| 2116&lt;br /&gt;
| 0844&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to AMS&lt;br /&gt;
|-&lt;br /&gt;
| 2117&lt;br /&gt;
| 0845&lt;br /&gt;
| X-Pert&lt;br /&gt;
|-&lt;br /&gt;
| 2118&lt;br /&gt;
| 0846&lt;br /&gt;
| The Amiga Centre&lt;br /&gt;
|-&lt;br /&gt;
| 2119&lt;br /&gt;
| 0847&lt;br /&gt;
| Digital Pacific&lt;br /&gt;
|-&lt;br /&gt;
| 2120&lt;br /&gt;
| 0848&lt;br /&gt;
| Solid State Leisure&lt;br /&gt;
|-&lt;br /&gt;
| 2121&lt;br /&gt;
| 0849&lt;br /&gt;
| Hydra Systems&lt;br /&gt;
| Originally registered to Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2122&lt;br /&gt;
| 084A&lt;br /&gt;
| Cumana&lt;br /&gt;
|-&lt;br /&gt;
| 2123&lt;br /&gt;
| 084B&lt;br /&gt;
| KAPS 2C Conception&lt;br /&gt;
|-&lt;br /&gt;
| 2124&lt;br /&gt;
| 084C&lt;br /&gt;
| Mike Mason&lt;br /&gt;
|-&lt;br /&gt;
| 2125&lt;br /&gt;
| 084D&lt;br /&gt;
| For Your Eyes&lt;br /&gt;
|-&lt;br /&gt;
| 2126&lt;br /&gt;
| 084E&lt;br /&gt;
| Volkmar Breitfeld Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2127&lt;br /&gt;
| 084F&lt;br /&gt;
| Sunrize Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2128&lt;br /&gt;
| 0850&lt;br /&gt;
| Scott Advanced Micro Designs&lt;br /&gt;
|-&lt;br /&gt;
| 2129&lt;br /&gt;
| 0851&lt;br /&gt;
| Digital Micronics&lt;br /&gt;
|-&lt;br /&gt;
| 2130&lt;br /&gt;
| 0852&lt;br /&gt;
| Alfa-Laval&lt;br /&gt;
|-&lt;br /&gt;
| 2131&lt;br /&gt;
| 0853&lt;br /&gt;
| Multigros A/S&lt;br /&gt;
|-&lt;br /&gt;
| 2132&lt;br /&gt;
| 0854&lt;br /&gt;
| Archos&lt;br /&gt;
|-&lt;br /&gt;
| 2133&lt;br /&gt;
| 0855&lt;br /&gt;
| Icom Simulations&lt;br /&gt;
|-&lt;br /&gt;
| 2134&lt;br /&gt;
| 0856&lt;br /&gt;
| Commodore Test Engineering Group&lt;br /&gt;
|-&lt;br /&gt;
| 2135&lt;br /&gt;
| 0857&lt;br /&gt;
| Microcreations&lt;br /&gt;
|-&lt;br /&gt;
| 2136&lt;br /&gt;
| 0858&lt;br /&gt;
| Shoestring Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2137&lt;br /&gt;
| 0859&lt;br /&gt;
| Faberushi&lt;br /&gt;
|-&lt;br /&gt;
| 2138&lt;br /&gt;
| 085A&lt;br /&gt;
| Evesham Micro Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2139&lt;br /&gt;
| 085B&lt;br /&gt;
| Panagolin Laser Software&lt;br /&gt;
|-&lt;br /&gt;
| 2140&lt;br /&gt;
| 085C&lt;br /&gt;
| Thomas Rudloff&lt;br /&gt;
|-&lt;br /&gt;
| 2141&lt;br /&gt;
| 085D&lt;br /&gt;
| Daniel Hohabir&lt;br /&gt;
|-&lt;br /&gt;
| 2142&lt;br /&gt;
| 085E&lt;br /&gt;
| GfxBase, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2143&lt;br /&gt;
| 085F&lt;br /&gt;
| Axellabs&lt;br /&gt;
|-&lt;br /&gt;
| 2144&lt;br /&gt;
| 0860&lt;br /&gt;
| Roctec Electronics Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2145&lt;br /&gt;
| 0861&lt;br /&gt;
| Omega Datentechnik&lt;br /&gt;
|-&lt;br /&gt;
| 2146&lt;br /&gt;
| 0862&lt;br /&gt;
| Atlantis&lt;br /&gt;
|-&lt;br /&gt;
| 2147&lt;br /&gt;
| 0863&lt;br /&gt;
| Skytec Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2148&lt;br /&gt;
| 0864&lt;br /&gt;
| Protar Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2149&lt;br /&gt;
| 0865&lt;br /&gt;
| ACS&lt;br /&gt;
|-&lt;br /&gt;
| 2150&lt;br /&gt;
| 0866&lt;br /&gt;
| Software Results Enterprises&lt;br /&gt;
| Originally registered to University of Illinois&lt;br /&gt;
|-&lt;br /&gt;
| 2151&lt;br /&gt;
| 0867&lt;br /&gt;
| Infinity Systems Design Group&lt;br /&gt;
|-&lt;br /&gt;
| 2152&lt;br /&gt;
| 0868&lt;br /&gt;
| Trade It&lt;br /&gt;
|-&lt;br /&gt;
| 2153&lt;br /&gt;
| 0869&lt;br /&gt;
| Suntec, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2154&lt;br /&gt;
| 086A&lt;br /&gt;
| DJW Micro Systems&lt;br /&gt;
| Originally registered to Tritec Marketing&lt;br /&gt;
|-&lt;br /&gt;
| 2155&lt;br /&gt;
| 086B&lt;br /&gt;
| Power Computing Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2156&lt;br /&gt;
| 086C&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 2157&lt;br /&gt;
| 086D&lt;br /&gt;
| Masoboshi GmbH (DCE)&lt;br /&gt;
|-&lt;br /&gt;
| 2158&lt;br /&gt;
| 086E&lt;br /&gt;
| HAL Software Hardware Handel&lt;br /&gt;
|-&lt;br /&gt;
| 2159&lt;br /&gt;
| 086F&lt;br /&gt;
| Mainhattan Data&lt;br /&gt;
| Originally registered to Michael Lamm Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2160&lt;br /&gt;
| 0870&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
| Originally registered to bbdp Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2161&lt;br /&gt;
| 0871&lt;br /&gt;
| Blue Ribbon Soundworks&lt;br /&gt;
| Originally registered to Design Computer Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2162&lt;br /&gt;
| 0872&lt;br /&gt;
| XPert&lt;br /&gt;
| Originally registered to The Station&lt;br /&gt;
|-&lt;br /&gt;
| 2163&lt;br /&gt;
| 0873&lt;br /&gt;
| DelaComp&lt;br /&gt;
| Originally registered to Bryan Williams&lt;br /&gt;
|-&lt;br /&gt;
| 2164&lt;br /&gt;
| 0874&lt;br /&gt;
| Superformance Computer Engineering GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2165&lt;br /&gt;
| 0875&lt;br /&gt;
| Overland Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2166&lt;br /&gt;
| 0876&lt;br /&gt;
| Thomas Hamren&lt;br /&gt;
|-&lt;br /&gt;
| 2167&lt;br /&gt;
| 0877&lt;br /&gt;
| Village Tronic&lt;br /&gt;
|-&lt;br /&gt;
| 2168&lt;br /&gt;
| 0878&lt;br /&gt;
| Toolbox Design&lt;br /&gt;
|-&lt;br /&gt;
| 2169&lt;br /&gt;
| 0879&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
|-&lt;br /&gt;
| 2170&lt;br /&gt;
| 087A&lt;br /&gt;
| Superformance&lt;br /&gt;
|-&lt;br /&gt;
| 2171&lt;br /&gt;
| 087B&lt;br /&gt;
| Utilities Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2172&lt;br /&gt;
| 087C&lt;br /&gt;
| phase 5&lt;br /&gt;
|-&lt;br /&gt;
| 2173&lt;br /&gt;
| 087D&lt;br /&gt;
| Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2174&lt;br /&gt;
| 087E&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 2175&lt;br /&gt;
| 087F&lt;br /&gt;
| James Cook University of North Queensland&lt;br /&gt;
|-&lt;br /&gt;
| 2176&lt;br /&gt;
| 0880&lt;br /&gt;
| AmiTrix Development&lt;br /&gt;
|-&lt;br /&gt;
| 2177&lt;br /&gt;
| 0881&lt;br /&gt;
| Ferranti&lt;br /&gt;
|-&lt;br /&gt;
| 2178&lt;br /&gt;
| 0882&lt;br /&gt;
| Leviathan Development&lt;br /&gt;
|-&lt;br /&gt;
| 2179&lt;br /&gt;
| 0883&lt;br /&gt;
| United Video Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2180&lt;br /&gt;
| 0884&lt;br /&gt;
| GPSoft Pty. Ltd.&lt;br /&gt;
| Originally registered to Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2181&lt;br /&gt;
| 0885&lt;br /&gt;
| ArMAX&lt;br /&gt;
| Oliver Bausch&lt;br /&gt;
|-&lt;br /&gt;
| 2182&lt;br /&gt;
| 0886&lt;br /&gt;
| CP Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2183&lt;br /&gt;
| 0887&lt;br /&gt;
| AMOK - Amiga Module &amp;amp;amp; Oberon Klub&lt;br /&gt;
|-&lt;br /&gt;
| 2184&lt;br /&gt;
| 0888&lt;br /&gt;
| ITEK Neser &amp;amp;amp; Sieber GbR&lt;br /&gt;
|-&lt;br /&gt;
| 2185&lt;br /&gt;
| 0889&lt;br /&gt;
| Phillip C. Lello&lt;br /&gt;
|-&lt;br /&gt;
| 2186&lt;br /&gt;
| 088A&lt;br /&gt;
| Cyborg Design Services&lt;br /&gt;
|-&lt;br /&gt;
| 2187&lt;br /&gt;
| 088B&lt;br /&gt;
| G2 Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2188&lt;br /&gt;
| 088C&lt;br /&gt;
| Pro System Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2189&lt;br /&gt;
| 088D&lt;br /&gt;
| ZEUS Electronic&lt;br /&gt;
| Originally registered to MSPI (Markt &amp;amp;amp; Technik)&lt;br /&gt;
|-&lt;br /&gt;
| 2190&lt;br /&gt;
| 088E&lt;br /&gt;
| Altatech&lt;br /&gt;
|-&lt;br /&gt;
| 2191&lt;br /&gt;
| 088F&lt;br /&gt;
| NewTek&lt;br /&gt;
|-&lt;br /&gt;
| 2192&lt;br /&gt;
| 0890&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
| Originally registered to Hardware Design Udo Neuroth&lt;br /&gt;
|-&lt;br /&gt;
| 2193&lt;br /&gt;
| 0891&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Viona Development&lt;br /&gt;
|-&lt;br /&gt;
| 2194&lt;br /&gt;
| 0892&lt;br /&gt;
| Amitek&lt;br /&gt;
| Originally assigned to Marpet Developments&lt;br /&gt;
|-&lt;br /&gt;
| 2195&lt;br /&gt;
| 0893&lt;br /&gt;
| Ingenieurbuero Helfrich&lt;br /&gt;
|-&lt;br /&gt;
| 2196&lt;br /&gt;
| 0894&lt;br /&gt;
| The Neo Group&lt;br /&gt;
|-&lt;br /&gt;
| 2197&lt;br /&gt;
| 0895&lt;br /&gt;
| Cyon&lt;br /&gt;
|-&lt;br /&gt;
| 2198&lt;br /&gt;
| 0896&lt;br /&gt;
| Bob Research Group&lt;br /&gt;
|-&lt;br /&gt;
| 2199&lt;br /&gt;
| 0897&lt;br /&gt;
| Richmond Sound Design Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2200&lt;br /&gt;
| 0898&lt;br /&gt;
| US Cybernetics&lt;br /&gt;
|-&lt;br /&gt;
| 2201&lt;br /&gt;
| 0899&lt;br /&gt;
| Fulvio Ieva&lt;br /&gt;
|-&lt;br /&gt;
| 2202&lt;br /&gt;
| 089A&lt;br /&gt;
| Silicon Studio&lt;br /&gt;
|-&lt;br /&gt;
| 2203&lt;br /&gt;
| 089B&lt;br /&gt;
| MacroSystems (USA)&lt;br /&gt;
| Was named Micro System Devices&lt;br /&gt;
|-&lt;br /&gt;
| 2204&lt;br /&gt;
| 089C&lt;br /&gt;
| Conspector Entertainment&lt;br /&gt;
|-&lt;br /&gt;
| 2205&lt;br /&gt;
| 089D&lt;br /&gt;
| Laserforum&lt;br /&gt;
|-&lt;br /&gt;
| 2206&lt;br /&gt;
| 089E&lt;br /&gt;
| Elbox Computer&lt;br /&gt;
| Mistakenly used by Index Information Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2207&lt;br /&gt;
| 089F&lt;br /&gt;
| Applied Magic Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2208&lt;br /&gt;
| 08A0&lt;br /&gt;
| SDL Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2560&lt;br /&gt;
| 0A00&lt;br /&gt;
| Harms&lt;br /&gt;
|-&lt;br /&gt;
| 2588&lt;br /&gt;
| 0A1C&lt;br /&gt;
| A1K.org Community&lt;br /&gt;
|-&lt;br /&gt;
| 2640&lt;br /&gt;
| 0A50&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 3084&lt;br /&gt;
| 0C0C&lt;br /&gt;
| Team 4&lt;br /&gt;
|-&lt;br /&gt;
| 3643&lt;br /&gt;
| 0E3B&lt;br /&gt;
| E3B&lt;br /&gt;
| Michael Boehmer&lt;br /&gt;
|-&lt;br /&gt;
| 3855&lt;br /&gt;
| 0F0F&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 4096&lt;br /&gt;
| 1000&lt;br /&gt;
| MegaMicro&lt;br /&gt;
|-&lt;br /&gt;
| 4110&lt;br /&gt;
| 100E&lt;br /&gt;
| DigiFeX&lt;br /&gt;
|-&lt;br /&gt;
| 4136&lt;br /&gt;
| 1028&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
|-&lt;br /&gt;
| 4149&lt;br /&gt;
| 1035&lt;br /&gt;
| PROTAR&lt;br /&gt;
|-&lt;br /&gt;
| 4369&lt;br /&gt;
| 1111&lt;br /&gt;
| Frank Strauß Elektronik&lt;br /&gt;
| Also used by Kupke&lt;br /&gt;
|-&lt;br /&gt;
| 4626&lt;br /&gt;
| 1212&lt;br /&gt;
| Individual Computers&lt;br /&gt;
|-&lt;br /&gt;
| 4648&lt;br /&gt;
| 1228&lt;br /&gt;
| Flesch Hornemann Computer Elec.&lt;br /&gt;
|-&lt;br /&gt;
| 4680&lt;br /&gt;
| 1248&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 4711&lt;br /&gt;
| 1267&lt;br /&gt;
| RBM digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 4754&lt;br /&gt;
| 1292&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 5000&lt;br /&gt;
| 1388&lt;br /&gt;
| ITH&lt;br /&gt;
|-&lt;br /&gt;
| 5001&lt;br /&gt;
| 1389&lt;br /&gt;
| VMC&lt;br /&gt;
|-&lt;br /&gt;
| 5010&lt;br /&gt;
| 1392&lt;br /&gt;
| Ambience Creation Technology&lt;br /&gt;
|-&lt;br /&gt;
| 5011&lt;br /&gt;
| 1393&lt;br /&gt;
| Creative Development&lt;br /&gt;
|-&lt;br /&gt;
| 5012&lt;br /&gt;
| 1394&lt;br /&gt;
| Georg Braun&lt;br /&gt;
|-&lt;br /&gt;
| 5013&lt;br /&gt;
| 1395&lt;br /&gt;
| Swedish User Group of Amiga&lt;br /&gt;
|-&lt;br /&gt;
| 5014&lt;br /&gt;
| 1396&lt;br /&gt;
| Jakub Bednarski&lt;br /&gt;
|-&lt;br /&gt;
| 5015&lt;br /&gt;
| 1397&lt;br /&gt;
| KryoFlux, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5016&lt;br /&gt;
| 1398&lt;br /&gt;
| Igor Majstorovic&lt;br /&gt;
|-&lt;br /&gt;
| 5017&lt;br /&gt;
| 1399&lt;br /&gt;
| Alastair M. Robinson&lt;br /&gt;
|-&lt;br /&gt;
| 5018&lt;br /&gt;
| 139A&lt;br /&gt;
| Austex Software&lt;br /&gt;
|-&lt;br /&gt;
| 5019&lt;br /&gt;
| 139B&lt;br /&gt;
| Sören Gust&lt;br /&gt;
|-&lt;br /&gt;
| 5020&lt;br /&gt;
| 139C&lt;br /&gt;
| Rok Krajnc&lt;br /&gt;
|-&lt;br /&gt;
| 5030&lt;br /&gt;
| 13A6&lt;br /&gt;
| Tim Tashpulatov&lt;br /&gt;
|-&lt;br /&gt;
| 5040&lt;br /&gt;
| 13B0&lt;br /&gt;
| 7-bit&lt;br /&gt;
|-&lt;br /&gt;
| 5050&lt;br /&gt;
| 13BA&lt;br /&gt;
| Sakura IT&lt;br /&gt;
|-&lt;br /&gt;
| 5060&lt;br /&gt;
| 13C4&lt;br /&gt;
| FPGAArcade&lt;br /&gt;
|-&lt;br /&gt;
| 5070&lt;br /&gt;
| 13CE&lt;br /&gt;
| CancerSoft Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 5080&lt;br /&gt;
| 13D8&lt;br /&gt;
| Stephen Leary&lt;br /&gt;
|-&lt;br /&gt;
| 5090&lt;br /&gt;
| 13E2&lt;br /&gt;
| DMA Softlab LLC&lt;br /&gt;
|-&lt;br /&gt;
| 5100&lt;br /&gt;
| 13EC&lt;br /&gt;
| Brookhouse Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 5110&lt;br /&gt;
| 13F6&lt;br /&gt;
| Eduardo Arana&lt;br /&gt;
|-&lt;br /&gt;
| 5120&lt;br /&gt;
| 1400&lt;br /&gt;
| CS-LAB&lt;br /&gt;
|-&lt;br /&gt;
| 5130&lt;br /&gt;
| 140A&lt;br /&gt;
| Robert Miranda&lt;br /&gt;
|-&lt;br /&gt;
| 5140&lt;br /&gt;
| 1414&lt;br /&gt;
| RastPort&lt;br /&gt;
|-&lt;br /&gt;
| 5132&lt;br /&gt;
| 140C&lt;br /&gt;
| UAS Interface Ltd6&lt;br /&gt;
|-&lt;br /&gt;
| 5150&lt;br /&gt;
| 141E&lt;br /&gt;
| Amiga Kit&lt;br /&gt;
|-&lt;br /&gt;
| 5160&lt;br /&gt;
| 1428&lt;br /&gt;
| Central Texas Commodore User Group&lt;br /&gt;
|-&lt;br /&gt;
| 5170&lt;br /&gt;
| 1432&lt;br /&gt;
| Confusion Research Center&lt;br /&gt;
|-&lt;br /&gt;
| 5180&lt;br /&gt;
| 143C&lt;br /&gt;
| Solar Soyuz Zaibatsu&lt;br /&gt;
|-&lt;br /&gt;
| 5500&lt;br /&gt;
| 157C&lt;br /&gt;
| Inhouse Information&lt;br /&gt;
|-&lt;br /&gt;
| 5768&lt;br /&gt;
| 1688&lt;br /&gt;
| Bio Con&lt;br /&gt;
|-&lt;br /&gt;
| 6148&lt;br /&gt;
| 1804&lt;br /&gt;
| HK-Computer&lt;br /&gt;
|-&lt;br /&gt;
| 6502&lt;br /&gt;
| 1966&lt;br /&gt;
| Cloanto&lt;br /&gt;
|-&lt;br /&gt;
| 6520&lt;br /&gt;
| 1978&lt;br /&gt;
| Oliver Gantert&lt;br /&gt;
|-&lt;br /&gt;
| 7777&lt;br /&gt;
| 1E61&lt;br /&gt;
| Rafal Gabriel Chyla&lt;br /&gt;
|-&lt;br /&gt;
| 8215&lt;br /&gt;
| 2017&lt;br /&gt;
| Vortex&lt;br /&gt;
|-&lt;br /&gt;
| 8244&lt;br /&gt;
| 2034&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 8290&lt;br /&gt;
| 2062&lt;br /&gt;
| Expansion Systems&lt;br /&gt;
|-&lt;br /&gt;
| 8448&lt;br /&gt;
| 2100&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 8512&lt;br /&gt;
| 2140&lt;br /&gt;
| Phase 5 Digital Products&lt;br /&gt;
|-&lt;br /&gt;
| 8553&lt;br /&gt;
| 2169&lt;br /&gt;
| Digital Processing Systems Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 8704&lt;br /&gt;
| 2200&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 8738&lt;br /&gt;
| 2222&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 9512&lt;br /&gt;
| 2528&lt;br /&gt;
| Tower Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 10676&lt;br /&gt;
| 29B4&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 14195&lt;br /&gt;
| 3773&lt;br /&gt;
| Media-net-Point&lt;br /&gt;
|-&lt;br /&gt;
| 14501&lt;br /&gt;
| 38A5&lt;br /&gt;
| Petsoff, Finland&lt;br /&gt;
|-&lt;br /&gt;
| 16375&lt;br /&gt;
| 3FF7&lt;br /&gt;
| Uwe Gerlach&lt;br /&gt;
|-&lt;br /&gt;
| 16707&lt;br /&gt;
| 4143&lt;br /&gt;
| Ateo Concepts&lt;br /&gt;
|-&lt;br /&gt;
| 16708&lt;br /&gt;
| 4144&lt;br /&gt;
| ALiENDESiGN&lt;br /&gt;
|-&lt;br /&gt;
| 16945&lt;br /&gt;
| 4231&lt;br /&gt;
| A.C.T.&lt;br /&gt;
|-&lt;br /&gt;
| 17740&lt;br /&gt;
| 454C&lt;br /&gt;
| HK-Computer (ELSAT)&lt;br /&gt;
|-&lt;br /&gt;
| 18260&lt;br /&gt;
| 4754&lt;br /&gt;
| MacroSystems (Germany)&lt;br /&gt;
|-&lt;br /&gt;
| 19796&lt;br /&gt;
| 4D54&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 22359&lt;br /&gt;
| 5757&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 26464&lt;br /&gt;
| 6760&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 26470&lt;br /&gt;
| 6766&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 28014&lt;br /&gt;
| 6D6E&lt;br /&gt;
| MNT Media and Technology UG&lt;br /&gt;
|-&lt;br /&gt;
| 32768&lt;br /&gt;
| 8000&lt;br /&gt;
| M.A.S.T.&lt;br /&gt;
|-&lt;br /&gt;
| 42240&lt;br /&gt;
| A500&lt;br /&gt;
| Aethreum Digital&lt;br /&gt;
|-&lt;br /&gt;
| 43437&lt;br /&gt;
| A9AD&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 43521&lt;br /&gt;
| AA01&lt;br /&gt;
| Cameron&lt;br /&gt;
|-&lt;br /&gt;
| 43537&lt;br /&gt;
| AA11&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 44359&lt;br /&gt;
| AD47&lt;br /&gt;
| Matay&lt;br /&gt;
|-&lt;br /&gt;
| 46504&lt;br /&gt;
| B5A8&lt;br /&gt;
| Phoenix&lt;br /&gt;
|-&lt;br /&gt;
| 49160&lt;br /&gt;
| C008&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 61453&lt;br /&gt;
| F00D&lt;br /&gt;
| Forefront Technologies Inc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For any changes/additions to this registry please use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9852</id>
		<title>Amiga Hardware Manufacturer ID Registry</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9852"/>
		<updated>2018-09-29T21:46:15Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Registry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= How to Obtain a Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Manufacturer&#039;s numbers are assigned by the AmigaOS development team. To obtain your unique manufacturer number use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;br /&gt;
&lt;br /&gt;
Be sure and include your name, email and the type of expansion product you are developing.&lt;br /&gt;
&lt;br /&gt;
= Your Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Attention hardware manufacturers. If you are developing a hardware expansion product for the Classic Amiga (e.g. 500, 2000, 3000) then you will need to obtain a special manufacturer ID number from the AmigaOS development team to identify your product. This manufacturer number is used by the Amiga to link your hardware with its driver software at boot time.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number is part of the special protocol that the Amiga uses to automatically configure all expansion devices on the bus without the user having to cut jumpers or adjust dip switches. This is called auto-config.&lt;br /&gt;
&lt;br /&gt;
At start-up time, the system first polls each board in the system and assigns the board its own address space. If it is a memory board, its RAM is linked into the memory free pool. Later in the boot sequence, after DOS is initialized, the binddrivers program is run. Binddrivers will search the directory SYS:Expansion for the drivers that go with the boards.&lt;br /&gt;
&lt;br /&gt;
To do this binddrivers looks in the Tool Type field of all icon files in SYS:Expansion. If the first seven bytes of the Tool Type field are &amp;quot;PRODUCT&amp;quot;, then this is an icon file for a driver.&lt;br /&gt;
&lt;br /&gt;
Binddrivers will then attempt to match the drivers it has found with the boards that were found earlier. This is where your manufacturer number comes in.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number goes in two places. First, it is burned in hex form into the PAL which is part of ALL auto-config expansion products. Second, it appears in ASCII in the Tool Type field of the icon file for your product&#039;s driver. By matching these two numbers, the Amiga can automatically configure your board and bind it&#039;s software driver into the system as well.&lt;br /&gt;
&lt;br /&gt;
The manufacturer&#039;s number is a 16-bit ID which appears in PAL offsets $10-$17. There is also an 8-bit product number which you assign. The product number is for uniquely identifying different products from the same vendor. The product number will appear in PAL offsets $04-$07. This gives you a total of 24 bits to identify each of your products.&lt;br /&gt;
&lt;br /&gt;
These 24 bits of information in the PAL which identify your product are matched against the information in the Tool Type field of all icon files in the SYS:Expansion drawer. For example, suppose you are manufacturer #1019. You have two products, #1 and #2 which both use the same driver. The icon for your driver for these two products would have a Tool Type set to &amp;quot;PRODUCT=1019/1|1019/2&amp;quot;. This means: I am an icon for a driver that works with product number 1 or 2 from manufacturer 1019, now bind me. Spaces are not legal. Here are two other examples:&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1208/11&lt;br /&gt;
: is the Tool Type for a driver for product 11 from manufacturer number 1208.&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1017&lt;br /&gt;
: is the Tool Type for a driver for any product from manufacturer number 1017.&lt;br /&gt;
&lt;br /&gt;
For an informal explanation of the auto-configuration process, see the chapter on Software Expansion Architecture from the 2nd Annual Amiga Developer&#039;s Conference Notes (available on ADCD 2.1). For the details of timing, power, the PAL equations and PAL address specifications and the expansion library documentation, see sections 3.1 to 3.3 of the A500/A2000 Technical Reference Manual. The original auto-config spec appears in the A1000 Schematics and Expansion Specification.&lt;br /&gt;
&lt;br /&gt;
The auto-config process makes the addition of expansion products to the system very easy. All the user has to do is put the board in any slot and copy the driver from the release disk to his own SYS:Expansion drawer. Everything else is automatic. There are no jumpers or dip switches to set. Best of all, you will get a lot less support calls asking how to make your product work with the XYZ-Corp-battery-backed-clock.&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
Some notes on hardware manufacturer ID assignment.&lt;br /&gt;
&lt;br /&gt;
* Manufacturer ID numbers are assigned free of charge.&lt;br /&gt;
* Please provide the following information when requesting an ID:&lt;br /&gt;
*# Name of the company or person&lt;br /&gt;
*# Postal address/contact address&lt;br /&gt;
*# Name of the contact person, with a corresponding e-mail address&lt;br /&gt;
*# A brief description of the kind of products you want to produce&lt;br /&gt;
* All ID numbers smaller than 5000 must be considered unsafe because no information exists on which numbers exactly were taken during the time Commodore, Inc. disintegrated.&lt;br /&gt;
* ID numbers in the range 8192 to 18841 must be considered unsafe because some hardware developers mistook the numbers assigned to them to be given in hexadecimal format. Hence 0x2000 = 8192 and 0x4999 = 18841.&lt;br /&gt;
&lt;br /&gt;
= Example code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
/* Here is a short program which will tell you   */&lt;br /&gt;
/* about the expansion boards configured in your */&lt;br /&gt;
/* system without you opening up the machine.    */&lt;br /&gt;
/* Code by Bill Koester of CATS                  */&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
#include &amp;lt;libraries/configvars.h&amp;gt;&lt;br /&gt;
#include &amp;lt;libraries/expansion.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct ExpansionBase *ExpansionBase;&lt;br /&gt;
&lt;br /&gt;
void cleanup();&lt;br /&gt;
void printdev();&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   struct ConfigDev *MyConfigDev;&lt;br /&gt;
&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
   /* Open the expansion library,      */&lt;br /&gt;
   /* if there is a problem then exit  */&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   ExpansionBase =(struct ExpansionBase *) OpenLibrary(EXPANSIONNAME,0);&lt;br /&gt;
   if(ExpansionBase==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error opening expansion library!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
   /* Use FindConfigDev to get info on the first */&lt;br /&gt;
   /* expansion board on the list maintained by  */&lt;br /&gt;
   /* Exec.  If there are no expansion boards in */&lt;br /&gt;
   /* the system then exit.                      */&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = NULL;&lt;br /&gt;
&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
  /* FindConfigDev(oldConfigDev,manufacturer,product) */&lt;br /&gt;
  /* oldConfigDev = NULL for the top of the list      */&lt;br /&gt;
  /* manufacturer = -1 for any manufacturer           */&lt;br /&gt;
  /* product      = -1 for any product                */&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = FindConfigDev(NULL,-1,-1);&lt;br /&gt;
&lt;br /&gt;
   if(MyConfigDev==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;No Configured Devices found!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printdev(MyConfigDev);&lt;br /&gt;
&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
   /* OK, there is at least one board,  */&lt;br /&gt;
   /* so loop and get the entire list   */&lt;br /&gt;
   /* printing as we go with printdev() */&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   while(MyConfigDev = FindConfigDev(MyConfigDev,-1,-1))&lt;br /&gt;
   {&lt;br /&gt;
      printdev(MyConfigDev);&lt;br /&gt;
   }&lt;br /&gt;
   cleanup();&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
/* Close up shop...  */&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
void cleanup()&lt;br /&gt;
{&lt;br /&gt;
   if(ExpansionBase)&lt;br /&gt;
      CloseLibrary(ExpansionBase);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
/* Print out the contents of the    */&lt;br /&gt;
/* dev structure for this expansion */&lt;br /&gt;
/* product.                         */&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
void printdev(dev)&lt;br /&gt;
struct ConfigDev *dev;&lt;br /&gt;
{&lt;br /&gt;
   char buff[200];&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Flags          = &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags==NULL)&lt;br /&gt;
      printf(&amp;quot;NULL  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_SHUTUP)&lt;br /&gt;
      printf(&amp;quot;CDF_SHUTUP  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_CONFIGME)&lt;br /&gt;
      printf(&amp;quot;CDF_CONFIGME  &amp;quot;);&lt;br /&gt;
   printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot;Board Address  = %x\n&amp;quot;,dev-&amp;gt;cd_BoardAddr);&lt;br /&gt;
   printf(&amp;quot;Board Size     = %d bytes\n&amp;quot;,dev-&amp;gt;cd_BoardSize);&lt;br /&gt;
   printf(&amp;quot;Slot  Address  = %d\n&amp;quot;,dev-&amp;gt;cd_SlotAddr);&lt;br /&gt;
   printf(&amp;quot;Slot  Size     = %d\n&amp;quot;,dev-&amp;gt;cd_SlotSize);&lt;br /&gt;
   printf(&amp;quot;Driver code at   %x\n&amp;quot;,dev-&amp;gt;cd_Driver);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;er_Type         = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Type);&lt;br /&gt;
   printf(&amp;quot;er_Product      = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Product);&lt;br /&gt;
   printf(&amp;quot;er_Flags        = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Flags);&lt;br /&gt;
   printf(&amp;quot;er_Reserved03   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved03);&lt;br /&gt;
   printf(&amp;quot;er_Manufacturer = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Manufacturer);&lt;br /&gt;
   printf(&amp;quot;er_SerialNumber = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_SerialNumber);&lt;br /&gt;
   printf(&amp;quot;er_InitDiagVec  = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_InitDiagVec);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0c   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0c);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0d   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0d);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0e   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0e);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0f   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0f);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Hit Return to continue:\n&amp;quot;);&lt;br /&gt;
   gets(buff);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Registry =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (decimal)&lt;br /&gt;
! ID (hexadecimal)&lt;br /&gt;
! Manufacturer&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 211&lt;br /&gt;
| 00D3&lt;br /&gt;
| Pacific Peripherals/Profex&lt;br /&gt;
|-&lt;br /&gt;
| 221&lt;br /&gt;
| 00DD&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 256&lt;br /&gt;
| 0100&lt;br /&gt;
| Memphis&lt;br /&gt;
| Originally registered to MacroSystems US&lt;br /&gt;
|-&lt;br /&gt;
| 512&lt;br /&gt;
| 0200&lt;br /&gt;
| 3-State Computertechnik&lt;br /&gt;
|-&lt;br /&gt;
| 513&lt;br /&gt;
| 0201&lt;br /&gt;
| Commodore (Braunschweig)&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| 0202&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
|-&lt;br /&gt;
| 515&lt;br /&gt;
| 0203&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
| Originally registered to Combitech/Macrosystem&lt;br /&gt;
|-&lt;br /&gt;
| 756&lt;br /&gt;
| 02F4&lt;br /&gt;
| Progressive Peripherals &amp;amp; Software&lt;br /&gt;
|-&lt;br /&gt;
| 767&lt;br /&gt;
| 02FF&lt;br /&gt;
| Kolff Computer Supplies&lt;br /&gt;
|-&lt;br /&gt;
| 1001&lt;br /&gt;
| 03E9&lt;br /&gt;
| Tecmar&lt;br /&gt;
|-&lt;br /&gt;
| 1002&lt;br /&gt;
| 03EA&lt;br /&gt;
| Telesys&lt;br /&gt;
|-&lt;br /&gt;
| 1003&lt;br /&gt;
| 03EB&lt;br /&gt;
| The Micro-Forge&lt;br /&gt;
|-&lt;br /&gt;
| 1004&lt;br /&gt;
| 03EC&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
| Originally registered to Card Co. (Supra)&lt;br /&gt;
|-&lt;br /&gt;
| 1005&lt;br /&gt;
| 03ED&lt;br /&gt;
| A-Squared&lt;br /&gt;
|-&lt;br /&gt;
| 1006&lt;br /&gt;
| 03EE&lt;br /&gt;
| Comspec Communications&lt;br /&gt;
|-&lt;br /&gt;
| 1007&lt;br /&gt;
| 03EF&lt;br /&gt;
| HT Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1008&lt;br /&gt;
| 03F0&lt;br /&gt;
| RDS Software&lt;br /&gt;
|-&lt;br /&gt;
| 1009&lt;br /&gt;
| 03F1&lt;br /&gt;
| Anakin Research&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| 03F2&lt;br /&gt;
| MicroBotics&lt;br /&gt;
|-&lt;br /&gt;
| 1011&lt;br /&gt;
| 03F3&lt;br /&gt;
| Bob Krauth&lt;br /&gt;
|-&lt;br /&gt;
| 1012&lt;br /&gt;
| 03F4&lt;br /&gt;
| Access Associates (Alegra)&lt;br /&gt;
|-&lt;br /&gt;
| 1013&lt;br /&gt;
| 03F5&lt;br /&gt;
| Mini Comp Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 1014&lt;br /&gt;
| 03F6&lt;br /&gt;
| Cypress Technology&lt;br /&gt;
|-&lt;br /&gt;
| 1015&lt;br /&gt;
| 03F7&lt;br /&gt;
| Fuller Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1016&lt;br /&gt;
| 03F8&lt;br /&gt;
| Galaxy Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1017&lt;br /&gt;
| 03F9&lt;br /&gt;
| ADA Research&lt;br /&gt;
|-&lt;br /&gt;
| 1018&lt;br /&gt;
| 03FA&lt;br /&gt;
| Computer Service Italia&lt;br /&gt;
|-&lt;br /&gt;
| 1019&lt;br /&gt;
| 03FB&lt;br /&gt;
| Amigo&lt;br /&gt;
|-&lt;br /&gt;
| 1020&lt;br /&gt;
| 03FC&lt;br /&gt;
| Micro-Solutions Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1021&lt;br /&gt;
| 03FD&lt;br /&gt;
| Stacar International&lt;br /&gt;
|-&lt;br /&gt;
| 1022&lt;br /&gt;
| 03FE&lt;br /&gt;
| Video Precisions&lt;br /&gt;
|-&lt;br /&gt;
| 1023&lt;br /&gt;
| 03FF&lt;br /&gt;
| ASDG, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1025&lt;br /&gt;
| 0401&lt;br /&gt;
| Ing. Buero Kalawsky&lt;br /&gt;
|-&lt;br /&gt;
| 1026&lt;br /&gt;
| 0402&lt;br /&gt;
| Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 1027&lt;br /&gt;
| 0403&lt;br /&gt;
| Interplan Unternehmensberatung&lt;br /&gt;
|-&lt;br /&gt;
| 1028&lt;br /&gt;
| 0404&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
| Originally registered to Peter Ohlich&lt;br /&gt;
|-&lt;br /&gt;
| 1030&lt;br /&gt;
| 0406&lt;br /&gt;
| Commodore (Lowell University)&lt;br /&gt;
| Originally registered to Productivity Center&lt;br /&gt;
|-&lt;br /&gt;
| 1041&lt;br /&gt;
| 0411&lt;br /&gt;
| Design Labs&lt;br /&gt;
|-&lt;br /&gt;
| 1042&lt;br /&gt;
| 0412&lt;br /&gt;
| MCS&lt;br /&gt;
|-&lt;br /&gt;
| 1043&lt;br /&gt;
| 0413&lt;br /&gt;
| B. J. Freeman&lt;br /&gt;
|-&lt;br /&gt;
| 1044&lt;br /&gt;
| 0414&lt;br /&gt;
| Side Effects Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1045&lt;br /&gt;
| 0415&lt;br /&gt;
| Oklahoma Personal Comp.&lt;br /&gt;
|-&lt;br /&gt;
| 1046&lt;br /&gt;
| 0416&lt;br /&gt;
| Advanced Micro Innovations&lt;br /&gt;
|-&lt;br /&gt;
| 1047&lt;br /&gt;
| 0417&lt;br /&gt;
| Industrial Support Services&lt;br /&gt;
|-&lt;br /&gt;
| 1048&lt;br /&gt;
| 0418&lt;br /&gt;
| Technisoft&lt;br /&gt;
|-&lt;br /&gt;
| 1049&lt;br /&gt;
| 0419&lt;br /&gt;
| Prolific, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1050&lt;br /&gt;
| 041A&lt;br /&gt;
| Softeam, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1051&lt;br /&gt;
| 041B&lt;br /&gt;
| GRC Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1052&lt;br /&gt;
| 041C&lt;br /&gt;
| David Lai&lt;br /&gt;
|-&lt;br /&gt;
| 1053&lt;br /&gt;
| 041D&lt;br /&gt;
| Ameristar Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 1054&lt;br /&gt;
| 041E&lt;br /&gt;
| Cline Refrigeration&lt;br /&gt;
|-&lt;br /&gt;
| 1055&lt;br /&gt;
| 041F&lt;br /&gt;
| Cardiac Pacemakers, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1056&lt;br /&gt;
| 0420&lt;br /&gt;
| Supra Corp. (Creative Microsystems)&lt;br /&gt;
|-&lt;br /&gt;
| 1057&lt;br /&gt;
| 0421&lt;br /&gt;
| Wayne Diener&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| 0422&lt;br /&gt;
| Computer Systems Associates (CSA)&lt;br /&gt;
|-&lt;br /&gt;
| 1059&lt;br /&gt;
| 0423&lt;br /&gt;
| Trionix, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1060&lt;br /&gt;
| 0424&lt;br /&gt;
| David Lucas&lt;br /&gt;
|-&lt;br /&gt;
| 1061&lt;br /&gt;
| 0425&lt;br /&gt;
| Analog Precision&lt;br /&gt;
| Also assigned to D &amp;amp; L Distributing&lt;br /&gt;
|-&lt;br /&gt;
| 1267&lt;br /&gt;
| 04F3&lt;br /&gt;
| RBM Digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 1282&lt;br /&gt;
| 0502&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
|-&lt;br /&gt;
| 1337&lt;br /&gt;
| 0539&lt;br /&gt;
| Thomas Stenzel (DaFR34K)&lt;br /&gt;
|-&lt;br /&gt;
| 1576&lt;br /&gt;
| 0628&lt;br /&gt;
| Boris Križma&lt;br /&gt;
|-&lt;br /&gt;
| 1761&lt;br /&gt;
| 06E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 1803&lt;br /&gt;
| 070B&lt;br /&gt;
| UAE Amiga Emulator&lt;br /&gt;
|-&lt;br /&gt;
| 2002&lt;br /&gt;
| 07D2&lt;br /&gt;
| Mimetics Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2003&lt;br /&gt;
| 07D3&lt;br /&gt;
| ACDA&lt;br /&gt;
|-&lt;br /&gt;
| 2004&lt;br /&gt;
| 07D4&lt;br /&gt;
| Finn R. Jacobsen&lt;br /&gt;
|-&lt;br /&gt;
| 2005&lt;br /&gt;
| 07D5&lt;br /&gt;
| Elthen Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2006&lt;br /&gt;
| 07D6&lt;br /&gt;
| Nine Tiles Computer Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2007&lt;br /&gt;
| 07D7&lt;br /&gt;
| Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2008&lt;br /&gt;
| 07D8&lt;br /&gt;
| Bell &amp;amp;amp; Howell&lt;br /&gt;
|-&lt;br /&gt;
| 2009&lt;br /&gt;
| 07D9&lt;br /&gt;
| Roland Kochler&lt;br /&gt;
|-&lt;br /&gt;
| 2010&lt;br /&gt;
| 07DA&lt;br /&gt;
| Byte Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2011&lt;br /&gt;
| 07DB&lt;br /&gt;
| Reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2012&lt;br /&gt;
| 07DC&lt;br /&gt;
| DKB, Inc.&lt;br /&gt;
| Previously named Michigan Software&lt;br /&gt;
|-&lt;br /&gt;
| 2013&lt;br /&gt;
| 07DD&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2014&lt;br /&gt;
| 07DE&lt;br /&gt;
| Sysaphus Software&lt;br /&gt;
|-&lt;br /&gt;
| 2015&lt;br /&gt;
| 07DF&lt;br /&gt;
| Digitronics&lt;br /&gt;
|-&lt;br /&gt;
| 2016&lt;br /&gt;
| 07E0&lt;br /&gt;
| Akron Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2017&lt;br /&gt;
| 07E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 2018&lt;br /&gt;
| 07E2&lt;br /&gt;
| Calmos&lt;br /&gt;
|-&lt;br /&gt;
| 2019&lt;br /&gt;
| 07E3&lt;br /&gt;
| Dover Research&lt;br /&gt;
|-&lt;br /&gt;
| 2020&lt;br /&gt;
| 07E4&lt;br /&gt;
| David Krehbiel&lt;br /&gt;
|-&lt;br /&gt;
| 2021&lt;br /&gt;
| 07E5&lt;br /&gt;
| Synergy Peripheral Systems&lt;br /&gt;
| Also known as California Access&lt;br /&gt;
|-&lt;br /&gt;
| 2022&lt;br /&gt;
| 07E6&lt;br /&gt;
| Xetec&lt;br /&gt;
|-&lt;br /&gt;
| 2023&lt;br /&gt;
| 07E7&lt;br /&gt;
| Micron Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2024&lt;br /&gt;
| 07E8&lt;br /&gt;
| CH Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2025&lt;br /&gt;
| 07E9&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2026&lt;br /&gt;
| 07EA&lt;br /&gt;
| Progressive Peripherals &amp;amp;amp; Software&lt;br /&gt;
| Also used by Ateo&lt;br /&gt;
|-&lt;br /&gt;
| 2027&lt;br /&gt;
| 07EB&lt;br /&gt;
| Wicat Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2028&lt;br /&gt;
| 07EC&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2029&lt;br /&gt;
| 07ED&lt;br /&gt;
| Delaware Valley Software&lt;br /&gt;
|-&lt;br /&gt;
| 2030&lt;br /&gt;
| 07EE&lt;br /&gt;
| Palomax&lt;br /&gt;
|-&lt;br /&gt;
| 2031&lt;br /&gt;
| 07EF&lt;br /&gt;
| Incognito Software&lt;br /&gt;
|-&lt;br /&gt;
| 2032&lt;br /&gt;
| 07F0&lt;br /&gt;
| Jadesign&lt;br /&gt;
|-&lt;br /&gt;
| 2033&lt;br /&gt;
| 07F1&lt;br /&gt;
| BVR&lt;br /&gt;
|-&lt;br /&gt;
| 2034&lt;br /&gt;
| 07F2&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2035&lt;br /&gt;
| 07F3&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2036&lt;br /&gt;
| 07F4&lt;br /&gt;
| Atronic&lt;br /&gt;
|-&lt;br /&gt;
| 2037&lt;br /&gt;
| 07F5&lt;br /&gt;
| Scott Karlin&lt;br /&gt;
|-&lt;br /&gt;
| 2038&lt;br /&gt;
| 07F6&lt;br /&gt;
| Howitch&lt;br /&gt;
|-&lt;br /&gt;
| 2039&lt;br /&gt;
| 07F7&lt;br /&gt;
| Sullivan Brothers Visual Engineers&lt;br /&gt;
|-&lt;br /&gt;
| 2040&lt;br /&gt;
| 07F8&lt;br /&gt;
| G I T&lt;br /&gt;
|-&lt;br /&gt;
| 2041&lt;br /&gt;
| 07F9&lt;br /&gt;
| Amigo Business Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2042&lt;br /&gt;
| 07FA&lt;br /&gt;
| Micro E Ab&lt;br /&gt;
|-&lt;br /&gt;
| 2043&lt;br /&gt;
| 07FB&lt;br /&gt;
| Ralph Kruse&lt;br /&gt;
|-&lt;br /&gt;
| 2044&lt;br /&gt;
| 07FC&lt;br /&gt;
| Clearpoint Research&lt;br /&gt;
|-&lt;br /&gt;
| 2045&lt;br /&gt;
| 07FD&lt;br /&gt;
| Kodiak&lt;br /&gt;
|-&lt;br /&gt;
| 2046&lt;br /&gt;
| 07FE&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Phoenix Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2047&lt;br /&gt;
| 07FF&lt;br /&gt;
| No Name Shown&lt;br /&gt;
|-&lt;br /&gt;
| 2048&lt;br /&gt;
| 0800&lt;br /&gt;
| Commodore Braunschweig&lt;br /&gt;
|-&lt;br /&gt;
| 2049&lt;br /&gt;
| 0801&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Elaborate Bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2050&lt;br /&gt;
| 0802&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2051&lt;br /&gt;
| 0803&lt;br /&gt;
| Spartanics&lt;br /&gt;
|-&lt;br /&gt;
| 2052&lt;br /&gt;
| 0804&lt;br /&gt;
| Jochheim Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 2053&lt;br /&gt;
| 0805&lt;br /&gt;
| Trans Data Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2054&lt;br /&gt;
| 0806&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2055&lt;br /&gt;
| 0807&lt;br /&gt;
| Checkpoint Technologies&lt;br /&gt;
| Originally registered to Amiga Solutions&lt;br /&gt;
|-&lt;br /&gt;
| 2056&lt;br /&gt;
| 0808&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2057&lt;br /&gt;
| 0809&lt;br /&gt;
| Advanced Computer Design&lt;br /&gt;
|-&lt;br /&gt;
| 2058&lt;br /&gt;
| 080A&lt;br /&gt;
| Sir Netics&lt;br /&gt;
|-&lt;br /&gt;
| 2059&lt;br /&gt;
| 080B&lt;br /&gt;
| Expert Services&lt;br /&gt;
|-&lt;br /&gt;
| 2060&lt;br /&gt;
| 080C&lt;br /&gt;
| Digital Art Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2061&lt;br /&gt;
| 080D&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2062&lt;br /&gt;
| 080E&lt;br /&gt;
| Expansion Technologies (Expansion Systems)&lt;br /&gt;
|-&lt;br /&gt;
| 2063&lt;br /&gt;
| 080F&lt;br /&gt;
| Alphatech&lt;br /&gt;
|-&lt;br /&gt;
| 2064&lt;br /&gt;
| 0810&lt;br /&gt;
| Edotronik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2065&lt;br /&gt;
| 0811&lt;br /&gt;
| California Access/Synergy&lt;br /&gt;
| Originally registered to Logical Design Works&lt;br /&gt;
|-&lt;br /&gt;
| 2066&lt;br /&gt;
| 0812&lt;br /&gt;
| Bowden, Williams, Full &amp;amp; Assoc.&lt;br /&gt;
|-&lt;br /&gt;
| 2067&lt;br /&gt;
| 0813&lt;br /&gt;
| NES, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2068&lt;br /&gt;
| 0814&lt;br /&gt;
| Amdev&lt;br /&gt;
|-&lt;br /&gt;
| 2069&lt;br /&gt;
| 0815&lt;br /&gt;
| Big Brother Security Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2070&lt;br /&gt;
| 0816&lt;br /&gt;
| Active Circuits Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2071&lt;br /&gt;
| 0817&lt;br /&gt;
| ICD, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2072&lt;br /&gt;
| 0818&lt;br /&gt;
| Multi-Meg Electronique&lt;br /&gt;
|-&lt;br /&gt;
| 2073&lt;br /&gt;
| 0819&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2074&lt;br /&gt;
| 081A&lt;br /&gt;
| The Checkered Ball&lt;br /&gt;
|-&lt;br /&gt;
| 2075&lt;br /&gt;
| 081B&lt;br /&gt;
| Hi Tension Computer Services Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2076&lt;br /&gt;
| 081C&lt;br /&gt;
| Alfa Data&lt;br /&gt;
| Originally assigned to Elmtech Research, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2077&lt;br /&gt;
| 081D&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Clartscreen, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2078&lt;br /&gt;
| 081E&lt;br /&gt;
| Interworks&lt;br /&gt;
|-&lt;br /&gt;
| 2079&lt;br /&gt;
| 081F&lt;br /&gt;
| Galysh Enterprises&lt;br /&gt;
|-&lt;br /&gt;
| 2080&lt;br /&gt;
| 0820&lt;br /&gt;
| Hardital Synthesis&lt;br /&gt;
| Originally registered to Realtime Games Software Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2081&lt;br /&gt;
| 0821&lt;br /&gt;
| GBS&lt;br /&gt;
|-&lt;br /&gt;
| 2082&lt;br /&gt;
| 0822&lt;br /&gt;
| Circum Design Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2083&lt;br /&gt;
| 0823&lt;br /&gt;
| Alberta Micro Electronic Center&lt;br /&gt;
|-&lt;br /&gt;
| 2084&lt;br /&gt;
| 0824&lt;br /&gt;
| Bestech&lt;br /&gt;
|-&lt;br /&gt;
| 2085&lt;br /&gt;
| 0825&lt;br /&gt;
| Lasar Fantasy&lt;br /&gt;
|-&lt;br /&gt;
| 2086&lt;br /&gt;
| 0826&lt;br /&gt;
| Pulsar&lt;br /&gt;
|-&lt;br /&gt;
| 2087&lt;br /&gt;
| 0827&lt;br /&gt;
| Ivis&lt;br /&gt;
|-&lt;br /&gt;
| 2088&lt;br /&gt;
| 0828&lt;br /&gt;
| Applied Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2089&lt;br /&gt;
| 0829&lt;br /&gt;
| Solid-State Design &amp;amp;amp; Development&lt;br /&gt;
|-&lt;br /&gt;
| 2090&lt;br /&gt;
| 082A&lt;br /&gt;
| Vison Quest&lt;br /&gt;
|-&lt;br /&gt;
| 2091&lt;br /&gt;
| 082B&lt;br /&gt;
| Seaview Software&lt;br /&gt;
|-&lt;br /&gt;
| 2092&lt;br /&gt;
| 082C&lt;br /&gt;
| BSC&lt;br /&gt;
| Mistakenly used by ADS (Advanced Development Software)&lt;br /&gt;
|-&lt;br /&gt;
| 2093&lt;br /&gt;
| 082D&lt;br /&gt;
| Bernd Culenfeld&lt;br /&gt;
|-&lt;br /&gt;
| 2094&lt;br /&gt;
| 082E&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2095&lt;br /&gt;
| 082F&lt;br /&gt;
| CEGITES&lt;br /&gt;
|-&lt;br /&gt;
| 2096&lt;br /&gt;
| 0830&lt;br /&gt;
| Quadlite Computers Ltd.&lt;br /&gt;
| Originally registered to EV Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2097&lt;br /&gt;
| 0831&lt;br /&gt;
| Silicon Peace&lt;br /&gt;
|-&lt;br /&gt;
| 2098&lt;br /&gt;
| 0832&lt;br /&gt;
| Black Belt Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2099&lt;br /&gt;
| 0833&lt;br /&gt;
| Village Tronic&lt;br /&gt;
| Originally registerd to Steve Yaeger&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 0834&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 2101&lt;br /&gt;
| 0835&lt;br /&gt;
| Phoenix Micro Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 2102&lt;br /&gt;
| 0836&lt;br /&gt;
| Advanced Systems &amp;amp; Software&lt;br /&gt;
| Orignally assigned to Preferred Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2103&lt;br /&gt;
| 0837&lt;br /&gt;
| Rombo Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2104&lt;br /&gt;
| 0838&lt;br /&gt;
| Impulse Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2105&lt;br /&gt;
| 0839&lt;br /&gt;
| Beta Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2106&lt;br /&gt;
| 083A&lt;br /&gt;
| Memory Expansion System, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2107&lt;br /&gt;
| 083B&lt;br /&gt;
| Vortex Computer Systems GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2108&lt;br /&gt;
| 083C&lt;br /&gt;
| Platypus Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2109&lt;br /&gt;
| 083D&lt;br /&gt;
| Gigatron OHG&lt;br /&gt;
|-&lt;br /&gt;
| 2110&lt;br /&gt;
| 083E&lt;br /&gt;
| PG Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2111&lt;br /&gt;
| 083F&lt;br /&gt;
| New Technologies Group&lt;br /&gt;
|-&lt;br /&gt;
| 2112&lt;br /&gt;
| 0840&lt;br /&gt;
| Interactive Video Systems (IVS)&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2113&lt;br /&gt;
| 0841&lt;br /&gt;
| Vector&lt;br /&gt;
| Originally registered to H. K. Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2114&lt;br /&gt;
| 0842&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to C. H. Helfrich Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 2115&lt;br /&gt;
| 0843&lt;br /&gt;
| Xanadu&lt;br /&gt;
|-&lt;br /&gt;
| 2116&lt;br /&gt;
| 0844&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to AMS&lt;br /&gt;
|-&lt;br /&gt;
| 2117&lt;br /&gt;
| 0845&lt;br /&gt;
| X-Pert&lt;br /&gt;
|-&lt;br /&gt;
| 2118&lt;br /&gt;
| 0846&lt;br /&gt;
| The Amiga Centre&lt;br /&gt;
|-&lt;br /&gt;
| 2119&lt;br /&gt;
| 0847&lt;br /&gt;
| Digital Pacific&lt;br /&gt;
|-&lt;br /&gt;
| 2120&lt;br /&gt;
| 0848&lt;br /&gt;
| Solid State Leisure&lt;br /&gt;
|-&lt;br /&gt;
| 2121&lt;br /&gt;
| 0849&lt;br /&gt;
| Hydra Systems&lt;br /&gt;
| Originally registered to Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2122&lt;br /&gt;
| 084A&lt;br /&gt;
| Cumana&lt;br /&gt;
|-&lt;br /&gt;
| 2123&lt;br /&gt;
| 084B&lt;br /&gt;
| KAPS 2C Conception&lt;br /&gt;
|-&lt;br /&gt;
| 2124&lt;br /&gt;
| 084C&lt;br /&gt;
| Mike Mason&lt;br /&gt;
|-&lt;br /&gt;
| 2125&lt;br /&gt;
| 084D&lt;br /&gt;
| For Your Eyes&lt;br /&gt;
|-&lt;br /&gt;
| 2126&lt;br /&gt;
| 084E&lt;br /&gt;
| Volkmar Breitfeld Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2127&lt;br /&gt;
| 084F&lt;br /&gt;
| Sunrize Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2128&lt;br /&gt;
| 0850&lt;br /&gt;
| Scott Advanced Micro Designs&lt;br /&gt;
|-&lt;br /&gt;
| 2129&lt;br /&gt;
| 0851&lt;br /&gt;
| Digital Micronics&lt;br /&gt;
|-&lt;br /&gt;
| 2130&lt;br /&gt;
| 0852&lt;br /&gt;
| Alfa-Laval&lt;br /&gt;
|-&lt;br /&gt;
| 2131&lt;br /&gt;
| 0853&lt;br /&gt;
| Multigros A/S&lt;br /&gt;
|-&lt;br /&gt;
| 2132&lt;br /&gt;
| 0854&lt;br /&gt;
| Archos&lt;br /&gt;
|-&lt;br /&gt;
| 2133&lt;br /&gt;
| 0855&lt;br /&gt;
| Icom Simulations&lt;br /&gt;
|-&lt;br /&gt;
| 2134&lt;br /&gt;
| 0856&lt;br /&gt;
| Commodore Test Engineering Group&lt;br /&gt;
|-&lt;br /&gt;
| 2135&lt;br /&gt;
| 0857&lt;br /&gt;
| Microcreations&lt;br /&gt;
|-&lt;br /&gt;
| 2136&lt;br /&gt;
| 0858&lt;br /&gt;
| Shoestring Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2137&lt;br /&gt;
| 0859&lt;br /&gt;
| Faberushi&lt;br /&gt;
|-&lt;br /&gt;
| 2138&lt;br /&gt;
| 085A&lt;br /&gt;
| Evesham Micro Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2139&lt;br /&gt;
| 085B&lt;br /&gt;
| Panagolin Laser Software&lt;br /&gt;
|-&lt;br /&gt;
| 2140&lt;br /&gt;
| 085C&lt;br /&gt;
| Thomas Rudloff&lt;br /&gt;
|-&lt;br /&gt;
| 2141&lt;br /&gt;
| 085D&lt;br /&gt;
| Daniel Hohabir&lt;br /&gt;
|-&lt;br /&gt;
| 2142&lt;br /&gt;
| 085E&lt;br /&gt;
| GfxBase, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2143&lt;br /&gt;
| 085F&lt;br /&gt;
| Axellabs&lt;br /&gt;
|-&lt;br /&gt;
| 2144&lt;br /&gt;
| 0860&lt;br /&gt;
| Roctec Electronics Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2145&lt;br /&gt;
| 0861&lt;br /&gt;
| Omega Datentechnik&lt;br /&gt;
|-&lt;br /&gt;
| 2146&lt;br /&gt;
| 0862&lt;br /&gt;
| Atlantis&lt;br /&gt;
|-&lt;br /&gt;
| 2147&lt;br /&gt;
| 0863&lt;br /&gt;
| Skytec Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2148&lt;br /&gt;
| 0864&lt;br /&gt;
| Protar Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2149&lt;br /&gt;
| 0865&lt;br /&gt;
| ACS&lt;br /&gt;
|-&lt;br /&gt;
| 2150&lt;br /&gt;
| 0866&lt;br /&gt;
| Software Results Enterprises&lt;br /&gt;
| Originally registered to University of Illinois&lt;br /&gt;
|-&lt;br /&gt;
| 2151&lt;br /&gt;
| 0867&lt;br /&gt;
| Infinity Systems Design Group&lt;br /&gt;
|-&lt;br /&gt;
| 2152&lt;br /&gt;
| 0868&lt;br /&gt;
| Trade It&lt;br /&gt;
|-&lt;br /&gt;
| 2153&lt;br /&gt;
| 0869&lt;br /&gt;
| Suntec, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2154&lt;br /&gt;
| 086A&lt;br /&gt;
| DJW Micro Systems&lt;br /&gt;
| Originally registered to Tritec Marketing&lt;br /&gt;
|-&lt;br /&gt;
| 2155&lt;br /&gt;
| 086B&lt;br /&gt;
| Power Computing Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2156&lt;br /&gt;
| 086C&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 2157&lt;br /&gt;
| 086D&lt;br /&gt;
| Masoboshi GmbH (DCE)&lt;br /&gt;
|-&lt;br /&gt;
| 2158&lt;br /&gt;
| 086E&lt;br /&gt;
| HAL Software Hardware Handel&lt;br /&gt;
|-&lt;br /&gt;
| 2159&lt;br /&gt;
| 086F&lt;br /&gt;
| Mainhattan Data&lt;br /&gt;
| Originally registered to Michael Lamm Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2160&lt;br /&gt;
| 0870&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
| Originally registered to bbdp Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2161&lt;br /&gt;
| 0871&lt;br /&gt;
| Blue Ribbon Soundworks&lt;br /&gt;
| Originally registered to Design Computer Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2162&lt;br /&gt;
| 0872&lt;br /&gt;
| XPert&lt;br /&gt;
| Originally registered to The Station&lt;br /&gt;
|-&lt;br /&gt;
| 2163&lt;br /&gt;
| 0873&lt;br /&gt;
| DelaComp&lt;br /&gt;
| Originally registered to Bryan Williams&lt;br /&gt;
|-&lt;br /&gt;
| 2164&lt;br /&gt;
| 0874&lt;br /&gt;
| Superformance Computer Engineering GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2165&lt;br /&gt;
| 0875&lt;br /&gt;
| Overland Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2166&lt;br /&gt;
| 0876&lt;br /&gt;
| Thomas Hamren&lt;br /&gt;
|-&lt;br /&gt;
| 2167&lt;br /&gt;
| 0877&lt;br /&gt;
| Village Tronic&lt;br /&gt;
|-&lt;br /&gt;
| 2168&lt;br /&gt;
| 0878&lt;br /&gt;
| Toolbox Design&lt;br /&gt;
|-&lt;br /&gt;
| 2169&lt;br /&gt;
| 0879&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
|-&lt;br /&gt;
| 2170&lt;br /&gt;
| 087A&lt;br /&gt;
| Superformance&lt;br /&gt;
|-&lt;br /&gt;
| 2171&lt;br /&gt;
| 087B&lt;br /&gt;
| Utilities Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2172&lt;br /&gt;
| 087C&lt;br /&gt;
| phase 5&lt;br /&gt;
|-&lt;br /&gt;
| 2173&lt;br /&gt;
| 087D&lt;br /&gt;
| Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2174&lt;br /&gt;
| 087E&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 2175&lt;br /&gt;
| 087F&lt;br /&gt;
| James Cook University of North Queensland&lt;br /&gt;
|-&lt;br /&gt;
| 2176&lt;br /&gt;
| 0880&lt;br /&gt;
| AmiTrix Development&lt;br /&gt;
|-&lt;br /&gt;
| 2177&lt;br /&gt;
| 0881&lt;br /&gt;
| Ferranti&lt;br /&gt;
|-&lt;br /&gt;
| 2178&lt;br /&gt;
| 0882&lt;br /&gt;
| Leviathan Development&lt;br /&gt;
|-&lt;br /&gt;
| 2179&lt;br /&gt;
| 0883&lt;br /&gt;
| United Video Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2180&lt;br /&gt;
| 0884&lt;br /&gt;
| GPSoft Pty. Ltd.&lt;br /&gt;
| Originally registered to Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2181&lt;br /&gt;
| 0885&lt;br /&gt;
| ArMAX&lt;br /&gt;
| Oliver Bausch&lt;br /&gt;
|-&lt;br /&gt;
| 2182&lt;br /&gt;
| 0886&lt;br /&gt;
| CP Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2183&lt;br /&gt;
| 0887&lt;br /&gt;
| AMOK - Amiga Module &amp;amp;amp; Oberon Klub&lt;br /&gt;
|-&lt;br /&gt;
| 2184&lt;br /&gt;
| 0888&lt;br /&gt;
| ITEK Neser &amp;amp;amp; Sieber GbR&lt;br /&gt;
|-&lt;br /&gt;
| 2185&lt;br /&gt;
| 0889&lt;br /&gt;
| Phillip C. Lello&lt;br /&gt;
|-&lt;br /&gt;
| 2186&lt;br /&gt;
| 088A&lt;br /&gt;
| Cyborg Design Services&lt;br /&gt;
|-&lt;br /&gt;
| 2187&lt;br /&gt;
| 088B&lt;br /&gt;
| G2 Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2188&lt;br /&gt;
| 088C&lt;br /&gt;
| Pro System Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2189&lt;br /&gt;
| 088D&lt;br /&gt;
| ZEUS Electronic&lt;br /&gt;
| Originally registered to MSPI (Markt &amp;amp;amp; Technik)&lt;br /&gt;
|-&lt;br /&gt;
| 2190&lt;br /&gt;
| 088E&lt;br /&gt;
| Altatech&lt;br /&gt;
|-&lt;br /&gt;
| 2191&lt;br /&gt;
| 088F&lt;br /&gt;
| NewTek&lt;br /&gt;
|-&lt;br /&gt;
| 2192&lt;br /&gt;
| 0890&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
| Originally registered to Hardware Design Udo Neuroth&lt;br /&gt;
|-&lt;br /&gt;
| 2193&lt;br /&gt;
| 0891&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Viona Development&lt;br /&gt;
|-&lt;br /&gt;
| 2194&lt;br /&gt;
| 0892&lt;br /&gt;
| Amitek&lt;br /&gt;
| Originally assigned to Marpet Developments&lt;br /&gt;
|-&lt;br /&gt;
| 2195&lt;br /&gt;
| 0893&lt;br /&gt;
| Ingenieurbuero Helfrich&lt;br /&gt;
|-&lt;br /&gt;
| 2196&lt;br /&gt;
| 0894&lt;br /&gt;
| The Neo Group&lt;br /&gt;
|-&lt;br /&gt;
| 2197&lt;br /&gt;
| 0895&lt;br /&gt;
| Cyon&lt;br /&gt;
|-&lt;br /&gt;
| 2198&lt;br /&gt;
| 0896&lt;br /&gt;
| Bob Research Group&lt;br /&gt;
|-&lt;br /&gt;
| 2199&lt;br /&gt;
| 0897&lt;br /&gt;
| Richmond Sound Design Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2200&lt;br /&gt;
| 0898&lt;br /&gt;
| US Cybernetics&lt;br /&gt;
|-&lt;br /&gt;
| 2201&lt;br /&gt;
| 0899&lt;br /&gt;
| Fulvio Ieva&lt;br /&gt;
|-&lt;br /&gt;
| 2202&lt;br /&gt;
| 089A&lt;br /&gt;
| Silicon Studio&lt;br /&gt;
|-&lt;br /&gt;
| 2203&lt;br /&gt;
| 089B&lt;br /&gt;
| MacroSystems (USA)&lt;br /&gt;
| Was named Micro System Devices&lt;br /&gt;
|-&lt;br /&gt;
| 2204&lt;br /&gt;
| 089C&lt;br /&gt;
| Conspector Entertainment&lt;br /&gt;
|-&lt;br /&gt;
| 2205&lt;br /&gt;
| 089D&lt;br /&gt;
| Laserforum&lt;br /&gt;
|-&lt;br /&gt;
| 2206&lt;br /&gt;
| 089E&lt;br /&gt;
| Elbox Computer&lt;br /&gt;
| Mistakenly used by Index Information Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2207&lt;br /&gt;
| 089F&lt;br /&gt;
| Applied Magic Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2208&lt;br /&gt;
| 08A0&lt;br /&gt;
| SDL Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2560&lt;br /&gt;
| 0A00&lt;br /&gt;
| Harms&lt;br /&gt;
|-&lt;br /&gt;
| 2588&lt;br /&gt;
| 0A1C&lt;br /&gt;
| A1K.org Community&lt;br /&gt;
|-&lt;br /&gt;
| 2640&lt;br /&gt;
| 0A50&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 3084&lt;br /&gt;
| 0C0C&lt;br /&gt;
| Team 4&lt;br /&gt;
|-&lt;br /&gt;
| 3643&lt;br /&gt;
| 0E3B&lt;br /&gt;
| E3B&lt;br /&gt;
| Michael Boehmer&lt;br /&gt;
|-&lt;br /&gt;
| 3855&lt;br /&gt;
| 0F0F&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 4096&lt;br /&gt;
| 1000&lt;br /&gt;
| MegaMicro&lt;br /&gt;
|-&lt;br /&gt;
| 4110&lt;br /&gt;
| 100E&lt;br /&gt;
| DigiFeX&lt;br /&gt;
|-&lt;br /&gt;
| 4136&lt;br /&gt;
| 1028&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
|-&lt;br /&gt;
| 4149&lt;br /&gt;
| 1035&lt;br /&gt;
| PROTAR&lt;br /&gt;
|-&lt;br /&gt;
| 4369&lt;br /&gt;
| 1111&lt;br /&gt;
| Frank Strauß Elektronik&lt;br /&gt;
| Also used by Kupke&lt;br /&gt;
|-&lt;br /&gt;
| 4626&lt;br /&gt;
| 1212&lt;br /&gt;
| Individual Computers&lt;br /&gt;
|-&lt;br /&gt;
| 4648&lt;br /&gt;
| 1228&lt;br /&gt;
| Flesch Hornemann Computer Elec.&lt;br /&gt;
|-&lt;br /&gt;
| 4680&lt;br /&gt;
| 1248&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 4711&lt;br /&gt;
| 1267&lt;br /&gt;
| RBM digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 4754&lt;br /&gt;
| 1292&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 5000&lt;br /&gt;
| 1388&lt;br /&gt;
| ITH&lt;br /&gt;
|-&lt;br /&gt;
| 5001&lt;br /&gt;
| 1389&lt;br /&gt;
| VMC&lt;br /&gt;
|-&lt;br /&gt;
| 5010&lt;br /&gt;
| 1392&lt;br /&gt;
| Ambience Creation Technology&lt;br /&gt;
|-&lt;br /&gt;
| 5011&lt;br /&gt;
| 1393&lt;br /&gt;
| Creative Development&lt;br /&gt;
|-&lt;br /&gt;
| 5012&lt;br /&gt;
| 1394&lt;br /&gt;
| Georg Braun&lt;br /&gt;
|-&lt;br /&gt;
| 5013&lt;br /&gt;
| 1395&lt;br /&gt;
| Swedish User Group of Amiga&lt;br /&gt;
|-&lt;br /&gt;
| 5014&lt;br /&gt;
| 1396&lt;br /&gt;
| Jakub Bednarski&lt;br /&gt;
|-&lt;br /&gt;
| 5015&lt;br /&gt;
| 1397&lt;br /&gt;
| KryoFlux, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5016&lt;br /&gt;
| 1398&lt;br /&gt;
| Igor Majstorovic&lt;br /&gt;
|-&lt;br /&gt;
| 5017&lt;br /&gt;
| 1399&lt;br /&gt;
| Alastair M. Robinson&lt;br /&gt;
|-&lt;br /&gt;
| 5018&lt;br /&gt;
| 139A&lt;br /&gt;
| Austex Software&lt;br /&gt;
|-&lt;br /&gt;
| 5019&lt;br /&gt;
| 139B&lt;br /&gt;
| Sören Gust&lt;br /&gt;
|-&lt;br /&gt;
| 5020&lt;br /&gt;
| 139C&lt;br /&gt;
| Rok Krajnc&lt;br /&gt;
|-&lt;br /&gt;
| 5030&lt;br /&gt;
| 13A6&lt;br /&gt;
| Tim Tashpulatov&lt;br /&gt;
|-&lt;br /&gt;
| 5040&lt;br /&gt;
| 13B0&lt;br /&gt;
| 7-bit&lt;br /&gt;
|-&lt;br /&gt;
| 5050&lt;br /&gt;
| 13BA&lt;br /&gt;
| Sakura IT&lt;br /&gt;
|-&lt;br /&gt;
| 5060&lt;br /&gt;
| 13C4&lt;br /&gt;
| FPGAArcade&lt;br /&gt;
|-&lt;br /&gt;
| 5070&lt;br /&gt;
| 13CE&lt;br /&gt;
| CancerSoft Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 5080&lt;br /&gt;
| 13D8&lt;br /&gt;
| Stephen Leary&lt;br /&gt;
|-&lt;br /&gt;
| 5090&lt;br /&gt;
| 13E2&lt;br /&gt;
| DMA Softlab LLC&lt;br /&gt;
|-&lt;br /&gt;
| 5100&lt;br /&gt;
| 13EC&lt;br /&gt;
| Brookhouse Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 5110&lt;br /&gt;
| 13F6&lt;br /&gt;
| Eduardo Arana&lt;br /&gt;
|-&lt;br /&gt;
| 5120&lt;br /&gt;
| 1400&lt;br /&gt;
| CS-LAB&lt;br /&gt;
|-&lt;br /&gt;
| 5130&lt;br /&gt;
| 140A&lt;br /&gt;
| Robert Miranda&lt;br /&gt;
|-&lt;br /&gt;
| 5140&lt;br /&gt;
| 1414&lt;br /&gt;
| RastPort&lt;br /&gt;
|-&lt;br /&gt;
| 5132&lt;br /&gt;
| 140C&lt;br /&gt;
| UAS Interface Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5500&lt;br /&gt;
| 157C&lt;br /&gt;
| Inhouse Information&lt;br /&gt;
|-&lt;br /&gt;
| 5768&lt;br /&gt;
| 1688&lt;br /&gt;
| Bio Con&lt;br /&gt;
|-&lt;br /&gt;
| 6148&lt;br /&gt;
| 1804&lt;br /&gt;
| HK-Computer&lt;br /&gt;
|-&lt;br /&gt;
| 6502&lt;br /&gt;
| 1966&lt;br /&gt;
| Cloanto&lt;br /&gt;
|-&lt;br /&gt;
| 6520&lt;br /&gt;
| 1978&lt;br /&gt;
| Oliver Gantert&lt;br /&gt;
|-&lt;br /&gt;
| 7777&lt;br /&gt;
| 1E61&lt;br /&gt;
| Rafal Gabriel Chyla&lt;br /&gt;
|-&lt;br /&gt;
| 8215&lt;br /&gt;
| 2017&lt;br /&gt;
| Vortex&lt;br /&gt;
|-&lt;br /&gt;
| 8244&lt;br /&gt;
| 2034&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 8290&lt;br /&gt;
| 2062&lt;br /&gt;
| Expansion Systems&lt;br /&gt;
|-&lt;br /&gt;
| 8448&lt;br /&gt;
| 2100&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 8512&lt;br /&gt;
| 2140&lt;br /&gt;
| Phase 5 Digital Products&lt;br /&gt;
|-&lt;br /&gt;
| 8553&lt;br /&gt;
| 2169&lt;br /&gt;
| Digital Processing Systems Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 8704&lt;br /&gt;
| 2200&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 8738&lt;br /&gt;
| 2222&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 9512&lt;br /&gt;
| 2528&lt;br /&gt;
| Tower Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 10676&lt;br /&gt;
| 29B4&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 14195&lt;br /&gt;
| 3773&lt;br /&gt;
| Media-net-Point&lt;br /&gt;
|-&lt;br /&gt;
| 14501&lt;br /&gt;
| 38A5&lt;br /&gt;
| Petsoff, Finland&lt;br /&gt;
|-&lt;br /&gt;
| 16375&lt;br /&gt;
| 3FF7&lt;br /&gt;
| Uwe Gerlach&lt;br /&gt;
|-&lt;br /&gt;
| 16707&lt;br /&gt;
| 4143&lt;br /&gt;
| Ateo Concepts&lt;br /&gt;
|-&lt;br /&gt;
| 16708&lt;br /&gt;
| 4144&lt;br /&gt;
| ALiENDESiGN&lt;br /&gt;
|-&lt;br /&gt;
| 16945&lt;br /&gt;
| 4231&lt;br /&gt;
| A.C.T.&lt;br /&gt;
|-&lt;br /&gt;
| 17740&lt;br /&gt;
| 454C&lt;br /&gt;
| HK-Computer (ELSAT)&lt;br /&gt;
|-&lt;br /&gt;
| 18260&lt;br /&gt;
| 4754&lt;br /&gt;
| MacroSystems (Germany)&lt;br /&gt;
|-&lt;br /&gt;
| 19796&lt;br /&gt;
| 4D54&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 22359&lt;br /&gt;
| 5757&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 26464&lt;br /&gt;
| 6760&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 26470&lt;br /&gt;
| 6766&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 28014&lt;br /&gt;
| 6D6E&lt;br /&gt;
| MNT Media and Technology UG&lt;br /&gt;
|-&lt;br /&gt;
| 32768&lt;br /&gt;
| 8000&lt;br /&gt;
| M.A.S.T.&lt;br /&gt;
|-&lt;br /&gt;
| 42240&lt;br /&gt;
| A500&lt;br /&gt;
| Aethreum Digital&lt;br /&gt;
|-&lt;br /&gt;
| 43437&lt;br /&gt;
| A9AD&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 43521&lt;br /&gt;
| AA01&lt;br /&gt;
| Cameron&lt;br /&gt;
|-&lt;br /&gt;
| 43537&lt;br /&gt;
| AA11&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 44359&lt;br /&gt;
| AD47&lt;br /&gt;
| Matay&lt;br /&gt;
|-&lt;br /&gt;
| 46504&lt;br /&gt;
| B5A8&lt;br /&gt;
| Phoenix&lt;br /&gt;
|-&lt;br /&gt;
| 49160&lt;br /&gt;
| C008&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 61453&lt;br /&gt;
| F00D&lt;br /&gt;
| Forefront Technologies Inc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For any changes/additions to this registry please use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9834</id>
		<title>AmiWest 2018 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9834"/>
		<updated>2018-09-12T16:11:49Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 20 (Friday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* AmigaOne X5000 and A1222 SATA driver deep dive. How to make your own AmigaOS disk device drivers. (Steven Solie)&lt;br /&gt;
&lt;br /&gt;
* Introducing the infodata.gadget class. (Mark Ritter)&lt;br /&gt;
&lt;br /&gt;
* Tower57 port optimizations explained. (Daniel Müßener)&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Surprise&amp;quot; developer related software. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Ethernet driver development explained including a new framework. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Inside the A1222 laptop project. (Hans de Ruiter)&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Here is the schedule for the Dev Con.&lt;br /&gt;
&lt;br /&gt;
== October 10 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
Set up your AmigaOS systems and test them out. This is the time to troubleshoot any equipment or Internet access issues.&lt;br /&gt;
&lt;br /&gt;
== October 11 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when we run out of energy.&lt;br /&gt;
&lt;br /&gt;
== October 12 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when the Classic Clinic starts setting up which should be around 17:00 or so.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9833</id>
		<title>AmiWest 2018 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9833"/>
		<updated>2018-09-12T16:11:42Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 19 (Thursday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* AmigaOne X5000 and A1222 SATA driver deep dive. How to make your own AmigaOS disk device drivers. (Steven Solie)&lt;br /&gt;
&lt;br /&gt;
* Introducing the infodata.gadget class. (Mark Ritter)&lt;br /&gt;
&lt;br /&gt;
* Tower57 port optimizations explained. (Daniel Müßener)&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Surprise&amp;quot; developer related software. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Ethernet driver development explained including a new framework. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Inside the A1222 laptop project. (Hans de Ruiter)&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Here is the schedule for the Dev Con.&lt;br /&gt;
&lt;br /&gt;
== October 10 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
Set up your AmigaOS systems and test them out. This is the time to troubleshoot any equipment or Internet access issues.&lt;br /&gt;
&lt;br /&gt;
== October 11 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when we run out of energy.&lt;br /&gt;
&lt;br /&gt;
== October 20 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when the Classic Clinic starts setting up which should be around 17:00 or so.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9832</id>
		<title>AmiWest 2018 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9832"/>
		<updated>2018-09-12T16:11:36Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* October 18 (Wednesday) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* AmigaOne X5000 and A1222 SATA driver deep dive. How to make your own AmigaOS disk device drivers. (Steven Solie)&lt;br /&gt;
&lt;br /&gt;
* Introducing the infodata.gadget class. (Mark Ritter)&lt;br /&gt;
&lt;br /&gt;
* Tower57 port optimizations explained. (Daniel Müßener)&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Surprise&amp;quot; developer related software. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Ethernet driver development explained including a new framework. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Inside the A1222 laptop project. (Hans de Ruiter)&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Here is the schedule for the Dev Con.&lt;br /&gt;
&lt;br /&gt;
== October 10 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
Set up your AmigaOS systems and test them out. This is the time to troubleshoot any equipment or Internet access issues.&lt;br /&gt;
&lt;br /&gt;
== October 19 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when we run out of energy.&lt;br /&gt;
&lt;br /&gt;
== October 20 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when the Classic Clinic starts setting up which should be around 17:00 or so.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9831</id>
		<title>AmiWest 2018 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9831"/>
		<updated>2018-09-12T16:04:27Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* AmigaOne X5000 and A1222 SATA driver deep dive. How to make your own AmigaOS disk device drivers. (Steven Solie)&lt;br /&gt;
&lt;br /&gt;
* Introducing the infodata.gadget class. (Mark Ritter)&lt;br /&gt;
&lt;br /&gt;
* Tower57 port optimizations explained. (Daniel Müßener)&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Surprise&amp;quot; developer related software. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Ethernet driver development explained including a new framework. (Jamie Krueger)&lt;br /&gt;
&lt;br /&gt;
* Inside the A1222 laptop project. (Hans de Ruiter)&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Here is the schedule for the Dev Con.&lt;br /&gt;
&lt;br /&gt;
== October 18 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
Set up your AmigaOS systems and test them out. This is the time to troubleshoot any equipment or Internet access issues.&lt;br /&gt;
&lt;br /&gt;
== October 19 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when we run out of energy.&lt;br /&gt;
&lt;br /&gt;
== October 20 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when the Classic Clinic starts setting up which should be around 17:00 or so.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9830</id>
		<title>AmiWest 2018 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9830"/>
		<updated>2018-09-11T15:21:32Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* AmigaOne X5000 and A1222 SATA driver deep dive. How to make your own AmigaOS disk device drivers. (Steven Solie)&lt;br /&gt;
&lt;br /&gt;
* Introducing the infodata.gadget class (Mark Ritter).&lt;br /&gt;
&lt;br /&gt;
* (Watch this space for more info coming soon)&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Here is the schedule for the Dev Con.&lt;br /&gt;
&lt;br /&gt;
== October 18 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
Set up your AmigaOS systems and test them out. This is the time to troubleshoot any equipment or Internet access issues.&lt;br /&gt;
&lt;br /&gt;
== October 19 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when we run out of energy.&lt;br /&gt;
&lt;br /&gt;
== October 20 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when the Classic Clinic starts setting up which should be around 17:00 or so.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9829</id>
		<title>AmiWest 2018 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9829"/>
		<updated>2018-09-10T03:31:11Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Syllabus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* AmigaOne X5000 and A1222 SATA driver deep dive. How to make your own AmigaOS disk device drivers.&lt;br /&gt;
&lt;br /&gt;
* (Watch this space for more info coming soon)&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Here is the schedule for the Dev Con.&lt;br /&gt;
&lt;br /&gt;
== October 18 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
Set up your AmigaOS systems and test them out. This is the time to troubleshoot any equipment or Internet access issues.&lt;br /&gt;
&lt;br /&gt;
== October 19 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when we run out of energy.&lt;br /&gt;
&lt;br /&gt;
== October 20 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when the Classic Clinic starts setting up which should be around 17:00 or so.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9828</id>
		<title>AmiWest 2018 DevCon</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_2018_DevCon&amp;diff=9828"/>
		<updated>2018-09-10T03:30:54Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: Created page with &amp;quot;= Getting Ready =  Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See AmiWest Setup for complete details on how to get ready.  = Syllabus = W...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Getting Ready =&lt;br /&gt;
&lt;br /&gt;
Be sure to have the AmigaOS 4.1 Final Edition SDK installed and ready to go. See [[AmiWest Setup]] for complete details on how to get ready.&lt;br /&gt;
&lt;br /&gt;
= Syllabus =&lt;br /&gt;
We are aiming to cover the following topics:&lt;br /&gt;
&lt;br /&gt;
* AmigaOne X5000 and A1222 SATA driver deep delve. How to make your own AmigaOS disk device drivers.&lt;br /&gt;
&lt;br /&gt;
* (Watch this space for more info coming soon)&lt;br /&gt;
&lt;br /&gt;
* Personal Projects. You are encouraged to bring your own personal projects to the DevCon where we, as a group, may be able to help you out.&lt;br /&gt;
&lt;br /&gt;
The DevCon will also be tailored to the group. If something is not interesting we can skip it and move on to something that is interesting. Class participation and feedback during the DevCon is mandatory - repeat, mandatory.&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Here is the schedule for the Dev Con.&lt;br /&gt;
&lt;br /&gt;
== October 18 (Wednesday) ==&lt;br /&gt;
&lt;br /&gt;
Set up your AmigaOS systems and test them out. This is the time to troubleshoot any equipment or Internet access issues.&lt;br /&gt;
&lt;br /&gt;
== October 19 (Thursday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when we run out of energy.&lt;br /&gt;
&lt;br /&gt;
== October 20 (Friday) ==&lt;br /&gt;
&lt;br /&gt;
We will start at 09:30 so please be there for 09:00. We&#039;ll have a lunch break around noon. We will stop when the Classic Clinic starts setting up which should be around 17:00 or so.&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=9827</id>
		<title>Tutorials:Main</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Tutorials:Main&amp;diff=9827"/>
		<updated>2018-09-10T03:27:48Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &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 AmigaOS 4 library]]&lt;br /&gt;
&lt;br /&gt;
== Amiga Future Programming Articles ==&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: The Development Environment]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Exec - The Kernel]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: DOS - The Data Administrator]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Intuition - The User Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Drawing Graphics]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Transparent Windows]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Datatypes - Making Life Easy]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: GUI Toolkit ReAction]]&lt;br /&gt;
&lt;br /&gt;
[[Programming AmigaOS 4: Utility - Little Helpers]]&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 2018 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2018 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2017 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2017 DevCon]]&lt;br /&gt;
&lt;br /&gt;
== AmiWest 2016 ==&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Setup]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest 2016 DevCon]]&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 - Not Presented]]&lt;br /&gt;
&lt;br /&gt;
[[AmiWest Lesson 8|AmiWest Lesson 8: ARexx Ports]][https://dl.dropboxusercontent.com/u/680455/AmiWest-2012-Programming/Lesson07-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>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9332</id>
		<title>Amiga Hardware Manufacturer ID Registry</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9332"/>
		<updated>2018-04-30T04:05:28Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Registry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= How to Obtain a Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Manufacturer&#039;s numbers are assigned by the AmigaOS development team. To obtain your unique manufacturer number use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;br /&gt;
&lt;br /&gt;
Be sure and include your name, email and the type of expansion product you are developing.&lt;br /&gt;
&lt;br /&gt;
= Your Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Attention hardware manufacturers. If you are developing a hardware expansion product for the Classic Amiga (e.g. 500, 2000, 3000) then you will need to obtain a special manufacturer ID number from the AmigaOS development team to identify your product. This manufacturer number is used by the Amiga to link your hardware with its driver software at boot time.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number is part of the special protocol that the Amiga uses to automatically configure all expansion devices on the bus without the user having to cut jumpers or adjust dip switches. This is called auto-config.&lt;br /&gt;
&lt;br /&gt;
At start-up time, the system first polls each board in the system and assigns the board its own address space. If it is a memory board, its RAM is linked into the memory free pool. Later in the boot sequence, after DOS is initialized, the binddrivers program is run. Binddrivers will search the directory SYS:Expansion for the drivers that go with the boards.&lt;br /&gt;
&lt;br /&gt;
To do this binddrivers looks in the Tool Type field of all icon files in SYS:Expansion. If the first seven bytes of the Tool Type field are &amp;quot;PRODUCT&amp;quot;, then this is an icon file for a driver.&lt;br /&gt;
&lt;br /&gt;
Binddrivers will then attempt to match the drivers it has found with the boards that were found earlier. This is where your manufacturer number comes in.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number goes in two places. First, it is burned in hex form into the PAL which is part of ALL auto-config expansion products. Second, it appears in ASCII in the Tool Type field of the icon file for your product&#039;s driver. By matching these two numbers, the Amiga can automatically configure your board and bind it&#039;s software driver into the system as well.&lt;br /&gt;
&lt;br /&gt;
The manufacturer&#039;s number is a 16-bit ID which appears in PAL offsets $10-$17. There is also an 8-bit product number which you assign. The product number is for uniquely identifying different products from the same vendor. The product number will appear in PAL offsets $04-$07. This gives you a total of 24 bits to identify each of your products.&lt;br /&gt;
&lt;br /&gt;
These 24 bits of information in the PAL which identify your product are matched against the information in the Tool Type field of all icon files in the SYS:Expansion drawer. For example, suppose you are manufacturer #1019. You have two products, #1 and #2 which both use the same driver. The icon for your driver for these two products would have a Tool Type set to &amp;quot;PRODUCT=1019/1|1019/2&amp;quot;. This means: I am an icon for a driver that works with product number 1 or 2 from manufacturer 1019, now bind me. Spaces are not legal. Here are two other examples:&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1208/11&lt;br /&gt;
: is the Tool Type for a driver for product 11 from manufacturer number 1208.&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1017&lt;br /&gt;
: is the Tool Type for a driver for any product from manufacturer number 1017.&lt;br /&gt;
&lt;br /&gt;
For an informal explanation of the auto-configuration process, see the chapter on Software Expansion Architecture from the 2nd Annual Amiga Developer&#039;s Conference Notes (available on ADCD 2.1). For the details of timing, power, the PAL equations and PAL address specifications and the expansion library documentation, see sections 3.1 to 3.3 of the A500/A2000 Technical Reference Manual. The original auto-config spec appears in the A1000 Schematics and Expansion Specification.&lt;br /&gt;
&lt;br /&gt;
The auto-config process makes the addition of expansion products to the system very easy. All the user has to do is put the board in any slot and copy the driver from the release disk to his own SYS:Expansion drawer. Everything else is automatic. There are no jumpers or dip switches to set. Best of all, you will get a lot less support calls asking how to make your product work with the XYZ-Corp-battery-backed-clock.&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
Some notes on hardware manufacturer ID assignment.&lt;br /&gt;
&lt;br /&gt;
* Manufacturer ID numbers are assigned free of charge.&lt;br /&gt;
* Please provide the following information when requesting an ID:&lt;br /&gt;
*# Name of the company or person&lt;br /&gt;
*# Postal address/contact address&lt;br /&gt;
*# Name of the contact person, with a corresponding e-mail address&lt;br /&gt;
*# A brief description of the kind of products you want to produce&lt;br /&gt;
* All ID numbers smaller than 5000 must be considered unsafe because no information exists on which numbers exactly were taken during the time Commodore, Inc. disintegrated.&lt;br /&gt;
* ID numbers in the range 8192 to 18841 must be considered unsafe because some hardware developers mistook the numbers assigned to them to be given in hexadecimal format. Hence 0x2000 = 8192 and 0x4999 = 18841.&lt;br /&gt;
&lt;br /&gt;
= Example code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
/* Here is a short program which will tell you   */&lt;br /&gt;
/* about the expansion boards configured in your */&lt;br /&gt;
/* system without you opening up the machine.    */&lt;br /&gt;
/* Code by Bill Koester of CATS                  */&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
#include &amp;lt;libraries/configvars.h&amp;gt;&lt;br /&gt;
#include &amp;lt;libraries/expansion.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct ExpansionBase *ExpansionBase;&lt;br /&gt;
&lt;br /&gt;
void cleanup();&lt;br /&gt;
void printdev();&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   struct ConfigDev *MyConfigDev;&lt;br /&gt;
&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
   /* Open the expansion library,      */&lt;br /&gt;
   /* if there is a problem then exit  */&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   ExpansionBase =(struct ExpansionBase *) OpenLibrary(EXPANSIONNAME,0);&lt;br /&gt;
   if(ExpansionBase==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error opening expansion library!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
   /* Use FindConfigDev to get info on the first */&lt;br /&gt;
   /* expansion board on the list maintained by  */&lt;br /&gt;
   /* Exec.  If there are no expansion boards in */&lt;br /&gt;
   /* the system then exit.                      */&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = NULL;&lt;br /&gt;
&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
  /* FindConfigDev(oldConfigDev,manufacturer,product) */&lt;br /&gt;
  /* oldConfigDev = NULL for the top of the list      */&lt;br /&gt;
  /* manufacturer = -1 for any manufacturer           */&lt;br /&gt;
  /* product      = -1 for any product                */&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = FindConfigDev(NULL,-1,-1);&lt;br /&gt;
&lt;br /&gt;
   if(MyConfigDev==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;No Configured Devices found!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printdev(MyConfigDev);&lt;br /&gt;
&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
   /* OK, there is at least one board,  */&lt;br /&gt;
   /* so loop and get the entire list   */&lt;br /&gt;
   /* printing as we go with printdev() */&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   while(MyConfigDev = FindConfigDev(MyConfigDev,-1,-1))&lt;br /&gt;
   {&lt;br /&gt;
      printdev(MyConfigDev);&lt;br /&gt;
   }&lt;br /&gt;
   cleanup();&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
/* Close up shop...  */&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
void cleanup()&lt;br /&gt;
{&lt;br /&gt;
   if(ExpansionBase)&lt;br /&gt;
      CloseLibrary(ExpansionBase);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
/* Print out the contents of the    */&lt;br /&gt;
/* dev structure for this expansion */&lt;br /&gt;
/* product.                         */&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
void printdev(dev)&lt;br /&gt;
struct ConfigDev *dev;&lt;br /&gt;
{&lt;br /&gt;
   char buff[200];&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Flags          = &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags==NULL)&lt;br /&gt;
      printf(&amp;quot;NULL  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_SHUTUP)&lt;br /&gt;
      printf(&amp;quot;CDF_SHUTUP  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_CONFIGME)&lt;br /&gt;
      printf(&amp;quot;CDF_CONFIGME  &amp;quot;);&lt;br /&gt;
   printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot;Board Address  = %x\n&amp;quot;,dev-&amp;gt;cd_BoardAddr);&lt;br /&gt;
   printf(&amp;quot;Board Size     = %d bytes\n&amp;quot;,dev-&amp;gt;cd_BoardSize);&lt;br /&gt;
   printf(&amp;quot;Slot  Address  = %d\n&amp;quot;,dev-&amp;gt;cd_SlotAddr);&lt;br /&gt;
   printf(&amp;quot;Slot  Size     = %d\n&amp;quot;,dev-&amp;gt;cd_SlotSize);&lt;br /&gt;
   printf(&amp;quot;Driver code at   %x\n&amp;quot;,dev-&amp;gt;cd_Driver);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;er_Type         = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Type);&lt;br /&gt;
   printf(&amp;quot;er_Product      = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Product);&lt;br /&gt;
   printf(&amp;quot;er_Flags        = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Flags);&lt;br /&gt;
   printf(&amp;quot;er_Reserved03   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved03);&lt;br /&gt;
   printf(&amp;quot;er_Manufacturer = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Manufacturer);&lt;br /&gt;
   printf(&amp;quot;er_SerialNumber = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_SerialNumber);&lt;br /&gt;
   printf(&amp;quot;er_InitDiagVec  = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_InitDiagVec);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0c   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0c);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0d   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0d);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0e   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0e);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0f   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0f);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Hit Return to continue:\n&amp;quot;);&lt;br /&gt;
   gets(buff);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Registry =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (decimal)&lt;br /&gt;
! ID (hexadecimal)&lt;br /&gt;
! Manufacturer&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 211&lt;br /&gt;
| 00D3&lt;br /&gt;
| Pacific Peripherals/Profex&lt;br /&gt;
|-&lt;br /&gt;
| 221&lt;br /&gt;
| 00DD&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 256&lt;br /&gt;
| 0100&lt;br /&gt;
| Memphis&lt;br /&gt;
| Originally registered to MacroSystems US&lt;br /&gt;
|-&lt;br /&gt;
| 512&lt;br /&gt;
| 0200&lt;br /&gt;
| 3-State Computertechnik&lt;br /&gt;
|-&lt;br /&gt;
| 513&lt;br /&gt;
| 0201&lt;br /&gt;
| Commodore (Braunschweig)&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| 0202&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
|-&lt;br /&gt;
| 515&lt;br /&gt;
| 0203&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
| Originally registered to Combitech/Macrosystem&lt;br /&gt;
|-&lt;br /&gt;
| 756&lt;br /&gt;
| 02F4&lt;br /&gt;
| Progressive Peripherals &amp;amp; Software&lt;br /&gt;
|-&lt;br /&gt;
| 767&lt;br /&gt;
| 02FF&lt;br /&gt;
| Kolff Computer Supplies&lt;br /&gt;
|-&lt;br /&gt;
| 1001&lt;br /&gt;
| 03E9&lt;br /&gt;
| Tecmar&lt;br /&gt;
|-&lt;br /&gt;
| 1002&lt;br /&gt;
| 03EA&lt;br /&gt;
| Telesys&lt;br /&gt;
|-&lt;br /&gt;
| 1003&lt;br /&gt;
| 03EB&lt;br /&gt;
| The Micro-Forge&lt;br /&gt;
|-&lt;br /&gt;
| 1004&lt;br /&gt;
| 03EC&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
| Originally registered to Card Co. (Supra)&lt;br /&gt;
|-&lt;br /&gt;
| 1005&lt;br /&gt;
| 03ED&lt;br /&gt;
| A-Squared&lt;br /&gt;
|-&lt;br /&gt;
| 1006&lt;br /&gt;
| 03EE&lt;br /&gt;
| Comspec Communications&lt;br /&gt;
|-&lt;br /&gt;
| 1007&lt;br /&gt;
| 03EF&lt;br /&gt;
| HT Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1008&lt;br /&gt;
| 03F0&lt;br /&gt;
| RDS Software&lt;br /&gt;
|-&lt;br /&gt;
| 1009&lt;br /&gt;
| 03F1&lt;br /&gt;
| Anakin Research&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| 03F2&lt;br /&gt;
| MicroBotics&lt;br /&gt;
|-&lt;br /&gt;
| 1011&lt;br /&gt;
| 03F3&lt;br /&gt;
| Bob Krauth&lt;br /&gt;
|-&lt;br /&gt;
| 1012&lt;br /&gt;
| 03F4&lt;br /&gt;
| Access Associates (Alegra)&lt;br /&gt;
|-&lt;br /&gt;
| 1013&lt;br /&gt;
| 03F5&lt;br /&gt;
| Mini Comp Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 1014&lt;br /&gt;
| 03F6&lt;br /&gt;
| Cypress Technology&lt;br /&gt;
|-&lt;br /&gt;
| 1015&lt;br /&gt;
| 03F7&lt;br /&gt;
| Fuller Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1016&lt;br /&gt;
| 03F8&lt;br /&gt;
| Galaxy Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1017&lt;br /&gt;
| 03F9&lt;br /&gt;
| ADA Research&lt;br /&gt;
|-&lt;br /&gt;
| 1018&lt;br /&gt;
| 03FA&lt;br /&gt;
| Computer Service Italia&lt;br /&gt;
|-&lt;br /&gt;
| 1019&lt;br /&gt;
| 03FB&lt;br /&gt;
| Amigo&lt;br /&gt;
|-&lt;br /&gt;
| 1020&lt;br /&gt;
| 03FC&lt;br /&gt;
| Micro-Solutions Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1021&lt;br /&gt;
| 03FD&lt;br /&gt;
| Stacar International&lt;br /&gt;
|-&lt;br /&gt;
| 1022&lt;br /&gt;
| 03FE&lt;br /&gt;
| Video Precisions&lt;br /&gt;
|-&lt;br /&gt;
| 1023&lt;br /&gt;
| 03FF&lt;br /&gt;
| ASDG, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1025&lt;br /&gt;
| 0401&lt;br /&gt;
| Ing. Buero Kalawsky&lt;br /&gt;
|-&lt;br /&gt;
| 1026&lt;br /&gt;
| 0402&lt;br /&gt;
| Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 1027&lt;br /&gt;
| 0403&lt;br /&gt;
| Interplan Unternehmensberatung&lt;br /&gt;
|-&lt;br /&gt;
| 1028&lt;br /&gt;
| 0404&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
| Originally registered to Peter Ohlich&lt;br /&gt;
|-&lt;br /&gt;
| 1030&lt;br /&gt;
| 0406&lt;br /&gt;
| Commodore (Lowell University)&lt;br /&gt;
| Originally registered to Productivity Center&lt;br /&gt;
|-&lt;br /&gt;
| 1041&lt;br /&gt;
| 0411&lt;br /&gt;
| Design Labs&lt;br /&gt;
|-&lt;br /&gt;
| 1042&lt;br /&gt;
| 0412&lt;br /&gt;
| MCS&lt;br /&gt;
|-&lt;br /&gt;
| 1043&lt;br /&gt;
| 0413&lt;br /&gt;
| B. J. Freeman&lt;br /&gt;
|-&lt;br /&gt;
| 1044&lt;br /&gt;
| 0414&lt;br /&gt;
| Side Effects Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1045&lt;br /&gt;
| 0415&lt;br /&gt;
| Oklahoma Personal Comp.&lt;br /&gt;
|-&lt;br /&gt;
| 1046&lt;br /&gt;
| 0416&lt;br /&gt;
| Advanced Micro Innovations&lt;br /&gt;
|-&lt;br /&gt;
| 1047&lt;br /&gt;
| 0417&lt;br /&gt;
| Industrial Support Services&lt;br /&gt;
|-&lt;br /&gt;
| 1048&lt;br /&gt;
| 0418&lt;br /&gt;
| Technisoft&lt;br /&gt;
|-&lt;br /&gt;
| 1049&lt;br /&gt;
| 0419&lt;br /&gt;
| Prolific, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1050&lt;br /&gt;
| 041A&lt;br /&gt;
| Softeam, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1051&lt;br /&gt;
| 041B&lt;br /&gt;
| GRC Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1052&lt;br /&gt;
| 041C&lt;br /&gt;
| David Lai&lt;br /&gt;
|-&lt;br /&gt;
| 1053&lt;br /&gt;
| 041D&lt;br /&gt;
| Ameristar Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 1054&lt;br /&gt;
| 041E&lt;br /&gt;
| Cline Refrigeration&lt;br /&gt;
|-&lt;br /&gt;
| 1055&lt;br /&gt;
| 041F&lt;br /&gt;
| Cardiac Pacemakers, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1056&lt;br /&gt;
| 0420&lt;br /&gt;
| Supra Corp. (Creative Microsystems)&lt;br /&gt;
|-&lt;br /&gt;
| 1057&lt;br /&gt;
| 0421&lt;br /&gt;
| Wayne Diener&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| 0422&lt;br /&gt;
| Computer Systems Associates (CSA)&lt;br /&gt;
|-&lt;br /&gt;
| 1059&lt;br /&gt;
| 0423&lt;br /&gt;
| Trionix, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1060&lt;br /&gt;
| 0424&lt;br /&gt;
| David Lucas&lt;br /&gt;
|-&lt;br /&gt;
| 1061&lt;br /&gt;
| 0425&lt;br /&gt;
| Analog Precision&lt;br /&gt;
| Also assigned to D &amp;amp; L Distributing&lt;br /&gt;
|-&lt;br /&gt;
| 1267&lt;br /&gt;
| 04F3&lt;br /&gt;
| RBM Digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 1282&lt;br /&gt;
| 0502&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
|-&lt;br /&gt;
| 1337&lt;br /&gt;
| 0539&lt;br /&gt;
| Thomas Stenzel (DaFR34K)&lt;br /&gt;
|-&lt;br /&gt;
| 1576&lt;br /&gt;
| 0628&lt;br /&gt;
| Boris Križma&lt;br /&gt;
|-&lt;br /&gt;
| 1761&lt;br /&gt;
| 06E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 1803&lt;br /&gt;
| 070B&lt;br /&gt;
| UAE Amiga Emulator&lt;br /&gt;
|-&lt;br /&gt;
| 2002&lt;br /&gt;
| 07D2&lt;br /&gt;
| Mimetics Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2003&lt;br /&gt;
| 07D3&lt;br /&gt;
| ACDA&lt;br /&gt;
|-&lt;br /&gt;
| 2004&lt;br /&gt;
| 07D4&lt;br /&gt;
| Finn R. Jacobsen&lt;br /&gt;
|-&lt;br /&gt;
| 2005&lt;br /&gt;
| 07D5&lt;br /&gt;
| Elthen Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2006&lt;br /&gt;
| 07D6&lt;br /&gt;
| Nine Tiles Computer Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2007&lt;br /&gt;
| 07D7&lt;br /&gt;
| Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2008&lt;br /&gt;
| 07D8&lt;br /&gt;
| Bell &amp;amp;amp; Howell&lt;br /&gt;
|-&lt;br /&gt;
| 2009&lt;br /&gt;
| 07D9&lt;br /&gt;
| Roland Kochler&lt;br /&gt;
|-&lt;br /&gt;
| 2010&lt;br /&gt;
| 07DA&lt;br /&gt;
| Byte Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2011&lt;br /&gt;
| 07DB&lt;br /&gt;
| Reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2012&lt;br /&gt;
| 07DC&lt;br /&gt;
| DKB, Inc.&lt;br /&gt;
| Previously named Michigan Software&lt;br /&gt;
|-&lt;br /&gt;
| 2013&lt;br /&gt;
| 07DD&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2014&lt;br /&gt;
| 07DE&lt;br /&gt;
| Sysaphus Software&lt;br /&gt;
|-&lt;br /&gt;
| 2015&lt;br /&gt;
| 07DF&lt;br /&gt;
| Digitronics&lt;br /&gt;
|-&lt;br /&gt;
| 2016&lt;br /&gt;
| 07E0&lt;br /&gt;
| Akron Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2017&lt;br /&gt;
| 07E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 2018&lt;br /&gt;
| 07E2&lt;br /&gt;
| Calmos&lt;br /&gt;
|-&lt;br /&gt;
| 2019&lt;br /&gt;
| 07E3&lt;br /&gt;
| Dover Research&lt;br /&gt;
|-&lt;br /&gt;
| 2020&lt;br /&gt;
| 07E4&lt;br /&gt;
| David Krehbiel&lt;br /&gt;
|-&lt;br /&gt;
| 2021&lt;br /&gt;
| 07E5&lt;br /&gt;
| Synergy Peripheral Systems&lt;br /&gt;
| Also known as California Access&lt;br /&gt;
|-&lt;br /&gt;
| 2022&lt;br /&gt;
| 07E6&lt;br /&gt;
| Xetec&lt;br /&gt;
|-&lt;br /&gt;
| 2023&lt;br /&gt;
| 07E7&lt;br /&gt;
| Micron Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2024&lt;br /&gt;
| 07E8&lt;br /&gt;
| CH Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2025&lt;br /&gt;
| 07E9&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2026&lt;br /&gt;
| 07EA&lt;br /&gt;
| Progressive Peripherals &amp;amp;amp; Software&lt;br /&gt;
| Also used by Ateo&lt;br /&gt;
|-&lt;br /&gt;
| 2027&lt;br /&gt;
| 07EB&lt;br /&gt;
| Wicat Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2028&lt;br /&gt;
| 07EC&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2029&lt;br /&gt;
| 07ED&lt;br /&gt;
| Delaware Valley Software&lt;br /&gt;
|-&lt;br /&gt;
| 2030&lt;br /&gt;
| 07EE&lt;br /&gt;
| Palomax&lt;br /&gt;
|-&lt;br /&gt;
| 2031&lt;br /&gt;
| 07EF&lt;br /&gt;
| Incognito Software&lt;br /&gt;
|-&lt;br /&gt;
| 2032&lt;br /&gt;
| 07F0&lt;br /&gt;
| Jadesign&lt;br /&gt;
|-&lt;br /&gt;
| 2033&lt;br /&gt;
| 07F1&lt;br /&gt;
| BVR&lt;br /&gt;
|-&lt;br /&gt;
| 2034&lt;br /&gt;
| 07F2&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2035&lt;br /&gt;
| 07F3&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2036&lt;br /&gt;
| 07F4&lt;br /&gt;
| Atronic&lt;br /&gt;
|-&lt;br /&gt;
| 2037&lt;br /&gt;
| 07F5&lt;br /&gt;
| Scott Karlin&lt;br /&gt;
|-&lt;br /&gt;
| 2038&lt;br /&gt;
| 07F6&lt;br /&gt;
| Howitch&lt;br /&gt;
|-&lt;br /&gt;
| 2039&lt;br /&gt;
| 07F7&lt;br /&gt;
| Sullivan Brothers Visual Engineers&lt;br /&gt;
|-&lt;br /&gt;
| 2040&lt;br /&gt;
| 07F8&lt;br /&gt;
| G I T&lt;br /&gt;
|-&lt;br /&gt;
| 2041&lt;br /&gt;
| 07F9&lt;br /&gt;
| Amigo Business Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2042&lt;br /&gt;
| 07FA&lt;br /&gt;
| Micro E Ab&lt;br /&gt;
|-&lt;br /&gt;
| 2043&lt;br /&gt;
| 07FB&lt;br /&gt;
| Ralph Kruse&lt;br /&gt;
|-&lt;br /&gt;
| 2044&lt;br /&gt;
| 07FC&lt;br /&gt;
| Clearpoint Research&lt;br /&gt;
|-&lt;br /&gt;
| 2045&lt;br /&gt;
| 07FD&lt;br /&gt;
| Kodiak&lt;br /&gt;
|-&lt;br /&gt;
| 2046&lt;br /&gt;
| 07FE&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Phoenix Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2047&lt;br /&gt;
| 07FF&lt;br /&gt;
| No Name Shown&lt;br /&gt;
|-&lt;br /&gt;
| 2048&lt;br /&gt;
| 0800&lt;br /&gt;
| Commodore Braunschweig&lt;br /&gt;
|-&lt;br /&gt;
| 2049&lt;br /&gt;
| 0801&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Elaborate Bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2050&lt;br /&gt;
| 0802&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2051&lt;br /&gt;
| 0803&lt;br /&gt;
| Spartanics&lt;br /&gt;
|-&lt;br /&gt;
| 2052&lt;br /&gt;
| 0804&lt;br /&gt;
| Jochheim Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 2053&lt;br /&gt;
| 0805&lt;br /&gt;
| Trans Data Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2054&lt;br /&gt;
| 0806&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2055&lt;br /&gt;
| 0807&lt;br /&gt;
| Checkpoint Technologies&lt;br /&gt;
| Originally registered to Amiga Solutions&lt;br /&gt;
|-&lt;br /&gt;
| 2056&lt;br /&gt;
| 0808&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2057&lt;br /&gt;
| 0809&lt;br /&gt;
| Advanced Computer Design&lt;br /&gt;
|-&lt;br /&gt;
| 2058&lt;br /&gt;
| 080A&lt;br /&gt;
| Sir Netics&lt;br /&gt;
|-&lt;br /&gt;
| 2059&lt;br /&gt;
| 080B&lt;br /&gt;
| Expert Services&lt;br /&gt;
|-&lt;br /&gt;
| 2060&lt;br /&gt;
| 080C&lt;br /&gt;
| Digital Art Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2061&lt;br /&gt;
| 080D&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2062&lt;br /&gt;
| 080E&lt;br /&gt;
| Expansion Technologies (Expansion Systems)&lt;br /&gt;
|-&lt;br /&gt;
| 2063&lt;br /&gt;
| 080F&lt;br /&gt;
| Alphatech&lt;br /&gt;
|-&lt;br /&gt;
| 2064&lt;br /&gt;
| 0810&lt;br /&gt;
| Edotronik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2065&lt;br /&gt;
| 0811&lt;br /&gt;
| California Access/Synergy&lt;br /&gt;
| Originally registered to Logical Design Works&lt;br /&gt;
|-&lt;br /&gt;
| 2066&lt;br /&gt;
| 0812&lt;br /&gt;
| Bowden, Williams, Full &amp;amp; Assoc.&lt;br /&gt;
|-&lt;br /&gt;
| 2067&lt;br /&gt;
| 0813&lt;br /&gt;
| NES, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2068&lt;br /&gt;
| 0814&lt;br /&gt;
| Amdev&lt;br /&gt;
|-&lt;br /&gt;
| 2069&lt;br /&gt;
| 0815&lt;br /&gt;
| Big Brother Security Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2070&lt;br /&gt;
| 0816&lt;br /&gt;
| Active Circuits Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2071&lt;br /&gt;
| 0817&lt;br /&gt;
| ICD, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2072&lt;br /&gt;
| 0818&lt;br /&gt;
| Multi-Meg Electronique&lt;br /&gt;
|-&lt;br /&gt;
| 2073&lt;br /&gt;
| 0819&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2074&lt;br /&gt;
| 081A&lt;br /&gt;
| The Checkered Ball&lt;br /&gt;
|-&lt;br /&gt;
| 2075&lt;br /&gt;
| 081B&lt;br /&gt;
| Hi Tension Computer Services Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2076&lt;br /&gt;
| 081C&lt;br /&gt;
| Alfa Data&lt;br /&gt;
| Originally assigned to Elmtech Research, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2077&lt;br /&gt;
| 081D&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Clartscreen, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2078&lt;br /&gt;
| 081E&lt;br /&gt;
| Interworks&lt;br /&gt;
|-&lt;br /&gt;
| 2079&lt;br /&gt;
| 081F&lt;br /&gt;
| Galysh Enterprises&lt;br /&gt;
|-&lt;br /&gt;
| 2080&lt;br /&gt;
| 0820&lt;br /&gt;
| Hardital Synthesis&lt;br /&gt;
| Originally registered to Realtime Games Software Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2081&lt;br /&gt;
| 0821&lt;br /&gt;
| GBS&lt;br /&gt;
|-&lt;br /&gt;
| 2082&lt;br /&gt;
| 0822&lt;br /&gt;
| Circum Design Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2083&lt;br /&gt;
| 0823&lt;br /&gt;
| Alberta Micro Electronic Center&lt;br /&gt;
|-&lt;br /&gt;
| 2084&lt;br /&gt;
| 0824&lt;br /&gt;
| Bestech&lt;br /&gt;
|-&lt;br /&gt;
| 2085&lt;br /&gt;
| 0825&lt;br /&gt;
| Lasar Fantasy&lt;br /&gt;
|-&lt;br /&gt;
| 2086&lt;br /&gt;
| 0826&lt;br /&gt;
| Pulsar&lt;br /&gt;
|-&lt;br /&gt;
| 2087&lt;br /&gt;
| 0827&lt;br /&gt;
| Ivis&lt;br /&gt;
|-&lt;br /&gt;
| 2088&lt;br /&gt;
| 0828&lt;br /&gt;
| Applied Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2089&lt;br /&gt;
| 0829&lt;br /&gt;
| Solid-State Design &amp;amp;amp; Development&lt;br /&gt;
|-&lt;br /&gt;
| 2090&lt;br /&gt;
| 082A&lt;br /&gt;
| Vison Quest&lt;br /&gt;
|-&lt;br /&gt;
| 2091&lt;br /&gt;
| 082B&lt;br /&gt;
| Seaview Software&lt;br /&gt;
|-&lt;br /&gt;
| 2092&lt;br /&gt;
| 082C&lt;br /&gt;
| BSC&lt;br /&gt;
| Mistakenly used by ADS (Advanced Development Software)&lt;br /&gt;
|-&lt;br /&gt;
| 2093&lt;br /&gt;
| 082D&lt;br /&gt;
| Bernd Culenfeld&lt;br /&gt;
|-&lt;br /&gt;
| 2094&lt;br /&gt;
| 082E&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2095&lt;br /&gt;
| 082F&lt;br /&gt;
| CEGITES&lt;br /&gt;
|-&lt;br /&gt;
| 2096&lt;br /&gt;
| 0830&lt;br /&gt;
| Quadlite Computers Ltd.&lt;br /&gt;
| Originally registered to EV Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2097&lt;br /&gt;
| 0831&lt;br /&gt;
| Silicon Peace&lt;br /&gt;
|-&lt;br /&gt;
| 2098&lt;br /&gt;
| 0832&lt;br /&gt;
| Black Belt Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2099&lt;br /&gt;
| 0833&lt;br /&gt;
| Village Tronic&lt;br /&gt;
| Originally registerd to Steve Yaeger&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 0834&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 2101&lt;br /&gt;
| 0835&lt;br /&gt;
| Phoenix Micro Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 2102&lt;br /&gt;
| 0836&lt;br /&gt;
| Advanced Systems &amp;amp; Software&lt;br /&gt;
| Orignally assigned to Preferred Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2103&lt;br /&gt;
| 0837&lt;br /&gt;
| Rombo Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2104&lt;br /&gt;
| 0838&lt;br /&gt;
| Impulse Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2105&lt;br /&gt;
| 0839&lt;br /&gt;
| Beta Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2106&lt;br /&gt;
| 083A&lt;br /&gt;
| Memory Expansion System, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2107&lt;br /&gt;
| 083B&lt;br /&gt;
| Vortex Computer Systems GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2108&lt;br /&gt;
| 083C&lt;br /&gt;
| Platypus Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2109&lt;br /&gt;
| 083D&lt;br /&gt;
| Gigatron OHG&lt;br /&gt;
|-&lt;br /&gt;
| 2110&lt;br /&gt;
| 083E&lt;br /&gt;
| PG Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2111&lt;br /&gt;
| 083F&lt;br /&gt;
| New Technologies Group&lt;br /&gt;
|-&lt;br /&gt;
| 2112&lt;br /&gt;
| 0840&lt;br /&gt;
| Interactive Video Systems (IVS)&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2113&lt;br /&gt;
| 0841&lt;br /&gt;
| Vector&lt;br /&gt;
| Originally registered to H. K. Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2114&lt;br /&gt;
| 0842&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to C. H. Helfrich Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 2115&lt;br /&gt;
| 0843&lt;br /&gt;
| Xanadu&lt;br /&gt;
|-&lt;br /&gt;
| 2116&lt;br /&gt;
| 0844&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to AMS&lt;br /&gt;
|-&lt;br /&gt;
| 2117&lt;br /&gt;
| 0845&lt;br /&gt;
| X-Pert&lt;br /&gt;
|-&lt;br /&gt;
| 2118&lt;br /&gt;
| 0846&lt;br /&gt;
| The Amiga Centre&lt;br /&gt;
|-&lt;br /&gt;
| 2119&lt;br /&gt;
| 0847&lt;br /&gt;
| Digital Pacific&lt;br /&gt;
|-&lt;br /&gt;
| 2120&lt;br /&gt;
| 0848&lt;br /&gt;
| Solid State Leisure&lt;br /&gt;
|-&lt;br /&gt;
| 2121&lt;br /&gt;
| 0849&lt;br /&gt;
| Hydra Systems&lt;br /&gt;
| Originally registered to Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2122&lt;br /&gt;
| 084A&lt;br /&gt;
| Cumana&lt;br /&gt;
|-&lt;br /&gt;
| 2123&lt;br /&gt;
| 084B&lt;br /&gt;
| KAPS 2C Conception&lt;br /&gt;
|-&lt;br /&gt;
| 2124&lt;br /&gt;
| 084C&lt;br /&gt;
| Mike Mason&lt;br /&gt;
|-&lt;br /&gt;
| 2125&lt;br /&gt;
| 084D&lt;br /&gt;
| For Your Eyes&lt;br /&gt;
|-&lt;br /&gt;
| 2126&lt;br /&gt;
| 084E&lt;br /&gt;
| Volkmar Breitfeld Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2127&lt;br /&gt;
| 084F&lt;br /&gt;
| Sunrize Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2128&lt;br /&gt;
| 0850&lt;br /&gt;
| Scott Advanced Micro Designs&lt;br /&gt;
|-&lt;br /&gt;
| 2129&lt;br /&gt;
| 0851&lt;br /&gt;
| Digital Micronics&lt;br /&gt;
|-&lt;br /&gt;
| 2130&lt;br /&gt;
| 0852&lt;br /&gt;
| Alfa-Laval&lt;br /&gt;
|-&lt;br /&gt;
| 2131&lt;br /&gt;
| 0853&lt;br /&gt;
| Multigros A/S&lt;br /&gt;
|-&lt;br /&gt;
| 2132&lt;br /&gt;
| 0854&lt;br /&gt;
| Archos&lt;br /&gt;
|-&lt;br /&gt;
| 2133&lt;br /&gt;
| 0855&lt;br /&gt;
| Icom Simulations&lt;br /&gt;
|-&lt;br /&gt;
| 2134&lt;br /&gt;
| 0856&lt;br /&gt;
| Commodore Test Engineering Group&lt;br /&gt;
|-&lt;br /&gt;
| 2135&lt;br /&gt;
| 0857&lt;br /&gt;
| Microcreations&lt;br /&gt;
|-&lt;br /&gt;
| 2136&lt;br /&gt;
| 0858&lt;br /&gt;
| Shoestring Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2137&lt;br /&gt;
| 0859&lt;br /&gt;
| Faberushi&lt;br /&gt;
|-&lt;br /&gt;
| 2138&lt;br /&gt;
| 085A&lt;br /&gt;
| Evesham Micro Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2139&lt;br /&gt;
| 085B&lt;br /&gt;
| Panagolin Laser Software&lt;br /&gt;
|-&lt;br /&gt;
| 2140&lt;br /&gt;
| 085C&lt;br /&gt;
| Thomas Rudloff&lt;br /&gt;
|-&lt;br /&gt;
| 2141&lt;br /&gt;
| 085D&lt;br /&gt;
| Daniel Hohabir&lt;br /&gt;
|-&lt;br /&gt;
| 2142&lt;br /&gt;
| 085E&lt;br /&gt;
| GfxBase, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2143&lt;br /&gt;
| 085F&lt;br /&gt;
| Axellabs&lt;br /&gt;
|-&lt;br /&gt;
| 2144&lt;br /&gt;
| 0860&lt;br /&gt;
| Roctec Electronics Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2145&lt;br /&gt;
| 0861&lt;br /&gt;
| Omega Datentechnik&lt;br /&gt;
|-&lt;br /&gt;
| 2146&lt;br /&gt;
| 0862&lt;br /&gt;
| Atlantis&lt;br /&gt;
|-&lt;br /&gt;
| 2147&lt;br /&gt;
| 0863&lt;br /&gt;
| Skytec Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2148&lt;br /&gt;
| 0864&lt;br /&gt;
| Protar Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2149&lt;br /&gt;
| 0865&lt;br /&gt;
| ACS&lt;br /&gt;
|-&lt;br /&gt;
| 2150&lt;br /&gt;
| 0866&lt;br /&gt;
| Software Results Enterprises&lt;br /&gt;
| Originally registered to University of Illinois&lt;br /&gt;
|-&lt;br /&gt;
| 2151&lt;br /&gt;
| 0867&lt;br /&gt;
| Infinity Systems Design Group&lt;br /&gt;
|-&lt;br /&gt;
| 2152&lt;br /&gt;
| 0868&lt;br /&gt;
| Trade It&lt;br /&gt;
|-&lt;br /&gt;
| 2153&lt;br /&gt;
| 0869&lt;br /&gt;
| Suntec, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2154&lt;br /&gt;
| 086A&lt;br /&gt;
| DJW Micro Systems&lt;br /&gt;
| Originally registered to Tritec Marketing&lt;br /&gt;
|-&lt;br /&gt;
| 2155&lt;br /&gt;
| 086B&lt;br /&gt;
| Power Computing Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2156&lt;br /&gt;
| 086C&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 2157&lt;br /&gt;
| 086D&lt;br /&gt;
| Masoboshi GmbH (DCE)&lt;br /&gt;
|-&lt;br /&gt;
| 2158&lt;br /&gt;
| 086E&lt;br /&gt;
| HAL Software Hardware Handel&lt;br /&gt;
|-&lt;br /&gt;
| 2159&lt;br /&gt;
| 086F&lt;br /&gt;
| Mainhattan Data&lt;br /&gt;
| Originally registered to Michael Lamm Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2160&lt;br /&gt;
| 0870&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
| Originally registered to bbdp Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2161&lt;br /&gt;
| 0871&lt;br /&gt;
| Blue Ribbon Soundworks&lt;br /&gt;
| Originally registered to Design Computer Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2162&lt;br /&gt;
| 0872&lt;br /&gt;
| XPert&lt;br /&gt;
| Originally registered to The Station&lt;br /&gt;
|-&lt;br /&gt;
| 2163&lt;br /&gt;
| 0873&lt;br /&gt;
| DelaComp&lt;br /&gt;
| Originally registered to Bryan Williams&lt;br /&gt;
|-&lt;br /&gt;
| 2164&lt;br /&gt;
| 0874&lt;br /&gt;
| Superformance Computer Engineering GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2165&lt;br /&gt;
| 0875&lt;br /&gt;
| Overland Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2166&lt;br /&gt;
| 0876&lt;br /&gt;
| Thomas Hamren&lt;br /&gt;
|-&lt;br /&gt;
| 2167&lt;br /&gt;
| 0877&lt;br /&gt;
| Village Tronic&lt;br /&gt;
|-&lt;br /&gt;
| 2168&lt;br /&gt;
| 0878&lt;br /&gt;
| Toolbox Design&lt;br /&gt;
|-&lt;br /&gt;
| 2169&lt;br /&gt;
| 0879&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
|-&lt;br /&gt;
| 2170&lt;br /&gt;
| 087A&lt;br /&gt;
| Superformance&lt;br /&gt;
|-&lt;br /&gt;
| 2171&lt;br /&gt;
| 087B&lt;br /&gt;
| Utilities Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2172&lt;br /&gt;
| 087C&lt;br /&gt;
| phase 5&lt;br /&gt;
|-&lt;br /&gt;
| 2173&lt;br /&gt;
| 087D&lt;br /&gt;
| Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2174&lt;br /&gt;
| 087E&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 2175&lt;br /&gt;
| 087F&lt;br /&gt;
| James Cook University of North Queensland&lt;br /&gt;
|-&lt;br /&gt;
| 2176&lt;br /&gt;
| 0880&lt;br /&gt;
| AmiTrix Development&lt;br /&gt;
|-&lt;br /&gt;
| 2177&lt;br /&gt;
| 0881&lt;br /&gt;
| Ferranti&lt;br /&gt;
|-&lt;br /&gt;
| 2178&lt;br /&gt;
| 0882&lt;br /&gt;
| Leviathan Development&lt;br /&gt;
|-&lt;br /&gt;
| 2179&lt;br /&gt;
| 0883&lt;br /&gt;
| United Video Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2180&lt;br /&gt;
| 0884&lt;br /&gt;
| GPSoft Pty. Ltd.&lt;br /&gt;
| Originally registered to Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2181&lt;br /&gt;
| 0885&lt;br /&gt;
| ArMAX&lt;br /&gt;
| Oliver Bausch&lt;br /&gt;
|-&lt;br /&gt;
| 2182&lt;br /&gt;
| 0886&lt;br /&gt;
| CP Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2183&lt;br /&gt;
| 0887&lt;br /&gt;
| AMOK - Amiga Module &amp;amp;amp; Oberon Klub&lt;br /&gt;
|-&lt;br /&gt;
| 2184&lt;br /&gt;
| 0888&lt;br /&gt;
| ITEK Neser &amp;amp;amp; Sieber GbR&lt;br /&gt;
|-&lt;br /&gt;
| 2185&lt;br /&gt;
| 0889&lt;br /&gt;
| Phillip C. Lello&lt;br /&gt;
|-&lt;br /&gt;
| 2186&lt;br /&gt;
| 088A&lt;br /&gt;
| Cyborg Design Services&lt;br /&gt;
|-&lt;br /&gt;
| 2187&lt;br /&gt;
| 088B&lt;br /&gt;
| G2 Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2188&lt;br /&gt;
| 088C&lt;br /&gt;
| Pro System Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2189&lt;br /&gt;
| 088D&lt;br /&gt;
| ZEUS Electronic&lt;br /&gt;
| Originally registered to MSPI (Markt &amp;amp;amp; Technik)&lt;br /&gt;
|-&lt;br /&gt;
| 2190&lt;br /&gt;
| 088E&lt;br /&gt;
| Altatech&lt;br /&gt;
|-&lt;br /&gt;
| 2191&lt;br /&gt;
| 088F&lt;br /&gt;
| NewTek&lt;br /&gt;
|-&lt;br /&gt;
| 2192&lt;br /&gt;
| 0890&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
| Originally registered to Hardware Design Udo Neuroth&lt;br /&gt;
|-&lt;br /&gt;
| 2193&lt;br /&gt;
| 0891&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Viona Development&lt;br /&gt;
|-&lt;br /&gt;
| 2194&lt;br /&gt;
| 0892&lt;br /&gt;
| Amitek&lt;br /&gt;
| Originally assigned to Marpet Developments&lt;br /&gt;
|-&lt;br /&gt;
| 2195&lt;br /&gt;
| 0893&lt;br /&gt;
| Ingenieurbuero Helfrich&lt;br /&gt;
|-&lt;br /&gt;
| 2196&lt;br /&gt;
| 0894&lt;br /&gt;
| The Neo Group&lt;br /&gt;
|-&lt;br /&gt;
| 2197&lt;br /&gt;
| 0895&lt;br /&gt;
| Cyon&lt;br /&gt;
|-&lt;br /&gt;
| 2198&lt;br /&gt;
| 0896&lt;br /&gt;
| Bob Research Group&lt;br /&gt;
|-&lt;br /&gt;
| 2199&lt;br /&gt;
| 0897&lt;br /&gt;
| Richmond Sound Design Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2200&lt;br /&gt;
| 0898&lt;br /&gt;
| US Cybernetics&lt;br /&gt;
|-&lt;br /&gt;
| 2201&lt;br /&gt;
| 0899&lt;br /&gt;
| Fulvio Ieva&lt;br /&gt;
|-&lt;br /&gt;
| 2202&lt;br /&gt;
| 089A&lt;br /&gt;
| Silicon Studio&lt;br /&gt;
|-&lt;br /&gt;
| 2203&lt;br /&gt;
| 089B&lt;br /&gt;
| MacroSystems (USA)&lt;br /&gt;
| Was named Micro System Devices&lt;br /&gt;
|-&lt;br /&gt;
| 2204&lt;br /&gt;
| 089C&lt;br /&gt;
| Conspector Entertainment&lt;br /&gt;
|-&lt;br /&gt;
| 2205&lt;br /&gt;
| 089D&lt;br /&gt;
| Laserforum&lt;br /&gt;
|-&lt;br /&gt;
| 2206&lt;br /&gt;
| 089E&lt;br /&gt;
| Elbox Computer&lt;br /&gt;
| Mistakenly used by Index Information Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2207&lt;br /&gt;
| 089F&lt;br /&gt;
| Applied Magic Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2208&lt;br /&gt;
| 08A0&lt;br /&gt;
| SDL Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2560&lt;br /&gt;
| 0A00&lt;br /&gt;
| Harms&lt;br /&gt;
|-&lt;br /&gt;
| 2588&lt;br /&gt;
| 0A1C&lt;br /&gt;
| A1K.org Community&lt;br /&gt;
|-&lt;br /&gt;
| 2640&lt;br /&gt;
| 0A50&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 3084&lt;br /&gt;
| 0C0C&lt;br /&gt;
| Team 4&lt;br /&gt;
|-&lt;br /&gt;
| 3643&lt;br /&gt;
| 0E3B&lt;br /&gt;
| E3B&lt;br /&gt;
| Michael Boehmer&lt;br /&gt;
|-&lt;br /&gt;
| 3855&lt;br /&gt;
| 0F0F&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 4096&lt;br /&gt;
| 1000&lt;br /&gt;
| MegaMicro&lt;br /&gt;
|-&lt;br /&gt;
| 4110&lt;br /&gt;
| 100E&lt;br /&gt;
| DigiFeX&lt;br /&gt;
|-&lt;br /&gt;
| 4136&lt;br /&gt;
| 1028&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
|-&lt;br /&gt;
| 4149&lt;br /&gt;
| 1035&lt;br /&gt;
| PROTAR&lt;br /&gt;
|-&lt;br /&gt;
| 4369&lt;br /&gt;
| 1111&lt;br /&gt;
| Frank Strauß Elektronik&lt;br /&gt;
| Also used by Kupke&lt;br /&gt;
|-&lt;br /&gt;
| 4626&lt;br /&gt;
| 1212&lt;br /&gt;
| Individual Computers&lt;br /&gt;
|-&lt;br /&gt;
| 4648&lt;br /&gt;
| 1228&lt;br /&gt;
| Flesch Hornemann Computer Elec.&lt;br /&gt;
|-&lt;br /&gt;
| 4680&lt;br /&gt;
| 1248&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 4711&lt;br /&gt;
| 1267&lt;br /&gt;
| RBM digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 4754&lt;br /&gt;
| 1292&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 5000&lt;br /&gt;
| 1388&lt;br /&gt;
| ITH&lt;br /&gt;
|-&lt;br /&gt;
| 5001&lt;br /&gt;
| 1389&lt;br /&gt;
| VMC&lt;br /&gt;
|-&lt;br /&gt;
| 5010&lt;br /&gt;
| 1392&lt;br /&gt;
| Ambience Creation Technology&lt;br /&gt;
|-&lt;br /&gt;
| 5011&lt;br /&gt;
| 1393&lt;br /&gt;
| Creative Development&lt;br /&gt;
|-&lt;br /&gt;
| 5012&lt;br /&gt;
| 1394&lt;br /&gt;
| Georg Braun&lt;br /&gt;
|-&lt;br /&gt;
| 5013&lt;br /&gt;
| 1395&lt;br /&gt;
| Swedish User Group of Amiga&lt;br /&gt;
|-&lt;br /&gt;
| 5014&lt;br /&gt;
| 1396&lt;br /&gt;
| Jakub Bednarski&lt;br /&gt;
|-&lt;br /&gt;
| 5015&lt;br /&gt;
| 1397&lt;br /&gt;
| KryoFlux, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5016&lt;br /&gt;
| 1398&lt;br /&gt;
| Igor Majstorovic&lt;br /&gt;
|-&lt;br /&gt;
| 5017&lt;br /&gt;
| 1399&lt;br /&gt;
| Alastair M. Robinson&lt;br /&gt;
|-&lt;br /&gt;
| 5018&lt;br /&gt;
| 139A&lt;br /&gt;
| Austex Software&lt;br /&gt;
|-&lt;br /&gt;
| 5019&lt;br /&gt;
| 139B&lt;br /&gt;
| Sören Gust&lt;br /&gt;
|-&lt;br /&gt;
| 5020&lt;br /&gt;
| 139C&lt;br /&gt;
| Rok Krajnc&lt;br /&gt;
|-&lt;br /&gt;
| 5030&lt;br /&gt;
| 13A6&lt;br /&gt;
| Tim Tashpulatov&lt;br /&gt;
|-&lt;br /&gt;
| 5040&lt;br /&gt;
| 13B0&lt;br /&gt;
| 7-bit&lt;br /&gt;
|-&lt;br /&gt;
| 5050&lt;br /&gt;
| 13BA&lt;br /&gt;
| Sakura IT&lt;br /&gt;
|-&lt;br /&gt;
| 5060&lt;br /&gt;
| 13C4&lt;br /&gt;
| FPGAArcade&lt;br /&gt;
|-&lt;br /&gt;
| 5070&lt;br /&gt;
| 13CE&lt;br /&gt;
| CancerSoft Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 5080&lt;br /&gt;
| 13D8&lt;br /&gt;
| Stephen Leary&lt;br /&gt;
|-&lt;br /&gt;
| 5090&lt;br /&gt;
| 13E2&lt;br /&gt;
| DMA Softlab LLC&lt;br /&gt;
|-&lt;br /&gt;
| 5100&lt;br /&gt;
| 13EC&lt;br /&gt;
| Brookhouse Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 5110&lt;br /&gt;
| 13F6&lt;br /&gt;
| Eduardo Arana&lt;br /&gt;
|-&lt;br /&gt;
| 5120&lt;br /&gt;
| 1400&lt;br /&gt;
| CS-LAB&lt;br /&gt;
|-&lt;br /&gt;
| 5130&lt;br /&gt;
| 140A&lt;br /&gt;
| Robert Miranda&lt;br /&gt;
|-&lt;br /&gt;
| 5140&lt;br /&gt;
| 1414&lt;br /&gt;
| RastPort&lt;br /&gt;
|-&lt;br /&gt;
| 5132&lt;br /&gt;
| 140C&lt;br /&gt;
| UAS Interface Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5500&lt;br /&gt;
| 157C&lt;br /&gt;
| Inhouse Information&lt;br /&gt;
|-&lt;br /&gt;
| 5768&lt;br /&gt;
| 1688&lt;br /&gt;
| Bio Con&lt;br /&gt;
|-&lt;br /&gt;
| 6148&lt;br /&gt;
| 1804&lt;br /&gt;
| HK-Computer&lt;br /&gt;
|-&lt;br /&gt;
| 6502&lt;br /&gt;
| 1966&lt;br /&gt;
| Cloanto&lt;br /&gt;
|-&lt;br /&gt;
| 7777&lt;br /&gt;
| 1E61&lt;br /&gt;
| Rafal Gabriel Chyla&lt;br /&gt;
|-&lt;br /&gt;
| 8215&lt;br /&gt;
| 2017&lt;br /&gt;
| Vortex&lt;br /&gt;
|-&lt;br /&gt;
| 8244&lt;br /&gt;
| 2034&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 8290&lt;br /&gt;
| 2062&lt;br /&gt;
| Expansion Systems&lt;br /&gt;
|-&lt;br /&gt;
| 8448&lt;br /&gt;
| 2100&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 8512&lt;br /&gt;
| 2140&lt;br /&gt;
| Phase 5 Digital Products&lt;br /&gt;
|-&lt;br /&gt;
| 8553&lt;br /&gt;
| 2169&lt;br /&gt;
| Digital Processing Systems Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 8704&lt;br /&gt;
| 2200&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 8738&lt;br /&gt;
| 2222&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 9512&lt;br /&gt;
| 2528&lt;br /&gt;
| Tower Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 10676&lt;br /&gt;
| 29B4&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 14195&lt;br /&gt;
| 3773&lt;br /&gt;
| Media-net-Point&lt;br /&gt;
|-&lt;br /&gt;
| 14501&lt;br /&gt;
| 38A5&lt;br /&gt;
| Petsoff, Finland&lt;br /&gt;
|-&lt;br /&gt;
| 16375&lt;br /&gt;
| 3FF7&lt;br /&gt;
| Uwe Gerlach&lt;br /&gt;
|-&lt;br /&gt;
| 16707&lt;br /&gt;
| 4143&lt;br /&gt;
| Ateo Concepts&lt;br /&gt;
|-&lt;br /&gt;
| 16708&lt;br /&gt;
| 4144&lt;br /&gt;
| ALiENDESiGN&lt;br /&gt;
|-&lt;br /&gt;
| 16945&lt;br /&gt;
| 4231&lt;br /&gt;
| A.C.T.&lt;br /&gt;
|-&lt;br /&gt;
| 17740&lt;br /&gt;
| 454C&lt;br /&gt;
| HK-Computer (ELSAT)&lt;br /&gt;
|-&lt;br /&gt;
| 18260&lt;br /&gt;
| 4754&lt;br /&gt;
| MacroSystems (Germany)&lt;br /&gt;
|-&lt;br /&gt;
| 19796&lt;br /&gt;
| 4D54&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 22359&lt;br /&gt;
| 5757&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 26464&lt;br /&gt;
| 6760&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 26470&lt;br /&gt;
| 6766&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 28014&lt;br /&gt;
| 6D6E&lt;br /&gt;
| MNT Media and Technology UG&lt;br /&gt;
|-&lt;br /&gt;
| 32768&lt;br /&gt;
| 8000&lt;br /&gt;
| M.A.S.T.&lt;br /&gt;
|-&lt;br /&gt;
| 42240&lt;br /&gt;
| A500&lt;br /&gt;
| Aethreum Digital&lt;br /&gt;
|-&lt;br /&gt;
| 43437&lt;br /&gt;
| A9AD&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 43521&lt;br /&gt;
| AA01&lt;br /&gt;
| Cameron&lt;br /&gt;
|-&lt;br /&gt;
| 43537&lt;br /&gt;
| AA11&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 44359&lt;br /&gt;
| AD47&lt;br /&gt;
| Matay&lt;br /&gt;
|-&lt;br /&gt;
| 46504&lt;br /&gt;
| B5A8&lt;br /&gt;
| Phoenix&lt;br /&gt;
|-&lt;br /&gt;
| 49160&lt;br /&gt;
| C008&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 61453&lt;br /&gt;
| F00D&lt;br /&gt;
| Forefront Technologies Inc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For any changes/additions to this registry please use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9331</id>
		<title>Amiga Hardware Manufacturer ID Registry</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9331"/>
		<updated>2018-04-30T04:00:00Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Registry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= How to Obtain a Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Manufacturer&#039;s numbers are assigned by the AmigaOS development team. To obtain your unique manufacturer number use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;br /&gt;
&lt;br /&gt;
Be sure and include your name, email and the type of expansion product you are developing.&lt;br /&gt;
&lt;br /&gt;
= Your Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Attention hardware manufacturers. If you are developing a hardware expansion product for the Classic Amiga (e.g. 500, 2000, 3000) then you will need to obtain a special manufacturer ID number from the AmigaOS development team to identify your product. This manufacturer number is used by the Amiga to link your hardware with its driver software at boot time.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number is part of the special protocol that the Amiga uses to automatically configure all expansion devices on the bus without the user having to cut jumpers or adjust dip switches. This is called auto-config.&lt;br /&gt;
&lt;br /&gt;
At start-up time, the system first polls each board in the system and assigns the board its own address space. If it is a memory board, its RAM is linked into the memory free pool. Later in the boot sequence, after DOS is initialized, the binddrivers program is run. Binddrivers will search the directory SYS:Expansion for the drivers that go with the boards.&lt;br /&gt;
&lt;br /&gt;
To do this binddrivers looks in the Tool Type field of all icon files in SYS:Expansion. If the first seven bytes of the Tool Type field are &amp;quot;PRODUCT&amp;quot;, then this is an icon file for a driver.&lt;br /&gt;
&lt;br /&gt;
Binddrivers will then attempt to match the drivers it has found with the boards that were found earlier. This is where your manufacturer number comes in.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number goes in two places. First, it is burned in hex form into the PAL which is part of ALL auto-config expansion products. Second, it appears in ASCII in the Tool Type field of the icon file for your product&#039;s driver. By matching these two numbers, the Amiga can automatically configure your board and bind it&#039;s software driver into the system as well.&lt;br /&gt;
&lt;br /&gt;
The manufacturer&#039;s number is a 16-bit ID which appears in PAL offsets $10-$17. There is also an 8-bit product number which you assign. The product number is for uniquely identifying different products from the same vendor. The product number will appear in PAL offsets $04-$07. This gives you a total of 24 bits to identify each of your products.&lt;br /&gt;
&lt;br /&gt;
These 24 bits of information in the PAL which identify your product are matched against the information in the Tool Type field of all icon files in the SYS:Expansion drawer. For example, suppose you are manufacturer #1019. You have two products, #1 and #2 which both use the same driver. The icon for your driver for these two products would have a Tool Type set to &amp;quot;PRODUCT=1019/1|1019/2&amp;quot;. This means: I am an icon for a driver that works with product number 1 or 2 from manufacturer 1019, now bind me. Spaces are not legal. Here are two other examples:&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1208/11&lt;br /&gt;
: is the Tool Type for a driver for product 11 from manufacturer number 1208.&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1017&lt;br /&gt;
: is the Tool Type for a driver for any product from manufacturer number 1017.&lt;br /&gt;
&lt;br /&gt;
For an informal explanation of the auto-configuration process, see the chapter on Software Expansion Architecture from the 2nd Annual Amiga Developer&#039;s Conference Notes (available on ADCD 2.1). For the details of timing, power, the PAL equations and PAL address specifications and the expansion library documentation, see sections 3.1 to 3.3 of the A500/A2000 Technical Reference Manual. The original auto-config spec appears in the A1000 Schematics and Expansion Specification.&lt;br /&gt;
&lt;br /&gt;
The auto-config process makes the addition of expansion products to the system very easy. All the user has to do is put the board in any slot and copy the driver from the release disk to his own SYS:Expansion drawer. Everything else is automatic. There are no jumpers or dip switches to set. Best of all, you will get a lot less support calls asking how to make your product work with the XYZ-Corp-battery-backed-clock.&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
Some notes on hardware manufacturer ID assignment.&lt;br /&gt;
&lt;br /&gt;
* Manufacturer ID numbers are assigned free of charge.&lt;br /&gt;
* Please provide the following information when requesting an ID:&lt;br /&gt;
*# Name of the company or person&lt;br /&gt;
*# Postal address/contact address&lt;br /&gt;
*# Name of the contact person, with a corresponding e-mail address&lt;br /&gt;
*# A brief description of the kind of products you want to produce&lt;br /&gt;
* All ID numbers smaller than 5000 must be considered unsafe because no information exists on which numbers exactly were taken during the time Commodore, Inc. disintegrated.&lt;br /&gt;
* ID numbers in the range 8192 to 18841 must be considered unsafe because some hardware developers mistook the numbers assigned to them to be given in hexadecimal format. Hence 0x2000 = 8192 and 0x4999 = 18841.&lt;br /&gt;
&lt;br /&gt;
= Example code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
/* Here is a short program which will tell you   */&lt;br /&gt;
/* about the expansion boards configured in your */&lt;br /&gt;
/* system without you opening up the machine.    */&lt;br /&gt;
/* Code by Bill Koester of CATS                  */&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
#include &amp;lt;libraries/configvars.h&amp;gt;&lt;br /&gt;
#include &amp;lt;libraries/expansion.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct ExpansionBase *ExpansionBase;&lt;br /&gt;
&lt;br /&gt;
void cleanup();&lt;br /&gt;
void printdev();&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   struct ConfigDev *MyConfigDev;&lt;br /&gt;
&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
   /* Open the expansion library,      */&lt;br /&gt;
   /* if there is a problem then exit  */&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   ExpansionBase =(struct ExpansionBase *) OpenLibrary(EXPANSIONNAME,0);&lt;br /&gt;
   if(ExpansionBase==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error opening expansion library!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
   /* Use FindConfigDev to get info on the first */&lt;br /&gt;
   /* expansion board on the list maintained by  */&lt;br /&gt;
   /* Exec.  If there are no expansion boards in */&lt;br /&gt;
   /* the system then exit.                      */&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = NULL;&lt;br /&gt;
&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
  /* FindConfigDev(oldConfigDev,manufacturer,product) */&lt;br /&gt;
  /* oldConfigDev = NULL for the top of the list      */&lt;br /&gt;
  /* manufacturer = -1 for any manufacturer           */&lt;br /&gt;
  /* product      = -1 for any product                */&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = FindConfigDev(NULL,-1,-1);&lt;br /&gt;
&lt;br /&gt;
   if(MyConfigDev==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;No Configured Devices found!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printdev(MyConfigDev);&lt;br /&gt;
&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
   /* OK, there is at least one board,  */&lt;br /&gt;
   /* so loop and get the entire list   */&lt;br /&gt;
   /* printing as we go with printdev() */&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   while(MyConfigDev = FindConfigDev(MyConfigDev,-1,-1))&lt;br /&gt;
   {&lt;br /&gt;
      printdev(MyConfigDev);&lt;br /&gt;
   }&lt;br /&gt;
   cleanup();&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
/* Close up shop...  */&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
void cleanup()&lt;br /&gt;
{&lt;br /&gt;
   if(ExpansionBase)&lt;br /&gt;
      CloseLibrary(ExpansionBase);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
/* Print out the contents of the    */&lt;br /&gt;
/* dev structure for this expansion */&lt;br /&gt;
/* product.                         */&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
void printdev(dev)&lt;br /&gt;
struct ConfigDev *dev;&lt;br /&gt;
{&lt;br /&gt;
   char buff[200];&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Flags          = &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags==NULL)&lt;br /&gt;
      printf(&amp;quot;NULL  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_SHUTUP)&lt;br /&gt;
      printf(&amp;quot;CDF_SHUTUP  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_CONFIGME)&lt;br /&gt;
      printf(&amp;quot;CDF_CONFIGME  &amp;quot;);&lt;br /&gt;
   printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot;Board Address  = %x\n&amp;quot;,dev-&amp;gt;cd_BoardAddr);&lt;br /&gt;
   printf(&amp;quot;Board Size     = %d bytes\n&amp;quot;,dev-&amp;gt;cd_BoardSize);&lt;br /&gt;
   printf(&amp;quot;Slot  Address  = %d\n&amp;quot;,dev-&amp;gt;cd_SlotAddr);&lt;br /&gt;
   printf(&amp;quot;Slot  Size     = %d\n&amp;quot;,dev-&amp;gt;cd_SlotSize);&lt;br /&gt;
   printf(&amp;quot;Driver code at   %x\n&amp;quot;,dev-&amp;gt;cd_Driver);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;er_Type         = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Type);&lt;br /&gt;
   printf(&amp;quot;er_Product      = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Product);&lt;br /&gt;
   printf(&amp;quot;er_Flags        = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Flags);&lt;br /&gt;
   printf(&amp;quot;er_Reserved03   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved03);&lt;br /&gt;
   printf(&amp;quot;er_Manufacturer = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Manufacturer);&lt;br /&gt;
   printf(&amp;quot;er_SerialNumber = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_SerialNumber);&lt;br /&gt;
   printf(&amp;quot;er_InitDiagVec  = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_InitDiagVec);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0c   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0c);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0d   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0d);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0e   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0e);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0f   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0f);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Hit Return to continue:\n&amp;quot;);&lt;br /&gt;
   gets(buff);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Registry =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (decimal)&lt;br /&gt;
! ID (hexadecimal)&lt;br /&gt;
! Manufacturer&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 211&lt;br /&gt;
| 00D3&lt;br /&gt;
| Pacific Peripherals/Profex&lt;br /&gt;
|-&lt;br /&gt;
| 221&lt;br /&gt;
| 00DD&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 256&lt;br /&gt;
| 0100&lt;br /&gt;
| Memphis&lt;br /&gt;
| Originally registered to MacroSystems US&lt;br /&gt;
|-&lt;br /&gt;
| 512&lt;br /&gt;
| 0200&lt;br /&gt;
| 3-State Computertechnik&lt;br /&gt;
|-&lt;br /&gt;
| 513&lt;br /&gt;
| 0201&lt;br /&gt;
| Commodore (Braunschweig)&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| 0202&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
|-&lt;br /&gt;
| 515&lt;br /&gt;
| 0203&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
| Originally registered to Combitech/Macrosystem&lt;br /&gt;
|-&lt;br /&gt;
| 756&lt;br /&gt;
| 02F4&lt;br /&gt;
| Progressive Peripherals &amp;amp; Software&lt;br /&gt;
|-&lt;br /&gt;
| 767&lt;br /&gt;
| 02FF&lt;br /&gt;
| Kolff Computer Supplies&lt;br /&gt;
|-&lt;br /&gt;
| 1001&lt;br /&gt;
| 03E9&lt;br /&gt;
| Tecmar&lt;br /&gt;
|-&lt;br /&gt;
| 1002&lt;br /&gt;
| 03EA&lt;br /&gt;
| Telesys&lt;br /&gt;
|-&lt;br /&gt;
| 1003&lt;br /&gt;
| 03EB&lt;br /&gt;
| The Micro-Forge&lt;br /&gt;
|-&lt;br /&gt;
| 1004&lt;br /&gt;
| 03EC&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
| Originally registered to Card Co. (Supra)&lt;br /&gt;
|-&lt;br /&gt;
| 1005&lt;br /&gt;
| 03ED&lt;br /&gt;
| A-Squared&lt;br /&gt;
|-&lt;br /&gt;
| 1006&lt;br /&gt;
| 03EE&lt;br /&gt;
| Comspec Communications&lt;br /&gt;
|-&lt;br /&gt;
| 1007&lt;br /&gt;
| 03EF&lt;br /&gt;
| HT Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1008&lt;br /&gt;
| 03F0&lt;br /&gt;
| RDS Software&lt;br /&gt;
|-&lt;br /&gt;
| 1009&lt;br /&gt;
| 03F1&lt;br /&gt;
| Anakin Research&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| 03F2&lt;br /&gt;
| MicroBotics&lt;br /&gt;
|-&lt;br /&gt;
| 1011&lt;br /&gt;
| 03F3&lt;br /&gt;
| Bob Krauth&lt;br /&gt;
|-&lt;br /&gt;
| 1012&lt;br /&gt;
| 03F4&lt;br /&gt;
| Access Associates (Alegra)&lt;br /&gt;
|-&lt;br /&gt;
| 1013&lt;br /&gt;
| 03F5&lt;br /&gt;
| Mini Comp Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 1014&lt;br /&gt;
| 03F6&lt;br /&gt;
| Cypress Technology&lt;br /&gt;
|-&lt;br /&gt;
| 1015&lt;br /&gt;
| 03F7&lt;br /&gt;
| Fuller Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1016&lt;br /&gt;
| 03F8&lt;br /&gt;
| Galaxy Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1017&lt;br /&gt;
| 03F9&lt;br /&gt;
| ADA Research&lt;br /&gt;
|-&lt;br /&gt;
| 1018&lt;br /&gt;
| 03FA&lt;br /&gt;
| Computer Service Italia&lt;br /&gt;
|-&lt;br /&gt;
| 1019&lt;br /&gt;
| 03FB&lt;br /&gt;
| Amigo&lt;br /&gt;
|-&lt;br /&gt;
| 1020&lt;br /&gt;
| 03FC&lt;br /&gt;
| Micro-Solutions Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1021&lt;br /&gt;
| 03FD&lt;br /&gt;
| Stacar International&lt;br /&gt;
|-&lt;br /&gt;
| 1022&lt;br /&gt;
| 03FE&lt;br /&gt;
| Video Precisions&lt;br /&gt;
|-&lt;br /&gt;
| 1023&lt;br /&gt;
| 03FF&lt;br /&gt;
| ASDG, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1025&lt;br /&gt;
| 0401&lt;br /&gt;
| Ing. Buero Kalawsky&lt;br /&gt;
|-&lt;br /&gt;
| 1026&lt;br /&gt;
| 0402&lt;br /&gt;
| Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 1027&lt;br /&gt;
| 0403&lt;br /&gt;
| Interplan Unternehmensberatung&lt;br /&gt;
|-&lt;br /&gt;
| 1028&lt;br /&gt;
| 0404&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
| Originally registered to Peter Ohlich&lt;br /&gt;
|-&lt;br /&gt;
| 1030&lt;br /&gt;
| 0406&lt;br /&gt;
| Commodore (Lowell University)&lt;br /&gt;
| Originally registered to Productivity Center&lt;br /&gt;
|-&lt;br /&gt;
| 1041&lt;br /&gt;
| 0411&lt;br /&gt;
| Design Labs&lt;br /&gt;
|-&lt;br /&gt;
| 1042&lt;br /&gt;
| 0412&lt;br /&gt;
| MCS&lt;br /&gt;
|-&lt;br /&gt;
| 1043&lt;br /&gt;
| 0413&lt;br /&gt;
| B. J. Freeman&lt;br /&gt;
|-&lt;br /&gt;
| 1044&lt;br /&gt;
| 0414&lt;br /&gt;
| Side Effects Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1045&lt;br /&gt;
| 0415&lt;br /&gt;
| Oklahoma Personal Comp.&lt;br /&gt;
|-&lt;br /&gt;
| 1046&lt;br /&gt;
| 0416&lt;br /&gt;
| Advanced Micro Innovations&lt;br /&gt;
|-&lt;br /&gt;
| 1047&lt;br /&gt;
| 0417&lt;br /&gt;
| Industrial Support Services&lt;br /&gt;
|-&lt;br /&gt;
| 1048&lt;br /&gt;
| 0418&lt;br /&gt;
| Technisoft&lt;br /&gt;
|-&lt;br /&gt;
| 1049&lt;br /&gt;
| 0419&lt;br /&gt;
| Prolific, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1050&lt;br /&gt;
| 041A&lt;br /&gt;
| Softeam, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1051&lt;br /&gt;
| 041B&lt;br /&gt;
| GRC Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1052&lt;br /&gt;
| 041C&lt;br /&gt;
| David Lai&lt;br /&gt;
|-&lt;br /&gt;
| 1053&lt;br /&gt;
| 041D&lt;br /&gt;
| Ameristar Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 1054&lt;br /&gt;
| 041E&lt;br /&gt;
| Cline Refrigeration&lt;br /&gt;
|-&lt;br /&gt;
| 1055&lt;br /&gt;
| 041F&lt;br /&gt;
| Cardiac Pacemakers, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1056&lt;br /&gt;
| 0420&lt;br /&gt;
| Supra Corp. (Creative Microsystems)&lt;br /&gt;
|-&lt;br /&gt;
| 1057&lt;br /&gt;
| 0421&lt;br /&gt;
| Wayne Diener&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| 0422&lt;br /&gt;
| Computer Systems Associates (CSA)&lt;br /&gt;
|-&lt;br /&gt;
| 1059&lt;br /&gt;
| 0423&lt;br /&gt;
| Trionix, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1060&lt;br /&gt;
| 0424&lt;br /&gt;
| David Lucas&lt;br /&gt;
|-&lt;br /&gt;
| 1061&lt;br /&gt;
| 0425&lt;br /&gt;
| Analog Precision&lt;br /&gt;
| Also assigned to D &amp;amp; L Distributing&lt;br /&gt;
|-&lt;br /&gt;
| 1267&lt;br /&gt;
| 04F3&lt;br /&gt;
| RBM Digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 1282&lt;br /&gt;
| 0502&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
|-&lt;br /&gt;
| 1337&lt;br /&gt;
| 0539&lt;br /&gt;
| Thomas Stenzel (DaFR34K)&lt;br /&gt;
|-&lt;br /&gt;
| 1576&lt;br /&gt;
| 0628&lt;br /&gt;
| Boris Križma&lt;br /&gt;
|-&lt;br /&gt;
| 1761&lt;br /&gt;
| 06E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 1803&lt;br /&gt;
| 070B&lt;br /&gt;
| UAE Amiga Emulator&lt;br /&gt;
|-&lt;br /&gt;
| 2002&lt;br /&gt;
| 07D2&lt;br /&gt;
| Mimetics Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2003&lt;br /&gt;
| 07D3&lt;br /&gt;
| ACDA&lt;br /&gt;
|-&lt;br /&gt;
| 2004&lt;br /&gt;
| 07D4&lt;br /&gt;
| Finn R. Jacobsen&lt;br /&gt;
|-&lt;br /&gt;
| 2005&lt;br /&gt;
| 07D5&lt;br /&gt;
| Elthen Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2006&lt;br /&gt;
| 07D6&lt;br /&gt;
| Nine Tiles Computer Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2007&lt;br /&gt;
| 07D7&lt;br /&gt;
| Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2008&lt;br /&gt;
| 07D8&lt;br /&gt;
| Bell &amp;amp;amp; Howell&lt;br /&gt;
|-&lt;br /&gt;
| 2009&lt;br /&gt;
| 07D9&lt;br /&gt;
| Roland Kochler&lt;br /&gt;
|-&lt;br /&gt;
| 2010&lt;br /&gt;
| 07DA&lt;br /&gt;
| Byte Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2011&lt;br /&gt;
| 07DB&lt;br /&gt;
| Reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2012&lt;br /&gt;
| 07DC&lt;br /&gt;
| DKB, Inc.&lt;br /&gt;
| Previously named Michigan Software&lt;br /&gt;
|-&lt;br /&gt;
| 2013&lt;br /&gt;
| 07DD&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2014&lt;br /&gt;
| 07DE&lt;br /&gt;
| Sysaphus Software&lt;br /&gt;
|-&lt;br /&gt;
| 2015&lt;br /&gt;
| 07DF&lt;br /&gt;
| Digitronics&lt;br /&gt;
|-&lt;br /&gt;
| 2016&lt;br /&gt;
| 07E0&lt;br /&gt;
| Akron Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2017&lt;br /&gt;
| 07E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 2018&lt;br /&gt;
| 07E2&lt;br /&gt;
| Calmos&lt;br /&gt;
|-&lt;br /&gt;
| 2019&lt;br /&gt;
| 07E3&lt;br /&gt;
| Dover Research&lt;br /&gt;
|-&lt;br /&gt;
| 2020&lt;br /&gt;
| 07E4&lt;br /&gt;
| David Krehbiel&lt;br /&gt;
|-&lt;br /&gt;
| 2021&lt;br /&gt;
| 07E5&lt;br /&gt;
| Synergy Peripheral Systems&lt;br /&gt;
| Also known as California Access&lt;br /&gt;
|-&lt;br /&gt;
| 2022&lt;br /&gt;
| 07E6&lt;br /&gt;
| Xetec&lt;br /&gt;
|-&lt;br /&gt;
| 2023&lt;br /&gt;
| 07E7&lt;br /&gt;
| Micron Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2024&lt;br /&gt;
| 07E8&lt;br /&gt;
| CH Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2025&lt;br /&gt;
| 07E9&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2026&lt;br /&gt;
| 07EA&lt;br /&gt;
| Progressive Peripherals &amp;amp;amp; Software&lt;br /&gt;
| Also used by Ateo&lt;br /&gt;
|-&lt;br /&gt;
| 2027&lt;br /&gt;
| 07EB&lt;br /&gt;
| Wicat Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2028&lt;br /&gt;
| 07EC&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2029&lt;br /&gt;
| 07ED&lt;br /&gt;
| Delaware Valley Software&lt;br /&gt;
|-&lt;br /&gt;
| 2030&lt;br /&gt;
| 07EE&lt;br /&gt;
| Palomax&lt;br /&gt;
|-&lt;br /&gt;
| 2031&lt;br /&gt;
| 07EF&lt;br /&gt;
| Incognito Software&lt;br /&gt;
|-&lt;br /&gt;
| 2032&lt;br /&gt;
| 07F0&lt;br /&gt;
| Jadesign&lt;br /&gt;
|-&lt;br /&gt;
| 2033&lt;br /&gt;
| 07F1&lt;br /&gt;
| BVR&lt;br /&gt;
|-&lt;br /&gt;
| 2034&lt;br /&gt;
| 07F2&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2035&lt;br /&gt;
| 07F3&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2036&lt;br /&gt;
| 07F4&lt;br /&gt;
| Atronic&lt;br /&gt;
|-&lt;br /&gt;
| 2037&lt;br /&gt;
| 07F5&lt;br /&gt;
| Scott Karlin&lt;br /&gt;
|-&lt;br /&gt;
| 2038&lt;br /&gt;
| 07F6&lt;br /&gt;
| Howitch&lt;br /&gt;
|-&lt;br /&gt;
| 2039&lt;br /&gt;
| 07F7&lt;br /&gt;
| Sullivan Brothers Visual Engineers&lt;br /&gt;
|-&lt;br /&gt;
| 2040&lt;br /&gt;
| 07F8&lt;br /&gt;
| G I T&lt;br /&gt;
|-&lt;br /&gt;
| 2041&lt;br /&gt;
| 07F9&lt;br /&gt;
| Amigo Business Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2042&lt;br /&gt;
| 07FA&lt;br /&gt;
| Micro E Ab&lt;br /&gt;
|-&lt;br /&gt;
| 2043&lt;br /&gt;
| 07FB&lt;br /&gt;
| Ralph Kruse&lt;br /&gt;
|-&lt;br /&gt;
| 2044&lt;br /&gt;
| 07FC&lt;br /&gt;
| Clearpoint Research&lt;br /&gt;
|-&lt;br /&gt;
| 2045&lt;br /&gt;
| 07FD&lt;br /&gt;
| Kodiak&lt;br /&gt;
|-&lt;br /&gt;
| 2046&lt;br /&gt;
| 07FE&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Phoenix Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2047&lt;br /&gt;
| 07FF&lt;br /&gt;
| No Name Shown&lt;br /&gt;
|-&lt;br /&gt;
| 2048&lt;br /&gt;
| 0800&lt;br /&gt;
| Commodore Braunschweig&lt;br /&gt;
|-&lt;br /&gt;
| 2049&lt;br /&gt;
| 0801&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Elaborate Bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2050&lt;br /&gt;
| 0802&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2051&lt;br /&gt;
| 0803&lt;br /&gt;
| Spartanics&lt;br /&gt;
|-&lt;br /&gt;
| 2052&lt;br /&gt;
| 0804&lt;br /&gt;
| Jochheim Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 2053&lt;br /&gt;
| 0805&lt;br /&gt;
| Trans Data Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2054&lt;br /&gt;
| 0806&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2055&lt;br /&gt;
| 0807&lt;br /&gt;
| Checkpoint Technologies&lt;br /&gt;
| Originally registered to Amiga Solutions&lt;br /&gt;
|-&lt;br /&gt;
| 2056&lt;br /&gt;
| 0808&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2057&lt;br /&gt;
| 0809&lt;br /&gt;
| Advanced Computer Design&lt;br /&gt;
|-&lt;br /&gt;
| 2058&lt;br /&gt;
| 080A&lt;br /&gt;
| Sir Netics&lt;br /&gt;
|-&lt;br /&gt;
| 2059&lt;br /&gt;
| 080B&lt;br /&gt;
| Expert Services&lt;br /&gt;
|-&lt;br /&gt;
| 2060&lt;br /&gt;
| 080C&lt;br /&gt;
| Digital Art Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2061&lt;br /&gt;
| 080D&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2062&lt;br /&gt;
| 080E&lt;br /&gt;
| Expansion Technologies (Expansion Systems)&lt;br /&gt;
|-&lt;br /&gt;
| 2063&lt;br /&gt;
| 080F&lt;br /&gt;
| Alphatech&lt;br /&gt;
|-&lt;br /&gt;
| 2064&lt;br /&gt;
| 0810&lt;br /&gt;
| Edotronik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2065&lt;br /&gt;
| 0811&lt;br /&gt;
| California Access/Synergy&lt;br /&gt;
| Originally registered to Logical Design Works&lt;br /&gt;
|-&lt;br /&gt;
| 2066&lt;br /&gt;
| 0812&lt;br /&gt;
| Bowden, Williams, Full &amp;amp; Assoc.&lt;br /&gt;
|-&lt;br /&gt;
| 2067&lt;br /&gt;
| 0813&lt;br /&gt;
| NES, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2068&lt;br /&gt;
| 0814&lt;br /&gt;
| Amdev&lt;br /&gt;
|-&lt;br /&gt;
| 2069&lt;br /&gt;
| 0815&lt;br /&gt;
| Big Brother Security Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2070&lt;br /&gt;
| 0816&lt;br /&gt;
| Active Circuits Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2071&lt;br /&gt;
| 0817&lt;br /&gt;
| ICD, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2072&lt;br /&gt;
| 0818&lt;br /&gt;
| Multi-Meg Electronique&lt;br /&gt;
|-&lt;br /&gt;
| 2073&lt;br /&gt;
| 0819&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2074&lt;br /&gt;
| 081A&lt;br /&gt;
| The Checkered Ball&lt;br /&gt;
|-&lt;br /&gt;
| 2075&lt;br /&gt;
| 081B&lt;br /&gt;
| Hi Tension Computer Services Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2076&lt;br /&gt;
| 081C&lt;br /&gt;
| Alfa Data&lt;br /&gt;
| Originally assigned to Elmtech Research, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2077&lt;br /&gt;
| 081D&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Clartscreen, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2078&lt;br /&gt;
| 081E&lt;br /&gt;
| Interworks&lt;br /&gt;
|-&lt;br /&gt;
| 2079&lt;br /&gt;
| 081F&lt;br /&gt;
| Galysh Enterprises&lt;br /&gt;
|-&lt;br /&gt;
| 2080&lt;br /&gt;
| 0820&lt;br /&gt;
| Hardital Synthesis&lt;br /&gt;
| Originally registered to Realtime Games Software Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2081&lt;br /&gt;
| 0821&lt;br /&gt;
| GBS&lt;br /&gt;
|-&lt;br /&gt;
| 2082&lt;br /&gt;
| 0822&lt;br /&gt;
| Circum Design Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2083&lt;br /&gt;
| 0823&lt;br /&gt;
| Alberta Micro Electronic Center&lt;br /&gt;
|-&lt;br /&gt;
| 2084&lt;br /&gt;
| 0824&lt;br /&gt;
| Bestech&lt;br /&gt;
|-&lt;br /&gt;
| 2085&lt;br /&gt;
| 0825&lt;br /&gt;
| Lasar Fantasy&lt;br /&gt;
|-&lt;br /&gt;
| 2086&lt;br /&gt;
| 0826&lt;br /&gt;
| Pulsar&lt;br /&gt;
|-&lt;br /&gt;
| 2087&lt;br /&gt;
| 0827&lt;br /&gt;
| Ivis&lt;br /&gt;
|-&lt;br /&gt;
| 2088&lt;br /&gt;
| 0828&lt;br /&gt;
| Applied Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2089&lt;br /&gt;
| 0829&lt;br /&gt;
| Solid-State Design &amp;amp;amp; Development&lt;br /&gt;
|-&lt;br /&gt;
| 2090&lt;br /&gt;
| 082A&lt;br /&gt;
| Vison Quest&lt;br /&gt;
|-&lt;br /&gt;
| 2091&lt;br /&gt;
| 082B&lt;br /&gt;
| Seaview Software&lt;br /&gt;
|-&lt;br /&gt;
| 2092&lt;br /&gt;
| 082C&lt;br /&gt;
| BSC&lt;br /&gt;
| Mistakenly used by ADS (Advanced Development Software)&lt;br /&gt;
|-&lt;br /&gt;
| 2093&lt;br /&gt;
| 082D&lt;br /&gt;
| Bernd Culenfeld&lt;br /&gt;
|-&lt;br /&gt;
| 2094&lt;br /&gt;
| 082E&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2095&lt;br /&gt;
| 082F&lt;br /&gt;
| CEGITES&lt;br /&gt;
|-&lt;br /&gt;
| 2096&lt;br /&gt;
| 0830&lt;br /&gt;
| Quadlite Computers Ltd.&lt;br /&gt;
| Originally registered to EV Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2097&lt;br /&gt;
| 0831&lt;br /&gt;
| Silicon Peace&lt;br /&gt;
|-&lt;br /&gt;
| 2098&lt;br /&gt;
| 0832&lt;br /&gt;
| Black Belt Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2099&lt;br /&gt;
| 0833&lt;br /&gt;
| Village Tronic&lt;br /&gt;
| Originally registerd to Steve Yaeger&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 0834&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 2101&lt;br /&gt;
| 0835&lt;br /&gt;
| Phoenix Micro Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 2102&lt;br /&gt;
| 0836&lt;br /&gt;
| Advanced Systems &amp;amp; Software&lt;br /&gt;
| Orignally assigned to Preferred Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2103&lt;br /&gt;
| 0837&lt;br /&gt;
| Rombo Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2104&lt;br /&gt;
| 0838&lt;br /&gt;
| Impulse Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2105&lt;br /&gt;
| 0839&lt;br /&gt;
| Beta Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2106&lt;br /&gt;
| 083A&lt;br /&gt;
| Memory Expansion System, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2107&lt;br /&gt;
| 083B&lt;br /&gt;
| Vortex Computer Systems GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2108&lt;br /&gt;
| 083C&lt;br /&gt;
| Platypus Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2109&lt;br /&gt;
| 083D&lt;br /&gt;
| Gigatron OHG&lt;br /&gt;
|-&lt;br /&gt;
| 2110&lt;br /&gt;
| 083E&lt;br /&gt;
| PG Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2111&lt;br /&gt;
| 083F&lt;br /&gt;
| New Technologies Group&lt;br /&gt;
|-&lt;br /&gt;
| 2112&lt;br /&gt;
| 0840&lt;br /&gt;
| Interactive Video Systems (IVS)&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2113&lt;br /&gt;
| 0841&lt;br /&gt;
| Vector&lt;br /&gt;
| Originally registered to H. K. Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2114&lt;br /&gt;
| 0842&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to C. H. Helfrich Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 2115&lt;br /&gt;
| 0843&lt;br /&gt;
| Xanadu&lt;br /&gt;
|-&lt;br /&gt;
| 2116&lt;br /&gt;
| 0844&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to AMS&lt;br /&gt;
|-&lt;br /&gt;
| 2117&lt;br /&gt;
| 0845&lt;br /&gt;
| X-Pert&lt;br /&gt;
|-&lt;br /&gt;
| 2118&lt;br /&gt;
| 0846&lt;br /&gt;
| The Amiga Centre&lt;br /&gt;
|-&lt;br /&gt;
| 2119&lt;br /&gt;
| 0847&lt;br /&gt;
| Digital Pacific&lt;br /&gt;
|-&lt;br /&gt;
| 2120&lt;br /&gt;
| 0848&lt;br /&gt;
| Solid State Leisure&lt;br /&gt;
|-&lt;br /&gt;
| 2121&lt;br /&gt;
| 0849&lt;br /&gt;
| Hydra Systems&lt;br /&gt;
| Originally registered to Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2122&lt;br /&gt;
| 084A&lt;br /&gt;
| Cumana&lt;br /&gt;
|-&lt;br /&gt;
| 2123&lt;br /&gt;
| 084B&lt;br /&gt;
| KAPS 2C Conception&lt;br /&gt;
|-&lt;br /&gt;
| 2124&lt;br /&gt;
| 084C&lt;br /&gt;
| Mike Mason&lt;br /&gt;
|-&lt;br /&gt;
| 2125&lt;br /&gt;
| 084D&lt;br /&gt;
| For Your Eyes&lt;br /&gt;
|-&lt;br /&gt;
| 2126&lt;br /&gt;
| 084E&lt;br /&gt;
| Volkmar Breitfeld Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2127&lt;br /&gt;
| 084F&lt;br /&gt;
| Sunrize Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2128&lt;br /&gt;
| 0850&lt;br /&gt;
| Scott Advanced Micro Designs&lt;br /&gt;
|-&lt;br /&gt;
| 2129&lt;br /&gt;
| 0851&lt;br /&gt;
| Digital Micronics&lt;br /&gt;
|-&lt;br /&gt;
| 2130&lt;br /&gt;
| 0852&lt;br /&gt;
| Alfa-Laval&lt;br /&gt;
|-&lt;br /&gt;
| 2131&lt;br /&gt;
| 0853&lt;br /&gt;
| Multigros A/S&lt;br /&gt;
|-&lt;br /&gt;
| 2132&lt;br /&gt;
| 0854&lt;br /&gt;
| Archos&lt;br /&gt;
|-&lt;br /&gt;
| 2133&lt;br /&gt;
| 0855&lt;br /&gt;
| Icom Simulations&lt;br /&gt;
|-&lt;br /&gt;
| 2134&lt;br /&gt;
| 0856&lt;br /&gt;
| Commodore Test Engineering Group&lt;br /&gt;
|-&lt;br /&gt;
| 2135&lt;br /&gt;
| 0857&lt;br /&gt;
| Microcreations&lt;br /&gt;
|-&lt;br /&gt;
| 2136&lt;br /&gt;
| 0858&lt;br /&gt;
| Shoestring Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2137&lt;br /&gt;
| 0859&lt;br /&gt;
| Faberushi&lt;br /&gt;
|-&lt;br /&gt;
| 2138&lt;br /&gt;
| 085A&lt;br /&gt;
| Evesham Micro Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2139&lt;br /&gt;
| 085B&lt;br /&gt;
| Panagolin Laser Software&lt;br /&gt;
|-&lt;br /&gt;
| 2140&lt;br /&gt;
| 085C&lt;br /&gt;
| Thomas Rudloff&lt;br /&gt;
|-&lt;br /&gt;
| 2141&lt;br /&gt;
| 085D&lt;br /&gt;
| Daniel Hohabir&lt;br /&gt;
|-&lt;br /&gt;
| 2142&lt;br /&gt;
| 085E&lt;br /&gt;
| GfxBase, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2143&lt;br /&gt;
| 085F&lt;br /&gt;
| Axellabs&lt;br /&gt;
|-&lt;br /&gt;
| 2144&lt;br /&gt;
| 0860&lt;br /&gt;
| Roctec Electronics Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2145&lt;br /&gt;
| 0861&lt;br /&gt;
| Omega Datentechnik&lt;br /&gt;
|-&lt;br /&gt;
| 2146&lt;br /&gt;
| 0862&lt;br /&gt;
| Atlantis&lt;br /&gt;
|-&lt;br /&gt;
| 2147&lt;br /&gt;
| 0863&lt;br /&gt;
| Skytec Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2148&lt;br /&gt;
| 0864&lt;br /&gt;
| Protar Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2149&lt;br /&gt;
| 0865&lt;br /&gt;
| ACS&lt;br /&gt;
|-&lt;br /&gt;
| 2150&lt;br /&gt;
| 0866&lt;br /&gt;
| Software Results Enterprises&lt;br /&gt;
| Originally registered to University of Illinois&lt;br /&gt;
|-&lt;br /&gt;
| 2151&lt;br /&gt;
| 0867&lt;br /&gt;
| Infinity Systems Design Group&lt;br /&gt;
|-&lt;br /&gt;
| 2152&lt;br /&gt;
| 0868&lt;br /&gt;
| Trade It&lt;br /&gt;
|-&lt;br /&gt;
| 2153&lt;br /&gt;
| 0869&lt;br /&gt;
| Suntec, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2154&lt;br /&gt;
| 086A&lt;br /&gt;
| DJW Micro Systems&lt;br /&gt;
| Originally registered to Tritec Marketing&lt;br /&gt;
|-&lt;br /&gt;
| 2155&lt;br /&gt;
| 086B&lt;br /&gt;
| Power Computing Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2156&lt;br /&gt;
| 086C&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 2157&lt;br /&gt;
| 086D&lt;br /&gt;
| Masoboshi GmbH (DCE)&lt;br /&gt;
|-&lt;br /&gt;
| 2158&lt;br /&gt;
| 086E&lt;br /&gt;
| HAL Software Hardware Handel&lt;br /&gt;
|-&lt;br /&gt;
| 2159&lt;br /&gt;
| 086F&lt;br /&gt;
| Mainhattan Data&lt;br /&gt;
| Originally registered to Michael Lamm Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2160&lt;br /&gt;
| 0870&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
| Originally registered to bbdp Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2161&lt;br /&gt;
| 0871&lt;br /&gt;
| Blue Ribbon Soundworks&lt;br /&gt;
| Originally registered to Design Computer Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2162&lt;br /&gt;
| 0872&lt;br /&gt;
| XPert&lt;br /&gt;
| Originally registered to The Station&lt;br /&gt;
|-&lt;br /&gt;
| 2163&lt;br /&gt;
| 0873&lt;br /&gt;
| DelaComp&lt;br /&gt;
| Originally registered to Bryan Williams&lt;br /&gt;
|-&lt;br /&gt;
| 2164&lt;br /&gt;
| 0874&lt;br /&gt;
| Superformance Computer Engineering GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2165&lt;br /&gt;
| 0875&lt;br /&gt;
| Overland Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2166&lt;br /&gt;
| 0876&lt;br /&gt;
| Thomas Hamren&lt;br /&gt;
|-&lt;br /&gt;
| 2167&lt;br /&gt;
| 0877&lt;br /&gt;
| Village Tronic&lt;br /&gt;
|-&lt;br /&gt;
| 2168&lt;br /&gt;
| 0878&lt;br /&gt;
| Toolbox Design&lt;br /&gt;
|-&lt;br /&gt;
| 2169&lt;br /&gt;
| 0879&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
|-&lt;br /&gt;
| 2170&lt;br /&gt;
| 087A&lt;br /&gt;
| Superformance&lt;br /&gt;
|-&lt;br /&gt;
| 2171&lt;br /&gt;
| 087B&lt;br /&gt;
| Utilities Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2172&lt;br /&gt;
| 087C&lt;br /&gt;
| phase 5&lt;br /&gt;
|-&lt;br /&gt;
| 2173&lt;br /&gt;
| 087D&lt;br /&gt;
| Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2174&lt;br /&gt;
| 087E&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 2175&lt;br /&gt;
| 087F&lt;br /&gt;
| James Cook University of North Queensland&lt;br /&gt;
|-&lt;br /&gt;
| 2176&lt;br /&gt;
| 0880&lt;br /&gt;
| AmiTrix Development&lt;br /&gt;
|-&lt;br /&gt;
| 2177&lt;br /&gt;
| 0881&lt;br /&gt;
| Ferranti&lt;br /&gt;
|-&lt;br /&gt;
| 2178&lt;br /&gt;
| 0882&lt;br /&gt;
| Leviathan Development&lt;br /&gt;
|-&lt;br /&gt;
| 2179&lt;br /&gt;
| 0883&lt;br /&gt;
| United Video Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2180&lt;br /&gt;
| 0884&lt;br /&gt;
| GPSoft Pty. Ltd.&lt;br /&gt;
| Originally registered to Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2181&lt;br /&gt;
| 0885&lt;br /&gt;
| ArMAX&lt;br /&gt;
| Oliver Bausch&lt;br /&gt;
|-&lt;br /&gt;
| 2182&lt;br /&gt;
| 0886&lt;br /&gt;
| CP Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2183&lt;br /&gt;
| 0887&lt;br /&gt;
| AMOK - Amiga Module &amp;amp;amp; Oberon Klub&lt;br /&gt;
|-&lt;br /&gt;
| 2184&lt;br /&gt;
| 0888&lt;br /&gt;
| ITEK Neser &amp;amp;amp; Sieber GbR&lt;br /&gt;
|-&lt;br /&gt;
| 2185&lt;br /&gt;
| 0889&lt;br /&gt;
| Phillip C. Lello&lt;br /&gt;
|-&lt;br /&gt;
| 2186&lt;br /&gt;
| 088A&lt;br /&gt;
| Cyborg Design Services&lt;br /&gt;
|-&lt;br /&gt;
| 2187&lt;br /&gt;
| 088B&lt;br /&gt;
| G2 Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2188&lt;br /&gt;
| 088C&lt;br /&gt;
| Pro System Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2189&lt;br /&gt;
| 088D&lt;br /&gt;
| ZEUS Electronic&lt;br /&gt;
| Originally registered to MSPI (Markt &amp;amp;amp; Technik)&lt;br /&gt;
|-&lt;br /&gt;
| 2190&lt;br /&gt;
| 088E&lt;br /&gt;
| Altatech&lt;br /&gt;
|-&lt;br /&gt;
| 2191&lt;br /&gt;
| 088F&lt;br /&gt;
| NewTek&lt;br /&gt;
|-&lt;br /&gt;
| 2192&lt;br /&gt;
| 0890&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
| Originally registered to Hardware Design Udo Neuroth&lt;br /&gt;
|-&lt;br /&gt;
| 2193&lt;br /&gt;
| 0891&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Viona Development&lt;br /&gt;
|-&lt;br /&gt;
| 2194&lt;br /&gt;
| 0892&lt;br /&gt;
| Amitek&lt;br /&gt;
| Originally assigned to Marpet Developments&lt;br /&gt;
|-&lt;br /&gt;
| 2195&lt;br /&gt;
| 0893&lt;br /&gt;
| Ingenieurbuero Helfrich&lt;br /&gt;
|-&lt;br /&gt;
| 2196&lt;br /&gt;
| 0894&lt;br /&gt;
| The Neo Group&lt;br /&gt;
|-&lt;br /&gt;
| 2197&lt;br /&gt;
| 0895&lt;br /&gt;
| Cyon&lt;br /&gt;
|-&lt;br /&gt;
| 2198&lt;br /&gt;
| 0896&lt;br /&gt;
| Bob Research Group&lt;br /&gt;
|-&lt;br /&gt;
| 2199&lt;br /&gt;
| 0897&lt;br /&gt;
| Richmond Sound Design Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2200&lt;br /&gt;
| 0898&lt;br /&gt;
| US Cybernetics&lt;br /&gt;
|-&lt;br /&gt;
| 2201&lt;br /&gt;
| 0899&lt;br /&gt;
| Fulvio Ieva&lt;br /&gt;
|-&lt;br /&gt;
| 2202&lt;br /&gt;
| 089A&lt;br /&gt;
| Silicon Studio&lt;br /&gt;
|-&lt;br /&gt;
| 2203&lt;br /&gt;
| 089B&lt;br /&gt;
| MacroSystems (USA)&lt;br /&gt;
| Was named Micro System Devices&lt;br /&gt;
|-&lt;br /&gt;
| 2204&lt;br /&gt;
| 089C&lt;br /&gt;
| Conspector Entertainment&lt;br /&gt;
|-&lt;br /&gt;
| 2205&lt;br /&gt;
| 089D&lt;br /&gt;
| Laserforum&lt;br /&gt;
|-&lt;br /&gt;
| 2206&lt;br /&gt;
| 089E&lt;br /&gt;
| Elbox Computer&lt;br /&gt;
| Mistakenly used by Index Information Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2207&lt;br /&gt;
| 089F&lt;br /&gt;
| Applied Magic Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2208&lt;br /&gt;
| 08A0&lt;br /&gt;
| SDL Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2560&lt;br /&gt;
| 0A00&lt;br /&gt;
| Harms&lt;br /&gt;
|-&lt;br /&gt;
| 2588&lt;br /&gt;
| 0A1C&lt;br /&gt;
| A1K.org Community&lt;br /&gt;
|-&lt;br /&gt;
| 2640&lt;br /&gt;
| 0A50&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 3084&lt;br /&gt;
| 0C0C&lt;br /&gt;
| Team 4&lt;br /&gt;
|-&lt;br /&gt;
| 3643&lt;br /&gt;
| 0E3B&lt;br /&gt;
| E3B&lt;br /&gt;
| Michael Boehmer&lt;br /&gt;
|-&lt;br /&gt;
| 3855&lt;br /&gt;
| 0F0F&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 4096&lt;br /&gt;
| 1000&lt;br /&gt;
| MegaMicro&lt;br /&gt;
|-&lt;br /&gt;
| 4110&lt;br /&gt;
| 100E&lt;br /&gt;
| DigiFeX&lt;br /&gt;
|-&lt;br /&gt;
| 4136&lt;br /&gt;
| 1028&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
|-&lt;br /&gt;
| 4149&lt;br /&gt;
| 1035&lt;br /&gt;
| PROTAR&lt;br /&gt;
|-&lt;br /&gt;
| 4369&lt;br /&gt;
| 1111&lt;br /&gt;
| Frank Strauß Elektronik&lt;br /&gt;
| Also used by Kupke&lt;br /&gt;
|-&lt;br /&gt;
| 4626&lt;br /&gt;
| 1212&lt;br /&gt;
| Individual Computers&lt;br /&gt;
|-&lt;br /&gt;
| 4648&lt;br /&gt;
| 1228&lt;br /&gt;
| Flesch Hornemann Computer Elec.&lt;br /&gt;
|-&lt;br /&gt;
| 4680&lt;br /&gt;
| 1248&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 4711&lt;br /&gt;
| 1267&lt;br /&gt;
| RBM digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 4754&lt;br /&gt;
| 1292&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 5000&lt;br /&gt;
| 1388&lt;br /&gt;
| ITH&lt;br /&gt;
|-&lt;br /&gt;
| 5001&lt;br /&gt;
| 1389&lt;br /&gt;
| VMC&lt;br /&gt;
|-&lt;br /&gt;
| 5010&lt;br /&gt;
| 1392&lt;br /&gt;
| Ambience Creation Technology&lt;br /&gt;
|-&lt;br /&gt;
| 5011&lt;br /&gt;
| 1393&lt;br /&gt;
| Creative Development&lt;br /&gt;
|-&lt;br /&gt;
| 5012&lt;br /&gt;
| 1394&lt;br /&gt;
| Georg Braun&lt;br /&gt;
|-&lt;br /&gt;
| 5013&lt;br /&gt;
| 1395&lt;br /&gt;
| Swedish User Group of Amiga&lt;br /&gt;
|-&lt;br /&gt;
| 5014&lt;br /&gt;
| 1396&lt;br /&gt;
| Jakub Bednarski&lt;br /&gt;
|-&lt;br /&gt;
| 5015&lt;br /&gt;
| 1397&lt;br /&gt;
| KryoFlux, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5016&lt;br /&gt;
| 1398&lt;br /&gt;
| Igor Majstorovic&lt;br /&gt;
|-&lt;br /&gt;
| 5017&lt;br /&gt;
| 1399&lt;br /&gt;
| Alastair M. Robinson&lt;br /&gt;
|-&lt;br /&gt;
| 5018&lt;br /&gt;
| 139A&lt;br /&gt;
| Austex Software&lt;br /&gt;
|-&lt;br /&gt;
| 5019&lt;br /&gt;
| 139B&lt;br /&gt;
| Sören Gust&lt;br /&gt;
|-&lt;br /&gt;
| 5020&lt;br /&gt;
| 139C&lt;br /&gt;
| Rok Krajnc&lt;br /&gt;
|-&lt;br /&gt;
| 5030&lt;br /&gt;
| 13A6&lt;br /&gt;
| Tim Tashpulatov&lt;br /&gt;
|-&lt;br /&gt;
| 5040&lt;br /&gt;
| 13B0&lt;br /&gt;
| 7-bit&lt;br /&gt;
|-&lt;br /&gt;
| 5050&lt;br /&gt;
| 13BA&lt;br /&gt;
| Sakura IT&lt;br /&gt;
|-&lt;br /&gt;
| 5060&lt;br /&gt;
| 13C4&lt;br /&gt;
| FPGAArcade&lt;br /&gt;
|-&lt;br /&gt;
| 5070&lt;br /&gt;
| 13CE&lt;br /&gt;
| CancerSoft Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 5080&lt;br /&gt;
| 13D8&lt;br /&gt;
| Stephen Leary&lt;br /&gt;
|-&lt;br /&gt;
| 5090&lt;br /&gt;
| 13E2&lt;br /&gt;
| DMA Softlab LLC&lt;br /&gt;
|-&lt;br /&gt;
| 5100&lt;br /&gt;
| 13EC&lt;br /&gt;
| Brookhouse Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 5110&lt;br /&gt;
| 13F6&lt;br /&gt;
| Eduardo Arana&lt;br /&gt;
|-&lt;br /&gt;
| 5120&lt;br /&gt;
| 1400&lt;br /&gt;
| CS-LAB&lt;br /&gt;
|-&lt;br /&gt;
| 5130&lt;br /&gt;
| 140A&lt;br /&gt;
| Robert Miranda&lt;br /&gt;
|-&lt;br /&gt;
| 5132&lt;br /&gt;
| 140C&lt;br /&gt;
| UAS Interface Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5500&lt;br /&gt;
| 157C&lt;br /&gt;
| Inhouse Information&lt;br /&gt;
|-&lt;br /&gt;
| 5768&lt;br /&gt;
| 1688&lt;br /&gt;
| Bio Con&lt;br /&gt;
|-&lt;br /&gt;
| 6148&lt;br /&gt;
| 1804&lt;br /&gt;
| HK-Computer&lt;br /&gt;
|-&lt;br /&gt;
| 6502&lt;br /&gt;
| 1966&lt;br /&gt;
| Cloanto&lt;br /&gt;
|-&lt;br /&gt;
| 7777&lt;br /&gt;
| 1E61&lt;br /&gt;
| Rafal Gabriel Chyla&lt;br /&gt;
|-&lt;br /&gt;
| 8215&lt;br /&gt;
| 2017&lt;br /&gt;
| Vortex&lt;br /&gt;
|-&lt;br /&gt;
| 8244&lt;br /&gt;
| 2034&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 8290&lt;br /&gt;
| 2062&lt;br /&gt;
| Expansion Systems&lt;br /&gt;
|-&lt;br /&gt;
| 8448&lt;br /&gt;
| 2100&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 8512&lt;br /&gt;
| 2140&lt;br /&gt;
| Phase 5 Digital Products&lt;br /&gt;
|-&lt;br /&gt;
| 8553&lt;br /&gt;
| 2169&lt;br /&gt;
| Digital Processing Systems Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 8704&lt;br /&gt;
| 2200&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 8738&lt;br /&gt;
| 2222&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 9512&lt;br /&gt;
| 2528&lt;br /&gt;
| Tower Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 10676&lt;br /&gt;
| 29B4&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 14195&lt;br /&gt;
| 3773&lt;br /&gt;
| Media-net-Point&lt;br /&gt;
|-&lt;br /&gt;
| 14501&lt;br /&gt;
| 38A5&lt;br /&gt;
| Petsoff, Finland&lt;br /&gt;
|-&lt;br /&gt;
| 16375&lt;br /&gt;
| 3FF7&lt;br /&gt;
| Uwe Gerlach&lt;br /&gt;
|-&lt;br /&gt;
| 16707&lt;br /&gt;
| 4143&lt;br /&gt;
| Ateo Concepts&lt;br /&gt;
|-&lt;br /&gt;
| 16708&lt;br /&gt;
| 4144&lt;br /&gt;
| ALiENDESiGN&lt;br /&gt;
|-&lt;br /&gt;
| 16945&lt;br /&gt;
| 4231&lt;br /&gt;
| A.C.T.&lt;br /&gt;
|-&lt;br /&gt;
| 17740&lt;br /&gt;
| 454C&lt;br /&gt;
| HK-Computer (ELSAT)&lt;br /&gt;
|-&lt;br /&gt;
| 18260&lt;br /&gt;
| 4754&lt;br /&gt;
| MacroSystems (Germany)&lt;br /&gt;
|-&lt;br /&gt;
| 19796&lt;br /&gt;
| 4D54&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 22359&lt;br /&gt;
| 5757&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 26464&lt;br /&gt;
| 6760&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 26470&lt;br /&gt;
| 6766&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 28014&lt;br /&gt;
| 6D6E&lt;br /&gt;
| MNT Media and Technology UG&lt;br /&gt;
|-&lt;br /&gt;
| 32768&lt;br /&gt;
| 8000&lt;br /&gt;
| M.A.S.T.&lt;br /&gt;
|-&lt;br /&gt;
| 42240&lt;br /&gt;
| A500&lt;br /&gt;
| Aethreum Digital&lt;br /&gt;
|-&lt;br /&gt;
| 43437&lt;br /&gt;
| A9AD&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 43521&lt;br /&gt;
| AA01&lt;br /&gt;
| Cameron&lt;br /&gt;
|-&lt;br /&gt;
| 43537&lt;br /&gt;
| AA11&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 44359&lt;br /&gt;
| AD47&lt;br /&gt;
| Matay&lt;br /&gt;
|-&lt;br /&gt;
| 46504&lt;br /&gt;
| B5A8&lt;br /&gt;
| Phoenix&lt;br /&gt;
|-&lt;br /&gt;
| 49160&lt;br /&gt;
| C008&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 61453&lt;br /&gt;
| F00D&lt;br /&gt;
| Forefront Technologies Inc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For any changes/additions to this registry please use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9330</id>
		<title>Amiga Hardware Manufacturer ID Registry</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9330"/>
		<updated>2018-04-27T03:52:08Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Registry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= How to Obtain a Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Manufacturer&#039;s numbers are assigned by the AmigaOS development team. To obtain your unique manufacturer number use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;br /&gt;
&lt;br /&gt;
Be sure and include your name, email and the type of expansion product you are developing.&lt;br /&gt;
&lt;br /&gt;
= Your Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Attention hardware manufacturers. If you are developing a hardware expansion product for the Classic Amiga (e.g. 500, 2000, 3000) then you will need to obtain a special manufacturer ID number from the AmigaOS development team to identify your product. This manufacturer number is used by the Amiga to link your hardware with its driver software at boot time.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number is part of the special protocol that the Amiga uses to automatically configure all expansion devices on the bus without the user having to cut jumpers or adjust dip switches. This is called auto-config.&lt;br /&gt;
&lt;br /&gt;
At start-up time, the system first polls each board in the system and assigns the board its own address space. If it is a memory board, its RAM is linked into the memory free pool. Later in the boot sequence, after DOS is initialized, the binddrivers program is run. Binddrivers will search the directory SYS:Expansion for the drivers that go with the boards.&lt;br /&gt;
&lt;br /&gt;
To do this binddrivers looks in the Tool Type field of all icon files in SYS:Expansion. If the first seven bytes of the Tool Type field are &amp;quot;PRODUCT&amp;quot;, then this is an icon file for a driver.&lt;br /&gt;
&lt;br /&gt;
Binddrivers will then attempt to match the drivers it has found with the boards that were found earlier. This is where your manufacturer number comes in.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number goes in two places. First, it is burned in hex form into the PAL which is part of ALL auto-config expansion products. Second, it appears in ASCII in the Tool Type field of the icon file for your product&#039;s driver. By matching these two numbers, the Amiga can automatically configure your board and bind it&#039;s software driver into the system as well.&lt;br /&gt;
&lt;br /&gt;
The manufacturer&#039;s number is a 16-bit ID which appears in PAL offsets $10-$17. There is also an 8-bit product number which you assign. The product number is for uniquely identifying different products from the same vendor. The product number will appear in PAL offsets $04-$07. This gives you a total of 24 bits to identify each of your products.&lt;br /&gt;
&lt;br /&gt;
These 24 bits of information in the PAL which identify your product are matched against the information in the Tool Type field of all icon files in the SYS:Expansion drawer. For example, suppose you are manufacturer #1019. You have two products, #1 and #2 which both use the same driver. The icon for your driver for these two products would have a Tool Type set to &amp;quot;PRODUCT=1019/1|1019/2&amp;quot;. This means: I am an icon for a driver that works with product number 1 or 2 from manufacturer 1019, now bind me. Spaces are not legal. Here are two other examples:&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1208/11&lt;br /&gt;
: is the Tool Type for a driver for product 11 from manufacturer number 1208.&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1017&lt;br /&gt;
: is the Tool Type for a driver for any product from manufacturer number 1017.&lt;br /&gt;
&lt;br /&gt;
For an informal explanation of the auto-configuration process, see the chapter on Software Expansion Architecture from the 2nd Annual Amiga Developer&#039;s Conference Notes (available on ADCD 2.1). For the details of timing, power, the PAL equations and PAL address specifications and the expansion library documentation, see sections 3.1 to 3.3 of the A500/A2000 Technical Reference Manual. The original auto-config spec appears in the A1000 Schematics and Expansion Specification.&lt;br /&gt;
&lt;br /&gt;
The auto-config process makes the addition of expansion products to the system very easy. All the user has to do is put the board in any slot and copy the driver from the release disk to his own SYS:Expansion drawer. Everything else is automatic. There are no jumpers or dip switches to set. Best of all, you will get a lot less support calls asking how to make your product work with the XYZ-Corp-battery-backed-clock.&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
Some notes on hardware manufacturer ID assignment.&lt;br /&gt;
&lt;br /&gt;
* Manufacturer ID numbers are assigned free of charge.&lt;br /&gt;
* Please provide the following information when requesting an ID:&lt;br /&gt;
*# Name of the company or person&lt;br /&gt;
*# Postal address/contact address&lt;br /&gt;
*# Name of the contact person, with a corresponding e-mail address&lt;br /&gt;
*# A brief description of the kind of products you want to produce&lt;br /&gt;
* All ID numbers smaller than 5000 must be considered unsafe because no information exists on which numbers exactly were taken during the time Commodore, Inc. disintegrated.&lt;br /&gt;
* ID numbers in the range 8192 to 18841 must be considered unsafe because some hardware developers mistook the numbers assigned to them to be given in hexadecimal format. Hence 0x2000 = 8192 and 0x4999 = 18841.&lt;br /&gt;
&lt;br /&gt;
= Example code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
/* Here is a short program which will tell you   */&lt;br /&gt;
/* about the expansion boards configured in your */&lt;br /&gt;
/* system without you opening up the machine.    */&lt;br /&gt;
/* Code by Bill Koester of CATS                  */&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
#include &amp;lt;libraries/configvars.h&amp;gt;&lt;br /&gt;
#include &amp;lt;libraries/expansion.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct ExpansionBase *ExpansionBase;&lt;br /&gt;
&lt;br /&gt;
void cleanup();&lt;br /&gt;
void printdev();&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   struct ConfigDev *MyConfigDev;&lt;br /&gt;
&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
   /* Open the expansion library,      */&lt;br /&gt;
   /* if there is a problem then exit  */&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   ExpansionBase =(struct ExpansionBase *) OpenLibrary(EXPANSIONNAME,0);&lt;br /&gt;
   if(ExpansionBase==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error opening expansion library!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
   /* Use FindConfigDev to get info on the first */&lt;br /&gt;
   /* expansion board on the list maintained by  */&lt;br /&gt;
   /* Exec.  If there are no expansion boards in */&lt;br /&gt;
   /* the system then exit.                      */&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = NULL;&lt;br /&gt;
&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
  /* FindConfigDev(oldConfigDev,manufacturer,product) */&lt;br /&gt;
  /* oldConfigDev = NULL for the top of the list      */&lt;br /&gt;
  /* manufacturer = -1 for any manufacturer           */&lt;br /&gt;
  /* product      = -1 for any product                */&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = FindConfigDev(NULL,-1,-1);&lt;br /&gt;
&lt;br /&gt;
   if(MyConfigDev==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;No Configured Devices found!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printdev(MyConfigDev);&lt;br /&gt;
&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
   /* OK, there is at least one board,  */&lt;br /&gt;
   /* so loop and get the entire list   */&lt;br /&gt;
   /* printing as we go with printdev() */&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   while(MyConfigDev = FindConfigDev(MyConfigDev,-1,-1))&lt;br /&gt;
   {&lt;br /&gt;
      printdev(MyConfigDev);&lt;br /&gt;
   }&lt;br /&gt;
   cleanup();&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
/* Close up shop...  */&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
void cleanup()&lt;br /&gt;
{&lt;br /&gt;
   if(ExpansionBase)&lt;br /&gt;
      CloseLibrary(ExpansionBase);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
/* Print out the contents of the    */&lt;br /&gt;
/* dev structure for this expansion */&lt;br /&gt;
/* product.                         */&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
void printdev(dev)&lt;br /&gt;
struct ConfigDev *dev;&lt;br /&gt;
{&lt;br /&gt;
   char buff[200];&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Flags          = &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags==NULL)&lt;br /&gt;
      printf(&amp;quot;NULL  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_SHUTUP)&lt;br /&gt;
      printf(&amp;quot;CDF_SHUTUP  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_CONFIGME)&lt;br /&gt;
      printf(&amp;quot;CDF_CONFIGME  &amp;quot;);&lt;br /&gt;
   printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot;Board Address  = %x\n&amp;quot;,dev-&amp;gt;cd_BoardAddr);&lt;br /&gt;
   printf(&amp;quot;Board Size     = %d bytes\n&amp;quot;,dev-&amp;gt;cd_BoardSize);&lt;br /&gt;
   printf(&amp;quot;Slot  Address  = %d\n&amp;quot;,dev-&amp;gt;cd_SlotAddr);&lt;br /&gt;
   printf(&amp;quot;Slot  Size     = %d\n&amp;quot;,dev-&amp;gt;cd_SlotSize);&lt;br /&gt;
   printf(&amp;quot;Driver code at   %x\n&amp;quot;,dev-&amp;gt;cd_Driver);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;er_Type         = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Type);&lt;br /&gt;
   printf(&amp;quot;er_Product      = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Product);&lt;br /&gt;
   printf(&amp;quot;er_Flags        = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Flags);&lt;br /&gt;
   printf(&amp;quot;er_Reserved03   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved03);&lt;br /&gt;
   printf(&amp;quot;er_Manufacturer = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Manufacturer);&lt;br /&gt;
   printf(&amp;quot;er_SerialNumber = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_SerialNumber);&lt;br /&gt;
   printf(&amp;quot;er_InitDiagVec  = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_InitDiagVec);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0c   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0c);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0d   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0d);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0e   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0e);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0f   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0f);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Hit Return to continue:\n&amp;quot;);&lt;br /&gt;
   gets(buff);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Registry =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (decimal)&lt;br /&gt;
! ID (hexadecimal)&lt;br /&gt;
! Manufacturer&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 211&lt;br /&gt;
| 00D3&lt;br /&gt;
| Pacific Peripherals/Profex&lt;br /&gt;
|-&lt;br /&gt;
| 221&lt;br /&gt;
| 00DD&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 256&lt;br /&gt;
| 0100&lt;br /&gt;
| Memphis&lt;br /&gt;
| Originally registered to MacroSystems US&lt;br /&gt;
|-&lt;br /&gt;
| 512&lt;br /&gt;
| 0200&lt;br /&gt;
| 3-State Computertechnik&lt;br /&gt;
|-&lt;br /&gt;
| 513&lt;br /&gt;
| 0201&lt;br /&gt;
| Commodore (Braunschweig)&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| 0202&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
|-&lt;br /&gt;
| 515&lt;br /&gt;
| 0203&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
| Originally registered to Combitech/Macrosystem&lt;br /&gt;
|-&lt;br /&gt;
| 756&lt;br /&gt;
| 02F4&lt;br /&gt;
| Progressive Peripherals &amp;amp; Software&lt;br /&gt;
|-&lt;br /&gt;
| 767&lt;br /&gt;
| 02FF&lt;br /&gt;
| Kolff Computer Supplies&lt;br /&gt;
|-&lt;br /&gt;
| 1001&lt;br /&gt;
| 03E9&lt;br /&gt;
| Tecmar&lt;br /&gt;
|-&lt;br /&gt;
| 1002&lt;br /&gt;
| 03EA&lt;br /&gt;
| Telesys&lt;br /&gt;
|-&lt;br /&gt;
| 1003&lt;br /&gt;
| 03EB&lt;br /&gt;
| The Micro-Forge&lt;br /&gt;
|-&lt;br /&gt;
| 1004&lt;br /&gt;
| 03EC&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
| Originally registered to Card Co. (Supra)&lt;br /&gt;
|-&lt;br /&gt;
| 1005&lt;br /&gt;
| 03ED&lt;br /&gt;
| A-Squared&lt;br /&gt;
|-&lt;br /&gt;
| 1006&lt;br /&gt;
| 03EE&lt;br /&gt;
| Comspec Communications&lt;br /&gt;
|-&lt;br /&gt;
| 1007&lt;br /&gt;
| 03EF&lt;br /&gt;
| HT Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1008&lt;br /&gt;
| 03F0&lt;br /&gt;
| RDS Software&lt;br /&gt;
|-&lt;br /&gt;
| 1009&lt;br /&gt;
| 03F1&lt;br /&gt;
| Anakin Research&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| 03F2&lt;br /&gt;
| MicroBotics&lt;br /&gt;
|-&lt;br /&gt;
| 1011&lt;br /&gt;
| 03F3&lt;br /&gt;
| Bob Krauth&lt;br /&gt;
|-&lt;br /&gt;
| 1012&lt;br /&gt;
| 03F4&lt;br /&gt;
| Access Associates (Alegra)&lt;br /&gt;
|-&lt;br /&gt;
| 1013&lt;br /&gt;
| 03F5&lt;br /&gt;
| Mini Comp Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 1014&lt;br /&gt;
| 03F6&lt;br /&gt;
| Cypress Technology&lt;br /&gt;
|-&lt;br /&gt;
| 1015&lt;br /&gt;
| 03F7&lt;br /&gt;
| Fuller Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1016&lt;br /&gt;
| 03F8&lt;br /&gt;
| Galaxy Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1017&lt;br /&gt;
| 03F9&lt;br /&gt;
| ADA Research&lt;br /&gt;
|-&lt;br /&gt;
| 1018&lt;br /&gt;
| 03FA&lt;br /&gt;
| Computer Service Italia&lt;br /&gt;
|-&lt;br /&gt;
| 1019&lt;br /&gt;
| 03FB&lt;br /&gt;
| Amigo&lt;br /&gt;
|-&lt;br /&gt;
| 1020&lt;br /&gt;
| 03FC&lt;br /&gt;
| Micro-Solutions Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1021&lt;br /&gt;
| 03FD&lt;br /&gt;
| Stacar International&lt;br /&gt;
|-&lt;br /&gt;
| 1022&lt;br /&gt;
| 03FE&lt;br /&gt;
| Video Precisions&lt;br /&gt;
|-&lt;br /&gt;
| 1023&lt;br /&gt;
| 03FF&lt;br /&gt;
| ASDG, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1025&lt;br /&gt;
| 0401&lt;br /&gt;
| Ing. Buero Kalawsky&lt;br /&gt;
|-&lt;br /&gt;
| 1026&lt;br /&gt;
| 0402&lt;br /&gt;
| Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 1027&lt;br /&gt;
| 0403&lt;br /&gt;
| Interplan Unternehmensberatung&lt;br /&gt;
|-&lt;br /&gt;
| 1028&lt;br /&gt;
| 0404&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
| Originally registered to Peter Ohlich&lt;br /&gt;
|-&lt;br /&gt;
| 1030&lt;br /&gt;
| 0406&lt;br /&gt;
| Commodore (Lowell University)&lt;br /&gt;
| Originally registered to Productivity Center&lt;br /&gt;
|-&lt;br /&gt;
| 1041&lt;br /&gt;
| 0411&lt;br /&gt;
| Design Labs&lt;br /&gt;
|-&lt;br /&gt;
| 1042&lt;br /&gt;
| 0412&lt;br /&gt;
| MCS&lt;br /&gt;
|-&lt;br /&gt;
| 1043&lt;br /&gt;
| 0413&lt;br /&gt;
| B. J. Freeman&lt;br /&gt;
|-&lt;br /&gt;
| 1044&lt;br /&gt;
| 0414&lt;br /&gt;
| Side Effects Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1045&lt;br /&gt;
| 0415&lt;br /&gt;
| Oklahoma Personal Comp.&lt;br /&gt;
|-&lt;br /&gt;
| 1046&lt;br /&gt;
| 0416&lt;br /&gt;
| Advanced Micro Innovations&lt;br /&gt;
|-&lt;br /&gt;
| 1047&lt;br /&gt;
| 0417&lt;br /&gt;
| Industrial Support Services&lt;br /&gt;
|-&lt;br /&gt;
| 1048&lt;br /&gt;
| 0418&lt;br /&gt;
| Technisoft&lt;br /&gt;
|-&lt;br /&gt;
| 1049&lt;br /&gt;
| 0419&lt;br /&gt;
| Prolific, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1050&lt;br /&gt;
| 041A&lt;br /&gt;
| Softeam, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1051&lt;br /&gt;
| 041B&lt;br /&gt;
| GRC Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1052&lt;br /&gt;
| 041C&lt;br /&gt;
| David Lai&lt;br /&gt;
|-&lt;br /&gt;
| 1053&lt;br /&gt;
| 041D&lt;br /&gt;
| Ameristar Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 1054&lt;br /&gt;
| 041E&lt;br /&gt;
| Cline Refrigeration&lt;br /&gt;
|-&lt;br /&gt;
| 1055&lt;br /&gt;
| 041F&lt;br /&gt;
| Cardiac Pacemakers, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1056&lt;br /&gt;
| 0420&lt;br /&gt;
| Supra Corp. (Creative Microsystems)&lt;br /&gt;
|-&lt;br /&gt;
| 1057&lt;br /&gt;
| 0421&lt;br /&gt;
| Wayne Diener&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| 0422&lt;br /&gt;
| Computer Systems Associates (CSA)&lt;br /&gt;
|-&lt;br /&gt;
| 1059&lt;br /&gt;
| 0423&lt;br /&gt;
| Trionix, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1060&lt;br /&gt;
| 0424&lt;br /&gt;
| David Lucas&lt;br /&gt;
|-&lt;br /&gt;
| 1061&lt;br /&gt;
| 0425&lt;br /&gt;
| Analog Precision&lt;br /&gt;
| Also assigned to D &amp;amp; L Distributing&lt;br /&gt;
|-&lt;br /&gt;
| 1267&lt;br /&gt;
| 04F3&lt;br /&gt;
| RBM Digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 1282&lt;br /&gt;
| 0502&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
|-&lt;br /&gt;
| 1337&lt;br /&gt;
| 0539&lt;br /&gt;
| Thomas Stenzel (DaFR34K)&lt;br /&gt;
|-&lt;br /&gt;
| 1576&lt;br /&gt;
| 0628&lt;br /&gt;
| Boris Križma&lt;br /&gt;
|-&lt;br /&gt;
| 1761&lt;br /&gt;
| 06E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 1803&lt;br /&gt;
| 070B&lt;br /&gt;
| UAE Amiga Emulator&lt;br /&gt;
|-&lt;br /&gt;
| 2002&lt;br /&gt;
| 07D2&lt;br /&gt;
| Mimetics Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2003&lt;br /&gt;
| 07D3&lt;br /&gt;
| ACDA&lt;br /&gt;
|-&lt;br /&gt;
| 2004&lt;br /&gt;
| 07D4&lt;br /&gt;
| Finn R. Jacobsen&lt;br /&gt;
|-&lt;br /&gt;
| 2005&lt;br /&gt;
| 07D5&lt;br /&gt;
| Elthen Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2006&lt;br /&gt;
| 07D6&lt;br /&gt;
| Nine Tiles Computer Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2007&lt;br /&gt;
| 07D7&lt;br /&gt;
| Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2008&lt;br /&gt;
| 07D8&lt;br /&gt;
| Bell &amp;amp;amp; Howell&lt;br /&gt;
|-&lt;br /&gt;
| 2009&lt;br /&gt;
| 07D9&lt;br /&gt;
| Roland Kochler&lt;br /&gt;
|-&lt;br /&gt;
| 2010&lt;br /&gt;
| 07DA&lt;br /&gt;
| Byte Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2011&lt;br /&gt;
| 07DB&lt;br /&gt;
| Reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2012&lt;br /&gt;
| 07DC&lt;br /&gt;
| DKB, Inc.&lt;br /&gt;
| Previously named Michigan Software&lt;br /&gt;
|-&lt;br /&gt;
| 2013&lt;br /&gt;
| 07DD&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2014&lt;br /&gt;
| 07DE&lt;br /&gt;
| Sysaphus Software&lt;br /&gt;
|-&lt;br /&gt;
| 2015&lt;br /&gt;
| 07DF&lt;br /&gt;
| Digitronics&lt;br /&gt;
|-&lt;br /&gt;
| 2016&lt;br /&gt;
| 07E0&lt;br /&gt;
| Akron Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2017&lt;br /&gt;
| 07E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 2018&lt;br /&gt;
| 07E2&lt;br /&gt;
| Calmos&lt;br /&gt;
|-&lt;br /&gt;
| 2019&lt;br /&gt;
| 07E3&lt;br /&gt;
| Dover Research&lt;br /&gt;
|-&lt;br /&gt;
| 2020&lt;br /&gt;
| 07E4&lt;br /&gt;
| David Krehbiel&lt;br /&gt;
|-&lt;br /&gt;
| 2021&lt;br /&gt;
| 07E5&lt;br /&gt;
| Synergy Peripheral Systems&lt;br /&gt;
| Also known as California Access&lt;br /&gt;
|-&lt;br /&gt;
| 2022&lt;br /&gt;
| 07E6&lt;br /&gt;
| Xetec&lt;br /&gt;
|-&lt;br /&gt;
| 2023&lt;br /&gt;
| 07E7&lt;br /&gt;
| Micron Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2024&lt;br /&gt;
| 07E8&lt;br /&gt;
| CH Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2025&lt;br /&gt;
| 07E9&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2026&lt;br /&gt;
| 07EA&lt;br /&gt;
| Progressive Peripherals &amp;amp;amp; Software&lt;br /&gt;
| Also used by Ateo&lt;br /&gt;
|-&lt;br /&gt;
| 2027&lt;br /&gt;
| 07EB&lt;br /&gt;
| Wicat Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2028&lt;br /&gt;
| 07EC&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2029&lt;br /&gt;
| 07ED&lt;br /&gt;
| Delaware Valley Software&lt;br /&gt;
|-&lt;br /&gt;
| 2030&lt;br /&gt;
| 07EE&lt;br /&gt;
| Palomax&lt;br /&gt;
|-&lt;br /&gt;
| 2031&lt;br /&gt;
| 07EF&lt;br /&gt;
| Incognito Software&lt;br /&gt;
|-&lt;br /&gt;
| 2032&lt;br /&gt;
| 07F0&lt;br /&gt;
| Jadesign&lt;br /&gt;
|-&lt;br /&gt;
| 2033&lt;br /&gt;
| 07F1&lt;br /&gt;
| BVR&lt;br /&gt;
|-&lt;br /&gt;
| 2034&lt;br /&gt;
| 07F2&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2035&lt;br /&gt;
| 07F3&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2036&lt;br /&gt;
| 07F4&lt;br /&gt;
| Atronic&lt;br /&gt;
|-&lt;br /&gt;
| 2037&lt;br /&gt;
| 07F5&lt;br /&gt;
| Scott Karlin&lt;br /&gt;
|-&lt;br /&gt;
| 2038&lt;br /&gt;
| 07F6&lt;br /&gt;
| Howitch&lt;br /&gt;
|-&lt;br /&gt;
| 2039&lt;br /&gt;
| 07F7&lt;br /&gt;
| Sullivan Brothers Visual Engineers&lt;br /&gt;
|-&lt;br /&gt;
| 2040&lt;br /&gt;
| 07F8&lt;br /&gt;
| G I T&lt;br /&gt;
|-&lt;br /&gt;
| 2041&lt;br /&gt;
| 07F9&lt;br /&gt;
| Amigo Business Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2042&lt;br /&gt;
| 07FA&lt;br /&gt;
| Micro E Ab&lt;br /&gt;
|-&lt;br /&gt;
| 2043&lt;br /&gt;
| 07FB&lt;br /&gt;
| Ralph Kruse&lt;br /&gt;
|-&lt;br /&gt;
| 2044&lt;br /&gt;
| 07FC&lt;br /&gt;
| Clearpoint Research&lt;br /&gt;
|-&lt;br /&gt;
| 2045&lt;br /&gt;
| 07FD&lt;br /&gt;
| Kodiak&lt;br /&gt;
|-&lt;br /&gt;
| 2046&lt;br /&gt;
| 07FE&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Phoenix Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2047&lt;br /&gt;
| 07FF&lt;br /&gt;
| No Name Shown&lt;br /&gt;
|-&lt;br /&gt;
| 2048&lt;br /&gt;
| 0800&lt;br /&gt;
| Commodore Braunschweig&lt;br /&gt;
|-&lt;br /&gt;
| 2049&lt;br /&gt;
| 0801&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Elaborate Bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2050&lt;br /&gt;
| 0802&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2051&lt;br /&gt;
| 0803&lt;br /&gt;
| Spartanics&lt;br /&gt;
|-&lt;br /&gt;
| 2052&lt;br /&gt;
| 0804&lt;br /&gt;
| Jochheim Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 2053&lt;br /&gt;
| 0805&lt;br /&gt;
| Trans Data Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2054&lt;br /&gt;
| 0806&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2055&lt;br /&gt;
| 0807&lt;br /&gt;
| Checkpoint Technologies&lt;br /&gt;
| Originally registered to Amiga Solutions&lt;br /&gt;
|-&lt;br /&gt;
| 2056&lt;br /&gt;
| 0808&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2057&lt;br /&gt;
| 0809&lt;br /&gt;
| Advanced Computer Design&lt;br /&gt;
|-&lt;br /&gt;
| 2058&lt;br /&gt;
| 080A&lt;br /&gt;
| Sir Netics&lt;br /&gt;
|-&lt;br /&gt;
| 2059&lt;br /&gt;
| 080B&lt;br /&gt;
| Expert Services&lt;br /&gt;
|-&lt;br /&gt;
| 2060&lt;br /&gt;
| 080C&lt;br /&gt;
| Digital Art Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2061&lt;br /&gt;
| 080D&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2062&lt;br /&gt;
| 080E&lt;br /&gt;
| Expansion Technologies (Expansion Systems)&lt;br /&gt;
|-&lt;br /&gt;
| 2063&lt;br /&gt;
| 080F&lt;br /&gt;
| Alphatech&lt;br /&gt;
|-&lt;br /&gt;
| 2064&lt;br /&gt;
| 0810&lt;br /&gt;
| Edotronik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2065&lt;br /&gt;
| 0811&lt;br /&gt;
| California Access/Synergy&lt;br /&gt;
| Originally registered to Logical Design Works&lt;br /&gt;
|-&lt;br /&gt;
| 2066&lt;br /&gt;
| 0812&lt;br /&gt;
| Bowden, Williams, Full &amp;amp; Assoc.&lt;br /&gt;
|-&lt;br /&gt;
| 2067&lt;br /&gt;
| 0813&lt;br /&gt;
| NES, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2068&lt;br /&gt;
| 0814&lt;br /&gt;
| Amdev&lt;br /&gt;
|-&lt;br /&gt;
| 2069&lt;br /&gt;
| 0815&lt;br /&gt;
| Big Brother Security Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2070&lt;br /&gt;
| 0816&lt;br /&gt;
| Active Circuits Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2071&lt;br /&gt;
| 0817&lt;br /&gt;
| ICD, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2072&lt;br /&gt;
| 0818&lt;br /&gt;
| Multi-Meg Electronique&lt;br /&gt;
|-&lt;br /&gt;
| 2073&lt;br /&gt;
| 0819&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2074&lt;br /&gt;
| 081A&lt;br /&gt;
| The Checkered Ball&lt;br /&gt;
|-&lt;br /&gt;
| 2075&lt;br /&gt;
| 081B&lt;br /&gt;
| Hi Tension Computer Services Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2076&lt;br /&gt;
| 081C&lt;br /&gt;
| Alfa Data&lt;br /&gt;
| Originally assigned to Elmtech Research, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2077&lt;br /&gt;
| 081D&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Clartscreen, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2078&lt;br /&gt;
| 081E&lt;br /&gt;
| Interworks&lt;br /&gt;
|-&lt;br /&gt;
| 2079&lt;br /&gt;
| 081F&lt;br /&gt;
| Galysh Enterprises&lt;br /&gt;
|-&lt;br /&gt;
| 2080&lt;br /&gt;
| 0820&lt;br /&gt;
| Hardital Synthesis&lt;br /&gt;
| Originally registered to Realtime Games Software Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2081&lt;br /&gt;
| 0821&lt;br /&gt;
| GBS&lt;br /&gt;
|-&lt;br /&gt;
| 2082&lt;br /&gt;
| 0822&lt;br /&gt;
| Circum Design Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2083&lt;br /&gt;
| 0823&lt;br /&gt;
| Alberta Micro Electronic Center&lt;br /&gt;
|-&lt;br /&gt;
| 2084&lt;br /&gt;
| 0824&lt;br /&gt;
| Bestech&lt;br /&gt;
|-&lt;br /&gt;
| 2085&lt;br /&gt;
| 0825&lt;br /&gt;
| Lasar Fantasy&lt;br /&gt;
|-&lt;br /&gt;
| 2086&lt;br /&gt;
| 0826&lt;br /&gt;
| Pulsar&lt;br /&gt;
|-&lt;br /&gt;
| 2087&lt;br /&gt;
| 0827&lt;br /&gt;
| Ivis&lt;br /&gt;
|-&lt;br /&gt;
| 2088&lt;br /&gt;
| 0828&lt;br /&gt;
| Applied Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2089&lt;br /&gt;
| 0829&lt;br /&gt;
| Solid-State Design &amp;amp;amp; Development&lt;br /&gt;
|-&lt;br /&gt;
| 2090&lt;br /&gt;
| 082A&lt;br /&gt;
| Vison Quest&lt;br /&gt;
|-&lt;br /&gt;
| 2091&lt;br /&gt;
| 082B&lt;br /&gt;
| Seaview Software&lt;br /&gt;
|-&lt;br /&gt;
| 2092&lt;br /&gt;
| 082C&lt;br /&gt;
| BSC&lt;br /&gt;
| Mistakenly used by ADS (Advanced Development Software)&lt;br /&gt;
|-&lt;br /&gt;
| 2093&lt;br /&gt;
| 082D&lt;br /&gt;
| Bernd Culenfeld&lt;br /&gt;
|-&lt;br /&gt;
| 2094&lt;br /&gt;
| 082E&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2095&lt;br /&gt;
| 082F&lt;br /&gt;
| CEGITES&lt;br /&gt;
|-&lt;br /&gt;
| 2096&lt;br /&gt;
| 0830&lt;br /&gt;
| Quadlite Computers Ltd.&lt;br /&gt;
| Originally registered to EV Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2097&lt;br /&gt;
| 0831&lt;br /&gt;
| Silicon Peace&lt;br /&gt;
|-&lt;br /&gt;
| 2098&lt;br /&gt;
| 0832&lt;br /&gt;
| Black Belt Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2099&lt;br /&gt;
| 0833&lt;br /&gt;
| Village Tronic&lt;br /&gt;
| Originally registerd to Steve Yaeger&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 0834&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 2101&lt;br /&gt;
| 0835&lt;br /&gt;
| Phoenix Micro Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 2102&lt;br /&gt;
| 0836&lt;br /&gt;
| Advanced Systems &amp;amp; Software&lt;br /&gt;
| Orignally assigned to Preferred Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2103&lt;br /&gt;
| 0837&lt;br /&gt;
| Rombo Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2104&lt;br /&gt;
| 0838&lt;br /&gt;
| Impulse Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2105&lt;br /&gt;
| 0839&lt;br /&gt;
| Beta Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2106&lt;br /&gt;
| 083A&lt;br /&gt;
| Memory Expansion System, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2107&lt;br /&gt;
| 083B&lt;br /&gt;
| Vortex Computer Systems GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2108&lt;br /&gt;
| 083C&lt;br /&gt;
| Platypus Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2109&lt;br /&gt;
| 083D&lt;br /&gt;
| Gigatron OHG&lt;br /&gt;
|-&lt;br /&gt;
| 2110&lt;br /&gt;
| 083E&lt;br /&gt;
| PG Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2111&lt;br /&gt;
| 083F&lt;br /&gt;
| New Technologies Group&lt;br /&gt;
|-&lt;br /&gt;
| 2112&lt;br /&gt;
| 0840&lt;br /&gt;
| Interactive Video Systems (IVS)&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2113&lt;br /&gt;
| 0841&lt;br /&gt;
| Vector&lt;br /&gt;
| Originally registered to H. K. Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2114&lt;br /&gt;
| 0842&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to C. H. Helfrich Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 2115&lt;br /&gt;
| 0843&lt;br /&gt;
| Xanadu&lt;br /&gt;
|-&lt;br /&gt;
| 2116&lt;br /&gt;
| 0844&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to AMS&lt;br /&gt;
|-&lt;br /&gt;
| 2117&lt;br /&gt;
| 0845&lt;br /&gt;
| X-Pert&lt;br /&gt;
|-&lt;br /&gt;
| 2118&lt;br /&gt;
| 0846&lt;br /&gt;
| The Amiga Centre&lt;br /&gt;
|-&lt;br /&gt;
| 2119&lt;br /&gt;
| 0847&lt;br /&gt;
| Digital Pacific&lt;br /&gt;
|-&lt;br /&gt;
| 2120&lt;br /&gt;
| 0848&lt;br /&gt;
| Solid State Leisure&lt;br /&gt;
|-&lt;br /&gt;
| 2121&lt;br /&gt;
| 0849&lt;br /&gt;
| Hydra Systems&lt;br /&gt;
| Originally registered to Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2122&lt;br /&gt;
| 084A&lt;br /&gt;
| Cumana&lt;br /&gt;
|-&lt;br /&gt;
| 2123&lt;br /&gt;
| 084B&lt;br /&gt;
| KAPS 2C Conception&lt;br /&gt;
|-&lt;br /&gt;
| 2124&lt;br /&gt;
| 084C&lt;br /&gt;
| Mike Mason&lt;br /&gt;
|-&lt;br /&gt;
| 2125&lt;br /&gt;
| 084D&lt;br /&gt;
| For Your Eyes&lt;br /&gt;
|-&lt;br /&gt;
| 2126&lt;br /&gt;
| 084E&lt;br /&gt;
| Volkmar Breitfeld Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2127&lt;br /&gt;
| 084F&lt;br /&gt;
| Sunrize Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2128&lt;br /&gt;
| 0850&lt;br /&gt;
| Scott Advanced Micro Designs&lt;br /&gt;
|-&lt;br /&gt;
| 2129&lt;br /&gt;
| 0851&lt;br /&gt;
| Digital Micronics&lt;br /&gt;
|-&lt;br /&gt;
| 2130&lt;br /&gt;
| 0852&lt;br /&gt;
| Alfa-Laval&lt;br /&gt;
|-&lt;br /&gt;
| 2131&lt;br /&gt;
| 0853&lt;br /&gt;
| Multigros A/S&lt;br /&gt;
|-&lt;br /&gt;
| 2132&lt;br /&gt;
| 0854&lt;br /&gt;
| Archos&lt;br /&gt;
|-&lt;br /&gt;
| 2133&lt;br /&gt;
| 0855&lt;br /&gt;
| Icom Simulations&lt;br /&gt;
|-&lt;br /&gt;
| 2134&lt;br /&gt;
| 0856&lt;br /&gt;
| Commodore Test Engineering Group&lt;br /&gt;
|-&lt;br /&gt;
| 2135&lt;br /&gt;
| 0857&lt;br /&gt;
| Microcreations&lt;br /&gt;
|-&lt;br /&gt;
| 2136&lt;br /&gt;
| 0858&lt;br /&gt;
| Shoestring Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2137&lt;br /&gt;
| 0859&lt;br /&gt;
| Faberushi&lt;br /&gt;
|-&lt;br /&gt;
| 2138&lt;br /&gt;
| 085A&lt;br /&gt;
| Evesham Micro Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2139&lt;br /&gt;
| 085B&lt;br /&gt;
| Panagolin Laser Software&lt;br /&gt;
|-&lt;br /&gt;
| 2140&lt;br /&gt;
| 085C&lt;br /&gt;
| Thomas Rudloff&lt;br /&gt;
|-&lt;br /&gt;
| 2141&lt;br /&gt;
| 085D&lt;br /&gt;
| Daniel Hohabir&lt;br /&gt;
|-&lt;br /&gt;
| 2142&lt;br /&gt;
| 085E&lt;br /&gt;
| GfxBase, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2143&lt;br /&gt;
| 085F&lt;br /&gt;
| Axellabs&lt;br /&gt;
|-&lt;br /&gt;
| 2144&lt;br /&gt;
| 0860&lt;br /&gt;
| Roctec Electronics Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2145&lt;br /&gt;
| 0861&lt;br /&gt;
| Omega Datentechnik&lt;br /&gt;
|-&lt;br /&gt;
| 2146&lt;br /&gt;
| 0862&lt;br /&gt;
| Atlantis&lt;br /&gt;
|-&lt;br /&gt;
| 2147&lt;br /&gt;
| 0863&lt;br /&gt;
| Skytec Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2148&lt;br /&gt;
| 0864&lt;br /&gt;
| Protar Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2149&lt;br /&gt;
| 0865&lt;br /&gt;
| ACS&lt;br /&gt;
|-&lt;br /&gt;
| 2150&lt;br /&gt;
| 0866&lt;br /&gt;
| Software Results Enterprises&lt;br /&gt;
| Originally registered to University of Illinois&lt;br /&gt;
|-&lt;br /&gt;
| 2151&lt;br /&gt;
| 0867&lt;br /&gt;
| Infinity Systems Design Group&lt;br /&gt;
|-&lt;br /&gt;
| 2152&lt;br /&gt;
| 0868&lt;br /&gt;
| Trade It&lt;br /&gt;
|-&lt;br /&gt;
| 2153&lt;br /&gt;
| 0869&lt;br /&gt;
| Suntec, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2154&lt;br /&gt;
| 086A&lt;br /&gt;
| DJW Micro Systems&lt;br /&gt;
| Originally registered to Tritec Marketing&lt;br /&gt;
|-&lt;br /&gt;
| 2155&lt;br /&gt;
| 086B&lt;br /&gt;
| Power Computing Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2156&lt;br /&gt;
| 086C&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 2157&lt;br /&gt;
| 086D&lt;br /&gt;
| Masoboshi GmbH (DCE)&lt;br /&gt;
|-&lt;br /&gt;
| 2158&lt;br /&gt;
| 086E&lt;br /&gt;
| HAL Software Hardware Handel&lt;br /&gt;
|-&lt;br /&gt;
| 2159&lt;br /&gt;
| 086F&lt;br /&gt;
| Mainhattan Data&lt;br /&gt;
| Originally registered to Michael Lamm Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2160&lt;br /&gt;
| 0870&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
| Originally registered to bbdp Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2161&lt;br /&gt;
| 0871&lt;br /&gt;
| Blue Ribbon Soundworks&lt;br /&gt;
| Originally registered to Design Computer Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2162&lt;br /&gt;
| 0872&lt;br /&gt;
| XPert&lt;br /&gt;
| Originally registered to The Station&lt;br /&gt;
|-&lt;br /&gt;
| 2163&lt;br /&gt;
| 0873&lt;br /&gt;
| DelaComp&lt;br /&gt;
| Originally registered to Bryan Williams&lt;br /&gt;
|-&lt;br /&gt;
| 2164&lt;br /&gt;
| 0874&lt;br /&gt;
| Superformance Computer Engineering GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2165&lt;br /&gt;
| 0875&lt;br /&gt;
| Overland Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2166&lt;br /&gt;
| 0876&lt;br /&gt;
| Thomas Hamren&lt;br /&gt;
|-&lt;br /&gt;
| 2167&lt;br /&gt;
| 0877&lt;br /&gt;
| Village Tronic&lt;br /&gt;
|-&lt;br /&gt;
| 2168&lt;br /&gt;
| 0878&lt;br /&gt;
| Toolbox Design&lt;br /&gt;
|-&lt;br /&gt;
| 2169&lt;br /&gt;
| 0879&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
|-&lt;br /&gt;
| 2170&lt;br /&gt;
| 087A&lt;br /&gt;
| Superformance&lt;br /&gt;
|-&lt;br /&gt;
| 2171&lt;br /&gt;
| 087B&lt;br /&gt;
| Utilities Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2172&lt;br /&gt;
| 087C&lt;br /&gt;
| phase 5&lt;br /&gt;
|-&lt;br /&gt;
| 2173&lt;br /&gt;
| 087D&lt;br /&gt;
| Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2174&lt;br /&gt;
| 087E&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 2175&lt;br /&gt;
| 087F&lt;br /&gt;
| James Cook University of North Queensland&lt;br /&gt;
|-&lt;br /&gt;
| 2176&lt;br /&gt;
| 0880&lt;br /&gt;
| AmiTrix Development&lt;br /&gt;
|-&lt;br /&gt;
| 2177&lt;br /&gt;
| 0881&lt;br /&gt;
| Ferranti&lt;br /&gt;
|-&lt;br /&gt;
| 2178&lt;br /&gt;
| 0882&lt;br /&gt;
| Leviathan Development&lt;br /&gt;
|-&lt;br /&gt;
| 2179&lt;br /&gt;
| 0883&lt;br /&gt;
| United Video Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2180&lt;br /&gt;
| 0884&lt;br /&gt;
| GPSoft Pty. Ltd.&lt;br /&gt;
| Originally registered to Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2181&lt;br /&gt;
| 0885&lt;br /&gt;
| ArMAX&lt;br /&gt;
| Oliver Bausch&lt;br /&gt;
|-&lt;br /&gt;
| 2182&lt;br /&gt;
| 0886&lt;br /&gt;
| CP Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2183&lt;br /&gt;
| 0887&lt;br /&gt;
| AMOK - Amiga Module &amp;amp;amp; Oberon Klub&lt;br /&gt;
|-&lt;br /&gt;
| 2184&lt;br /&gt;
| 0888&lt;br /&gt;
| ITEK Neser &amp;amp;amp; Sieber GbR&lt;br /&gt;
|-&lt;br /&gt;
| 2185&lt;br /&gt;
| 0889&lt;br /&gt;
| Phillip C. Lello&lt;br /&gt;
|-&lt;br /&gt;
| 2186&lt;br /&gt;
| 088A&lt;br /&gt;
| Cyborg Design Services&lt;br /&gt;
|-&lt;br /&gt;
| 2187&lt;br /&gt;
| 088B&lt;br /&gt;
| G2 Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2188&lt;br /&gt;
| 088C&lt;br /&gt;
| Pro System Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2189&lt;br /&gt;
| 088D&lt;br /&gt;
| ZEUS Electronic&lt;br /&gt;
| Originally registered to MSPI (Markt &amp;amp;amp; Technik)&lt;br /&gt;
|-&lt;br /&gt;
| 2190&lt;br /&gt;
| 088E&lt;br /&gt;
| Altatech&lt;br /&gt;
|-&lt;br /&gt;
| 2191&lt;br /&gt;
| 088F&lt;br /&gt;
| NewTek&lt;br /&gt;
|-&lt;br /&gt;
| 2192&lt;br /&gt;
| 0890&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
| Originally registered to Hardware Design Udo Neuroth&lt;br /&gt;
|-&lt;br /&gt;
| 2193&lt;br /&gt;
| 0891&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Viona Development&lt;br /&gt;
|-&lt;br /&gt;
| 2194&lt;br /&gt;
| 0892&lt;br /&gt;
| Amitek&lt;br /&gt;
| Originally assigned to Marpet Developments&lt;br /&gt;
|-&lt;br /&gt;
| 2195&lt;br /&gt;
| 0893&lt;br /&gt;
| Ingenieurbuero Helfrich&lt;br /&gt;
|-&lt;br /&gt;
| 2196&lt;br /&gt;
| 0894&lt;br /&gt;
| The Neo Group&lt;br /&gt;
|-&lt;br /&gt;
| 2197&lt;br /&gt;
| 0895&lt;br /&gt;
| Cyon&lt;br /&gt;
|-&lt;br /&gt;
| 2198&lt;br /&gt;
| 0896&lt;br /&gt;
| Bob Research Group&lt;br /&gt;
|-&lt;br /&gt;
| 2199&lt;br /&gt;
| 0897&lt;br /&gt;
| Richmond Sound Design Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2200&lt;br /&gt;
| 0898&lt;br /&gt;
| US Cybernetics&lt;br /&gt;
|-&lt;br /&gt;
| 2201&lt;br /&gt;
| 0899&lt;br /&gt;
| Fulvio Ieva&lt;br /&gt;
|-&lt;br /&gt;
| 2202&lt;br /&gt;
| 089A&lt;br /&gt;
| Silicon Studio&lt;br /&gt;
|-&lt;br /&gt;
| 2203&lt;br /&gt;
| 089B&lt;br /&gt;
| MacroSystems (USA)&lt;br /&gt;
| Was named Micro System Devices&lt;br /&gt;
|-&lt;br /&gt;
| 2204&lt;br /&gt;
| 089C&lt;br /&gt;
| Conspector Entertainment&lt;br /&gt;
|-&lt;br /&gt;
| 2205&lt;br /&gt;
| 089D&lt;br /&gt;
| Laserforum&lt;br /&gt;
|-&lt;br /&gt;
| 2206&lt;br /&gt;
| 089E&lt;br /&gt;
| Elbox Computer&lt;br /&gt;
| Mistakenly used by Index Information Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2207&lt;br /&gt;
| 089F&lt;br /&gt;
| Applied Magic Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2208&lt;br /&gt;
| 08A0&lt;br /&gt;
| SDL Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2560&lt;br /&gt;
| 0A00&lt;br /&gt;
| Harms&lt;br /&gt;
|-&lt;br /&gt;
| 2588&lt;br /&gt;
| 0A1C&lt;br /&gt;
| A1K.org Community&lt;br /&gt;
|-&lt;br /&gt;
| 2640&lt;br /&gt;
| 0A50&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 3084&lt;br /&gt;
| 0C0C&lt;br /&gt;
| Team 4&lt;br /&gt;
|-&lt;br /&gt;
| 3643&lt;br /&gt;
| 0E3B&lt;br /&gt;
| E3B&lt;br /&gt;
| Michael Boehmer&lt;br /&gt;
|-&lt;br /&gt;
| 3855&lt;br /&gt;
| 0F0F&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 4096&lt;br /&gt;
| 1000&lt;br /&gt;
| MegaMicro&lt;br /&gt;
|-&lt;br /&gt;
| 4110&lt;br /&gt;
| 100E&lt;br /&gt;
| DigiFeX&lt;br /&gt;
|-&lt;br /&gt;
| 4136&lt;br /&gt;
| 1028&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
|-&lt;br /&gt;
| 4149&lt;br /&gt;
| 1035&lt;br /&gt;
| PROTAR&lt;br /&gt;
|-&lt;br /&gt;
| 4369&lt;br /&gt;
| 1111&lt;br /&gt;
| Frank Strauß Elektronik&lt;br /&gt;
| Also used by Kupke&lt;br /&gt;
|-&lt;br /&gt;
| 4626&lt;br /&gt;
| 1212&lt;br /&gt;
| Individual Computers&lt;br /&gt;
|-&lt;br /&gt;
| 4648&lt;br /&gt;
| 1228&lt;br /&gt;
| Flesch Hornemann Computer Elec.&lt;br /&gt;
|-&lt;br /&gt;
| 4680&lt;br /&gt;
| 1248&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 4711&lt;br /&gt;
| 1267&lt;br /&gt;
| RBM digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 4754&lt;br /&gt;
| 1292&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 5000&lt;br /&gt;
| 1388&lt;br /&gt;
| ITH&lt;br /&gt;
|-&lt;br /&gt;
| 5001&lt;br /&gt;
| 1389&lt;br /&gt;
| VMC&lt;br /&gt;
|-&lt;br /&gt;
| 5010&lt;br /&gt;
| 1392&lt;br /&gt;
| Ambience Creation Technology&lt;br /&gt;
|-&lt;br /&gt;
| 5011&lt;br /&gt;
| 1393&lt;br /&gt;
| Creative Development&lt;br /&gt;
|-&lt;br /&gt;
| 5012&lt;br /&gt;
| 1394&lt;br /&gt;
| Georg Braun&lt;br /&gt;
|-&lt;br /&gt;
| 5013&lt;br /&gt;
| 1395&lt;br /&gt;
| Swedish User Group of Amiga&lt;br /&gt;
|-&lt;br /&gt;
| 5014&lt;br /&gt;
| 1396&lt;br /&gt;
| Jakub Bednarski&lt;br /&gt;
|-&lt;br /&gt;
| 5015&lt;br /&gt;
| 1397&lt;br /&gt;
| KryoFlux, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5016&lt;br /&gt;
| 1398&lt;br /&gt;
| Igor Majstorovic&lt;br /&gt;
|-&lt;br /&gt;
| 5017&lt;br /&gt;
| 1399&lt;br /&gt;
| Alastair M. Robinson&lt;br /&gt;
|-&lt;br /&gt;
| 5018&lt;br /&gt;
| 139A&lt;br /&gt;
| Austex Software&lt;br /&gt;
|-&lt;br /&gt;
| 5019&lt;br /&gt;
| 139B&lt;br /&gt;
| Sören Gust&lt;br /&gt;
|-&lt;br /&gt;
| 5020&lt;br /&gt;
| 139C&lt;br /&gt;
| Rok Krajnc&lt;br /&gt;
|-&lt;br /&gt;
| 5030&lt;br /&gt;
| 13A6&lt;br /&gt;
| Tim Tashpulatov&lt;br /&gt;
|-&lt;br /&gt;
| 5040&lt;br /&gt;
| 13B0&lt;br /&gt;
| 7-bit&lt;br /&gt;
|-&lt;br /&gt;
| 5050&lt;br /&gt;
| 13BA&lt;br /&gt;
| Sakura IT&lt;br /&gt;
|-&lt;br /&gt;
| 5060&lt;br /&gt;
| 13C4&lt;br /&gt;
| FPGAArcade&lt;br /&gt;
|-&lt;br /&gt;
| 5070&lt;br /&gt;
| 13CE&lt;br /&gt;
| CancerSoft Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 5080&lt;br /&gt;
| 13D8&lt;br /&gt;
| Stephen Leary&lt;br /&gt;
|-&lt;br /&gt;
| 5090&lt;br /&gt;
| 13E2&lt;br /&gt;
| DMA Softlab LLC&lt;br /&gt;
|-&lt;br /&gt;
| 5100&lt;br /&gt;
| 13EC&lt;br /&gt;
| Brookhouse Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 5110&lt;br /&gt;
| 13F6&lt;br /&gt;
| Eduardo Arana&lt;br /&gt;
|-&lt;br /&gt;
| 5120&lt;br /&gt;
| 1400&lt;br /&gt;
| CS-LAB&lt;br /&gt;
|-&lt;br /&gt;
| 5130&lt;br /&gt;
| 140A&lt;br /&gt;
| Robert Miranda&lt;br /&gt;
|-&lt;br /&gt;
| 5132&lt;br /&gt;
| 140C&lt;br /&gt;
| UAS Interface Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5500&lt;br /&gt;
| 157C&lt;br /&gt;
| Inhouse Information&lt;br /&gt;
|-&lt;br /&gt;
| 5768&lt;br /&gt;
| 1688&lt;br /&gt;
| Bio Con&lt;br /&gt;
|-&lt;br /&gt;
| 6148&lt;br /&gt;
| 1804&lt;br /&gt;
| HK-Computer&lt;br /&gt;
|-&lt;br /&gt;
| 6502&lt;br /&gt;
| 1966&lt;br /&gt;
| Cloanto&lt;br /&gt;
|-&lt;br /&gt;
| 7777&lt;br /&gt;
| 1E61&lt;br /&gt;
| Rafal Gabriel Chyla&lt;br /&gt;
|-&lt;br /&gt;
| 8215&lt;br /&gt;
| 2017&lt;br /&gt;
| Vortex&lt;br /&gt;
|-&lt;br /&gt;
| 8244&lt;br /&gt;
| 2034&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 8290&lt;br /&gt;
| 2062&lt;br /&gt;
| Expansion Systems&lt;br /&gt;
|-&lt;br /&gt;
| 8448&lt;br /&gt;
| 2100&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 8512&lt;br /&gt;
| 2140&lt;br /&gt;
| Phase 5 Digital Products&lt;br /&gt;
|-&lt;br /&gt;
| 8553&lt;br /&gt;
| 2169&lt;br /&gt;
| Digital Processing Systems Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 8704&lt;br /&gt;
| 2200&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 8738&lt;br /&gt;
| 2222&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 9512&lt;br /&gt;
| 2528&lt;br /&gt;
| Tower Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 10676&lt;br /&gt;
| 29B4&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 14195&lt;br /&gt;
| 3773&lt;br /&gt;
| Media-net-Point&lt;br /&gt;
|-&lt;br /&gt;
| 14501&lt;br /&gt;
| 38A5&lt;br /&gt;
| Petsoff, Finland&lt;br /&gt;
|-&lt;br /&gt;
| 16375&lt;br /&gt;
| 3FF7&lt;br /&gt;
| Uwe Gerlach&lt;br /&gt;
|-&lt;br /&gt;
| 16707&lt;br /&gt;
| 4143&lt;br /&gt;
| Ateo Concepts&lt;br /&gt;
|-&lt;br /&gt;
| 16708&lt;br /&gt;
| 4144&lt;br /&gt;
| ALiENDESiGN&lt;br /&gt;
|-&lt;br /&gt;
| 16945&lt;br /&gt;
| 4231&lt;br /&gt;
| A.C.T.&lt;br /&gt;
|-&lt;br /&gt;
| 17740&lt;br /&gt;
| 454C&lt;br /&gt;
| HK-Computer (ELSAT)&lt;br /&gt;
|-&lt;br /&gt;
| 18260&lt;br /&gt;
| 4754&lt;br /&gt;
| MacroSystems (Germany)&lt;br /&gt;
|-&lt;br /&gt;
| 19796&lt;br /&gt;
| 4D54&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 22359&lt;br /&gt;
| 5757&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 26464&lt;br /&gt;
| 6760&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 26470&lt;br /&gt;
| 6766&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 28014&lt;br /&gt;
| 6D6E&lt;br /&gt;
| MNT Media and Technology UG&lt;br /&gt;
|-&lt;br /&gt;
| 32768&lt;br /&gt;
| 8000&lt;br /&gt;
| M.A.S.T.&lt;br /&gt;
|-&lt;br /&gt;
| 43437&lt;br /&gt;
| A9AD&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 43521&lt;br /&gt;
| AA01&lt;br /&gt;
| Cameron&lt;br /&gt;
|-&lt;br /&gt;
| 43537&lt;br /&gt;
| AA11&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 44359&lt;br /&gt;
| AD47&lt;br /&gt;
| Matay&lt;br /&gt;
|-&lt;br /&gt;
| 46504&lt;br /&gt;
| B5A8&lt;br /&gt;
| Phoenix&lt;br /&gt;
|-&lt;br /&gt;
| 49160&lt;br /&gt;
| C008&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 61453&lt;br /&gt;
| F00D&lt;br /&gt;
| Forefront Technologies Inc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For any changes/additions to this registry please use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9329</id>
		<title>Amiga Hardware Manufacturer ID Registry</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Amiga_Hardware_Manufacturer_ID_Registry&amp;diff=9329"/>
		<updated>2018-04-27T03:45:07Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Registry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= How to Obtain a Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Manufacturer&#039;s numbers are assigned by the AmigaOS development team. To obtain your unique manufacturer number use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;br /&gt;
&lt;br /&gt;
Be sure and include your name, email and the type of expansion product you are developing.&lt;br /&gt;
&lt;br /&gt;
= Your Manufacturer Number =&lt;br /&gt;
&lt;br /&gt;
Attention hardware manufacturers. If you are developing a hardware expansion product for the Classic Amiga (e.g. 500, 2000, 3000) then you will need to obtain a special manufacturer ID number from the AmigaOS development team to identify your product. This manufacturer number is used by the Amiga to link your hardware with its driver software at boot time.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number is part of the special protocol that the Amiga uses to automatically configure all expansion devices on the bus without the user having to cut jumpers or adjust dip switches. This is called auto-config.&lt;br /&gt;
&lt;br /&gt;
At start-up time, the system first polls each board in the system and assigns the board its own address space. If it is a memory board, its RAM is linked into the memory free pool. Later in the boot sequence, after DOS is initialized, the binddrivers program is run. Binddrivers will search the directory SYS:Expansion for the drivers that go with the boards.&lt;br /&gt;
&lt;br /&gt;
To do this binddrivers looks in the Tool Type field of all icon files in SYS:Expansion. If the first seven bytes of the Tool Type field are &amp;quot;PRODUCT&amp;quot;, then this is an icon file for a driver.&lt;br /&gt;
&lt;br /&gt;
Binddrivers will then attempt to match the drivers it has found with the boards that were found earlier. This is where your manufacturer number comes in.&lt;br /&gt;
&lt;br /&gt;
Your manufacturer number goes in two places. First, it is burned in hex form into the PAL which is part of ALL auto-config expansion products. Second, it appears in ASCII in the Tool Type field of the icon file for your product&#039;s driver. By matching these two numbers, the Amiga can automatically configure your board and bind it&#039;s software driver into the system as well.&lt;br /&gt;
&lt;br /&gt;
The manufacturer&#039;s number is a 16-bit ID which appears in PAL offsets $10-$17. There is also an 8-bit product number which you assign. The product number is for uniquely identifying different products from the same vendor. The product number will appear in PAL offsets $04-$07. This gives you a total of 24 bits to identify each of your products.&lt;br /&gt;
&lt;br /&gt;
These 24 bits of information in the PAL which identify your product are matched against the information in the Tool Type field of all icon files in the SYS:Expansion drawer. For example, suppose you are manufacturer #1019. You have two products, #1 and #2 which both use the same driver. The icon for your driver for these two products would have a Tool Type set to &amp;quot;PRODUCT=1019/1|1019/2&amp;quot;. This means: I am an icon for a driver that works with product number 1 or 2 from manufacturer 1019, now bind me. Spaces are not legal. Here are two other examples:&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1208/11&lt;br /&gt;
: is the Tool Type for a driver for product 11 from manufacturer number 1208.&lt;br /&gt;
&lt;br /&gt;
; PRODUCT=1017&lt;br /&gt;
: is the Tool Type for a driver for any product from manufacturer number 1017.&lt;br /&gt;
&lt;br /&gt;
For an informal explanation of the auto-configuration process, see the chapter on Software Expansion Architecture from the 2nd Annual Amiga Developer&#039;s Conference Notes (available on ADCD 2.1). For the details of timing, power, the PAL equations and PAL address specifications and the expansion library documentation, see sections 3.1 to 3.3 of the A500/A2000 Technical Reference Manual. The original auto-config spec appears in the A1000 Schematics and Expansion Specification.&lt;br /&gt;
&lt;br /&gt;
The auto-config process makes the addition of expansion products to the system very easy. All the user has to do is put the board in any slot and copy the driver from the release disk to his own SYS:Expansion drawer. Everything else is automatic. There are no jumpers or dip switches to set. Best of all, you will get a lot less support calls asking how to make your product work with the XYZ-Corp-battery-backed-clock.&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
Some notes on hardware manufacturer ID assignment.&lt;br /&gt;
&lt;br /&gt;
* Manufacturer ID numbers are assigned free of charge.&lt;br /&gt;
* Please provide the following information when requesting an ID:&lt;br /&gt;
*# Name of the company or person&lt;br /&gt;
*# Postal address/contact address&lt;br /&gt;
*# Name of the contact person, with a corresponding e-mail address&lt;br /&gt;
*# A brief description of the kind of products you want to produce&lt;br /&gt;
* All ID numbers smaller than 5000 must be considered unsafe because no information exists on which numbers exactly were taken during the time Commodore, Inc. disintegrated.&lt;br /&gt;
* ID numbers in the range 8192 to 18841 must be considered unsafe because some hardware developers mistook the numbers assigned to them to be given in hexadecimal format. Hence 0x2000 = 8192 and 0x4999 = 18841.&lt;br /&gt;
&lt;br /&gt;
= Example code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
/* Here is a short program which will tell you   */&lt;br /&gt;
/* about the expansion boards configured in your */&lt;br /&gt;
/* system without you opening up the machine.    */&lt;br /&gt;
/* Code by Bill Koester of CATS                  */&lt;br /&gt;
/*-----------------------------------------------*/&lt;br /&gt;
#include &amp;lt;libraries/configvars.h&amp;gt;&lt;br /&gt;
#include &amp;lt;libraries/expansion.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct ExpansionBase *ExpansionBase;&lt;br /&gt;
&lt;br /&gt;
void cleanup();&lt;br /&gt;
void printdev();&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   struct ConfigDev *MyConfigDev;&lt;br /&gt;
&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
   /* Open the expansion library,      */&lt;br /&gt;
   /* if there is a problem then exit  */&lt;br /&gt;
   /*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   ExpansionBase =(struct ExpansionBase *) OpenLibrary(EXPANSIONNAME,0);&lt;br /&gt;
   if(ExpansionBase==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error opening expansion library!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
   /* Use FindConfigDev to get info on the first */&lt;br /&gt;
   /* expansion board on the list maintained by  */&lt;br /&gt;
   /* Exec.  If there are no expansion boards in */&lt;br /&gt;
   /* the system then exit.                      */&lt;br /&gt;
   /*--------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = NULL;&lt;br /&gt;
&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
  /* FindConfigDev(oldConfigDev,manufacturer,product) */&lt;br /&gt;
  /* oldConfigDev = NULL for the top of the list      */&lt;br /&gt;
  /* manufacturer = -1 for any manufacturer           */&lt;br /&gt;
  /* product      = -1 for any product                */&lt;br /&gt;
  /*--------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   MyConfigDev = FindConfigDev(NULL,-1,-1);&lt;br /&gt;
&lt;br /&gt;
   if(MyConfigDev==NULL)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;No Configured Devices found!!\n&amp;quot;);&lt;br /&gt;
      cleanup();&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printdev(MyConfigDev);&lt;br /&gt;
&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
   /* OK, there is at least one board,  */&lt;br /&gt;
   /* so loop and get the entire list   */&lt;br /&gt;
   /* printing as we go with printdev() */&lt;br /&gt;
   /*-----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
   while(MyConfigDev = FindConfigDev(MyConfigDev,-1,-1))&lt;br /&gt;
   {&lt;br /&gt;
      printdev(MyConfigDev);&lt;br /&gt;
   }&lt;br /&gt;
   cleanup();&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
/* Close up shop...  */&lt;br /&gt;
/*-------------------*/&lt;br /&gt;
void cleanup()&lt;br /&gt;
{&lt;br /&gt;
   if(ExpansionBase)&lt;br /&gt;
      CloseLibrary(ExpansionBase);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
/* Print out the contents of the    */&lt;br /&gt;
/* dev structure for this expansion */&lt;br /&gt;
/* product.                         */&lt;br /&gt;
/*----------------------------------*/&lt;br /&gt;
&lt;br /&gt;
void printdev(dev)&lt;br /&gt;
struct ConfigDev *dev;&lt;br /&gt;
{&lt;br /&gt;
   char buff[200];&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Flags          = &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags==NULL)&lt;br /&gt;
      printf(&amp;quot;NULL  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_SHUTUP)&lt;br /&gt;
      printf(&amp;quot;CDF_SHUTUP  &amp;quot;);&lt;br /&gt;
   if(dev-&amp;gt;cd_Flags&amp;amp;CDF_CONFIGME)&lt;br /&gt;
      printf(&amp;quot;CDF_CONFIGME  &amp;quot;);&lt;br /&gt;
   printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
   printf(&amp;quot;Board Address  = %x\n&amp;quot;,dev-&amp;gt;cd_BoardAddr);&lt;br /&gt;
   printf(&amp;quot;Board Size     = %d bytes\n&amp;quot;,dev-&amp;gt;cd_BoardSize);&lt;br /&gt;
   printf(&amp;quot;Slot  Address  = %d\n&amp;quot;,dev-&amp;gt;cd_SlotAddr);&lt;br /&gt;
   printf(&amp;quot;Slot  Size     = %d\n&amp;quot;,dev-&amp;gt;cd_SlotSize);&lt;br /&gt;
   printf(&amp;quot;Driver code at   %x\n&amp;quot;,dev-&amp;gt;cd_Driver);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;er_Type         = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Type);&lt;br /&gt;
   printf(&amp;quot;er_Product      = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Product);&lt;br /&gt;
   printf(&amp;quot;er_Flags        = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Flags);&lt;br /&gt;
   printf(&amp;quot;er_Reserved03   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved03);&lt;br /&gt;
   printf(&amp;quot;er_Manufacturer = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Manufacturer);&lt;br /&gt;
   printf(&amp;quot;er_SerialNumber = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_SerialNumber);&lt;br /&gt;
   printf(&amp;quot;er_InitDiagVec  = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_InitDiagVec);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0c   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0c);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0d   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0d);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0e   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0e);&lt;br /&gt;
   printf(&amp;quot;er_Reserved0f   = %x\n&amp;quot;,dev-&amp;gt;cd_Rom.er_Reserved0f);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Hit Return to continue:\n&amp;quot;);&lt;br /&gt;
   gets(buff);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Registry =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (decimal)&lt;br /&gt;
! ID (hexadecimal)&lt;br /&gt;
! Manufacturer&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 211&lt;br /&gt;
| 00D3&lt;br /&gt;
| Pacific Peripherals/Profex&lt;br /&gt;
|-&lt;br /&gt;
| 221&lt;br /&gt;
| 00DD&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 256&lt;br /&gt;
| 0100&lt;br /&gt;
| Memphis&lt;br /&gt;
| Originally registered to MacroSystems US&lt;br /&gt;
|-&lt;br /&gt;
| 512&lt;br /&gt;
| 0200&lt;br /&gt;
| 3-State Computertechnik&lt;br /&gt;
|-&lt;br /&gt;
| 513&lt;br /&gt;
| 0201&lt;br /&gt;
| Commodore (Braunschweig)&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| 0202&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
|-&lt;br /&gt;
| 515&lt;br /&gt;
| 0203&lt;br /&gt;
| Commodore (West Chester)&lt;br /&gt;
| Originally registered to Combitech/Macrosystem&lt;br /&gt;
|-&lt;br /&gt;
| 756&lt;br /&gt;
| 02F4&lt;br /&gt;
| Progressive Peripherals &amp;amp; Software&lt;br /&gt;
|-&lt;br /&gt;
| 767&lt;br /&gt;
| 02FF&lt;br /&gt;
| Kolff Computer Supplies&lt;br /&gt;
|-&lt;br /&gt;
| 1001&lt;br /&gt;
| 03E9&lt;br /&gt;
| Tecmar&lt;br /&gt;
|-&lt;br /&gt;
| 1002&lt;br /&gt;
| 03EA&lt;br /&gt;
| Telesys&lt;br /&gt;
|-&lt;br /&gt;
| 1003&lt;br /&gt;
| 03EB&lt;br /&gt;
| The Micro-Forge&lt;br /&gt;
|-&lt;br /&gt;
| 1004&lt;br /&gt;
| 03EC&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
| Originally registered to Card Co. (Supra)&lt;br /&gt;
|-&lt;br /&gt;
| 1005&lt;br /&gt;
| 03ED&lt;br /&gt;
| A-Squared&lt;br /&gt;
|-&lt;br /&gt;
| 1006&lt;br /&gt;
| 03EE&lt;br /&gt;
| Comspec Communications&lt;br /&gt;
|-&lt;br /&gt;
| 1007&lt;br /&gt;
| 03EF&lt;br /&gt;
| HT Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1008&lt;br /&gt;
| 03F0&lt;br /&gt;
| RDS Software&lt;br /&gt;
|-&lt;br /&gt;
| 1009&lt;br /&gt;
| 03F1&lt;br /&gt;
| Anakin Research&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| 03F2&lt;br /&gt;
| MicroBotics&lt;br /&gt;
|-&lt;br /&gt;
| 1011&lt;br /&gt;
| 03F3&lt;br /&gt;
| Bob Krauth&lt;br /&gt;
|-&lt;br /&gt;
| 1012&lt;br /&gt;
| 03F4&lt;br /&gt;
| Access Associates (Alegra)&lt;br /&gt;
|-&lt;br /&gt;
| 1013&lt;br /&gt;
| 03F5&lt;br /&gt;
| Mini Comp Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 1014&lt;br /&gt;
| 03F6&lt;br /&gt;
| Cypress Technology&lt;br /&gt;
|-&lt;br /&gt;
| 1015&lt;br /&gt;
| 03F7&lt;br /&gt;
| Fuller Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1016&lt;br /&gt;
| 03F8&lt;br /&gt;
| Galaxy Computers&lt;br /&gt;
|-&lt;br /&gt;
| 1017&lt;br /&gt;
| 03F9&lt;br /&gt;
| ADA Research&lt;br /&gt;
|-&lt;br /&gt;
| 1018&lt;br /&gt;
| 03FA&lt;br /&gt;
| Computer Service Italia&lt;br /&gt;
|-&lt;br /&gt;
| 1019&lt;br /&gt;
| 03FB&lt;br /&gt;
| Amigo&lt;br /&gt;
|-&lt;br /&gt;
| 1020&lt;br /&gt;
| 03FC&lt;br /&gt;
| Micro-Solutions Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1021&lt;br /&gt;
| 03FD&lt;br /&gt;
| Stacar International&lt;br /&gt;
|-&lt;br /&gt;
| 1022&lt;br /&gt;
| 03FE&lt;br /&gt;
| Video Precisions&lt;br /&gt;
|-&lt;br /&gt;
| 1023&lt;br /&gt;
| 03FF&lt;br /&gt;
| ASDG, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1025&lt;br /&gt;
| 0401&lt;br /&gt;
| Ing. Buero Kalawsky&lt;br /&gt;
|-&lt;br /&gt;
| 1026&lt;br /&gt;
| 0402&lt;br /&gt;
| Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 1027&lt;br /&gt;
| 0403&lt;br /&gt;
| Interplan Unternehmensberatung&lt;br /&gt;
|-&lt;br /&gt;
| 1028&lt;br /&gt;
| 0404&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
| Originally registered to Peter Ohlich&lt;br /&gt;
|-&lt;br /&gt;
| 1030&lt;br /&gt;
| 0406&lt;br /&gt;
| Commodore (Lowell University)&lt;br /&gt;
| Originally registered to Productivity Center&lt;br /&gt;
|-&lt;br /&gt;
| 1041&lt;br /&gt;
| 0411&lt;br /&gt;
| Design Labs&lt;br /&gt;
|-&lt;br /&gt;
| 1042&lt;br /&gt;
| 0412&lt;br /&gt;
| MCS&lt;br /&gt;
|-&lt;br /&gt;
| 1043&lt;br /&gt;
| 0413&lt;br /&gt;
| B. J. Freeman&lt;br /&gt;
|-&lt;br /&gt;
| 1044&lt;br /&gt;
| 0414&lt;br /&gt;
| Side Effects Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1045&lt;br /&gt;
| 0415&lt;br /&gt;
| Oklahoma Personal Comp.&lt;br /&gt;
|-&lt;br /&gt;
| 1046&lt;br /&gt;
| 0416&lt;br /&gt;
| Advanced Micro Innovations&lt;br /&gt;
|-&lt;br /&gt;
| 1047&lt;br /&gt;
| 0417&lt;br /&gt;
| Industrial Support Services&lt;br /&gt;
|-&lt;br /&gt;
| 1048&lt;br /&gt;
| 0418&lt;br /&gt;
| Technisoft&lt;br /&gt;
|-&lt;br /&gt;
| 1049&lt;br /&gt;
| 0419&lt;br /&gt;
| Prolific, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1050&lt;br /&gt;
| 041A&lt;br /&gt;
| Softeam, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1051&lt;br /&gt;
| 041B&lt;br /&gt;
| GRC Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 1052&lt;br /&gt;
| 041C&lt;br /&gt;
| David Lai&lt;br /&gt;
|-&lt;br /&gt;
| 1053&lt;br /&gt;
| 041D&lt;br /&gt;
| Ameristar Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 1054&lt;br /&gt;
| 041E&lt;br /&gt;
| Cline Refrigeration&lt;br /&gt;
|-&lt;br /&gt;
| 1055&lt;br /&gt;
| 041F&lt;br /&gt;
| Cardiac Pacemakers, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1056&lt;br /&gt;
| 0420&lt;br /&gt;
| Supra Corp. (Creative Microsystems)&lt;br /&gt;
|-&lt;br /&gt;
| 1057&lt;br /&gt;
| 0421&lt;br /&gt;
| Wayne Diener&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| 0422&lt;br /&gt;
| Computer Systems Associates (CSA)&lt;br /&gt;
|-&lt;br /&gt;
| 1059&lt;br /&gt;
| 0423&lt;br /&gt;
| Trionix, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 1060&lt;br /&gt;
| 0424&lt;br /&gt;
| David Lucas&lt;br /&gt;
|-&lt;br /&gt;
| 1061&lt;br /&gt;
| 0425&lt;br /&gt;
| Analog Precision&lt;br /&gt;
| Also assigned to D &amp;amp; L Distributing&lt;br /&gt;
|-&lt;br /&gt;
| 1267&lt;br /&gt;
| 04F3&lt;br /&gt;
| RBM Digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 1282&lt;br /&gt;
| 0502&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
|-&lt;br /&gt;
| 1337&lt;br /&gt;
| 0539&lt;br /&gt;
| Thomas Stenzel (DaFR34K)&lt;br /&gt;
|-&lt;br /&gt;
| 1576&lt;br /&gt;
| 0628&lt;br /&gt;
| Boris Križma&lt;br /&gt;
|-&lt;br /&gt;
| 1761&lt;br /&gt;
| 06E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 1803&lt;br /&gt;
| 070B&lt;br /&gt;
| UAE Amiga Emulator&lt;br /&gt;
|-&lt;br /&gt;
| 2002&lt;br /&gt;
| 07D2&lt;br /&gt;
| Mimetics Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2003&lt;br /&gt;
| 07D3&lt;br /&gt;
| ACDA&lt;br /&gt;
|-&lt;br /&gt;
| 2004&lt;br /&gt;
| 07D4&lt;br /&gt;
| Finn R. Jacobsen&lt;br /&gt;
|-&lt;br /&gt;
| 2005&lt;br /&gt;
| 07D5&lt;br /&gt;
| Elthen Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2006&lt;br /&gt;
| 07D6&lt;br /&gt;
| Nine Tiles Computer Systems Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2007&lt;br /&gt;
| 07D7&lt;br /&gt;
| Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2008&lt;br /&gt;
| 07D8&lt;br /&gt;
| Bell &amp;amp;amp; Howell&lt;br /&gt;
|-&lt;br /&gt;
| 2009&lt;br /&gt;
| 07D9&lt;br /&gt;
| Roland Kochler&lt;br /&gt;
|-&lt;br /&gt;
| 2010&lt;br /&gt;
| 07DA&lt;br /&gt;
| Byte Corp.&lt;br /&gt;
|-&lt;br /&gt;
| 2011&lt;br /&gt;
| 07DB&lt;br /&gt;
| Reserved&lt;br /&gt;
|-&lt;br /&gt;
| 2012&lt;br /&gt;
| 07DC&lt;br /&gt;
| DKB, Inc.&lt;br /&gt;
| Previously named Michigan Software&lt;br /&gt;
|-&lt;br /&gt;
| 2013&lt;br /&gt;
| 07DD&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2014&lt;br /&gt;
| 07DE&lt;br /&gt;
| Sysaphus Software&lt;br /&gt;
|-&lt;br /&gt;
| 2015&lt;br /&gt;
| 07DF&lt;br /&gt;
| Digitronics&lt;br /&gt;
|-&lt;br /&gt;
| 2016&lt;br /&gt;
| 07E0&lt;br /&gt;
| Akron Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2017&lt;br /&gt;
| 07E1&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
|-&lt;br /&gt;
| 2018&lt;br /&gt;
| 07E2&lt;br /&gt;
| Calmos&lt;br /&gt;
|-&lt;br /&gt;
| 2019&lt;br /&gt;
| 07E3&lt;br /&gt;
| Dover Research&lt;br /&gt;
|-&lt;br /&gt;
| 2020&lt;br /&gt;
| 07E4&lt;br /&gt;
| David Krehbiel&lt;br /&gt;
|-&lt;br /&gt;
| 2021&lt;br /&gt;
| 07E5&lt;br /&gt;
| Synergy Peripheral Systems&lt;br /&gt;
| Also known as California Access&lt;br /&gt;
|-&lt;br /&gt;
| 2022&lt;br /&gt;
| 07E6&lt;br /&gt;
| Xetec&lt;br /&gt;
|-&lt;br /&gt;
| 2023&lt;br /&gt;
| 07E7&lt;br /&gt;
| Micron Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2024&lt;br /&gt;
| 07E8&lt;br /&gt;
| CH Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2025&lt;br /&gt;
| 07E9&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2026&lt;br /&gt;
| 07EA&lt;br /&gt;
| Progressive Peripherals &amp;amp;amp; Software&lt;br /&gt;
| Also used by Ateo&lt;br /&gt;
|-&lt;br /&gt;
| 2027&lt;br /&gt;
| 07EB&lt;br /&gt;
| Wicat Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2028&lt;br /&gt;
| 07EC&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2029&lt;br /&gt;
| 07ED&lt;br /&gt;
| Delaware Valley Software&lt;br /&gt;
|-&lt;br /&gt;
| 2030&lt;br /&gt;
| 07EE&lt;br /&gt;
| Palomax&lt;br /&gt;
|-&lt;br /&gt;
| 2031&lt;br /&gt;
| 07EF&lt;br /&gt;
| Incognito Software&lt;br /&gt;
|-&lt;br /&gt;
| 2032&lt;br /&gt;
| 07F0&lt;br /&gt;
| Jadesign&lt;br /&gt;
|-&lt;br /&gt;
| 2033&lt;br /&gt;
| 07F1&lt;br /&gt;
| BVR&lt;br /&gt;
|-&lt;br /&gt;
| 2034&lt;br /&gt;
| 07F2&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2035&lt;br /&gt;
| 07F3&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2036&lt;br /&gt;
| 07F4&lt;br /&gt;
| Atronic&lt;br /&gt;
|-&lt;br /&gt;
| 2037&lt;br /&gt;
| 07F5&lt;br /&gt;
| Scott Karlin&lt;br /&gt;
|-&lt;br /&gt;
| 2038&lt;br /&gt;
| 07F6&lt;br /&gt;
| Howitch&lt;br /&gt;
|-&lt;br /&gt;
| 2039&lt;br /&gt;
| 07F7&lt;br /&gt;
| Sullivan Brothers Visual Engineers&lt;br /&gt;
|-&lt;br /&gt;
| 2040&lt;br /&gt;
| 07F8&lt;br /&gt;
| G I T&lt;br /&gt;
|-&lt;br /&gt;
| 2041&lt;br /&gt;
| 07F9&lt;br /&gt;
| Amigo Business Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2042&lt;br /&gt;
| 07FA&lt;br /&gt;
| Micro E Ab&lt;br /&gt;
|-&lt;br /&gt;
| 2043&lt;br /&gt;
| 07FB&lt;br /&gt;
| Ralph Kruse&lt;br /&gt;
|-&lt;br /&gt;
| 2044&lt;br /&gt;
| 07FC&lt;br /&gt;
| Clearpoint Research&lt;br /&gt;
|-&lt;br /&gt;
| 2045&lt;br /&gt;
| 07FD&lt;br /&gt;
| Kodiak&lt;br /&gt;
|-&lt;br /&gt;
| 2046&lt;br /&gt;
| 07FE&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Phoenix Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2047&lt;br /&gt;
| 07FF&lt;br /&gt;
| No Name Shown&lt;br /&gt;
|-&lt;br /&gt;
| 2048&lt;br /&gt;
| 0800&lt;br /&gt;
| Commodore Braunschweig&lt;br /&gt;
|-&lt;br /&gt;
| 2049&lt;br /&gt;
| 0801&lt;br /&gt;
| BSC&lt;br /&gt;
| Originally registered to Elaborate Bytes&lt;br /&gt;
|-&lt;br /&gt;
| 2050&lt;br /&gt;
| 0802&lt;br /&gt;
| Kronos/C Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2051&lt;br /&gt;
| 0803&lt;br /&gt;
| Spartanics&lt;br /&gt;
|-&lt;br /&gt;
| 2052&lt;br /&gt;
| 0804&lt;br /&gt;
| Jochheim Computer Tuning&lt;br /&gt;
|-&lt;br /&gt;
| 2053&lt;br /&gt;
| 0805&lt;br /&gt;
| Trans Data Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2054&lt;br /&gt;
| 0806&lt;br /&gt;
| Applied Systems &amp;amp;amp; Peripherals Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2055&lt;br /&gt;
| 0807&lt;br /&gt;
| Checkpoint Technologies&lt;br /&gt;
| Originally registered to Amiga Solutions&lt;br /&gt;
|-&lt;br /&gt;
| 2056&lt;br /&gt;
| 0808&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2057&lt;br /&gt;
| 0809&lt;br /&gt;
| Advanced Computer Design&lt;br /&gt;
|-&lt;br /&gt;
| 2058&lt;br /&gt;
| 080A&lt;br /&gt;
| Sir Netics&lt;br /&gt;
|-&lt;br /&gt;
| 2059&lt;br /&gt;
| 080B&lt;br /&gt;
| Expert Services&lt;br /&gt;
|-&lt;br /&gt;
| 2060&lt;br /&gt;
| 080C&lt;br /&gt;
| Digital Art Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2061&lt;br /&gt;
| 080D&lt;br /&gt;
| Adept Development&lt;br /&gt;
|-&lt;br /&gt;
| 2062&lt;br /&gt;
| 080E&lt;br /&gt;
| Expansion Technologies (Expansion Systems)&lt;br /&gt;
|-&lt;br /&gt;
| 2063&lt;br /&gt;
| 080F&lt;br /&gt;
| Alphatech&lt;br /&gt;
|-&lt;br /&gt;
| 2064&lt;br /&gt;
| 0810&lt;br /&gt;
| Edotronik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2065&lt;br /&gt;
| 0811&lt;br /&gt;
| California Access/Synergy&lt;br /&gt;
| Originally registered to Logical Design Works&lt;br /&gt;
|-&lt;br /&gt;
| 2066&lt;br /&gt;
| 0812&lt;br /&gt;
| Bowden, Williams, Full &amp;amp; Assoc.&lt;br /&gt;
|-&lt;br /&gt;
| 2067&lt;br /&gt;
| 0813&lt;br /&gt;
| NES, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2068&lt;br /&gt;
| 0814&lt;br /&gt;
| Amdev&lt;br /&gt;
|-&lt;br /&gt;
| 2069&lt;br /&gt;
| 0815&lt;br /&gt;
| Big Brother Security Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2070&lt;br /&gt;
| 0816&lt;br /&gt;
| Active Circuits Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2071&lt;br /&gt;
| 0817&lt;br /&gt;
| ICD, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2072&lt;br /&gt;
| 0818&lt;br /&gt;
| Multi-Meg Electronique&lt;br /&gt;
|-&lt;br /&gt;
| 2073&lt;br /&gt;
| 0819&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2074&lt;br /&gt;
| 081A&lt;br /&gt;
| The Checkered Ball&lt;br /&gt;
|-&lt;br /&gt;
| 2075&lt;br /&gt;
| 081B&lt;br /&gt;
| Hi Tension Computer Services Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2076&lt;br /&gt;
| 081C&lt;br /&gt;
| Alfa Data&lt;br /&gt;
| Originally assigned to Elmtech Research, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2077&lt;br /&gt;
| 081D&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Clartscreen, Ltd. (UK)&lt;br /&gt;
|-&lt;br /&gt;
| 2078&lt;br /&gt;
| 081E&lt;br /&gt;
| Interworks&lt;br /&gt;
|-&lt;br /&gt;
| 2079&lt;br /&gt;
| 081F&lt;br /&gt;
| Galysh Enterprises&lt;br /&gt;
|-&lt;br /&gt;
| 2080&lt;br /&gt;
| 0820&lt;br /&gt;
| Hardital Synthesis&lt;br /&gt;
| Originally registered to Realtime Games Software Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2081&lt;br /&gt;
| 0821&lt;br /&gt;
| GBS&lt;br /&gt;
|-&lt;br /&gt;
| 2082&lt;br /&gt;
| 0822&lt;br /&gt;
| Circum Design Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2083&lt;br /&gt;
| 0823&lt;br /&gt;
| Alberta Micro Electronic Center&lt;br /&gt;
|-&lt;br /&gt;
| 2084&lt;br /&gt;
| 0824&lt;br /&gt;
| Bestech&lt;br /&gt;
|-&lt;br /&gt;
| 2085&lt;br /&gt;
| 0825&lt;br /&gt;
| Lasar Fantasy&lt;br /&gt;
|-&lt;br /&gt;
| 2086&lt;br /&gt;
| 0826&lt;br /&gt;
| Pulsar&lt;br /&gt;
|-&lt;br /&gt;
| 2087&lt;br /&gt;
| 0827&lt;br /&gt;
| Ivis&lt;br /&gt;
|-&lt;br /&gt;
| 2088&lt;br /&gt;
| 0828&lt;br /&gt;
| Applied Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2089&lt;br /&gt;
| 0829&lt;br /&gt;
| Solid-State Design &amp;amp;amp; Development&lt;br /&gt;
|-&lt;br /&gt;
| 2090&lt;br /&gt;
| 082A&lt;br /&gt;
| Vison Quest&lt;br /&gt;
|-&lt;br /&gt;
| 2091&lt;br /&gt;
| 082B&lt;br /&gt;
| Seaview Software&lt;br /&gt;
|-&lt;br /&gt;
| 2092&lt;br /&gt;
| 082C&lt;br /&gt;
| BSC&lt;br /&gt;
| Mistakenly used by ADS (Advanced Development Software)&lt;br /&gt;
|-&lt;br /&gt;
| 2093&lt;br /&gt;
| 082D&lt;br /&gt;
| Bernd Culenfeld&lt;br /&gt;
|-&lt;br /&gt;
| 2094&lt;br /&gt;
| 082E&lt;br /&gt;
| American Liquid Light&lt;br /&gt;
|-&lt;br /&gt;
| 2095&lt;br /&gt;
| 082F&lt;br /&gt;
| CEGITES&lt;br /&gt;
|-&lt;br /&gt;
| 2096&lt;br /&gt;
| 0830&lt;br /&gt;
| Quadlite Computers Ltd.&lt;br /&gt;
| Originally registered to EV Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2097&lt;br /&gt;
| 0831&lt;br /&gt;
| Silicon Peace&lt;br /&gt;
|-&lt;br /&gt;
| 2098&lt;br /&gt;
| 0832&lt;br /&gt;
| Black Belt Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2099&lt;br /&gt;
| 0833&lt;br /&gt;
| Village Tronic&lt;br /&gt;
| Originally registerd to Steve Yaeger&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 0834&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 2101&lt;br /&gt;
| 0835&lt;br /&gt;
| Phoenix Micro Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 2102&lt;br /&gt;
| 0836&lt;br /&gt;
| Advanced Systems &amp;amp; Software&lt;br /&gt;
| Orignally assigned to Preferred Technology&lt;br /&gt;
|-&lt;br /&gt;
| 2103&lt;br /&gt;
| 0837&lt;br /&gt;
| Rombo Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2104&lt;br /&gt;
| 0838&lt;br /&gt;
| Impulse Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2105&lt;br /&gt;
| 0839&lt;br /&gt;
| Beta Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2106&lt;br /&gt;
| 083A&lt;br /&gt;
| Memory Expansion System, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2107&lt;br /&gt;
| 083B&lt;br /&gt;
| Vortex Computer Systems GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2108&lt;br /&gt;
| 083C&lt;br /&gt;
| Platypus Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2109&lt;br /&gt;
| 083D&lt;br /&gt;
| Gigatron OHG&lt;br /&gt;
|-&lt;br /&gt;
| 2110&lt;br /&gt;
| 083E&lt;br /&gt;
| PG Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2111&lt;br /&gt;
| 083F&lt;br /&gt;
| New Technologies Group&lt;br /&gt;
|-&lt;br /&gt;
| 2112&lt;br /&gt;
| 0840&lt;br /&gt;
| Interactive Video Systems (IVS)&lt;br /&gt;
| Pacific Peripherals&lt;br /&gt;
|-&lt;br /&gt;
| 2113&lt;br /&gt;
| 0841&lt;br /&gt;
| Vector&lt;br /&gt;
| Originally registered to H. K. Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2114&lt;br /&gt;
| 0842&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to C. H. Helfrich Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 2115&lt;br /&gt;
| 0843&lt;br /&gt;
| Xanadu&lt;br /&gt;
|-&lt;br /&gt;
| 2116&lt;br /&gt;
| 0844&lt;br /&gt;
| Pacific Digital&lt;br /&gt;
| Originally registered to AMS&lt;br /&gt;
|-&lt;br /&gt;
| 2117&lt;br /&gt;
| 0845&lt;br /&gt;
| X-Pert&lt;br /&gt;
|-&lt;br /&gt;
| 2118&lt;br /&gt;
| 0846&lt;br /&gt;
| The Amiga Centre&lt;br /&gt;
|-&lt;br /&gt;
| 2119&lt;br /&gt;
| 0847&lt;br /&gt;
| Digital Pacific&lt;br /&gt;
|-&lt;br /&gt;
| 2120&lt;br /&gt;
| 0848&lt;br /&gt;
| Solid State Leisure&lt;br /&gt;
|-&lt;br /&gt;
| 2121&lt;br /&gt;
| 0849&lt;br /&gt;
| Hydra Systems&lt;br /&gt;
| Originally registered to Analog Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2122&lt;br /&gt;
| 084A&lt;br /&gt;
| Cumana&lt;br /&gt;
|-&lt;br /&gt;
| 2123&lt;br /&gt;
| 084B&lt;br /&gt;
| KAPS 2C Conception&lt;br /&gt;
|-&lt;br /&gt;
| 2124&lt;br /&gt;
| 084C&lt;br /&gt;
| Mike Mason&lt;br /&gt;
|-&lt;br /&gt;
| 2125&lt;br /&gt;
| 084D&lt;br /&gt;
| For Your Eyes&lt;br /&gt;
|-&lt;br /&gt;
| 2126&lt;br /&gt;
| 084E&lt;br /&gt;
| Volkmar Breitfeld Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2127&lt;br /&gt;
| 084F&lt;br /&gt;
| Sunrize Industries&lt;br /&gt;
|-&lt;br /&gt;
| 2128&lt;br /&gt;
| 0850&lt;br /&gt;
| Scott Advanced Micro Designs&lt;br /&gt;
|-&lt;br /&gt;
| 2129&lt;br /&gt;
| 0851&lt;br /&gt;
| Digital Micronics&lt;br /&gt;
|-&lt;br /&gt;
| 2130&lt;br /&gt;
| 0852&lt;br /&gt;
| Alfa-Laval&lt;br /&gt;
|-&lt;br /&gt;
| 2131&lt;br /&gt;
| 0853&lt;br /&gt;
| Multigros A/S&lt;br /&gt;
|-&lt;br /&gt;
| 2132&lt;br /&gt;
| 0854&lt;br /&gt;
| Archos&lt;br /&gt;
|-&lt;br /&gt;
| 2133&lt;br /&gt;
| 0855&lt;br /&gt;
| Icom Simulations&lt;br /&gt;
|-&lt;br /&gt;
| 2134&lt;br /&gt;
| 0856&lt;br /&gt;
| Commodore Test Engineering Group&lt;br /&gt;
|-&lt;br /&gt;
| 2135&lt;br /&gt;
| 0857&lt;br /&gt;
| Microcreations&lt;br /&gt;
|-&lt;br /&gt;
| 2136&lt;br /&gt;
| 0858&lt;br /&gt;
| Shoestring Productions&lt;br /&gt;
|-&lt;br /&gt;
| 2137&lt;br /&gt;
| 0859&lt;br /&gt;
| Faberushi&lt;br /&gt;
|-&lt;br /&gt;
| 2138&lt;br /&gt;
| 085A&lt;br /&gt;
| Evesham Micro Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2139&lt;br /&gt;
| 085B&lt;br /&gt;
| Panagolin Laser Software&lt;br /&gt;
|-&lt;br /&gt;
| 2140&lt;br /&gt;
| 085C&lt;br /&gt;
| Thomas Rudloff&lt;br /&gt;
|-&lt;br /&gt;
| 2141&lt;br /&gt;
| 085D&lt;br /&gt;
| Daniel Hohabir&lt;br /&gt;
|-&lt;br /&gt;
| 2142&lt;br /&gt;
| 085E&lt;br /&gt;
| GfxBase, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2143&lt;br /&gt;
| 085F&lt;br /&gt;
| Axellabs&lt;br /&gt;
|-&lt;br /&gt;
| 2144&lt;br /&gt;
| 0860&lt;br /&gt;
| Roctec Electronics Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2145&lt;br /&gt;
| 0861&lt;br /&gt;
| Omega Datentechnik&lt;br /&gt;
|-&lt;br /&gt;
| 2146&lt;br /&gt;
| 0862&lt;br /&gt;
| Atlantis&lt;br /&gt;
|-&lt;br /&gt;
| 2147&lt;br /&gt;
| 0863&lt;br /&gt;
| Skytec Computers&lt;br /&gt;
|-&lt;br /&gt;
| 2148&lt;br /&gt;
| 0864&lt;br /&gt;
| Protar Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2149&lt;br /&gt;
| 0865&lt;br /&gt;
| ACS&lt;br /&gt;
|-&lt;br /&gt;
| 2150&lt;br /&gt;
| 0866&lt;br /&gt;
| Software Results Enterprises&lt;br /&gt;
| Originally registered to University of Illinois&lt;br /&gt;
|-&lt;br /&gt;
| 2151&lt;br /&gt;
| 0867&lt;br /&gt;
| Infinity Systems Design Group&lt;br /&gt;
|-&lt;br /&gt;
| 2152&lt;br /&gt;
| 0868&lt;br /&gt;
| Trade It&lt;br /&gt;
|-&lt;br /&gt;
| 2153&lt;br /&gt;
| 0869&lt;br /&gt;
| Suntec, Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2154&lt;br /&gt;
| 086A&lt;br /&gt;
| DJW Micro Systems&lt;br /&gt;
| Originally registered to Tritec Marketing&lt;br /&gt;
|-&lt;br /&gt;
| 2155&lt;br /&gt;
| 086B&lt;br /&gt;
| Power Computing Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2156&lt;br /&gt;
| 086C&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 2157&lt;br /&gt;
| 086D&lt;br /&gt;
| Masoboshi GmbH (DCE)&lt;br /&gt;
|-&lt;br /&gt;
| 2158&lt;br /&gt;
| 086E&lt;br /&gt;
| HAL Software Hardware Handel&lt;br /&gt;
|-&lt;br /&gt;
| 2159&lt;br /&gt;
| 086F&lt;br /&gt;
| Mainhattan Data&lt;br /&gt;
| Originally registered to Michael Lamm Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2160&lt;br /&gt;
| 0870&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
| Originally registered to bbdp Electronics&lt;br /&gt;
|-&lt;br /&gt;
| 2161&lt;br /&gt;
| 0871&lt;br /&gt;
| Blue Ribbon Soundworks&lt;br /&gt;
| Originally registered to Design Computer Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2162&lt;br /&gt;
| 0872&lt;br /&gt;
| XPert&lt;br /&gt;
| Originally registered to The Station&lt;br /&gt;
|-&lt;br /&gt;
| 2163&lt;br /&gt;
| 0873&lt;br /&gt;
| DelaComp&lt;br /&gt;
| Originally registered to Bryan Williams&lt;br /&gt;
|-&lt;br /&gt;
| 2164&lt;br /&gt;
| 0874&lt;br /&gt;
| Superformance Computer Engineering GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 2165&lt;br /&gt;
| 0875&lt;br /&gt;
| Overland Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 2166&lt;br /&gt;
| 0876&lt;br /&gt;
| Thomas Hamren&lt;br /&gt;
|-&lt;br /&gt;
| 2167&lt;br /&gt;
| 0877&lt;br /&gt;
| Village Tronic&lt;br /&gt;
|-&lt;br /&gt;
| 2168&lt;br /&gt;
| 0878&lt;br /&gt;
| Toolbox Design&lt;br /&gt;
|-&lt;br /&gt;
| 2169&lt;br /&gt;
| 0879&lt;br /&gt;
| Digital Processing System&lt;br /&gt;
|-&lt;br /&gt;
| 2170&lt;br /&gt;
| 087A&lt;br /&gt;
| Superformance&lt;br /&gt;
|-&lt;br /&gt;
| 2171&lt;br /&gt;
| 087B&lt;br /&gt;
| Utilities Unlimited&lt;br /&gt;
|-&lt;br /&gt;
| 2172&lt;br /&gt;
| 087C&lt;br /&gt;
| phase 5&lt;br /&gt;
|-&lt;br /&gt;
| 2173&lt;br /&gt;
| 087D&lt;br /&gt;
| Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2174&lt;br /&gt;
| 087E&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 2175&lt;br /&gt;
| 087F&lt;br /&gt;
| James Cook University of North Queensland&lt;br /&gt;
|-&lt;br /&gt;
| 2176&lt;br /&gt;
| 0880&lt;br /&gt;
| AmiTrix Development&lt;br /&gt;
|-&lt;br /&gt;
| 2177&lt;br /&gt;
| 0881&lt;br /&gt;
| Ferranti&lt;br /&gt;
|-&lt;br /&gt;
| 2178&lt;br /&gt;
| 0882&lt;br /&gt;
| Leviathan Development&lt;br /&gt;
|-&lt;br /&gt;
| 2179&lt;br /&gt;
| 0883&lt;br /&gt;
| United Video Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2180&lt;br /&gt;
| 0884&lt;br /&gt;
| GPSoft Pty. Ltd.&lt;br /&gt;
| Originally registered to Juergen Kommos&lt;br /&gt;
|-&lt;br /&gt;
| 2181&lt;br /&gt;
| 0885&lt;br /&gt;
| ArMAX&lt;br /&gt;
| Oliver Bausch&lt;br /&gt;
|-&lt;br /&gt;
| 2182&lt;br /&gt;
| 0886&lt;br /&gt;
| CP Computer&lt;br /&gt;
|-&lt;br /&gt;
| 2183&lt;br /&gt;
| 0887&lt;br /&gt;
| AMOK - Amiga Module &amp;amp;amp; Oberon Klub&lt;br /&gt;
|-&lt;br /&gt;
| 2184&lt;br /&gt;
| 0888&lt;br /&gt;
| ITEK Neser &amp;amp;amp; Sieber GbR&lt;br /&gt;
|-&lt;br /&gt;
| 2185&lt;br /&gt;
| 0889&lt;br /&gt;
| Phillip C. Lello&lt;br /&gt;
|-&lt;br /&gt;
| 2186&lt;br /&gt;
| 088A&lt;br /&gt;
| Cyborg Design Services&lt;br /&gt;
|-&lt;br /&gt;
| 2187&lt;br /&gt;
| 088B&lt;br /&gt;
| G2 Systems&lt;br /&gt;
|-&lt;br /&gt;
| 2188&lt;br /&gt;
| 088C&lt;br /&gt;
| Pro System Computersysteme&lt;br /&gt;
|-&lt;br /&gt;
| 2189&lt;br /&gt;
| 088D&lt;br /&gt;
| ZEUS Electronic&lt;br /&gt;
| Originally registered to MSPI (Markt &amp;amp;amp; Technik)&lt;br /&gt;
|-&lt;br /&gt;
| 2190&lt;br /&gt;
| 088E&lt;br /&gt;
| Altatech&lt;br /&gt;
|-&lt;br /&gt;
| 2191&lt;br /&gt;
| 088F&lt;br /&gt;
| NewTek&lt;br /&gt;
|-&lt;br /&gt;
| 2192&lt;br /&gt;
| 0890&lt;br /&gt;
| M-TEC Hardware Design&lt;br /&gt;
| Originally registered to Hardware Design Udo Neuroth&lt;br /&gt;
|-&lt;br /&gt;
| 2193&lt;br /&gt;
| 0891&lt;br /&gt;
| Great Valley Products&lt;br /&gt;
| Originally registered to Viona Development&lt;br /&gt;
|-&lt;br /&gt;
| 2194&lt;br /&gt;
| 0892&lt;br /&gt;
| Amitek&lt;br /&gt;
| Originally assigned to Marpet Developments&lt;br /&gt;
|-&lt;br /&gt;
| 2195&lt;br /&gt;
| 0893&lt;br /&gt;
| Ingenieurbuero Helfrich&lt;br /&gt;
|-&lt;br /&gt;
| 2196&lt;br /&gt;
| 0894&lt;br /&gt;
| The Neo Group&lt;br /&gt;
|-&lt;br /&gt;
| 2197&lt;br /&gt;
| 0895&lt;br /&gt;
| Cyon&lt;br /&gt;
|-&lt;br /&gt;
| 2198&lt;br /&gt;
| 0896&lt;br /&gt;
| Bob Research Group&lt;br /&gt;
|-&lt;br /&gt;
| 2199&lt;br /&gt;
| 0897&lt;br /&gt;
| Richmond Sound Design Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2200&lt;br /&gt;
| 0898&lt;br /&gt;
| US Cybernetics&lt;br /&gt;
|-&lt;br /&gt;
| 2201&lt;br /&gt;
| 0899&lt;br /&gt;
| Fulvio Ieva&lt;br /&gt;
|-&lt;br /&gt;
| 2202&lt;br /&gt;
| 089A&lt;br /&gt;
| Silicon Studio&lt;br /&gt;
|-&lt;br /&gt;
| 2203&lt;br /&gt;
| 089B&lt;br /&gt;
| MacroSystems (USA)&lt;br /&gt;
| Was named Micro System Devices&lt;br /&gt;
|-&lt;br /&gt;
| 2204&lt;br /&gt;
| 089C&lt;br /&gt;
| Conspector Entertainment&lt;br /&gt;
|-&lt;br /&gt;
| 2205&lt;br /&gt;
| 089D&lt;br /&gt;
| Laserforum&lt;br /&gt;
|-&lt;br /&gt;
| 2206&lt;br /&gt;
| 089E&lt;br /&gt;
| Elbox Computer&lt;br /&gt;
| Mistakenly used by Index Information Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2207&lt;br /&gt;
| 089F&lt;br /&gt;
| Applied Magic Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 2208&lt;br /&gt;
| 08A0&lt;br /&gt;
| SDL Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 2560&lt;br /&gt;
| 0A00&lt;br /&gt;
| Harms&lt;br /&gt;
|-&lt;br /&gt;
| 2588&lt;br /&gt;
| 0A1C&lt;br /&gt;
| A1K.org Community&lt;br /&gt;
|-&lt;br /&gt;
| 2640&lt;br /&gt;
| 0A50&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 3084&lt;br /&gt;
| 0C0C&lt;br /&gt;
| Team 4&lt;br /&gt;
|-&lt;br /&gt;
| 3643&lt;br /&gt;
| 0E3B&lt;br /&gt;
| E3B&lt;br /&gt;
| Michael Boehmer&lt;br /&gt;
|-&lt;br /&gt;
| 3855&lt;br /&gt;
| 0F0F&lt;br /&gt;
| Micronik&lt;br /&gt;
|-&lt;br /&gt;
| 4096&lt;br /&gt;
| 1000&lt;br /&gt;
| MegaMicro&lt;br /&gt;
|-&lt;br /&gt;
| 4110&lt;br /&gt;
| 100E&lt;br /&gt;
| DigiFeX&lt;br /&gt;
|-&lt;br /&gt;
| 4136&lt;br /&gt;
| 1028&lt;br /&gt;
| Imtronics/Memphis&lt;br /&gt;
|-&lt;br /&gt;
| 4149&lt;br /&gt;
| 1035&lt;br /&gt;
| PROTAR&lt;br /&gt;
|-&lt;br /&gt;
| 4369&lt;br /&gt;
| 1111&lt;br /&gt;
| Frank Strauß Elektronik&lt;br /&gt;
| Also used by Kupke&lt;br /&gt;
|-&lt;br /&gt;
| 4626&lt;br /&gt;
| 1212&lt;br /&gt;
| Individual Computers&lt;br /&gt;
|-&lt;br /&gt;
| 4648&lt;br /&gt;
| 1228&lt;br /&gt;
| Flesch Hornemann Computer Elec.&lt;br /&gt;
|-&lt;br /&gt;
| 4680&lt;br /&gt;
| 1248&lt;br /&gt;
| Kupke Computertechnik GmbH&lt;br /&gt;
|-&lt;br /&gt;
| 4711&lt;br /&gt;
| 1267&lt;br /&gt;
| RBM digitaltechnik&lt;br /&gt;
|-&lt;br /&gt;
| 4754&lt;br /&gt;
| 1292&lt;br /&gt;
| MacroSystems&lt;br /&gt;
|-&lt;br /&gt;
| 5000&lt;br /&gt;
| 1388&lt;br /&gt;
| ITH&lt;br /&gt;
|-&lt;br /&gt;
| 5001&lt;br /&gt;
| 1389&lt;br /&gt;
| VMC&lt;br /&gt;
|-&lt;br /&gt;
| 5010&lt;br /&gt;
| 1392&lt;br /&gt;
| Ambience Creation Technology&lt;br /&gt;
|-&lt;br /&gt;
| 5011&lt;br /&gt;
| 1393&lt;br /&gt;
| Creative Development&lt;br /&gt;
|-&lt;br /&gt;
| 5012&lt;br /&gt;
| 1394&lt;br /&gt;
| Georg Braun&lt;br /&gt;
|-&lt;br /&gt;
| 5013&lt;br /&gt;
| 1395&lt;br /&gt;
| Swedish User Group of Amiga&lt;br /&gt;
|-&lt;br /&gt;
| 5014&lt;br /&gt;
| 1396&lt;br /&gt;
| Jakub Bednarski&lt;br /&gt;
|-&lt;br /&gt;
| 5015&lt;br /&gt;
| 1397&lt;br /&gt;
| KryoFlux, Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5016&lt;br /&gt;
| 1398&lt;br /&gt;
| Igor Majstorovic&lt;br /&gt;
|-&lt;br /&gt;
| 5017&lt;br /&gt;
| 1399&lt;br /&gt;
| Alastair M. Robinson&lt;br /&gt;
|-&lt;br /&gt;
| 5018&lt;br /&gt;
| 139A&lt;br /&gt;
| Austex Software&lt;br /&gt;
|-&lt;br /&gt;
| 5019&lt;br /&gt;
| 139B&lt;br /&gt;
| Sören Gust&lt;br /&gt;
|-&lt;br /&gt;
| 5020&lt;br /&gt;
| 139C&lt;br /&gt;
| Rok Krajnc&lt;br /&gt;
|-&lt;br /&gt;
| 5030&lt;br /&gt;
| 13A6&lt;br /&gt;
| Tim Tashpulatov&lt;br /&gt;
|-&lt;br /&gt;
| 5040&lt;br /&gt;
| 13B0&lt;br /&gt;
| 7-bit&lt;br /&gt;
|-&lt;br /&gt;
| 5050&lt;br /&gt;
| 13BA&lt;br /&gt;
| Sakura IT&lt;br /&gt;
|-&lt;br /&gt;
| 5060&lt;br /&gt;
| 13C4&lt;br /&gt;
| FPGAArcade&lt;br /&gt;
|-&lt;br /&gt;
| 5070&lt;br /&gt;
| 13CE&lt;br /&gt;
| CancerSoft Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 5080&lt;br /&gt;
| 13D8&lt;br /&gt;
| Stephen Leary&lt;br /&gt;
|-&lt;br /&gt;
| 5090&lt;br /&gt;
| 13E2&lt;br /&gt;
| DMA Softlab LLC&lt;br /&gt;
|-&lt;br /&gt;
| 5100&lt;br /&gt;
| 13EC&lt;br /&gt;
| Brookhouse Engineering&lt;br /&gt;
|-&lt;br /&gt;
| 5110&lt;br /&gt;
| 13F6&lt;br /&gt;
| Eduardo Arana&lt;br /&gt;
|-&lt;br /&gt;
| 5120&lt;br /&gt;
| 1400&lt;br /&gt;
| CS-LAB&lt;br /&gt;
|-&lt;br /&gt;
| 5132&lt;br /&gt;
| 140C&lt;br /&gt;
| UAS Interface Ltd.&lt;br /&gt;
|-&lt;br /&gt;
| 5500&lt;br /&gt;
| 157C&lt;br /&gt;
| Inhouse Information&lt;br /&gt;
|-&lt;br /&gt;
| 5768&lt;br /&gt;
| 1688&lt;br /&gt;
| Bio Con&lt;br /&gt;
|-&lt;br /&gt;
| 6148&lt;br /&gt;
| 1804&lt;br /&gt;
| HK-Computer&lt;br /&gt;
|-&lt;br /&gt;
| 6502&lt;br /&gt;
| 1966&lt;br /&gt;
| Cloanto&lt;br /&gt;
|-&lt;br /&gt;
| 7777&lt;br /&gt;
| 1E61&lt;br /&gt;
| Rafal Gabriel Chyla&lt;br /&gt;
|-&lt;br /&gt;
| 8215&lt;br /&gt;
| 2017&lt;br /&gt;
| Vortex&lt;br /&gt;
|-&lt;br /&gt;
| 8244&lt;br /&gt;
| 2034&lt;br /&gt;
| Spirit Technology&lt;br /&gt;
|-&lt;br /&gt;
| 8290&lt;br /&gt;
| 2062&lt;br /&gt;
| Expansion Systems&lt;br /&gt;
|-&lt;br /&gt;
| 8448&lt;br /&gt;
| 2100&lt;br /&gt;
| ReadySoft&lt;br /&gt;
|-&lt;br /&gt;
| 8512&lt;br /&gt;
| 2140&lt;br /&gt;
| Phase 5 Digital Products&lt;br /&gt;
|-&lt;br /&gt;
| 8553&lt;br /&gt;
| 2169&lt;br /&gt;
| Digital Processing Systems Inc.&lt;br /&gt;
|-&lt;br /&gt;
| 8704&lt;br /&gt;
| 2200&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 8738&lt;br /&gt;
| 2222&lt;br /&gt;
| ACT Elektronik&lt;br /&gt;
|-&lt;br /&gt;
| 9512&lt;br /&gt;
| 2528&lt;br /&gt;
| Tower Technologies&lt;br /&gt;
|-&lt;br /&gt;
| 10676&lt;br /&gt;
| 29B4&lt;br /&gt;
| Electronic Design&lt;br /&gt;
|-&lt;br /&gt;
| 14195&lt;br /&gt;
| 3773&lt;br /&gt;
| Media-net-Point&lt;br /&gt;
|-&lt;br /&gt;
| 14501&lt;br /&gt;
| 38A5&lt;br /&gt;
| Petsoff, Finland&lt;br /&gt;
|-&lt;br /&gt;
| 16375&lt;br /&gt;
| 3FF7&lt;br /&gt;
| Uwe Gerlach&lt;br /&gt;
|-&lt;br /&gt;
| 16707&lt;br /&gt;
| 4143&lt;br /&gt;
| Ateo Concepts&lt;br /&gt;
|-&lt;br /&gt;
| 16708&lt;br /&gt;
| 4144&lt;br /&gt;
| ALiENDESiGN&lt;br /&gt;
|-&lt;br /&gt;
| 16945&lt;br /&gt;
| 4231&lt;br /&gt;
| A.C.T.&lt;br /&gt;
|-&lt;br /&gt;
| 17740&lt;br /&gt;
| 454C&lt;br /&gt;
| HK-Computer (ELSAT)&lt;br /&gt;
|-&lt;br /&gt;
| 18260&lt;br /&gt;
| 4754&lt;br /&gt;
| MacroSystems (Germany)&lt;br /&gt;
|-&lt;br /&gt;
| 19796&lt;br /&gt;
| 4D54&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 22359&lt;br /&gt;
| 5757&lt;br /&gt;
| Markt &amp;amp; Technik&lt;br /&gt;
|-&lt;br /&gt;
| 26464&lt;br /&gt;
| 6760&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 26470&lt;br /&gt;
| 6766&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 28014&lt;br /&gt;
| 6D6E&lt;br /&gt;
| MNT Media and Technology UG&lt;br /&gt;
|-&lt;br /&gt;
| 32768&lt;br /&gt;
| 8000&lt;br /&gt;
| M.A.S.T.&lt;br /&gt;
|-&lt;br /&gt;
| 43437&lt;br /&gt;
| A9AD&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 43521&lt;br /&gt;
| AA01&lt;br /&gt;
| Cameron&lt;br /&gt;
|-&lt;br /&gt;
| 43537&lt;br /&gt;
| AA11&lt;br /&gt;
| Reis-Ware&lt;br /&gt;
|-&lt;br /&gt;
| 44359&lt;br /&gt;
| AD47&lt;br /&gt;
| Matay&lt;br /&gt;
|-&lt;br /&gt;
| 46504&lt;br /&gt;
| B5A8&lt;br /&gt;
| Phoenix&lt;br /&gt;
|-&lt;br /&gt;
| 49160&lt;br /&gt;
| C008&lt;br /&gt;
| Combitec&lt;br /&gt;
|-&lt;br /&gt;
| 61453&lt;br /&gt;
| F00D&lt;br /&gt;
| Forefront Technologies Inc.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For any changes/additions to this registry please use the [http://www.amigaos.net/contact AmigaOS web site contact form].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Window_Display_Preservation&amp;diff=9266</id>
		<title>Window Display Preservation</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Window_Display_Preservation&amp;diff=9266"/>
		<updated>2017-12-05T20:00:56Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Preserving the Window Display =&lt;br /&gt;
&lt;br /&gt;
The layers library is what allows the display and manipulation of multiple overlapping rectangles, or &#039;&#039;layers&#039;&#039;. Intuition uses the layers library to manage its windows, by associating a layer to each window.&lt;br /&gt;
&lt;br /&gt;
Each window is a virtual display. When rendering, the application does not have to worry about the current size or position of its window, and what other windows might be partly or fully obscuring its window. The window&#039;s RastPort is the handle to the its virtual display space. Intuition and graphics library rendering calls will recognize that this RastPort belongs to a layer, and act accordingly.&lt;br /&gt;
&lt;br /&gt;
As windows are moved, resized, rearranged, opened, or closed, the on-screen representation changes. When part of a window which was visible now needs to appear in a new location, the layers library will move that imagery without involving the application. However, when part of a window that was previously obscured is revealed, or when a window is made larger, the imagery for the newly-visible part of the window needs to be redrawn. Intuition, through layers, offers three choices for how this is managed, trading off speed, memory usage, and application complexity.&lt;br /&gt;
&lt;br /&gt;
* The most basic type of window is called &#039;&#039;Simple Refresh&#039;&#039;. When any graphics operation takes place in this kind of window, the visible parts are updated, but rendering to the obscured parts is discarded. When the window arrangement changes to reveal a previously obscured part of such a window, the application must refresh that area.&lt;br /&gt;
&lt;br /&gt;
* Alternately, a window may be made &#039;&#039;Smart Refresh&#039;&#039;, which means that when rendering occurs, the system will not only update the visible parts of the window, but it will maintain the obscured parts as well, by using off-screen buffers. This means that when an obscured part of the window is revealed, the system will restore the imagery that belongs there. The application needs only to refresh parts of the window that appear when the window is made bigger. Smart Refresh windows use more memory than Simple Refresh windows (for the storage of obscured areas), but they are faster.&lt;br /&gt;
&lt;br /&gt;
* The third kind of window is called &#039;&#039;SuperBitMap&#039;&#039;. In such a window, the system can refresh the window even when it is sized bigger. For this to work, the application must store a complete bitmap for the window&#039;s maximum size. Such a window is more work to manage, and uses yet more memory. SuperBitMap windows are used less often than the other two types.&lt;br /&gt;
&lt;br /&gt;
Intuition helps your application manage window refresh. First, Intuition will take care of redrawing the window border and any system and application gadgets in the window. Your application never has to worry about that. Second, Intuition will notify your application when it needs to refresh its window (by sending the IDCMP_REFRESHWINDOW event). Third, Intuition provides functions that restrict your rendering to the newly-revealed (damaged) areas only, which speeds up your refresh rendering and makes it look cleaner.&lt;br /&gt;
&lt;br /&gt;
The Intuition, layers, and graphics libraries work together to make rendering into and managing windows easy. You obtain your windows through Intuition, which uses the Layers library to manage the overlapping, resizing, and re-positioning of the window layers. The layers library is responsible for identifying the areas of each window that are visible, obscured but preserved off-screen, or obscured and not preserved. The rendering functions in the graphics library and Intuition library know how to render into the multiple areas that layers library establishes.&lt;br /&gt;
&lt;br /&gt;
Note that you may not directly manipulate layers on an Intuition screen. You cannot create your own layers on an Intuition screen, nor can you use the layers movement, sizing, or arrangement functions on Intuition windows. Use the corresponding Intuition calls instead. Some other Layers library calls (such as the locking calls) are sometimes used on Intuition screens and windows.&lt;br /&gt;
&lt;br /&gt;
= Damage Regions =&lt;br /&gt;
&lt;br /&gt;
The layers library and Intuition maintain a &#039;&#039;damage region&#039;&#039; for each window, which is the part of the window whose imagery is in need of repair, or refreshing. Several things can add areas of the window to the damage region:&lt;br /&gt;
&lt;br /&gt;
* Revealing an obscured part of a Simple Refresh window adds that area to the damage region&lt;br /&gt;
* Sizing a Simple or Smart Refresh window bigger along either axis adds the new area to the damage region&lt;br /&gt;
* Resizing a Simple or Smart Refresh window (smaller or bigger) adds the old and new border areas, and the areas occupied by certain gadgets (those whose position or size depend on window size) to the damage region.&lt;br /&gt;
&lt;br /&gt;
= Refreshing Intuition Windows =&lt;br /&gt;
&lt;br /&gt;
When the user or an application performs an Intuition operation which causes damage to a window, Intuition notifies that window&#039;s application. It does this by sending a message of the class IDCMP_REFRESHWINDOW to that window&#039;s IDCMP.&lt;br /&gt;
&lt;br /&gt;
In response to this message, your application should update the damaged areas. Rendering proceeds faster and looks cleaner if it is restricted to the damaged areas only. The BeginRefresh()/EndRefresh() pair achieve that. The application should call BeginRefresh() for the window, and then do its rendering. Any rendering that would have gone into undamaged areas of the window is automatically discarded; only the area in need of repair is affected. Finally, the application should call EndRefresh(), which removes the restriction on rendering, and informs the system that the damage region has been dealt with. Even if your application intends to do no rendering, it must at least call BeginRefresh()/EndRefresh(), to inform the system that the damage region is no longer needed. If your application never needs to render in response to a refresh event, it can avoid having to call BeginRefresh()/EndRefresh() by setting the WFLG_NOCAREREFRESH flag or the WA_NoCareRefresh tag in the OpenWindowTagList() call.&lt;br /&gt;
&lt;br /&gt;
Note that by the time that your application receives notification that refresh is needed, Intuition will have already refreshed your window&#039;s border and all gadgets in the window, as needed. Thus, it is unnecessary to use any of the gadget-refreshing functions in response to an IDCMP_REFRESHWINDOW event.&lt;br /&gt;
&lt;br /&gt;
Operations performed between the BeginRefresh()/EndRefresh() pair should be restricted to simple rendering. All of the rendering functions in Intuition library and Graphics library are safe. Avoid RefreshGList() or RefreshGadgets(), or you risk deadlocking the computer. Avoid calls that may lock the LayerInfo or get complicated in Intuition, since BeginRefresh() leaves the window&#039;s layer or layers locked. Avoid AutoRequest() and EasyRequest(), and therefore all direct or indirect disk related DOS calls. See the [[Intuition_Gadgets|Intuition Gadgets]] section for more information on gadget restrictions with BeginRefresh() and EndRefresh().&lt;br /&gt;
&lt;br /&gt;
== Simple Refresh ==&lt;br /&gt;
&lt;br /&gt;
For a Simple Refresh window, only those pixels actually on-screen are maintained by the system. When part of a Simple Refresh window is obscured, the imagery that was there is lost. As well, any rendering into obscured portions of such a window is discarded.&lt;br /&gt;
&lt;br /&gt;
When part of the window is newly revealed (either because the window was just made larger, or because that part used to be obscured by another window), the application must refresh any rendering it wishes to appear into that part. The application will learn that refresh is needed because Intuition sends an IDCMP_REFRESHWINDOW event.&lt;br /&gt;
&lt;br /&gt;
== Smart Refresh ==&lt;br /&gt;
&lt;br /&gt;
If a window is of the Smart Refresh type, then the system will not only preserve those pixels which are actually on-screen, but it will save all obscured pixels that are within the current window&#039;s size. The system will refresh those parts of the window revealed by changes in the overlapping with other windows on the screen, without involving the application. However, any part of the window revealed through the sizing of the window must be redrawn by the application. Again, Intuition will notify the application through the IDCMP_REFRESHWINDOW event.&lt;br /&gt;
&lt;br /&gt;
Because the obscured areas are kept in off-screen buffers, Smart Refresh windows are refreshed faster than Simple Refresh windows are, and often without involving the application. Of course, for the same reason, they use more display memory.&lt;br /&gt;
&lt;br /&gt;
== SuperBitMap Refresh ==&lt;br /&gt;
&lt;br /&gt;
The SuperBitMap refresh type allows the application to provide and maintain bitmap memory for graphics in the window. The bitmap can be any size as long as the window sizing limits respect the maximum size of the bitmap.&lt;br /&gt;
&lt;br /&gt;
SuperBitMap windows have their own memory for maintaining all obscured parts of the window up to the size of the defined bitmap, including those parts outside of the current window. Intuition will update all parts of the window that are revealed through changes in sizing and changes in window overlapping. The application never needs to redraw portions of the window that were revealed by sizing or positioning windows in the screen.&lt;br /&gt;
&lt;br /&gt;
SuperBitMap windows require the application to allocate a bitmap for use as off-screen memory, instead of using Intuition managed buffers. This bitmap must be as large as, or larger than, the inner window&#039;s maximum dimensions (that is, the window&#039;s outside dimensions less the border sizes).&lt;br /&gt;
&lt;br /&gt;
SuperBitMap windows are almost always WFLG_GIMMEZEROZERO, which renders the borders and system gadgets in a separate bitmap. If the application wishes to create a SuperBitMap window that is not GimmeZeroZero, it must make the window borderless with no system gadgets, so that no border imagery is rendered by Intuition into the application&#039;s bitmap.&lt;br /&gt;
&lt;br /&gt;
= Intuition Refresh Events =&lt;br /&gt;
&lt;br /&gt;
When using a Simple Refresh or a Smart Refresh windows, the program may receive refresh events, informing it to update the display. See the above discussion for information on when refresh events are sent.&lt;br /&gt;
&lt;br /&gt;
A message of the class IDCMP_REFRESHWINDOW arrives at the IDCMP, informing the program of the need to update the display. The program must take some action when it receives a refresh event, even if it is just the acceptable minimum action described below.&lt;br /&gt;
&lt;br /&gt;
On receiving a refresh event, BeginRefresh() must be called, then the program should redraw its display, and, finally, call EndRefresh(). The minimum required action is to call the BeginRefresh()/EndRefresh() pair. This allows Intuition and the Layers library keep things sorted and organized.&lt;br /&gt;
&lt;br /&gt;
= Optimized Window Refreshing =&lt;br /&gt;
&lt;br /&gt;
Bracketing the display updating in the BeginRefresh()/EndRefresh() pair automatically restricts all rendering to the &amp;quot;damaged&amp;quot; areas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
VOID BeginRefresh( struct Window *window );&lt;br /&gt;
VOID EndRefresh  ( struct Window *window, LONG complete );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These functions makes sure that refreshing is done in the most efficient way, only redrawing those portions of the window that really need to be redrawn. The rest of the rendering commands are discarded.&lt;br /&gt;
&lt;br /&gt;
Operations performed between the BeginRefresh()/EndRefresh() pair should be restricted to simple rendering. All of the rendering functions in Intuition library and Graphics library are safe. Calls to RefreshGadgets() are not permitted. Avoid calls that may lock the LayerInfo, or get complicated in Intuition, since BeginRefresh() leaves the window&#039;s layer or layers locked. Avoid AutoRequest(), and therefore all direct or indirect disk related DOS calls. See [[Intuition_Gadgets|Intuition Gadgets]] for more information on gadget restrictions with BeginRefresh()/EndRefresh().&lt;br /&gt;
&lt;br /&gt;
Certain applications do not need to receive refresh events, and can avoid having to call BeginRefresh() and EndRefresh() by setting the WFLG_NOCAREREFRESH flag or the WA_NoCareRefresh tag in the OpenWindowTagList() call.&lt;br /&gt;
&lt;br /&gt;
The EndRefresh() function takes a boolean value as an argument (complete in the prototype above). This value determines whether refreshing is completely finished. When set to FALSE, further refreshing may be performed between subsequent BeginRefresh()/ EndRefresh() pairs. Set the boolean to TRUE for the last call to EndRefresh().&lt;br /&gt;
&lt;br /&gt;
It is critical that applications performing multiple BeginRefresh() and EndRefresh() pairs using EndRefresh(win,FALSE) hold layers locked through the entire process. The layer lock may only be released after the final call to EndRefresh(win,TRUE). See [[Layers_Library|Layers Library]] for more details.&lt;br /&gt;
&lt;br /&gt;
The procedures outlined in this section take care of refreshing what is inside the window. Another function named RefreshWindowFrame() refreshes window borders, including the title region and gadgets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
VOID RefreshWindowFrame( struct Window *window );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Applications can use this function to update window borders after overwriting them with graphics.&lt;br /&gt;
&lt;br /&gt;
= Setting up a SuperBitMap Window =&lt;br /&gt;
&lt;br /&gt;
SuperBitMap windows are created by setting the WFLG_SUPER_BITMAP flag, or by specifying the WA_SuperBitMap tag in the OpenWindowTagList() call. A pointer to an allocated and initialized BitMap structure must be provided.&lt;br /&gt;
&lt;br /&gt;
A SuperBitMap window requires the application to allocate and initialize its own bitmap. This entails allocating a BitMap structure, initializing the structure and allocating memory for the bit planes.&lt;br /&gt;
&lt;br /&gt;
Allocate a BitMap structure with the Exec AllocMem() function. Then use the graphics function InitBitMap() to initialize the BitMap structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
VOID InitBitMap( struct BitMap *bitMap, LONG depth, LONG width, LONG height );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
InitBitMap() fills in fields in the BitMap structure describing how a linear memory area is organized as a series of one or more rectangular bit-planes.&lt;br /&gt;
&lt;br /&gt;
Once you have allocated and initialized the BitMap structure, use the graphics library function AllocRaster() to allocate the memory space for all the bit planes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
PLANEPTR AllocRaster( ULONG width, ULONG height );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The example listed in the next section shows how to allocate a BitMap structure, initialize it with InitBitMap() and use AllocRaster() function to set up memory for the bitplanes.&lt;br /&gt;
&lt;br /&gt;
= Graphics and Layers Functions for SuperBitMap Windows =&lt;br /&gt;
&lt;br /&gt;
The portion of the bitmap showing within a SuperBitMap window is controlled by the application. Initially, the window shows the bitmap starting from its origin (0,0) and clipped to fit within the window layer. The visible portion of the bitmap can be scrolled around within the window using the layers library ScrollLayer() function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
VOID ScrollLayer(LONG unused, struct Layer *layer, LONG dx, LONG dy)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pass this function a pointer to the window&#039;s layer in layer and the scroll offsets in dx and dy. (A pointer to the window&#039;s layer can be obtained from Window.RPort-&amp;amp;gt;Layer.)&lt;br /&gt;
&lt;br /&gt;
When rendering operations are performed in a SuperBitMap window, any rendering that falls outside window boundaries is done in the application&#039;s bitmap. Rendering that falls within window bounds is done in the screen&#039;s bitmap. Before performing an operation such as a save on the application bitmap, the graphics library function SyncSBitMap() should be called:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
VOID SyncSBitMap(struct Layer *layer)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pass this function a pointer to the window&#039;s layer. SyncSBitMap() copies the window contents to the corresponding part of the application bitmap, bringing it up to date. (If no rendering operations have been performed this call is not necessary.)&lt;br /&gt;
&lt;br /&gt;
Similarly, after making any changes to the application bitmap such as loading a new one, the window&#039;s layer should be locked and the CopySBitMap() function should be called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
VOID CopySBitMap(struct Layer *)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function copies the new information in the appropriate area of the underlying bitmap to the window&#039;s layer.&lt;br /&gt;
&lt;br /&gt;
For more information about bitmaps and layers, see the [[Graphics_Primitives|Graphics Primitives]] and [[Layers_Library|Layers Library]]. Also see the &amp;amp;lt;graphics/clip.h&amp;amp;gt;, &amp;amp;lt;graphics/gfx.h&amp;amp;gt;, &amp;amp;lt;graphics/layers.h &amp;amp;gt; files in the SDK.&lt;br /&gt;
&lt;br /&gt;
== SuperBitMap Window Example ==&lt;br /&gt;
&lt;br /&gt;
This example shows how to implement a superbitmap, and uses a host of Intuition facilities. Further reading of other Intuition, BOOPSI and graphics chapters may be required for a complete understanding of this example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 **  lines.c -- Window SuperBitMap example.&lt;br /&gt;
 **&lt;br /&gt;
 **  gcc -o lines lines.c&lt;br /&gt;
 ** &lt;br /&gt;
 **/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;dos/dos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;intuition/icclass.h&amp;gt;&lt;br /&gt;
#include &amp;lt;classes/window.h&amp;gt;&lt;br /&gt;
#include &amp;lt;gadgets/scroller.h&amp;gt;&lt;br /&gt;
#include &amp;lt;gadgets/layout.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;proto/intuition.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/utility.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/layers.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/graphics.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define WIDTH_SUPER (800)&lt;br /&gt;
#define HEIGHT_SUPER (600)&lt;br /&gt;
#define MINWIDTH (150)&lt;br /&gt;
#define MINHEIGHT (150)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define LAYERXOFFSET(x) (x-&amp;gt;RPort-&amp;gt;Layer-&amp;gt;Scroll_X)&lt;br /&gt;
#define LAYERYOFFSET(x) (x-&amp;gt;RPort-&amp;gt;Layer-&amp;gt;Scroll_Y)&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
    WID_MAIN = 0,&lt;br /&gt;
    WID_LAST&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
    OID_MAIN = 0,&lt;br /&gt;
    OID_VPROP,&lt;br /&gt;
    OID_HPROP,&lt;br /&gt;
    OID_LAST&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct IntuitionIFace *IIntuition;&lt;br /&gt;
struct GraphicsIFace *IGraphics;&lt;br /&gt;
struct LayersIFace *ILayers;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
static struct Window *windows[WID_LAST];&lt;br /&gt;
static Object *objects[OID_LAST];&lt;br /&gt;
static struct Hook idcmphook;&lt;br /&gt;
&lt;br /&gt;
/* Prototypes for our functions */&lt;br /&gt;
&lt;br /&gt;
void initBorderProps(struct Screen *screen);&lt;br /&gt;
void doNewSize();&lt;br /&gt;
void doDrawStuff();&lt;br /&gt;
void doMsgLoop();&lt;br /&gt;
void superWindow(struct Screen *screen);&lt;br /&gt;
void slideBitMap(struct Window *win, int16 dX, int16 dY);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    struct Screen *screen;&lt;br /&gt;
&lt;br /&gt;
    struct Library *IntuitionBase = IExec-&amp;gt;OpenLibrary(&amp;quot;intuition.library&amp;quot;, 50);&lt;br /&gt;
    IIntuition = (struct IntuitionIFace *) IExec-&amp;gt;GetInterface(IntuitionBase,&lt;br /&gt;
        &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
&lt;br /&gt;
    struct Library *GfxBase = IExec-&amp;gt;OpenLibrary(&amp;quot;graphics.library&amp;quot;, 50);&lt;br /&gt;
    IGraphics = (struct GraphicsIFace *) IExec-&amp;gt;GetInterface(GfxBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
&lt;br /&gt;
    struct Library *LayersBase = IExec-&amp;gt;OpenLibrary(&amp;quot;layers.library&amp;quot;, 50);&lt;br /&gt;
    ILayers = (struct LayersIFace *) IExec-&amp;gt;GetInterface(LayersBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
&lt;br /&gt;
    if (IIntuition != NULL &amp;amp;&amp;amp; IGraphics != NULL &amp;amp;&amp;amp; ILayers != NULL) {&lt;br /&gt;
        if ((screen = IIntuition-&amp;gt;LockPubScreen(NULL)) != NULL) {&lt;br /&gt;
            superWindow(screen);&lt;br /&gt;
            IIntuition-&amp;gt;UnlockPubScreen(NULL, screen);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    IExec-&amp;gt;DropInterface((struct Interface *) ILayers);&lt;br /&gt;
    IExec-&amp;gt;CloseLibrary(LayersBase);&lt;br /&gt;
&lt;br /&gt;
    IExec-&amp;gt;DropInterface((struct Interface *) IGraphics);&lt;br /&gt;
    IExec-&amp;gt;CloseLibrary(GfxBase);&lt;br /&gt;
&lt;br /&gt;
    IExec-&amp;gt;DropInterface((struct Interface *) IIntuition);&lt;br /&gt;
    IExec-&amp;gt;CloseLibrary(IntuitionBase);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void IDCMPHook(struct Hook *hook, Object *object, struct IntuiMessage *msg)&lt;br /&gt;
{&lt;br /&gt;
    if (msg-&amp;gt;Class == IDCMP_IDCMPUPDATE) {&lt;br /&gt;
        int16 dX = 0;&lt;br /&gt;
        int16 dY = 0;&lt;br /&gt;
        int32 pos;&lt;br /&gt;
&lt;br /&gt;
        struct Window *win = windows[WID_MAIN];&lt;br /&gt;
        if (win != NULL) {&lt;br /&gt;
            uint32 gadgetid = IUtility-&amp;gt;GetTagData(GA_ID, 0, (struct TagItem *) msg-&amp;gt;IAddress);&lt;br /&gt;
            if (IIntuition-&amp;gt;GetAttr(SCROLLER_Top, objects[gadgetid], (uint32 *) &amp;amp;pos)) {&lt;br /&gt;
                switch (gadgetid) {&lt;br /&gt;
                case OID_VPROP:&lt;br /&gt;
                    dY = pos - LAYERYOFFSET(win);&lt;br /&gt;
                    break;&lt;br /&gt;
                case OID_HPROP:&lt;br /&gt;
                    dX = pos - LAYERXOFFSET(win);&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
                if (dX || dY) {&lt;br /&gt;
                    slideBitMap(win, dX, dY);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void superWindow(struct Screen *myscreen)&lt;br /&gt;
{&lt;br /&gt;
    struct BitMap *bigBitMap = IGraphics-&amp;gt;AllocBitMapTags(WIDTH_SUPER, HEIGHT_SUPER, myscreen-&amp;gt;BitMap.Depth,&lt;br /&gt;
            BMATags_Friend, myscreen-&amp;gt;BitMap, BMATags_Displayable, TRUE, BMATags_Clear, 0, TAG_END);&lt;br /&gt;
&lt;br /&gt;
    if (bigBitMap != NULL) {&lt;br /&gt;
        struct MsgPort *AppPort = IExec-&amp;gt;AllocSysObjectTags(ASOT_PORT, TAG_DONE);&lt;br /&gt;
&lt;br /&gt;
        if ( AppPort != NULL )&lt;br /&gt;
        {&lt;br /&gt;
            idcmphook.h_Entry = (uint32 (*)())IDCMPHook;&lt;br /&gt;
            idcmphook.h_SubEntry = NULL;&lt;br /&gt;
&lt;br /&gt;
            if ((objects[OID_MAIN] = IIntuition-&amp;gt;NewObject(NULL, &amp;quot;window.class&amp;quot;,&lt;br /&gt;
                WA_ScreenTitle, &amp;quot;SuperBitmap&amp;quot;,&lt;br /&gt;
                WA_Title, &amp;quot;Lines&amp;quot;,&lt;br /&gt;
                WA_Activate, TRUE,&lt;br /&gt;
                WA_DepthGadget, TRUE,&lt;br /&gt;
                WA_DragBar, TRUE,&lt;br /&gt;
                WA_CloseGadget, TRUE,&lt;br /&gt;
                WA_SizeGadget, TRUE,&lt;br /&gt;
                WA_Top, 10,&lt;br /&gt;
                WA_Left, 10,&lt;br /&gt;
                WA_MinWidth, MINWIDTH,&lt;br /&gt;
                WA_MinHeight, MINHEIGHT,&lt;br /&gt;
                WA_Width, MINWIDTH,&lt;br /&gt;
                WA_Height, MINHEIGHT,&lt;br /&gt;
                WA_IDCMP, IDCMP_NEWSIZE | IDCMP_IDCMPUPDATE,&lt;br /&gt;
                WA_PubScreen, myscreen, WA_SuperBitMap, bigBitMap,&lt;br /&gt;
                WA_NoCareRefresh, TRUE,&lt;br /&gt;
                WA_GimmeZeroZero, TRUE,     &lt;br /&gt;
                WINDOW_IDCMPHook, &amp;amp;idcmphook,&lt;br /&gt;
                WINDOW_IDCMPHookBits, IDCMP_IDCMPUPDATE,&lt;br /&gt;
                WINDOW_HorizProp, 1,&lt;br /&gt;
                WINDOW_VertProp, 1,&lt;br /&gt;
                WINDOW_AppPort, AppPort, TAG_DONE)) != NULL) {&lt;br /&gt;
                //  Open the window.&lt;br /&gt;
                if (windows[WID_MAIN] = (struct Window *) IIntuition-&amp;gt;IDoMethod(objects[OID_MAIN], WM_OPEN)) {   &lt;br /&gt;
                    /* adjust props to represent portion visible */&lt;br /&gt;
                    doNewSize();&lt;br /&gt;
                    doDrawStuff();&lt;br /&gt;
                    /* process the window, return on IDCMP_CLOSEWINDOW */&lt;br /&gt;
                    doMsgLoop();&lt;br /&gt;
                }&lt;br /&gt;
                IIntuition-&amp;gt;DisposeObject(objects[OID_MAIN]);&lt;br /&gt;
            }&lt;br /&gt;
            IExec-&amp;gt;FreeSysObject(ASOT_PORT, AppPort);&lt;br /&gt;
        }   &lt;br /&gt;
        IGraphics-&amp;gt;FreeBitMap(bigBitMap);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void slideBitMap(struct Window *win, int16 Dx, int16 Dy)&lt;br /&gt;
{&lt;br /&gt;
    ILayers-&amp;gt;ScrollLayer(0, win-&amp;gt;RPort-&amp;gt;Layer, Dx, Dy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
** Update the prop gadgets and bitmap positioning when the size changes.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
void doNewSize()&lt;br /&gt;
{&lt;br /&gt;
    struct Window *win = windows[WID_MAIN];&lt;br /&gt;
    if (win != NULL) {&lt;br /&gt;
        IIntuition-&amp;gt;GetAttr(WINDOW_HorizObject, objects[OID_MAIN], (uint32 *) &amp;amp;objects[OID_HPROP]);&lt;br /&gt;
        if (objects[OID_HPROP]) {       &lt;br /&gt;
            if (win-&amp;gt;GZZWidth &amp;gt;= WIDTH_SUPER)&lt;br /&gt;
                slideBitMap(win, -LAYERXOFFSET(win), 0);&lt;br /&gt;
            IIntuition-&amp;gt;RefreshSetGadgetAttrs((APTR) objects[OID_HPROP], win, NULL,&lt;br /&gt;
                GA_ID, OID_HPROP,&lt;br /&gt;
                SCROLLER_Top, LAYERXOFFSET(win),&lt;br /&gt;
                SCROLLER_Total, WIDTH_SUPER,&lt;br /&gt;
                SCROLLER_Visible, win-&amp;gt;GZZWidth,&lt;br /&gt;
                ICA_TARGET, ICTARGET_IDCMP,&lt;br /&gt;
                TAG_DONE); &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        IIntuition-&amp;gt;GetAttr(WINDOW_VertObject, objects[OID_MAIN], (uint32 *) &amp;amp;objects[OID_VPROP]);&lt;br /&gt;
        if (objects[OID_VPROP]) {&lt;br /&gt;
            if (win-&amp;gt;GZZHeight &amp;gt;= HEIGHT_SUPER)&lt;br /&gt;
                slideBitMap(win, 0, -LAYERYOFFSET(win));&lt;br /&gt;
&lt;br /&gt;
            IIntuition-&amp;gt;RefreshSetGadgetAttrs((APTR) objects[OID_VPROP], win, NULL,&lt;br /&gt;
                GA_ID, OID_VPROP,&lt;br /&gt;
                SCROLLER_Top, LAYERYOFFSET(win),&lt;br /&gt;
                SCROLLER_Total, HEIGHT_SUPER,&lt;br /&gt;
                SCROLLER_Visible, win-&amp;gt;GZZHeight,&lt;br /&gt;
                ICA_TARGET, ICTARGET_IDCMP,&lt;br /&gt;
                TAG_DONE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int16 RangeRand(uint32 maxValue)&lt;br /&gt;
{&lt;br /&gt;
    static struct RandomState range = {0xFFFF, 0};&lt;br /&gt;
    return IUtility-&amp;gt;Random(&amp;amp;range) % maxValue;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void doDrawStuff()&lt;br /&gt;
{&lt;br /&gt;
    struct Window *win = windows[WID_MAIN];&lt;br /&gt;
    if (win != NULL) {&lt;br /&gt;
        /* clear the bitplanes */&lt;br /&gt;
        IGraphics-&amp;gt;SetRast(win-&amp;gt;RPort, 0);&lt;br /&gt;
        IGraphics-&amp;gt;SetDrMd(win-&amp;gt;RPort, JAM1);&lt;br /&gt;
        int16 x1, y1, x2, y2;&lt;br /&gt;
        int16 pen, ncolors, deltx, delty;&lt;br /&gt;
        ncolors = 1 &amp;lt;&amp;lt; win-&amp;gt;WScreen-&amp;gt;BitMap.Depth;&lt;br /&gt;
        deltx = RangeRand(6) + 2;&lt;br /&gt;
        delty = RangeRand(6) + 2;&lt;br /&gt;
        pen = RangeRand(ncolors - 1) + 1;&lt;br /&gt;
        IGraphics-&amp;gt;SetAPen(win-&amp;gt;RPort, pen);&lt;br /&gt;
        for (x1 = 0, y1 = 0, x2 = WIDTH_SUPER - 1, y2 = HEIGHT_SUPER - 1;&lt;br /&gt;
            x1 &amp;lt; WIDTH_SUPER; x1 += deltx, x2 -= deltx) {&lt;br /&gt;
            IGraphics-&amp;gt;Move(win-&amp;gt;RPort, x1, y1);&lt;br /&gt;
            IGraphics-&amp;gt;Draw(win-&amp;gt;RPort, x2, y2);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        pen = RangeRand(ncolors - 1) + 1;&lt;br /&gt;
        IGraphics-&amp;gt;SetAPen(win-&amp;gt;RPort, pen);&lt;br /&gt;
        for (x1 = 0, y1 = 0, x2 = WIDTH_SUPER - 1, y2 = HEIGHT_SUPER - 1;&lt;br /&gt;
             y1 &amp;lt; HEIGHT_SUPER; y1 += delty, y2 -= delty) {&lt;br /&gt;
            IGraphics-&amp;gt;Move(win-&amp;gt;RPort, x1, y1);&lt;br /&gt;
            IGraphics-&amp;gt;Draw(win-&amp;gt;RPort, x2, y2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void doMsgLoop()&lt;br /&gt;
{                   &lt;br /&gt;
    uint32 signal = 0;&lt;br /&gt;
    BOOL done = FALSE;&lt;br /&gt;
    &lt;br /&gt;
    // Obtain the window wait signal mask.&lt;br /&gt;
    IIntuition-&amp;gt;GetAttr(WINDOW_SigMask, objects[OID_MAIN], &amp;amp;signal);&lt;br /&gt;
&lt;br /&gt;
    // Input Event Loop&lt;br /&gt;
    while (!done) {&lt;br /&gt;
        uint32 wait = IExec-&amp;gt;Wait(signal | SIGBREAKF_CTRL_C);&lt;br /&gt;
        if ( wait &amp;amp; SIGBREAKF_CTRL_C ) {&lt;br /&gt;
            done = TRUE;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if ( wait &amp;amp; signal ) {&lt;br /&gt;
            uint32 result = WMHI_LASTMSG;&lt;br /&gt;
            int16 code = 0;&lt;br /&gt;
            while ((result = IIntuition-&amp;gt;IDoMethod(objects[OID_MAIN], WM_HANDLEINPUT, &amp;amp;code)) != WMHI_LASTMSG) {&lt;br /&gt;
                switch (result &amp;amp; WMHI_CLASSMASK) {&lt;br /&gt;
                case WMHI_NEWSIZE:&lt;br /&gt;
                    doNewSize();&lt;br /&gt;
                    doDrawStuff();&lt;br /&gt;
                    break;&lt;br /&gt;
                case WMHI_CLOSEWINDOW:&lt;br /&gt;
                    windows[WID_MAIN] = NULL;&lt;br /&gt;
                    done = TRUE;&lt;br /&gt;
                    break;&lt;br /&gt;
                case WMHI_ICONIFY:&lt;br /&gt;
                    IIntuition-&amp;gt;IDoMethod(objects[OID_MAIN], WM_ICONIFY);&lt;br /&gt;
                    windows[WID_MAIN] = NULL;&lt;br /&gt;
                    break;&lt;br /&gt;
                case WMHI_UNICONIFY:&lt;br /&gt;
                    windows[WID_MAIN] = (struct Window *) IIntuition-&amp;gt;IDoMethod(objects[OID_MAIN], WM_OPEN);&lt;br /&gt;
                    doNewSize();&lt;br /&gt;
                    doDrawStuff();     &lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=File:ProcessTaskClassDiagram.png&amp;diff=9265</id>
		<title>File:ProcessTaskClassDiagram.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=File:ProcessTaskClassDiagram.png&amp;diff=9265"/>
		<updated>2017-12-05T19:56:26Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=AmiWest_Lesson_2&amp;diff=9264</id>
		<title>AmiWest Lesson 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=AmiWest_Lesson_2&amp;diff=9264"/>
		<updated>2017-12-05T19:56:08Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Tasks and Processes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AmiWest Lesson 2: Fundamentals =&lt;br /&gt;
&lt;br /&gt;
== Basic Types ==&lt;br /&gt;
&lt;br /&gt;
It is important to under at least the basic types when programming. The following table summarizes the basic types used in AmigaOS as compared to standard C and C++ types:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+AmigaOS Types&lt;br /&gt;
! Type !! Deprecated Type(s) !! C !! C++&lt;br /&gt;
|-&lt;br /&gt;
| uint64 || none || uint64_t || uint64_t&lt;br /&gt;
|-&lt;br /&gt;
| int64 || none || int64_t || int64_t&lt;br /&gt;
|-&lt;br /&gt;
| uint32 || ULONG or LONGBITS or CPTR || uint32_t || uint32_t&lt;br /&gt;
|-&lt;br /&gt;
| int32 || LONG || int32_t || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| uint16 || UWORD or WORDBITS or USHORT or UCOUNT or RPTR || uint16_t || uint16_t&lt;br /&gt;
|-&lt;br /&gt;
| int16 || WORD or SHORT or COUNT || int16_t || int16_t&lt;br /&gt;
|-&lt;br /&gt;
| uint8 || UBYTE or BYTEBITS || char or unsigned char || unsigned char&lt;br /&gt;
|-&lt;br /&gt;
| int8 || BYTE || signed char || signed char&lt;br /&gt;
|-&lt;br /&gt;
| STRPTR || none || char* || char*&lt;br /&gt;
|-&lt;br /&gt;
| CONST STRPTR || n/a || char* const x || char* const x&lt;br /&gt;
|-&lt;br /&gt;
| CONST_STRPTR || n/a || const char* || const char*&lt;br /&gt;
|-&lt;br /&gt;
| CONST CONST_STRPTR || n/a || const char* const || const char* const&lt;br /&gt;
|-&lt;br /&gt;
| APTR || none || void* || void*&lt;br /&gt;
|-&lt;br /&gt;
| CONST APTR || none || void* const x || void* const x&lt;br /&gt;
|-&lt;br /&gt;
| CONST_APTR || none || const void* || const void*&lt;br /&gt;
|-&lt;br /&gt;
| CONST CONST_APTR || none || const void* const || const void* const&lt;br /&gt;
|-&lt;br /&gt;
| float32 || FLOAT || float || float&lt;br /&gt;
|-&lt;br /&gt;
| float64 || DOUBLE || double || double&lt;br /&gt;
|-&lt;br /&gt;
| BOOL || none || int16 || int16&lt;br /&gt;
|-&lt;br /&gt;
| TEXT || none || char || char&lt;br /&gt;
|-&lt;br /&gt;
| NULL || none || 0L || (void*)0L&lt;br /&gt;
|-&lt;br /&gt;
| BPTR || none || int32_t || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| BSTR || none || int32_t || int32_t&lt;br /&gt;
|-&lt;br /&gt;
| ZERO || none || (BPTR)0 || (BPTR)0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Static versus Dynamic Linking ==&lt;br /&gt;
&lt;br /&gt;
The different between static and dynamic linking can best be explained with an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
 printf(&amp;quot;Hello, world\n&amp;quot;);&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is &amp;quot;hello&amp;quot; created using static linking:&lt;br /&gt;
&lt;br /&gt;
 gcc -mcrt=clib2 -N -o hello hello.c -Wl,--cref,-M,-Map=hello.map&lt;br /&gt;
 strip hello&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;hello&amp;quot; executable is roughly 34964 bytes in size. The &amp;quot;hello.map&amp;quot; file contains the linker map which shows you exactly what pieces of code have been pulled in from where to create that executable.&lt;br /&gt;
&lt;br /&gt;
Here is &amp;quot;hello&amp;quot; created using dynamic linking:&lt;br /&gt;
&lt;br /&gt;
 gcc -mcrt=newlib -N -o hello hello.c -Wl,--cref,-M,-Map=hello.map&lt;br /&gt;
 strip hello&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;hello&amp;quot; executable is now 5488 bytes in size and the &amp;quot;hello.map&amp;quot; file is substantially simpler as well.&lt;br /&gt;
&lt;br /&gt;
{{Note|The -N switch is used to work around a feature in the current GCC toolset. The problem has been fixed but a new compiler is not yet generally available. See [[The_Hacking_Way:_Part_1_-_First_Steps|Myth #2: AmigaOS binaries are fat]] for more details.}}&lt;br /&gt;
&lt;br /&gt;
It is important to remember that each program is still essentially the same size. In fact, the dynamically linked program may even be larger. The reason is that the same amount of code is still used. The difference is that the dynamically linked executable is sharing code with other executables. The statically linked executable is not sharing code and thus occupies more disk space.&lt;br /&gt;
&lt;br /&gt;
A statically linked program is a self-contained unit which generally has no extraneous external dependencies. Any dependency problems will show up when linking the executable.&lt;br /&gt;
&lt;br /&gt;
A dynamically linked program requires external libraries in order to function. If any of those libraries are missing or the wrong version, your program will fail at runtime and not when you compile it.&lt;br /&gt;
&lt;br /&gt;
For programmers, it is very important to know where your libraries are coming from and what their limitations are. Just assuming you can mix and match static and dynamic libraries at will is foolish. Always try to understand what each library does and what caveats apply to its usage.&lt;br /&gt;
&lt;br /&gt;
== Libraries and Interfaces ==&lt;br /&gt;
&lt;br /&gt;
AmigaOS provides hundreds of functions which are split up into different shared libraries. Each shared library is further split up into different interfaces. Much more detailed information about Libraries and Interfaces can be found in [[Exec_Libraries|Exec Libraries]]&lt;br /&gt;
&lt;br /&gt;
=== Opening and Closing ===&lt;br /&gt;
&lt;br /&gt;
The following code can be used to open interfaces:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct Interface* try_open_iface_name(CONST_STRPTR libname, uint32 libver, CONST_STRPTR ifacename)&lt;br /&gt;
{&lt;br /&gt;
	struct Library* base = IExec-&amp;gt;OpenLibrary(libname, libver);&lt;br /&gt;
	if ( base != 0 )  {&lt;br /&gt;
		struct Interface* iface = IExec-&amp;gt;GetInterface(base, ifacename, 1, 0);&lt;br /&gt;
&lt;br /&gt;
		if ( iface != 0 )  {&lt;br /&gt;
			return iface;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		IExec-&amp;gt;CloseLibrary(base);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct Interface* open_iface_name(CONST_STRPTR libname, uint32 libver, CONST_STRPTR ifacename)&lt;br /&gt;
{&lt;br /&gt;
	struct Interface* iface = try_open_iface_name(libname, libver, ifacename);&lt;br /&gt;
&lt;br /&gt;
	if ( iface == 0 )  {&lt;br /&gt;
		IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t open %s version %lu interface %s\n&amp;quot;, libname, libver, ifacename);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return iface;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct Interface* open_iface(CONST_STRPTR libname, uint32 libver)&lt;br /&gt;
{&lt;br /&gt;
	return open_iface_name(libname, libver, &amp;quot;main&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following code can be used to close an interface and the corresponding library:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
void close_iface(struct Interface* iface)&lt;br /&gt;
{&lt;br /&gt;
	if ( iface != 0 )  {&lt;br /&gt;
		struct Library* lib = iface-&amp;gt;Data.LibBase;&lt;br /&gt;
		IExec-&amp;gt;DropInterface(iface);&lt;br /&gt;
		IExec-&amp;gt;CloseLibrary(lib);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Special Syntax Support ===&lt;br /&gt;
&lt;br /&gt;
Exec Interfaces are called using a special syntax supported by the GNU GCC compiler included with the SDK:&lt;br /&gt;
&lt;br /&gt;
 IExec-&amp;gt;DebugPrintF(&amp;quot;Hello, world\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Using a regular compiler this would translate into:&lt;br /&gt;
&lt;br /&gt;
 IExec-&amp;gt;DebugPrintF(IExec, &amp;quot;Hello, world\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Notice how the first argument to the function call is &#039;hidden&#039; when using the modified GNU GCC compiler. This becomes especially important when trying to understand error messages from the compiler. For example, the following code is invalid:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	IExec-&amp;gt;DebugPrintF(42);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 gcc -o args args.c&lt;br /&gt;
 args.c: In function &#039;main&#039;:&lt;br /&gt;
 args.c:5: warning: passing argument 2 of &#039;IExec-&amp;gt;DebugPrintF&#039; makes pointer from integer without a cast&lt;br /&gt;
&lt;br /&gt;
Notice how the compiler is referring to &amp;quot;argument 2&amp;quot; even though there is only one argument in the call to IExec-&amp;gt;DebugPrintF(). This is a side effect of the &#039;hidden&#039; IExec argument referred to earlier.&lt;br /&gt;
&lt;br /&gt;
== Tasks and Processes ==&lt;br /&gt;
&lt;br /&gt;
AmigaOS has two basic threads of control: Tasks and Processes. The following class diagram illustrates their relationship to each other:&lt;br /&gt;
&lt;br /&gt;
[[File:ProcessTaskClassDiagram.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Tasks are created by Exec (exec.library) while Processes are created by DOS (dos.library). A Process includes more overhead than a Task. This is primarily because a Process can access all the facilities offered by DOS such as file handling and input and output streams.&lt;br /&gt;
&lt;br /&gt;
In general, you should always prefer to use a Process instead of a Task. Although a Process may include more overhead, a Process is also simpler to work with. Tasks are generally relegated to low level activities. I will be focusing on the use of Processes in this lesson.&lt;br /&gt;
&lt;br /&gt;
To create a new Process, DOS provides the following function:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct Process *proc = CreateNewProcTags(uint32 Tag1, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are many tags which can be used to customize the way in which the new Process is created which are fully explained in the dos.doc AutoDoc.&lt;br /&gt;
&lt;br /&gt;
Library base pointers (struct Library*) may be global and shared between Processes. Interface pointers must not be shared between Processes unless this is explicitly allowed. The reason for this is because an Exec Interface may allocate resources which are bound to the context of the caller. That means if your parent Process calls GetInterface() then it allocates resources only for that Process. A child Process must call GetInterface() as well to allocate resources for that child Process.&lt;br /&gt;
&lt;br /&gt;
=== Synchronization Primitives ===&lt;br /&gt;
&lt;br /&gt;
When two or more Tasks and/or Processes want to share common data with each other then synchronization primitives are likely to be required.&lt;br /&gt;
&lt;br /&gt;
* Signals are the most basic way for two processes to communicate with each other. A signal is a single bit which is either 1 or 0. There are 16 user signals available and many system signals. See [[Exec_Signals|Signals]] for more details.&lt;br /&gt;
&lt;br /&gt;
* Message ports are used to transfer messages between two processes. The message can be sent one way or it can be sent and replied. Message data is always shared and not copied so it is critical that message passing protocols are followed. See [[Exec_Messages_and_Ports|Messages and Ports]] for more details.&lt;br /&gt;
&lt;br /&gt;
* Semaphores provide a rich interface for sharing resources between processes. Sempahores can be shared so that multiple processes can wait on a single semaphore simultaneously. See [[Exec_Semaphores|Semaphores]] for more details.&lt;br /&gt;
&lt;br /&gt;
* Mutexes provide a simple high speed interface for sharing resources between processes. Mutexes are exclusive and cannot be shared. Mutexes can also be recursive or not depending on the application. See [[Exec_Mutexes|Mutexes]] for more details.&lt;br /&gt;
&lt;br /&gt;
{{Note|If you are sharing memory between two entities that memory must be marked as MEMF_SHARED. Failure to comply with this requirement will result in problems when AmigaOS starts to enforce MEMF_PRIVATE memory semantics.}}&lt;br /&gt;
&lt;br /&gt;
== Shared Objects ==&lt;br /&gt;
&lt;br /&gt;
Shared objects are an idea directly lifted from the Unix world. The main reason shared objects were added to AmigaOS is to enable much simpler porting of complex applications. For example, Amiga Python was implemented using shared objects which makes it very easy to maintain. It is up to each programmer to determine whether they want to use traditional Amiga shared libraries or shared objects for their particular project. For a discussion of the pros and cons see [[The_Right_Tool_for_the_Job_(Shared_Objects)|The Right Tool for the Job]].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=File:DataTypesClassDiagram.png&amp;diff=9263</id>
		<title>File:DataTypesClassDiagram.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=File:DataTypesClassDiagram.png&amp;diff=9263"/>
		<updated>2017-12-05T19:54:07Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
	<entry>
		<id>https://wiki.amigaos.net/w/index.php?title=Datatypes_Library&amp;diff=9262</id>
		<title>Datatypes Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.amigaos.net/w/index.php?title=Datatypes_Library&amp;diff=9262"/>
		<updated>2017-12-05T19:53:51Z</updated>

		<summary type="html">&lt;p&gt;Steven Solie: /* Classes, Objects and Methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
The purpose of the DataTypes Library is to provide tools for handling data in an object-oriented way. The object-oriented approach means that your application can work with numerous data file standards without having to worry about the complex details of each one. Instead you only need to understand the simple conventions of the library.&lt;br /&gt;
&lt;br /&gt;
The DataTypes Library is built on Intuition&#039;s BOOPSI facility (BOOPSI is an acronym for Basic Object-Oriented Programming System for Intuition). Although not required, it is very helpful to know a little about [[BOOPSI_-_Object_Oriented_Intuition|how BOOPSI works]] before trying to use the DataTypes Library. Some familiarity with object-oriented theory and practice is also helpful, though not required.&lt;br /&gt;
&lt;br /&gt;
Since the library uses the TagItem structure for passing parameters to functions, you will have to understand how TagItems work before you can call the library functions. For more information on TagItems refer to the [[Utility_Library|Utility Library]].&lt;br /&gt;
&lt;br /&gt;
== Spelling Conventions ==&lt;br /&gt;
&lt;br /&gt;
In software development, the term “datatype” or “data type” is often used in the general sense, whereas the AmigaOS DataTypes framework establishes a rather special context. In order to avoid possible confusion, this documentation uses capitalized spelling in reference to components and programming entities that are part of the said framework, such as: the DataTypes Library, a DataType subclass, a DataType object, Picture DataType, etc.&lt;br /&gt;
&lt;br /&gt;
== Why Use DataTypes? ==&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a summary of main properties and features:&lt;br /&gt;
&lt;br /&gt;
* Support for multiple file formats across various types of data (text, sound, image, animation etc.). Load data the easy way without having to write dedicated loader code!&lt;br /&gt;
&lt;br /&gt;
* Simple and consistent handling of multiple data standards. Once you have learned how to manipulate one type of data with the DataTypes Library, you will find that the other types are handled in much the same way.&lt;br /&gt;
&lt;br /&gt;
* Extensible. New data types can be added to those already supported.&lt;br /&gt;
&lt;br /&gt;
* Clipboard support. The DataTypes Library provides a consistent and easy-to-use interface to the Amiga&#039;s [[Clipboard_Device|clipboard device]] to encourage data sharing between applications.&lt;br /&gt;
&lt;br /&gt;
* Intuition gadget support. Because the DataTypes Library is implemented with BOOPSI, the data objects it handles can also be treated as gadgets. Gadget operations can be performed on data objects within Intuition&#039;s task context, the same as other BOOPSI gadgets.&lt;br /&gt;
&lt;br /&gt;
* Automatic conversion from one format to another. Future versions of the DataTypes Library will support other types of data objects. Conversion from one format to another will be automatically handled by the library.&lt;br /&gt;
&lt;br /&gt;
* Validation. For example, you can easily check to see if a file is a valid JPEG (AIFF, AmigaGuide etc.) or not.&lt;br /&gt;
&lt;br /&gt;
= Classes, Objects and Methods =&lt;br /&gt;
&lt;br /&gt;
The jargon used to describe the DataTypes Library may be a little confusing if you have never worked with object-oriented systems before. For instance, the kinds of data supported by the library are divided into &#039;&#039;classes&#039;&#039; and &#039;&#039;subclasses&#039;&#039;.  The term &#039;&#039;class&#039;&#039; is used here in a familiar way; the members of a class simply have a common set of properties. The members of a subclass have all the properties of the parent class (superclass) and additional properties specific to the subclass. (Each subclass can be further broken down into sub-subclasses and so on.)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| Class || Ungulate || Has hooves, can run.&lt;br /&gt;
|-&lt;br /&gt;
| Subclass || Cow || Has udder, can be milked (also has hooves and can run).&lt;br /&gt;
|-&lt;br /&gt;
| Object || Daisy || An instance of class Cow; can run and can be milked.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An actual instance of a class or subclass is referred to as an &#039;&#039;object&#039;&#039;. The term &#039;&#039;object&#039;&#039; is appropriate because in general we want to ignore the details of each individual case and concentrate instead on what we can do with an object based on its class. In the example above the Daisy object can run and can be milked. The operations that can be performed with an object are referred to as &#039;&#039;methods&#039;&#039; and the object is said to &#039;&#039;inherit&#039;&#039; the methods and other attributes of its parent class (which in turn inherits the methods and attributes of its parent class, if it has one).&lt;br /&gt;
&lt;br /&gt;
The datatypes.library implements &#039;&#039;datatypesclass&#039;&#039; from which all other DataType classes inherit from. The following BOOPSI class diagram illustrates how the various DataTypes classes relate to each other.&lt;br /&gt;
&lt;br /&gt;
[[File:DataTypesClassDiagram.png|frame|center|DataTypes Class Diagram]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ DataTypes Library Object Classes&lt;br /&gt;
! Object Classes&lt;br /&gt;
! Autodoc File Showing the Methods Supported&lt;br /&gt;
! Type of Data Object&lt;br /&gt;
|-&lt;br /&gt;
| Picture class&lt;br /&gt;
| picture_dtc.doc&lt;br /&gt;
| IFF graphic image file&lt;br /&gt;
|-&lt;br /&gt;
| Sound class&lt;br /&gt;
| sound_dtc.doc&lt;br /&gt;
| IFF audio sample file&lt;br /&gt;
|-&lt;br /&gt;
| Text class&lt;br /&gt;
| text_dtc.doc&lt;br /&gt;
| ASCII characters&lt;br /&gt;
|-&lt;br /&gt;
| AmigaGuide class&lt;br /&gt;
| amigaguide_dtc.doc&lt;br /&gt;
| Hypertext databases&lt;br /&gt;
|-&lt;br /&gt;
| Animation class&lt;br /&gt;
| animation_dtc.doc&lt;br /&gt;
| Animations containing graphics and sound&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The examples programs listed below demonstrate how to perform some basic &#039;&#039;methods&#039;&#039; on ILBM and 8SVX class objects.&lt;br /&gt;
&lt;br /&gt;
= DataTypes Class Attributes =&lt;br /&gt;
&lt;br /&gt;
DataType classes have other attributes in addition to the methods (operations) that they support. For each attribute, there is a corresponding TagItem defined in the DataTypes Library that you can use to examine or set that attribute in a particular object. For example, picture objects have a display mode attribute. The tag that controls this attribute is named PDTA_ModeID and is described in the Autodoc file picture_dtc.doc. See the Autodoc files for each class (as shown in Table 1) for a complete list of all class attributes.&lt;br /&gt;
&lt;br /&gt;
The class attribute descriptions in the include files also have a set of codes that indicate the &#039;&#039;applicability&#039;&#039; of the attribute. The codes are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| I - Initialize&lt;br /&gt;
| You can initialize the attribute when the object is created&lt;br /&gt;
|-&lt;br /&gt;
| S - Set&lt;br /&gt;
| You can set the attribute to a new value after the object is created&lt;br /&gt;
|-&lt;br /&gt;
| G - Get&lt;br /&gt;
| You can get the value of the attribute after the object is created&lt;br /&gt;
|-&lt;br /&gt;
| N - Notify&lt;br /&gt;
| Changing the attribute triggers the object to send notification&lt;br /&gt;
|-&lt;br /&gt;
| U - Update&lt;br /&gt;
| Attribute can be set using the object&#039;s OM_UPDATE method&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These codes may seem a little mysterious until you have actually tried using the DataTypes Library. The N and U codes in particular are for special applications that want to implement their own object classes, an advanced topic beyond the scope of this article.&lt;br /&gt;
&lt;br /&gt;
= Basic Functions of the DataTypes Library =&lt;br /&gt;
&lt;br /&gt;
If all these new concepts seem a little daunting, rest assured; the DataTypes Library uses conventional C language function calls to get the job done. The calls you will be using most often are listed below. Notice that for each of these basic functions of DataTypes Library there is an equivalent BOOPSI call in the Intuition Library.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! datatypes.library&lt;br /&gt;
! intuition.library&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| NewDTObject()&lt;br /&gt;
| NewObject()&lt;br /&gt;
| Create a DataType object in memory from a file or clip&lt;br /&gt;
|-&lt;br /&gt;
| DisposeDTObject()&lt;br /&gt;
| DisposeObject()&lt;br /&gt;
| Free an object created earlier with NewDTObject() (or NewObject() )&lt;br /&gt;
|-&lt;br /&gt;
| GetDTAttrs()&lt;br /&gt;
| GetAttr()&lt;br /&gt;
| Get attributes of a DataType object&lt;br /&gt;
|-&lt;br /&gt;
| SetDTAttrs()&lt;br /&gt;
| SetAttrs()&lt;br /&gt;
| Set attributes for a DataType object&lt;br /&gt;
|-&lt;br /&gt;
| DoDTMethod()&lt;br /&gt;
| IDoMethod()&lt;br /&gt;
| Perform the given method (operation) with a DataType object&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There are also additional functions used to access DataType objects.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function Name&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| AddDTObject() || Add a DataType object to a window.&lt;br /&gt;
|-&lt;br /&gt;
| RefreshDTObjectA() || Refresh the rendering of a DataType object.&lt;br /&gt;
|-&lt;br /&gt;
| RemoveDTObject() || Remove a DataType object from a window.&lt;br /&gt;
|-&lt;br /&gt;
| GetDTMethods() || Get a list of the methods that a DataTypes object supports. Write, Copy, and Select are examples of methods that an object may support.&lt;br /&gt;
|-&lt;br /&gt;
| GetDTTriggerMethods() || Get a list of the trigger methods that a DataType object supports. An action like Play, Pause, and Resume are examples of trigger methods that an object may support.&lt;br /&gt;
|-&lt;br /&gt;
| PrintDTObject() || Asynchronously print a DataType object.&lt;br /&gt;
|-&lt;br /&gt;
| GetDTString() || Get the localized text string for a DataTypes text id. Useful for obtaining localized error messages.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In a typical application the sequence of calls might be performed&lt;br /&gt;
like this:&lt;br /&gt;
&lt;br /&gt;
# Use NewDTObject() to create an object in memory from given data.&lt;br /&gt;
# Get (or perhaps set) attributes of the object using GetDTAttr() (or SetDTAttrs() ).&lt;br /&gt;
# Perform &#039;&#039;methods&#039;&#039; (operations) with the object using DoDTMethod().&lt;br /&gt;
# Free the object and any memory or other resources it was using with the DisposeDTObject() call.&lt;br /&gt;
&lt;br /&gt;
= Basic Structures of the DataTypes Library =&lt;br /&gt;
&lt;br /&gt;
There are a lot of structures used with DataTypes Library function calls; too many to summarize in this article. However, here&#039;s a listing of the relevant include files that contain the structure definitions of interest to class users.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &amp;lt;datatypes/datatypes.h&amp;gt;&lt;br /&gt;
| Group IDs, error numbers plus library overhead&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;datatypes/datatypesclass.h&amp;gt;&lt;br /&gt;
| Defines DataType methods and associated structures&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;datatypes/picture.h&amp;gt;&lt;br /&gt;
| Structures specific to the picture class&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;datatypes/sound.h&amp;gt;&lt;br /&gt;
| Structures specific to the sound class&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;datatypes/text.h&amp;gt;&lt;br /&gt;
| Structures specific to the text class&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;libraries/amigaguide.h&amp;gt;&lt;br /&gt;
| Structures and methods for AmigaGuide databases&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;intuition/classusr.h&amp;gt;&lt;br /&gt;
| Defines general BOOPSI object methods&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;intuition/gadgetclass.h&amp;gt;&lt;br /&gt;
| Defines gadget methods and associated structures&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two most important definitions in these include files appear in &amp;lt;intuition/classusr.h&amp;gt;. The objects used with DataTypes Library functions (and the BOOPSI functions in Intuition) are defined as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
typedef ULONG   Object;     /* abstract handle */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since we want to treat objects as black boxes and don&#039;t really care how they are implemented, this definition is very appropriate. When a method is performed with an object, the parameter used to identify the method is a Msg structure defined as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    ULONG MethodID;&lt;br /&gt;
    /* method-specific data goes here */&lt;br /&gt;
} *Msg;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some methods require more information than just the method identifier. Such methods have a custom structure defined in the include files.  All method structures, however, begin with a field that contains the method ID.&lt;br /&gt;
&lt;br /&gt;
= Creating a DataType Object =&lt;br /&gt;
&lt;br /&gt;
The DataTypes function NewDTObjectA() must be used to create a new DataType object.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Object *dto = IDataTypes-&amp;gt;NewDTObjectA (APTR name, struct TagItem *attrs);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pointer that NewDTObjectA() returns is a pointer to a BOOPSI object. Like other BOOPSI objects, DataType objects are &amp;quot;black boxes&amp;quot; and are not to be peeked and poked without using the provided interface.&lt;br /&gt;
&lt;br /&gt;
To create a DataType object, NewDTObjectA() needs to know the where to obtain the data used to create the object. By default the name is treated as file name.&lt;br /&gt;
&lt;br /&gt;
The attrs tag list is a list of tag/value pairs, each of which contains an initial value for an attribute. There are a number of attributes defined in &amp;lt;datatypes/datatypesclass.h&amp;gt; that can be used at creation time.&lt;br /&gt;
&lt;br /&gt;
; DTA_SourceType&lt;br /&gt;
: Specify the type of the source data. The default is DTST_FILE.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| DTST_RAM || Source data is in RAM.&lt;br /&gt;
|-&lt;br /&gt;
| DTST_FILE || Source data is a file. Name is the name of the file.&lt;br /&gt;
|-&lt;br /&gt;
| DTST_CLIPBOARD || Source data is in the clipboard. Name is the unit number. For example, (APTR)0, for clipboard unit zero.&lt;br /&gt;
|-&lt;br /&gt;
| DTST_HOTLINK || Reserved for future use.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
; DTA_Handle&lt;br /&gt;
: Can be used instead of the name field. If the source type is DTST_FILE then handle must be a valid BPTR file handle. If the source type is DTST_CLIPBOARD then handle must be a valid IFFHandle.&lt;br /&gt;
&lt;br /&gt;
; DTA_DataType&lt;br /&gt;
: Can be used to specify the class for handling the data. Data must be a pointer to a valid DataType. This should only be used when attempting to create a new object that doesn&#039;t have source data, or could be handled by multiple classes (for example, could be used to force an object to be handled by the AmigaGuide class).&lt;br /&gt;
&lt;br /&gt;
; DTA_GroupID&lt;br /&gt;
: If this tag is present, then the data must be of the specified type, or the object creation will fail with ERROR_OBJECT_WRONG_TYPE. This can be used by a Sound editor to ensure that only sounds can be loaded, for example.&lt;br /&gt;
&lt;br /&gt;
There are additional attributes that can specified at creation time, but are dependant on the data type of the object being created. See the header files &amp;lt;datatypes/#?class.h&amp;gt; for more attributes.&lt;br /&gt;
&lt;br /&gt;
The following attributes, which are defined in &amp;lt;intuition/gadgetclass.h&amp;gt;, are also valid.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tag !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GA_Left || Specify the left edge of the gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_RelRight || Specify the left edge of the gadget being relative to the right edge of the containing window.&lt;br /&gt;
|-&lt;br /&gt;
| GA_Top || Specify the top edge of the gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_RelBottom || Specify the top edge of the gadget being relative to the bottom edge of the containing window.&lt;br /&gt;
|-&lt;br /&gt;
| GA_Width || Specify the width of the gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_RelWidth || Specify the width of the gadget being relative to the width of the containing window.&lt;br /&gt;
|-&lt;br /&gt;
| GA_Height || Specify the heigh of the gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_RelHeight || Specify the heigh of the gadget being relative to the height of the containing window.&lt;br /&gt;
|-&lt;br /&gt;
| GA_ID || Specify a ID associated with the gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_UserData || Attach application data to the gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_Immediate || Indicate that the application should be notified of gadget down events for this gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_RelVerify || Indicate that the application should be notified of gadget up events for this gadget.&lt;br /&gt;
|-&lt;br /&gt;
| GA_Previous || For adding the gadget to a list of gadgets.&lt;br /&gt;
|-&lt;br /&gt;
| GA_DrawInfo || A pointer to a struct DrawInfo.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In order for the application to receive information from the DataType object, it must set up a target for the notification attributes that the object sends out.&lt;br /&gt;
&lt;br /&gt;
; ICA_TARGET&lt;br /&gt;
: Specify a target for the notification attributes that the DataType object sends out.&lt;br /&gt;
&lt;br /&gt;
; ICA_MAP&lt;br /&gt;
: Specify an attribute mapping for the notification attributes that the DataType object sends out.&lt;br /&gt;
&lt;br /&gt;
The usual method to obtain notification is to set up an ICA_TARGET of ICTARGET_IDCMP so that the application will receive the attributes via the IDCMP_IDCMPUPDATE Intuition message class. But it is also possible to set up another BOOPSI object as the receiver.&lt;br /&gt;
&lt;br /&gt;
If NewDTObjectA() is successful, it returns a pointer to a DataType object. Otherwise it returns NULL and the reason for failure can be obtained using IoErr(). See the Autodocs for datatypes.library for more information.&lt;br /&gt;
&lt;br /&gt;
= Obtaining Environment Information for a DataType =&lt;br /&gt;
&lt;br /&gt;
In order to embed a DataType object in a window, it is neccessary to ask the object what its minimum environment is. For example, since the remap code doesn&#039;t handle remapping HAM pictures, they must be shown on a HAM screen, and therefore can&#039;t be added to a window that is on a non-HAM screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ULONG modeid = INVALID_ID;&lt;br /&gt;
LONG nomwidth, nomheight;&lt;br /&gt;
BOOL useScreen = FALSE;&lt;br /&gt;
struct dtFrameBox dtf;&lt;br /&gt;
struct FrameInfo fri;&lt;br /&gt;
&lt;br /&gt;
/* Get the attributes that we are interested in */&lt;br /&gt;
IDataTypes-&amp;gt;GetDTAttrs(dto,&lt;br /&gt;
    /* Get the mode ID */&lt;br /&gt;
    PDTA_ModeID,    &amp;amp;modeid,&lt;br /&gt;
&lt;br /&gt;
    /* Get the desired size */&lt;br /&gt;
    DTA_NominalHoriz, &amp;amp;nomwidth,&lt;br /&gt;
    DTA_NominalVert,  &amp;amp;nomheight,&lt;br /&gt;
&lt;br /&gt;
    TAG_END);&lt;br /&gt;
&lt;br /&gt;
/* Clear the structures */&lt;br /&gt;
IUtility-&amp;gt;ClearMem(&amp;amp;dtf, sizeof (struct dtFrameBox));&lt;br /&gt;
IUtility-&amp;gt;ClearMem(&amp;amp;fri, sizeof (struct FrameInfo));&lt;br /&gt;
&lt;br /&gt;
/* Fill in the message */&lt;br /&gt;
dtf.MethodID          = DTM_FRAMEBOX;&lt;br /&gt;
dtf.dtf_FrameInfo     = &amp;amp;fri;&lt;br /&gt;
dtf.dtf_ContentsInfo  = &amp;amp;fri;&lt;br /&gt;
dtf.dtf_SizeFrameInfo = sizeof (struct FrameInfo);&lt;br /&gt;
&lt;br /&gt;
/* Perform the frame method */&lt;br /&gt;
if (IDataTypes-&amp;gt;DoDTMethodA (dto, NULL, NULL, (Msg) &amp;amp;dtf))&lt;br /&gt;
{&lt;br /&gt;
  /* Check to see if the object requires a HAM screen */&lt;br /&gt;
  if (fri.fri_PropertyFlags &amp;amp; DIPF_IS_HAM)&lt;br /&gt;
  {&lt;br /&gt;
      IDOS-&amp;gt;Printf (&amp;quot;HAM\n&amp;quot;);&lt;br /&gt;
      useScreen = TRUE;&lt;br /&gt;
  }&lt;br /&gt;
  /* Check to see if the object requires an ExtraHalfBrite screen */&lt;br /&gt;
  else if (fri.fri_PropertyFlags &amp;amp; DIPF_IS_EXTRAHALFBRITE)&lt;br /&gt;
  {&lt;br /&gt;
      IDOS-&amp;gt;Printf (&amp;quot;ExtraHalfBrite\n&amp;quot;);&lt;br /&gt;
      useScreen = TRUE;&lt;br /&gt;
  }&lt;br /&gt;
  /* A safety check to see if a screen is required */&lt;br /&gt;
  else if ((fri.fri_PropertyFlags == 0) &amp;amp;&amp;amp; (modeid &amp;amp; 0x800) &amp;amp;&amp;amp; (modeid != INVALID_ID))&lt;br /&gt;
  {&lt;br /&gt;
      IDOS-&amp;gt;Printf (&amp;quot;ModeID=0x%08lx\n&amp;quot;, modeid);&lt;br /&gt;
      useScreen = TRUE;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  /* No special environment required, can be attached to any screen mode */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding a DataType Object to a Window =&lt;br /&gt;
&lt;br /&gt;
A DataType object must be added to a window using the AddDTObject() function of DataTypes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
LONG AddDTObject (struct Window *w, struct Requester *r, Object *dto, LONG pos)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function will add a DataTypes object to the existing gadget list for the specified window. The recommended value for pos is -1 which will cause the DataType object to be added to the end of the list.&lt;br /&gt;
&lt;br /&gt;
DataType objects should not be added using the WA_Gadgets attribute to OpenWindowTagList() or by using the AddGList() function. There is special information that DataTypes requires that will not obtained if any method other than AddDTObject() is used.&lt;br /&gt;
&lt;br /&gt;
When the DataType object is added to the window, the layout method for the object will be invoked. It is possible that the layout will take a while to perform, in that case the object will spawn a process to handle the layout asynchronously. In order to refresh the object&#039;s visual information, it is necessary to obtain IDCMP_IDCMPUPDATE messages from the object and refresh the object when a DTA_Sync attribute is received.&lt;br /&gt;
&lt;br /&gt;
The following code fragment illustrates adding a DataType object to a window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Object *dto;&lt;br /&gt;
&lt;br /&gt;
struct IntuiMessage *imsg;&lt;br /&gt;
struct Window *win;&lt;br /&gt;
ULONG sigr;&lt;br /&gt;
&lt;br /&gt;
struct TagItem *tstate, *tags;&lt;br /&gt;
ULONG tidata;&lt;br /&gt;
ULONG errnum;&lt;br /&gt;
&lt;br /&gt;
BOOL going = TRUE;&lt;br /&gt;
&lt;br /&gt;
/* Set the pertinent attributes of the DataType object */&lt;br /&gt;
IDataTypes-&amp;gt;SetDTAttrs (dto, NULL, NULL,&lt;br /&gt;
&lt;br /&gt;
    /* Set the dimensions of the object */&lt;br /&gt;
    GA_Left,    win-&amp;gt;BorderLeft,&lt;br /&gt;
    GA_Top,     win-&amp;gt;BorderTop,&lt;br /&gt;
    GA_Width,   win-&amp;gt;Width - win-&amp;gt;BorderLeft - win-&amp;gt;BorderRight,&lt;br /&gt;
    GA_Height,  win-&amp;gt;Height - win-&amp;gt;BorderTop - win-&amp;gt;BorderBottom,&lt;br /&gt;
&lt;br /&gt;
    /* Make sure we receive IDCMP_IDCMPUPDATE messages from&lt;br /&gt;
     * the object */&lt;br /&gt;
    ICA_TARGET, ICTARGET_IDCMP,&lt;br /&gt;
    TAG_END);&lt;br /&gt;
&lt;br /&gt;
/* Add the object to the window */&lt;br /&gt;
IDataTypes-&amp;gt;AddDTObject (win, NULL, dto, -1);&lt;br /&gt;
&lt;br /&gt;
/* Refresh the DataType object */&lt;br /&gt;
IDataTypes-&amp;gt;RefreshDTObjects (dto, win, NULL, NULL);&lt;br /&gt;
&lt;br /&gt;
/* Keep going until we&#039;re told to stop */&lt;br /&gt;
while (going)&lt;br /&gt;
{&lt;br /&gt;
    /* Wait for an event */&lt;br /&gt;
    sigr = IExec-&amp;gt;Wait ((1L &amp;lt;&amp;lt; win-&amp;gt;UserPort-&amp;gt;mp_SigBit) | SIGBREAKF_CTRL_C);&lt;br /&gt;
&lt;br /&gt;
    /* Did we get a break signal */&lt;br /&gt;
    if (sigr &amp;amp; SIGBREAKF_CTRL_C)&lt;br /&gt;
        going = FALSE;&lt;br /&gt;
&lt;br /&gt;
    /* Pull Intuition messages */&lt;br /&gt;
    while (imsg = (struct IntuiMessage *) IExec-&amp;gt;GetMsg (win-&amp;gt;UserPort))&lt;br /&gt;
    {&lt;br /&gt;
        /* Handle each message */&lt;br /&gt;
        switch (imsg-&amp;gt;Class)&lt;br /&gt;
        {&lt;br /&gt;
            case IDCMP_IDCMPUPDATE:&lt;br /&gt;
                /* Get a pointer to the attribute list */&lt;br /&gt;
                tstate = tags = (struct TagItem *) imsg-&amp;gt;IAddress;&lt;br /&gt;
&lt;br /&gt;
                /* Step through the attribute list */&lt;br /&gt;
                while (tag = IUtility-&amp;gt;NextTagItem (&amp;amp;tstate))&lt;br /&gt;
                {&lt;br /&gt;
                    tidata = tag-&amp;gt;ti_Data;&lt;br /&gt;
                    switch (tag-&amp;gt;ti_Tag)&lt;br /&gt;
                    {&lt;br /&gt;
                        /* Change in busy state */&lt;br /&gt;
                        case DTA_Busy:&lt;br /&gt;
                            if (tidata)&lt;br /&gt;
                                IIntuition-&amp;gt;SetWindowPointer (win, WA_BusyPointer, TRUE, TAG_END);&lt;br /&gt;
                            else&lt;br /&gt;
                                IIntuition-&amp;gt;SetWindowPointer (win, WA_Pointer, NULL, TAG_END);&lt;br /&gt;
                            break;&lt;br /&gt;
&lt;br /&gt;
                        /* Error message */&lt;br /&gt;
                        case DTA_ErrorLevel:&lt;br /&gt;
                            if (tidata)&lt;br /&gt;
                            {&lt;br /&gt;
                                errnum = IUtility-&amp;gt;GetTagData (DTA_ErrorNumber, NULL, tags);&lt;br /&gt;
                                IDOS-&amp;gt;PrintErrorMsg (errnum, (STRPTR) options[OPT_NAME]);&lt;br /&gt;
                            }&lt;br /&gt;
                            break;&lt;br /&gt;
&lt;br /&gt;
                        /* Time to refresh */&lt;br /&gt;
                        case DTA_Sync:&lt;br /&gt;
                            /* Refresh the DataType object */&lt;br /&gt;
                            IDataTypes-&amp;gt;RefreshDTObjects (dto, win, NULL, NULL);&lt;br /&gt;
                            break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Done with the message, so reply to it */&lt;br /&gt;
        IExec-&amp;gt;ReplyMsg ((struct Message *) imsg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Removing a DataType Object from a Window =&lt;br /&gt;
&lt;br /&gt;
A DataType object must be removed from the window using the RemoveDTObject() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
LONG RemoveDTObject (struct Window *w, Object *dto)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function removes the DataType object from the window&#039;s gadget list.&lt;br /&gt;
&lt;br /&gt;
This is the only way that a DataType object should be removed from the window list. Using RemoveGList() is not supported, nor is removing the object manually.&lt;br /&gt;
&lt;br /&gt;
= Setting an Existing DataType Object&#039;s Attributes =&lt;br /&gt;
&lt;br /&gt;
An objects attributes are not necessarily static. An application can ask an object to set certain attributes using the SetDTAttrs() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ULONG SetDTAttrsA (Object *dto, struct Window *w, struct Requester *r, struct TagItem *attrs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The return value is DataType object specific, but generally a non-zero value means that the object needs to be visually refreshed.&lt;br /&gt;
&lt;br /&gt;
The following fragment illustrates how to set the current top values for a DataType object, using the VarArgs version of SetDTAttrsA().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
IDataTypes-&amp;gt;SetDTAttrs(dto, window, NULL,&lt;br /&gt;
    DTA_TopVert,  0,&lt;br /&gt;
    DTA_TopHoriz, 0,&lt;br /&gt;
    TAG_END);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will cause the DataType object to update its vertical and horizontal top values. If the object has been added to a window, then the display will be updated accordingly.&lt;br /&gt;
&lt;br /&gt;
Note that it is not OK to call SetGadgetAttrs() or SetAttrs() on a DataType object.&lt;br /&gt;
&lt;br /&gt;
= Getting a DataType Object&#039;s Attributes =&lt;br /&gt;
&lt;br /&gt;
The DataTypes function GetDTAttrsA() is used to obtain the values for a list of attributes from a DataType object.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
ULONG GetDTAttrsA (Object *dto, struct TagItem *attrs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where dto is a pointer to a DataType object returned by NewDTObjectA().&lt;br /&gt;
&lt;br /&gt;
And attrs is a TAG_END terminated array of attributes. Where the data element of each pair contains the address of the storage variable for that attribute.&lt;br /&gt;
&lt;br /&gt;
This function will return a number that indicates that number of attributes that it was able to obtain. For example if four attributes asked for and GetDTAttrs returns a four, then all the attributes were obtained.&lt;br /&gt;
&lt;br /&gt;
The following code fragment illustrates how to get the current top values&lt;br /&gt;
for a DataTypes object using the VarArgs form of GetDTAttrsA().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
LONG topv, toph;&lt;br /&gt;
&lt;br /&gt;
if (IDataTypes-&amp;gt;GetDTAttrs (dto, DTA_TopVert, &amp;amp;topv, DTA_TopHoriz, &amp;amp;toph, TAG_END) == 2)&lt;br /&gt;
{&lt;br /&gt;
    IDOS-&amp;gt;Printf (&amp;quot;Top: vertical=%ld, horizontal=%ld\n&amp;quot;, topv, toph);&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
    IDOS-&amp;gt;Printf (&amp;quot;couldn&#039;t obtain the top values\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= A Simple DataTypes Example =&lt;br /&gt;
&lt;br /&gt;
The example program listed here should clarify some of the concepts discussed so far. Suppose you have a communications program and want to add the capability of playing back a user-specified 8SVX sample file for the bell sound (Ctrl-G). The program below shows how to play a sound with the DataTypes Library.&lt;br /&gt;
&lt;br /&gt;
In this program, objects are of class 8SVX (a subclass of the Sound DataType). The method performed with the object is named DTM_TRIGGER (described in the Autodoc file sound_dtc.doc). The DTM_TRIGGER method (with type set to STM_PLAY) causes a sampled sound to be played on the Amiga&#039;s audio hardware. Since the DTM_TRIGGER method requires other information in addition to the method ID, a dtTrigger structure is used. This structure is defined in &amp;lt;datatypes/datatypesclass.h&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that if the Sound DataType is enhanced to support other types of sound files in a future version of AmigaOS, the code given here will automatically support the new type. This example expects the file name and path to a sound file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/* Run from CLI only. */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;exec/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;datatypes/datatypesclass.h&amp;gt;  /* This includes other files we need */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;proto/exec.h&amp;gt;          /* Prototypes for system functions */&lt;br /&gt;
#include &amp;lt;proto/intuition.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/datatypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/dos.h&lt;br /&gt;
&lt;br /&gt;
struct IntuitionIFace *IIntuition = NULL;&lt;br /&gt;
struct DataTypesIFace *IDataTypes = NULL;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
  APTR dtobject = NULL       /* Pointer to a DataTypes object */&lt;br /&gt;
  struct dtTrigger mydtt;    /* A trigger structure for the DTM_TRIGGER method */&lt;br /&gt;
&lt;br /&gt;
  if(argc &amp;lt;= 1 ) /* CLI only, at least one argument please. */&lt;br /&gt;
  {&lt;br /&gt;
    IDOS-&amp;gt;Printf(&amp;quot;Give a file name too.\n&amp;quot;);&lt;br /&gt;
    return RETURN_FAIL;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  struct Library *IntuitionBase = IExec-&amp;gt;OpenLibrary(&amp;quot;intuition.library&amp;quot;, 50);&lt;br /&gt;
  IIntuition = (struct IntuitionIFace*)IExec-&amp;gt;GetInterface(IntuitionBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
&lt;br /&gt;
  struct Library *DataTypesBase = IExec-&amp;gt;OpenLibrary(&amp;quot;datatypes.library&amp;quot;, 50);&lt;br /&gt;
  IDataTypes = (struct DataTypesIFace*)IExec-&amp;gt;GetInterface(DataTypesBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
 &lt;br /&gt;
  if (IIntuition != NULL &amp;amp;&amp;amp; IDataTypes != NULL)&lt;br /&gt;
  {&lt;br /&gt;
    /* Attempt to make an 8svx sound object from the file name the user */&lt;br /&gt;
    /* specified in the command line.  For a list of possible error     */&lt;br /&gt;
    /* returns, see the Autodocs for NewDTObjectA().  The group ID tag  */&lt;br /&gt;
    /* will allow only Sound DataType files to be accepted for the call.*/&lt;br /&gt;
    if (dtobject = IDataTypes-&amp;gt;NewDTObject(argv[1], DTA_GroupID, GID_SOUND,&lt;br /&gt;
                                                    TAG_END) )&lt;br /&gt;
    {&lt;br /&gt;
      mydtt.MethodID     = DTM_TRIGGER; /* Fill in the dtTrigger struct */&lt;br /&gt;
      mydtt.dtt_GInfo    = NULL;&lt;br /&gt;
      mydtt.dtt_Function = STM_PLAY;&lt;br /&gt;
      mydtt.dtt_Data     = NULL;&lt;br /&gt;
&lt;br /&gt;
      /* The return value of the DTM_TRIGGER method used with the 8svx */&lt;br /&gt;
      /* Sound DataType is undefined in V39.  This is likely to change */&lt;br /&gt;
      /* in future versions of the Amiga operating system.             */&lt;br /&gt;
      uint32 dores = IDataTypes-&amp;gt;DoDTMethodA(dtobject, NULL, NULL, &amp;amp;mydtt);&lt;br /&gt;
&lt;br /&gt;
      // Let the 8svx sound finish playing. Another way is to use&lt;br /&gt;
      // SDTA_SignalTask and SDTA_SignalBit to find out when it is&lt;br /&gt;
      // finished playing.&lt;br /&gt;
      IExec-&amp;gt;Wait(SIGBREAKF_CTRL_C);&lt;br /&gt;
&lt;br /&gt;
      IDataTypes-&amp;gt;DisposeDTObject(dtobject);&lt;br /&gt;
    }&lt;br /&gt;
    else IDOS-&amp;gt;Printf(&amp;quot;Couldn&#039;t create new object or not a sound data file\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t open interfaces\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  IExec-&amp;gt;DropInterface((struct Interface*)IDataTypes);&lt;br /&gt;
  IExec-&amp;gt;CloseLibrary(DataTypesBase);&lt;br /&gt;
&lt;br /&gt;
  IExec-&amp;gt;DropInterface((struct Interface*)IIntuition);&lt;br /&gt;
  IExec-&amp;gt;CloseLibrary(IntuitionBase);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition to playing back a sampled sound, the DataTypes Library allows sound objects to become gadgets (the library includes default imagery for a sound gadget). Since all DataTypes are implemented as a subclass of the BOOPSI &#039;&#039;gadgetclass&#039;&#039;, they all support the methods of gadget objects as described in [[BOOPSI_-_Object_Oriented_Intuition|BOOPSI]].&lt;br /&gt;
&lt;br /&gt;
= Embedding DataTypes =&lt;br /&gt;
&lt;br /&gt;
Since DataTypes are a subclass of the Intuition &#039;&#039;gadgetclass&#039;&#039;, DataType objects can be attached to an Intuition window in a similiar way that gadgets can be added to a window. DataTypes use a parallel set of functions because it requires additional information that the Intuition functions weren&#039;t able to provide.&lt;br /&gt;
&lt;br /&gt;
Currently the handling of the data is limited to reading, writing, printing, viewing (audio or visual), and clipboard access. Utilities like MultiView or MultiViewer are examples of applications that can embed DataType objects.&lt;br /&gt;
&lt;br /&gt;
= Determining Data Type =&lt;br /&gt;
&lt;br /&gt;
One of the main features of the DataTypes system is its ability to determine the type of a block of data. This data block can reside in a file or the clipboard.&lt;br /&gt;
&lt;br /&gt;
The following functions are used to determine the DataType of a data block:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| ObtainDataTypeA() || Obtain the DataType descriptor for a data block.&lt;br /&gt;
|-&lt;br /&gt;
| ReleaseDataType() || Release the DataType descriptor for a data block.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data type detection functions use the DataType structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct DataType&lt;br /&gt;
{&lt;br /&gt;
    struct Node            dtn_Node1;&lt;br /&gt;
    struct Node            dtn_Node2;&lt;br /&gt;
    struct DataTypeHeader *dtn_Header;&lt;br /&gt;
    struct List            dtn_ToolList;&lt;br /&gt;
    STRPTR                 dtn_FunctionName;&lt;br /&gt;
    struct TagItem        *dtn_AttrList;&lt;br /&gt;
    ULONG                  dtn_Length;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The DataType structure is read-only. The only pertinent field is the dtn_Header field, which points to a DataTypeHeader structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
struct DataTypeHeader&lt;br /&gt;
{&lt;br /&gt;
    STRPTR   dth_Name;&lt;br /&gt;
    STRPTR   dth_BaseName;&lt;br /&gt;
    STRPTR   dth_Pattern;&lt;br /&gt;
    WORD    *dth_Mask;&lt;br /&gt;
    ULONG    dth_GroupID;&lt;br /&gt;
    ULONG    dth_ID;&lt;br /&gt;
    WORD     dth_MaskLen;&lt;br /&gt;
    WORD     dth_Pad;&lt;br /&gt;
    UWORD    dth_Flags;&lt;br /&gt;
    WORD     dth_Priority;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The DataTypeHeader structure fields are as follows:&lt;br /&gt;
&lt;br /&gt;
; dth_Name&lt;br /&gt;
: Descriptive name of the data type. For example, the description for an ILBM data type could possibly be &amp;quot;Amiga BitMap Picture&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; dth_BaseName&lt;br /&gt;
: This is the base name for the data type and is used to obtain the class that handles this data type.&lt;br /&gt;
&lt;br /&gt;
; dth_GroupID&lt;br /&gt;
: This identifies the general type of data that the object contains. Following are the possible values:&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| GID_SYSTEM || Fonts, Executables, Libraries, Devices, etc...&lt;br /&gt;
|-&lt;br /&gt;
| GID_TEXT || Formatted or unformatted text.&lt;br /&gt;
|-&lt;br /&gt;
| GID_DOCUMENT || Formatted text with embedded DataTypes (such as pictures).&lt;br /&gt;
|-&lt;br /&gt;
| GID_SOUND || Audio samples.&lt;br /&gt;
|-&lt;br /&gt;
| GID_INSTRUMENT || Audio samples used for playing music.&lt;br /&gt;
|-&lt;br /&gt;
| GID_MUSIC || Musical scores.&lt;br /&gt;
|-&lt;br /&gt;
| GID_PICTURE || Graphic picture or brush.&lt;br /&gt;
|-&lt;br /&gt;
| GID_ANIMATION || Moving picture or cartoon.&lt;br /&gt;
|-&lt;br /&gt;
| GID_MOVIE || Moving picture or cartoon with sound.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
; dth_ID&lt;br /&gt;
: This is an individual indentifier for the DataType. For IFF files it is the same as the FORM type, for example ILBM for an Amiga BitMap picture. For non-IFF files, it is the first four characters of dth_Name.&lt;br /&gt;
&lt;br /&gt;
; dth_Flags&lt;br /&gt;
: The flags field contains, among other information, the coarse type of data. The type can be obtained by ANDing DTF_TYPE_MASK with this field.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| DTF_IFF || Interchange File Format&lt;br /&gt;
|-&lt;br /&gt;
| DTF_BINARY || Non-readable characters&lt;br /&gt;
|-&lt;br /&gt;
| DTF_ASCII || Readable characters&lt;br /&gt;
|-&lt;br /&gt;
| DTF_MISC || Disks and drawers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
; dth_Pattern&lt;br /&gt;
; dth_Mask&lt;br /&gt;
; dth_MaskLen&lt;br /&gt;
; dth_Priority&lt;br /&gt;
: These fields are used by the detection code in datatypes.library for determining the data type. See the &amp;quot;Defining a DataType Descriptor&amp;quot; section for more information.&lt;br /&gt;
&lt;br /&gt;
Following is a code fragment that shows how to determine the data type of a file. This fragment uses functions from the DataTypes Library, DOS Library, and IFFParse Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
    STRPTR name = &amp;quot;somefilename&amp;quot;;&lt;br /&gt;
    BPTR lock;&lt;br /&gt;
&lt;br /&gt;
    struct DataTypeHeader *dth;&lt;br /&gt;
    struct DataType *dtn;&lt;br /&gt;
    UBYTE idesc[5];&lt;br /&gt;
    STRPTR tdesc;&lt;br /&gt;
    STRPTR gdesc;&lt;br /&gt;
    UWORD ttype;&lt;br /&gt;
&lt;br /&gt;
    /* Obtain a lock on the file that we want information on */&lt;br /&gt;
    if (lock = IDOS-&amp;gt;Lock (name, ACCESS_READ))&lt;br /&gt;
    {&lt;br /&gt;
	/* Get a pointer to the appropriate DataType structure */&lt;br /&gt;
	if (dtn = IDataTypes-&amp;gt;ObtainDataTypeA (DTST_FILE, (APTR)lock, NULL))&lt;br /&gt;
	{&lt;br /&gt;
	    /* Get a pointer to the DataTypeHeader structure */&lt;br /&gt;
	    dth = dtn-&amp;gt;dtn_Header;&lt;br /&gt;
&lt;br /&gt;
	    /* Get the coarse type */&lt;br /&gt;
	    ttype = dth-&amp;gt;dth_Flags &amp;amp; DTF_TYPE_MASK;&lt;br /&gt;
&lt;br /&gt;
	    /* Get a pointer to the text strings */&lt;br /&gt;
	    tdesc = IDataTypes-&amp;gt;GetDTString (ttype + DTMSG_TYPE_OFFSET);&lt;br /&gt;
	    gdesc = IDataTypes-&amp;gt;GetDTString (dth-&amp;gt;dth_GroupID);&lt;br /&gt;
&lt;br /&gt;
	    /* Convert the ID to a string. */&lt;br /&gt;
	    IIFFParse-&amp;gt;IDtoStr (dth-&amp;gt;dth_ID, idesc);&lt;br /&gt;
&lt;br /&gt;
	    /* Display the information */&lt;br /&gt;
	    IDOS-&amp;gt;Printf (&amp;quot;   Description: %s\n&amp;quot;, dth-&amp;gt;dth_Name);&lt;br /&gt;
	    IDOS-&amp;gt;Printf (&amp;quot;     Base Name: %s\n&amp;quot;, dth-&amp;gt;dth_BaseName);&lt;br /&gt;
	    IDOS-&amp;gt;Printf (&amp;quot;          Type: %d - %s\n&amp;quot;, ttype, tdesc);&lt;br /&gt;
	    IDOS-&amp;gt;Printf (&amp;quot;         Group: %s\n&amp;quot;, gdesc);&lt;br /&gt;
	    IDOS-&amp;gt;Printf (&amp;quot;            ID: %s\n&amp;quot;, idesc);&lt;br /&gt;
&lt;br /&gt;
	    /* Release the DataType structure now that we are done with it */&lt;br /&gt;
	    IDataTypes-&amp;gt;ReleaseDataType (dtn);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Release the DOS lock on the file */&lt;br /&gt;
	IDOS-&amp;gt;UnLock (lock);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= A Picture Class Example =&lt;br /&gt;
&lt;br /&gt;
Here is a second, more complex example showing how to use all the DataTypes Library functions described so far. In this example the objects used are of class ILBM, a subclass of the Picture DataType.&lt;br /&gt;
&lt;br /&gt;
Two methods will be performed with the object, DTM_PROCLAYOUT and DTM_FRAMEBOX. Both these methods have associated structures (gpLayout and dtFrameBox respectively). DTM_PROCLAYOUT makes the object available within the context of your application task (as opposed to Intuition&#039;s). DTM_FRAMEBOX queries the display environment required by the picture.&lt;br /&gt;
&lt;br /&gt;
Other attributes of the picture are obtained with a call to GetDTAttrs() and then a matching Intuition screen is created and the ILBM object is displayed. This example expects the file and path name of a picture file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/* Run from CLI only.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;exec/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;datatypes/datatypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;datatypes/pictureclass.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;proto/exec.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/dos.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/intuition.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/datatypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;proto/graphics.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct IntuitionIFace *IIntuition = NULL;&lt;br /&gt;
struct GraphicsIFace *IGraphics = NULL;&lt;br /&gt;
struct DataTypesIFace *IDataTypes = NULL;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
  APTR dtobject=NULL;                   /* Pointer to a DataTypes object       */&lt;br /&gt;
  uint32 res;                           /* Variable for function return values */&lt;br /&gt;
  struct dtFrameBox mydtFrameBox;       /* Use this with DTM_FRAMEBOX method   */&lt;br /&gt;
  struct FrameInfo myFrameInfo;         /* For info returned from DTM_FRAMEBOX */&lt;br /&gt;
  struct gpLayout mygpLayout;           /* Use this with DTM_PROCLAYOUT method */&lt;br /&gt;
&lt;br /&gt;
  uint32 modeID = INVALID_ID;           /* Variables for storing the display */&lt;br /&gt;
  struct Screen *myScreen=NULL;         /* environment information obtained  */&lt;br /&gt;
  struct BitMap *bm = NULL;             /* the DataType object.              */&lt;br /&gt;
  uint32 *cregs = NULL;&lt;br /&gt;
  uint32 i,r,g,b,numcolors;&lt;br /&gt;
&lt;br /&gt;
  struct Library *IntuitionBase = IExec-&amp;gt;OpenLibrary(&amp;quot;intuition.library&amp;quot;, 50);&lt;br /&gt;
  struct Library *GfxBase = IExec-&amp;gt;OpenLibrary(&amp;quot;graphics.library&amp;quot;, 50);&lt;br /&gt;
  struct Library *DataTypesBase = IExec-&amp;gt;OpenLibrary(&amp;quot;datatypes.library&amp;quot;, 50);&lt;br /&gt;
&lt;br /&gt;
  IIntuition = (struct IntuitionIFace*)IExec-&amp;gt;GetInterface(IntuitionBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
  IGraphics = (struct GraphicsIFace*)IExec-&amp;gt;GetInterface(GfxBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
  IDataTypes = (struct DataTypesIFace*)IExec-&amp;gt;GetInterface(DataTypesBase, &amp;quot;main&amp;quot;, 1, NULL);&lt;br /&gt;
&lt;br /&gt;
  if (IIntuition != NULL)&lt;br /&gt;
  {&lt;br /&gt;
    if (IGraphics != NULL)&lt;br /&gt;
    {&lt;br /&gt;
      if (IDataTypes != NULL)&lt;br /&gt;
      {&lt;br /&gt;
        if(argc &amp;gt; 1 ) /* CLI only, at least one argument please.  */&lt;br /&gt;
        {&lt;br /&gt;
            /* Attempt to create a picture object in memory from the file    */&lt;br /&gt;
            /* name given by the user in the command line.  If we wanted to  */&lt;br /&gt;
            /* show the picture in a screen set up ahead of time, we could   */&lt;br /&gt;
            /* set PDTA_Remap to TRUE and provide a pointer to the screen    */&lt;br /&gt;
            /* with the PDTA_Screen tag (datatypes.library handles the rest).*/&lt;br /&gt;
            /* However in this case we want to first find out the attributes */&lt;br /&gt;
            /* of the picture object and set up a matching screen and do the */&lt;br /&gt;
            /* remapping later.  Therefore PDTA_Remap is set to false.       */&lt;br /&gt;
            /* The group ID tag ensures that we get only a picture file type.*/&lt;br /&gt;
            if (dtobject = IDataTypes-&amp;gt;NewDTObject(argv[1], PDTA_Remap,  FALSE,&lt;br /&gt;
                                                DTA_GroupID, GID_PICTURE,&lt;br /&gt;
                                                TAG_END) )&lt;br /&gt;
            {&lt;br /&gt;
                /* Here we want to find the display environment required by  */&lt;br /&gt;
                /* this picture.  To do that, perform the DTM_FRAMEBOX method */&lt;br /&gt;
                /* on the object.  The DataTypes Library fills in the struct */&lt;br /&gt;
                /* FrameBox you give it with the info on the display needed.  */&lt;br /&gt;
                mydtFrameBox.MethodID         = DTM_FRAMEBOX;&lt;br /&gt;
                mydtFrameBox.dtf_GInfo        = NULL;&lt;br /&gt;
                mydtFrameBox.dtf_ContentsInfo = NULL;&lt;br /&gt;
                mydtFrameBox.dtf_FrameInfo    = &amp;amp;myFrameInfo;&lt;br /&gt;
                mydtFrameBox.dtf_SizeFrameInfo= sizeof (struct FrameInfo);&lt;br /&gt;
                mydtFrameBox.dtf_FrameFlags   = 0L;&lt;br /&gt;
&lt;br /&gt;
                /* The return value from DTM_FRAMEBOX is currently undefined */&lt;br /&gt;
                res = IIntuition-&amp;gt;IDoMethodA(dtobject, &amp;amp;mydtFrameBox);&lt;br /&gt;
&lt;br /&gt;
                /* OK, now do the layout (remap) of the object on our process */&lt;br /&gt;
                mygpLayout.MethodID   = DTM_PROCLAYOUT;&lt;br /&gt;
                mygpLayout.gpl_GInfo  = NULL;&lt;br /&gt;
                mygpLayout.gpl_Initial= 1L;&lt;br /&gt;
&lt;br /&gt;
                /* The return value of DTM_PROCLAYOUT is non-zero for success */&lt;br /&gt;
                if( res = IIntuition-&amp;gt;IDoMethodA(dtobject, &amp;amp;mygpLayout) )&lt;br /&gt;
                {&lt;br /&gt;
                   /* Get the attributes of this picture object.  You could  */&lt;br /&gt;
                   /* use a series of GetAttr() function calls here instead.  */&lt;br /&gt;
                   res = IDataTypes-&amp;gt;GetDTAttrs(dtobject, PDTA_ModeID, &amp;amp;modeID,&lt;br /&gt;
                                              PDTA_CRegs, &amp;amp;cregs,&lt;br /&gt;
                                              PDTA_BitMap, &amp;amp;bm,&lt;br /&gt;
                                              TAG_END);&lt;br /&gt;
&lt;br /&gt;
                   /* Did we get all threee attributes? */&lt;br /&gt;
                   if( (modeID!=INVALID_ID) &amp;amp;&amp;amp; (cregs) &amp;amp;&amp;amp; (bm) )&lt;br /&gt;
                   {&lt;br /&gt;
                       /* Open a screen that matches the picture object */&lt;br /&gt;
                       if( myScreen = IIntuition-&amp;gt;OpenScreenTags( NULL,&lt;br /&gt;
                           SA_Width,     myFrameInfo.fri_Dimensions.Width,&lt;br /&gt;
                           SA_Height,    myFrameInfo.fri_Dimensions.Height,&lt;br /&gt;
                           SA_Depth,     myFrameInfo.fri_Dimensions.Depth,&lt;br /&gt;
                           SA_DisplayID, modeID,&lt;br /&gt;
                           SA_BitMap,    bm,&lt;br /&gt;
                           TAG_END) )&lt;br /&gt;
                       {&lt;br /&gt;
                           /* Now fill in the color registers for this screen */&lt;br /&gt;
                           numcolors = 2&amp;lt;&amp;lt;(myFrameInfo.fri_Dimensions.Depth-1);&lt;br /&gt;
                           for( i=0; i &amp;lt; numcolors; i++ )&lt;br /&gt;
                           {&lt;br /&gt;
                              r = cregs[i * 3 + 0];&lt;br /&gt;
                              g = cregs[i * 3 + 1];&lt;br /&gt;
                              b = cregs[i * 3 + 2];&lt;br /&gt;
                              IGraphics-&amp;gt;SetRGB32(&amp;amp;myScreen-&amp;gt;ViewPort, i, r, g, b);&lt;br /&gt;
                           }&lt;br /&gt;
&lt;br /&gt;
                           IDOS-&amp;gt;Printf(&amp;quot;Ctrl-C in this window to quit\n&amp;quot;);&lt;br /&gt;
                           /* Wait for the user to have a look...  */&lt;br /&gt;
                           IExec-&amp;gt;Wait(SIGBREAKF_CTRL_C);&lt;br /&gt;
&lt;br /&gt;
                           IIntuition-&amp;gt;CloseScreen(myScreen);&lt;br /&gt;
                       }&lt;br /&gt;
                       else IDOS-&amp;gt;Printf(&amp;quot;Couldn&#039;t open required screen\n&amp;quot;);&lt;br /&gt;
                   }&lt;br /&gt;
                   else IDOS-&amp;gt;Printf(&amp;quot;Couldn&#039;t get picture attributes\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                   IDataTypes-&amp;gt;DisposeDTObject(dtobject);&lt;br /&gt;
                }&lt;br /&gt;
                else IDOS-&amp;gt;Printf(&amp;quot;Couldn&#039;t perform PROC_LAYOUT\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else IDOS-&amp;gt;Printf(&amp;quot;Couldn&#039;t create new object or not a picture file\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else IDOS-&amp;gt;Printf(&amp;quot;Give a file name too.\n&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      else IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t open DataTypes Library\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t open Graphics Library\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else IDOS-&amp;gt;Printf(&amp;quot;Can&#039;t open Intuition Library\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  IExec-&amp;gt;DropInterface((struct Interface*)IDataTypes);&lt;br /&gt;
  IExec-&amp;gt;DropInterface((struct Interface*)IGraphics);&lt;br /&gt;
  IExec-&amp;gt;DropInterface((struct Interface*)IIntuition);&lt;br /&gt;
&lt;br /&gt;
  IExec-&amp;gt;CloseLibrary(DataTypesBase);&lt;br /&gt;
  IExec-&amp;gt;CloseLibrary(GfxBase);&lt;br /&gt;
  IExec-&amp;gt;CloseLibrary(IntuitionBase);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As with 8SVX objects, the DataTypes Library allows ILBM objects to be treated as gadgets. Remember that all DataTypes are a subclass of the BOOPSI &#039;&#039;gadgetclass&#039;&#039; and therefore support the gadget methods described in [[BOOPSI Gadgets]].&lt;/div&gt;</summary>
		<author><name>Steven Solie</name></author>
	</entry>
</feed>