Many thanks CAB, but I have to laugh.
I started to add a standard error trap to this old code this afternoon then after a short while my edits appeared to be having the opposite or no effect, very confusing.
I got home from work and ran that same code on my home pc and everything worked as expected, even more confusing me thinks.
So I began to add your code snippet (many thanks btw, it's more intuitive than my approach) and then realised my mistake: Half way through working on the lisp file I ran the 2DMOVE command from my pull down menu, this loaded a 'VLX' of the same file but with the "OSMODE" in a slightly different position. Once loaded the VLX defun killed any further LSP defuns making my edits pretty much useless. I'm just off now to find out if VLX's can be unloaded like ARX's can.
(defun c:2Dmove (/ OLDCMD OLDSNAP SS PNT NEWPNT 2D)
(defun 2D (p)(list (car p)(cadr p)))
(setq OLDSNAP (getvar "OSMODE"))
(prompt "\nSelect Objects to Move > ")
(setq SS (ssget))
(setq PNT (2D (getpoint "\nPick Base Point for Displacement > ")))
(setq NEWPNT (2D (getpoint PNT "\nPick Second Point > ")))
(setvar "OSMODE" 0)
(command "_MOVE" SS "" PNT NEWPNT)
(setvar "OSMODE" OLDSNAP)
(princ)
)
And the moral of this story, dont rush coding last thing on a Friday afternoon, no matter how basic the coding is.