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

📄 tables.c

📁 这是模拟器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
void setup_hwdt_handles (u32 base, void *handle)
{	
	opcode_handles [base] = handle;
	opcode_handles [base|0x20] = handle;
	opcode_handles [base|0x80] = handle;
	opcode_handles [base|0x80|0x20] = handle;
	opcode_handles [base|0x100] = handle;
	opcode_handles [base|0x100|0x20] = handle;
	opcode_handles [base|0x100|0x80] = handle;
	opcode_handles [base|0x100|0x80|0x20] = handle;
}

void setup_hwdt_handles2 (u32 base, void *handle, void *handle2)
{	
	opcode_handles [base] = handle;
	opcode_handles [base|0x20] = handle;
	opcode_handles [base|0x80] = handle;
	opcode_handles [base|0x80|0x20] = handle;
	opcode_handles [base|0x100] = handle2;
	opcode_handles [base|0x100|0x20] = handle2;
	opcode_handles [base|0x100|0x80] = handle2;
	opcode_handles [base|0x100|0x80|0x20] = handle2;
}

void setup_sdt_handles2 (u32 base, void *handle, void *handle2, void *handle3, void *handle4)
{
	int i;

	for (i=0; i<0x10; i++) {
		opcode_handles [base|i]					= handle;
		opcode_handles [base|0x20|i]			= handle;
		opcode_handles [base|0x80|i]			= handle2;
		opcode_handles [base|0x80|0x20|i]		= handle2;
		opcode_handles [base|0x100|i]			= handle3;
		opcode_handles [base|0x100|0x80|i]		= handle4;
		opcode_handles [base|0x100|0x20|i]		= handle3;
		opcode_handles [base|0x100|0x80|0x20|i]	= handle4;
	}
}

void setup_sdt_strings (u32 base, char *string)
{
	int i;

	for (i=0; i<0x10; i++) {
		opcode_strings [base|i]					= string;
		opcode_strings [base|0x20|i]			= string;
		opcode_strings [base|0x80|i]			= string;
		opcode_strings [base|0x80|0x20|i]		= string;
		opcode_strings [base|0x100|i]			= string;
		opcode_strings [base|0x100|0x80|i]		= string;
		opcode_strings [base|0x100|0x20|i]		= string;
		opcode_strings [base|0x100|0x80|0x20|i] = string;
	}
}

void setup_dp_handle (u32 base, void *ins, void *ins_reg, void *ins_imm)
{
	int i;

	for (i=0; i<8; i++) {
		opcode_handles [base|(i<<1)]     = ins;		opcode_handles[base|0x200|(i<<1)]     = ins_imm;
		opcode_handles [base|(i<<1)|0x1] = ins_reg;	opcode_handles[base|0x200|(i<<1)|0x1] = ins_imm;
	}
}

