That got me thinking, I was using this routine to get a range of bits:

uint32_t BITS(uint32_t x, u8 m, u8 n) {return ( ((x) >> (n)) & ( ((uint32_t) 1 << ((m) - (n) + 1)) - 1));}

but I see now that if you use BIT(T x, U n, V w) from src/lib/util/coretmpl.h

so I can change:

/*
m_silentype_printer->update_cr_stepper(BITS(m_parallel_reg, 3, 0));
m_silentype_printer->update_pf_stepper(BITS(m_parallel_reg, 7, 4));
m_silentype_printer->update_printhead (BITS(m_parallel_reg, 15, 9));
*/

into this:

m_silentype_printer->update_cr_stepper(BIT(m_parallel_reg, 0, 4));
m_silentype_printer->update_pf_stepper(BIT(m_parallel_reg, 4, 4));
m_silentype_printer->update_printhead (BIT(m_parallel_reg, 9, 7));


"I did not know that." 8-)