Mit CIA-Timer Taktzyklen zählen, wie genau funktioniert das?

Es gibt 16 Antworten in diesem Thema, welches 2.852 mal aufgerufen wurde. Der letzte Beitrag (22. Mai 2014 um 11:03) ist von enthusi.

  • Hallo zusammen,

    ich habe mal eine Verständnisfrage zum Thema Taktzyklen zählen. Wenn ich den Timer mit einem bestimmten Wert lade und dann starte, dann werden ab diesem Moment alle Taktzyklen der nachfolgend ausgeführten Befehle gezählt, oder? Läuft der Timer rückwärts? Und wenn er bei 0 angekommen ist, wird dann wieder der Startwert eingetragen? Hier mal ein Beispiel, wie ich mir das vorstelle (CIA 1, Timer B):

    Was genau passiert ab dem Befehl "sta $dc0f", wird der "STA" schon mitgezählt? Nehmen wir mal an, als nächster Befehl kommt ein "lda #$ff", der verbraucht 2 Taktzyklen, also müßte im Timer dann der Wert 48 drinstehen, korrekt? Und falls der Timer nach ein paar weiteren Befehlen auf 1 steht, und es folgt wieder ein "lda #$ff", steht er danach auf 49?

    Der Hintergrund meiner Frage ist, daß ich gerne wissen würde, wieviel "Zeit" teile meiner Routinen benötigen, dann könnte man ja zu Beginn der Routine den Timer einstellen, die Routine ausführen und am Ende der Routine den Timer wieder stoppen und auslesen.

  • Wenn ich den Timer mit einem bestimmten Wert lade und dann starte, dann werden ab diesem Moment alle Taktzyklen der nachfolgend ausgeführten Befehle gezählt, oder? Läuft der Timer rückwärts? Und wenn er bei 0 angekommen ist, wird dann wieder der Startwert eingetragen?Was genau passiert ab dem Befehl "sta $dc0f", wird der "STA" schon mitgezählt? Nehmen wir mal an, als nächster Befehl kommt ein "lda #$ff", der verbraucht 2 Taktzyklen, also müßte im Timer dann der Wert 48 drinstehen, korrekt? Und falls der Timer nach ein paar weiteren Befehlen auf 1 steht, und es folgt wieder ein "lda #$ff", steht er danach auf 49?


    - es werden systemtakte gezählt (und zwar selbst dann wenn die CPU steht)
    - der timer läuft vom eingestellten timerwert rückwärts
    - beim erreichen von 0 wird der startwert geladen, WENN der timer im continues mode läuft
    - der timer startet in dem zyklus der dem zyklus folgt in dem der timer durch beschreiben von $dc0f gestartet wurde

    wenn du ausführungszeiten messen möchtest ist es am einfachsten den timer erstmal auf den wert $ffff zu setzen, und dann zu starten. vor dem auslesen des wertes den timer wiederum stoppen. nun nimmst du vom gelesenen wert das 1er komplement (eor $ffff) und ziehst einen korrekturwert ab (welcher der anzahl zyklen entspricht die beim starten bzw stoppen des timers verbraucht werden, also irgendwas um die 8..oder so :))

    zb im source zu synthmark64 Bitte melde dich an, um diesen Link zu sehen. kannst du dir das angucken, der macht genau das

  • Über ein Bit im Kontrollregister kann man zwischen "One-Shot"- und "Continuous"-Mode wechseln: Ersterer macht nur einen Durchlauf runter auf Null und bleibt dann stehen, letzterer fängt sofort wieder mit dem Startwert an und zählt weiter.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Und auch drauf achten, dass man wirklich den Systemtakt zählt, aus Versehen oder wenn man unbedingt will kann man nämlich auch einstellen, dass stattdessen irgendwelcher anderer Huppifluppi gezählt wird :)


  • - beim erreichen von 0 wird der startwert geladen, WENN der timer im continues mode läuft

    Das heißt also, statt 0 wird sofort der Startwert wieder eingetragen, oder wird die 0 auch mitgezählt? Beispiel:

    Timer: 2
    Befehl: nop

    Dann steht also direkt nach dem "NOP" nicht die 0 im Timer, sondern eben direkt der Startwert, also 50?

    Bit 3 muß also gelöscht sein, damit das funktioniert. Und bei "Mode Select" müssen auch beide Bits gelöscht sein, oder was bedeuten die anderen Einstellungen bzgk. Bits 6-5?

  • Zitat

    Dann steht also direkt nach dem "NOP" nicht die 0 im Timer, sondern eben direkt der Startwert, also 50?


    ja, die 0 "sieht" man da nie

    Zitat

    Und bei "Mode Select" müssen auch beide Bits gelöscht sein, oder was bedeuten die anderen Einstellungen bzgk. Bits 6-5?


    ja... "10" ist zur kaskadierung der beiden timer gedacht, die beiden andren zählen impulse an dem mit CNT bezeichneten eingang der CIA (der wenn ich mich recht erinnere am userport anliegt)

  • - es werden systemtakte gezählt (und zwar selbst dann wenn die CPU steht)

    Will heissen auch wenn der VIC die CPU stoppt um die zeile auszugeben zaehlt der timer weiter! Ist also zum zaehlen "deiner" cycles ungeeignet.

  • Wenn ichs richtig sehe, reden jetzt schon 2 Leute davon, dass die CPU mal "angehalten" wird. Das ist mir irgendwie neu. Wie ist das zu verstehen? Reden wir vom C64? Ich dachte, die CPU führt immer irgendwelche Befehle aus. Wie hält man eine CPU an?

  • Während einer Badline hält der VIC die CPU für mindestens 40 Takte an (können auch 43 werden). Dazu kommen noch Zugriffe für aktive Sprites. Geht über das RDY-Signal an der CPU.

  • Achja, da war was. Beim C64-6510 ists die AEC-Leitung, die der VIC-II während der Badline zum Kopieren des Farbrams setzt, richtig?

  • Einfach bildschirm aus (d011) wenn Du 'ausgefuehrte CPU zyklen' messen willst.

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

  • Sicher dass das muss bei blank screen?

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

  • DMA geht auch weiter wenn screen aus, ja (wir erinnern uns an den screenmode wo es keine badlines gibt, aber noch immer sprites...)

    noch eine falle: nach dem setzen von d011 zum screen abschalten lange genug warten, so das der screen auch wirklich aus ist - sonst gibts unter umständen unerklärliche zufällig anmutende messfehler

  • Achja, da war was. Beim C64-6510 ists die AEC-Leitung, die der VIC-II während der Badline zum Kopieren des Farbrams setzt, richtig?

    Äh, nein... Mit AEC werden die Adressbustreiber der CPU vom Bus genommen damit der VIC den Bus benutzen kann. Das passiert in jedem Taktzyklus einmal. Anhalten tust du sie mit dem Signal an RDY, das wird nötig wenn der VIC währned der Bandline beide Hälften eines Taktzyklus braucht.

    Während einer Badline kopiert der VIC sich den Inhalt des Farb-RAMs und die Char-Pointer aus dem Screen-RAM für eine Zeile in ein internes RAM (40 x 12 Bit).

  • Zitat

    Sicher dass das muss bei blank screen?


    Ja, haben wir bei "4Krawall" benutzt. Ich habe den Effekt mal von allem anderen separiert angehängt:
    Bitte melde dich an, um diesen Anhang zu sehen.
    Da wird die Bewegung der Balken nur durch Sprites verursacht.

  • Danke!
    Dann hatte ich damals wohl echt noch was Falsch in meiner Routine die das mal probiert hat (haette sollen :)
    Fuer einen ganz anderen Zweck :wink:

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.