Having spent three days tracing through this demo and found the source of my problems. It's mainly broken floppy routines. Where did you get those from? I'd really like to see them.
Here's what happens: The routine checking for errors in the fdc status register bails out if either bit 3, 4, or 5 are set. But 3 and 4 make sense, they are error codes. Bit 5 is set when the floppy motor has spun up and is running at full speed. This bit is only set when the current command is a class 1 (seek) command. Now your code assumes the motor hasn't spun up which doesn't make much sense.
This wasn't too bad if your error handling routine wouldn't be broken. It restores register a1 from the stack and jumps to the retry routine which ... restores a1 from the stack. The result is a corrupted stack, the next rte wrongly restores the cpu status register, the cpu wrongly returns into user mode without a proper user stack set. The cpu then wants to call a subroutine and subsequently tries to write the return address to the stack. The stack pointer is invalid .... BOOOM ...
So i'd really like to see that code as this is one of the few cases where i know that the source code exists and is potentially available
Edit: Ah, sorry, after over a year i simply forgot that you already sent me the original floppy routines. These contain the "issue" where they check the motor on signal (which is for reasons i don't understand yet not triggered on a real machine). And the stack problems ... uhm, it seems you introduced them. The broken a1 handling is in the diassembly of your code but not in the original code snippet you sent me.