I came across a nice article about dynamic ramping with some PIC example code, and got to playing with it. One thing led to another, and here is a restatement of the paper's premise and a port to an ATmega16.
Basically the physics and geometry of the motor system is reduced to two integers, one for acceleration/deceleration and the other for maximum speed. The move function does the rest. It generates constant acceleration and deceleration, imposing the maximum speed if necessary, all in the requested number of steps.
Special thanks to those who helped smooth out the rough draft - pradheep, Smiley, and Randy (rstahlhu).
The code is in ImageCraft C (don't forget that free 45 day demo version before you sneer), but Smiley has threatened to port it to IVC (Infinite Value Compiler) when he gets a chance.