DLI während VBI möglich?

Moderator: Rockford

Antworten
Benutzeravatar
Olix
Beiträge: 1097
Registriert: 17.08.2021 07:06
Has thanked: 132 times
Been thanked: 477 times
Kontaktdaten:

DLI während VBI möglich?

Beitrag von Olix »

Wenn ich eine längere Deferred-VBI Routine nutze, welche über den Vertical-Blank hinaus auch noch im sichtbaren Bereich der Display-List ausgeführt wird, wie verhält es sich dann, wenn die Deferres VBI Routine durch einen ausgelösten DLI unterbrochen wird?

Nach meinem Verständnis der diversen Literatur zu diesem Thema, sollte eigentlich der VBI unterbrochen werden, dann wird der DLI ausgeführt und nach dessen Ende wird der VBI wieder an der unterbrochenen Stelle fortgesetzt.

Kann mir das so jemand bestätigen?

Benutzeravatar
Kveldulfur
Beiträge: 649
Registriert: 17.08.2021 02:32
Has thanked: 251 times
Been thanked: 177 times
Kontaktdaten:

Re: DLI während VBI möglich?

Beitrag von Kveldulfur »

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

Benutzeravatar
Olix
Beiträge: 1097
Registriert: 17.08.2021 07:06
Has thanked: 132 times
Been thanked: 477 times
Kontaktdaten:

Re: DLI während VBI möglich?

Beitrag von Olix »

Danke für die ausführliche Beschreibung. Dies deckt sich mit meinen Erkenntnissen.

Benutzeravatar
LarsImNetz
Beiträge: 156
Registriert: 24.08.2021 18:27
Has thanked: 115 times
Been thanked: 85 times
Kontaktdaten:

Re: DLI während VBI möglich?

Beitrag von LarsImNetz »

Eine kleine Anmerkung:
Ich habe mir eine kleine Routine geschrieben, die durch einen Tasteninterrupt den 2. Systemzähler CDTMV2 auf 1 setzt.
Wird dann irgendwann der nächste VBI ausgelöst, zählt dieser den Systemzähler auf 0 runter und springt durch den Vektor CDTMA2.
In diesem lösche ich das Interrupt Flag (CLI) und führe meine Routine aus, die sehr lange braucht (10-15 Frames) und dann mit RTS beendet wird. Das RTS springt in den VBI zurück und führt diesen zu Ende aus.

Das mag nicht sehr sauber klingen, aber es zeigt, das ein VBI ruhig mal durch einen anderen VBI unterbrochen werden kann. Allerdings sollte man im Hinterkopf behalten, das der Stack des 6502 nicht sehr groß ist. Ein VBI braucht min. 6 Bytes auf dem Stack. (Rücksprung Adresse, Flags, X-, Y-, A-Register) man sollte es also nicht regelmäßig machen. Ich wollte halt mal sehen, ob es überhaupt funktioniert.

LG
Lars

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: DLI während VBI möglich?

Beitrag von Dr. Irata »

wie ist es dann anders herum?
Kann ein VBI ein DLI unterbrechen - was ja zu Problemen führen könnte - und wie kann man das verhindern - bzw wie kann man sicherstellen, daß ein VBI nur dann ausgelöst wird wenn der DLI beendet ist? Schwierig auch, wenn mehrere DLIs im Spiel sind…

Benutzeravatar
Kveldulfur
Beiträge: 649
Registriert: 17.08.2021 02:32
Has thanked: 251 times
Been thanked: 177 times
Kontaktdaten:

Re: DLI während VBI möglich?

Beitrag von Kveldulfur »

Hallo!

Auch hier trifft die Aussage zu, dass ein DLI und ein VBI nur Interrupte sind.
Wenn tatsächlich Dein DL-Interrupt ein Programm ausgelöst hat, was so lang ist, dass ein VB-Interrupt dies unterbricht, dann ist dem so.
Nur es gilt, die CPU arbeitet nur eine Sache gleichzeitig ab. Wenn es zeitlich nicht passt, dann endet es ggf. irgendwann in eine Endlosschleife.

Man muss sich einfach einen Plan machen, wann welcher Interrupt ausgelöst wird und was dann abgearbeitet werden soll.

Grüße
Janko

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast