Stabile Rasterbars und Badlines - wieso funktioniert mein Code?

Es gibt 29 Antworten in diesem Thema, welches 5.332 mal aufgerufen wurde. Der letzte Beitrag (18. Dezember 2013 um 21:29) ist von flashback.

  • Ich habe mir jetzt mal die Rasterzeilen bzw. die relevanten 3 letzten Bits angeguckt. Meine FLD-Routine startet in RZ 171, das ist eine Badline, da die letzten 3 Bits 011 lauten. Also müßte ich doch dafür sorgen, daß ich nicht den Wert von $d011 immer um 1 erhöhe, sondern den Wert der aktuellen RZ auslese, hochzähle, und dann in $d011 speichern? Das habe ich ausprobiert, mit dem Ergebnis, daß die Bars jetzt nicht nur hoch und runter, sondern auch von links nach rechts "hüpfen".

    Eine andere Frage: Ist es vielleicht eher sinnvoll, die FLD-Routine komplett in einen anderen IRQ zu packen, damit das Timing der Rasterbars nicht durcheinandergerät? Hatte auch einen Versuch damit unternommen, aber da wurde nur der Text bewegt und die Rasterbars blieben wo sie sind. Also scheint das nicht so zu funktionieren?

  • Um 1 erhöhen ist ein bisschen ungünstig. Damit stellst du sicher, daß die nächste Rasterzeile garantiert wieder die Badline-Bedingung erfüllt. Wenn da was nach links und rechts hüpft, dann ist das ein Hinweis darauf, daß Du innerhalb der Rasterzeile die Badline-Bedingung erfüllt hast, da war dann wohl das STA zu spät.

    Besser 2 oder mehr draufaddieren oder 1 abziehen (=7 draufaddieren), dann hat man für 1 bis 6 Rasterzeilen Ruhe damit. Wenn man eh in jeder Rasterzeile was rummacht und genug Zeit dafür übrig hat, dann kann man ruhig in jeder Rasterzeile diese Rechnung ausführen. Aber eigentlich muß man das nur alle 6(?) Rasterzeilen machen, feste Werte kann man sich vorher ausrechnen, so bleibt mehr für Effekte in diesem Bildschirmteil übrig.

    Den FLD in einen eigenen IRQ packen heißt, erst den FLD zu machen, dann die Rasterzeile und ein "Flag" für die Farb-Routine zu setzen und den IRQ zu beenden? Kann man machen, wenn da zwischen FLD und Rasterbars noch allerlei Text mit verschoben werden soll. Ist mehr eine Designfrage als eine technische, wahrschienlich kannst Du die Rasterbars besser direkt im Anschluß an den FLD starten. Falls Du getrennte IRQs machen möchtest denk dran, daß die Rasterzeile für die Rasterbars sich je nach FLD-Scrollposition verändert. Wenn Du den IRQ für die Bars auf Zeile 100 angesetzt hast, dann sind die Bars auch ab Zeile 100, egal, ob Du vorher 50 Zeilen per FLD eingefügt hast. Zeile 150 wäre dann richtig.

  • Erstmal vielen Dank für deine ausführliche Antwort.

    Mir ist heute tagsüber noch eine weitere Idee gekommen: Wenn ich in jedem Durchlauf von der aktuellen RZ immer 6 abziehe, dann kommt logischerweise nach dem Ende des FLD direkt wieder eine Badline. In der bereite ich dann meine Rasterroutine vor, die dann in der ersten RZ nach der Badline startet und somit wieder paßt.

    Das funktioniert zumindest schonmal besser als meine vorherige Version, das Flackern hat sich jetzt verändert: Alle 2 Rasterzeilen spinnt das Timing, also schonmal 50% korrekt. ;) Sieht man im Emulator ganz gut, wenn man die maximale Geschwindigkeit auf 5% stellt.

    Habe die aktuelle Vesion mal wieder angehängt, hier der Schnipsel der FLD-Routine:

    ldx offset
    fld:
    lda $d012

    !wait: cmp $d012
    beq !wait-

    sec
    sbc #$06
    and #$07
    ora #$08
    sta $d011
    dex
    bne fld

  • Ach ja,
    da fällt mit spontan mein Kurzschluß Part ein wo ich vor X Jahren "Spaß" mit hatte.
    Für jede Y-Position des FLD ein anderes Timing :(
    Damals gabs keine namentlichen Sprungmarken, Makros, Debugfunktion und anderes Gedöns ;)
    Der Part existierte schon ein Paar Jahre länger - war mal als Intro gedacht. Es gab für die Willowparty ein neues Logo ;)

    Wens interessiert...
    Der zweite Part ist der interessante.

    Hucky

  • Nach diversem Rumprobieren habe ich bislang 2 unbefriedigende Erkenntnisse: Entweder ist das Timing stabil, also die Bars flackern nicht, dann bewegt sich der Text nicht mit. Oder aber die Bars und der Text bewegen sich beide wie sie sollen, aber die Bars flackern.

    Ist meine Vorgehensweise überhaupt korrekt, vom Ansatz her?

    1) Badline abwarten
    2) Innerhalb der Badline $d012 auslesen, 7 abziehen etc. und nach $d011 speichern. Dies sollte dazu führen, daß direkt nach dem FLD auf jeden Fall wieder eine Badline ausgelöst wird, in der dann die Rasterroutine vorbereitet wird.
    3) Ausgabe der Bars inkl. Softscrolling.

    Das läuft bislang alles in einem IRQ, nur nicht so,wie es soll. ;) Muß ich vielleicht schon vor dem Auftreteten der Badline $d011 erhöhen, oder reicht das tatsächlich innerhalb der Rasterzeile, in der eigentlich eine Badline kommen sollte? Wenn ja, wieviel Rasterzeit habe ich denn dann in dieser Rasterzeile, 63 oder doch nur 20-23 TZ? Argh...

    :zzz:

  • Punkt 2 versteh ich nicht... Du hattest da doch schon eine FLD-Routine, die mit 2 addieren gut lief und die die erste Badline nach dem FLD erzeugt hat, ganz automatisch. Was ist die Idee, VOR dem FLD eine Badline abzuwarten und gleich noch eine zu erzeugen?

  • Nein, da habe ich mich wohl mißverständlich ausgedrückt. Es soll nur auf jeden Fall nach der FLD-Routine immer direkt eine Badline kommen, damit dann die nachfolgende Routine, die die Rasterbars zeichnet, vom Timing her wieder stimmt.

    Irgendwie steh ich gerade komplett auf dem Schlauch.. habe gerade wieder von vorn angefangen und erstmal nur die Rasterbars und den FLD in einen stabilen Double-IRQ gepackt, aber das Ergebnis ist dasselbe. Das Timing der Bars verschiebt sich mit jedem Durchlauf der FLD-Routine.
    :abgelehnt

  • VOn der Beschreibung her könnt die Ursache sein, daß die FLD-Schleife nicht 63 Takte je Zeile braucht. Ein CMP mit der aktiven Rasterzeile kann da bis 7 Takte Verschiebung hinzufügen. Veränder die FLD-Routine mal en bisschen, füge noch einen Farbeffekt mit hinzu, dann kannsr Du sehen, ob dieser Farbeffekt immer untereinander steht.

  • Ich habe die Routine nochmal überprüft, es sind genau 63 TZ innerhalb der Schleife:

    fld:
    lda $d012 // 4 4
    sec // 2 6
    sbc #$06 // 2 8
    and #$07 // 2 10
    ora #$18 // 2 12
    sta $d011 // 4 16
    jsr wait // 12 28
    jsr wait // 12 40
    jsr wait // 12 52
    nop // 2 54
    nop // 2 56
    nop // 2 58
    dex // 2 60
    bne fld // 3 63 ; Sprung

    Zumindest läuft die Routine jetzt zwar stabil, d.h. der Text bewegt sich wie er soll und die Bars flackern nicht, aber ich bekomme es noch nicht hin, den Beginn korrekt zu treffen. Die Umschaltstellen der Bars sind jetzt mitten in der Rasterzeile, und einige Bars scheinen doppelt so dick zu sein wie normal.

    Der weiße Streifen unter den Bars ist zur Kontrolle, an der Stelle wird $d011 mit $1b neu initialisiert.

  • Falls es noch jemanden außer mir interessiert, ich bin mehr oder weniger durch Ausprobieren jetzt zum gewünschten Ergebnis gekommen. ;)

    Nach dem Durchzählen aller Taktzyklen von Beginn der FLD-Routine bis zum Ende der Raster-Routine stellte ich mit Erstaunen fest, daß alles so funktioniert wie es soll: FLD verbraucht genau 63 TZ, nach Ende des FLD wird nach Ende der normalen Rasterzeile direkt eine Badline ausgegeben. Und so ließ sich dann auch die anschließende Raster-Routine wunderbar anschließen.

    Vielen Dank nochmal an alle, die Hilfestellung und Denkanstöße geliefert haben, ohne Hilfe hätte ich wahrscheinlich früher oder später die Lust verloren. Aber wenn es einen jetzt erstmal gepackt hat, dann will man auch weitermachen und rumprobieren. ;)