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

📄 memory.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
//////////////////////////////////////////////////////////////////////



// memory.h: interface for the memory class.
// 用来模拟8051内存模型,以及存储一些模拟8051方便计算的变量,因为它是基类,不从任何类派生,指令类中断类都要引用他.
// 2004.4.4对此类作了结构上的调整,以便于将来可以同时设计模拟多个处理器的系统,比如SMP或多个独立的处理器
// 将code xdata 内存移出申明为全局变量,memory类中引用这些内存时需要事先传入指针,
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MEMORY_H__4B80D118_B0D1_45F5_A43C_91BA02A20266__INCLUDED_)
#define AFX_MEMORY_H__4B80D118_B0D1_45F5_A43C_91BA02A20266__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define OS 0 //1表示WINDOWS操作系统 0其他可兼容C运行时库的OS
#define B          0xf0
#define Acc        0xe0
////////////////////////2
#define PSW        0xd0
#define PSW_P      0xd0
#define PSW_OV     0xd2
#define PSW_RS0    0xd3
#define PSW_RS1    0xd4
#define PSW_F0     0xd5
#define PSW_AC     0xd6
#define PSW_Cy     0xd7
////////////////////////9
#define IP         0xb8
#define IP_PX0     0xb8
#define IP_PT0     0xb9
#define IP_PX1     0xba
#define IP_PT1     0xbb
#define IP_PS      0xbc
/////////////////////////14
#define P3         0xb0
#define P3_0       0xb0
#define P3_1       0xb1
#define P3_2       0xb2
#define P3_3       0xb3
#define P3_4       0xb4
#define P3_5       0xb5
#define P3_6       0xb6
#define P3_7       0xb7
/////////////////////////22
#define IE         0xa8
#define IE_EX0     0xa8
#define IE_ET0     0xa9
#define IE_EX1     0xaa
#define IE_ET1     0xab
#define IE_ES      0xac
#define IE_EA      0xaf
/////////////////////////28
#define P2         0xa0
#define P2_0       0xa0
#define P2_1       0xa1
#define P2_2       0xa2
#define P2_3       0xa3
#define P2_4       0xa4
#define P2_5       0xa5
#define P2_6       0xa6
#define P2_7       0xa7
/////////////////////////36
#define SBUF       0x99
/////////////////////////37
#define SCON       0x98
#define SCON_RI    0x98
#define SCON_TI    0x99
#define SCON_RB8   0x9a
#define SCON_TB8   0x9b
#define SCON_REN   0x9c
#define SCON_SM2   0x9d
#define SCON_SM1   0x9e
#define SCON_SM0   0x9f
/////////////////////////45
#define P1         0x90
#define P1_0       0x90
#define P1_1       0x91
#define P1_2       0x92
#define P1_3       0x93
#define P1_4       0x94
#define P1_5       0x95
#define P1_6       0x96
#define P1_7       0x97
/////////////////////////53
#define TH1        0x8d
#define TH0        0x8c
/////////////////////////55
#define TL1        0x8b
#define TL0        0x8a
/////////////////////////57
#define TMOD       0x89
/////////////////////////58
#define TCON       0x88
#define TCON_IT0   0x88
#define TCON_IE0   0x89  
#define TCON_IT1   0x8a
#define TCON_IE1   0x8b
#define TCON_TR0   0x8c
#define TCON_TF0   0x8d
#define TCON_TR1   0x8e
#define TCON_TF1   0x8f
/////////////////////////66
#define PCON       0x87
/////////////////////////
#define DPH        0x83
///////////////////////// 
#define DPL        0x82
/////////////////////////
#define SPc        0x81
/////////////////////////70
#define P0         0x80
#define P0_0       0x80
#define P0_1       0x81
#define P0_2       0x82
#define P0_3       0x83
#define P0_4       0x84
#define P0_5       0x85
#define P0_6       0x86
#define P0_7       0x87
/////////////////////////78

//#include "HEXBIN.h"
#include "GlobalVar.h"
#define Write 0 //宏定义读和写
#define Read  1

typedef void (*XdataMemHook)(BYTE  VarNum,int mode,BYTE data);//mode表示HOOK到操作是读还是写,data要操作的数据
typedef void (*CodeMemHook)(BYTE  VarNum,int mode,BYTE data);
typedef void (*IdataMemHook)(BYTE  VarNum,int mode,BYTE data);
typedef void (*IdataBitMemHook)(BYTE  VarNum,int mode,BYTE data);
class memory  
{
public:
	int MemReset();
	void SetPC(unsigned addr);
	void AddPC(int PCcount);
	__forceinline BYTE NULLFun();
	BYTE SetidataMemByte(BYTE addr,BYTE data);
	BYTE SetxdataMemByte(unsigned short addr,BYTE data);
	BYTE SetCodeMemByte(unsigned short addr,BYTE data);
	BYTE GetidataMemByte(BYTE addr);
	BYTE GetxdataMemByte(unsigned short addr);
	BYTE GetCodeMemByte(unsigned short addr);

	BYTE SetidataMemBytef(BYTE addr,BYTE data);
	BYTE SetxdataMemBytef(unsigned short addr,BYTE data);
	BYTE SetCodeMemBytef(unsigned short addr,BYTE data);
	BYTE GetidataMemBytef(BYTE addr);
	BYTE GetxdataMemBytef(unsigned short addr);
	BYTE GetCodeMemBytef(unsigned short addr);

	int init();

	BYTE GetBit(BYTE addr);
	BYTE SetBit(BYTE addr,BYTE bit);

	BYTE GetBitf(BYTE addr);
	BYTE SetBitf(BYTE addr,BYTE bit);
	memory();
	BYTE  * pxdata;//外部数据内存
	CodeMemHook  pCodeMemHookR[65536];
	CodeMemHook  pCodeMemHookFunR;
	XdataMemHook  pXdataMemHookR[65536];
	XdataMemHook  pXdataMemHookFunR;
	IdataMemHook  pIdataMemHookR[256];
	IdataMemHook  pIdataMemHookFunR;
	IdataBitMemHook  pIdataBitMemHookR[256];
	IdataBitMemHook  pIdataBitMemHookFunR;

	CodeMemHook  pCodeMemHookW[65536];
	CodeMemHook  pCodeMemHookFunW;
	XdataMemHook  pXdataMemHookW[65536];
	XdataMemHook  pXdataMemHookFunW;
	IdataMemHook  pIdataMemHookW[256];
	IdataMemHook  pIdataMemHookFunW;
	IdataBitMemHook  pIdataBitMemHookW[256];
	IdataBitMemHook  pIdataBitMemHookFunW;
	BYTE  idata[256];//内部寄存器
	BYTE  * pcode;//外部代码内存
	BYTE  * Am;//寄存器A的引用
	BYTE  * SPm;//寄存器SP的引用
	BYTE  VarNum;//处理器编号
	//定义几个对8051软件上不可见的寄存器
	BYTE  CurrentIRQLevel;//当前IRQ优先级
	BYTE  CurrentIRQNUM;//当前中断号码
	BYTE  CurrentCPULevel;//当前处理器等级 127为正常运行等级,128为低优先级中断等级,129为高优先级中断等级
	BYTE  BackCPULevel;//前一个处理器等级,有利于中断返回时恢复处理器等级
	int IsCheakIRQ;//判断是否有必要检查中断源,真值表示检查
	unsigned short *DPTRm;

	unsigned short PCm;//程序计数器
	DWORD CLKNUML;//时钟周期数目
	DWORD CLKNUMH;
	virtual ~memory();
	BYTE MarkBitMap0[8];//={ 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
	BYTE MarkBitMap1[8];//={ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};


};

#endif // !defined(AFX_MEMORY_H__4B80D118_B0D1_45F5_A43C_91BA02A20266__INCLUDED_)

⌨️ 快捷键说明

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