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

📄 arm9contexto.cpp

📁 ARM9Core v0.4, 在x86 Win32 下模拟仿真ARM9 微处理器的Library.
💻 CPP
字号:
/*
    ARM9Core
    Copyright (C) 2007 Alberto Huerta Aranda,
	Sergio Hidalgo Serrano, Daniel Sa駏do Vacas

    This library is free software; you can redistribute it and/or
	modify it under the terms of the GNU Lesser General Public
	License as published by the Free Software Foundation; either
	version 3 of the License, or (at your option) any later version.

	This library 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
	Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
	License along with this library. If not, see <http://www.gnu.org/licenses/>

*/


/**************************************************************************************

  Archivo: ARM9Contexto.cpp

  Descripcion: Contexto del procesador

**************************************************************************************/

#include "ARM9Contexto.h"

ARM9Contexto::ARM9Contexto () {

	PC = &bancoRegistros[15];
	reset ();
}


void ARM9Contexto::reset () {

	//Inicializa el modo (SVC_MODE)
	modo = SVC_MODE;

	//PC = 0
	PC->u_word = 0;
	
	//Inicializa el CPSR
	state = fiqDis = irqDis = condFlags = 0;

}


void ARM9Contexto::cambiarModo (ARM9Mode nuevoModo) {
	ARM9Reg32 t;
	ARM9Mode m;
	
	m = nuevoModo;
	if (nuevoModo == SYSTEM_MODE) {
		m = USER_MODE;
	}
	if (modo == SYSTEM_MODE) {
		modo = USER_MODE;
	}
	
	//Guardamos los registros del modo actual
	tablaPunteros[modo][0] = bancoRegistros[13];
	tablaPunteros[modo][1] = bancoRegistros[14];

	//Restaura los registros banqueados del nuevo modo
	bancoRegistros[13] = tablaPunteros[m][0];
	bancoRegistros[14] = tablaPunteros[m][1];

	//Guardamos los registros FIQ
	if (modo == FIQ_MODE) {
		t = tablaFIQ[0];
		tablaFIQ[0] = bancoRegistros[8];
		bancoRegistros[8] = t;
		t = tablaFIQ[1];
		tablaFIQ[1] = bancoRegistros[9];
		bancoRegistros[9] = t;
		t = tablaFIQ[2];
		tablaFIQ[2] = bancoRegistros[10];
		bancoRegistros[10] = t;
		t = tablaFIQ[3];
		tablaFIQ[3] = bancoRegistros[11];
		bancoRegistros[11] = t;
		t = tablaFIQ[4];
		tablaFIQ[4] = bancoRegistros[12];
		bancoRegistros[12] = t;
	}

	//Restauramos los registros FIQ
	if (m == FIQ_MODE) {
		t = bancoRegistros[8];
		bancoRegistros[8] = tablaFIQ[0];
		tablaFIQ[0] = t;
		t = bancoRegistros[9];
		bancoRegistros[9] = tablaFIQ[1];
		tablaFIQ[1] = t;
		t = bancoRegistros[10];
		bancoRegistros[10] = tablaFIQ[2];
		tablaFIQ[2] = t;
		t = bancoRegistros[11];
		bancoRegistros[11] = tablaFIQ[3];
		tablaFIQ[3] = t;
		t = bancoRegistros[12];
		bancoRegistros[12] = tablaFIQ[4];
		tablaFIQ[4] = t;
	}

	modo = nuevoModo;
}	


void ARM9Contexto::escribirCPSR(uint32 nuevoCPSR) {
	ARM9Reg32 r;
	r.u_word = nuevoCPSR;

	state = r.CPSR.state;
	fiqDis = r.CPSR.fiqDis;
	irqDis = r.CPSR.irqDis;
	flags.v = r.CPSR.v;
	flags.c = r.CPSR.c;
	flags.z = r.CPSR.z;
	flags.n = r.CPSR.n;

	cambiarModo (bitsToMode(r.CPSR.mode));

}


uint32 ARM9Contexto::leerCPSR() {
	ARM9Reg32 r;
	r.u_word = 0;

	r.CPSR.mode = modeToBits (modo);
	r.CPSR.state = state;
	r.CPSR.fiqDis = fiqDis;
	r.CPSR.irqDis = irqDis;
	r.CPSR.v = flags.v;
	r.CPSR.c = flags.c;
	r.CPSR.z = flags.z;
	r.CPSR.n = flags.n;

	return r.u_word;
}


ARM9Mode ARM9Contexto::bitsToMode (unsigned int bits) {

	switch (bits) {
	case 0x11:
		return FIQ_MODE;
	case 0x12:
		return IRQ_MODE;
	case 0x13:
		return SVC_MODE;
	case 0x17:
		return ABORT_MODE;
	case 0x1B:
		return UNDEF_MODE;
	case 0x1F:
		return SYSTEM_MODE;
	case 0x10:
	default:
		return USER_MODE;
	}
}


unsigned int ARM9Contexto::modeToBits (ARM9Mode m) {

	switch (m) {
	case FIQ_MODE:
		return 0x11;
	case IRQ_MODE:
		return 0x12;
	case SVC_MODE:
		return 0x13;
	case ABORT_MODE:
		return 0x17;
	case UNDEF_MODE:
		return 0x1B;
	case SYSTEM_MODE:
		return 0x1F;
	case USER_MODE:
	default:
		return 0x10;
	}
}

⌨️ 快捷键说明

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