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