0001
0002
0003
0004
0005 #include <linux/linkage.h>
0006
0007 #include <asm/assembler.h>
0008 #include <mach/hardware.h>
0009
0010 #if defined(__APCS_32__)
0011 #define LOADREGS(t,r,l...) ldm##t r, l
0012 #elif defined(__APCS_26__)
0013 #define LOADREGS(t,r,l...) ldm##t r, l##^
0014 #endif
0015
0016 @ Purpose: transfer a block of data from the acorn scsi card to memory
0017 @ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
0018 @ Returns: nothing
0019
0020 .align
0021 ENTRY(__acornscsi_in)
0022 stmfd sp!, {r4 - r7, lr}
0023 bic r0, r0, #3
0024 mov lr, #0xff
0025 orr lr, lr, #0xff00
0026 acornscsi_in16lp:
0027 subs r2, r2, #16
0028 bmi acornscsi_in8
0029 ldmia r0!, {r3, r4, r5, r6}
0030 and r3, r3, lr
0031 orr r3, r3, r4, lsl #16
0032 and r4, r5, lr
0033 orr r4, r4, r6, lsl #16
0034 ldmia r0!, {r5, r6, r7, ip}
0035 and r5, r5, lr
0036 orr r5, r5, r6, lsl #16
0037 and r6, r7, lr
0038 orr r6, r6, ip, lsl #16
0039 stmia r1!, {r3 - r6}
0040 bne acornscsi_in16lp
0041 LOADREGS(fd, sp!, {r4 - r7, pc})
0042
0043 acornscsi_in8: adds r2, r2, #8
0044 bmi acornscsi_in4
0045 ldmia r0!, {r3, r4, r5, r6}
0046 and r3, r3, lr
0047 orr r3, r3, r4, lsl #16
0048 and r4, r5, lr
0049 orr r4, r4, r6, lsl #16
0050 stmia r1!, {r3 - r4}
0051 LOADREGS(eqfd, sp!, {r4 - r7, pc})
0052 sub r2, r2, #8
0053
0054 acornscsi_in4: adds r2, r2, #4
0055 bmi acornscsi_in2
0056 ldmia r0!, {r3, r4}
0057 and r3, r3, lr
0058 orr r3, r3, r4, lsl #16
0059 str r3, [r1], #4
0060 LOADREGS(eqfd, sp!, {r4 - r7, pc})
0061 sub r2, r2, #4
0062
0063 acornscsi_in2: adds r2, r2, #2
0064 ldr r3, [r0], #4
0065 and r3, r3, lr
0066 strb r3, [r1], #1
0067 mov r3, r3, lsr #8
0068 strplb r3, [r1], #1
0069 LOADREGS(fd, sp!, {r4 - r7, pc})
0070
0071 @ Purpose: transfer a block of data from memory to the acorn scsi card
0072 @ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
0073 @ Returns: nothing
0074
0075 ENTRY(__acornscsi_out)
0076 stmfd sp!, {r4 - r6, lr}
0077 bic r0, r0, #3
0078 acornscsi_out16lp:
0079 subs r2, r2, #16
0080 bmi acornscsi_out8
0081 ldmia r1!, {r4, r6, ip, lr}
0082 mov r3, r4, lsl #16
0083 orr r3, r3, r3, lsr #16
0084 mov r4, r4, lsr #16
0085 orr r4, r4, r4, lsl #16
0086 mov r5, r6, lsl #16
0087 orr r5, r5, r5, lsr #16
0088 mov r6, r6, lsr #16
0089 orr r6, r6, r6, lsl #16
0090 stmia r0!, {r3, r4, r5, r6}
0091 mov r3, ip, lsl #16
0092 orr r3, r3, r3, lsr #16
0093 mov r4, ip, lsr #16
0094 orr r4, r4, r4, lsl #16
0095 mov ip, lr, lsl #16
0096 orr ip, ip, ip, lsr #16
0097 mov lr, lr, lsr #16
0098 orr lr, lr, lr, lsl #16
0099 stmia r0!, {r3, r4, ip, lr}
0100 bne acornscsi_out16lp
0101 LOADREGS(fd, sp!, {r4 - r6, pc})
0102
0103 acornscsi_out8: adds r2, r2, #8
0104 bmi acornscsi_out4
0105 ldmia r1!, {r4, r6}
0106 mov r3, r4, lsl #16
0107 orr r3, r3, r3, lsr #16
0108 mov r4, r4, lsr #16
0109 orr r4, r4, r4, lsl #16
0110 mov r5, r6, lsl #16
0111 orr r5, r5, r5, lsr #16
0112 mov r6, r6, lsr #16
0113 orr r6, r6, r6, lsl #16
0114 stmia r0!, {r3, r4, r5, r6}
0115 LOADREGS(eqfd, sp!, {r4 - r6, pc})
0116
0117 sub r2, r2, #8
0118 acornscsi_out4: adds r2, r2, #4
0119 bmi acornscsi_out2
0120 ldr r4, [r1], #4
0121 mov r3, r4, lsl #16
0122 orr r3, r3, r3, lsr #16
0123 mov r4, r4, lsr #16
0124 orr r4, r4, r4, lsl #16
0125 stmia r0!, {r3, r4}
0126 LOADREGS(eqfd, sp!, {r4 - r6, pc})
0127
0128 sub r2, r2, #4
0129 acornscsi_out2: adds r2, r2, #2
0130 ldr r3, [r1], #2
0131 strb r3, [r0], #1
0132 mov r3, r3, lsr #8
0133 strplb r3, [r0], #1
0134 LOADREGS(fd, sp!, {r4 - r6, pc})
0135