Timing bei Copperbars

Es gibt 6 Antworten in diesem Thema, welches 1.192 mal aufgerufen wurde. Der letzte Beitrag (15. April 2009 um 08:02) ist von Mnemonic.

  • Ich hoffe hier kann mir jemand helfen :help: :help: :help:

    Ich habe den ganzen Tag damit verbracht, mit recht bescheidenen Kenntnissen einfache Copperbars darzustellen. Soweit siehts auch gar nicht sooo schlecht aus, aber das mit dem Timing und der Synchronisation verstehe ich noch nicht ganz. Ist es "natürlich", dass man andauernd das Timing wieder anpassen muss? Insbesondere die X-Synchronisation macht mir besonders Schwierigkeiten, da ich alles probiere, aber nie den richtigen Wert erwische. Außerdem hakelt das ganze auch noch etwas (ist also nicht flüssig). Ich denke das hat was mit den Bad Lines zu tun. Und wenn die Copperbar den unteren Bildschirmrand verlässt und oben wieder eingeblendet wird, erscheinen kurzzeitig am oberen Rand diverse Artefakte. Außerdem variiert die Geschwindigkeit, so daß ich das Gefühl hab, dass nicht jeder Interrupt-Aufruf gleich lang dauert ...

    Frage ist, muss ich das mit dem Timing anders handhaben? Z.B. mit den Double-IRQs, von denen ich gelesen habe? Und gibt es irgendwo einen wirklich guten Artikel, in dem das verständlich erklärt ist (nicht nur kommentierte Sourcecode....)

    Source und Demointro anbei.

    Für jede Hilfe bin ich dankbar!!!!!

  • Hi naaina,

    hab' Dir mal ein Beispiel angehängt, ist auch gleich inklusive einem Gerüst für einen stabilen IRQ. :winke:

    Im Prinzip holst Du mit der Routine einen Farbwert für die nächste zu zeichnende Rasterzeile und den dazugehörigen Verzögerungswert, der variiert natürlich je nachdem, ob die nächste Zeile eine Badline oder eine normale Zeile ist.

    Die Tabellen liegen im Beispiel ab $2000 (Verzögerungswerte) bzw. $2100 (Farben).

    Die Routine fängt nach dem stabilen IRQ in der Rasterzeile $32 an und zeichnet dann ab der ersten Badline (Zeile $33). Wenn Du das anders positionierst musst Du natürlich die Werte in der Tabelle entsprechend verschieben.

    Schau's Dir einfach mal an, wenn Du noch fragen dazu hast, einfach posten.


    Ups, fast vergessen... Programm starten mit "SYS 2051"!!!

    Gruß,

    der Mnemonic

  • Hi Mnemonic,

    danke, im Sourcecode gibts so einige Dinge, die mir das jetzt klarer werden lassen. Zumindestens hab ich jetzt die Routine soweit stabil, dass er nur noch auf den Badlines flackert!

    Aber könnte ich damit auch anders umgehen? Das heisst, eine Badline anhand $d012 (à la ... lda $d012; and #$07; sta temp; lda $d011; and #$07; cmp temp; beq badline) erkennen und entsprechend dann weniger Cycles verbrauchen? Oder würde die Erkennung, ob es sich um eine Badline handelt, wieder solange brauchen, dass ich dann wieder zu spät wäre? Und ich dachte, dass der Sinn meines "Mini-FLDs" in meinem Quellcode eben diese Badlines umgeht?

    Grüße,
    naaina

  • OK, jetzt wirds komisch. Ich habe den Raster stabil aber weiss nicht warum :grr:

    Mögt ihr mal schauen? :bgdev

  • OK, mal weiter in meinem Monolog. DEN von $d011 setze ich hier halt nicht, also treten auch keine Bad Lines auf. Was insgesamt ganz praktisch ist, aber leider kann ich so auch keinen Text/Bitmaps anzeigen. Wenn ich DEN aktiviere, ist das Raster noch stabil, aber er flackert aufgrund der Bad Lines. Dafür muss ich sicher deine Lösung, Mnemonic, implementieren. Deine Methode verzichtet anscheinend auch auf FLDs und das hätte auch den Vorteil, dass ich hier nioch einen Textscroller einbauen könnte. Seh ich das insgesamt richtig?

    Wenn ja, dann mach ich das mal :hammer:

  • Ja, genau so ist die Routine gedacht, dass man halt noch was mit Bitmap oder Charset drüber machen kann.

    Du kannst Dir da z.B. einen Scroller mit invertiertem Charset drüber legen, etc. ...

    Auch das Problem mit den Badlines lässt sich lösen, hab' Dir nochmal was drangehängt! :winke:

    Start mit "SYS 2051".

    Im Prinzip beginnt der Rasterbereich immer ab der selben Zeile, und dann wird eine Art Matrix ausgelesen, die in jedem Frame einfach nur neu befüllt wird, d.h. die Position der Rasterbars wird anhand einer Sinustabelle immer wieder neu in der Matrix gesetzt und diese dann einfach komplett dargestellt.

    So sparst Du Dir das verschieben Deines IRQ!

    Gruß,

    der Mnemonic