|
??下面是本人在开发MotorolaP2kNepture系列软件时用到的
??Bootloader汇编程序,只要在AD1.2编译通过后
??读懂前,你需学习一下ARM7的汇编指令及一些基础
??希望你对你学习ARM有帮助
??BootBaseAddress=0x1fd0000
??ALBUN00PROC
??MOVSP,CONSTSP
??MOVR7,USBBF00
??MOVR9,WATCHDG
??CALLINITILS;InitCPU_USBinterface
??SS06:CALLGETBYTS;ReadCommandfromPC
??CMPR0,0041h
??BEQACKNOWS
??CMPR0,0049h
??BEQFLASHID
??CMPR0,0052h
??BEQREADMEM
??CMPR0,0046h
??BEQFLASHES
??CMPR0,0050h
??BEQRPDSBLS
??CMPR0,0051h
??BEQFPDSBLS
??CMPR0,0058h
??BEQUNLOCKS
??CMPR0,005Ah
??BEQPOWERDW
??MOVR0,0010h
??LEAR8,MESSG00
??CALLPUTBUFS
??MOVR0,0000h
??CALLPUTBUFS
??JMPSS06
??ALBUN00ENDP
??MESSG00DB'UnknownCommand',00
??MESSG01DB'R',00
??MESSG03DB'OK',00,00
??MESSG04DB'Err',00
??UNLOCKSPROC;unlock
??UNLOCKSENDP
??CONST50DD5044535Fh
??MOVEPRSPROC
??MOVR2,002000h
??MOVR0,CONST23
??ADDR1,SP,64
??SS13:MOVWR3,[R0]
??MOVW[R1],R3
??ADDR0,R0,02
??ADDR1,R1,02
??SUBR2,R2,02
?? CMP R2,00
?? JNZ SS13
?? RET
??MOVEPRS ENDP
??POWERDW PROC ;power off
?? SUB R9,R9,02
?? MOVW R0,[R9]
?? MOV R1,0000h
?? MOV R2,0021h
?? SUB R1,R1,R2
?? SUB R1,R1,01
?? AND R0,R0,R1
?? MOVW [R9],R0
??PW00: JMP PW00
??POWERDW ENDP
??ACKNOWS PROC
?? MOV R0,0001h
?? LEA R8,MESSG01
?? CALL PUTBUFS
?? JMP SS06
??ACKNOWS ENDP
??FPDSBLS PROC
?? MOV R2,00DAh
?? CALL READFLS
??
?? MOV R1,0000h
?? MOV R0,8000h
?? MOV CONST23,R0
?? MOV CONST27,R1
??SN00: CALL MOVEPRS
?? MOV R0,CONST26
?? MOV R1,CONST22
?? CALL FINDBLS
?? JNZ SN01
??
?? MOV R0,CONST23
?? ADD R9,SP,66
?? SUB R0,R8,R0
?? ADD R9,R9,R0
?? MOV R0,CONST20
?? MOV R1,CONST22
?? MOV R6,RAMBUFS
?? ADD R6,R6,28h
?? CALL FINDBLS
?? JNZ SN02
?? SUB R6,R6,28h
?? MOV R2,0020h
?? CALL MOVEBLS
??SN02: MOV R0,CONST24
?? MOV R1,CONST22
?? ADD R6,R6,28h
?? CALL FINDBLS
?? JNZ SN03
?? SUB R6,R6,28h
?? MOV R2,0020h
?? CALL MOVEBLS
??SN03: MOV R0,CONST25
?? MOV R1,CONST22
?? CALL FINDBLS
?? JNZ SN04
?? MOV R2,0080h
?? CALL MOVEBLS
??
??SN04: MOV R5,CONST23
?? CALL ERASERS
?? ADD R4,SP,64
?? MOV R6,2000h
??SS31: CALL FLASHWD
?? CMP R6,00
?? JNZ SS31
?? CALL SETREAD
?? MOV R0,CONST27
?? ADD R0,R0,01
?? MOV CONST27,R0
??
??SN01: MOV R0,CONST23
?? MOV R1,2000h
?? ADD R0,R0,R1
?? MOV CONST23,R0
?? CMP R0,10000h
?? JNZ SN00
?? CALL INITILS
?? MOV R0,CONST27
?? MOV R9,WATCHDG
?? CMP R0,0000h
?? BEQ SS25
?? MOV R0,0002h
?? LEA R8,MESSG03
?? CALL PUTBUFS
?? JMP SS06
??FPDSBLS ENDP
??FINDSND PROC
?? PUSH LR
?? MOV R2,8000h
?? MOV CONST23,R2
?? MOV CONSTT0,R0
?? MOV CONSTT1,R1
??SN07: MOV R0,CONSTT0
?? MOV R1,CONSTT1
?? CALL FINDBLS
?? BEQ SN06
?? MOV R0,2000h
?? MOV R2,CONST23
?? ADD R2,R2,R0
?? MOV CONST23,R2
?? CMP R2,10000h
?? JNZ SN07
?? MOV R0,01
?? JMP SN08
??SN06: CALL SENDBLS
?? MOV R0,00
??SN08: CMP R0,00
?? POP PC
??FINDSND ENDP
??RPDSBLS PROC
?? MOV R0,CONST20
?? MOV R1,CONST21
?? MOV R6,002Ah
?? CALL FINDSND
?? JNZ SS25
??
?? MOV R0,CONST24
?? MOV R1,CONST21
?? MOV R6,002Ah
?? CALL FINDSND
?? JNZ SS25
??
?? MOV R0,CONST25
?? MOV R1,CONST21
?? MOV R6,008Ah
?? CALL FINDSND
?? JNZ SS25
?? MOV R0,CONST20
?? MOV R1,CONST22
?? MOV R6,002Ah
?? CALL FINDSND
?? JNZ SS25
??
?? MOV R0,CONST24
?? MOV R1,CONST22
?? MOV R6,002Ah
?? CALL FINDSND
?? JNZ SS25
??
?? MOV R0,CONST25
?? MOV R1,CONST22
?? MOV R6,008Ah
?? CALL FINDSND
?? JNZ SS25
?? MOV R0,CONST26
?? MOV R1,CONST22
?? MOV R6,0004h
?? CALL FINDSND
?? JNZ SS25
?? JMP SS06
??
??SS25: MOV R0,0004h
?? LEA R8,MESSG04
?? CALL PUTBUFS
?? JMP SS06
??RPDSBLS ENDP
??MOVEBLS PROC
?? MOV R0,CONST23
?? ADD R1,SP,66
?? SUB R0,R8,R0
?? ADD R1,R1,R0
?? MOV R0,0000h
?? MOVW R4,[R9]
?? SUB R0,R0,R4
?? SUB R0,R0,01
??SS14: MOVW R3,[R6]
?? MOVW R4,[R1]
?? MOVW [R1],R3
?? SUB R0,R0,R4
?? ADD R0,R0,R3
?? ADDS R6,R6,02
?? ADDS R1,R1,02
?? SUBS R2,R2,02
?? JNZ SS14
?? MOV R4,0000h
?? SUB R4,R4,R0
?? SUB R4,R4,01
?? MOVW [R9],R4
?? ADD R6,R6,08
?? RET
??MOVEBLS ENDP
??SENDBLS PROC
?? PUSH LR
??SS26: MOV R0,0010h
?? CMP R6,000Fh
?? BHI SS27
?? MOV R0,R6
??SS27: CALL PUTBUFS
?? CMP R6,000Fh
?? BLS SS28
?? SUB R6,R6,16
?? JMP SS26
??SS28: CMP R6,0010h
?? MOV R0,0000h
?? CALLZ PUTBUFS
?? POP PC
??SENDBLS ENDP
??FINDBLS PROC
?? MOV R2,01
?? MOV R5,002000h
?? MOV R8,CONST23
??SS24: MOVW R3,[R8]
?? ADD R8,R8,02
?? SUB R5,R5,02
?? CMP R0,R3
?? JNZ SS23
?? MOVW R3,[R8]
?? CMP R1,R3
?? BEQ SS22
??SS23: CMP R5,00
?? JNZ SS24
?? MOV R2,00
??SS22: CMP R2,01
?? RET
??FINDBLS ENDP
??READMEM PROC;Read Flash ROM
?? CALL GETDWOD
?? MOV R8,R6
?? CALL GETDWOD
?? CMP R6,1000h
?? BLS SS12
?? MOV R6,1000h
??SS12: CALL SENDBLS
?? JMP SS06
??READMEM ENDP
??FLASHES PROC ;Flash IC data
?? CALL GETDWOD
?? CALL GETLENS
?? CALL PUTDWOD
?? CMP R2,0000
?? BEQ SS06
?? CALL READFLS
?? CALL ERASERS
?? CALL DOFLASS
?? CALL SETREAD
?? MOV R0,0002h
?? LEA R8,MESSG03
?? CALL PUTBUFS
?? JMP SS06
??FLASHES ENDP
??SETREAD PROC
?? MOV R1,00FFh
?? MOVW [R5],R1
?? RET
??SETREAD ENDP
??DOFLASS PROC
?? PUSH LR
?? PUSH R5
?? MOV R8,R6
?? MOV R4,RAMBUFS
??FS00: CALL FLASHWD
?? CMP R6,00
?? JNZ FS00
?? POP R5
?? POP PC
??DOFLASS ENDP
??FLASHWD PROC
?? MOV R0,FLASSID
?? CMP R0,0020h
?? BEQ FLASS20
?? CMP R0,0089h
?? JNZ FLASS01
?? JMP FLASS89
??FLASHWD ENDP
??FLASS89 PROC
?? MOV R2,R5
?? MOV R0,00E8h
?? MOV R1,0070h
?? MOVW [R5],R0
??FS03: MOVW R0,[R5]
?? ANDS R0,R0,80h
?? BEQ FS03
?? MOV R0,001Fh
?? MOVW [R5],R0
??FS02: MOVW R3,[R4]
?? MOVW [R5],R3
?? ADD R5,R5,02
?? ADD R4,R4,02
?? SUB R6,R6,02
?? SUB R0,R0,01
?? AND R0,R0,31
?? CMP R0,31
?? JNZ FS02
?? MOV R0,00D0h
?? MOVW [R2],R0
?? MOVW [R2],R1
??FS01: MOVW R0,[R2]
?? ANDS R0,R0,80h
?? BEQ FS01
?? RET
??FLASS89 ENDP
??FLASS20 PROC
?? MOV R0,0040h
?? MOV R1,0070h
?? MOV R2,0F80000h
?? AND R2,R2,R5
?? MOVW [R2],R0
?? MOVW R3,[R4]
?? MOVW [R5],R3
?? ADD R5,R5,02
?? ADD R4,R4,02
?? SUB R6,R6,02
?? MOVW [R2],R1
??FS04: MOVW R0,[R2]
?? ANDS R0,R0,80h
?? BEQ FS04
?? RET
??FLASS20 ENDP
??ERASERS PROC
?? MOV R0,FLASSID
?? CMP R0,0020h
?? BEQ ERASS89
?? CMP R0,0089h
?? JNZ ERASS01
?? JMP ERASS89
??ERASERS ENDP
??ERASS89 PROC
?? MOV R0,0020h
?? MOV R3,0060h
?? MOV R1,00D0h
?? MOVW [R5],R3
?? MOVW [R5],R1
?? MOVW [R5],R0
?? MOVW [R5],R1
?? MOV R1,0070h
?? MOVW [R5],R1
??ER00: MOVW R0,[R5]
?? ANDS R0,R0,80h
?? BEQ ER00
?? RET
??ERASS89 ENDP
??MESSG02 DB 'N',00
??ERASS01 PROC
?? RET
??ERASS01 ENDP
??FLASS01 PROC
?? RET
??FLASS01 ENDP
??GETLENS PROC
?? PUSH LR
?? MOV R0,800000h
?? MOV R1,CONST30
?? AND R4,R6,R0
?? AND R0,R6,R0
?? AND R6,R6,R1
?? CALL GETFLID
?? MOVB R0,[R8+01]
?? MOVB R1,[R8+03]
?? CMP R0,0020h
?? JNZ SS33
?? CMP R1,0011h
?? BEQ SS32
?? CMP R1,0010h
?? JNZ SS33
??
?? MOV R2,010000h
?? MOV R0,ROMSEND
?? CMP R0,R6
?? BHI SS16
?? MOV R2,002000h
?? MOV R0,ROM0END
?? CMP R0,R6
?? BHI SS16
?? JMP SS33
??
??SS32: MOV R2,002000h
?? MOV R0,010000h
?? CMP R0,R6
?? BHI SS16
?? MOV R2,010000h
?? MOV R0,ROM0END
?? CMP R0,R6
?? BHI SS16
??SS33: MOV R2,00
??SS16: MOV R5,R4
?? ADD R5,R5,R6
?? MOV R6,R2
?? POP PC
??GETLENS ENDP
??READFLS PROC;Read Flash Data & send to PC
?? PUSH LR
?? PUSH R5
?? PUSH R6
?? MOV R4,RAMBUFS
?? MOV R6,0000h
??SS19: MOV R5,0400h
??SS18: CALL GETBYTS
?? MOVB [R4],R0
?? ADD R6,R6,R0
?? ADD R4,R4,01
?? SUB R2,R2,01
?? SUB R5,R5,01
?? CMP R2,00
?? BEQ SS30
?? CMP R5,00
?? JNZ SS18
?? MOV R0,01
?? LEA R8,MESSG02
?? CMP R2,00
?? JNZ SS20
??SS30: MOV R0,04
?? LEA R8,CONSTBF
?? ADD R8,R8,0064
?? MOV [R8],R6
??SS20: CALL PUTBUFS
?? CMP R2,00
?? JNZ SS19
?? POP R6
?? POP R5
?? POP PC
??READFLS ENDP
??FLASHID PROC ;Send Flash IC to PC
?? MOV R0,ROM0BEG
?? CALL GETFLID
?? MOV R1,004Fh
?? MOV R2,004Bh
?? MOVB [R8+04],R1
?? MOVB [R8+05],R2
?? MOV R0,0006h
?? CALL PUTBUFS
?? JMP SS06
??FLASHID ENDP
??GETFLID PROC ;Read the flash IC 'DevID and ManID
?? MOV R3,0055h
?? MOV R1,00AAh
?? MOV R5,0090h
?? MOV R11,CONST55
?? MOV R12,CONSTAA
?? LEA R8,CONSTBF
?? ADD R11,R11,R0
?? ADD R12,R12,R0
?? ADD R8,R8,032
??
?? MOVW [R12],R1
?? MOVW [R11],R3
?? MOVW [R12],R5
?? MOVB R5,[R0+00]
?? MOVB [R8+00],R5
?? MOVB R5,[R0+01]
?? MOVB [R8+01],R5
?? MOVB R5,[R0+02]
?? MOVB [R8+02],R5
?? MOVB R5,[R0+03]
?? MOVB [R8+03],R5
?? MOV R5,00FFh
?? MOVW [R0],R5
?? RET
??GETFLID ENDP
??GETBYTS PROC;Get Bytes from PC
?? PUSH R2
?? PUSH R4
??SS17: MOV R2,CINDEXO
?? MOV R1,RINDEXO
?? CMP R2,R1
?? JNZ SS05
??
??SS10: MOV R0,CONSTWD
?? MOVW [R9],R0
?? ADD R0,R0,R0
?? MOVW [R9],R0
?? MOVW R0,[R7+04]
?? ANDS R0,R0,20h
?? BEQ SS10
?? MOVW R0,[R7+10]
?? ANDS R0,R0,40h
?? BEQ SS01
?? MOVW R0,[R7+10]
?? ORR R0,R0,800h
?? MOVW [R7+10],R0
?? JMP SS10
??SS01: MOVW R2,[R7+10]
?? AND R2,R2,01Fh
?? ADD R3,R7,090h
?? LEA R0,CONSTBF
?? MOV R1,RINDEXO
?? ADD R4,R1,R0
??SS09: CMP R2,0000h
?? BEQ SS08
?? MOVB R0,[R3]
?? MOVB [R4],R0
?? ADD R1,R1,01
?? SUB R2,R2,01
?? ADD R3,R3,01
?? ADD R4,R4,01
?? CMP R1,0020h
?? JNZ SS09
?? LEA R4,CONSTBF
?? MOV R1,0000h
?? JMP SS09
??SS08: MOV RINDEXO,R1
?? MOVW R1,[R7+10]
?? ORR R1,R1,2000h
?? MOVW [R7+10],R1
?? JMP SS17
??
??SS05: LEA R0,CONSTBF
?? ADD R0,R0,R2
?? MOVB R0,[R0]
?? ADD R2,R2,01
?? MOV CINDEXO,R2
?? CMP R2,0020h
?? JNZ SS07
?? MOV R2,0000h
?? MOV CINDEXO,R2
??SS07: POP R4
?? POP R2
?? RET
??GETBYTS ENDP
??PUTBUFS PROC;Send string buffer to PC
?? PUSH R2
?? PUSH R4
?? PUSH R5
??SS11: MOVW R1,[R7+04]
?? ANDS R1,R1,040h
?? JNZ SS00
?? MOVW R1,[R7+12]
?? ANDS R1,R1,400h
?? JNZ SS11
??
??SS00: MOV R4,R0
?? MOV R5,R7
??SS03: MOVB R2,[R8+00]
?? MOV R2,R2,LSL 08
?? CMP R0,01
?? BEQ SS02
?? CMP R0,00
?? BEQ SS04
?? MOVB R3,[R8+01]
?? ORRS R2,R2,R3
??SS02: MOVW [R5+160],R2
?? ADDS R5,R5,02
?? ADDS R8,R8,02
?? SUBS R0,R0,01
?? BEQ SS04
?? SUBS R0,R0,01
?? JNZ SS03
??
??SS04: MOVW R0,[R7+12]
?? MOV R0,R0,LSR 05
?? MOV R0,R0,LSL 05
?? ORR R0,R0,R4
?? MOVW [R7+12],R0
?? MOV R1,2000h
?? MOVW R0,[R7+12]
?? ORR R0,R0,R1
?? MOVW [R7+12],R0
?? MOV R1,0400h
?? MOVW R0,[R7+12]
?? ORR R0,R0,R1
?? MOVW [R7+12],R0
?? POP R5
?? POP R4
?? POP R2
?? RET
??PUTBUFS ENDP
??INITILS PROC
?? RET
??INITILS ENDP
??GETDWOD PROC;Get DWORD from PC
?? PUSH LR
?? CALL GETBYTS
?? MOV R6,R0
?? CALL GETBYTS
?? ORR R6,R0,R6,LSL 08
?? CALL GETBYTS
?? ORR R6,R0,R6,LSL 08
?? CALL GETBYTS
?? ORR R6,R0,R6,LSL 08
?? POP PC
??GETDWOD ENDP
??PUTDWOD PROC;Send DWORD to PC
?? PUSH LR
?? LEA R8,CONSTBF
?? ADD R8,R8,040h
?? MOV [R8],R6
?? MOV R0,0004
?? CALL PUTBUFS
?? POP PC
??PUTDWOD ENDP
??CONST55 DD 00000554h;
??CONSTAA DD 00000AAAh;
??ROM0BEG DD 00000000h
??ROM0END DD 00800000h
??ROMSEND DD 00FF0000h
??CONST30 DD 007FFFFFh
??RAMBUFS DD 01FE0000h
??CONSTWD DD 00005555h
??CINDEXO DD 00000000h
??RINDEXO DD 00000000h
??USBBF00 DD 22820000h
??WATCHDG DD 21811002h
??CONSTSP DD 01FD4000h
??FLASSID DD 00000020h
??CONST23 DD 00008000h
??CONST27 DD 00000000h
??CONST20 DD 000001C3h
??CONST24 DD 000001C4h
??CONST25 DD 000001C5h
??CONST26 DD 0000029Eh
??CONST21 DD 0000FFF0h
??CONST22 DD 0000FFF9h
??CONSTT0 DD 00000000h
??CONSTT1 DD 00000000h
??CONSTBF DB 00
??END |
|