1
2
3
4
5
6
7
8#include <linux/linkage.h>
9
10#include <asm/assembler.h>
11#include <mach/hardware.h>
12
13
14#define LOADREGS(t,r,l...) ldm
15
16#define LOADREGS(t,r,l...) ldm
17#endif
18
19@ Purpose: transfer a block of data from the acorn scsi card to memory
20@ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
21@ Returns: nothing
22
23 .align
24ENTRY(__acornscsi_in)
25 stmfd sp!, {r4 - r7, lr}
26 bic r0, r0,
27 mov lr,
28 orr lr, lr,
29acornscsi_in16lp:
30 subs r2, r2,
31 bmi acornscsi_in8
32 ldmia r0!, {r3, r4, r5, r6}
33 and r3, r3, lr
34 orr r3, r3, r4, lsl
35 and r4, r5, lr
36 orr r4, r4, r6, lsl
37 ldmia r0!, {r5, r6, r7, ip}
38 and r5, r5, lr
39 orr r5, r5, r6, lsl
40 and r6, r7, lr
41 orr r6, r6, ip, lsl
42 stmia r1!, {r3 - r6}
43 bne acornscsi_in16lp
44 LOADREGS(fd, sp!, {r4 - r7, pc})
45
46acornscsi_in8: adds r2, r2,
47 bmi acornscsi_in4
48 ldmia r0!, {r3, r4, r5, r6}
49 and r3, r3, lr
50 orr r3, r3, r4, lsl
51 and r4, r5, lr
52 orr r4, r4, r6, lsl
53 stmia r1!, {r3 - r4}
54 LOADREGS(eqfd, sp!, {r4 - r7, pc})
55 sub r2, r2,
56
57acornscsi_in4: adds r2, r2,
58 bmi acornscsi_in2
59 ldmia r0!, {r3, r4}
60 and r3, r3, lr
61 orr r3, r3, r4, lsl
62 str r3, [r1],
63 LOADREGS(eqfd, sp!, {r4 - r7, pc})
64 sub r2, r2,
65
66acornscsi_in2: adds r2, r2,
67 ldr r3, [r0],
68 and r3, r3, lr
69 strb r3, [r1],
70 mov r3, r3, lsr
71 strplb r3, [r1],
72 LOADREGS(fd, sp!, {r4 - r7, pc})
73
74@ Purpose: transfer a block of data from memory to the acorn scsi card
75@ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
76@ Returns: nothing
77
78ENTRY(__acornscsi_out)
79 stmfd sp!, {r4 - r6, lr}
80 bic r0, r0,
81acornscsi_out16lp:
82 subs r2, r2,
83 bmi acornscsi_out8
84 ldmia r1!, {r4, r6, ip, lr}
85 mov r3, r4, lsl
86 orr r3, r3, r3, lsr
87 mov r4, r4, lsr
88 orr r4, r4, r4, lsl
89 mov r5, r6, lsl
90 orr r5, r5, r5, lsr
91 mov r6, r6, lsr
92 orr r6, r6, r6, lsl
93 stmia r0!, {r3, r4, r5, r6}
94 mov r3, ip, lsl
95 orr r3, r3, r3, lsr
96 mov r4, ip, lsr
97 orr r4, r4, r4, lsl
98 mov ip, lr, lsl
99 orr ip, ip, ip, lsr
100 mov lr, lr, lsr
101 orr lr, lr, lr, lsl
102 stmia r0!, {r3, r4, ip, lr}
103 bne acornscsi_out16lp
104 LOADREGS(fd, sp!, {r4 - r6, pc})
105
106acornscsi_out8: adds r2, r2,
107 bmi acornscsi_out4
108 ldmia r1!, {r4, r6}
109 mov r3, r4, lsl
110 orr r3, r3, r3, lsr
111 mov r4, r4, lsr
112 orr r4, r4, r4, lsl
113 mov r5, r6, lsl
114 orr r5, r5, r5, lsr
115 mov r6, r6, lsr
116 orr r6, r6, r6, lsl
117 stmia r0!, {r3, r4, r5, r6}
118 LOADREGS(eqfd, sp!, {r4 - r6, pc})
119
120 sub r2, r2,
121acornscsi_out4: adds r2, r2,
122 bmi acornscsi_out2
123 ldr r4, [r1],
124 mov r3, r4, lsl
125 orr r3, r3, r3, lsr
126 mov r4, r4, lsr
127 orr r4, r4, r4, lsl
128 stmia r0!, {r3, r4}
129 LOADREGS(eqfd, sp!, {r4 - r6, pc})
130
131 sub r2, r2,
132acornscsi_out2: adds r2, r2,
133 ldr r3, [r1],
134 strb r3, [r0],
135 mov r3, r3, lsr
136 strplb r3, [r0],
137 LOADREGS(fd, sp!, {r4 - r6, pc})
138
139