?? 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 + -