Well, 2d probably looks jerky, because it doesn't interpolate between pixel.
That's not really true, as evidenced by the thousands upon thousands of games that exhibit smooth scrolling using 2D alone. Interpolating just makes things look distorted - a good 3d-as-2D system will move objects in pixel sized steps anyway.
ZT, whether or not your original code looks jerky or not depends on two lines...
FL\TargetFPS# = 60
and
Graphics 640,480
For example, my GFX card runs at the optimal refresh rate for whatever resolution it is set to. At 640*480 that is 120hz, into which 60 frames a second fits quite precisely - the image being updated once every two refreshes exactly. At this resolution your original code looks PERFECT on my monitor therefore. However if I set the resolution to 1024*768 then it's a different story... at that resolution my monitor's optimal refresh rate is 85hz and, obviously, the speed at which the code updates the display no longer syncronises exactly with what the monitor is doing. Set like this, it looks jerky.
Chances are, your monitor's refresh rate is not set to a multiple of 60 and this is why your code looks jerky. This is a continual problem with PC development - either you can use the monitor's refresh to limit speed and have a program that always looks smooth (CPU speed permitting) but may execute at different rates on various machines OR you can frame limit and have a program that is BOUND to update in a jerky manner on some set-ups.