I posted a short video on YouTube, but the boring uncut video is here in all its unglory. The example here is simply a 1" square milled with a 1/4" square-shoulder bit. It skipped a lot of steps in the Y direction, but the X direction came out within 0.010". (I brought it to work the next day and measured it with calibrated tooling there.)
The "mill" is a Harbor Freight drill with a keyless chuck. I probably paid $12 for it. It rides on two ball-bearing rails that once supported a minivan back seat and is controlled by a toothed belt drive from a large inkjet printer. The X-Y table was given to me by a former coworker; I'm told it was once in an engraver.
The stepper motors are driven by ULN2064 Darlington arrays which are powered from an old AT computer power supply. The ICs are mounted to the inside of an aluminum plate on a hobby project box. I strategically drilled holes in the box, the plate, and the power supply so the power supply fan would draw air through the box and cool the ICs attached to the heatsink/cover plate. The X-Y motors have resistor arrays totaling 8 ohms to limit the current on each of them, but I believe I'll soon short them to increase the current (and still be within the motor specs if I remember correctly).
The Darlington arrays are controlled directly from the parallel port of an old computer (given to me by a current coworker). There is no intermediate logic; I'm maxed out at the 4 outputs required for each motor, and I can't drive a bipolar motor with the current configuration.
Software has been doable, but it's soon going to be a bitch. I started from scratch in QuickBasic 7.1 (with OUT and INP statements to talk to the port). I eventually want to write something that will automate the conversion of an STL file (or something of the like) to a nearly optimal tool path. STL files aren't that difficult to read, after all.