Takt Zyklen für eigene (Immediate) VBI Routine

Moderator: Rockford

Antworten
Benutzeravatar
Olix
Beiträge: 1069
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 463 times
Kontaktdaten:

Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von Olix »

Ich habe mich in letzter Zeit sehr intensiv mit der Frage beschäftigt: "Wie viele Takt-Zyklen habe ich im (Immediate) VBI für meine eigene Routine, so dass die VBI Routine des OS noch genug Zeit für seine eigenen Aufgaben hat?"

In der diversen Atari Literatur gibt es dazu leider sehr unterschiedliche Auskünfte und die Antworten dort reichen von 1400 bis 8000 Zyklen. Also doch ein sehr breit gefächerter Zeitraum.

Fairerweise muss man sagen, dass meistens keine der Angaben falsch ist. Es ist meist eine Frage der Betrachtungsweise. Zum einen hat man große Unterschiede zwischen PAL und NTSC Maschinen und dann ist die Frage, wie ich das mögliche Ende der eigenen VBI definiere.

Die besten technischen Informationen zu Lösung dieser Frage erhält man übrigens in der wirklich sehr guten Dokumentation des Altirra Emulators.

Um die genaue Anzahl der Takte errechnen zu können, bedarf es zunächst ein wenig Theorie in Sachen Bildaufbau:

Bekannt war mir, dass eine Display-List normalerweise wie folgt aufgebaut ist:

3*8=24 Blank-Lines
gefolgt von
192 angezeigten Bildzeilen

Macht also in Summe 216 Scan-Lines

Nun besteht aber ein PAL-Halbbild wie es vom GTIA erzeugt wird (ich berschränke mich bei meinem kleinen Vortrag hier ab nun auf die Werte eines PAL Ataris) aus 312 Zeilen! Aber wo sind die restlichen 96 Zeilen geblieben? Diese Frage hat mir tatsächlich keine Ruhe gelassen und erst nach dem Studium der oben erwähnten Altirra Dokumentation konnte ich das Rätsel lückenlos klären:

Zunächst ignoriert der ANTIC die ersten 8 Zeilen eines Frames komplett. Die 24 Blanklines beginnen also erst bei der 9. Zeile. Nach den 192 angezeigten Zeilen folgen noch mal 24 Zeilen die in einer Displaylist theoretisch genutzt werden können, aber sich im Overscan-Bereich (also dem nicht Sichtbaren Bereich alter Röhrenfernseher) befinden. Der ANTIC kann technisch nämlich 240 Zeilen nutzen. Zusammen mit den ersten 8 übersprungenen Zeilen sind wir nun bei Zeile 248 und genau hier löst der VBI aus. Jetzt fehlen uns aber immer noch 64 Zeilen. Es folgen tatsächlich noch 14 Zeilen die vom GTIA mit der Hintergrundfarbe (COLOR4) gezeichnet werden und dann folgt bei Zeile 262 die Blank-Phase. Jetzt wird also der Elektronenstrahl dunkel geschaltet und kann wieder in die obere linke Ecke gefahren werden. Während dieses Zurückfahrens und in der Wartezeit davor, werden aber fleißig weiter Scanlines erzeugt, und zwar genau 50 Stück! Und summa summarum sind wir jetzt bei unseren 312 Zeilen. HEUREKA!

Etwas klarer wird es mit folgender Aufstellung:

Code: Alles auswählen

  8  Lines Skipped
 24  DL blank lines
192  DL display lines (z.B. Gr.0 = 24 Zeilen mit je 8 Scanlines)
 24  Lines Skipped (aber von ANTIC in DL nutzbar)
	START des Vertical Blanc
 14  Lines Skipped
 50  vertical blank lines
---
312 Scanlines
... war da nicht noch was ... Ach ja, wir wollten ja die Taktyklenzahl wissen, die wir für unseren VBI zur Verfügung haben. Also weiter in der Theorie:

Wir kennen jetzt also die genaue Aufteilung und Anzahl der Scanlines eines Frames. Was uns noch fehlt sind die Nutzbaren Taktzyklen in einer einzelnen Zeile. Dies ist aber ein sehr komplexes Thema, auf das ich in einem anderen Kapitel eingehen kann. Wichtig ist nur folgende Information:

Eine Scanline wird in genau 114 Taktzyklen gezeichnet. Davon gehen allerdings noch je nach Grafikstufe unterschiedlich viele Zaktzyklen ab, die der ANTIC während des DMA für sich abzweigt. Diese abgezwackten Taktzyklen werden unter anderem dafür benötigt die Bildinformationen aus dem Bildspeicher in den ANTIC zu laden, die RAM-Bausteine mit Refresh-Befehlen am Leben zu halten oder auch die Player-Missile Grafik-Daten zu laden. Selbst für das Laden der Display-List und der Zeichensatzinformationen klaut der ANTIC Taktzyklen. (Wer dies ganz genau wissen will, kann auch dies wunderbar in der ALTIRRA Doku nachlesen). Im Extremfall verbleiben nur wenige Duzend Taktzyklen pro Zeile für eigene Programme und wie gesagt ist dies sehr unterschiedlich und abhängig von vielen Faktoren.

Wir haben jetzt aber das Glück, dass ab dem Einsetzen des VBI bei Scanline 248 der ANTIC mit seiner ARBEIT fertig ist. Die einzigen Takte, die von Zeile 248 bis 312 jeweils abgezogen werden sind 9 Refresh-Takte für die Aufrechterhaltung des dynamischen-Rams (Refresh-DMA). Uns bleiben also von den 114 Takten pro Zeile 105 für unseren VBI übrig.

So, mit diesen Informationen können wir uns nun genau errechnen, was wir eigentlich wissen wollten:

Unser VBI beginnt bei Zeile 248 und hat nun faktisch bis zum Ende der Bildschirmseite Zeit. Also 64 Zeilen:

64 Scanlines * 105 Takte (pro Zeile) = 6720 Takte

Verbraten wir in unserer eigenen VBI Routine diese Taktanzahl, dann beginnt die OS-VBI Routine genau bei Zeile 0 des nächsten Bildes. Eigentlich sollte natürlich die OS-VBI Routine vor dem Aufbau des neuen Bildes fertig sein, aber wir erinnern uns: Der ANTIC ignoriert die ersten 8 Scanlines. Also 840 Zyklen für den OS-VBI und das reicht locker. (Der verbraucht je nachdem was so ansteht zwischen geschätzt bis zu 800 Takte)

Wie kommen nun aber diese vielen verschiedenen Aussagen in der ATARI Literatur zu Stande? Mal abgesehen von den Unterschieden zwischen PAL und NTSC (die Werte für NTSC stelle ich bei Bedarf auch gerne zur Verfügung). Nun ganze einfach: Man kann die erlaubte Taktzahl auch so definieren, dass der eigene VBI so beendet wird, dass dieser vor dem Vertikal-Blank (Also bei Zeile 262) beendet ist. Oder so, dass er inklusive des OS-VBI vor Zeile 312 endet. Oder ganz extrem, man nutzt noch die 24 Blanklines der Displaylist mit (Das ist dann wirklich das Maximum und man könnte über 9000 Takte nutzen.)

Also wem das alles jetzt zu viel Theorie war nun endlich einmal eine einfache Tabelle mit den Werten für die Anzahl der nutzbaren Taktzyklen in der eigenen VBI-Routine:

Code: Alles auswählen

ca. Takte für VBI-Routine     Eigener VBI endet bei Scanline
1400 Zyklen 	bis Ende Scanline 262	*
6100 Zyklen 	bis Ende Scanline 306	**
6700 Zyklen 	bis Ende Scanline 312	***
7600 Zyklen 	bis Ende Scanline 8 	****
9800 Zyklen 	bis erste Bildprobleme auftreten *****

*   	OS-VBI beginnt mit Blank (261)
**  	OS-VBI endet etwa mit letzer Scanline (312)
*** 	OS-VBI beginnt bei Scanline 0
**** 	Ab 9 beginnt ANTIC mit erster Scanline aus der Displaylist. OS-VBI endet dann aber bereits in den ersten 8 DL-Blanks.
***** 	VBI endet dann bei Scanline 32, OS-VBI ca. bei 38 und somit in der ersten richtigen Display-List Zeile
So das war es mit meiner Theorie-Stunde für heute. Vielleicht konnte ich ein wenig Licht ins Dunkel bringen.

Ah ja: diese theoretischen Werte habe ich im Übrgen alle im Emulator empirisch geprüft. Da hier der komplette vertikale Overscan Bereich dargestellt werden kann ist dies sehr gut möglich durch Umschalten der Hintergrundfarbe im Farb-Hardwareregister am Anfang und Ende des VBI. Die Zeilenzahl an der der VBI Endet kann über das VCOUNT Register erfasst werden. (Wie so ein Test aussah seht ihr an einem Beispiel im Anhang)
VBI.jpg
Am oberen ende des PlayMissile-Streifens beginnt der ANTIC zu arbeiten (ScanLine 9) und am unteren Ende endet die Arbeit des ANTIC (ScanLine 248)
Die beiden blauen Linien sind der Rand des sichtbaren Playfields (192 Scanlines
Der untere graue Balken beginnt mit dem eigenen VBI und endet in Zeile 0. der weiße Streifen ganz oben ist dann die OS-VBI Routine.

Benutzeravatar
Olix
Beiträge: 1069
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 463 times
Kontaktdaten:

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von Olix »

... ah ja, für alle denen das jetzt NICHT zu langweilig war, kann ich gerne eine etwa genauso lange Abhandlung schreiben über die Fragestellung:

Wie lange darf meine DLI Routine andauern?

Benutzeravatar
Olix
Beiträge: 1069
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 463 times
Kontaktdaten:

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von Olix »

...
NACHTRAG für alle denen das oben alles zu viel Text war:

Meine persönliche Antwort auf die eigentliche Frage lautet (ohne viel BlaBla):

Mit maximal 6600-6700 Taktzyklen für die eigene Immediate-VBI Routine ist man auf der sicheren Seite (Bei PAL - und 1400 Takte bei NTSC)

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

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von LarsImNetz »

Danke Olix,

für die sehr ausführliche Beschreibung.
Ein Punkt noch von mir, da der ANTIC die Player/Missiles erst ab Scanline 9 anfängt zu zeigen und bei Scanline 248 aufhört, kann die PMBASE auf XL/XE Geräten auch auf $F800 als Adresse gesetzt werden, falls das OS abgeschaltet ist. Der 4. Player ist voll nutzbar, nur sollte man tunlichst nicht die letzten 6 Bytes $fffa - $ffff löschen. Was dann passiert...

Bei NTSC werden übrigends die ersten 16 Scanlines ignoriert und am Ende nochmal 16. Es bleiben also nur 224 Zeilen für die Player/Missiles und alles andere. Ist interessant, wenn man sein Spiel/Programm auch für NTSC anbieten möchte.

LG
Lars

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

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von LarsImNetz »

BTW: Gerne kannst Du eine Abhandlung über DLIs schreiben.

Hier nur mal mein Tipp für DLIs

Der Standard, wenn man viel Zeit hat

Code: Alles auswählen

 pha  ; Akku retten
 [...]
 pla   ; Akku wiederherstellen
 rti
Der Standard, wenn neben dem Akku auch noch das X-Register gebraucht werden sollte.

Code: Alles auswählen

 pha  ; Akku retten
 txa
 pha  ; X retten
 [...]
 pla   ; X wieder herstellen
 tax
 pla   ; Akku wiederherstellen
 rti
pha kostet 3 Takte, pla 4 Takte

Als Tipp um 6 Takte zu sparen im DLI:

Code: Alles auswählen

zero_4_accu=0...255 ; irgendwo in der Zeropage
zero_4_x=0...255  ; irgendwo in der Zeropage

 sta zero_4_accu
 stx zero_4_x
 [...]
 ldx zero_4_x
 lda zero_4_accu 
 rti
sta zero kostet 3 Takte
lda zero kostet 3 Takte ==> Ein Takt schneller als pha/pla und 6 Takte schneller als pha,txa,pha,...,pla,tax,pla
kostet allerdings 2 wertvolle Register in der ZeroPage
Wer das in Basic ausprobieren möchte, verwendet für zero_4_accu am Besten eine Adresse zwischen 203 und 209
Vorteil dieser Methode, man spart am DLI-Beginn gegenüber pha,txa,pha 2 Takte und ist damit etwas früher am Ball.

Self Modified Code Version, spart die kostbaren ZeroPage Register

Code: Alles auswählen

 sta _4_accu+1
 stx _4_x+1
 [...]
_4_x
 ldx #0
_4_accu
 lda #0
 rti
sta <addr> kostet 4 Takte, falls DLI nicht in der ZeroPage abgelegt ist
lda #n kostet 2 Takte, spart zudem kostbare ZeroPage Register.

Kein Vorteil gegenüber pha,txa,pha von der Zeit her. Nur am Ende spart man ein paar Zyklen.

Wer viel Zeit hat und es sehr genau haben/wissen will, schreibt für jeden DLI eine eigene Routine und verbiegt am Ende jedes DLIs den VDSLST Vektor (512/513) dann kann man prima ausbaldovern, wie viele NOPs man pro DLI setzen muss, um auf den WSYNC wg. horizontaler Syncronisation zu verzichten. Das ist nämlich jedesmal anders.
Mein Tipp, im VBI den VDSLST Vektor wieder auf den 1. DLI setzen, so kann man auch mehr testen.

Aber ich schweife ab...

LG
Lars

Benutzeravatar
Olix
Beiträge: 1069
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 463 times
Kontaktdaten:

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von Olix »

LarsImNetz hat geschrieben:
27.08.2022 18:06
Bei NTSC werden übrigends die ersten 16 Scanlines ignoriert und am Ende nochmal 16. Es bleiben also nur 224 Zeilen für die Player/Missiles und alles andere. Ist interessant, wenn man sein Spiel/Programm auch für NTSC anbieten möchte.
@Lars: Bist Du Dir da sicher? Nach meinen Erkenntnissen sieht der Zeilenaufbau eines NTSC Frames beim Atari so aus:

Code: Alles auswählen

  8  Lines Skipped
 24  DL blank lines
192  DL display lines (z.B. Gr.0 = 24 Zeilen mit je 8 Scanlines)
 24  Lines Skipped
	START des Vertical Blanc
 14  vertical blank lines
---
262 Scanlines
Die von ANTIC genutzten Scanlines sind unabhängig von PAL oder NTSC: 240 Zeilen
Der Unterschied besteht lediglich in den um 50 Zeilen längeren Blank-Phase bei PAL

Aber ich werde das morgen nochmal in Ruhe nachlesen und am Emulator austesten....

Benutzeravatar
Olix
Beiträge: 1069
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 463 times
Kontaktdaten:

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von Olix »

... das hat mir jetzt keine Ruhe gelassen und ich habe das nochmal nachgelesen. Ist so wie ich das in meinen Aufzeichnungen vermerkt habe. Hier der Text aus der Altirra Doku:

"The display list starts at scan line 8 and ends no later than scan line 248. The maximum height of a display list is
thus always 240 scan lines. This is true even in PAL, which has 50 more scan lines than NTSC."

Ich bleibe also dabei, auch bei NTSC:

8 Scanlines werden vom ANTIC ignoriert
24 Scanlines in DL als Blank
192 Scanlines in DL für ModeLines
24 Scanlines von ANTIC ignoriert
14 Scanlines für den Vertical Blank

macht zusammen 262 Scanlines
(Auch bei NTSC Systemen beginnt der VBI immer bei Scanline 248)

Und ich habe das ganze auch gleich mal noch im Altirra ausgetestet, indem ich über den VCOUNT jeweils bei Zeile 8,32,224 und 248 die Hintergrundfarbe wechsel und darüber noch einen Player-Streifen lege.
Natürlich muss man in den Ansichten von Altirra den Overscan Mode entsprechend einstellen, so dass der Vertical Override auf "Full (With Blanking)" steht.
VBI-NTSC.jpg
Oberer grauer Balken: die ersten 8 Zeilen
roter Balken: die 24 DL-Blanks
Blauer Bereich: Das normale Playfield
Weißer Balken: die 24 Zeilen die wieder vom ANTIC ungenutzt sind
und der untere graue Balken startet bei 248 mit dem VBI
Der Playerbalken reicht über 240 Lines von Zeile 8 bis 248

Hier noch der Codeschnipsel mit dem ich die Farbumstellungen mache>

Code: Alles auswählen

 LOOP:     LDA VCOUNT
           CMP #4
           BNE LOOP
           LDA #66
           STA COLPF4
 LOOP2:    LDA VCOUNT
           CMP #16
           BNE LOOP2
           LDA #$94
           STA COLPF4
 LOOP3:    LDA VCOUNT
           CMP #112
           BNE LOOP3
           LDA #10
           STA COLPF4
           JMP LOOP
  ; 
 VBI:      LDA #6
           STA COLPF4
           STA COLOR4
           JMP SYSVBV

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

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von LarsImNetz »

Hallo Olix,
ich habe es auch nochmal ausprobiert. Auf den Emulatoren atari800 und Altirra 4.10-test5 jeweils NTSC eingeschaltet, kein Overscan aktiviert.
Folgende Pokes habe ich gesetzt.

Code: Alles auswählen

poke 54279,$a0
poke 53277,3
poke 559,32+16+8+4+2
poke 53248,200
poke 704,$0f
poke $a400+16,255
Jetzt erscheint oben rechts ein kleiner weißer Balken.

poke $a400+15,255 läßt keinen Balken da drüber erscheinen. Zumindest auf atari800 und Altirra in NTSC nicht. Mit PAL kann ich bis $a400+8 hoch gehen.

Im Original kann ich es nicht ausprobieren, da ich nur einen Atari 600XL mit PAL besitze und der liegt in irgendeiner Kiste ganz tief in der Abseite verbuddelt.
altirra-NTSC-Player.png

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

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von LarsImNetz »

Es liegt definitiv am Overscan, den ich normalerweise nicht aktiviere, weshalb erst ab 16. Byte angezeigt wird.
Aber wenn Overscan aktiv ist, wird schon ab 8. Byte angezeigt.

Somit hast Du recht.

Was allerdings auf einem originalem Atari in NTSC darstellbar ist, weiß ich nicht.

LG
Lars

Benutzeravatar
Olix
Beiträge: 1069
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 463 times
Kontaktdaten:

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von Olix »

... na sag ich doch ;)

Auf Original Hardware wird man da natürlich nicht viel sehen. Mir ging es ja auch eher darum, das Timing beim Bildaufbau zu verstehen um berechnen zu können, wie viele Taktzyklen zur Verfügung stehen, bevor die ersten sichtbaren Zeilen dargestellt werden.

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

Re: Takt Zyklen für eigene (Immediate) VBI Routine

Beitrag von Dr. Irata »

Hallo Olix,
vielen Dank für die sehr gute Abhandlung des VBI.
In der Hexenküche von Peter Einzel wird das auch recht gut beschrieben, wobei ich deine Analyse noch besser und "tiefer" finde.

Sehr interessiert wäre ich auch an einer ganz genauen Abhandlung des DLI.

Gruß

Peter

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast