@dc42, I added "gb.MustSee('S');" to RepRapFirmware\src\GCodes/GCodes2.cpp at key area of Case3 ( the section for M3, near line 539) and the subsequent Case 4.
I also commented out line 669 of file /src/tools/tools.cpp
" if (reprap.GetCurrentTool() == this) " AND when I tried to make these changes to 3.3RC1, I discovered a reinstatement of line 100 that was commented out in previous versions in file \src\Tools/spindle.cpp
The reinstatement of line 100 "if (updateCurrentRpm)" was problematic for what I was trying to do, so I commented it back out.
Up until 2 weeks ago, I have never compiled source code. I have no experience with writing in any kind of true application language, just scripting like Gcode, windows batch files, and other superficial stuff like that. After noticing the message " Error: M3: internal error at file ../src/GCodes/GCodeBuffer/StringParser.cpp(1362) " when I tried to control a spindle that was not active (like I was able to in previous versions) I decided to take a crack at this. Now I am like a kid in a candy store and have significantly changed Case 3 and Case 4 (M3 and M4 section). Of course, someone who knows what they are doing could probably do what I did much more efficiently, but this is fun for me. It took me hours upon hours just to figure out how to compile anything and then many more hours figuring out how to compile something that did not brick the Duet2. I am now very familiar with the erase pins on the board.