Na szybko przychodzi mi do głowy pomysł ze stablicowaniem tego i owego. W najlepszym przypadku (jeśli możesz sobie pozwolić na 2 tablice po 256 bajtów) można np. tak (nie piszę w aśmie, bo dawno tego nie robiłem, a tak będzie łatwiej zobaczyć o co chodzi, a i przetłumaczyć nietrudno):
index = (old_porta << 4) | current_porta;
x += tabx[index];
y += taby[index];
Dodatkowo odpada konieczność przechowania jednego rejestru, jeśli będzie to przerwanie. Odpowiednie tablice chyba łatwo sobie wyobrazisz. Tablice można też skompresować w jedną, koszt będzie niewielki w porównaniu do masakry, którą zacytowałeś. :)
Myślałem jeszcze o rozwiązaniu, w którym to częstsze przerwanie jest normalnie wyłączone, ale na VBI sprawdzasz czy coś się zmieniło od poprzedniego razu i wtedy je włączasz - opóźnienie max. 20ms nie powinno jeszcze irytować (chyba że trafisz parę razy w tę samą wartość z portu :/), a wyłączasz po np. 2 sekundach bez ruchu. Minus jest taki, że jeśli w grze zawsze coś się dzieje, to i tak kiedy ruszasz myszą - obciążenie wzrasta. Poza tym w połączeniu z pomysłem powyżej może nie być warte zachodu.
PS. dostałem gigamegaznieczulenie u dentysty i mogę pleść bzdury.