📄 boot.asm
字号:
*BOOTLOAD
;boot module
;======================== boot.asm =========================
;
.mmregs
.def erase_flash,prog_flash,boot_table
.text
*******************************************************
;;; .bss io_map,1
.bss adder,1
.bss byte_h,1
.bss byte_l,1
.bss x,1
erase_flash:
;;; ST #0,*(io_map)
;;; PORTW *(io_map) ,0x8000
;A[19:15]=00000 reference the datasheet page 7,Chip_erase
ST #0xaa,*(0xd555) ;AAH--->5555H first Bus write cycle
nop
nop
ST #0x55,*(0xaaaa) ;55H--->2AAAH 2st Bus write cycle
nop
nop
ST #0x80,*(0xd555) ;80H--->5555H
nop
nop
ST #0xaa,*(0xd555) ;AAH--->5555H
nop
nop
ST #0x55,*(0xaaaa) ;55H--->2AAAH
nop
nop
ST #0x10,*(0xd555) ;10H--->5555H 6st Bus write cycle
STM #200,AR1
erase_loop:
RPT #(50000-1) ;Delay for erease flash end
NOP
NOP
BANZ erase_loop,*AR1-
RET
********************************************************
prog_flash:
ST #(0x2000-8),*(adder) ;源地址,2000-8开始的地方放的是boot_table,
;2000放的是用户代码
STM #(0x2000+8+2),AR3 ;长度:前面加了8个boot_table数据,后面加了两个0
STM #0x8000,AR2 ;目标地址
prog1:
LD *(adder),A ;将需要写进FLASH的源地址写到A中
ADDM #1,*(adder)
READA *(byte_l) ;取出源地址中的数据
;以下为flash
;;------------16位方式,只要一种方式就行。这里只用写一个字。
;;; ;参见datasheet中Byte_program命令
;;;
ST #0xaa,*(0xd555) ;AAH--->5555H
nop
nop
ST #0x55,*(0xaaaa) ;55H--->2AAAH
nop
nop
ST #0xa0,*(0xd555) ;A0H--->5555H
prog_lw:
MVKD *(byte_l),*AR2
RPT #(1000-1)
NOP
prog_lr:
MVDK *AR2,*(x)
LD *(byte_l),A
XOR *(x),A
AND #0x80,A
BC prog_lr,ANEQ
LD *AR2+,A ;AR2++
*------------------------------------------------------
BANZ prog1,*AR3-
*-------------------------------------------------------
*write 0x8000---->0xffff ;BOOT程序首先读入外部数据区0xffff的
;内容作为代码存放源地址
* ;这里是0x8000
STM 0xffff,AR2
nop
nop
ST #0xaa,*(0xd555) ;AAH--->5555H
nop
nop
ST #0x55,*(0xaaaa) ;55H--->2AAAH
nop
nop
ST #0xa0,*(0xd555) ;A0H--->5555H
prog_hw2:
ST 0x8000,*(byte_h)
MVKD *(byte_h),*AR2
RPT #(1000-1)
NOP
prog_hr2:
MVDK *AR2,*(x)
LD *(byte_h),A
XOR *(x),A
AND #0x80,A
BC prog_hr2,ANEQ
RET
*********************************************************
boot_table:
STM #(0x2000-8),AR3
RPT #(8-1)
MVPD #boot1,*AR3+ ;将boot_table的8个数据防到1ff8~2000,以和用户代码形成连续地址,方便搬移处理
STM #(0x2000+0x1000),AR3
RPT #(2-1)
ST #0,*AR3+ ;写2个0作为结束符
RET
boot1:
.data ;boot_table的含义请参见相关书籍(8位并行方式,参见P341张伟雄)
.word 0x10aa,0x7e08,0xf800,0x0000
.word 0x2000,0x1000,0x0000,0x2000
*先读I/O的0xffff处,如不是再读DATA的0Xffff处的
*0x08aa;0x08aa为8位并行引导标识,0x10aa为16位并行引导标识。
*0x7e08;等待状态SWWSR
*0xf800;BSCR
*0x0000;ENTER POINT(XPC)
*0x2000;ENTER POINT(PC)
*0x1000;SIZE(LONGTH) OF FIRST SECTION
*0x0000;DESTINATION OF FIRST SECTION (XPC)
*0x2000;DESTINATION OF FIRST SECTION (PC)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -