;;; Saved from:http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/copy-objects-using-previous-basepoint/td-p/6055976

(defun C:Bp(/ *error* cosmode ccolor curlayer cline n ss)

(defun *error* (msg)
(if (not (wcmatch msg "Function cancelled,quit / exit abort,console break"))
(prompt (strcat "Error: " msg))
); if
(setvar 'osmode cosmode)
(setvar 'cecolor ccolor)
(setvar 'clayer curlayer)
(setvar 'celtype cline)
(repeat (setq n (sslength (setq ss (ssget "_P"))))
(entdel (ssname ss (setq n (1- n))))
; [remove latest copy that's being Moved when routine is cancelled]
); repeat

cosmode (getvar 'osmode)
ccolor (getvar 'cecolor)
curlayer (getvar 'clayer)
cline (getvar 'celtype)

"_.select" pause ; allows any amount of selection; don't need selection-set variable here
"_.copy" "_previous" "" pause "_none" "@"
; copy in-place [pause gets initial base pt without need for variable]
"_.move" "_previous" "" "_none" "@" pause
); command
(while T ; as long as you want to keep going
"_.copy" "_previous" "" "_none" "@" "_none" "@" ; copy in-place
"_.move" "_previous" "" "_none" "@" pause
); command
); while
); defun