From bb37de8eb4410a088a83d884ebc24a005caebb7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Tue, 16 May 2017 10:11:35 +0200 Subject: [PATCH] Timer interrupt --- PIC_Simulator/PIC/PICProgramm.cs | 19 ++++++++++++++++++- PIC_Simulator/PIC/PICTimer.cs | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/PIC_Simulator/PIC/PICProgramm.cs b/PIC_Simulator/PIC/PICProgramm.cs index aa0a8e6..9a2b686 100644 --- a/PIC_Simulator/PIC/PICProgramm.cs +++ b/PIC_Simulator/PIC/PICProgramm.cs @@ -66,6 +66,8 @@ namespace PIC_Simulator.PIC public const uint INTCON_BIT_INTF = 1; // RB0/INT Interrupt Flag Bit public const uint INTCON_BIT_RBIF = 0; // RB Port Change Interrupt Flag Bit + public const uint INTERRUPT_SERVICE_ADDRESS = 0x04; + public const string ADDWF = "000111dfffffff"; public const string ANDWF = "000101dfffffff"; @@ -650,6 +652,7 @@ namespace PIC_Simulator.PIC Stack.Push((uint) PCCounter); PCCounter = (int) (aktueller_befehl.parameter_k - 1); + cycleCount = 2; } else if (aktueller_befehl.befehl == CLRWDT) { @@ -710,7 +713,9 @@ namespace PIC_Simulator.PIC // (INTCON < 7 >).This is a two cycle // instruction. - //TODO + PCCounter = (int) Stack.Pop(); + SetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_GIE, true); + cycleCount = 2; } else if (aktueller_befehl.befehl == RETLW) { @@ -981,5 +986,17 @@ namespace PIC_Simulator.PIC PCCounter = 0; } + + public void TimerInterrupt() + { + if (!GetRegisterOhneBank(ADDR_INTCON, INTCON_BIT_GIE)) return; + 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; + } } } diff --git a/PIC_Simulator/PIC/PICTimer.cs b/PIC_Simulator/PIC/PICTimer.cs index 89f5c53..c52c0e7 100644 --- a/PIC_Simulator/PIC/PICTimer.cs +++ b/PIC_Simulator/PIC/PICTimer.cs @@ -59,7 +59,7 @@ namespace PIC_Simulator.PIC uint Result = current + 1; if (Result > 0xFF) { - //TODO Interrupt PIT_TIMER + programm.TimerInterrupt(); } Result %= 0x100;