2 ** Sample autoboot code fragment
4 ** These are the calling conventions for the Diag routine
6 ** A7 -- points to at least 2K of stack
9 ** A3 -- your board's ConfigDev structure
10 ** A2 -- Base of diag/init area that was copied
11 ** A0 -- Base of your board
13 ** Your Diag routine should return a non-zero value in D0 for success.
14 ** If this value is NULL, then the diag/init area that was copied
15 ** will be returned to the free memory pool.
18 INCLUDE "exec/types.i"
19 INCLUDE "exec/nodes.i"
20 INCLUDE "exec/resident.i"
21 INCLUDE "libraries/configvars.i"
23 ; LVO's resolved by linking with library amiga.lib
29 * ROMINFO defines whether you want the AUTOCONFIG information in
30 * the beginning of your ROM (set to 0 if you instead have PALS
31 * providing the AUTOCONFIG information instead)
33 * ROMOFFS is the offset from your board base where your ROMs appear.
34 * Your ROMs might appear at offset 0 and contain your AUTOCONFIG
35 * information in the high nibbles of the first $40 words ($80 bytes).
36 * Or, your autoconfig ID information may be in a PAL, with your
37 * ROMs possibly being addressed at some offset (for example $2000)
38 * from your board base. This ROMOFFS constant will be used as an
39 * additional offset from your configured board address when patching
40 * structures which require absolute pointers to ROM code or data.
42 *----- We'll store Version and Revision in serial number
43 VERSION EQU 37 ; also the high word of serial number
44 REVISION EQU 1 ; also the low word of serial number
46 * See the Addison-Wesley Amiga Hardware Manual for more info.
48 MANUF_ID EQU 2011 ; CBM assigned (2011 for hackers only)
49 PRODUCT_ID EQU 1 ; Manufacturer picks product ID
51 BOARDSIZE EQU $10000 ; How much address space board decodes
52 SIZE_FLAG EQU 3 ; Autoconfig 3-bit flag for BOARDSIZE
53 ; 0=$800000(8meg) 4=$80000(512K)
54 ; 1=$10000(64K) 5=$100000(1meg)
55 ; 2=$20000(128K) 6=$200000(2meg)
56 ; 3=$40000(256K) 7=$400000(4meg)
61 ******* RomStart ***************************************************
62 **********************************************************************
66 ******* DiagStart **************************************************
67 DiagStart: ; This is the DiagArea structure whose relative offset from
68 ; your board base appears as the Init Diag vector in your
69 ; autoconfig ID information. This structure is designed
70 ; to use all relative pointers (no patching needed).
71 dc.b DAC_WORDWIDE+DAC_CONFIGTIME ; da_Config
74 dc.w DiagEntry-DiagStart ; da_DiagPoint
75 dc.w BootEntry-DiagStart ; da_BootPoint
76 dc.w DevName-DiagStart ; da_Name
77 dc.w 0 ; da_Reserved01
78 dc.w 0 ; da_Reserved02
80 ******* Resident Structure *****************************************
82 dc.w RTC_MATCHWORD ; UWORD RT_MATCHWORD
83 rt_Match: dc.l Romtag-DiagStart ; APTR RT_MATCHTAG
84 rt_End: dc.l EndCopy-DiagStart ; APTR RT_ENDSKIP
85 dc.b RTW_COLDSTART ; UBYTE RT_FLAGS
86 dc.b VERSION ; UBYTE RT_VERSION
87 dc.b NT_DEVICE ; UBYTE RT_TYPE
89 rt_Name: dc.l DevName-DiagStart ; APTR RT_NAME
90 rt_Id: dc.l IdString-DiagStart ; APTR RT_IDSTRING
91 rt_Init: dc.l Init-RomStart ; APTR RT_INIT
94 ******* Strings referenced in Diag Copy area ************************
95 DevName: dc.b 'PiSCSI Snake Controller',0 ; Name string
96 IdString dc.b 'PISCSI v0.1',0 ; Id string
98 DosName: dc.b 'dos.library',0 ; DOS library name
100 DosDevName: dc.b 'ABC',0 ; dos device name for MakeDosNode()
101 ; (dos device will be ABC:)
105 ******* DiagEntry **************************************************
106 **********************************************************************
108 * success = DiagEntry(BoardBase,DiagCopy, configDev)
111 * Called by expansion architecture to relocate any pointers
112 * in the copied diagnostic area. We will patch the romtag.
113 * If you have pre-coded your MakeDosNode packet, BootNode,
114 * or device initialization structures, they would also need
115 * to be within this copy area, and patched by this routine.
117 **********************************************************************
131 lea patchTable-RomStart(a0),a1 ; find patch table
132 adda.l #ROMOFFS,a1 ; adjusting for ROMOFFS
134 * Patch relative pointers to labels within DiagCopy area
135 * by adding Diag RAM copy address. These pointers were coded as
136 * long relative offsets from base of the DiagArea structure.
139 move.l a2,d1 ;d1=base of ram Diag copy
141 move.w (a1)+,d0 ;d0=word offs. into Diag needing patch
142 bmi.s bpatches ;-1 is end of word patch offset table
143 add.l d1,0(a2,d0.w) ;add DiagCopy addr to coded rel. offset
146 * Patches relative pointers to labels within the ROM by adding
147 * the board base address + ROMOFFS. These pointers were coded as
148 * long relative offsets from RomStart.
151 move.l a0,d1 ;d1 = board base address
152 add.l #ROMOFFS,d1 ;add offset to where your ROMs are
154 move.w (a1)+,d0 ;d0=word offs. into Diag needing patch
155 bmi.s endpatches ;-1 is end of patch offset table
156 add.l d1,0(a2,d0.w) ;add ROM address to coded relative offset
160 moveq.l #1,d0 ; indicate "success"
164 ******* BootEntry **************************************************
165 **********************************************************************
175 lea DosName(PC),a1 ; 'dos.library',0
176 jsr _LVOFindResident(a6) ; find the DOS resident tag
177 move.l d0,a0 ; in order to bootstrap
178 move.l RT_INIT(A0),a0 ; set vector to DOS INIT
179 jsr (a0) ; and initialize DOS
183 * End of the Diag copy area which is copied to RAM
186 *************************************************************************
188 *************************************************************************
190 * Beginning of ROM driver code and data that is accessed only in
191 * the ROM space. This must all be position-independent.
195 * Word offsets into Diag area where pointers need Diag copy address added
196 dc.w rt_Match-DiagStart
197 dc.w rt_End-DiagStart
198 dc.w rt_Name-DiagStart
202 * Word offsets into Diag area where pointers need boardbase+ROMOFFS added
203 dc.w rt_Init-DiagStart
206 ******* Romtag InitEntry **********************************************
207 *************************************************************************
209 Init: ; After Diag patching, our romtag will point to this
210 ; routine in ROM so that it can be called at Resident
211 ; initialization time.
212 ; This routine will be similar to a normal expansion device
213 ; initialization routine, but will MakeDosNode then set up a
214 ; BootNode, and Enqueue() on eb_MountList.
244 moveq.l #1,d0 ; indicate "success"