diff options
Diffstat (limited to 'firmware/target/coldfire/mpio/ata-as-mpio.S')
-rw-r--r-- | firmware/target/coldfire/mpio/ata-as-mpio.S | 749 |
1 files changed, 0 insertions, 749 deletions
diff --git a/firmware/target/coldfire/mpio/ata-as-mpio.S b/firmware/target/coldfire/mpio/ata-as-mpio.S deleted file mode 100644 index 63bda5ee19..0000000000 --- a/firmware/target/coldfire/mpio/ata-as-mpio.S +++ /dev/null | |||
@@ -1,749 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id: ata-as-coldfire.S 17847 2008-06-28 18:10:04Z bagder $ | ||
9 | * | ||
10 | * Copyright (C) 2006 by Jens Arnold | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | .section .icode,"ax",@progbits | ||
23 | |||
24 | .equ .ata_port, 0x20000020 | ||
25 | .equ .swapmask, 0x00FF00FF | ||
26 | |||
27 | .align 2 | ||
28 | .global copy_read_sectors | ||
29 | .type copy_read_sectors,@function | ||
30 | |||
31 | /* Read a number of words from the ATA data port | ||
32 | * | ||
33 | * Utilises line bursts, assumes there is at least one full line to copy. | ||
34 | * | ||
35 | * Arguments: | ||
36 | * (4,%sp) - buffer address | ||
37 | * (8,%sp) - word count | ||
38 | * | ||
39 | * Register usage: | ||
40 | * %a0 - current address | ||
41 | * %a1 - end address | ||
42 | * %a2 - ata port | ||
43 | * %d0 - scratch | ||
44 | * %d1 - shift count | ||
45 | * %d2-%d6 - read buffers | ||
46 | * | ||
47 | * %d7 - byte swap scrach register | ||
48 | * %a3 - byte swap mask | ||
49 | */ | ||
50 | |||
51 | copy_read_sectors: | ||
52 | lea.l (-32, %sp), %sp | ||
53 | movem.l %d2-%d7/%a2-%a3, (%sp) | ||
54 | movem.l (36, %sp), %a0-%a1 | ||
55 | add.l %a1, %a1 | ||
56 | add.l %a0, %a1 | ||
57 | lea.l .ata_port, %a2 | ||
58 | lea.l .swapmask, %a3 | ||
59 | |||
60 | move.l %a0, %d0 | ||
61 | btst.l #0, %d0 /* 16-bit aligned? */ | ||
62 | jeq .r_aligned /* yes, do word copy */ | ||
63 | |||
64 | /* not 16-bit aligned */ | ||
65 | subq.l #1, %a1 /* last byte is done unconditionally */ | ||
66 | moveq.l #24, %d1 /* preload shift count */ | ||
67 | |||
68 | move.w (%a2), %d2 /* load initial word */ | ||
69 | move.b %d2, (%a0)+ /* write high byte of it, aligns dest addr */ | ||
70 | /* we have byte swapped */ | ||
71 | |||
72 | lsr.l #8, %d2 | ||
73 | btst.l #1, %d0 /* longword aligned? (testing old d0 value!) */ | ||
74 | bne.b .r_end_u_w1 /* yes, skip leading word handling */ | ||
75 | |||
76 | move.w (%a2), %d3 | ||
77 | move.l %d3, %d0 | ||
78 | lsl.l #8, %d2 | ||
79 | and.l #0xff, %d0 | ||
80 | or.l %d0, %d2 | ||
81 | |||
82 | move.w %d2, (%a0)+ /* write bytes 2 and 3 as word */ | ||
83 | move.l %d3, %d2 | ||
84 | lsr.l #8, %d2 | ||
85 | |||
86 | .r_end_u_w1: | ||
87 | moveq.l #12, %d0 | ||
88 | add.l %a0, %d0 | ||
89 | and.l #0xFFFFFFF0,%d0 /* d0 == first line bound */ | ||
90 | cmp.l %a0, %d0 /* any leading longwords? */ | ||
91 | bls.b .r_end_u_l1 /* no: skip loop */ | ||
92 | |||
93 | .r_loop_u_l1: | ||
94 | move.w (%a2), %d3 /* load first word */ | ||
95 | swap %d3 /* move to upper 16 bit */ | ||
96 | move.w (%a2), %d3 /* load second word */ | ||
97 | |||
98 | /* byte swap d3 */ | ||
99 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
100 | and.l %d3, %d7 /* d7 = .B.D */ | ||
101 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
102 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
103 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
104 | or.l %d7, %d3 /* d3 = BADC */ | ||
105 | |||
106 | move.l %d3, %d4 | ||
107 | |||
108 | lsl.l %d1, %d2 | ||
109 | lsr.l #8, %d3 | ||
110 | or.l %d3, %d2 /* combine old low byte with new top 3 bytes */ | ||
111 | move.l %d2, (%a0)+ /* store as long */ | ||
112 | move.l %d4, %d2 | ||
113 | cmp.l %a0, %d0 /* run up to first line bound */ | ||
114 | bhi.b .r_loop_u_l1 | ||
115 | |||
116 | .r_end_u_l1: | ||
117 | lea.l (-14, %a1), %a1 /* adjust end addr. to 16 bytes/pass */ | ||
118 | |||
119 | .r_loop_u_line: | ||
120 | move.w (%a2), %d3 /* load 1st word */ | ||
121 | swap %d3 /* move to upper 16 bit */ | ||
122 | move.w (%a2), %d3 /* load 2nd word */ | ||
123 | |||
124 | /* byte swap d3 */ | ||
125 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
126 | and.l %d3, %d7 /* d7 = .B.D */ | ||
127 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
128 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
129 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
130 | or.l %d7, %d3 /* d3 = BADC */ | ||
131 | |||
132 | move.l %d3, %d0 | ||
133 | |||
134 | lsl.l %d1, %d2 | ||
135 | lsr.l #8, %d0 | ||
136 | or.l %d0, %d2 /* combine old low byte with new top 3 bytes */ | ||
137 | move.w (%a2), %d4 /* load 3rd word */ | ||
138 | swap %d4 /* move to upper 16 bit */ | ||
139 | move.w (%a2), %d4 /* load 4th word */ | ||
140 | |||
141 | /* byte swap d4 */ | ||
142 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
143 | and.l %d4, %d7 /* d7 = .B.D */ | ||
144 | eor.l %d7, %d4 /* d4 = A.C. */ | ||
145 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
146 | lsr.l #8, %d4 /* d4 = .A.C */ | ||
147 | or.l %d7, %d4 /* d4 = BADC */ | ||
148 | |||
149 | move.l %d4, %d0 | ||
150 | lsl.l %d1, %d3 | ||
151 | lsr.l #8, %d0 | ||
152 | or.l %d0, %d3 /* combine old low byte with new top 3 bytes */ | ||
153 | move.w (%a2), %d5 /* load 5th word */ | ||
154 | swap %d5 /* move to upper 16 bit */ | ||
155 | move.w (%a2), %d5 /* load 6th word */ | ||
156 | |||
157 | /* byte swap d5 */ | ||
158 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
159 | and.l %d5, %d7 /* d7 = .B.D */ | ||
160 | eor.l %d7, %d5 /* d5 = A.C. */ | ||
161 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
162 | lsr.l #8, %d5 /* d5 = .A.C */ | ||
163 | or.l %d7, %d5 /* d5 = BADC */ | ||
164 | |||
165 | move.l %d5, %d0 | ||
166 | lsl.l %d1, %d4 | ||
167 | lsr.l #8, %d0 | ||
168 | or.l %d0, %d4 /* combine old low byte with new top 3 bytes */ | ||
169 | move.w (%a2), %d6 /* load 7th word */ | ||
170 | swap %d6 /* move to upper 16 bit */ | ||
171 | move.w (%a2), %d6 /* load 8th word */ | ||
172 | |||
173 | /* byte swap d6 */ | ||
174 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
175 | and.l %d6, %d7 /* d7 = .B.D */ | ||
176 | eor.l %d7, %d6 /* d6 = A.C. */ | ||
177 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
178 | lsr.l #8, %d6 /* d6 = .A.C */ | ||
179 | or.l %d7, %d6 /* d6 = BADC */ | ||
180 | |||
181 | move.l %d6, %d0 | ||
182 | lsl.l %d1, %d5 | ||
183 | lsr.l #8, %d0 | ||
184 | or.l %d0, %d5 /* combine old low byte with new top 3 bytes */ | ||
185 | movem.l %d2-%d5, (%a0) /* store line */ | ||
186 | lea.l (16, %a0), %a0 | ||
187 | move.l %d6, %d2 | ||
188 | cmp.l %a0, %a1 /* run up to last line bound */ | ||
189 | bhi.b .r_loop_u_line | ||
190 | |||
191 | lea.l (12, %a1), %a1 /* readjust for longword loop */ | ||
192 | cmp.l %a0, %a1 /* any trailing longwords? */ | ||
193 | bls.b .r_end_u_l2 /* no: skip loop */ | ||
194 | |||
195 | .r_loop_u_l2: | ||
196 | move.w (%a2), %d3 /* load first word */ | ||
197 | swap %d3 /* move to upper 16 bit */ | ||
198 | move.w (%a2), %d3 /* load second word */ | ||
199 | |||
200 | /* byte swap d3 */ | ||
201 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
202 | and.l %d3, %d7 /* d7 = .B.D */ | ||
203 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
204 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
205 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
206 | or.l %d7, %d3 /* d3 = BADC */ | ||
207 | |||
208 | move.l %d3, %d4 | ||
209 | lsl.l %d1, %d2 | ||
210 | lsr.l #8, %d3 | ||
211 | or.l %d3, %d2 /* combine old low byte with new top 3 bytes */ | ||
212 | move.l %d2, (%a0)+ /* store as long */ | ||
213 | move.l %d4, %d2 | ||
214 | cmp.l %a0, %a1 /* run up to last long bound */ | ||
215 | bhi.b .r_loop_u_l2 | ||
216 | |||
217 | .r_end_u_l2: | ||
218 | addq.l #2, %a1 /* back to final end address */ | ||
219 | cmp.l %a0, %a1 /* one word left? */ | ||
220 | bls.b .r_end_u_w2 | ||
221 | |||
222 | move.w (%a2), %d3 | ||
223 | move.l %d3, %d0 | ||
224 | lsl.l #8, %d2 | ||
225 | and.l #0xff, %d0 | ||
226 | or.l %d0, %d2 | ||
227 | |||
228 | move.w %d2, (%a0)+ /* write bytes 2 and 3 as word */ | ||
229 | |||
230 | move.l %d3, %d2 | ||
231 | lsr.l #8, %d2 | ||
232 | .r_end_u_w2: | ||
233 | move.b %d2, (%a0)+ /* store final byte */ | ||
234 | bra.w .r_exit | ||
235 | |||
236 | /* 16-bit aligned */ | ||
237 | .r_aligned: | ||
238 | btst.l #1, %d0 /* longword aligned? */ | ||
239 | beq.b .r_end_a_w1 /* yes, skip leading word handling */ | ||
240 | |||
241 | /* copy initial word */ | ||
242 | /* initial word has to be swapped */ | ||
243 | move.w (%a2), %d7 | ||
244 | move.b %d7, (%a0)+ | ||
245 | lsr.l #8, %d7 | ||
246 | move.b %d7, (%a0)+ | ||
247 | |||
248 | .r_end_a_w1: | ||
249 | moveq.l #12, %d0 | ||
250 | add.l %a0, %d0 | ||
251 | and.l #0xFFFFFFF0,%d0 /* d0 == first line bound */ | ||
252 | cmp.l %a0, %d0 /* any leading longwords? */ | ||
253 | bls.b .r_end_a_l1 /* no: skip loop */ | ||
254 | |||
255 | .r_loop_a_l1: | ||
256 | move.w (%a2), %d1 /* load first word */ | ||
257 | swap %d1 /* move it to upper 16 bits */ | ||
258 | move.w (%a2), %d1 /* load second word */ | ||
259 | |||
260 | /* byte swap d1 */ | ||
261 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
262 | and.l %d1, %d7 /* d7 = .B.D */ | ||
263 | eor.l %d7, %d1 /* d1 = A.C. */ | ||
264 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
265 | lsr.l #8, %d1 /* d1 = .A.C */ | ||
266 | or.l %d7, %d1 /* d1 = BADC */ | ||
267 | |||
268 | move.l %d1, (%a0)+ /* store as long */ | ||
269 | cmp.l %a0, %d0 /* run up to first line bound */ | ||
270 | bhi.b .r_loop_a_l1 | ||
271 | |||
272 | .r_end_a_l1: | ||
273 | lea.l (-14, %a1), %a1 /* adjust end addr. to 16 bytes/pass */ | ||
274 | |||
275 | .r_loop_a_line: | ||
276 | move.w (%a2), %d0 /* load 1st word */ | ||
277 | swap %d0 /* move it to upper 16 bits */ | ||
278 | move.w (%a2), %d0 /* load 2nd word */ | ||
279 | |||
280 | /* byte swap d0 */ | ||
281 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
282 | and.l %d0, %d7 /* d7 = .B.D */ | ||
283 | eor.l %d7, %d0 /* d0 = A.C. */ | ||
284 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
285 | lsr.l #8, %d0 /* d0 = .A.C */ | ||
286 | or.l %d7, %d0 /* d0 = BADC */ | ||
287 | |||
288 | move.w (%a2), %d1 /* load 3rd word */ | ||
289 | swap %d1 /* move it to upper 16 bits */ | ||
290 | move.w (%a2), %d1 /* load 4th word */ | ||
291 | |||
292 | /* byte swap d1 */ | ||
293 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
294 | and.l %d1, %d7 /* d7 = .B.D */ | ||
295 | eor.l %d7, %d1 /* d1 = A.C. */ | ||
296 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
297 | lsr.l #8, %d1 /* d1 = .A.C */ | ||
298 | or.l %d7, %d1 /* d1 = BADC */ | ||
299 | |||
300 | move.w (%a2), %d2 /* load 5th word */ | ||
301 | swap %d2 /* move it to upper 16 bits */ | ||
302 | move.w (%a2), %d2 /* load 6th word */ | ||
303 | |||
304 | /* byte swap d2 */ | ||
305 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
306 | and.l %d2, %d7 /* d7 = .B.D */ | ||
307 | eor.l %d7, %d2 /* d2 = A.C. */ | ||
308 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
309 | lsr.l #8, %d2 /* d2 = .A.C */ | ||
310 | or.l %d7, %d2 /* d2 = BADC */ | ||
311 | |||
312 | move.w (%a2), %d3 /* load 7th word */ | ||
313 | swap %d3 /* move it to upper 16 bits */ | ||
314 | move.w (%a2), %d3 /* load 8th word */ | ||
315 | |||
316 | /* byte swap d3 */ | ||
317 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
318 | and.l %d3, %d7 /* d7 = .B.D */ | ||
319 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
320 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
321 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
322 | or.l %d7, %d3 /* d3 = BADC */ | ||
323 | |||
324 | movem.l %d0-%d3, (%a0) /* store line */ | ||
325 | lea.l (16, %a0), %a0 | ||
326 | cmp.l %a0, %a1 /* run up to last line bound */ | ||
327 | bhi.b .r_loop_a_line | ||
328 | |||
329 | lea.l (12, %a1), %a1 /* readjust for longword loop */ | ||
330 | cmp.l %a0, %a1 /* any trailing longwords? */ | ||
331 | bls.b .r_end_a_l2 /* no: skip loop */ | ||
332 | |||
333 | .r_loop_a_l2: | ||
334 | move.w (%a2), %d1 /* read first word */ | ||
335 | swap %d1 /* move it to upper 16 bits */ | ||
336 | move.w (%a2), %d1 /* read second word */ | ||
337 | |||
338 | /* byte swap d1 */ | ||
339 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
340 | and.l %d1, %d7 /* d7 = .B.D */ | ||
341 | eor.l %d7, %d1 /* d1 = A.C. */ | ||
342 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
343 | lsr.l #8, %d1 /* d1 = .A.C */ | ||
344 | or.l %d7, %d1 /* d1 = BADC */ | ||
345 | |||
346 | move.l %d1, (%a0)+ /* store as long */ | ||
347 | cmp.l %a0, %a1 /* run up to last long bound */ | ||
348 | bhi.b .r_loop_a_l2 | ||
349 | |||
350 | .r_end_a_l2: | ||
351 | addq.l #2, %a1 /* back to final end address */ | ||
352 | cmp.l %a0, %a1 /* one word left? */ | ||
353 | bls.b .r_end_a_w2 | ||
354 | |||
355 | /* copy final word */ | ||
356 | /* final word has to be swapped */ | ||
357 | move.w (%a2), %d7 | ||
358 | move.b %d7, (%a0)+ | ||
359 | lsr.l #8, %d7 | ||
360 | move.b %d7, (%a0)+ | ||
361 | |||
362 | .r_end_a_w2: | ||
363 | |||
364 | .r_exit: | ||
365 | movem.l (%sp), %d2-%d7/%a2-%a3 | ||
366 | lea.l (32, %sp), %sp | ||
367 | rts | ||
368 | |||
369 | .r_end: | ||
370 | .size copy_read_sectors,.r_end-copy_read_sectors | ||
371 | |||
372 | .align 2 | ||
373 | .global copy_write_sectors | ||
374 | .type copy_write_sectors,@function | ||
375 | |||
376 | /* Write a number of words to the ATA data port | ||
377 | * | ||
378 | * Utilises line bursts, assumes there is at least one full line to copy. | ||
379 | * | ||
380 | * Arguments: | ||
381 | * (4,%sp) - buffer address | ||
382 | * (8,%sp) - word count | ||
383 | * | ||
384 | * Register usage: | ||
385 | * %a0 - current address | ||
386 | * %a1 - end address | ||
387 | * %a2 - ata port | ||
388 | * %d0 - scratch | ||
389 | * %d1 - shift count | ||
390 | * %d2-%d6 - read buffers | ||
391 | * | ||
392 | * %d7 - swap scrach | ||
393 | * %a3 - swap mask | ||
394 | */ | ||
395 | |||
396 | copy_write_sectors: | ||
397 | lea.l (-32, %sp), %sp | ||
398 | movem.l %d2-%d7/%a2-%a3, (%sp) | ||
399 | movem.l (36, %sp), %a0-%a1 | ||
400 | add.l %a1, %a1 | ||
401 | add.l %a0, %a1 | ||
402 | lea.l .ata_port, %a2 | ||
403 | lea.l .swapmask, %a3 | ||
404 | |||
405 | move.l %a0, %d0 | ||
406 | btst.l #0, %d0 /* 16-bit aligned? */ | ||
407 | beq .w_aligned /* yes, do word copy */ | ||
408 | |||
409 | /* not 16-bit aligned */ | ||
410 | subq.l #1, %a1 /* last byte is done unconditionally */ | ||
411 | moveq.l #24, %d1 /* preload shift count */ | ||
412 | |||
413 | move.b (%a0)+, %d2 | ||
414 | |||
415 | btst.l #1, %d0 /* longword aligned? (testing old d0 value!) */ | ||
416 | bne.b .w_end_u_w1 /* yes, skip leading word handling */ | ||
417 | |||
418 | swap %d2 | ||
419 | move.w (%a0)+, %d2 | ||
420 | move.l %d2, %d3 | ||
421 | lsr.l #8, %d3 | ||
422 | |||
423 | /* low word of %d3 has to be byte swaped */ | ||
424 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
425 | and.l %d3, %d7 /* d7 = .B.D */ | ||
426 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
427 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
428 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
429 | or.l %d7, %d3 /* d3 = BADC */ | ||
430 | |||
431 | move.w %d3, (%a2) | ||
432 | |||
433 | .w_end_u_w1: | ||
434 | moveq.l #12, %d0 | ||
435 | add.l %a0, %d0 | ||
436 | and.l #0xFFFFFFF0,%d0 /* d0 == first line bound */ | ||
437 | cmp.l %a0, %d0 /* any leading longwords? */ | ||
438 | bls.b .w_end_u_l1 /* no: skip loop */ | ||
439 | |||
440 | .w_loop_u_l1: | ||
441 | move.l (%a0)+, %d3 | ||
442 | move.l %d3, %d4 | ||
443 | lsl.l %d1, %d2 | ||
444 | lsr.l #8, %d3 | ||
445 | or.l %d3, %d2 | ||
446 | |||
447 | /* byte swap d2 */ | ||
448 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
449 | and.l %d2, %d7 /* d7 = .B.D */ | ||
450 | eor.l %d7, %d2 /* d2 = A.C. */ | ||
451 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
452 | lsr.l #8, %d2 /* d2 = .A.C */ | ||
453 | or.l %d7, %d2 /* d2 = BADC */ | ||
454 | |||
455 | swap %d2 | ||
456 | move.w %d2, (%a2) | ||
457 | swap %d2 | ||
458 | move.w %d2, (%a2) | ||
459 | move.l %d4, %d2 | ||
460 | cmp.l %a0, %d0 /* run up to first line bound */ | ||
461 | bhi.b .w_loop_u_l1 | ||
462 | |||
463 | .w_end_u_l1: | ||
464 | lea.l (-14, %a1), %a1 /* adjust end addr. to 16 bytes/pass */ | ||
465 | |||
466 | .w_loop_u_line: | ||
467 | movem.l (%a0), %d3-%d6 | ||
468 | lea.l (16, %a0), %a0 | ||
469 | move.l %d3, %d0 | ||
470 | lsl.l %d1, %d2 | ||
471 | lsr.l #8, %d0 | ||
472 | or.l %d0, %d2 | ||
473 | |||
474 | /* byte swap d2 */ | ||
475 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
476 | and.l %d2, %d7 /* d7 = .B.D */ | ||
477 | eor.l %d7, %d2 /* d2 = A.C. */ | ||
478 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
479 | lsr.l #8, %d2 /* d2 = .A.C */ | ||
480 | or.l %d7, %d2 /* d2 = BADC */ | ||
481 | |||
482 | swap %d2 | ||
483 | move.w %d2, (%a2) | ||
484 | swap %d2 | ||
485 | move.w %d2, (%a2) | ||
486 | move.l %d4, %d0 | ||
487 | lsl.l %d1, %d3 | ||
488 | lsr.l #8, %d0 | ||
489 | or.l %d0, %d3 | ||
490 | |||
491 | /* byte swap d3 */ | ||
492 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
493 | and.l %d3, %d7 /* d7 = .B.D */ | ||
494 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
495 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
496 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
497 | or.l %d7, %d3 /* d3 = BADC */ | ||
498 | |||
499 | swap %d3 | ||
500 | move.w %d3, (%a2) | ||
501 | swap %d3 | ||
502 | move.w %d3, (%a2) | ||
503 | move.l %d5, %d0 | ||
504 | lsl.l %d1, %d4 | ||
505 | lsr.l #8, %d0 | ||
506 | or.l %d0, %d4 | ||
507 | |||
508 | /* byte swap d4 */ | ||
509 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
510 | and.l %d4, %d7 /* d7 = .B.D */ | ||
511 | eor.l %d7, %d4 /* d4 = A.C. */ | ||
512 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
513 | lsr.l #8, %d4 /* d4 = .A.C */ | ||
514 | or.l %d7, %d4 /* d4 = BADC */ | ||
515 | |||
516 | swap %d4 | ||
517 | move.w %d4, (%a2) | ||
518 | swap %d4 | ||
519 | move.w %d4, (%a2) | ||
520 | move.l %d6, %d0 | ||
521 | lsl.l %d1, %d5 | ||
522 | lsr.l #8, %d0 | ||
523 | or.l %d0, %d5 | ||
524 | |||
525 | /* byte swap d5 */ | ||
526 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
527 | and.l %d5, %d7 /* d7 = .B.D */ | ||
528 | eor.l %d7, %d5 /* d5 = A.C. */ | ||
529 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
530 | lsr.l #8, %d5 /* d5 = .A.C */ | ||
531 | or.l %d7, %d5 /* d5 = BADC */ | ||
532 | |||
533 | swap %d5 | ||
534 | move.w %d5, (%a2) | ||
535 | swap %d5 | ||
536 | move.w %d5, (%a2) | ||
537 | move.l %d6, %d2 | ||
538 | cmp.l %a0, %a1 /* run up to last line bound */ | ||
539 | bhi.b .w_loop_u_line | ||
540 | |||
541 | lea.l (12, %a1), %a1 /* readjust for longword loop */ | ||
542 | cmp.l %a0, %a1 /* any trailing longwords? */ | ||
543 | bls.b .w_end_u_l2 /* no: skip loop */ | ||
544 | |||
545 | .w_loop_u_l2: | ||
546 | move.l (%a0)+, %d3 | ||
547 | move.l %d3, %d4 | ||
548 | lsl.l %d1, %d2 | ||
549 | lsr.l #8, %d3 | ||
550 | or.l %d3, %d2 | ||
551 | |||
552 | /* byte swap d2 */ | ||
553 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
554 | and.l %d2, %d7 /* d7 = .B.D */ | ||
555 | eor.l %d7, %d2 /* d2 = A.C. */ | ||
556 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
557 | lsr.l #8, %d2 /* d2 = .A.C */ | ||
558 | or.l %d7, %d2 /* d2 = BADC */ | ||
559 | |||
560 | swap %d2 | ||
561 | move.w %d2, (%a2) | ||
562 | swap %d2 | ||
563 | move.w %d2, (%a2) | ||
564 | move.l %d4, %d2 | ||
565 | cmp.l %a0, %a1 /* run up to first line bound */ | ||
566 | bhi.b .w_loop_u_l2 | ||
567 | |||
568 | .w_end_u_l2: | ||
569 | addq.l #2, %a1 /* back to final end address */ | ||
570 | cmp.l %a0, %a1 /* one word left? */ | ||
571 | bls.b .w_end_u_w2 | ||
572 | |||
573 | swap %d2 | ||
574 | move.w (%a0)+, %d2 | ||
575 | move.l %d2, %d3 | ||
576 | lsr.l #8, %d3 | ||
577 | |||
578 | /* byte swap d3 */ | ||
579 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
580 | and.l %d3, %d7 /* d7 = .B.D */ | ||
581 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
582 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
583 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
584 | or.l %d7, %d3 /* d3 = BADC */ | ||
585 | |||
586 | move.w %d3, (%a2) | ||
587 | |||
588 | .w_end_u_w2: | ||
589 | lsl.l #8, %d2 | ||
590 | move.b (%a0)+, %d2 | ||
591 | |||
592 | /* byte swap d2 */ | ||
593 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
594 | and.l %d2, %d7 /* d7 = .B.D */ | ||
595 | eor.l %d7, %d2 /* d2 = A.C. */ | ||
596 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
597 | lsr.l #8, %d2 /* d2 = .A.C */ | ||
598 | or.l %d7, %d2 /* d2 = BADC */ | ||
599 | |||
600 | move.w %d2, (%a2) | ||
601 | bra.w .w_exit | ||
602 | |||
603 | /* 16-bit aligned */ | ||
604 | .w_aligned: | ||
605 | btst.l #1, %d0 | ||
606 | beq.b .w_end_a_w1 | ||
607 | |||
608 | /* this has to be byte swaped */ | ||
609 | /* copy initial word */ | ||
610 | move.w (%a0)+, %d1 | ||
611 | |||
612 | /* byte swap d1 */ | ||
613 | move.l %a3, %d7 /* d7 = $00FF00FF */ | ||
614 | and.l %d1, %d7 /* d7 = .B.D */ | ||
615 | eor.l %d7, %d1 /* d1 = A.C. */ | ||
616 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
617 | lsr.l #8, %d1 /* d1 = .A.C */ | ||
618 | or.l %d7, %d1 /* d1 = BADC */ | ||
619 | |||
620 | move.w %d1, (%a2) | ||
621 | |||
622 | |||
623 | .w_end_a_w1: | ||
624 | moveq.l #12, %d0 | ||
625 | add.l %a0, %d0 | ||
626 | and.l #0xFFFFFFF0,%d0 /* d0 == first line bound */ | ||
627 | cmp.l %a0, %d0 /* any leading longwords? */ | ||
628 | bls.b .w_end_a_l1 /* no: skip loop */ | ||
629 | |||
630 | .w_loop_a_l1: | ||
631 | move.l (%a0)+, %d1 | ||
632 | |||
633 | /* byte swap d1 */ | ||
634 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
635 | and.l %d1, %d7 /* d7 = .B.D */ | ||
636 | eor.l %d7, %d1 /* d1 = A.C. */ | ||
637 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
638 | lsr.l #8, %d1 /* d1 = .A.C */ | ||
639 | or.l %d7, %d1 /* d1 = BADC */ | ||
640 | |||
641 | swap %d1 | ||
642 | move.w %d1, (%a2) | ||
643 | swap %d1 | ||
644 | move.w %d1, (%a2) | ||
645 | cmp.l %a0, %d0 /* run up to first line bound */ | ||
646 | bhi.b .w_loop_a_l1 | ||
647 | |||
648 | .w_end_a_l1: | ||
649 | lea.l (-14, %a1), %a1 /* adjust end addr. to 16 bytes/pass */ | ||
650 | |||
651 | .w_loop_a_line: | ||
652 | movem.l (%a0), %d0-%d3 | ||
653 | |||
654 | /* byte swap d0-d3 */ | ||
655 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
656 | and.l %d0, %d7 /* d7 = .B.D */ | ||
657 | eor.l %d7, %d0 /* d0 = A.C. */ | ||
658 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
659 | lsr.l #8, %d0 /* d0 = .A.C */ | ||
660 | or.l %d7, %d0 /* d0 = BADC */ | ||
661 | |||
662 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
663 | and.l %d1, %d7 /* d7 = .B.D */ | ||
664 | eor.l %d7, %d1 /* d1 = A.C. */ | ||
665 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
666 | lsr.l #8, %d1 /* d1 = .A.C */ | ||
667 | or.l %d7, %d1 /* d1 = BADC */ | ||
668 | |||
669 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
670 | and.l %d2, %d7 /* d7 = .B.D */ | ||
671 | eor.l %d7, %d2 /* d2 = A.C. */ | ||
672 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
673 | lsr.l #8, %d2 /* d2 = .A.C */ | ||
674 | or.l %d7, %d2 /* d2 = BADC */ | ||
675 | |||
676 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
677 | and.l %d3, %d7 /* d7 = .B.D */ | ||
678 | eor.l %d7, %d3 /* d3 = A.C. */ | ||
679 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
680 | lsr.l #8, %d3 /* d3 = .A.C */ | ||
681 | or.l %d7, %d3 /* d3 = BADC */ | ||
682 | |||
683 | lea.l (16, %a0), %a0 | ||
684 | swap %d0 | ||
685 | move.w %d0, (%a2) | ||
686 | swap %d0 | ||
687 | move.w %d0, (%a2) | ||
688 | swap %d1 | ||
689 | move.w %d1, (%a2) | ||
690 | swap %d1 | ||
691 | move.w %d1, (%a2) | ||
692 | swap %d2 | ||
693 | move.w %d2, (%a2) | ||
694 | swap %d2 | ||
695 | move.w %d2, (%a2) | ||
696 | swap %d3 | ||
697 | move.w %d3, (%a2) | ||
698 | swap %d3 | ||
699 | move.w %d3, (%a2) | ||
700 | cmp.l %a0, %a1 /* run up to last line bound */ | ||
701 | bhi.b .w_loop_a_line | ||
702 | |||
703 | lea.l (12, %a1), %a1 /* readjust for longword loop */ | ||
704 | cmp.l %a0, %a1 /* any trailing longwords? */ | ||
705 | bls.b .w_end_a_l2 /* no: skip loop */ | ||
706 | |||
707 | .w_loop_a_l2: | ||
708 | move.l (%a0)+, %d1 | ||
709 | |||
710 | /* byte swap d1 */ | ||
711 | move.l %a3, %d7 /* d7 = 0x00FF00FF */ | ||
712 | and.l %d1, %d7 /* d7 = .B.D */ | ||
713 | eor.l %d7, %d1 /* d1 = A.C. */ | ||
714 | lsl.l #8, %d7 /* d7 = B.D. */ | ||
715 | lsr.l #8, %d1 /* d1 = .A.C */ | ||
716 | or.l %d7, %d1 /* d1 = BADC */ | ||
717 | |||
718 | swap %d1 | ||
719 | move.w %d1, (%a2) | ||
720 | swap %d1 | ||
721 | move.w %d1, (%a2) | ||
722 | cmp.l %a0, %a1 /* run up to first line bound */ | ||
723 | bhi.b .w_loop_a_l2 | ||
724 | |||
725 | .w_end_a_l2: | ||
726 | addq.l #2, %a1 /* back to final end address */ | ||
727 | cmp.l %a0, %a1 /* one word left? */ | ||
728 | bls.b .w_end_a_w2 | ||
729 | |||
730 | /* this has to be byte swaped */ | ||
731 | /* copy final word */ | ||
732 | move.w (%a0)+, %d0 | ||
733 | move.l %a3, %d7 | ||
734 | and.l %d0, %d7 | ||
735 | eor.l %d7, %d0 | ||
736 | lsl.l #8, %d7 | ||
737 | lsr.l #8, %d0 | ||
738 | or.l %d7, %d0 | ||
739 | move.w %d0, (%a2) | ||
740 | |||
741 | .w_end_a_w2: | ||
742 | |||
743 | .w_exit: | ||
744 | movem.l (%sp), %d2-%d7/%a2-%a3 | ||
745 | lea.l (32, %sp), %sp | ||
746 | rts | ||
747 | |||
748 | .w_end: | ||
749 | .size copy_write_sectors,.w_end-copy_write_sectors | ||