📄 v6boot.asm
字号:
001002D8 4708 BX R1
001002DA 46C0 ; fill blank
001002DC FFF00000 DW 0xFFF00000
;==================================================================================================
; software reset check
001002E0 B570 PUSH {R4,R5,R6, LR}
001002E2 B0FF SUB SP, SP, #508
001002E4 B081 SUB SP, SP, #4 ; byte temp[512];
001002E6 2280 MOV R2, #128 ; R2 = 0x80
001002E8 4910 LDR R1, [PC,#0x040] ; R1 = [0x10032C] =0x108E00
001002EA 2081 MOV R0, #129
001002EC 0340 LSL R0, R0, #13 ; R0 = 0x102000
001002EE F000 ; pre BL/BLX
001002F0 F839 BL 0x100364 ; call 0x100364 memcmp
001002F2 2800 CMP R0, #0
001002F4 D015 BEQ 0x100322 ; if(0x102000 to 0x10207F == 0x108E00 to 0x108E7F) then goto 0x100322
;-----------------------------------------------------------
; (0x102000 to 0x10207F != 0x108E00 to 0x108E7F)
001002F6 F7FF ; pre BL/BLX
001002F8 FF7D BL 0x1001F4 ; call 0x1001F4 ?main
001002FA 2400 MOV R4, #0 ; R4 = 0
001002FC 2580 MOV R5, #128
001002FE 00AD LSL R5, R5, #2 ; R5 = 0x00000200
;-----------------------------------------------------------
00100300 0266 LSL R6, R4, #9 ; R6 = R4 << 9
00100302 002A LSL R2, R5, #0 ; R2 = 0x00000200 = 512 bytes
00100304 4809 LDR R0, [PC,#0x024] ; R0 = [0x10032C] =0x108E00
00100306 1831 ADD R1, R6, R0 ; R1 = 0x108E00 + R6 source
00100308 4668 MOV R0, SP ; R0 = SP dest
0010030A F000 ; pre BL/BLX
0010030C F841 BL 0x100390 ; call 0x100390 memread
0010030E 466A MOV R2, SP ; R2 = SP source
00100310 0029 LSL R1, R5, #0 ; R1 = 0x00000200 = 512 bytes
00100312 2081 MOV R0, #129
00100314 0340 LSL R0, R0, #13
00100316 1830 ADD R0, R6, R0 ; R0 = 0x102000 + R6 dest
00100318 F7FF ; pre BL/BLX
0010031A FFBE BL 0x100298 ; call 0x100298 flashwrite
0010031C 1C64 ADD R4, R4, #1 ; R4 ++
0010031E 2C37 CMP R4, #55
00100320 DBEE BLT 0x100300
;-----------------------------------------------------------
; (0x102000 to 0x10207F == 0x108E00 to 0x108E7F)
00100322 B07F ADD SP, SP, #508
00100324 B001 ADD SP, SP, #4
00100326 BC70 POP {R4,R5,R6}
00100328 BC01 POP {R0}
0010032A 4700 BX R0
0010032C 00108E00 DW 0x00108E00
;==================================================================================================
main:
00100330 B500 PUSH {LR}
00100332 20C0 MOV R0, #192
00100334 0080 LSL R0, R0, #2 ; R0 = 0x00000300
00100336 4906 LDR R1, [PC,#0x018] ; R1 = [0x100350] =RSTC_RSR (0xFFFFFD04)
00100338 6809 LDR R1, [R1, #0] ; read R1 = RSTC_RSR (0xFFFFFD04)
0010033A 4001 AND R1, R0 ; R1 = RSTC_RSR (0xFFFFFD04) & 0x00000300 RSTTYP
0010033C 4281 CMP R1, R0
0010033E D101 BNE 0x100344 ; if(reset type not processor reset) then goto 0x100344
;-----------------------------------------------------------
;processor reset by software
00100340 F7FF ; pre BL/BLX
00100342 FFCE BL 0x1002E0 ; call 0x1002E0 software reset check
;-----------------------------------------------------------
00100344 F000 ; pre BL/BLX
00100346 F80A BL 0x10035C ; call 0x10035C call APP
;-----------------------------------------------------------
00100348 4802 LDR R0, [PC,#0x008] ; [0x100354] =RSTC_RCR (0xFFFFFD00)
0010034A 4903 LDR R1, [PC,#0x00C] ; [0x100358] =0xA5000001
0010034C 6001 STR R1, [R0, #0] ; RSTC_RCR (0xFFFFFD00) = 0xA5000001
; processor reset
0010034E E7FD B 0x10034C
00100350 FFFFFD04 DW 0xFFFFFD04
00100354 FFFFFD00 DW 0xFFFFFD00
00100358 A5000001 DW 0xA5000001
;==================================================================================================
0010035C 4B00 LDR R3, [PC,#0x000] ; [0x100360] =0x102000
0010035E 4718 BX R3 ; call 0x102000 APP
00100360 00102000 DW 0x00102000
;==================================================================================================
; R0 s1
; R1 s2
; R2 size
; return 0 equ
; return 1 diff
memcmp:
00100364 B410 PUSH {R4}
00100366 2A00 CMP R2, #0
00100368 D00D BEQ 0x100386
0010036A 7803 LDRB R3, [R0, #0]
0010036C 780C LDRB R4, [R1, #0]
0010036E 42A3 CMP R3, R4
00100370 D005 BEQ 0x10037E
00100372 D202 BCS 0x10037A
00100374 2000 MOV R0, #0
00100376 43C0 MVN R0, R0
00100378 E006 B 0x100388
0010037A 2001 MOV R0, #1
0010037C E004 B 0x100388
0010037E 1C40 ADD R0, R0, #1
00100380 1C49 ADD R1, R1, #1
00100382 1E52 SUB R2, R2, #1
00100384 D1F1 BNE 0x10036A
00100386 2000 MOV R0, #0
00100388 BC10 POP {R4}
0010038A B000 ADD SP, SP, #0
0010038C 4770 BX LR
0010038E 0000 ; fill blank
;==================================================================================================
; R0 dest
; R1 source
; R2 byte numbers
memread:
00100390 B410 PUSH {R4}
00100392 0003 LSL R3, R0, #0 ; R3 = R0
00100394 2A00 CMP R2, #0
00100396 D005 BEQ 0x1003A4 ; if (numbers == 0) then return
00100398 780C LDRB R4, [R1, #0] ; R4 byte = [R1]
0010039A 1C49 ADD R1, R1, #1 ; R1 ++
0010039C 701C STRB R4, [R3, #0] ; [R3] = R4
0010039E 1C5B ADD R3, R3, #1 ; R3 ++
001003A0 1E52 SUB R2, R2, #1 ; R2 --
001003A2 D1F9 BNE 0x100398
001003A4 BC10 POP {R4}
001003A6 B000 ADD SP, SP, #0
001003A8 4770 BX LR
;==================================================================================================
无效代码
001003AA 0000 LSL R0, R0, #0
001003AC 0609 LSL R1, R1, #24
001003AE 0E09 LSR R1, R1, #24
001003B0 0003 LSL R3, R0, #0
001003B2 2A00 CMP R2, #0
001003B4 D003 BEQ 0x1003BE
001003B6 7019 STRB R1, [R3, #0]
001003B8 1C5B ADD R3, R3, #1
001003BA 1E52 SUB R2, R2, #1
001003BC D1FB BNE 0x1003B6
001003BE B000 ADD SP, SP, #0
001003C0 4770 BX LR
001003C2 FFFF BL 0x1013C2
;==================================================================================================
INITTAB:
001003C4 000000A8 DW 0x000000A8
001003C8 00200000 DW 0x00200000
001003CC 001003D0 DW 0x001003D0
;==================================================================================================
;==================================================================================================
RAM Functions
;==================================================================================================
check FRDY bit
return AT91C_MC_FSR (0xFFFFFF68)
00200000 2097 MOV R0, #151
00200002 43C0 MVN R0, R0 ; R0 = AT91C_MC_FSR (0xFFFFFF68)
00200004 6800 LDR R0, [R0, #0]
00200006 07C1 LSL R1, R0, #31 ; R1 = AT91C_MC_FSR 的 FRDY bit
00200008 D5FA BPL 0x200000 ; while(! FRDY);
0020000A B000 ADD SP, SP, #0
0020000C 4770 BX LR
0020000E 0000 ; fill blank
;==================================================================================================
unlock flash
; R0 page number
; return lock status
00200010 B500 PUSH {LR}
00200012 219F MOV R1, #159
00200014 43C9 MVN R1, R1 ; R1 = AT91C_MC_FMR(0xFFFFFF60)
00200016 4A23 LDR R2, [PC,#0x08C] ; R2 = [0x2000A4] =0x00300100
00200018 600A STR R2, [R1, #0] ; AT91C_MC_FMR(0xFFFFFF60) = 0x00300100
0020001A 219B MOV R1, #155
0020001C 43C9 MVN R1, R1 ; R1 = AT91C_MC_FCR (0xFFFFFF64)
0020001E 0200 LSL R0, R0, #8 ; R0 = R0 >> 8
00200020 4A1F LDR R2, [PC,#0x07C] ; R2 = [0x2000A0] =0x0003FF00
00200022 4002 AND R2, R0 ; R2 = R0 & 0x0003FF00
00200024 4806 LDR R0, [PC,#0x018] ; R0 = [0x200040] =0x5A000004
00200026 46C0 NOP
00200028 4310 ORR R0, R2 ; R0 = R2 | 0x5A000004
0020002A 6008 STR R0, [R1, #0] ; AT91C_MC_FCR (0xFFFFFF64) = R0 clear lock bit
0020002C F7FF ; pre BL/BLX
0020002E FFE8 BL 0x200000 ; check FRDY bit
00200030 2097 MOV R0, #151
00200032 43C0 MVN R0, R0 ; R0 = AT91C_MC_FSR (0xFFFFFF68)
00200034 6800 LDR R0, [R0, #0]
00200036 0C00 LSR R0, R0, #16
00200038 0400 LSL R0, R0, #16 ; R0 = R0 & 0xFFFF0000 lock status
0020003A BC02 POP {R1}
0020003C 4708 BX R1
0020003E 46C0 NOP
00200040 5A000004 DW 0x5A000004
;==================================================================================================
; R0 dest
; R1 bytes
; R2 source
00200044 B530 PUSH {R4,R5, LR}
00200046 239F MOV R3, #159
00200048 43DB MVN R3, R3 ; R3 = AT91C_MC_FMR(0xFFFFFF60)
0020004A 4C14 LDR R4, [PC,#0x050] ; R4 = [0x20009C] =0x00480100
0020004C 601C STR R4, [R3, #0] ; AT91C_MC_FMR(0xFFFFFF60) = 0x00480100
0020004E 4B11 LDR R3, [PC,#0x044] ; R3 = [0x200094] =0xFFF00000
00200050 18C3 ADD R3, R0, R3 ; R3 = 0xFFF00000 + R0 dest
00200052 09DB LSR R3, R3, #7 ; R3 = R3 >> 7
; e.g. R0 = (0x102000 + 0xFFF00000) >> 7 = 0x40
00200054 2400 MOV R4, #0 ; R4 = 0
;-----------------------------------------------------------
00200056 2901 CMP R1, #1
00200058 DB07 BLT 0x20006A ; if(R1 bytes < 1) then goto 0x20006A
0020005A 6815 LDR R5, [R2, #0] ; read source
0020005C 6005 STR R5, [R0, #0] ; write dest
0020005E 1C64 ADD R4, R4, #1 ; R4 ++
00200060 1D00 ADD R0, R0, #4 ; R0 += 4
00200062 1D12 ADD R2, R2, #4 ; R2 += 4
00200064 1F09 SUB R1, R1, #4 ; R1 -= 4
00200066 2C80 CMP R4, #128
00200068 D3F5 BCC 0x200056 ; if(R4 < 128) then goto 0x200056
;-----------------------------------------------------------
0020006A 209B MOV R0, #155
0020006C 43C0 MVN R0, R0 ; R0 = AT91C_MC_FCR (0xFFFFFF64)
0020006E 0219 LSL R1, R3, #8 ; R1 = R3 << 8
00200070 4A0B LDR R2, [PC,#0x02C] ; R2 = [0x2000A0] =0x0003FF00
00200072 400A AND R2, R1 ; R2 = R1 & 0x0003FF00
00200074 4908 LDR R1, [PC,#0x020] ; R1 = [0x200098] =0x5A000001
00200076 4311 ORR R1, R2 ; R1 = 0x5A000001 | R2
00200078 6001 STR R1, [R0, #0] ; AT91C_MC_FCR (0xFFFFFF64) = R1 write page
0020007A F7FF ; pre BL/BLX
0020007C FFC1 BL 0x200000 ; check FRDY bit
0020007E 210C MOV R1, #12 ; R1 = 0x0C
00200080 4208 TST R0, R1
00200082 D001 BEQ 0x200088
00200084 2000 MOV R0, #0 ; R0 = 0 write flash ok
00200086 E001 B 0x20008C ; return
;-----------------------------------------------------------
00200088 2000 MOV R0, #0
0020008A 43C0 MVN R0, R0 ; R0 = 0xFFFFFFFF = -1 write flash err
;-----------------------------------------------------------
0020008C BC30 POP {R4,R5}
0020008E BC02 POP {R1}
00200090 4708 BX R1
00200092 46C0 ; fill blank
00200094 FFF00000 DW 0xFFF00000
00200098 5A000001 DW 0x5A000001
0020009C 00480100 DW 0x00480100
002000A0 0003FF00 DW 0x0003FF00
002000A4 00300100 DW 0x00300100
;==================================================================================================
;==================================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -