Ha, I did exactly the same in exactly same language but that was the end of 80s. Interactivity was just fine as I've increased frequency of timer interrupt to 4096 times / s and would pass control to standard handler every so often so it would work as standard at about 18 times/s. When not calling old interrupt I would execute threads switch and control logic. Turbo Pascal supported built in assembly so writing all low level stuff was piece of cake. I also used built in assembly to implement graphics.
Having to save and restore the registers was obvious, but as I recall it the main challenge was figuring out the right sequence to do that while also preserving the CPU flags.
I only used the timer interrupt to switch between threads in a round-robin way, so interactivity wasn't the best, but it worked. Was quite pleased with myself for accomplishing that.
I think it was a pretty decent challenge, and one that was quite instructive. Not just did you need to know some details about the various CPU instructions (like which ones affected flags), but it was also a kind of a puzzle to arrange it all the right way.