TINYC寫個8052虛擬機器 4 巨集定義。

2021-06-12 06:26:04 字數 3875 閱讀 3671

#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

C語言寫個簡單的虛擬機器

偽 暫存器用變數表示 記憶體用陣列表示 定義巨集定義為操作碼功能 1.資料定義 2.列印功能 3.錯誤判斷 1.資料定義 3.錯誤判斷 main函式 whlie whlie 輸入do 操作碼不等於43 define crt secure no warnings include include def...

virtualbox虛擬機器 虛擬機器的網路

今天要測試ip多宿主 ip multihoming 即host和guest的兩個網絡卡分別接,host ping guest的ipv6不通。解決過程如下 命令輸出 ip addr 1 lo mtu 65536 qdisc noqueue state unknown link loopback 00 ...

debian虛擬機器安裝kvm虛擬機器

一 概念介紹 1 libvirt是linux上的虛擬化庫,是長期穩定的c語言api,支援kvm qemu xen lxc等主流虛擬化方案。virsh是libvirt對應的shell命令。2 kvm,即kernel basedvirtual machine的簡稱,是乙個開源的系統虛擬化模組,自linu...