Highspeed mit Pokey-Divisor 0

1, 2

Re: Highspeed mit Pokey-Divisor 0

von tfhh » Fr 27. Aug 2010, 20:11
Moin Hias,
HiassofT hat geschrieben:Jetzt hab' ich doch noch einen Timing-kritischen Test für all Deine Pokeys :-)

Der Wunsch war mir natürlich gleich Befehl und hier sind die Ergebnisse. Ich komme persönlich zu dem Schluß, daß es nahezu egal ist, welcher Pokey verwendet wird, aber es doch deutliche Differenzen in der Verwendung der CPUs UNDdes verwendeten Mainboards gibt.

Die Ergebnisse liegen hier zum Download.

Im Ordner "800 XL" habe ich alle 6 Pokeys (identisch mit Test von gestern) in Verbindung mit der Rockwell-CPU DC (Datecode) 8341 und deutlich erkennbarem "Mexiko" Schriftzug getestet. Dieser 800 XL ist identisch zu den Tests von gestern.

Dann habe ich ein 800 XLF (mit Freddie) Mainboard genommen, auf dem eine Rockwell-CPU DateCode 8320 steckte (ohne Mexiko-Schrifzug, deutlich kleinerer Font auf dem IC, aber die Unterseite offenbart übrigens auch, daß sie in Mexiko hergestellt wurde. Da fiel mir schon auf, daß es an einigen Teststellen "große" Unterschiede von 4-5 Takten gibt. Also habe ich zwei weitere CPUs getestet, bei der letzten nur noch Pokey 1.

Aus meiner bescheidenen Sicht würde ich sagen, ihr solltet in Euren Highspeed-Routinen vom Worst-Case ausgehen und auf diesen noch 2 Takte draufpacken (bzw. abziehen 8) ), selbst wenn das weh tut. Aber so wird es dann wohl in allen Mainboard/CPU/Pokey Varianten laufen.

Achja: Testboards alle ohne Caps, Original-OS-ROM, Basic-ROM entfernt, außer S-Video keine Erweiterungen.

Gruß, Jürgen

Re: Highspeed mit Pokey-Divisor 0

von HiassofT » Sa 28. Aug 2010, 12:52
Hallo Jürgen!

tfhh hat geschrieben:Der Wunsch war mir natürlich gleich Befehl und hier sind die Ergebnisse. Ich komme persönlich zu dem Schluß, daß es nahezu egal ist, welcher Pokey verwendet wird, aber es doch deutliche Differenzen in der Verwendung der CPUs UNDdes verwendeten Mainboards gibt.

Die Ergebnisse liegen hier zum Download.

Vielen, vielen Dank für die Tests!

Der Test auf dem 800XL und am 800XLF mit der Rockwell 8341/Mexico CPU liegen in dem von mir erwarteten Bereich: Kleinster Wert $91 (XL) bzw $92 (XLF).

Die anderen Tests am XLF sind aber etwas verwirrend: Mit der Rockwell 8320 CPU ist der kleinste Wert $92, ausser mit Pokey #6, da ist er $93. Ebenso der Test mit der Signetics CPU und Pokey #1.

Der kleinste Wert sollte eigentlich nur zwischen $91 und $92 schwanken, $93 ist sehr sehr seltsam.

Könntest Du bitte die beiden Tests (Rockwell 8320 mit Pokey 6 und Signetics mit Pokey 1) noch mal wiederholen und auch den pokeytest.atr drüberlaufen lassen? Wiederhole die Tests auch ein paar mal, lass den Atari dazwischen etwas laufen, und schau mal ob sich dadurch die Werte ändern.

Auf AtariAge hat Rybags geschrieben, daß er schon so einige Problemchen mit Flankensteilheit der Signale an der PIA hatte, möglicherweise spielt das hier auch mit rein (das könnte u.U. die Unterschiede am Mainboard mit-erklären). Evtl. muss später doch noch mal der miniLA oder ein Scope dran.

Ich werd heute Nachmittag auch noch einiges weiter testen und mir mal einen PBI-miniLA Adapter bauen damit ich schnell alle wichtigen Signale (Ax, Dx, RW, Phi2, IRQ) an den verschiedenen XLs anzapfen kann.

so long & schon mal Dank im Voraus,

Hias

Re: Highspeed mit Pokey-Divisor 0

von tfhh » Sa 28. Aug 2010, 13:01
Moin Hias,
HiassofT hat geschrieben:Könntest Du bitte die beiden Tests (Rockwell 8320 mit Pokey 6 und Signetics mit Pokey 1) noch mal wiederholen und auch den pokeytest.atr drüberlaufen lassen? Wiederhole die Tests auch ein paar mal, lass den Atari dazwischen etwas laufen, und schau mal ob sich dadurch die Werte ändern.
[...]
möglicherweise spielt das hier auch mit rein (das könnte u.U. die Unterschiede am Mainboard mit-erklären). Evtl. muss später doch noch mal der miniLA oder ein Scope dran.

Kein Problem. Ich gehe davon aus (bitte kurz Meinung hierzu), daß der verwendete Pokey weniger Einfluß hat und teste soweit weiter mit Pokey 1 - aber ich kann natürlich die Tests mit verschiedenen CPUs und verschiedenen PIAs durchführen, kein Problem.

Ich habe übrigens die Tests jeweils mehrfach laufen lassen. Vorgehen: Test machen, Screenshot via TV-Karte ausführen, Test 2-3 mal wiederholen und schauen, ob es Änderungen gab - bisher war das nie der Fall.

Gruß, Jürgen

Re: Highspeed mit Pokey-Divisor 0

von HiassofT » Sa 28. Aug 2010, 15:02
tfhh hat geschrieben:Moin Hias,
HiassofT hat geschrieben:Könntest Du bitte die beiden Tests (Rockwell 8320 mit Pokey 6 und Signetics mit Pokey 1) noch mal wiederholen und auch den pokeytest.atr drüberlaufen lassen? Wiederhole die Tests auch ein paar mal, lass den Atari dazwischen etwas laufen, und schau mal ob sich dadurch die Werte ändern.
[...]
möglicherweise spielt das hier auch mit rein (das könnte u.U. die Unterschiede am Mainboard mit-erklären). Evtl. muss später doch noch mal der miniLA oder ein Scope dran.

Kein Problem. Ich gehe davon aus (bitte kurz Meinung hierzu), daß der verwendete Pokey weniger Einfluß hat und teste soweit weiter mit Pokey 1 - aber ich kann natürlich die Tests mit verschiedenen CPUs und verschiedenen PIAs durchführen, kein Problem.

Bei der 8320er CPU scheint es einen Unterschied beim Pokey gegeben zu haben (Pokey #1-#5 $92, Pokey #6 $93). Da wäre ein Test mit Pokey #1 und Pokey #6 recht interessant.

Zu den Werten: wichtig ist nur der kleinste Wert. Bei einer Verschiebung um 1 Zyklus ändern sich nicht alle Werte in der Zeile, sondern der vorher kleinste Wert wird zum neuen grössten Wert. Mal ein Beispiel:

Beim 800XL werden zB die Werte $92 $91 $92 $91 ... ausgegeben. "erwischt" die CPU den IRQ am Ende von Zyklus $8F, führt in $90 noch einen Befehl aus und startet mit der 7-Zyklen IRQ Sequenz in Zyklus $91. Hier ein Screenshot: Der Beginn von Zyklus $8F ist mit dem Marker "A" gekennzeichnet, Marker "B" zeigt den Beginn der 7-Zyklen IRQ Sequenz und Marker "C" das Ende der Sequenz (in den letzten beiden Zyklen ist A15=high, da holt sich die CPU den IRQ Vektor aus dem ROM).
irq-0x91-detail.png
irq-0x91-detail.png (22.82 KiB) 3669-mal betrachtet

In diesem Fall hat die CPU in den Zyklen $8F und $90 einen NOP Befehl ausgeführt, in $91 wäre der nächste NOP drangekommen. Das hängt übrigens mit den Start-Werten (erste Zeile im Output) zusammen, bei ungeradem Start-Wert beginnt die CPU mit dem NOP jeweils bei einem ungeraden Zyklus und führt ihn im geraden Zyklus darauf aus.

Startet die CPU die NOPs in einem geraden Zyklus passiert folgendes: In Zyklus $91 muss die CPU zuerst noch den NOP fertig ausführen und kann erst einen Zyklus später, in $92, mit der IRQ-Sequenz beginnen. Deshalb steht in allen "geraden Spalten" der Wert $92.

Was passiert nun, wenn die CPU den IRQ nicht mehr im Zyklus $8F "erwischt" sondern erst in $90? Ganz klar, dann verschiebt sich alles um einen Zyklus. In Zyklus $91 führt die CPU noch einen Befehl aus und beginnt mit der 7-Zyklen IRQ Sequenz (frühestens) in Zyklus $92. Hier haben die NOPs die an einem geraden Zyklus gestartet wurden "Glück", die CPU kann direkt in Zyklus $92 mit der Sequenz beginnen. In der "geraden Spalte" ändert sich also nichts. Der Wert bleibt $92.

Bei den NOPs die in ungeraden Zyklen gestartet wurden, muss die CPU in Zyklus $92 aber noch das NOP ausführen und die Sequenz beginnt ab Zyklus $93. In den "ungeraden" Spalten ändert sich also der Wert von $91 auf $93.

Analog gilt das auch für die längeren Befehle, der jeweils "beste" Wert kann sich in den "schlechtesten" Wert ändern. Wenn man exakt Zyklengenau programmieren möchte, sollte man diese Zyklen also vermeiden und dafür sorgen, daß in dem übernächsten Zyklus nach dem der IRQ auf Low gegangen ist (hier also im Zyklus $91) die CPU noch mit einem Befehl beschäftigt ist. Dann startet die CPU die IRQ-Sequenz im jeweils im gleichen Zyklus, unabhängig davon ob durch Pokey/CPU oder wasauchimmer der IRQ erst einen Zyklus später erkannt wurde.

Re: Highspeed mit Pokey-Divisor 0

von tfhh » So 29. Aug 2010, 09:16
Moin Hias,
HiassofT hat geschrieben:Bei der 8320er CPU scheint es einen Unterschied beim Pokey gegeben zu haben (Pokey #1-#5 $92, Pokey #6 $93). Da wäre ein Test mit Pokey #1 und Pokey #6 recht interessant.

Zu den Werten: wichtig ist nur der kleinste Wert. Bei einer Verschiebung um 1 Zyklus ändern sich nicht alle Werte in der Zeile, sondern der vorher kleinste Wert wird zum neuen grössten Wert. Mal ein Beispiel:

So, ich habe die neuen Tests gemacht. Ergebnisse hier

Es ist Pokey 1 und Pokey 6 mit der Rockwell und der Signetics CPU getestet. Das Ganze habe ich mit dem Pokeytest wiederholt und auch eine 2. PIA genommen. Was für Hin- und Her-Gestecke :D

Gestern hatte ich bereits 4 Kombinationen durchgeprüft und dabei einmal "kalt" und nach 30 Min. Betrieb getestet - es war nie ein Unterschied zu erkennen, so daß ich mir diesen sehr zeitaufwändigen Test bei den weiteren Kombinationen gespart habe.

Gruß, Jürgen

Re: Highspeed mit Pokey-Divisor 0

von HiassofT » So 29. Aug 2010, 14:57
Hi Jürgen!

tfhh hat geschrieben:So, ich habe die neuen Tests gemacht. Ergebnisse hier

Vielen Dank für's Testen!

Die Resultate sind nun recht einfach zu erklären: Im pokeytest sieht man, daß alles um einen Zyklus nach hinten verschoben ist. Evtl. ist der PIA Ausgang etwas schlapp, oder hattest Du evtl. noch einen Kondensator auf der Command-Line? Hatte gestern beim Testen auch bemerkt, daß ich in meinem Haupt-800XL nur die Kondensatoren auf DataIn und DataOut entfernt hatte, den auf der Command-Line hatte ich vergessen :-)

Jedenfalls: Durch diese Verschiebung ändern sich auch die Ergebnisse im IRQ-Test. Statt $91/$92 gibt's deshalb $92/$93. Soweit also alles in Ordnung.

Gestern hatte ich noch einiges getestet: die meisten meiner 800XLs lieferten $91, bei einem (originalen) 800XL bekam ich $92. Mit dem miniLA hab' ich gesehen, daß bei letzerem 800XL IRQ und PHI2 zeitgleich auf low gingen. Bei meinem Haupt-800XL ging IRQ 70ns vorher auf low, bei meinem NTSC 800XL 60ns vorher.

Zum Testen hab' ich dieses mal die 3-Zyklen Befehle (LDX $E0) genommen, hier die Screenshots vom Zyklus-85-Test (hier ist der Unterschied ja $91 gegenüber $94):

NTSC 800XL (mind. $91):
800xl-ntsc-85-91.png
(30.94 KiB) 87-mal heruntergeladen

PAL 800XL (mind. $92):
800xl-2-85-94.png
(31.24 KiB) 87-mal heruntergeladen

In diesen Screenshots sieht man sehr gut, daß die CPU beim NTSC XL in Zyklus $90 den LDX $E0 Befehl beendet und danach mit der IRQ-Sequenz startet. Der PAL 800XL "sieht" die erste fallende PHI2 Flanke bei der IRQ low ist wohl erst am Ende des Zyklus $90, also startet er in $91 noch einen weiteren Befehl. Am Ende von Zyklus $91 "sieht" er dann wohl die 2. fallende PHI2 Flanke, muss den Befehl aber erst zuende ausführen. Das dauert bis inkl. Zyklus $93, in Zyklus $94 beginnt dann die IRQ-Sequenz.

Die Tests mit Start-Zyklus $84 und $86 liefern auf beiden Geräten identische Ergebnisse ($93 bzw. $92), das ist aber nicht so spannend (Screenshots spare ich mir hier, wen's interessiert kann sie auf AtariAge anschauen).

Es ist Pokey 1 und Pokey 6 mit der Rockwell und der Signetics CPU getestet. Das Ganze habe ich mit dem Pokeytest wiederholt und auch eine 2. PIA genommen. Was für Hin- und Her-Gestecke :D

Ich denke, ich habe Dich und die Sockel im Atari nun genug strapaziert, weiteres Herumgestecke ist vermutlich nicht mehr notwendig :-)

Gestern hatte ich bereits 4 Kombinationen durchgeprüft und dabei einmal "kalt" und nach 30 Min. Betrieb getestet - es war nie ein Unterschied zu erkennen, so daß ich mir diesen sehr zeitaufwändigen Test bei den weiteren Kombinationen gespart habe.

Da hatte ich gestern auch noch ein wenig getestet. Beim Haupt-800XL war wohl der Kondensator an der Command-Line schuld, nachdem ich ihn entfernt hatte waren die Ergebnisse stabil. Beim 600XL musste ich auch mit Kältespray an den Pokey um $91 zu bekommen - ansonsten bekam ich direkt nach dem Einschalten und einige Zeit später immer $92.

Achja: für meine Highspeed Routine war der IRQ-Test nicht wirklich wichtig, die arbeitet ja im Polled-Mode, hat die IRQs abgeschaltet und checkt direkt IRQST am Pokey. Aber das Thema hat mich gerade recht interessiert und ich wollte wissen was da genau passiert. Die sonstigen Dokus im Netz dazu sind ja alle recht ungenau und/oder falsch. Das hat sich nun erledigt :-)

so long,

Hias

Re: Highspeed mit Pokey-Divisor 0

von HiassofT » Sa 18. Sep 2010, 02:00
Mit etwas Verspätung nun die Auflösung des Highspeed SIO / Pokey Divisor 0 Rätsels:

Zuerst fasse ich noch mal die bisherigen Erkenntnisse zusammen:
- Ein Byte muss mindestens 141 Zyklen lang sein, damit der Pokey es verarbeiten kann
- Die bisherigen Tests haben ergeben, daß der Code genau diese 141 Zyklen Zeit hat um das Byte entgegenzunehmen (Byte lesen, IRQ zurücksetzen, IRQ wieder einschalten - das ist der kritische Teil, die Verarbeitung des Bytes kann auch danach erfolgen)
- Meine Tests haben aber gezeigt, daß es mit einem 93 Zyklen VBI (korrekte Berechnung dann max. 133 Zyklen für den kritischen Pfad) klappte, mit einem 94 Zyklen VBI (insgesamt max. 134 Zyklen im kritischen Pfad) aber nicht. Dabei sei noch angemerkt, daß die Fehler bei insgesamt 134 Zyklen sehr selten waren, so etwa ein Fehler alle 20-60 Minuten. Im Fehlerfall fehlte ein Byte und die SIO rannte in den (7 Sekunden) Timeout. Ein Alptraum zum Testen...
- Irgendwo gehen da also 8 Zyklen ab....

Vor knapp 3 Wochen dachte ich mir "schaust Dir das kurz mal genauer an". Hätte ich vorher gewusst was dabei rauskommt (eine Woche extrem intensive Arbeit), hätte ich es wahrscheinlich bleiben lassen. Hier nun die Geschichte dazu:

Mit ziemlich viel Mühe habe ich es geschafft, einen Testcase zu finden (SIO bei einer bestimmten Scanline gestartet), in dem der Fehler etwa alle 20-200 Zugriffe auftrat (besser als 20-60 Minuten).

Durch einige Überlegungen konnte ich den Timeout auf 2 VBIs (also 0.1 Sek.) verringern, das gab mir die Chance mit dem Logik-Analyzer mitzuprotokollieren was genau schiefging. Analyzer geclockt durch PHI2, Trigger extern, ausgelöst im Timeout-Fall (der Einfachheit halber hab' ich da ein STA $D600 gemacht und den ext. Trigger an den 6-er Ausgang am '138 im Atari gehängt), Pre-Trigger auf Maximum.

Das Ergebnis war aber alles andere als das was ich erwartet hatte. In erster Linie zweifelte ich an der Funktionstüchtigkeit des Analyzers, in zweiter Linie an meiner geistigen Gesundheit (oder meiner Fähigkeit die Daten richtig zu interpretieren). Glücklicherweise war's aber weder das eine noch das andere, sondern der Pokey war wieder mal schuld :-)

Ich hatte erwartet, daß alle 141 oder 142 Zyklen ein Interrupt (Byte empfangen) auftritt. Gesendet hatte ich mit 125494 bit/sec, das wären also etwa 141.3 Zyklen pro Byte.

Die Interrupts waren aber nicht regelmässig sondern traten im Abstand 134, 148, 142, 134, 148, 142, ... auf (mit gelegentlichen kleinen Abweichungen).

Werte von 141-143 hätte ich ja noch erwartet, aber 134 war doch deutlich zu wenig. Sehr seltsam diese Sache.

Ich vermutete, daß der Pokey sich bei Byte-Streams evtl. anders verhält als bei einzelnen Bytes, also schrieb ich ein neues Testprogramm:
http://www.horus.com/~hias/tmp/pokeytest-1.2.zip

Das Ergebnis war äusserst interessant:
800xl-2-3-byte.jpg
800xl-2-3-byte.jpg (71.97 KiB) 3648-mal betrachtet

Im ersten Test (byte 1 len vs. irqst byte 2) testete ich, wann der Empfang des 2. Bytes signalisiert wurde, in Abhängigkeit von der Länge von Byte 1 (in Zyklen).

Ergebnis: Normalerweise in Zyklus 143 (nach Beginn des 2. Bytes), ausser das 1. Byte ist exakt 141 Zyklen lang, dann wird der Empfang 7 Zyklen früher, in Zyklus 136 signalisiert!

Als nächstes dann das Ergebnis des 3. Tests: hier habe ich überprüft, zu welchem Zeitpunkt der Pokey die Bits im 2. Byte sampelt: normalerweise im Zyklus 12 von 14 jedes Bits, ausser das 1. Byte war 141 Zyklen lang, dann ist ebenfalls das Sampling um 7 Zyklen nach vorne verschoben.

Der 2. Test war dann eine etwas schräge Sache, aber ich wollte es einfach wissen :-)

Hier habe ich überprüft, ob das 2. Byte evtl. kürzer als 141 Zyklen sein kann, und trotzdem das 3. Byte richtig empfangen wird (bzw wann genau der Empfang des 3. Bytes gemeldet wird). Das 1. Byte habe ich 141 Zyklen lang gemacht und dann beim 2. Byte 133, 134 und 135 Zyklen getestet.

Ergebnis: 133 Zyklen für Byte 2 klappte erwartungsgemäß nicht. Aber mit 134 Zyklen funktionierte es, und der Empfang des 3. Bytes wurde ebenfalls 136 Zyklen nach Beginn des 3. Bytes gemeldet. War das 2. Byte 135 Zyklen lang, wurde der Empfang nach den (normalen) 143 Zyklen gemeldet.

Anmerkung: ja, das heisst man könnte den Pokey geringfügig "übertakten" (134 Zyklen ab Byte 2 statt 141), aber sobald man nur geringfügig abweicht geht das alles schief - der Sender müsste mit dem PHI2 vom Atari synchronisiert werden.

Die absoluten Zyklen-Werte sind für die Highspeed Routine nicht so wichtig (IRQ kommt ja 2 Zyklen nach Ende des Bytes), releavant sind die Abstände zwischen den IRQs.

Betrachtet man diese Werte, und die Ergebnisse bisher, machen die Beobachteten Abstände wieder Sinn:
- War das 1. Byte 141 Zyklen, kommt der IRQ des 2. im Abstand 134 Zyklen
- Das 2. Byte ist nun aber nicht 134 Zyklen lang (sondern 141 oder 142), deshalb kommt der 3. IRQ 14 Zyklen später, also im Abstand 148
- Das 3. Byte ist nun zB 142 Zyklen lang (141.3 aufsummiert und gerundet), also Abstand 142

Kurzum: man muss damit rechnen, daß man bei Divisor 0 nicht 141 sondern nur 134 Zyklen Zeit hat.

Schön und gut, aber hatte ich nicht geschrieben, daß meine Worst-Case Berechnung von 134 Zyklen zu Fehlern führte? Ja, habe ich, da geht immer noch irgendein Detail ab.

Das liess mir natürlich auch keine Ruhe, und was nun folgt ist wirklich schräg (beim Pokey wundert mich eh schon nichts mehr, der ist aber auch noch kaum erforscht):

Normalerweise startet die CPU ja den NMI (oder IRQ) sobald sie mit einem Befehl fertig ist (mit einer Verzögerung von 2 Zyklen, so lange muss IRQ bzw NMI auf Low sein bevor die CPU den Interrupt erkennt).

Im Logic-Analyzer Trace sah ich aber, das die CPU den "BNE" in der "IRQST check Schleife" begann, dann ging im nächsten Zyklus NMI auf Low und eigentlich sollte die CPU 2 Zyklen später (am Ende des 3-Zyklen BNE) mit der NMI Bearbeitung beginnen. Tat sie aber nicht, sonder führte gemütlich den nächsten Befehl aus.

Dieses Verhalten war mir bisher gänzlich unbekannt, und wie sich herausstellte auch so gut wie allen anderen (nur ein paar wenige waren zuvor darüber gestolpert, das war aber nirgendwo dokumentiert).

Details dazu gibt's in diesem Thread auf 6502.org:
http://forum.6502.org/viewtopic.php?t=1634
Das Testprogramm (inkl. IRQ Test, der ist aber durch das knappe Timing nicht 100% exakt, kann also immer "1 instructions delay" ausspucken) gibt's hier:
http://www.horus.com/~hias/tmp/inttest-1.0.zip

Diese Interrupt-Verzögerung tritt nur genau dann auf, wenn ein Branch innerhalb der gleichen Page genommen wird (der Befehl also genau 3 Zyklen braucht) und der Interrupt im 2. Zyklus des Branches auftritt (also der Interrupt direkt nach dem Branch ausgeführt werden sollte). Nicht genommene Branches, Branches zu einer anderen Page oder alle anderen Befehle die evtl. einen Zyklus mehr brauchen wenn eine Page-Grenze überwunden werden muss sind nicht betroffen.

Durch diese neue Erkenntnis machte nun auch der Logic Analyzer Trace Sinn, und der Worst-Case sieht nun so aus:
Code: Alles auswählen
CEC2  D0 F9     BNE $CEBD    ; 3
; NMI occurs at cycle 2 of BNE, should be started after BNE (scanline cycle 10)
CEBD  2C 0E D2  BIT $D20E    ; 4
; IRQ occurs here
; NMI code executed          ; 94
CEC0  10 DC     BPL $CE9E    ; 2
CEC2  D0 F9     BNE $CEBD    ; 3
CEBD  2C 0E D2  BIT $D20E    ; 4
CEC0  10 DC     BPL $CE9E    ; 2
CEC2  D0 F9     BNE $CEBD    ; 2
CEC4  AE 0D D2  LDX $D20D    ; 4
CEC7  A9 DF     LDA #$DF     ; 2
CEC9  8D 0E D2  STA $D20E    ; 4
CECC  A9 A0     LDA #$A0     ; 2
CECE  8D 0E D2  STA $D20E    ; 4
                             ; sum = 123

Diese 122 Zyklen sind reine CPU Zyklen, ohne die "gestohlenen" Refresh Zyklen. Berechnet man die auch noch mit ein kommt man auf folgendes:
Der NMI Code beginnt in Scanline Zyklus 14, bekommt 9 Refresh Zyklen ab und dauert bis inkl. Zyklus 2 der nächsten Scanline.
Das erste "STA $D20E" würde in Zyklus 25 ausgeführt werden, da gibt's aber den 10. Refresh also dauert es bis Zyklus 26.
"LDA #$A0" beginnt in Zyklus 27 und dauert bis Zyklus 28. Ausnahmsweise kein Refresh hier :-)
Der 11. Refresh kommt aber nun in Zyklus 29, bevor das 2. "STA $D20E" ausgeführt wird.
Dieses "STA $D20E" startet in Zyklus 30, in Zyklus 33 würde der Wert in den Pokey geschrieben werden, aber hier kommt der 12. Refresh und der Wert wird erst in Zyklus 34 (135 Zyklen nach Empfang des Bytes geschrieben).

Peng, da haben wir's, 123 Zyklen plus 12 Refresh macht insgesamt 135 Zyklen, nicht 134 wie vorher berechnet.

Ohne die NMI Verschiebung bzw mit einem Zyklus weniger im NMI schafft's der Code in 133 Zyklen, es ist der zusätzliche Refresh, der alles vermasselt :-)

In der Praxis ist das Auftreten dieses Worst Case extrem unwahrscheinlich. Der NMI müsste bei meinem Code wirklich 94 Zyklen brauchen (braucht er aber nie, maximum ist beim OldOS mit allen Zählern übergelaufen 93 Zyklen), dann muss der NMI genau zum richtigen Zeitpunkt eintreffen und das Byte zuvor muss exakt 141 Zyklen lang gewesen sein. Alles in allem äusserst unwahrscheinlich, aber trotzdem sehr beruhigend zu wissen, daß mein Code auch in diesem Worst Case 100% stabil funktioniert :-)

so long,

Hias

PS: ich teste zZt noch meinen neuen Highspeed Code, sobald ich damit fertig bin und die Anleitung angepasst habe gibt's ein Update hier im Forum.

Re: Highspeed mit Pokey-Divisor 0

von tfhh » Sa 18. Sep 2010, 15:59
Moin Hias,
HiassofT hat geschrieben:Mit etwas Verspätung nun die Auflösung des Highspeed SIO / Pokey Divisor 0 Rätsels:

PS: ich teste zZt noch meinen neuen Highspeed Code, sobald ich damit fertig bin und die Anleitung angepasst habe gibt's ein Update hier im Forum.

Ich habe ja die Threads auf AtariAge und 6502.org auch mitgelesen, schon sehr spannendes Thema. Ich denke, Deine Analysen haben viel zum Verständnis des Pokeys beigetragen. Es würde mich nicht wundern, wenn da Details herauskommen, die den Entwicklern damals auch nicht bekannt waren - schließlich galt 19200 bps als "fast enough".

:notworthy: Vielen Dank für Deine Analysen!

Gruß, Jürgen

Re: Highspeed mit Pokey-Divisor 0

von Bernd » So 19. Sep 2010, 23:14
Hallo Hias,
die Arbeit, die du dir gemacht hast, ist unglaublich. Ich hätte nie diese Zusammenhänge vermutet.

Danke dafür,
Bernd
1, 2