📄 memory.asm
字号:
* 入口参数:A ---- 地址addr,Amsb~A0 *
* Amsb: A16,Flash用SST39VF200时 *
* A17,Flash用SST39VF400时(缺省) *
* A18,Flash用SST39VF800时 *
* Flash定位在程序储存空间80000H~9FFFFH/BFFFFH(缺省)/FFFFFH *
* 地址addr为从0开始的偏移地址,而非Flash的绝对地址 *
* (SP+n) ---- 数据缓冲区起始地址ptr,如果是.far_mode模式则n为2,否则n为1 *
* (SP+m) ---- 数据长度lrngth,如果是.far_mode模式则m为3,否则m为2 *
* 出口参数:A ---- 写入标志 *
* 未写入:00H *
* 已写入:01H *
* 资源使用:B,AR0 *
* *
*********************************************************************************
_flash_writem: PSHM SWWSR ;保存当前的系统等待时间
LDM SWWSR,B
OR #03FH,B ;设置系统为14个等待
STLM B,SWWSR
.if __far_mode
LDU 2H,B
.else
LDU 1H,B
.endif
STLM B,AR0 ; AR0 ← 数据起始地址
writem_loop: PSHM AL ; 保存地址
PSHM AH
.if __far_mode
FRAME -2
LDU *AR0+,B ; 取数据
STL B,0H ; 传递数据
FCALL _flash_writes
RC AEQ ; 未写入,则A = 0,返回
FRAME 2
POPM AH
POPM AL
ADD #ONE,A ; Flash地址+1
ADDM #-1,3H
CMPM 3H,#ZERO
.else
FRAME -1
LDU *AR0+,B ; 取数据
STL B,0H ; 传递数据
CALL _flash_writes
RC AEQ ; 未写入,则A = 0,返回
FRAME 1
POPM AH
POPM AL
ADD #ONE,A ; Flash地址+1
ADDM #-1,2H
CMPM 2H,#ZERO
.endif
BC writem_loop,NTC
LD #1,A ; 已写入,则A = 1,返回
POPM SWWSR
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函数定义:uint _flash_reads(ulong addr) *
* 功 能:从addr指定的Flash单元中读出一个数据 *
* *
* 入口参数:A ---- 地址addr,Amsb~A0 *
* Amsb: A16,Flash用SST39VF200时 *
* A17,Flash用SST39VF400时(缺省) *
* A18,Flash用SST39VF800时 *
* Flash定位在程序储存空间80000H~9FFFFH/BFFFFH(缺省)/FFFFFH *
* 地址addr为从0开始的偏移地址,而非Flash的绝对地址 *
* 出口参数:A ---- 读出数据 *
* 资源使用:A *
* *
*********************************************************************************
_flash_reads: PSHM SWWSR ;保存当前的系统等待时间
LDM SWWSR,B
OR #03FH,B ;设置系统为14个等待
STLM B,SWWSR
OR #Flash_base,16,A
READA *(AL)
POPM SWWSR
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函数定义:void _flash_readm(ulong addr, uint * ptr, uint length) *
* 功 能:从addr指定的Flash单元中读出length数据到ptr所指向的数据缓冲区中 *
* *
* 入口参数:A ---- 地址addr,Amsb~A0 *
* Amsb: A16,Flash用SST39VF200时 *
* A17,Flash用SST39VF400时(缺省) *
* A18,Flash用SST39VF800时 *
* Flash定位在程序储存空间80000H~9FFFFH/BFFFFH(缺省)/FFFFFH *
* 地址addr为从0开始的偏移地址,而非Flash的绝对地址 *
* (SP+n) ---- 数据缓冲区起始地址ptr,如果是.far_mode模式则n为2,否则n为1 *
* (SP+m) ---- 数据长度length,如果是.far_mode模式则m为3,否则m为2 *
* 出口参数:A ---- 读出数据 *
* 资源使用:B,AR0 *
* *
*********************************************************************************
_flash_readm: PSHM SWWSR ;保存当前的系统等待时间
LDM SWWSR,B
OR #03FH,B ;设置系统为14个等待
STLM B,SWWSR
OR #Flash_base,16,A
.if __far_mode
LDU 2H,B
.else
LDU 1H,B
.endif
STLM B,AR0 ; AR0 ← 数据起始地址
readm_loop: READA *AR0+
ADD #ONE,A ; Flash地址+1
.if __far_mode
ADDM #-1,3H
CMPM 3H,#ZERO
.else
ADDM #-1,2H
CMPM 2H,#ZERO
.endif
BC readm_loop,NTC
POPM SWWSR
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函数定义:uint _progm_reads(ulong addr) *
* 功 能:从addr指定的Flash单元中读出一个数据 *
* *
* 入口参数:A ---- 地址addr *
* 出口参数:A ---- 读出数据 *
* 资源使用:A *
* *
*********************************************************************************
_progm_reads: PSHM SWWSR ;保存当前的系统等待时间
LDM SWWSR,B
OR #03FH,B ;设置系统为14个等待
STLM B,SWWSR
READA *(AL)
POPM SWWSR
.if __far_mode
FRET
.else
RET
.endif
*************************************************************************************
* *
* 函数定义:void _progm_readm(ulong addr, uint * ptr, uint length) *
* 功 能:从addr指定的程序空间中读出length数据到ptr所指向的数据缓冲区中 *
* *
* 入口参数:A ---- 地址addr,程序空间的地址 *
* (SP+n) ---- 数据缓冲区起始地址ptr,如果是.far_mode模式则n为2,否则n为1 *
* (SP+m) ---- 数据长度length,如果是.far_mode模式则m为3,否则m为2 *
* 出口参数:A ---- 读出数据 *
* 资源使用:B,AR0 *
* *
*************************************************************************************
_progm_readm: .if __far_mode ;获取数据缓冲区的首址
LDU 2H,B
.else
LDU 1H,B
.endif
STLM B,AR0 ; AR0 ← 数据起始地址
preadm_loop: READA *AR0+
ADD #ONE,A ; 程序空间地址+1
.if __far_mode
ADDM #-1,3H ; 数据区长度-1
CMPM 3H,#ZERO
.else
ADDM #-1,2H
CMPM 2H,#ZERO
.endif
BC preadm_loop,NTC ; 操作是否完成
.if __far_mode
FRET
.else
RET
.endif
*************************************************************************************
* *
* 函数定义:void _progm_writem(ulong addr, uint * ptr, uint length) *
* 功 能:从ptr所指向的数据缓冲区中将length长的数据写入addr指定的程序空间中 *
* *
* 入口参数:A ---- 地址addr,程序空间的地址 *
* (SP+n) ---- 数据缓冲区起始地址ptr,如果是.far_mode模式则n为2,否则n为1 *
* (SP+m) ---- 数据长度length,如果是.far_mode模式则m为3,否则m为2 *
* 出口参数:A ---- 读出数据 *
* 资源使用:B,AR0 *
* *
*************************************************************************************
_progm_writem: .if __far_mode ;获取数据缓冲区的首址
LDU 2H,B
.else
LDU 1H,B
.endif
STLM B,AR0 ; AR0 ← 数据起始地址
pwritem_loop: WRITA *AR0+
ADD #ONE,A ; 程序空间地址+1
.if __far_mode
ADDM #-1,3H ; 数据区长度-1
CMPM 3H,#ZERO
.else
ADDM #-1,2H
CMPM 2H,#ZERO
.endif
BC pwritem_loop,NTC ; 操作是否完成
.if __far_mode
FRET
.else
RET
.endif
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -