At the moment it's used by a parent macro that calculates the button corners for each structure level to produce an elevator style button panel, but a shell macro that draws a single button is easily written.
Code:
MACRO ML_OneBtn
gp pButtonL ^DSelect lower left corner of button: 
gp pButtonH ^DSelect upper right corner of button: 
getx vX1 pButtonL
getx vX2 pButtonH
gety vY1 pButtonL
gety vY2 pButtonH
ifn vX1-vX2 ML1B_FlipX
getx vX2 pButtonL
getx vX1 pButtonH
:ML1B_FlipX
ifn vY1-vY2 ML1B_FlipY
getY vY2 pButtonL
getY vY1 pButtonH
:ML1B_FlipY
gp pButtonL vX1,vY1
gp pButtonH vX2,vY2
gn nCurLvl ^DEnter level # button goes to: 
ML_DRAWBTN
ENDM
Note that most of this macro is about making sure that pButtonL is the lower left corner and pButtonH is the upper right. I also made a slight change in the ML_DRAWBTN macro code by placing the last section (that draws the yellow "backlit" box) first so the out-of-range error check in the GoCurLvl macro is run before anything is drawn. The revised code is
Code:
MACRO ML_DRAWBTN
GoCurLvl
sheet MAP BORDER
color 4
fstyle Solid
box pButtonL pButtonH
setlayer BUTTONS
color 15
fstyle Hollow
box pButtonL pButtonH
gl sMacCmd ~gn nCur
apnd sMacCmd Lvl
apnd sMacCmd;
apnd sMacCmd nCurLvl
apnd sMacCmd;
apnd sMacCmd GoCur
apnd sMacCmd Lvl
apnd sMacCmd;
color 2
tspech 1
actionm sMacCmd
pButtonL pButtonH
sheet TEXT
color 15
getx vX1 pButtonL
gety vY1 pButtonL
getx vX2 pButtonH
gety vY2 pButtonH
gp pButtonC (vX1+vX2)/2,(vY1+vY2)/2
tspech (vY2-vY1)/2
textm nCurLvl
pButtonC
ENDM
--

Dalton "who loves feedback; it makes me smarter " Spence