📄 bootload.asm
字号:
.def _c_int00
.mmregs
SWCR .set 2BH
Flash_a1 .set 08555H
Flash_a2 .set 082AAH
Flash_offset .set 0h
Flash_page .set 0h
Code_addr .set 1500h
Code_length .set 2200h
Flash_addr .set 8000h
STACK .usect "STK",100
.bss Temp,1
.text
_c_int00:
SSBX CPL
RSBX SXM
STM #7FFFH,SWWSR
STM #0ffe3H,PMST
STM #0FFFEH,SWCR
STM #STACK+100h,sp ;设置堆栈指针
LD #00h,dp
STM #0b, CLKMD ;switch to DIV mode
TstStatu:
LDM CLKMD, A
AND #01b, A ;poll STATUS bit
BC TstStatu, ANEQ
STM #1111001111101111b, CLKMD ;switch to PLL
RPT #1000
NOP
STM #0000h,imr ;屏蔽所有中断
;初始化cpu完毕
CALL Flash_erasechip
STM #15H,AR2
DELAY
START_PROG: ;开始烧写FLASH
ST #0, *(Temp)
STM #Flash_addr,AR4 ;设置FLASH的开始烧写的地址
STM #Code_addr,AR3 ;被烧写的源程序起始地址
STM #Code_length-1,BRC ;写入的字节数
RPTB LOOP1
CALL Flash_writes ;烧写FLASH
NOP
NOP
LOOP1: NOP
STM #0FFFFH,AR4 ;向数据空间的FFFF地址写入自举表的首地址8000H
CALL Flash_writeword
NOP ;烧写结束
NOP
STM #Flash_addr,AR3
LD #0,B
STM #Code_length-1,BRC ;校验
RPTB LOOP2
ADD *AR3+, B
NOP
LOOP2:
NOP
STL B,*(AR2)
LD #0, B
LD *(AR2),B
NOP
NOP
SUB *(Temp),B
BC ERROR,BNEQ
RIGHT
B $
ERROR
B START_PROG
*********************************************************************************
*********************************************************************************
* FLASH的操作 *
*********************************************************************************
Flash_erasechip:;擦除Flash
STM #Flash_a1,AR2
NOP
NOP
ST #0AAH,*AR2 ; AAH -> (8555H)
NOP
NOP
STM #Flash_a2,AR2
NOP
NOP
ST #055H,*AR2 ; 55H -> (82AAH)
NOP
NOP
STM #Flash_a1,AR2
NOP
NOP
ST #080H,*AR2 ; 80H -> (8555H)
NOP
NOP
STM #Flash_a1,AR2
NOP
NOP
ST #0AAH,*AR2 ; AAH -> (8555H)
NOP
NOP
STM #Flash_a2,AR2
NOP
NOP
ST #055H,*AR2 ; 55H -> (82AAH)
NOP
NOP
STM #Flash_a1,AR2
NOP
NOP
ST #010H,*AR2 ; 10H -> (8555H)
NOP
NOP
RET
Flash_writes:
STM #Flash_a1,AR2
NOP
NOP
ST #0AAh,*AR2 ; AAH -> (8555H)
NOP
NOP
STM #Flash_a2,AR2
NOP
NOP
ST #055H,*AR2 ; 55H -> (82AAH)
NOP
NOP
STM #Flash_a1,AR2
NOP
NOP
ST #0A0h,*AR2 ; A0H -> (8555H)
NOP
NOP
LD *AR3, A
NOP
NOP
NOP
NOP
STL A, *AR4
NOP
NOP
RPT #01200h
NOP
CALL Check_Toggle_Ready
LD *(Temp),A
ADD *AR3+,A
STL A,*(Temp)
RET
Check_Toggle_Ready: ;need A has been stored in the destination address
LD *AR4, A
AND #0x4040,A
LoopTog: NOP
NOP
LD *AR4+,B
AND #0x4040,B
NOP
NOP
SUB A,B
BC LoopTog,BNEQ
NOP
NOP
RET
Flash_writeword:
STM #Flash_a1,AR2
NOP
NOP
ST #00AAh,*AR2 ; AAH -> (8555H)
NOP
NOP
STM #Flash_a2,AR2
NOP
NOP
ST #0055H,*AR2 ; 55H -> (82AAH)
NOP
NOP
STM #Flash_a1,AR2
NOP
NOP
ST #00A0h,*AR2 ; A0H -> (8555H)
NOP
NOP
LD #8000H, A
STL A, *AR4
NOP
NOP
RPT #01200h
NOP
CALL Check_Toggle_Ready
NOP
NOP
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -