A library or device with a romtag should start with MOVEQ #-1,D0 (to safely return an error if a user tries to execute the file), followed by a Resident structure: STRUCTURE RT,0 UWORD RT_MATCHWORD * romtag identifier (==$4AFC) APTR RT_MATCHTAG * pointer to the above UWORD (RT_MATCHWORD) APTR RT_ENDSKIP * usually ptr to end of your code UBYTE RT_FLAGS * usually RTF_AUTOINIT UBYTE RT_VERSION * release version number (for example: 37) UBYTE RT_TYPE * type of module (NT_LIBRARY) BYTE RT_PRI * initialization priority (for example: 0) APTR RT_NAME * pointer to node name ("my.library") APTR RT_IDSTRING * pointer to id string ("name ver.rev (date)") APTR RT_INIT * pointer to init code or AUTOINIT tables LABEL RT_SIZE * size of a Resident structure (romtag) If you wish to perform MakeLibrary() and AddLibrary() yourself, then your RT_FLAGS will not include RTF_AUTOINIT, and RT_INIT will be simply be a pointer to your own initialization code. To have Exec automatically load and initialize the library, set the RTF_AUTOINIT flag in the Resident structure's RT_FLAGS field, and point RT_INIT to a set four longwords containing the following: dataSize This is the size of your library data area, i.e., the combined size of the standard Library node structure plus your own library-specific data. vectors This is a pointer to a table of pointers to your library's functions, terminated with a -1. If the first word of the table is -1, then the table is interpreted as a table of words specifying the relative displacement of each function entry point from the start of the table. Otherwise it is treated as a table of longword address pointers to the functions. vectors must specify a valid table address. structure This parameter points to the base of an InitStruct() data region. That is, it points to the first location within a table that the InitStruct() routine can use to initialize your Library node structure, library-specific data, and other memory areas. InitStruct() will typically be used to initialize the data segment of the library, perhaps forming data tables, task control blocks, I/O control blocks, etc. If this entry is a 0, then InitStruct() is not called. initFunction This points to a routine that is to be executed after the library (or device) node has been allocated and the code and data areas have been initialized. When the routine is called, the base address of the newly created library is passed in D0. If initFunction is zero, no initialization routine is called. Complete source code for an RT_AUTOINIT library may be found in the appendix C of this book.