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)
65 OpenResource EQU -$1F2
74 PiSCSIAddr1 EQU $80000010
75 PiSCSIAddr2 EQU $80000014
76 PiSCSIAddr3 EQU $80000018
77 PiSCSIAddr4 EQU $8000001C
78 PiSCSIDebugMe EQU $80000020
79 PiSCSIDriver EQU $80000040
80 PiSCSINextPart EQU $80000044
81 PiSCSIGetPart EQU $80000048
82 PiSCSIGetPrio EQU $8000004C
83 PiSCSIGetFS EQU $80000060
84 PiSCSINextFS EQU $80000064
85 PiSCSICopyFS EQU $80000068
86 PiSCSIFSSize EQU $8000006C
87 PiSCSISetFSH EQU $80000070
88 PiSCSIDbg1 EQU $80001010
89 PiSCSIDbg2 EQU $80001014
90 PiSCSIDbg3 EQU $80001018
91 PiSCSIDbg4 EQU $8000101C
92 PiSCSIDbg5 EQU $80001020
93 PiSCSIDbg6 EQU $80001024
94 PiSCSIDbg7 EQU $80001028
95 PiSCSIDbg8 EQU $8000102C
96 PiSCSIDbgMsg EQU $80001000
98 ******* RomStart ***************************************************
99 **********************************************************************
103 ******* DiagStart **************************************************
104 DiagStart: ; This is the DiagArea structure whose relative offset from
105 ; your board base appears as the Init Diag vector in your
106 ; autoconfig ID information. This structure is designed
107 ; to use all relative pointers (no patching needed).
108 dc.b DAC_WORDWIDE+DAC_CONFIGTIME ; da_Config
111 dc.w DiagEntry-DiagStart ; da_DiagPoint
112 dc.w BootEntry-DiagStart ; da_BootPoint
113 dc.w DevName-DiagStart ; da_Name
114 dc.w 0 ; da_Reserved01
115 dc.w 0 ; da_Reserved02
117 ******* Resident Structure *****************************************
119 dc.w RTC_MATCHWORD ; UWORD RT_MATCHWORD
120 rt_Match: dc.l Romtag-DiagStart ; APTR RT_MATCHTAG
121 rt_End: dc.l EndCopy-DiagStart ; APTR RT_ENDSKIP
122 dc.b RTW_COLDSTART ; UBYTE RT_FLAGS
123 dc.b VERSION ; UBYTE RT_VERSION
124 dc.b NT_DEVICE ; UBYTE RT_TYPE
125 dc.b 20 ; BYTE RT_PRI
126 rt_Name: dc.l DevName-DiagStart ; APTR RT_NAME
127 rt_Id: dc.l IdString-DiagStart ; APTR RT_IDSTRING
128 rt_Init: dc.l Init-RomStart ; APTR RT_INIT
131 ******* Strings referenced in Diag Copy area ************************
132 DevName: dc.b 'pi-scsi.device',0,0 ; Name string
133 IdString dc.b 'PISCSI v0.8',0 ; Id string
135 DosName: dc.b 'dos.library',0 ; DOS library name
136 ExpansionName: dc.b "expansion.library",0
137 LibName: dc.b "pi-scsi.device",0,0
139 DosDevName: dc.b 'ABC',0 ; dos device name for MakeDosNode()
140 ; (dos device will be ABC:)
144 ******* DiagEntry **************************************************
145 **********************************************************************
147 * success = DiagEntry(BoardBase,DiagCopy, configDev)
150 * Called by expansion architecture to relocate any pointers
151 * in the copied diagnostic area. We will patch the romtag.
152 * If you have pre-coded your MakeDosNode packet, BootNode,
153 * or device initialization structures, they would also need
154 * to be within this copy area, and patched by this routine.
156 **********************************************************************
163 move.l #1,PiSCSIDebugMe
164 move.l a3,PiSCSIAddr1
172 lea patchTable-RomStart(a0),a1 ; find patch table
173 adda.l #ROMOFFS,a1 ; adjusting for ROMOFFS
175 * Patch relative pointers to labels within DiagCopy area
176 * by adding Diag RAM copy address. These pointers were coded as
177 * long relative offsets from base of the DiagArea structure.
180 move.l a2,d1 ;d1=base of ram Diag copy
182 move.w (a1)+,d0 ;d0=word offs. into Diag needing patch
183 bmi.s bpatches ;-1 is end of word patch offset table
184 add.l d1,0(a2,d0.w) ;add DiagCopy addr to coded rel. offset
187 * Patches relative pointers to labels within the ROM by adding
188 * the board base address + ROMOFFS. These pointers were coded as
189 * long relative offsets from RomStart.
192 move.l a0,d1 ;d1 = board base address
193 add.l #ROMOFFS,d1 ;add offset to where your ROMs are
195 move.w (a1)+,d0 ;d0=word offs. into Diag needing patch
196 bmi.s endpatches ;-1 is end of patch offset table
197 add.l d1,0(a2,d0.w) ;add ROM address to coded relative offset
201 moveq.l #1,d0 ; indicate "success"
205 ******* BootEntry **************************************************
206 **********************************************************************
210 move.l #2,PiSCSIDebugMe
217 lea DosName(PC),a1 ; 'dos.library',0
218 jsr FindResident(a6) ; find the DOS resident tag
219 move.l d0,a0 ; in order to bootstrap
220 move.l RT_INIT(A0),a0 ; set vector to DOS INIT
221 jsr (a0) ; and initialize DOS
225 * End of the Diag copy area which is copied to RAM
228 *************************************************************************
230 *************************************************************************
232 * Beginning of ROM driver code and data that is accessed only in
233 * the ROM space. This must all be position-independent.
237 * Word offsets into Diag area where pointers need Diag copy address added
238 dc.w rt_Match-DiagStart
239 dc.w rt_End-DiagStart
240 dc.w rt_Name-DiagStart
244 * Word offsets into Diag area where pointers need boardbase+ROMOFFS added
245 dc.w rt_Init-DiagStart
248 ******* Romtag InitEntry **********************************************
249 *************************************************************************
251 Init: ; After Diag patching, our romtag will point to this
252 ; routine in ROM so that it can be called at Resident
253 ; initialization time.
254 ; This routine will be similar to a normal expansion device
255 ; initialization routine, but will MakeDosNode then set up a
256 ; BootNode, and Enqueue() on eb_MountList.
259 move.l a6,-(a7) ; Push A6 to stack
260 move.w #$00B8,$dff09a ; Disable interrupts during init
261 move.l #3,PiSCSIDebugMe
263 move.l #11,PiSCSIDebugMe
267 move.l #10,PiSCSIDebugMe
269 bne.s SkipDriverLoad ; Library is already loaded, jump straight to partitions
271 move.l #4,PiSCSIDebugMe
275 jsr AllocMem(a6) ; Allocate memory for the PiStorm to copy the driver to
277 move.l d0,PiSCSIDriver ; Copy the PiSCSI driver to allocated memory and patch offsets
279 move.l #5,PiSCSIDebugMe
284 jsr InitResident(a6) ; Initialize the PiSCSI driver
287 move.l #9,PiSCSIDebugMe
288 bra.w LoadFileSystems
291 lea ExpansionName(pc),a1
293 jsr OpenLibrary(a6) ; Open expansion.library to make this work, somehow
296 move.l #7,PiSCSIDebugMe
298 move.l PiSCSIGetPart,d0 ; Get the available partition in the current slot
299 beq.s EndPartitions ; If the next partition returns 0, there's no additional partitions
302 move.l d0,PiSCSISetFSH
304 move.l PiSCSIGetPrio,d0
306 move.l PiSCSIAddr1,a1
308 move.l #1,PiSCSINextPart ; Switch to the next partition
313 move.l #8,PiSCSIDebugMe
315 move.l #800,PiSCSIDebugMe
317 move.l #801,PiSCSIDebugMe
319 move.l #802,PiSCSIDebugMe
321 move.l (a7)+,a6 ; Pop A6 from stack
322 move.l #803,PiSCSIDebugMe
324 move.w #$80B8,$dff09a ; Re-enable interrupts
325 move.l #804,PiSCSIDebugMe
326 moveq.l #1,d0 ; indicate "success"
327 move.l #805,PiSCSIDebugMe
331 FileSysName dc.b 'FileSystem.resource',0
332 FileSysCreator dc.b 'PiStorm',0
339 movem.l d0-d7/a0-a6,-(sp) ; Push registers to stack
340 move.l #30,PiSCSIDebugMe
341 lea FileSysName(pc),a1
346 move.l #33,PiSCSIDebugMe ; FileSystem.resource isn't open, create it
354 move.l d0,PiSCSIAddr2 ; PiSCSIAddr2 is now FileSystem.resource
355 move.l #31,PiSCSIDebugMe
356 move.l PiSCSIAddr2,a0
357 move.l PiSCSIGetFS,d0
363 move.l #45,PiSCSIDebugMe
364 lea fsr_FileSysEntries(a0),a0
366 move.l LH_HEAD(a0),d0
370 move.l #34,PiSCSIDebugMe
372 move.l #35,PiSCSIDebugMe
373 cmp.l fse_DosType(a1),d7
374 move.l #36,PiSCSIDebugMe
376 move.l #37,PiSCSIDebugMe
377 move.l LN_SUCC(a1),d0
379 move.l #390,PiSCSIDebugMe
384 move.l #39,PiSCSIDebugMe
385 move.l PiSCSIFSSize,d0
386 move.l #40,PiSCSIDebugMe
388 move.l #41,PiSCSIDebugMe
390 move.l d0,PiSCSIAddr3
391 move.l #1,PiSCSICopyFS
394 move.l #480,PiSCSIDebugMe
395 move.l PiSCSIAddr2,a0
396 move.l #1,PiSCSINextFS
397 move.l PiSCSIGetFS,d0
402 FSDone: move.l #37,PiSCSIDebugMe
403 move.l #32,PiSCSIDebugMe ; Couldn't open FileSystem.resource, Kick 1.2/1.3?
405 movem.l (sp)+,d0-d7/a0-a6 ; Pop registers from stack