direct set PCL
This commit is contained in:
parent
3474c80c07
commit
f263a04f0f
@ -760,62 +760,26 @@ namespace PIC_Simulator.PIC
|
|||||||
return PCCounter >= befehle.Count;
|
return PCCounter >= befehle.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
private uint GetRegister(uint index)
|
|
||||||
{
|
|
||||||
// register die nur einmal auf bank1 + 2 existieren
|
|
||||||
if (index == ADDR_PCL + 0x80) return Register[ADDR_PCL];
|
|
||||||
if (index == ADDR_STATUS + 0x80) return Register[ADDR_STATUS];
|
|
||||||
if (index == ADDR_FSR + 0x80) return Register[ADDR_FSR];
|
|
||||||
if (index == ADDR_PCLATH + 0x80) return Register[ADDR_PCLATH];
|
|
||||||
if (index == ADDR_INTCON + 0x80) return Register[ADDR_INTCON];
|
|
||||||
|
|
||||||
if ((Register[ADDR_STATUS] & STATUS_BIT_RP0) == STATUS_BIT_RP0)
|
|
||||||
{
|
|
||||||
return Register[0x80 + index];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return Register[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetRegister(uint index, uint wert)
|
|
||||||
{
|
|
||||||
// register die nur einmal auf bank1 + 2 existieren
|
|
||||||
if (index == ADDR_PCL) { Register[ADDR_PCL] = wert; return; }
|
|
||||||
if (index == ADDR_STATUS) { Register[ADDR_STATUS] = wert; return; }
|
|
||||||
if (index == ADDR_FSR) { Register[ADDR_FSR] = wert; return; }
|
|
||||||
if (index == ADDR_PCLATH) { Register[ADDR_PCLATH] = wert; return; }
|
|
||||||
if (index == ADDR_INTCON) { Register[ADDR_INTCON] = wert; return; }
|
|
||||||
|
|
||||||
if ((Register[ADDR_STATUS] & STATUS_BIT_RP0) == STATUS_BIT_RP0)
|
|
||||||
{
|
|
||||||
Register[0x80 + index] = wert;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Register[index] = wert;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetRegister(uint index, uint bit, bool wert)
|
|
||||||
{
|
|
||||||
SetRegister(index, SetBit(GetRegister(index), bit, wert));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetRegisterOhneBank(uint index, uint bit, bool wert)
|
|
||||||
{
|
|
||||||
Register[index] = SetBit(Register[index], bit, wert);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetRegisterOhneBank(uint index, uint wert)
|
public void SetRegisterOhneBank(uint index, uint wert)
|
||||||
{
|
{
|
||||||
Register[index] = wert;
|
// register die nur einmal auf bank1 + 2 existieren
|
||||||
}
|
if (index == ADDR_PCL + 0x80) index -= 0x80;
|
||||||
|
if (index == ADDR_STATUS + 0x80) index -= 0x80;
|
||||||
|
if (index == ADDR_FSR + 0x80) index -= 0x80;
|
||||||
|
if (index == ADDR_PCLATH + 0x80) index -= 0x80;
|
||||||
|
if (index == ADDR_INTCON + 0x80) index -= 0x80;
|
||||||
|
|
||||||
public bool GetRegisterOhneBank(uint index, uint bit)
|
if (index == ADDR_PCL) // PC direkt setzen
|
||||||
{
|
{
|
||||||
return GetBit(Register[index], bit);
|
wert &= 0xFF; // Only Low 8 Bit
|
||||||
|
uint high = GetRegister(ADDR_PCLATH);
|
||||||
|
high &= 0x1F; // Only Bit <0,1,2,3,4>
|
||||||
|
high <<= 8;
|
||||||
|
|
||||||
|
PCCounter = (int) (high | wert) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Register[index] = wert;
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint GetRegisterOhneBank(uint index)
|
public uint GetRegisterOhneBank(uint index)
|
||||||
@ -824,15 +788,55 @@ namespace PIC_Simulator.PIC
|
|||||||
if (index == ADDR_UNIMPL_B) return 0;
|
if (index == ADDR_UNIMPL_B) return 0;
|
||||||
|
|
||||||
// register die nur einmal auf bank1 + 2 existieren
|
// register die nur einmal auf bank1 + 2 existieren
|
||||||
if (index == ADDR_PCL + 0x80) return Register[ADDR_PCL];
|
if (index == ADDR_PCL + 0x80) index -= 0x80;
|
||||||
if (index == ADDR_STATUS + 0x80) return Register[ADDR_STATUS];
|
if (index == ADDR_STATUS + 0x80) index -= 0x80;
|
||||||
if (index == ADDR_FSR + 0x80) return Register[ADDR_FSR];
|
if (index == ADDR_FSR + 0x80) index -= 0x80;
|
||||||
if (index == ADDR_PCLATH + 0x80) return Register[ADDR_PCLATH];
|
if (index == ADDR_PCLATH + 0x80) index -= 0x80;
|
||||||
if (index == ADDR_INTCON + 0x80) return Register[ADDR_INTCON];
|
if (index == ADDR_INTCON + 0x80) index -= 0x80;
|
||||||
|
|
||||||
return Register[index];
|
return Register[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private uint GetRegister(uint index)
|
||||||
|
{
|
||||||
|
if ((Register[ADDR_STATUS] & STATUS_BIT_RP0) == STATUS_BIT_RP0)
|
||||||
|
{
|
||||||
|
return GetRegisterOhneBank(0x80 + index);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return GetRegisterOhneBank(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetRegister(uint index, uint wert)
|
||||||
|
{
|
||||||
|
if ((Register[ADDR_STATUS] & STATUS_BIT_RP0) == STATUS_BIT_RP0)
|
||||||
|
{
|
||||||
|
SetRegisterOhneBank(0x80 + index, wert);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetRegisterOhneBank(index, wert);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetRegisterOhneBank(uint index, uint bit, bool wert)
|
||||||
|
{
|
||||||
|
SetRegisterOhneBank(index, SetBit(GetRegisterOhneBank(index), bit, wert));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void SetRegister(uint index, uint bit, bool wert)
|
||||||
|
{
|
||||||
|
SetRegister(index, SetBit(GetRegister(index), bit, wert));
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool GetRegisterOhneBank(uint index, uint bit)
|
||||||
|
{
|
||||||
|
return GetBit(GetRegisterOhneBank(index), bit);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool AdditionDigitCarry(uint a, uint b)
|
public static bool AdditionDigitCarry(uint a, uint b)
|
||||||
{
|
{
|
||||||
a &= 0x0F;
|
a &= 0x0F;
|
||||||
|
Loading…
Reference in New Issue
Block a user