diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index 1d25ee8f068f9dfcaa7bebb1ad8afc9efb12fe9a..34a7f9ce1288f56e544278c2f0d0982798082fec 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -363,15 +363,13 @@ void suicide() {
 /**
  * Sensitive pin test for M42, M226
  */
-static bool pin_is_protected(const int8_t pin) {
+bool pin_is_protected(const int8_t pin) {
   static const int8_t sensitive_pins[] PROGMEM = SENSITIVE_PINS;
   for (uint8_t i = 0; i < COUNT(sensitive_pins); i++)
     if (pin == (int8_t)pgm_read_byte(&sensitive_pins[i])) return true;
   return false;
 }
 
-#include "gcode/control/M42.h"
-
 #if ENABLED(PINS_DEBUGGING)
   #include "gcode/config/M43.h"
 #endif
diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h
index 7695f03e5b31e17a5f7d6be61b2869d6a23fe5d6..3918e38a1e652ddbc0da47b86c766c1ad6076115 100644
--- a/Marlin/src/Marlin.h
+++ b/Marlin/src/Marlin.h
@@ -228,4 +228,6 @@ extern volatile bool wait_for_heatup;
 
 void calculate_volumetric_multipliers();
 
+bool pin_is_protected(const int8_t pin);
+
 #endif // __MARLIN_H__
diff --git a/Marlin/src/gcode/control/M42.h b/Marlin/src/gcode/control/M42.cpp
similarity index 92%
rename from Marlin/src/gcode/control/M42.h
rename to Marlin/src/gcode/control/M42.cpp
index ec559d691115adda184e17e81db5d770a9359321..44a1892ec3f60b94fc50c1a0ab72a896347230ad 100644
--- a/Marlin/src/gcode/control/M42.h
+++ b/Marlin/src/gcode/control/M42.cpp
@@ -20,13 +20,17 @@
  *
  */
 
+#include "../gcode.h"
+#include "../../Marlin.h" // for pin_is_protected
+#include "../../inc/MarlinConfig.h"
+
 /**
  * M42: Change pin status via GCode
  *
  *  P<pin>  Pin number (LED if omitted)
  *  S<byte> Pin status from 0 - 255
  */
-void gcode_M42() {
+void GcodeSuite::M42() {
   if (!parser.seenval('S')) return;
   const byte pin_status = parser.value_byte();
 
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 8b886593ee61dfae93ec00b30ca6c75963adcfaf..547b03b242904b4671ef8f0ca8ebadf9c060c780 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -117,7 +117,6 @@ void GcodeSuite::dwell(millis_t time) {
 // Placeholders for non-migrated codes
 //
 extern void gcode_M18_M84();
-extern void gcode_M42();
 extern void gcode_M43();
 extern void gcode_M48();
 extern void gcode_M75();
@@ -433,8 +432,7 @@ void GcodeSuite::process_next_command() {
 
       case 31: M31(); break;      // M31: Report time since the start of SD print or last M109
 
-      case 42: // M42: Change pin state
-        gcode_M42(); break;
+      case 42: M42(); break;      // M42: Change pin state
 
       #if ENABLED(PINS_DEBUGGING)
         case 43: // M43: Read pin state