/*------------------------------------------------------------ HotC51汇编数组定义头文件(HotAsm.h V1.05) 最初建立时间: 2009.2.18 最近修改时间: 2009.3.2 (可以正式 PK MCS51汇编指令集) 增 添原 因: 为全面支持裸奔式实时操作系统HotTask51做准备 并替代年代久远的HotIns.h/c(不在HotTask51下使用) 应 用: 可以用COM接口技术对HotC51汇编数组进行封装
菜农HotPower@126.com 2008.3.2 于西安大雁塔村农会 ---------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------------ HotASM51汇编数组指令集与MCS51汇编指令集对照表 DB(x) DB(0~0xff) //伪指令 asm_DB(250),asm_DB('1'), db 250; DW(x) DW(0~0xffff)//伪指令 asm_DW(0x1234),//大端 dw 0x1234; dw(x) dw(0~0xffff)//伪指令 asm_dw(0x1234),//小端 dw 0x3412; Rn(x) Rn(0~7) asm_MOV_A_R0(), asm_MOV_A_Rn(5), mov a,r0;mov a,r5; @ iRn(x) iRn(0~1) asm_MOV_A_iR1(), asm_MOVX_iRn_A(0), mov a,@r1;movx @r0,a; ! BIT(x) BIT(0~0x7f, 0x80~0xff) asm_CLR_BIT(0x30),asm_SETB_P0_0(), clr 30h;setb p0.0; & REG(x) REG(0~0x7f, 0x80~0xff) asm_MOV_REG_A(HotASM_B),asm_MOV_B_A(), mov b,a; # DATA(x) DATA(0~0xff, 0~0xffff) asm_MOV_A_DATA(250),asm_MOV_A(250) mov a,#250; -------------------------------------------------------------------------------------------------*/
#include "hotcom.h" /*-------------------------------------- HotTask51汇编数组调用函数库 --------------------------------------*/
/*--------------------------------------------- HotTask51系统启动函数 void __HotASM_START__(void) 入口: 无 Keil DPTR = &__HotASM_START__[0] R2D1 = DPTR 出口: 无 结果: 二次RETI后继续执行 特点: 本“函数”可以“动态加载” -----------------------------------------------*/ HotASM (__HotASM_START__)//(void) {//DPTR保存的是汇编数组函数的首地址__HotASM_START__ #define lable__HotASM_START__Exit \ (\ size_CLR_A()\ + size_MOV_REG_A()\ + size_JZ()\ + size_LJMP()\ + 2 * size_MOV_A_REG()\ + 2 * size_ADD_A()\ + 2 * size_PUSH_REG()\ ) asm_CLR_A(), asm_MOV_IE_A(),//关中断 asm_JZ(size_LJMP() - 1),//NOP() asm_LJMP(0x5500),// asm_MOV_A_DPL(), asm_ADD_A(lable__HotASM_START__Exit),//__HotASM_START__0 asm_PUSH_ACC(),//压入跳入地址__HotASM_START__0低8位 asm_MOV_A_DPH(),// asm_ADDC_A(0), asm_PUSH_ACC(),//压入跳入地址__HotASM_START__0高8位 //lable__HotASM_START__Exit: asm_RETI()//(连续调用RETI二次) };
/*--------------------------------------------- HotTask51软件复位函数 void __HotASM_RESET__(void) 入口: 无 Keil DPTR = &__HotASM_RESET__[0] R2D1 = DPTR 出口: 无 结果: 二次RETI后跳入0x0000 特点: 本“函数”可以“动态加载” -----------------------------------------------*/ HotASM (__HotASM_RESET__)//(void) {//DPTR保存的是汇编数组函数的首地址__HotASM_RESET__ #define lable__HotASM_RESET__Exit \ (\ size_CLR_A()\ + size_MOV_REG_A()\ + size_JZ()\ + size_LJMP()\ + 2 * size_MOV_A_REG()\ + 2 * size_ADD_A()\ + 2 * size_PUSH_REG()\ + size_RETI()\ ) asm_CLR_A(), asm_MOV_IE_A(),//关中断 asm_JZ(size_LJMP() - 1),//NOP() asm_LJMP(0xaa00),// asm_MOV_A_DPL(), asm_ADD_A(lable__HotASM_RESET__Exit),//lable__HotASM_RESET__0 asm_PUSH_ACC(),//压入跳入地址lable__HotASM_RESET__0低8位 asm_MOV_A_DPH(),// asm_ADDC_A(0), asm_PUSH_ACC(),//压入跳入地址lable__HotASM_RESET__0高8位 asm_RETI(),//顺序执行下句!!!(调用RETI) //lable__HotASM_RESET__Exit: asm_CLR_A(), asm_PUSH_ACC(),//压入复位地址低8位 asm_PUSH_ACC(),//压入复位地址高8位 asm_RETI()//跳入复位地址处 };
/*--------------------------------------------- HotTask51软中断函数 void __HotASM_ISR__(unsigned char isrNum) 入口: R7 D4D3 中断向量组号 D2D1D0 中断向量号 出口: R7 isrNum 结果: 跳入对应的中断地址 isrNum * 8 + 3 -----------------------------------------------*/ HotASM (__HotASM_ISR__)//(unsigned char isrNum) {//DPTR保存的是汇编数组函数的首地址__HotASM_ISR__ #define lable__HotASM_ISR__Exit \ (\ + 3 * size_RL_A()\ + size_ORL_A()\ + size_CLR_BIT()\ + 2 *size_PUSH_REG()\ + size_CLR_A()\ ) asm_CJNE_R7(0x20, size_SJMP() - 1),//mov a,R7 asm_MOV_A(0xEF),//mov a,0xef// asm_JNC(lable__HotASM_ISR__Exit),//非法软中断号>(0~0x1f) asm_RL_A(), asm_RL_A(), asm_RL_A(), asm_ORL_A(0x03), asm_CLR_ACC_2(), asm_PUSH_ACC(),//压入中断地址低8位 asm_CLR_A(), asm_PUSH_ACC(),//压入中断地址高8位 //lable__HotASM_ISR__Exit: asm_RET()//跳入对应的中断地址 isrNum * 8 + 3 };
code const IHotAsmCom_Interface comFunction =//物理分配的COM接口 { //装配函数 void START(void); (pHotAsmFunction)__HotASM_START__,// //装配函数 void RESET(void); (pHotAsmFunction)__HotASM_RESET__,// //装配函数 void ISR(unsigned char); (pHotAsm_uchar_Function)__HotASM_ISR__,// };
#include "hottask51.h"
#ifndef __HOTCOM_H__ #define __HOTCOM_H__ #ifdef __cplusplus extern "C" { #endif //-------- <<< Use Configuration Wizard in Context Menu >>> -----------------
/*-------------------------------------- HotTask51汇编数组调用函数接口定义 --------------------------------------*/ #define interface typedef struct//COM接口定义
typedef void (*pHotAsmFunction)(void);//函数指针 typedef void (*pHotAsm_uchar_Function)(unsigned char);//函数指针
/*-------------------------------------------- 声明外部“汇编数组函数” --------------------------------------------*/ extern_HotASM(__HotASM_START__); extern_HotASM(__HotASM_RESET__); extern_HotASM(__HotASM_ISR__);
/*-------------------------------------------- 定义COM接口 --------------------------------------------*/ //com函数指针表 interface { //声明函数 void START(void); const void (*START)(void); //声明函数 void RESET(void); const void (*RESET)(void); //声明函数 void ISR(unsigned char); const void (*ISR)(unsigned char); }IHotAsmCom_Vtbl_Interface, *pIHotAsmCom_Vtbl_Interface;
//com函数调用的com接口 interface { const IHotAsmCom_Vtbl_Interface Vtbl;//com函数指针表 }IHotAsmCom_Interface, *pIHotAsmCom_Interface;
/*-------------------------------------------- 声明COM接口 --------------------------------------------*/ //最好在最后声明 extern code const IHotAsmCom_Interface comFunction;
//------------- <<< end of configuration section >>> ----------------------- #ifdef __cplusplus } #endif #endif//__HOTCOM_H__
//main.c #include "hottask51.h" #include "hotasm.h" void main() { comFunction.Vtbl.START(); comFunction.Vtbl.ISR(HOTISR_TF2_VECTOR);//软中断到Timer2Isr() comFunction.Vtbl.ISR(0x20);//非法软中断 comFunction.Vtbl.RESET(); while(1); } |
|