TINYC寫個8052虛擬機(4) 宏定義。 .

#define REGx(x)     csp->ram[REG_##x]
#define RAMx(x)     csp->ram[x]
#define ROMx(x)     csp->rom[x]

#define BIT(a)      (RAMx((a) & 0xf8) & (1 << ((a) & 0x07)))
#define BIT_SET(a)  RAMx((a) & 0xf8) |= (1 << ((a) & 0x07))
#define BIT_CLR(a)  RAMx((a) & 0xf8) &= ~((uint8)(1 << ((a) & 0x07)))

#define ADDR_L(a)   ((uint16)(a))
#define ADDR_H3(a)  ((((uint16)(a)) & 0xe0) << 3)
#define ADDR_H8(a)  (((uint16)(a)) << 0x08)

#define ACC         REGx(ACC)
#define B           REGx(B)
#define PSW         REGx(PSW)
#define SP          REGx(SP)
#define DPL         REGx(DPL)
#define DPH         REGx(DPH)
#define DPTR        ((uint16)DPH << 0x08) | DPL
#define P0          REGx(P0)
#define P1          REGx(P1)
#define P2          REGx(P2)
#define P3          REGx(P3)
#define IP          REGx(IP)
#define IE          REGx(IE)
#define TMOD        REGx(TMOD)
#define TCON        REGx(TCON)
#define T2CON       REGx(T2CON)
#define TH0         REGx(TH0)
#define TL0         REGx(TL0)
#define TH1         REGx(TH1)
#define TL1         REGx(TL1)
#define TH2         REGx(TH2)
#define TL2         REGx(TL2)
#define RCAP2H      REGx(RCAP2H)
#define RCAP2L      REGx(RCAP2L)
#define SCON        REGx(SCON)
#define SBUF        REGx(SBUF)
#define PCON        REGx(PCON)

#define Rx(x)       RAMx(((REGx(PSW) >> 0x03) & 0x03) * 0x08 + (x) & 0x07)
#define RN          Rx(ROMx(CIP))
#define R0          Rx(0)
#define R1          Rx(1)
#define R2          Rx(2)
#define R3          Rx(3)
#define R4          Rx(4)
#define R5          Rx(5)
#define R6          Rx(6)
#define R7          Rx(7)

#define FLAG_CY     REG_PSW ^ 7
#define FLAG_AC     REG_PSW ^ 6
#define FLAG_F0     REG_PSW ^ 5
#define FLAG_R1     REG_PSW ^ 4
#define FLAG_R0     REG_PSW ^ 3
#define FLAG_OV     REG_PSW ^ 2

#define STACK       RAMx(SP)

#define CIP         csp->sip

#define PC          csp->ip
#define PC_LOW      (PC & 0xff)
#define PC_HIGH     ((PC >> 0x08) & 0xff)
#define SET_PC(h, l)PC = (uint16)((h) << 0x08) | ((l) & 0xff)
#define SET_PCW(n)  PC = (uint16)(n)
#define SET_PCR(r)  PC = (uint16)(PC + (r))

#define PUSH(n)     REGx(SP) += 1; STACK = (n)
#define PUSH_PC()   PUSH(PC_LOW); PUSH(PC_HIGH)

#define POP()       STACK; REGx(SP) -= 1
#define POP_PC()    PC = POP(); PC <<= 0x08; PC |= POP()

#define ADDR8U      ROMx(CIP + 1)                 ///< 第一個8-bit絕對地址。
#define ADDR8S      ((char)ROMx(CIP + 1))         ///< 第一個8-bit相對地址。
#define ADDR8U2     ROMx(CIP + 2)                 ///< 第二個8-bit絕對地址。
#define ADDR8S2     ((char)ROMx(CIP + 2))         ///< 第二個8-bit相對地址。
#define ADDR11      (ADDR_H3(ROMx(CIP)) | ADDR_L(ADDR8U))
#define ADDR16      (ADDR_H8(ADDR8U) | ADDR_L(ADDR8U2))

#define CODE8       ROMx(ACC + DPTR)
#define CODE16      (CODE8 << 0x08) | ROMx(ACC + DPTR + 1)
#define CODE8_REL   ROMx(ACC + PC)
#define CODE16_REL  (CODE8_REL << 0x08) | ROMx(ACC + PC + 1)

#define DATA8       RAMx(ADDR8U)
#define DATA8U2     RAMx(ADDR8U2)

#define DATA16      ((uint16)RAMx(ADDR8U) << 0x08) | RAMx(ADDR8U + 1)
#define DATAR0      RAMx(R0)
#define DATAR1      RAMx(R1)
#define DATARN      RAMx(Rx(ROMx(CIP) & 0x01))
#define DATA_DPTR   RAMx(DPTR)
#define IMM8U       ADDR8U
#define IMM8S       ADDR8S
#define IMM8U2      ADDR8U2
#define IMM8S2      ADDR8S2
#define IMM16       ADDR16

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章