Hallo!
Kurzversion:
Ja, eine VB-Routine kann von einem DLI unterbrochen werden und eine DL-Routine starten.
Langversion (hoffentlich fehlerfrei):
Die CPU 6502 hat einen NMI-Pin, an dem der ANTIC mitteilt, ob ein Interrupt stattfinden soll.
Im Falle eines Interruptes speichert die 6502 den aktuellen Programmzähler
und den CPU-Status (N-Flag, C-Flag etc.) auf den Stack. Deshalb beendet man einen Interrupt auch mit RTI und nicht mit RTS.
Anschließend wird ein indirekter Sprung durch die Adresse ($FFFA/$FFFB) gemacht, welche auf eine Routine im OS des ATARIs zeigt. Diese Routine macht nun einen schnellen Fallunterscheid -> Bin ich ein DLI oder ein VBI?
An der Speicherstelle NMIST (des ANTIC) erfährt man den Grund des Interrupts.
Diese Prüfung ist so geschrieben, dass weder der Akkumulator, noch das X- oder Y-Register verändert wird.
Ist es ein DLI, wird sofort indirekt über VDSLST an die gewünschte DL-Routine gesprungen.
Ist es ein VBI wird nun Akku, X- und Y-Register gerettet und ein indirekter Sprung nach VVBLKI gemacht, wo eine eigene zeitkritische Routine liegen darf. Diese springt zurück nach SYSVBV wo nun Shadow-Register etc. abgearbeitet werden.
Anschließend prüft das OS, ob die CPU gerade etwas zeitkritisches macht. Wenn nicht, wird nach VVBLKD gesprungen, wo nun eine etwas längere Routine liegen darf, welche mit XITVBV enden sollte. XITVBV beendet nun sauber die VB-Routine.
Ein DLI kann die VB-Routine unterbrechen. Aber die VB-Routine muss tunlichst abgearbeitet sein, bevor der nächte VBI ausgelöst wird!
Da die CPU immer nur eine Sache gleichzeitig abarbeiten kann, wird mit jedem DLI in der VB-Routine diese verlangsamt und das Hauptprogramm ausgebremst.
Ich hoffe, dass passt so in etwa

Janko