#include "OVPCpu.hpp"
#include "OVPStatusRegister.hpp"
#include "OVPPlatform.hpp"
#include "sal/Register.hpp"
#include "sal/SALInst.hpp"


OVPPlatform ovpplatform;

// current CPU
OVPCpu *platform;
icmProcessorObject *processor;
icmProcessorP cpuP;

void OVPPlatform::setCpu(void *ovpcpu) {
	platform = (OVPCpu *)ovpcpu;
	processor = platform->getProcessor();
	cpuP = processor->getProcessorP();
}

void OVPPlatform::setRegisterData(void * link, unsigned int val) {
	icmWriteRegInfoValue(cpuP, (icmRegInfoP)link, (void *) &val);	
}

unsigned int OVPPlatform::getRegisterData(void *link) {
	unsigned int res;

	icmReadRegInfoValue(cpuP, (icmRegInfoP)link, (void *)&res);
	return res;
}

uint32_t OVPPlatform::getPC() {
	return (uint32_t) processor->getPC();
}

void OVPPlatform::setPC(uint32_t val) {
	processor->setPC(val);
}


uint32_t OVPPlatform::getSP() {
	uint32_t res;
	void *buf = &res;

	icmReadRegInfoValue(cpuP, platform->getSPReg(), buf);

	return res;

}

void OVPPlatform::save(const string& path) {
	platform->save(path);
}

void OVPPlatform::restore(const string& path) {
	platform->restore(path);
}
