]> git.sesse.net Git - pistorm/blob - platforms/amiga/piscsi/device_driver_amiga/bootrom.s
10ffdd43392c6164e6a4978f38c3767080dd96fb
[pistorm] / platforms / amiga / piscsi / device_driver_amiga / bootrom.s
1 **
2 ** Sample autoboot code fragment
3 **
4 ** These are the calling conventions for the Diag routine
5 **
6 ** A7 -- points to at least 2K of stack
7 ** A6 -- ExecBase
8 ** A5 -- ExpansionBase
9 ** A3 -- your board's ConfigDev structure
10 ** A2 -- Base of diag/init area that was copied
11 ** A0 -- Base of your board
12 **
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.
16 **
17
18     INCLUDE "exec/types.i"
19     INCLUDE "exec/nodes.i"
20     INCLUDE "exec/resident.i"
21     INCLUDE "libraries/configvars.i"
22
23     ; LVO's resolved by linking with library amiga.lib
24     XREF   _LVOFindResident
25
26 ROMINFO     EQU      0
27 ROMOFFS     EQU     $4000
28
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)
32 *
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.
41
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
45
46 * See the Addison-Wesley Amiga Hardware Manual for more info.
47
48 MANUF_ID        EQU     2011            ; CBM assigned (2011 for hackers only)
49 PRODUCT_ID      EQU     1               ; Manufacturer picks product ID
50
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)
57             CODE
58
59 AllocMem    EQU -198
60
61 *******  RomStart  ***************************************************
62 **********************************************************************
63
64 RomStart:
65
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
72             dc.b    0                              ; da_Flags
73             dc.w    $4000              ; da_Size
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
79
80 *******  Resident Structure  *****************************************
81 Romtag:
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
88             dc.b    20                 ; BYTE  RT_PRI
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
92
93
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
97
98 DosName:    dc.b    'dos.library',0                ; DOS library name
99
100 DosDevName: dc.b    'ABC',0        ; dos device name for MakeDosNode()
101                                    ;   (dos device will be ABC:)
102
103             ds.w    0              ; word align
104
105 *******  DiagEntry  **************************************************
106 **********************************************************************
107 *
108 *   success = DiagEntry(BoardBase,DiagCopy, configDev)
109 *   d0                  a0         a2                  a3
110 *
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.
116 *
117 **********************************************************************
118
119 DiagEntry:
120             nop
121             nop
122             nop
123             move.l  #1,$80000020
124             nop
125             nop
126             nop
127             nop
128             nop
129             nop
130
131             lea      patchTable-RomStart(a0),a1   ; find patch table
132             adda.l   #ROMOFFS,a1                  ; adjusting for ROMOFFS
133
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.
137 *
138 dpatches:
139             move.l   a2,d1           ;d1=base of ram Diag copy
140 dloop:
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
144             bra.s    dloop
145
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.
149 *
150 bpatches:
151             move.l   a0,d1           ;d1 = board base address
152             add.l    #ROMOFFS,d1     ;add offset to where your ROMs are
153 rloop:
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
157             bra.s   rloop
158
159 endpatches:
160             moveq.l #1,d0           ; indicate "success"
161             rts
162
163
164 *******  BootEntry  **************************************************
165 **********************************************************************
166
167 BootEntry:
168             move.l  #2,$80000020
169             nop
170             nop
171             nop
172             nop
173             nop
174
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
180             rts
181
182 *
183 * End of the Diag copy area which is copied to RAM
184 *
185 EndCopy:
186 *************************************************************************
187
188 *************************************************************************
189 *
190 *   Beginning of ROM driver code and data that is accessed only in
191 *   the ROM space.  This must all be position-independent.
192 *
193
194 patchTable:
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
199             dc.w   rt_Id-DiagStart
200             dc.w   -1
201
202 * Word offsets into Diag area where pointers need boardbase+ROMOFFS added
203             dc.w   rt_Init-DiagStart
204             dc.w   -1
205
206 *******  Romtag InitEntry  **********************************************
207 *************************************************************************
208
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.
215             ;
216             move.l  #3,$80000020
217             nop
218             nop
219             nop
220             nop
221
222             move.l  #4,$80000020
223             movea.l 4,a6
224             move.l #$40000,d0
225             moveq #0,d1
226             jsr AllocMem(a6)
227
228             move.l  d0,$80000040
229             nop
230             nop
231
232             move.l  d0,a1
233             move.l  #0,d1
234             movea.l  4,a6
235             add.l #$16e,a1
236             move.l  #5,$80000020
237             nop
238             nop
239             nop
240             jsr     -102(a6)
241             nop
242             nop
243
244             moveq.l #1,d0           ; indicate "success"
245
246             rts
247             END