(c)  Copyright 1989 Commodore-Amiga, Inc.   All rights reserved.
The information contained herein is subject to change without notice, and 
is provided "as is" without warranty of any kind, either expressed or implied.  
The entire risk as to the use of this information is assumed by the user.



                     Using Byte-Wide Autoboot ROMs
                         Under Amiga OS V1.3

                           by Steve Beats


With V1.3 of the Amiga operating system, an expansion board can autoboot 
the Amiga if it has autoboot ROMs.  Autoboot ROMs can be configured in 
one of three ways - word-wide, byte-wide or nybble-wide - however, ROMs 
configured as byte-wide will NOT function correctly. 

This is due to a bug in the expansion library that causes memory corruption
while copying the DiagArea to RAM from the expansion ROM.  Specifically, 
an RTS instruction was omitted which allows the code to drop through to the 
nybble-wide copy routine after the byte-wide copy has completed.  Because of 
this, system lists that have been established prior to the expansion 
initialization are overwritten.

There is a work-around which you can implement for this problem.  Instead of 
marking your ROM as DAC_BYTEWIDE, set the da_Config field to DAC_NYBBLEWIDE.  
Burn the ROM such that the DiagArea structure, Resident structure and the 
initialization code are stored in nybbles at the beginning of the ROM.  The 
remainder of the code should follow this information and can be stored in 
the normal byte-wide format (ie. just burn the code "as is").

The code that is normally used to relocate the Resident structure will now 
be required to copy the rest of the code from the ROM into an appropriately 
allocated area of memory.  Of course, Resident will still have to be 
relocated in the normal manner, but the pointers will be adjusted to point at 
the RAM copy of your driver.  The following figure should clarify this point.
It represents a block diagram of how a byte-wide expansion ROM should be
burned.


+---------------------------------+	The first three blocks should be
|				  |	burned such that the data is only
|     DiagArea marking the ROM    |	stored in the UPPER nybble of each
|     as being DAC_NYBBLEWIDE     |	BYTE in the ROM.  This will appear
|				  |	in the Amiga memory space as data
+---------------------------------+	in the UPPER nybble of consecutive
|				  |	WORD addresses.  Note: all addresses
|  DiagArea initialization code   |	will be relative to the boards base
|  to allocate memory, copy ROM   |	address.
|  code into it and relocate all  |
|  absolute references in the     |
|  Resident structure.            |
+---------------------------------+
|				  |
|  Resident structure describing  |
|  device name and location of    |
|  the initialization code.       |
|				  |
+---------------------------------+	The rest of the code can be burned
|				  |	straight into the ROM.  This data
.   The rest of the driver code	  .	will appear in the memory map as
.				  .	the upper BYTE of consecutive WORD
.				  .	addresses.  The ROM copy code should
|				  |	take this into account.
+---------------------------------+


This bug has already been fixed for 1.4 ROMs but your code will function in
exactly the same manner on both 1.3 and 1.4 systems in the future if you use
this method.


