⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 instruction.h

📁 一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器
💻 H
字号:
///////////////////////////////////////////////////////////////////////
// 圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!
// 1998.x.x 多少遗憾,多少泪水,路在何方?? 为什么失败的总是我??梦想为什么这么遥远
// ........学x86很久了,书本都翻了n遍了......
// 虽然x86很强大,但要做台x86计算机真是太难了,8051单片机真的简单了很多,我想做个8051的计算机.
// 没有编程器的日子,真是不好受,自己又没条件能做电路板,要是能有台计算机模拟8051,那将是多莫令人兴奋的事情啊
// 但是我什么都没有............什么都没有
// 1999.x.x草稿纸上完成基本的框架图和基本算法,并完成部分核心代码,将项目名称定为圆梦51
// .......飘啊摇啊,淡漠了生活,忘记了梦想,就这样浑浑噩噩的活着........梦已死
// 2002.8.24 尘世间多少烦恼,从此不必再牵挂。为了梦想我终于可以从现实中解脱出来一段时间,不上学的日子真好,真令人怀念。
// 建立指令模拟instruction和memory 代码档。
// 不懂windows C编程是我最大的障碍,......1年时间......我想应该是我这一生中最有价值的时间,以前没有,以后可能更没有了
// 2003.12.x
// 因为要上学,所以能够静下心来学习的时间基本上再也找不到了
// 2004.9.2 基本初步完成,尚未完成中断返回,尚未debug
// 2004.11.17 调试浮点程序通过,^_^ :) ^o^ ^0^ :(  >_< 他的缺点就是他的优点,我无法权衡,指令类暂时先稳定下来吧
// 当学生真是无奈,我在倒退..............我在放弃梦想...............
// 2005.3.28 不管怎样我要圆梦,我不能做个永远失败的人,建立KernelMsg interruptcontroller代码档
// 2005.4.3 建立TIMER档,这可把我难倒了,效能,错误...............
// 2005.4.14 KernelMsg TIMER初步完成,莫名其妙的错误太多,KernelMsg真的很失败,增加了编写难度,更不易调试.....
// 2005.4.18 不管三七二十一,凑出来再说,我好想运行以下ucos ii,建立Serial类
// 2005.4.21 为了提供对多处理器系统的支持,并能够模拟多了处理器,对全局变量 函数作了修改,使之不但打破了C++的封装,
// 又使得全局函数类似类中的函数,所以在不增加代码的情况下,可直接模拟多处理器
// 2005.4.24 垃圾诞生,不得不对KernelMsg重新编写,以提高时间事件函数HOOK的安全性,降低时间HOOK的编写难度,
// 不用自己处理下层的HOOK问题,效率更高,随后TIMER Serial也作了大面积修改
// 2005.4.25 uCOS-II终于正确无误的运行成功了。0.10版核心到此为止告一段落。
// 尽管0.10没有经过完全的测试,我敢肯定定时器这部分还是有问题,而且串口,定时器还没有完善,
// 但是我已经对他没有很大主动测试方面的兴趣了,留着让用户来发现吧
// 着手开始0.11的开发,这更能吸引我的眼球,新的目标是利用KernelMsg思想大面积优化指令集的加速,以其其他速度方面的优化,
// 希望速度能追上Keil C
//////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////
// instruction.h: interface for the instruction class.
// 指令模拟类(核心类)
// 2002.8.24 建立代码档
// 2003.7.xx 打好基本框架
// 2004.9.2 初始版本的编码工作基本完成,尚未测试,尚未完成中断返回
// 2004.11.17 浮点测试程序通过 Y=Ln√ |Sin(ab/c+d)|
// 2005.4.3 完成中断返回的编码工作
// 2005.4.16 修正CJNE判断两操作数相等时CY应该=0的问题
////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_INSTRUCTION_H__92B19190_52B2_4E0D_AFA4_B12BEA3F3300__INCLUDED_)
#define AFX_INSTRUCTION_H__92B19190_52B2_4E0D_AFA4_B12BEA3F3300__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//# I立即数寻址 //@ D 间接寻址//
#include "GlobalVar.h"

#define debug 0
#define code(x) (mem->pcode[mem->PCm+x])//PC+偏移量x处的代码
#define A (*(mem->Am))//A
#define DPTR (*(mem->DPTRm))
#define PC mem->PCm
#define APC(x) mem->AddPC(x)//PC+x;
#define SP (*(mem->SPm))
#define CY mem->GetBitf(0xd7)
#define CYw(n) mem->SetBitf(0xd7,n)
#define OV mem->GetBitf(0xd2)
#define OVw(n) mem->SetBitf(0xd2,n)
#define AC mem->GetBitf(0xd6)//读AC
#define ACw(n) mem->SetBitf(0xd6,n)//写AC
#define CFB buf1=0;buf2=0;buf3.bufa=0;buf4.bufa=0;buf4.bufa=0//计算缓冲置0
//#define Aw(x) mem->SetidataMemByte(Acc,x)//写A
/*//CO宏为加法溢出法判断
#define CO(x) \
if((x)>127||(x)<-128) \
{ \
	OVw(1);\
}\
else\
{\
	OVw(0);\
}
//COB宏为减法溢出法判断
#define COB(x) \
buf1=(x)&0x80;\
buf1=buf1>>7;\
buf5.bufa=(x)&0x100;\
if(buf1^buf5.ACa.CYa)\
{ \
	OVw(1);\
}\
else\
{\
	OVw(0);\
}
//检查结果设置OV*/
#define R(n) GetRndata(n)//读Rn
#define Gb(Addr) (mem->GetBit(Addr))//读位
#define Sb(Addr,n) mem->SetBit(Addr,n) //写位
#define Rw(n,d) SetRndata(n,d)//写Rn
#define DR(n) GetDRiData(n,0)//读间接寻址Rn的内容(内部数据地址)
#define DRw(n,d) SetDRiData(n,d,0);//写Rn间接寻址Rn的内容(内部数据地址)
#define DxR(n) GetDRiData(n,1)//读Rn间接寻址Rn的内容(外部数据地址)
#define DxRw(n,d) SetDRiData(n,d,1)//写Rn间接寻址Rn的内容(外部数据地址)
#define DcR(n) GetDRiData(n,2)//读Rn间接寻址Rn的内容(外部代码地址)
#define DcRw(n,d) SetDRiData(n,d,2)//写Rn间接寻址Rn的内容(外部代码地址)
#include "kernelMsg.h"
#include "memory.h"

//	================================================================
//	|		   21     20    19-11    10     9      8     7-4   3-0 |
//	|		|CY4(1)|CY3(1)|bufR(8)|CY2(1)|CY1(1)|CYa(1)|AH(4)|AL(4)|
//	|												   |	 Aa    |
//	|-----------------------------bufa-----------------------------|
//	================================================================
struct bita //A的计算缓冲位定义
{
	unsigned AL:4;
	unsigned AH:4;
	unsigned CYa:1;
	unsigned CY1:1;//以下为循环移位计算缓冲
	unsigned CY2:1;
	unsigned bufR:8;
	unsigned CY3:1;
	unsigned CY4:1;
};
struct bita34
{
	unsigned AL:4;
	unsigned AH3:3;
	unsigned AH4:1;
	unsigned CYa:1;
	unsigned CY1:1;//以下为循环移位计算缓冲
	unsigned CY2:1;
	unsigned bufR:8;
	unsigned CY3:1;
	unsigned CY4:1;
};
struct bita7
{
	unsigned A7:7;
	unsigned A8:1;
	unsigned CYa:1;
	unsigned CY1:1;//以下为循环移位计算缓冲
	unsigned CY2:1;
	unsigned bufR:8;
	unsigned CY3:1;
	unsigned CY4:1;
};
union Bufa
{
	bita ACa;//A,CY
	bita34 ACa34;
	bita7 ACa7;
	BYTE Aa;
	DWORD bufa;//无符号数
	int bufs;//符号数
};
typedef void (*ClockHook)(BYTE VarNum,unsigned short Clocknum);
class instruction  //指令类
{
public:
	void RUN();
	void init();
	int RETIANON();//中断返回后应该执行的操作,如果有等待状态的中断,条件满足的话,则执行中断,否则CheakIRQ,直到没有中断为止
	void RUNCLK(int Code);
	void RUNINS(int Code);
	
