変数をもうひとつ増やして、Coroutine内のEBPも覚えておく必要があったけど、

procedure Restore(_ESP, _EBP: Pointer); register; //コルーチンが最初に呼ばれた時の値を渡す
asm
 mov esp, eax
 mov ebp, edx
end;

procedure Callback(_EBP: Pointer); register; //呼びだし元のEBPを渡す
asm
 mov ecx, [ebp + 4]
 mov ebp, eax
 jmp ecx
end;

…でいい線までいきました。
残る問題は、最適化でレジスタに割りつけられた変数がごちゃ混ぜにされるという事。
呼びだし元、コルーチン内、両方とも、主要レジスタを全部保存しないとダメみたいです。

あきらめて素直にFiber使おうかな。