?? memory.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 + -