From afc737ca0c8493603881a184f27bd245a943d25c Mon Sep 17 00:00:00 2001
From: alexborro <alexborro@gmail.com>
Date: Fri, 13 Feb 2015 14:38:05 -0200
Subject: [PATCH] Fix CoreXY Homing Routine.

Fixed how stepper ISR figure it out when the head (extruder) is going to
Min or Max direction.
Added Homing to Max Endstops.
---
 Marlin/Configuration.h |  5 -----
 Marlin/planner.cpp     | 12 ++++++++++--
 Marlin/stepper.cpp     | 16 ++++++++++------
 3 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index fef15933041..41e1ed7ed9b 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -326,11 +326,6 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 //#define DISABLE_MAX_ENDSTOPS
 //#define DISABLE_MIN_ENDSTOPS
 
-// Disable max endstops for compatibility with endstop checking routine
-#if defined(COREXY) && !defined(DISABLE_MAX_ENDSTOPS)
-  #define DISABLE_MAX_ENDSTOPS
-#endif
-
 // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
 #define X_ENABLE_ON 0
 #define Y_ENABLE_ON 0
diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp
index 82702286b1c..cee1981bc0e 100644
--- a/Marlin/planner.cpp
+++ b/Marlin/planner.cpp
@@ -629,13 +629,21 @@ block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-positi
     block->direction_bits |= (1<<Y_AXIS); 
   }
 #else
+  if (target[X_AXIS] < position[X_AXIS])
+  {
+    block->direction_bits |= (1<<X_HEAD); //AlexBorro: Save the real Extruder (head) direction in X Axis
+  }
+  if (target[Y_AXIS] < position[Y_AXIS])
+  {
+    block->direction_bits |= (1<<Y_HEAD); //AlexBorro: Save the real Extruder (head) direction in Y Axis
+  }
   if ((target[X_AXIS]-position[X_AXIS]) + (target[Y_AXIS]-position[Y_AXIS]) < 0)
   {
-    block->direction_bits |= (1<<X_AXIS); 
+    block->direction_bits |= (1<<X_AXIS); //AlexBorro: Motor A direction (Incorrectly implemented as X_AXIS)
   }
   if ((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-position[Y_AXIS]) < 0)
   {
-    block->direction_bits |= (1<<Y_AXIS); 
+    block->direction_bits |= (1<<Y_AXIS); //AlexBorro: Motor B direction (Incorrectly implemented as Y_AXIS)
   }
 #endif
   if (target[Z_AXIS] < position[Z_AXIS])
diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp
index 1b831cc8fb0..fe50e3704b8 100644
--- a/Marlin/stepper.cpp
+++ b/Marlin/stepper.cpp
@@ -401,10 +401,11 @@ ISR(TIMER1_COMPA_vect)
 
     // Set direction en check limit switches
     #ifndef COREXY
-    if ((out_bits & (1<<X_AXIS)) != 0) {   // stepping along -X axis
+    if ((out_bits & (1<<X_AXIS)) != 0)   // stepping along -X axis
     #else
-    if ((((out_bits & (1<<X_AXIS)) != 0)&&(out_bits & (1<<Y_AXIS)) != 0)) {   //-X occurs for -A and -B
+    if ((out_bits & (1<<X_HEAD)) != 0)   //AlexBorro: Head direction in -X axis for CoreXY bots.
     #endif
+    {
       CHECK_ENDSTOPS
       {
         #ifdef DUAL_X_CARRIAGE
@@ -425,7 +426,8 @@ ISR(TIMER1_COMPA_vect)
         }
       }
     }
-    else { // +direction
+    else 
+    { // +direction
       CHECK_ENDSTOPS
       {
         #ifdef DUAL_X_CARRIAGE
@@ -448,10 +450,11 @@ ISR(TIMER1_COMPA_vect)
     }
 
     #ifndef COREXY
-    if ((out_bits & (1<<Y_AXIS)) != 0) {   // -direction
+    if ((out_bits & (1<<Y_AXIS)) != 0)   // -direction
     #else
-    if ((((out_bits & (1<<X_AXIS)) != 0)&&(out_bits & (1<<Y_AXIS)) == 0)) {   // -Y occurs for -A and +B
+    if ((out_bits & (1<<Y_HEAD)) != 0)  //AlexBorro: Head direction in -Y axis for CoreXY bots.
     #endif
+    {
       CHECK_ENDSTOPS
       {
         #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
@@ -465,7 +468,8 @@ ISR(TIMER1_COMPA_vect)
         #endif
       }
     }
-    else { // +direction
+    else 
+    { // +direction
       CHECK_ENDSTOPS
       {
         #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1