📄 nfc.s
字号:
mov r10, r10, lsr #8
orr r10, r10, r11, lsl #24 ; r10 = B28 B27 B26 B25
; Write BYTE[1]-BYTE[28] (double word alignment)
stmia r0!, {r4 - r10}
; Write BYTE[29]-BYTE[30] (half-word alignment)
mov r11, r11, lsr #8 ; r11 = 00 B31 B30 B29
strh r11, [r0], #+2
; Write BYTE[31] (byte alignment)
mov r11, r11, lsr #16 ; r11 = 00 00 00 B31
strb r11, [r0], #+1
subs r2, r2, #32
bne rd_align3
ldmfd sp!, {r1 - r11}
IF Interworking :LOR: Thumbing
bx lr
ELSE
mov pc, lr
ENDIF
;------------------------------------------------------------------------------
;
; Function: WrPage512Align4
;
; This function reads from the word-aligned user buffer and stores to the
; NFC main buffer.
;
; Parameters:
; r0 - Sector buffer to be written (must be 32-bit word aligned).
;
; Returns:
;------------------------------------------------------------------------------
LEAF_ENTRY WrPage512Align4
stmfd sp!,{r1 - r11}
ldr r1, =g_pNFC
ldr r1, [r1]
mov r2, #512
wr_align4
ldmia r0!, {r4 - r11}
stmia r1!, {r4 - r11}
subs r2, r2, #32
bne wr_align4
ldmfd sp!, {r1 - r11}
IF Interworking :LOR: Thumbing
bx lr
ELSE
mov pc, lr
ENDIF
;------------------------------------------------------------------------------
;
; Function: WrPage512Align1
;
; This function reads from the byte-aligned user buffer (aligned on BYTE[1]
; of 32-bit word) and stores to the NFC main buffer.
;
; Parameters:
; r0 - Sector buffer to be written (aligned on BYTE[1] of 32-bit word).
;
; Returns:
;------------------------------------------------------------------------------
LEAF_ENTRY WrPage512Align1
stmfd sp!, {r1 - r11}
ldr r1, =g_pNFC
ldr r1, [r1]
mov r2, #512
wr_align1
; Read BYTE[0] (byte alignment)
ldrb r4, [r0], #+1 ; r4 = 00 00 00 B00
; Read BYTE[1]-BYTE[2] (half-word alignment)
ldrh r3, [r0], #+2 ; r3 = 00 00 B02 B01
orr r4, r4, r3, lsl #8 ; r4 = 00 B02 B01 B00
; Read BYTE[3]-BYTE[30]
ldmia r0!, {r5 - r11} ; r5 = B06 B05 B04 B03
; r6 = B10 B09 B08 B07
; r7 = B14 B13 B12 B11
; r8 = B18 B17 B16 B15
; r9 = B22 B21 B20 B19
; r10 = B26 B25 B24 B23
; r11 = B30 B29 B28 B27
; Shift data for multi-word write
orr r4, r4, r5, lsl #24 ; r4 = B03 B02 B01 B00
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24 ; r5 = B07 B06 B05 B04
mov r6, r6, lsr #8
orr r6, r6, r7, lsl #24 ; r6 = B11 B10 B09 B08
mov r7, r7, lsr #8
orr r7, r7, r8, lsl #24 ; r7 = B15 B14 B13 B12
mov r8, r8, lsr #8
orr r8, r8, r9, lsl #24 ; r8 = B19 B18 B17 B16
mov r9, r9, lsr #8
orr r9, r9, r10, lsl #24 ; r9 = B23 B22 B21 B20
mov r10, r10, lsr #8
orr r10, r10, r11, lsl #24 ; r10 = B27 B26 B25 B24
; Read BYTE[31] (byte alignment)
ldrb r3, [r0], #+1 ; r3 = 00 00 00 B31
mov r11, r11, lsr #8
orr r11, r11, r3, lsl #24 ; r11 = B31 B30 B29 B28
; Write BYTE[0]-BYTE[31]
stmia r1!, {r4 - r11}
subs r2, r2, #32
bne wr_align1
ldmfd sp!, {r1 - r11}
IF Interworking :LOR: Thumbing
bx lr
ELSE
mov pc, lr
ENDIF
;------------------------------------------------------------------------------
;
; Function: WrPage512Align2
;
; This function reads from the half-word aligned user buffer (aligned on
; BYTE[2] of 16-bit word) and stores to the NFC main buffer.
;
; Parameters:
; r0 - Sector buffer to be written (aligned on BYTE[2] of 32-bit word).
;
; Returns:
;------------------------------------------------------------------------------
LEAF_ENTRY WrPage512Align2
stmfd sp!, {r1 - r11}
ldr r1, =g_pNFC
ldr r1, [r1]
mov r2, #512
wr_align2
; Read BYTE[0]-BYTE[1] (half-word alignment)
ldrh r4, [r0], #+2 ; r4 = 00 00 B01 B00
; Read BYTE[2]-BYTE[29]
ldmia r0!, {r5 - r11} ; r5 = B05 B04 B03 B02
; r6 = B09 B08 B07 B06
; r7 = B13 B12 B11 B10
; r8 = B17 B16 B15 B14
; r9 = B21 B20 B19 B18
; r10 = B25 B24 B23 B22
; r11 = B29 B28 B27 B26
; Shift data for multi-word write
orr r4, r4, r5, lsl #16 ; r4 = B03 B02 B01 B00
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16 ; r5 = B07 B06 B05 B04
mov r6, r6, lsr #16
orr r6, r6, r7, lsl #16 ; r6 = B11 B10 B09 B08
mov r7, r7, lsr #16
orr r7, r7, r8, lsl #16 ; r7 = B15 B14 B13 B12
mov r8, r8, lsr #16
orr r8, r8, r9, lsl #16 ; r8 = B19 B18 B17 B16
mov r9, r9, lsr #16
orr r9, r9, r10, lsl #16 ; r9 = B23 B22 B21 B20
mov r10, r10, lsr #16
orr r10, r10, r11, lsl #16 ; r10 = B27 B26 B25 B24
; Read BYTE[30]-BYTE[31] (half-word alignment)
ldrh r3, [r0], #+2 ; r3 = 00 00 B31 B30
mov r11, r11, lsr #16
orr r11, r11, r3, lsl #16 ; r11 = B31 B30 B29 B28
; Write BYTE[0]-BYTE[31]
stmia r1!, {r4 - r11}
subs r2, r2, #32
bne wr_align2
ldmfd sp!, {r1 - r11}
IF Interworking :LOR: Thumbing
bx lr
ELSE
mov pc, lr
ENDIF
;------------------------------------------------------------------------------
;
; Function: WrPage512Align3
;
; This function reads from the byte-aligned user buffer (aligned on BYTE[3]
; of 32-bit word) and stores to the NFC main buffer.
;
; Parameters:
; r0 - Sector buffer to be written (aligned on BYTE[3] of 32-bit word).
;
; Returns:
;------------------------------------------------------------------------------
LEAF_ENTRY WrPage512Align3
stmfd sp!, {r1 - r11}
ldr r1, =g_pNFC
ldr r1, [r1]
mov r2, #512
wr_align3
; Read BYTE[0] (byte alignment)
ldrb r4, [r0], #+1 ; r4 = 00 00 00 B00
; Read BYTE[1]-BYTE[28]
ldmia r0!, {r5 - r11} ; r5 = B04 B03 B02 B01
; r6 = B08 B07 B06 B05
; r7 = B12 B11 B10 B09
; r8 = B16 B15 B14 B13
; r9 = B20 B19 B18 B17
; r10 = B24 B23 B22 B21
; r11 = B28 B27 B26 B25
; Shift data for multi-word write
orr r4, r4, r5, lsl #8 ; r4 = B03 B02 B01 B00
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8 ; r5 = B07 B06 B05 B04
mov r6, r6, lsr #24
orr r6, r6, r7, lsl #8 ; r6 = B11 B10 B09 B08
mov r7, r7, lsr #24
orr r7, r7, r8, lsl #8 ; r7 = B15 B14 B13 B12
mov r8, r8, lsr #24
orr r8, r8, r9, lsl #8 ; r8 = B19 B18 B17 B16
mov r9, r9, lsr #24
orr r9, r9, r10, lsl #8 ; r9 = B23 B22 B21 B20
mov r10, r10, lsr #24
orr r10, r10, r11, lsl #8 ; r10 = B27 B26 B25 B24
; Read BYTE[29]-BYTE[30] (half-word alignment)
ldrh r3, [r0], #+2 ; r3 = 00 00 B30 B29
mov r11, r11, lsr #24
orr r11, r11, r3, lsl #8 ; r11 = 00 B30 B29 B28
; Read BYTE[31] (byte alignment)
ldrb r3, [r0], #+1 ; r3 = 00 00 00 B31
orr r11, r11, r3, lsl #24 ; r11 = B31 B30 B29 B28
; Write BYTE[0]-BYTE[31]
stmia r1!, {r4 - r11}
subs r2, r2, #32
bne wr_align3
ldmfd sp!, {r1 - r11}
IF Interworking :LOR: Thumbing
bx lr
ELSE
mov pc, lr
ENDIF
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -