📄 pci.asm
字号:
********************************************************************************/
* AD.ASM v1.00 */
* */
*汇编中引用C语言变量时,必需在变量前加下划线. */
******************************************************************
.copy "c3x.inc" ;伪指令:包含另一个源文件在本文件内,
;并显示所包含的源文件的语句
.global _ltopci ;伪指令:在当前文件中定义的符号,
;可以被其他文件引用.
********************************************************************************
* *
* 函数定义:ltopci *
* 功 能:将数据data写入addr所指定的pci单元 *
* *
* 入口参数:AR2 ---- 地址addr,Amsb~A0 *
* *
* R2 ---- PCI的地址 *
* R3 ---- length *
* 出口参数:R0 检测结果的地址 *
* *
* 资源使用:AR1,AR2,R2 *
*AR0-AR1-AR2 存储指针表达式,AR3帧指针(FP),AR4-AR7指针寄存器变量,DP访问全局变量 *
*(只在大模式下).IR0-IR1扩展的帧偏移量. SP堆栈指针.R4,R5是整数型寄存器.R6,R7是
*浮点型寄存器. *
* *
* *
********************************************************************************
.data ;已经初始化的段,常数数据,
;一般用来对变量初始化的数据.
vc33mmr2 .word C3x_MMR ;伪指令定义字 808000H;
pcilmbox .word 040013eH
pcidmacr .word 040012fH
pciramaddr .word 0401000H
;函数徐步存储时,则在堆栈中建立一个工作区,即局部帧,在函数调用是建立,在函数返回时撤销
FP .set AR3 ; FP is AR3 定义一个符号代表常数 ,
;AR3是辅助寄存器(32bit)AR0-AR7
;帧指针FP,指向当前局部帧的开始.局部帧是堆栈的一个区域,用于存储函数传递的变量.
;每一个函数调用的时候都要在栈顶创建一个新的局部帧.
.text ;已经初始化的段,包含可以执行的汇编指令代码.
_ltopci:
.if .REGPARM = 0 ;标准的运行时间模块如果.if后面的常量表达式为真,
;则编译它与.endif之间的代码,否则跳过.
PUSH FP ;将FP寄存器的内容推入当前的系统堆栈,
;SP所指向的内容已经是AR3寄存器中的内容,
;但是SP指针的地址不变
LDI SP,FP ;LDI,装整数指令,把SP操作数(地址)装入FP寄存器
;中SP是一个32位的寄存器用来保持系统栈顶地址.
LDI *-FP(2),AR2 ;AR2寄存器的内容变成了,操作数FP-2所表示的
;存储器中的数据 ,AR2存储参数1
LDI *-FP(3),R2 ;扩展精度寄存器2(R2)的内容变成了
;操作数FP-3所表示的存储器中的内容
;R2主要保存整数和FP表达式 ,R2存储参数2.
LDI *-FP(4),R3 ;扩展精度寄存器3(R3)的内容变成了操作数
;FP-4所表示的存储器中的内容
;R1,R2,R3寄存器在无优化时存储整数和FP表达式.
;R3存储参数3;
.endif ;两者的运行时间模型
.if .BIGMODEL ;编译器支持两种存储模式,大\小存储器模式.默认是小存储器模式
;限制.BSS块的大小
PUSH DP ;DP位数据页指针,是一个32位的寄存器
;大模式下,必须保证DP正确指向目标所在的存储器页,所以在
;每一次访问全局或者静态变量的时候,首先必须用LDP或者LDPK
;指令设置DP寄存器.
LDP @chk_data,DP ;装数据页指针(立即寻址方式),
;LDI指令的另一种替代形式
.endif
PUSH AR0 ;AR0~AR1存储指针表达式,
PUSH AR1
PUSH R1
PUSHF R1 ;将R1内容推入SP+1后所指向的存储器中
OR 6,IOF ;IOF为I/O标志寄存器. 或.
AND 0,IE ;CPU/DMA中断容许寄存器.与.
LDI @vc33mmr2,AR0
LDI (INT_RDY+WAIT_2+BANK_8M),R1
STI R1,*+AR0(STRB0);STI整数存储指令,把存储器R1的内容,
;装入AR0+STRB所指向的寄存器.为系统加入7个等待
LDI R2,AR0
LDI R3,AR1
fill: LDI *AR2++,R1 ;fill为标号,必须从第一列开始, 访问后AR2的地址增加
; LSH -2,R1 ;逻辑移位指令,右移2位.
STI R1,*AR0++
DBU AR1,fill ;
LDI @vc33mmr2,AR0
LDI (INT_RDY+WAIT_3+BANK_8M),R1
STI R1,*+AR0(STRB0) ;为系统加入1个等
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -