     }
     
     /**
-     * The main loop
-     */
-    private func loop()
-    {
-        // Handle the next instruction
-        self.tickInstruction()
-
-        // Make sure the timers countdown
-        self.countdownTimers()
-        
-        // Make sound if needed
-        self.makeNoise()
-        
+     * The countdown timer loop
+     */
+    private func timerLoop()
+    {
+        if(self.isRunning)
+        {
+            // Make sure the timers countdown
+            self.countdownTimers()
+            
+            // Make sound if needed
+            self.makeNoise()
+
+            // And call self recursively after that delay
+            dispatch_after(self.timerDelay, dispatch_get_main_queue(), self.timerLoop)
+        }
+
+    }
+    
+    /**
+     * The CPU Cycle loop
+     */
+    private func CPUCycleLoop()
+    {
         // Determine if we should continue the loop
         if(self.isRunning)
         {
-            // Delaying one 60th of a second
-            let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(1.0/60.0 * Double(NSEC_PER_SEC)))
-            
+            // Handle the next instruction
+            self.tickInstruction()
+
             // And call self recursively after that delay
-            dispatch_after(delay, dispatch_get_main_queue(), self.loop)
+            dispatch_after(self.CPUDelay, dispatch_get_main_queue(), self.CPUCycleLoop)
         }
     }
     

    func startLoop()
    {
        self.isRunning = true
        self.loop()
    }
    
    /**
    * Stops the loop
    */
    func stopLoop()
    {
        self.isRunning = false

    let graphics : Graphics
    let sound : Sound
    let keyboard : Keyboard
    
    // The countdown timer will tick every 60ms
    let timerDelay = dispatch_time(DISPATCH_TIME_NOW, Int64(1.0/60.0 * Double(NSEC_PER_SEC)))

    // The CPU every ms
    let CPUDelay = dispatch_time(DISPATCH_TIME_NOW, Int64(1.0/1000.0 * Double(NSEC_PER_SEC)))
    
    // Mapping every opcode to a closure
    