void setup_handle_tables (void)
{
	int i, n;

	for (i=0; i<4096; i++) {
		opcode_handles [i] = unknown_opcode;
	}

	setup_dp_handle ( 0x00, ins_and, ins_and_reg, ins_and_imm);
	setup_dp_handle ( 0x80, ins_add, ins_add_reg, ins_add_imm);
	setup_dp_handle ( 0x40, ins_sub, ins_sub_reg, ins_sub_imm);
	setup_dp_handle (0x150, ins_cmp, ins_cmp_reg, ins_cmp_imm);
	setup_dp_handle ( 0x20, ins_eor, ins_eor_reg, ins_eor_imm);
	setup_dp_handle ( 0x60, ins_rsb, ins_rsb_reg, ins_rsb_imm);
	setup_dp_handle ( 0xA0, ins_adc, ins_adc_reg, ins_adc_imm);
	setup_dp_handle ( 0xC0, ins_sbc, ins_sbc_reg, ins_sbc_imm);
	setup_dp_handle ( 0xE0, ins_rsc, ins_rsc_reg, ins_rsc_imm);
	setup_dp_handle (0x110, ins_tst, ins_tst_reg, ins_tst_imm);
	setup_dp_handle (0x130, ins_teq, ins_teq_reg, ins_teq_imm);
	setup_dp_handle (0x170, ins_cmn, ins_cmn_reg, ins_cmn_imm);
	setup_dp_handle (0x180, ins_orr, ins_orr_reg, ins_orr_imm);
	setup_dp_handle (0x1A0, ins_mov, ins_mov_reg, ins_mov_imm);
	setup_dp_handle (0x1C0, ins_bic, ins_bic_reg, ins_bic_imm);
	setup_dp_handle (0x1E0, ins_mvn, ins_mvn_reg, ins_mvn_imm);
	setup_dp_handle ( 0x10, ins_ands, ins_ands_reg, ins_ands_imm);
	setup_dp_handle ( 0x90, ins_adds, ins_adds_reg, ins_adds_imm);
	setup_dp_handle ( 0x50, ins_subs, ins_subs_reg, ins_subs_imm);
	setup_dp_handle ( 0x30, ins_eors, ins_eors_reg, ins_eors_imm);
	setup_dp_handle ( 0x70, ins_rsbs, ins_rsbs_reg, ins_rsbs_imm);
	setup_dp_handle ( 0xB0, ins_adcs, ins_adcs_reg, ins_adcs_imm);
	setup_dp_handle ( 0xD0, ins_sbcs, ins_sbcs_reg, ins_sbcs_imm);
	setup_dp_handle ( 0xF0, ins_rscs, ins_rscs_reg, ins_rscs_imm);
	setup_dp_handle (0x190, ins_orrs, ins_orrs_reg, ins_orrs_imm);
	setup_dp_handle (0x1B0, ins_movs, ins_movs_reg, ins_movs_imm);
	setup_dp_handle (0x1D0, ins_bics, ins_bics_reg, ins_bics_imm);
	setup_dp_handle (0x1F0, ins_mvns, ins_mvns_reg, ins_mvns_imm);

	for (i=0; i<0x10; i++) {
		opcode_handles[0x100|i] = ins_mrs_cpsr;	opcode_handles[0x300|i] = ins_tst_imm;
		opcode_handles[0x120|i] = ins_msr_cpsr;	opcode_handles[0x320|i] = ins_msr_cpsr_imm;
		opcode_handles[0x140|i] = ins_mrs_spsr;	opcode_handles[0x340|i] = ins_cmp_imm;
		opcode_handles[0x160|i] = ins_msr_spsr;	opcode_handles[0x360|i] = ins_msr_spsr_imm;


		for (n=0; n<0xF; n++) {
			opcode_handles[0x800|(n<<5)|i] = ins_stm;
			opcode_handles[0x810|(n<<5)|i] = ins_ldm;
		}
	}

	setup_sdt_handles2 (0x600	 , ins_str_post_down, ins_str_post_up,
								   ins_str_pre_down, ins_str_pre_up);

	setup_sdt_handles2 (0x640	 , ins_strb_post_down, ins_strb_post_up,
								   ins_strb_pre_down, ins_strb_pre_up);

	setup_sdt_handles2 (0x400	 , ins_str_imm_post_down, ins_str_imm_post_up,
								   ins_str_imm_pre_down, ins_str_imm_pre_up);
	
	setup_sdt_handles2 (0x440	 , ins_strb_imm_post_down, ins_strb_imm_post_up,
								   ins_strb_imm_pre_down, ins_strb_imm_pre_up);

	setup_sdt_handles2 (0x600|0x10, ins_ldr_post_down, ins_ldr_post_up,
									ins_ldr_pre_down, ins_ldr_pre_up);

	setup_sdt_handles2 (0x640|0x10, ins_ldrb_post_down, ins_ldrb_post_up,
									ins_ldrb_pre_down, ins_ldrb_pre_up);

	setup_sdt_handles2 (0x400|0x10, ins_ldr_imm_post_down, ins_ldr_imm_post_up,
									ins_ldr_imm_pre_down, ins_ldr_imm_pre_up);

	setup_sdt_handles2 (0x440|0x10, ins_ldrb_imm_post_down, ins_ldrb_imm_post_up,
								   ins_ldrb_imm_pre_down, ins_ldrb_imm_pre_up);

	setup_hwdt_handles (0x5B|0x4, ins_ldrsh_imm);
	setup_hwdt_handles (0x5D, ins_ldrsb_imm);
	setup_hwdt_handles2 (0x1B, ins_ldrh_post, ins_ldrh_pre);
	setup_hwdt_handles2 (0xB, ins_strh_post, ins_strh_pre);
	setup_hwdt_handles2 (0x5B, ins_ldrh_imm_post, ins_ldrh_imm_pre);
	setup_hwdt_handles2 (0x4B, ins_strh_imm_post, ins_strh_imm_pre);
	setup_hwdt_handles (0x1B|0x4, ins_ldrsh);
	setup_hwdt_handles (0x1D, ins_ldrsh);

	opcode_handles [0x9] = ins_mul;
	opcode_handles[0x19] = ins_muls;
	opcode_handles[0x29] = ins_mla;
	opcode_handles[0x39] = ins_mlas;
	opcode_handles[0x89] = ins_mull;
	opcode_handles[0x99] = ins_mulls;
	opcode_handles[0xC9] = ins_mull_unsigned;
	opcode_handles[0xE9] = ins_mulls_unsigned;
	opcode_handles[0xA9] = ins_mlal;
	opcode_handles[0xB9] = ins_mlals;
	opcode_handles[0xE9] = ins_mlal_unsigned;
	opcode_handles[0xF9] = ins_mlals_unsigned;

	opcode_handles[0x109] = ins_swp;
	opcode_handles[0x149] = ins_swpb;
	
	opcode_handles[0x121] = ins_bx;
	
	for (i=0; i<0x100; i++) {
		opcode_handles[0xF00|i] = ins_swi;
	}

	for (i=0; i<0x80; i++) {
		opcode_handles[(0xA<<8)|i]      = ins_bpl;
		opcode_handles[(0xB<<8)|i]      = ins_blpl;
		opcode_handles[(0xA<<8)|i|0x80] = ins_bmi;
		opcode_handles[(0xB<<8)|i|0x80] = ins_blmi;
	}
}

void setup_string_tables (void)
{	
	int i, n;

	for (i=0; i<0x20; i++) {
		cpu_mode_strings [i] = "BadCpuMode";
	}

	cpu_mode_strings [0x10] = "User";
	cpu_mode_strings [0x11] = "FIQ";
	cpu_mode_strings [0x12] = "IRQ";
	cpu_mode_strings [0x13] = "Supervisor";
	cpu_mode_strings [0x17] = "Abort";
	cpu_mode_strings [0x1B] = "Undefined";
	cpu_mode_strings [0x1F] = "System";

	for (i=0; i<4096; i++) {
		opcode_strings [i] = "unknown";
	}

	for (i=0; i<0x10; i++) {
		opcode_strings      [i] = "and";    opcode_strings[0x200|i]	= "and";
		opcode_strings [0x10|i] = "ands";	opcode_strings[0x210|i] = "ands";
		opcode_strings [0x20|i] = "eor";	opcode_strings[0x220|i] = "eor";
		opcode_strings [0x30|i] = "eors";   opcode_strings[0x230|i] = "eors";
		opcode_strings [0x40|i] = "sub";	opcode_strings[0x240|i] = "sub";
		opcode_strings [0x50|i] = "subs";   opcode_strings[0x250|i] = "subs";
		opcode_strings [0x60|i] = "rsb";	opcode_strings[0x260|i] = "rsb";
		opcode_strings [0x70|i] = "rsbs";	opcode_strings[0x270|i] = "rsbs";
		opcode_strings [0x80|i] = "add";    opcode_strings[0x280|i]	= "add";
		opcode_strings [0x90|i] = "adds";	opcode_strings[0x290|i] = "adds";
		opcode_strings [0xA0|i] = "adc";	opcode_strings[0x2A0|i] = "adc";
		opcode_strings [0xB0|i] = "adcs";	opcode_strings[0x2B0|i] = "adcs";
		opcode_strings [0xC0|i] = "sbc";	opcode_strings[0x2C0|i] = "sbc";
		opcode_strings [0xD0|i] = "sbcs";	opcode_strings[0x2D0|i] = "sbcs";
		opcode_strings [0xE0|i] = "rsc";	opcode_strings[0x2E0|i] = "rsc";
		opcode_strings [0xF0|i] = "rscs";	opcode_strings[0x2F0|i] = "rscs";
		opcode_strings[0x100|i] = "mrs";	opcode_strings[0x300|i] = "tst";
		opcode_strings[0x110|i] = "tst";    opcode_strings[0x310|i] = "tst";
		opcode_strings[0x120|i] = "msr"; 	opcode_strings[0x320|i] = "msr";
		opcode_strings[0x130|i] = "teq";	opcode_strings[0x330|i] = "teq";
		opcode_strings[0x140|i] = "mrs";	opcode_strings[0x340|i] = "cmp";
		opcode_strings[0x150|i] = "cmp";    opcode_strings[0x350|i] = "cmp";
		opcode_strings[0x160|i] = "msr";	opcode_strings[0x360|i] = "msr";
		opcode_strings[0x170|i] = "cmn";	opcode_strings[0x370|i] = "cmn";
		opcode_strings[0x180|i] = "orr";	opcode_strings[0x380|i] = "orr";
		opcode_strings[0x190|i] = "orrs";	opcode_strings[0x390|i] = "orrs";
		opcode_strings[0x1A0|i] = "mov";	opcode_strings[0x3A0|i] = "mov";
		opcode_strings[0x1B0|i] = "movs";	opcode_strings[0x3B0|i] = "movs";
		opcode_strings[0x1C0|i] = "bic";	opcode_strings[0x3C0|i] = "bic";
		opcode_strings[0x1D0|i] = "bics";	opcode_strings[0x3D0|i] = "bics";
		opcode_strings[0x1E0|i] = "mvn";	opcode_strings[0x3E0|i] = "mvn";
		opcode_strings[0x1F0|i] = "mvns";	opcode_strings[0x3F0|i] = "mvns";

		for (n=0; n<0xF; n++) {
			opcode_strings[0x800|(n<<5)|i] = "stm";
			opcode_strings[0x810|(n<<5)|i] = "ldm";
		}

⌨️ 快捷键说明

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