📄 nand.s
字号:
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
;
; Use of this source code is subject to the terms of the Microsoft end-user
; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
; If you did not accept the terms of the EULA, you are not authorized to use
; this source code. For a copy of the EULA, please see the LICENSE.RTF on your
; install media.
;
;
; NAND(SmartCard) Related Routines
;
INCLUDE kxarm.h
MACRO
LDR4STR1 $src, $tmp1, $tmp2
[ {FALSE}
ldrb $tmp1,[$src]
ldrb $tmp2,[$src]
orr $tmp1,$tmp1,$tmp2,LSL #8
ldrb $tmp2,[$src]
orr $tmp1,$tmp1,$tmp2,LSL #16
ldrb $tmp2,[$src]
orr $tmp1,$tmp1,$tmp2,LSL #24
]
[ {TRUE}
ldr $tmp1,[$src]
]
MEND
MACRO
LDR1STR4 $dest, $tmp1, $tmp2
[ {FALSE}
strb $tmp1, [$dest]
and $tmp2, r12, $tmp1, LSR #8
strb $tmp2, [$dest]
and $tmp2, r12, $tmp1, LSR #16
strb $tmp2, [$dest]
and $tmp2, r12, $tmp1, LSR #24
strb $tmp2, [$dest]
]
[ {TRUE}
str $tmp1, [$dest]
]
MEND
TEXTAREA
; Read one sector. Buffer (r0) must be aligned.
;
LEAF_ENTRY RdPage2048
stmfd sp!,{r2 - r11}
mov r2, #0x800
1
LDR4STR1 r1, r4, r3
LDR4STR1 r1, r5, r3
LDR4STR1 r1, r6, r3
LDR4STR1 r1, r7, r3
LDR4STR1 r1, r8, r3
LDR4STR1 r1, r9, r3
LDR4STR1 r1, r10, r3
LDR4STR1 r1, r11, r3
stmia r0!, {r4 - r11}
subs r2, r2, #32
bne %B1
ldmfd sp!, {r2 - r11}
mov pc, lr ; return
ENDP
; Read one sector. Handles case where buffer (r0) is unaligned.
;
LEAF_ENTRY RdPage2048Unalign
stmfd sp!,{r2 - r12}
mov r2, #2016
; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
and r12, r0, #3
rsb r12, r12, #4
mov r3, r12
rd_unalign1
; Read unaligned bytes
ldrb r4, [r1]
strb r4, [r0]
add r0, r0, #1
subs r3, r3, #1
bne rd_unalign1
rd_main
; Read 2016 bytes (32 x 63)
LDR4STR1 r1, r4, r3
LDR4STR1 r1, r5, r3
LDR4STR1 r1, r6, r3
LDR4STR1 r1, r7, r3
LDR4STR1 r1, r8, r3
LDR4STR1 r1, r9, r3
LDR4STR1 r1, r10, r3
LDR4STR1 r1, r11, r3
stmia r0!, {r4 - r11}
subs r2, r2, #32
bne rd_main
; Read 28 bytes
LDR4STR1 r1, r4, r3
LDR4STR1 r1, r5, r3
LDR4STR1 r1, r6, r3
LDR4STR1 r1, r7, r3
LDR4STR1 r1, r8, r3
LDR4STR1 r1, r9, r3
LDR4STR1 r1, r10, r3
stmia r0!, {r4 - r10}
; Read trailing unaligned bytes
rsbs r12, r12, #4
beq rd_exit
rd_unalign2
ldrb r4, [r1]
strb r4, [r0]
add r0, r0, #1
subs r12, r12, #1
bne rd_unalign2
rd_exit
ldmfd sp!, {r2 - r12}
mov pc, lr ; return
ENDP
; Write one sector. Buffer (r0) must be aligned.
;
LEAF_ENTRY WrPage2048
stmfd sp!,{r2 - r11}
mov r2, #0x800
1
ldmia r0!, {r4 - r11}
LDR1STR4 r1, r4,r3
LDR1STR4 r1, r5,r3
LDR1STR4 r1, r6,r3
LDR1STR4 r1, r7,r3
LDR1STR4 r1, r8,r3
LDR1STR4 r1, r9,r3
LDR1STR4 r1, r10,r3
LDR1STR4 r1, r11,r3
subs r2, r2, #32
bne %B1
ldmfd sp!, {r2 - r11}
mov pc, lr ; return
ENDP
; Writes one sector. Handles case where buffer (r0) is unaligned.
;
LEAF_ENTRY WrPage2048Unalign
stmfd sp!,{r2 - r12}
mov r2, #2016
; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
and r12, r0, #3
rsb r12, r12, #4
mov r3, r12
wr_unalign1
; Write unaligned bytes
ldrb r4, [r0]
strb r4, [r1]
add r0, r0, #1
subs r3, r3, #1
bne wr_unalign1
wr_main
; Write 2016 bytes (32 x 63)
ldmia r0!, {r4 - r11}
LDR1STR4 r1, r4,r3
LDR1STR4 r1, r5,r3
LDR1STR4 r1, r6,r3
LDR1STR4 r1, r7,r3
LDR1STR4 r1, r8,r3
LDR1STR4 r1, r9,r3
LDR1STR4 r1, r10,r3
LDR1STR4 r1, r11,r3
subs r2, r2, #32
bne wr_main
; Write 28 bytes
ldmia r0!, {r4 - r10}
LDR1STR4 r1, r4,r3
LDR1STR4 r1, r5,r3
LDR1STR4 r1, r6,r3
LDR1STR4 r1, r7,r3
LDR1STR4 r1, r8,r3
LDR1STR4 r1, r9,r3
LDR1STR4 r1, r10,r3
; Write trailing unaligned bytes
rsbs r12, r12, #4
beq wr_exit
wr_unalign2
ldrb r4, [r0]
strb r4, [r1]
add r0, r0, #1
subs r12, r12, #1
bne wr_unalign2
wr_exit
ldmfd sp!, {r2 - r12}
mov pc, lr ; return
ENDP
; Read one sector. Buffer (r0) must be aligned.
;
LEAF_ENTRY RdPage512
stmfd sp!,{r2 - r11}
mov r2, #0x200
1
LDR4STR1 r1, r4, r3
LDR4STR1 r1, r5, r3
LDR4STR1 r1, r6, r3
LDR4STR1 r1, r7, r3
LDR4STR1 r1, r8, r3
LDR4STR1 r1, r9, r3
LDR4STR1 r1, r10, r3
LDR4STR1 r1, r11, r3
stmia r0!, {r4 - r11}
subs r2, r2, #32
bne %B1
ldmfd sp!,{r2-r11}
mov pc,lr
ENDP ; |ReadPage512|
; ---------------------------------------------------------------------
; void RdPage512Unlign(BYTE *pBuf, PUSHORT pNFData)
;
; pBuf (r0): a buffer big enough to hold 512 bytes
; pNFData (r1): the DATA register on the NAND controller
;
; ---------------------------------------------------------------------
; Read one sector. Handles case where buffer (r0) is unaligned.
;
LEAF_ENTRY RdPage512Unalign
stmfd sp!,{r2 - r12}
mov r2, #480
; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
and r12, r0, #3
rsb r12, r12, #4
mov r3, r12
rd_unalign10
; Read unaligned bytes
ldrb r4, [r1]
strb r4, [r0]
add r0, r0, #1
subs r3, r3, #1
bne rd_unalign10
rd_main0
; Read 480 bytes (32 x 15)
LDR4STR1 r1, r4, r3
LDR4STR1 r1, r5, r3
LDR4STR1 r1, r6, r3
LDR4STR1 r1, r7, r3
LDR4STR1 r1, r8, r3
LDR4STR1 r1, r9, r3
LDR4STR1 r1, r10, r3
LDR4STR1 r1, r11, r3
stmia r0!, {r4 - r11}
subs r2, r2, #32
bne rd_main0
; Read 28 bytes
LDR4STR1 r1, r4, r3
LDR4STR1 r1, r5, r3
LDR4STR1 r1, r6, r3
LDR4STR1 r1, r7, r3
LDR4STR1 r1, r8, r3
LDR4STR1 r1, r9, r3
LDR4STR1 r1, r10, r3
stmia r0!, {r4 - r10}
; Read trailing unaligned bytes
rsbs r12, r12, #4
beq rd_exit0
rd_unalign20
ldrb r4, [r1]
strb r4, [r0]
add r0, r0, #1
subs r12, r12, #1
bne rd_unalign20
rd_exit0
ldmfd sp!, {r2 - r12}
mov pc,lr
ENDP ; |ReadPage512|
; ---------------------------------------------------------------------
; void WritePage512(BYTE *pBuf, PUSHORT pNFData)
;
; pBuf (r0): the data buffer
; pNFData (r1): the DATA register on the NAND controller
;
; ---------------------------------------------------------------------
;
LEAF_ENTRY WrPage512
stmfd sp!, {r2-r12}
;;; -- We use r12 as the mask
mov r12, #0xFF
mov r2, #0x200
10
ldmia r0!, {r4-r11}
LDR1STR4 r1, r4, r3
LDR1STR4 r1, r5, r3
LDR1STR4 r1, r6, r3
LDR1STR4 r1, r7, r3
LDR1STR4 r1, r8, r3
LDR1STR4 r1, r9, r3
LDR1STR4 r1, r10, r3
LDR1STR4 r1, r11, r3
subs r2, r2, #32
bne %B10
ldmfd sp!, {r2-r12}
mov pc, lr
ENDP ; |WritePage512|
; Writes one sector. Handles case where buffer (r0) is unaligned.
;
LEAF_ENTRY WrPage512Unalign
stmfd sp!,{r2 - r12}
mov r2, #480
; Calculate number of unaligned bytes to read (r12 = 4 - (r0 & 3))
and r12, r0, #3
rsb r12, r12, #4
mov r3, r12
wr_unalign10
; Write unaligned bytes
ldrb r4, [r0]
strb r4, [r1]
add r0, r0, #1
subs r3, r3, #1
bne wr_unalign10
wr_main0
; Write 480 bytes (32 x 15)
ldmia r0!, {r4 - r11}
LDR1STR4 r1, r4,r3
LDR1STR4 r1, r5,r3
LDR1STR4 r1, r6,r3
LDR1STR4 r1, r7,r3
LDR1STR4 r1, r8,r3
LDR1STR4 r1, r9,r3
LDR1STR4 r1, r10,r3
LDR1STR4 r1, r11,r3
subs r2, r2, #32
bne wr_main0
; Write 28 bytes
ldmia r0!, {r4 - r10}
LDR1STR4 r1, r4,r3
LDR1STR4 r1, r5,r3
LDR1STR4 r1, r6,r3
LDR1STR4 r1, r7,r3
LDR1STR4 r1, r8,r3
LDR1STR4 r1, r9,r3
LDR1STR4 r1, r10,r3
; Write trailing unaligned bytes
rsbs r12, r12, #4
beq wr_exit0
wr_unalign20
ldrb r4, [r0]
strb r4, [r1]
add r0, r0, #1
subs r12, r12, #1
bne wr_unalign20
wr_exit0
ldmfd sp!, {r2 - r12}
mov pc, lr ; return
ENDP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -