diff --git a/Marlin/src/gcode/feature/pause/G60.cpp b/Marlin/src/gcode/feature/pause/G60.cpp
deleted file mode 100644
index 21dbe1bf81..0000000000
--- a/Marlin/src/gcode/feature/pause/G60.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- *
- * Based on Sprinter and grbl.
- * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- */
-
-#include "../../../inc/MarlinConfig.h"
-
-#if SAVED_POSITIONS
-
-#include "../../gcode.h"
-#include "../../../module/motion.h"
-
-#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG)
-#include "../../../core/debug_out.h"
-
-bool report_stored_position(const uint8_t slot) {
- if (!did_save_position[slot]) return false;
- const xyze_pos_t &pos = stored_position[slot];
- SERIAL_ECHO(STR_SAVED_POSITION, slot, C(':'));
- #if NUM_AXES
- SERIAL_ECHOPGM_P(LOGICAL_AXIS_PAIRED_LIST(
- SP_E_LBL, pos.e,
- SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z,
- SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k,
- SP_U_LBL, pos.u, SP_V_LBL, pos.v, SP_W_LBL, pos.w
- ));
- #endif
- SERIAL_EOL();
- return true;
-}
-
-/**
- * G60: Saved Positions
- *
- * S - Save to a memory slot. (default 0)
- * Q - Restore from a memory slot. (default 0)
- * D - Delete a memory slot. With no number, delete all.
- */
-void GcodeSuite::G60() {
- // With no parameters report any saved positions
- if (!parser.seen_any()) {
- uint8_t count = 0;
- for (uint8_t s = 0; s < SAVED_POSITIONS; ++s)
- if (report_stored_position(s)) ++count;
- if (!count) SERIAL_ECHOLNPGM("No Saved Positions");
- return;
- }
-
- // Only one of these parameters is permitted
- const uint8_t seenD = parser.seen_test('D'),
- seenQ = parser.seen_test('Q'),
- seenS = parser.seen_test('S');
- if (seenD + seenQ + seenS > 1) return;
-
- // G60 D : Delete all saved positions
- if (seenD && !parser.seenval('D')) {
- did_save_position.reset();
- return;
- }
-
- // G60 Dn / Q / S : Get the slot value
- const uint8_t slot = parser.byteval(seenD ? 'D' : seenQ ? 'Q' : 'S');
-
- // G60 Q : Redirect to G61(slot)
- if (seenQ) return G61(slot);
-
- // Valid slot number?
- if (SAVED_POSITIONS < 256 && slot >= SAVED_POSITIONS) {
- SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
- return;
- }
-
- // G60 Dn
- if (seenD) {
- SERIAL_ECHOLNPGM(STR_SAVED_POSITION, slot, ": DELETED");
- did_save_position.clear(slot);
- return;
- }
-
- // G60 S
- stored_position[slot] = current_position;
- did_save_position.set(slot);
- report_stored_position(slot);
-}
-
-#endif // SAVED_POSITIONS
diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G60_G61.cpp
similarity index 65%
rename from Marlin/src/gcode/feature/pause/G61.cpp
rename to Marlin/src/gcode/feature/pause/G60_G61.cpp
index 7f2a45bc93..8a24433cdb 100644
--- a/Marlin/src/gcode/feature/pause/G61.cpp
+++ b/Marlin/src/gcode/feature/pause/G60_G61.cpp
@@ -24,7 +24,6 @@
#if SAVED_POSITIONS
-#include "../../../module/planner.h"
#include "../../gcode.h"
#include "../../../module/motion.h"
#include "../../../module/planner.h"
@@ -32,6 +31,79 @@
#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG)
#include "../../../core/debug_out.h"
+Flags did_save_position;
+xyze_pos_t stored_position[SAVED_POSITIONS];
+
+bool report_stored_position(const uint8_t slot) {
+ if (!did_save_position[slot]) return false;
+ const xyze_pos_t &pos = stored_position[slot];
+ SERIAL_ECHO(STR_SAVED_POSITION, slot, C(':'));
+ #if NUM_AXES
+ SERIAL_ECHOPGM_P(LOGICAL_AXIS_PAIRED_LIST(
+ SP_E_LBL, pos.e,
+ SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z,
+ SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k,
+ SP_U_LBL, pos.u, SP_V_LBL, pos.v, SP_W_LBL, pos.w
+ ));
+ #endif
+ SERIAL_EOL();
+ return true;
+}
+
+/**
+ * G60: Saved Positions
+ *
+ * S - Save to a memory slot. (default 0)
+ * Q - Restore from a memory slot. (default 0)
+ * D - Delete a memory slot. With no number, delete all.
+ */
+void GcodeSuite::G60() {
+ // With no parameters report any saved positions
+ if (!parser.seen_any()) {
+ uint8_t count = 0;
+ for (uint8_t s = 0; s < SAVED_POSITIONS; ++s)
+ if (report_stored_position(s)) ++count;
+ if (!count) SERIAL_ECHOLNPGM("No Saved Positions");
+ return;
+ }
+
+ // Only one of these parameters is permitted
+ const uint8_t seenD = parser.seen_test('D'),
+ seenQ = parser.seen_test('Q'),
+ seenS = parser.seen_test('S');
+ if (seenD + seenQ + seenS > 1) return;
+
+ // G60 D : Delete all saved positions
+ if (seenD && !parser.seenval('D')) {
+ did_save_position.reset();
+ return;
+ }
+
+ // G60 Dn / Q / S : Get the slot value
+ const uint8_t slot = parser.byteval(seenD ? 'D' : seenQ ? 'Q' : 'S');
+
+ // G60 Q : Redirect to G61(slot)
+ if (seenQ) return G61(slot);
+
+ // Valid slot number?
+ if (SAVED_POSITIONS < 256 && slot >= SAVED_POSITIONS) {
+ SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
+ return;
+ }
+
+ // G60 Dn
+ if (seenD) {
+ SERIAL_ECHOLNPGM(STR_SAVED_POSITION, slot, ": DELETED");
+ did_save_position.clear(slot);
+ return;
+ }
+
+ // G60 S
+ stored_position[slot] = current_position;
+ did_save_position.set(slot);
+ report_stored_position(slot);
+}
+
/**
* G61: Return to saved position
*
diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp
index 1282e605eb..cb99000451 100644
--- a/Marlin/src/module/motion.cpp
+++ b/Marlin/src/module/motion.cpp
@@ -107,12 +107,6 @@ xyze_pos_t current_position = LOGICAL_AXIS_ARRAY(0, X_HOME_POS, Y_HOME_POS, Z_IN
*/
xyze_pos_t destination; // {0}
-// G60/G61 Position Save and Return
-#if SAVED_POSITIONS
- Flags did_save_position;
- xyze_pos_t stored_position[SAVED_POSITIONS];
-#endif
-
// The active extruder (tool). Set with T command.
#if HAS_MULTI_EXTRUDER
uint8_t active_extruder = 0; // = 0
diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h
index e74562728d..7cafb2f019 100644
--- a/Marlin/src/module/motion.h
+++ b/Marlin/src/module/motion.h
@@ -48,12 +48,6 @@ extern bool relative_mode;
extern xyze_pos_t current_position, // High-level current tool position
destination; // Destination for a move
-// G60/G61 Position Save and Return
-#if SAVED_POSITIONS
- extern Flags did_save_position;
- extern xyze_pos_t stored_position[SAVED_POSITIONS];
-#endif
-
// Scratch space for a cartesian result
extern xyz_pos_t cartes;
diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp
index 1d6fa06998..24ee80a2cc 100644
--- a/Marlin/src/sd/cardreader.cpp
+++ b/Marlin/src/sd/cardreader.cpp
@@ -1378,14 +1378,7 @@ void CardReader::cdroot() {
#endif
#endif
- #else // !SDSORT_USES_RAM
-
- // By default re-read the names from SD for every compare
- // retaining only two filenames at a time. This is very
- // slow but is safest and uses minimal RAM.
- char name1[LONG_FILENAME_LENGTH];
-
- #endif
+ #endif // SDSORT_USES_RAM
if (fileCnt > 1) {
diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py
index 210dc8fd0b..2cb54d7c08 100644
--- a/buildroot/share/PlatformIO/scripts/preflight-checks.py
+++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py
@@ -149,14 +149,18 @@ if pioutil.is_pio_build():
# Check for old files indicating an entangled Marlin (mixing old and new code)
#
mixedin = []
- p = project_dir / "Marlin/src/lcd/dogm"
+ p = mpath / "src/lcd/dogm"
for f in [ "ultralcd_DOGM.cpp", "ultralcd_DOGM.h", "u8g_dev_ssd1306_sh1106_128x64_I2C.cpp", "u8g_dev_ssd1309_12864.cpp", "u8g_dev_st7565_64128n_HAL.cpp", "u8g_dev_st7920_128x64_HAL.cpp", "u8g_dev_tft_upscale_from_128x64.cpp", "u8g_dev_uc1701_mini12864_HAL.cpp", "ultralcd_st7920_u8glib_rrd_AVR.cpp" ]:
if (p / f).is_file():
mixedin += [ f ]
- p = project_dir / "Marlin/src/feature/bedlevel/abl"
+ p = mpath / "src/feature/bedlevel/abl"
for f in [ "abl.cpp", "abl.h" ]:
if (p / f).is_file():
mixedin += [ f ]
+ f = mpath / "src/gcode/feature/pause"
+ for f in [ "G60.cpp", "G61.cpp" ]:
+ if (p / f).is_file():
+ mixedin += [ f ]
if mixedin:
err = "ERROR: Old files fell into your Marlin folder. Remove %s and try again" % ", ".join(mixedin)
raise SystemExit(err)
diff --git a/ini/features.ini b/ini/features.ini
index a346793954..bd45dd02c1 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -319,7 +319,7 @@ HAS_ZV_SHAPING = build_src_filter=+
GRADIENT_MIX = build_src_filter=+
NONLINEAR_EXTRUSION = build_src_filter=+
-HAS_SAVED_POSITIONS = build_src_filter=+ +
+HAS_SAVED_POSITIONS = build_src_filter=+
PARK_HEAD_ON_PAUSE = build_src_filter=+
FILAMENT_LOAD_UNLOAD_GCODES = build_src_filter=+
HAS_STEALTHCHOP = build_src_filter=+