diff --git a/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.cpp b/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.cpp
index 361620b9d4e89ae076108b4ee997d98abe618d0f..6638cce631f82286924567c8bb7dc8f7c87e2045 100644
--- a/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.cpp
+++ b/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.cpp
@@ -179,6 +179,10 @@ void STEP_A4950::setCurrent(float cscale){
     dacs->writeDac1(dacLUT[_bStep] * _cscale);
 }
 
+void STEP_A4950::setInversion(boolean inv){
+    _dir_invert = inv;
+}
+
 void STEP_A4950::dacRefresh(void){
     dacs->refresh();
 }
diff --git a/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.h b/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.h
index 5f9dad84cd70bf9aad9383e1d88122ab5b71f709..a6fa398aeea785a855fd89442876e57d331104b5 100644
--- a/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.h
+++ b/firmware/osape-smoothieroll-drop-stepper/src/drivers/step_a4950.h
@@ -93,6 +93,7 @@ class STEP_A4950 {
     boolean getDir(void);
     // current settings 
     void setCurrent(float cscale);
+    void setInversion(boolean inv);
     // for the dacs 
     void dacRefresh(void);
 };
diff --git a/firmware/osape-smoothieroll-drop-stepper/src/main.cpp b/firmware/osape-smoothieroll-drop-stepper/src/main.cpp
index 9161b462dc27aaba72444e2b2b7479ead463c5ea..dd1bb524b42db30cdf54613a5e7e3bc223af7188 100644
--- a/firmware/osape-smoothieroll-drop-stepper/src/main.cpp
+++ b/firmware/osape-smoothieroll-drop-stepper/src/main.cpp
@@ -8,22 +8,59 @@
 OSAP* osap = new OSAP("stepper motor drop");
 VPort_UCBus_Drop* vPortUcBusDrop = new VPort_UCBus_Drop();
 
-// clank cz:
-// AXIS   SPU     INVERT
-// X:     320     false
-// YL:    320     true
-// YR:    320     false
-// Z:     924.4r  false
-// E:     830     currently false, not sure  
-// per bondtech, for BMG on 16 microsteps, do 415: we are 32 microsteps 
-// https://www.bondtech.se/en/customer-service/faq/ 
-
-#define AXIS_PICK 0   // E: 3 Z: 2, Y: 1, X: 0
-#define AXIS_INVERT false  
-#define SPU 320 //924.444444F 
-#define C_SCALE 0.4F // 0-1, floating
+// bare defaults: use vm / bus id to set on startup 
+uint8_t axis_pick = 0;
+float spu = 400.0F;
+float old_spu = 400.0F;
+volatile boolean spu_was_set = false;
+float c_scale = 0.2F;
 #define TICKS_PER_PACKET 25.0F
 
+// ENDPOINT 0
+boolean onAxisPickSet(uint8_t* data, uint16_t len){
+  if(data[0] > 3){
+    axis_pick = 0;
+  } else {
+    axis_pick = data[0];
+  }
+  return true;
+}
+Endpoint* axisPickEP = osap->endpoint(onAxisPickSet);
+
+// ENDPOINT 1
+boolean onAxisInvertSet(uint8_t* data, uint16_t len){
+  if(data[0] > 0){
+    stepper_hw->setInversion(true);
+  } else {
+    stepper_hw->setInversion(false);
+  }
+  return true;
+}
+Endpoint* axisInvertEP = osap->endpoint(onAxisInvertSet);
+
+// ENDPOINT 2
+boolean onSPUSet(uint8_t* data, uint16_t len){
+  chunk_float32 spuc = { .bytes = { data[0], data[1], data[2], data[3] } };
+  old_spu = spu;
+  spu = fabsf(spuc.f);
+  spu_was_set = true;
+  return true;
+}
+Endpoint* spuEP = osap->endpoint(onSPUSet);
+
+// ENDPOINT 3
+boolean onCScaleSet(uint8_t* data, uint16_t len){
+  chunk_float32 cscalec = { .bytes = { data[0], data[1], data[2], data[3] } };
+  if(cscalec.f > 1.0F){
+    cscalec.f = 1.0F;
+  } else if (cscalec.f < 0.0F){
+    cscalec.f = 0.0F;
+  }
+  stepper_hw->setCurrent(cscalec.f);
+  return true;
+}
+Endpoint* cscaleEP = osap->endpoint(onCScaleSet);
+
 void setup() {
   ERRLIGHT_SETUP;
   CLKLIGHT_SETUP;
@@ -35,7 +72,7 @@ void setup() {
   osap->description = "remote stepper drop";
   osap->addVPort(vPortUcBusDrop);
   // stepper
-  stepper_hw->init(AXIS_INVERT, C_SCALE);
+  stepper_hw->init(false, c_scale);
 }
 
 // have available, 
@@ -61,14 +98,20 @@ void UCBus_Drop::onPacketARx(void){
   if(setBlock) return;
   //DEBUG2PIN_TOGGLE;
   // last move is done, convert back steps -> float,
-  current_floating_pos = current_step_pos / SPU;
+  if(spu_was_set){
+    current_floating_pos = current_step_pos / old_spu;
+    current_step_pos = lroundf(current_floating_pos * spu);
+    spu_was_set = false;
+  } else {
+    current_floating_pos = current_step_pos / spu;
+  }
   vel = 0.0F; // reset zero in case packet is not move 
   uint8_t bptr = 0;
   // switch bus packet types 
   switch(inBufferA[0]){
     case UB_AK_GOTOPOS:
       {
-        bptr = AXIS_PICK * 4 + 1;
+        bptr = axis_pick * 4 + 1;
         chunk_float32 target = {
           .bytes = { inBufferA[bptr], inBufferA[bptr + 1], inBufferA[bptr + 2], inBufferA[bptr + 3] }
         };
@@ -87,9 +130,9 @@ void UCBus_Drop::onPacketARx(void){
           stepper_hw->dir(false);
         }
         // how many steps, 
-        delta_steps = lroundf(abs(delta * SPU));
+        delta_steps = lroundf(abs(delta * spu));
         // what speed 
-        vel = abs(delta * SPU) / TICKS_PER_PACKET;
+        vel = abs(delta * spu) / TICKS_PER_PACKET;
         // for str8 r8 
         /*
         if(delta_steps == 0){
@@ -103,12 +146,12 @@ void UCBus_Drop::onPacketARx(void){
     case UB_AK_SETPOS:
       {
         // reqest is to set position, not go to it... 
-        bptr = AXIS_PICK * 4 + 1;
+        bptr = axis_pick * 4 + 1;
         chunk_float32 target = {
           .bytes = { inBufferA[bptr], inBufferA[bptr + 1], inBufferA[bptr + 2], inBufferA[bptr + 3] }
         };
         float target_current_pos = target.f;
-        int32_t target_current_steps = lroundf(target_current_pos * SPU);
+        int32_t target_current_steps = lroundf(target_current_pos * spu);
         setBlock = true; // don't do step work while these are modified 
         current_floating_pos = target_current_pos;
         current_step_pos = target_current_steps;
diff --git a/firmware/osape-smoothieroll-drop-stepper/src/osape b/firmware/osape-smoothieroll-drop-stepper/src/osape
index 0a37169e44d354fa301704ac0a351fb81bcca585..7bbcbf8d8364d9beaf501d1acf6b34a77e4086f3 160000
--- a/firmware/osape-smoothieroll-drop-stepper/src/osape
+++ b/firmware/osape-smoothieroll-drop-stepper/src/osape
@@ -1 +1 @@
-Subproject commit 0a37169e44d354fa301704ac0a351fb81bcca585
+Subproject commit 7bbcbf8d8364d9beaf501d1acf6b34a77e4086f3
diff --git a/log/2021-02-03_phase-steps-angle.jpg b/log/2021-02-03_phase-steps-angle.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d97f1842347dc9095978bbe0441977b8dec94ba4
Binary files /dev/null and b/log/2021-02-03_phase-steps-angle.jpg differ
diff --git a/log/cl-step-control-log.md b/log/cl-step-control-log.md
index ed8c6bc187cd9786a4f458d1e2cf3e71e5cf32ab..ca800e55c0f761af34e4347ef9485fdd11394b64 100644
--- a/log/cl-step-control-log.md
+++ b/log/cl-step-control-log.md
@@ -353,6 +353,12 @@ I'm just going to get into the 'magnetic angle' pointing system for the DACs now
 
 This makes sense: so when I'm at '0 degs' my A phase is on 100%, B phase is zero. Or, the way I've my LUT written, I'll have A at 0 and B at full-width positive. If I don't like this for some reason (It'll calibrate away) I can change the LUT.
 
+FWIW **at 2021 02 03** I ended up drawing this out later:
+
+![phase](2021-02-03_phase-steps-angle.jpg)
+
+In the stepper, we have one 'complete electrical phase' inside of four of what we normally call 'steps' - this spans 7.2 physical degrees when we have a 200 'step' (pole) motor. 
+
 I'm up to pointing, now I just need to deliver some power to the motor. 
 
 OK, this is making sense and I can point my magnetic vector around: