Jetzt bin ich voll im Bilde (denke ich).

Ich würd sowieso erstmal Config ADC = Free wählen. Damit wirden alle Messungen nach der ersten schneller ausgeführt. Wirkt sich zwar nicht auf dein Problem aus, aber ist irgendwo praktischer.
Danach gleich Start ADC. Der muss nicht vor jede Abfrage gestartet werden. Besonders nicht wenn er nicht gestoppt wurde. Aber ich denke, das ignoriert Bascom schon von alleine.

Ein Programm habe ich noch nicht geschrieben. Ich komm grade von der Arbeit und hab da jetzt nicht mehr so viel Lust zu, Sorry. Aber ein paar Denkanstöße helfen evtl?!

Für X und Y hast du im Prinzip jeweils ein Programmteil. Ich würde die beide zusammenmischen.
Also das beide Richtungen am JS abgefragt werden und dann für beides gleich die Berechnungen durchgeführt werden.
Und dann kommt der eigentliche Knackpunkt.
Jede Richtung alleine funktioniert ja so wie du es haben willst. Nur die Wartezeiten im Programm sind die, die stören.
In der Zeit macht der Prozessor ja auch nix anderes als für X ms nichts ausführen. In der Zeit könnte er ja schonmal den anderen Motor bewegen.

Ich habe heute morgen um kurz nach 5 noch dein Beitrag gelesen und hatte etwas Zeit drüber nachzudenken.

Zwei Lösungsmöglichkeiten seh ich da auf anhieb. Eine aufwendiger als die andere
Die dritte wäre gewesen jeweils ein (kleineren) AVR für X und Y nehmen.

Die 1. ist:
In der waitms-Phase wartet der AVR brav. Das muss geändert werden.

Jetzt beim Schreiben kommt mir noch ne andere Idee, die ich noch besser finde

Alle 10ms ein Interrupt ausführen.
In der ISR eine Variable hochzählen lassen. Anhand des Werts weisst du dann, wieviele ms schon vorbei sind. Wenn beide Aktionen ausgeführt sind, die Variable wieder auf 0 setzen. Oder besser gesagt, dann auf 0 setzen, wenn die nächste Aktion ansteht.
Das Problem mit den Richtungen und unterschiedlichen Geschwindigkeiten pro Richtung in Anhänigkeit wie stark man den JS biegt hast du ja im Griff. Da will ich mich jetzt nicht weiter reindenken.
Wenn z.B. eine Pause für X 100ms sein soll und die für Y 200ms, dann X so lange bewegen bis der Zähler auf 10 steht. Wenn er über 10 ist nix weiter nachen. Und Y bis 20 bewegen. Dan sind es etwas mehr als 100ms und 200ms, weil das Aufrufen der ISR auch etwas Zeit benötigt, aber die Zeit bis der Interrupt ausgelöst wird kann man ja anpassen wenn es so nicht optimal ist.

So, müsste ich das jetzt lesen was ich geschrieben habe, würd ich es als ausenstehender nicht verstehen

Die Kurzfassung:

Ein Timer programmieren, der alle 10 ms (oder besser den höchsten gemeinsamen Teiler der gewünschten Pausenzeiten) auslöst.
Wenn der JS bewegt wird, den Timerinterrupt aktivieren.
In der ISR eine Variable hochzählen.
Mit der Variable die Schritte für X und Y durchführen.
Wenn X und Y fertig sind, die Variable auf 0 setzen und den Timerinterrupt deaktivieren.

Ich hoffe ich habe da jetzt kein Denkfehler drin!