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

📄 x86_emit.h

📁 psp上的GBA模拟器
💻 H
📖 第 1 页 / 共 5 页
字号:
/* gameplaySP * * Copyright (C) 2006 Exophase <exophase@gmail.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#ifndef X86_EMIT_H#define X86_EMIT_Hu32 x86_update_gba(u32 pc);// Although these are defined as a function, don't call them as// such (jump to it instead)void x86_indirect_branch_arm(u32 address);void x86_indirect_branch_thumb(u32 address);void x86_indirect_branch_dual(u32 address);void step_debug_x86(u32 pc);typedef enum{  x86_reg_number_eax,  x86_reg_number_ecx,  x86_reg_number_edx,  x86_reg_number_ebx,  x86_reg_number_esp,  x86_reg_number_ebp,  x86_reg_number_esi,  x86_reg_number_edi} x86_reg_number;#define x86_emit_byte(value)                                                  \  *translation_ptr = value;                                                   \  translation_ptr++                                                           \#define x86_emit_dword(value)                                                 \  *((u32 *)translation_ptr) = value;                                          \  translation_ptr += 4                                                        \typedef enum{  x86_mod_mem        = 0,  x86_mod_mem_disp8  = 1,  x86_mod_mem_disp32 = 2,  x86_mod_reg        = 3} x86_mod;#define x86_emit_mod_rm(mod, rm, spare)                                       \  x86_emit_byte((mod << 6) | (spare << 3) | rm)                               \#define x86_emit_mem_op(dest, base, offset)                                   \  if(offset == 0)                                                             \  {                                                                           \    x86_emit_mod_rm(x86_mod_mem, base, dest);                                 \  }                                                                           \  else                                                                        \                                                                              \  if(((s32)offset < 127) && ((s32)offset > -128))                             \  {                                                                           \    x86_emit_mod_rm(x86_mod_mem_disp8, base, dest);                           \    x86_emit_byte((s8)offset);                                                \  }                                                                           \  else                                                                        \  {                                                                           \    x86_emit_mod_rm(x86_mod_mem_disp32, base, dest);                          \    x86_emit_dword(offset);                                                   \  }                                                                           \#define x86_emit_reg_op(dest, source)                                         \  x86_emit_mod_rm(x86_mod_reg, source, dest)                                  \typedef enum{  x86_opcode_mov_rm_reg                 = 0x89,  x86_opcode_mov_reg_rm                 = 0x8B,  x86_opcode_mov_reg_imm                = 0xB8,  x86_opcode_mov_rm_imm                 = 0x00C7,  x86_opcode_ror_reg_imm                = 0x01C1,  x86_opcode_shl_reg_imm                = 0x04C1,  x86_opcode_shr_reg_imm                = 0x05C1,  x86_opcode_sar_reg_imm                = 0x07C1,  x86_opcode_push_reg                   = 0x50,  x86_opcode_push_rm                    = 0xFF,  x86_opcode_push_imm                   = 0x0668,  x86_opcode_call_offset                = 0xE8,  x86_opcode_ret                        = 0xC3,  x86_opcode_test_rm_imm                = 0x00F7,  x86_opcode_test_reg_rm                = 0x85,  x86_opcode_mul_eax_rm                 = 0x04F7,  x86_opcode_imul_eax_rm                = 0x05F7,  x86_opcode_idiv_eax_rm                = 0x07F7,  x86_opcode_add_rm_imm                 = 0x0081,  x86_opcode_and_rm_imm                 = 0x0481,  x86_opcode_sub_rm_imm                 = 0x0581,  x86_opcode_xor_rm_imm                 = 0x0681,  x86_opcode_add_reg_rm                 = 0x03,  x86_opcode_adc_reg_rm                 = 0x13,  x86_opcode_or_reg_rm                  = 0x0B,  x86_opcode_sub_reg_rm                 = 0x2B,  x86_opcode_xor_reg_rm                 = 0x33,  x86_opcode_cmp_reg_rm                 = 0x39,  x86_opcode_cmp_rm_imm                 = 0x053B,  x86_opcode_lea_reg_rm                 = 0x8D,  x86_opcode_j                          = 0x80,  x86_opcode_jmp                        = 0xE9,  x86_opcode_jmp_reg                    = 0x04FF,  x86_opcode_ext                        = 0x0F} x86_opcodes;typedef enum{  x86_condition_code_o                  = 0x00,  x86_condition_code_no                 = 0x01,  x86_condition_code_c                  = 0x02,  x86_condition_code_nc                 = 0x03,  x86_condition_code_z                  = 0x04,  x86_condition_code_nz                 = 0x05,  x86_condition_code_na                 = 0x06,  x86_condition_code_a                  = 0x07,  x86_condition_code_s                  = 0x08,  x86_condition_code_ns                 = 0x09,  x86_condition_code_p                  = 0x0A,  x86_condition_code_np                 = 0x0B,  x86_condition_code_l                  = 0x0C,  x86_condition_code_nl                 = 0x0D,  x86_condition_code_ng                 = 0x0E,  x86_condition_code_g                  = 0x0F} x86_condition_codes;#define x86_relative_offset(source, offset, next)                             \  ((u32)offset - ((u32)source + next))                                        \#define x86_unequal_operands(op_a, op_b)                                      \  (x86_reg_number_##op_a != x86_reg_number_##op_b)                            \#define x86_emit_opcode_1b_reg(opcode, dest, source)                          \{                                                                             \  x86_emit_byte(x86_opcode_##opcode);                                         \  x86_emit_reg_op(x86_reg_number_##dest, x86_reg_number_##source);            \}                                                                             \#define x86_emit_opcode_1b_mem(opcode, dest, base, offset)                    \{                                                                             \  x86_emit_byte(x86_opcode_##opcode);                                         \  x86_emit_mem_op(x86_reg_number_##dest, x86_reg_number_##base, offset);      \}                                                                             \#define x86_emit_opcode_1b(opcode, reg)                                       \  x86_emit_byte(x86_opcode_##opcode | x86_reg_number_##reg)                   \#define x86_emit_opcode_1b_ext_reg(opcode, dest)                              \  x86_emit_byte(x86_opcode_##opcode & 0xFF);                                  \  x86_emit_reg_op(x86_opcode_##opcode >> 8, x86_reg_number_##dest)            \#define x86_emit_opcode_1b_ext_mem(opcode, base, offset)                      \  x86_emit_byte(x86_opcode_##opcode & 0xFF);                                  \  x86_emit_mem_op(x86_opcode_##opcode >> 8, x86_reg_number_##base, offset)    \#define x86_emit_mov_reg_mem(dest, base, offset)                              \  x86_emit_opcode_1b_mem(mov_reg_rm, dest, base, offset)                      \#define x86_emit_mov_mem_reg(source, base, offset)                            \  x86_emit_opcode_1b_mem(mov_rm_reg, source, base, offset)                    \#define x86_emit_mov_reg_reg(dest, source)                                    \  if(x86_unequal_operands(dest, source))                                      \  {                                                                           \    x86_emit_opcode_1b_reg(mov_reg_rm, dest, source)                          \  }                                                                           \#define x86_emit_mov_reg_imm(dest, imm)                                       \  x86_emit_opcode_1b(mov_reg_imm, dest);                                      \  x86_emit_dword(imm)                                                         \#define x86_emit_mov_mem_imm(imm, base, offset)                               \  x86_emit_opcode_1b_ext_mem(mov_rm_imm, base, offset);                       \  x86_emit_dword(imm)                                                         \#define x86_emit_shl_reg_imm(dest, imm)                                       \  x86_emit_opcode_1b_ext_reg(shl_reg_imm, dest);                              \  x86_emit_byte(imm)                                                          \#define x86_emit_shr_reg_imm(dest, imm)                                       \  x86_emit_opcode_1b_ext_reg(shr_reg_imm, dest);                              \  x86_emit_byte(imm)                                                          \#define x86_emit_sar_reg_imm(dest, imm)                                       \  x86_emit_opcode_1b_ext_reg(sar_reg_imm, dest);                              \  x86_emit_byte(imm)                                                          \#define x86_emit_ror_reg_imm(dest, imm)                                       \  x86_emit_opcode_1b_ext_reg(ror_reg_imm, dest);                              \  x86_emit_byte(imm)                                                          \#define x86_emit_add_reg_reg(dest, source)                                    \  x86_emit_opcode_1b_reg(add_reg_rm, dest, source)                            \#define x86_emit_adc_reg_reg(dest, source)                                    \  x86_emit_opcode_1b_reg(adc_reg_rm, dest, source)                            \#define x86_emit_sub_reg_reg(dest, source)                                    \  x86_emit_opcode_1b_reg(sub_reg_rm, dest, source)                            \#define x86_emit_or_reg_reg(dest, source)                                     \  x86_emit_opcode_1b_reg(or_reg_rm, dest, source)                             \#define x86_emit_xor_reg_reg(dest, source)                                    \  x86_emit_opcode_1b_reg(xor_reg_rm, dest, source)                            \#define x86_emit_add_reg_imm(dest, imm)                                       \  if(imm != 0)                                                                \  {                                                                           \    x86_emit_opcode_1b_ext_reg(add_rm_imm, dest);                             \    x86_emit_dword(imm);                                                      \  }                                                                           \#define x86_emit_sub_reg_imm(dest, imm)                                       \  if(imm != 0)                                                                \

⌨️ 快捷键说明

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