	void SetRndata(BYTE Rn,BYTE data);//写Rn
	BYTE GetRndata(BYTE Rn);//读Rn
	void SetDRiData(BYTE Ri,BYTE data,BYTE AddrMode);//AddrMode内存地址空间模式 0:内部地址,1:外部数据地址2:外部代码地址
	BYTE GetDRiData(BYTE Ri,BYTE AddrMode);
	__forceinline void Clock(int count);
//	unsigned short & PCm;
	BYTE GetRnAddr(BYTE Rn);
	BYTE buf1,buf2;
	Bufa buf3,buf4,buf5,buf9;//存放中间结果
	unsigned short buf6;
	char buf7;
	instruction * pnextinst;//为多处理器环境建立指令执行连表提供方便
	void CreateMap();
	void NULLFun();
	EVENT_ON_ONECLOCK * ClockEventPos[65536];
	EVENT_ON_ONECLOCK * pClockHookFunpos;
	int BackClockCount;//上一个时钟计数
	BYTE PSW_RS;
	BYTE RnAddr;//Rn地址计算用缓冲
	kernelMsg * pKMsg;
	memory * mem;
	typedef void (instruction::*Fun)();
	Fun INSMAP[256];//指令映射实例
#if debug ==1 //debug模式
	BYTE dbuf1;
	BYTE INSMAPMON[256];
	CString dbstr;
#endif
	//memory * mem;
	////////////////////////////17 111
	void JBC_bit_rel();
	void JNB_bit_rel();
	void JB_bit_rel();
	void JNC_rel();
	void JC_rel();
	void ORL_C_NOT_bit();
	void ANL_C_NOT_bit();
	void ORL_C_bit();
	void ANL_C_bit();
	void SETB_bit();
	void CLR_bit();
	void CPL_bit();
	void SETB_C();
	void CLR_C();
	void CPL_C();
	void MOV_bit_C();
	void MOV_C_bit();

	//////////////////////////17 94
	void NOP();
	void RETI();
	void RET();
	void LCALL_addr16();
	void ACALL_addr11();
	void DJNZ_direct_rel();
	void DJNZ_Rn_rel();
	void CJNE_DRi_Idata_rel();
	void CJNE_Rn_Idata_rel();
	void CJNE_A_Idata_rel();
	void CJNE_A_direct_rel();
	void JNZ_rel();
	void JZ_rel();
	void JMP_DAaddDPTR();
	void SJMP_rel();
	void LJMP_addr16();
	void AJMP_addr11();
	////////////////////////24 77
	void RRC_A();
	void RLC_A();
	void RR_A();
	void RL_A();
	void CLR_A();
	void CPL_A();


	void XRL_direct_Idata();
	void XRL_A_Idata();
	void XRL_direct_A();
	void XRL_A_DRi();
	void XRL_A_direct();
	void XRL_A_Rn();


	void ORL_direct_Idata();
	void ORL_A_Idata();
	void ORL_direct_A();
	void ORL_A_direct();
	void ORL_A_DRi();
	void ORL_A_Rn();

	void ANL_direct_Idata();
	void ANL_A_Idata();
	void ANL_direct_A();
	void ANL_A_direct();
	void ANL_A_DRi();
	void ANL_A_Rn();
	///////////////////////16 53
	void DIV_AB();
	void MUL_AB();
	void DA_A();
	void DEC_direct();
	void DEC_Rn();
	void DEC_DRi();
	void DEC_A();
	void INC_DPTR();
	void INC_direct();
	void INC_DRi();
	void inc_Rn();
	void INC_A();
	void SUB_A_Idata();
	void SUB_A_direct();
	void SUB_A_DRi();
	void SUB_A_Rn();
	///////////////////////8 37
	void ADDC_A_Idata();
	void ADDC_A_direct();
	void ADDC_A_DRi();
	void ADDC_A_Rn();
	void ADD_A_Idata();
	void ADD_A_direct();
	void ADD_A_DRi();
	void ADD_A_Rn();
	///////////////////////2 29
	void POP_direct();
	void PUSH_direct();
	///////////////////////////////////5 27
	void SWAP_A();
	void XCHD_A_DRi();
	void XCH_A_direct();
	void XCH_A_DRi();
	void XCH_A_Rn();
	////////////////////////2  22
	void MOVC_A_DAaddPC();
	void MOVC_A_DAaddDPTR();
	////////////////////////4   20
	void MOVX_DDPTR_A();
	void MOVX_A_DRi();
	void MOVX_DRi_A();
	void MOVX_A_DDPTR();

	////////////////////////6  16
	void MOV_A_DRi();
	void MOV_direct_DRi();
	void MOV_direct2_direct1();
	void MOV_DRi_direct();
	void MOV_A_direct();
	void MOV_Rn_direct();
	////////////////////////5  10
	void MOV_DRi_A();
	void MOV_direct_A();
	void MOV_A_Rn();
	void MOV_Rn_A();
	void MOV_direct_Rn();
	////////////////////////5 
	void MOV_DPTR_Idata16();
	void MOV_direct_Idata();
	void MOV_DRi_Idata();
	void MOV_Rn_Idata();
	void MOV_A_Idata();
	instruction();
	virtual ~instruction();

};

#endif // !defined(AFX_INSTRUCTION_H__92B19190_52B2_4E0D_AFA4_B12BEA3F3300__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -