RB0 und PortB interrupt

This commit is contained in:
Mike Schwörer 2017-05-16 11:05:59 +02:00
parent bb37de8eb4
commit 83a0a42684
1 changed files with 68 additions and 0 deletions

View File

@ -836,6 +836,11 @@ namespace PIC_Simulator.PIC
return;
}
if (index == ADDR_PORT_B)
{
Interrupt_RB(Register[index], (byte)wert);
}
Register[index] = (byte)(wert & 0xFF);
if (index == ADDR_PORT_A || index == ADDR_TRIS_A)
@ -861,6 +866,42 @@ namespace PIC_Simulator.PIC
}
}
private void Interrupt_RB(byte alt, byte neu)
{
// RB0/INT
if (GetBit(alt, 0) != GetBit(neu, 0))
{
if (GetRegisterOhneBank(ADDR_OPTION, OPTION_BIT_INTEDG) && GetBit(neu, 0)) // aufsteigende flanke
{
RB0Interrupt();
}
else if (!GetRegisterOhneBank(ADDR_OPTION, OPTION_BIT_INTEDG) && !GetBit(neu, 0)) // Fallende flanke
{
RB0Interrupt();
}
}
// PORT RB
if (GetBit(alt, 4) != GetBit(neu, 4) && GetRegisterOhneBank(ADDR_TRIS_B, 4))
{
PortBInterrupt();
}
else if (GetBit(alt, 5) != GetBit(neu, 5) && GetRegisterOhneBank(ADDR_TRIS_B, 5))
{
PortBInterrupt();
}
else if (GetBit(alt, 6) != GetBit(neu, 6) && GetRegisterOhneBank(ADDR_TRIS_B, 6))
{
PortBInterrupt();
}
else if (GetBit(alt, 7) != GetBit(neu, 7) && GetRegisterOhneBank(ADDR_TRIS_B, 7))
{
PortBInterrupt();
}
}
public byte GetRegisterOhneBank(uint index)
{
if (index == ADDR_UNIMPL_A) return 0;
@ -993,10 +1034,37 @@ namespace PIC_Simulator.PIC
if (!GetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_T0IE)) return;
SetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_T0IF, true);
SetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_GIE, false);
Stack.Push((uint)PCCounter);
PCCounter = (int) INTERRUPT_SERVICE_ADDRESS;
}
public void RB0Interrupt()
{
if (!GetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_GIE)) return;
if (!GetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_INTE)) return;
SetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_INTF, true);
SetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_GIE, false);
Stack.Push((uint)PCCounter);
PCCounter = (int)INTERRUPT_SERVICE_ADDRESS;
}
public void PortBInterrupt()
{
if (!GetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_GIE)) return;
if (!GetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_RBIE)) return;
SetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_RBIF, true);
SetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_GIE, false);
Stack.Push((uint)PCCounter);
PCCounter = (int)INTERRUPT_SERVICE_ADDRESS;
}
}
}