Hello, Guest the thread was called439 times and contains 20 replays

last post from Jan1980 at the

Laufschrift und Musik gleichzeitig ?

  • Hallo.


    Ich hab eine Routine geschrieben zum Anzeigen von Laufschrift auf dem Bildschirm und möchte, dass gleichzeitig Musik läuft. Einzeln funktionieren die Routinen einwandfrei. Wenn ich allerdings die Musik als Raster-Interrupt einbinde und die Laufschrift als Hauptprogramm habe, geht gar nichts. Das Programm stürzt ab. Ich würde ja den Code hier posten, aber den hab ich gestern Abend in der Verzweifelung so "vercodet", dass er nicht postbar ist... :-)


    Kann ich beides gleichzeitig in einen Rasterzeileninterrupt einbinden und das Hauptprogramm erstmal leer lassen ? Wie geht man vor ?


    Vielen Dank !


    Gruß Jan

  • Läuft denn die Laufschrift alleine im Interrupt oder in einem Loop?


    Heißer Tipp bzgl. vercoden: so bald wie möglich eine Versionskontrolle aufsetzen, die beste Erfindung seit es Programmierer gibt :rauch:

    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────

  • Kann ich beides gleichzeitig in einen Rasterzeileninterrupt einbinden und das Hauptprogramm erstmal leer lassen ? Wie geht man vor ?

    Ja, ganu das würde ich vorschlagen.

    Im priziep, machst Du den sid-playse aufruhf und Deine Scroll routine (also den code aus Deinem Hauptprogramm) hintereinander in the interrupt routine.


    Du must nur daran denken, dass die Interrupt routine eh immer wieder aufgeruhfen wird.

    In Deinem Hauptprogramm, hast Du wahrscheinlich eine Schleife um alles.

    Die musst Du für den Umbau entfernen.

  • Die Laufschrift läuft in einem Loop, aber die Musik sollte im Interrupt laufen. Heute mittag ist mir, die Idee gekommen, "einfach" beides in einen Interrupt ein zu binden und das Hauptprogramm erstmal leer zu lassen. Ich wollte fragen, ob das geht ?! Leider komme ich heute nicht mehr dazu, es aus zu probieren.


    Vielen Dank für die Antworten !!


    Gruß Jan

  • Die Laufschrift läuft in einem Loop, aber die Musik sollte im Interrupt laufen. Heute mittag ist mir, die Idee gekommen, "einfach" beides in einen Interrupt ein zu binden und das Hauptprogramm erstmal leer zu lassen. Ich wollte fragen, ob das geht ?! Leider komme ich heute nicht mehr dazu, es aus zu probieren.


    Vielen Dank für die Antworten !!


    Gruß Jan

    Hi Jan,

    es geht nicht nur; es ist auch besser, so, denn mit Deiner Lösung würde die Schrift ab und an zuckeln, wenn der Rasterstrahl beim Weiterschieben der Schrift grad an einer Stelle ist wo er nicht sein sollte.


    Allerdings sollte Deine Lösung (abgesehen vom Zuckeln) auch funktionieren und nicht abstürzen.

    Da ist also nocht irgendwo sonst der Hund begraben.

    Naja, schreib mal was bei Umbau rausgekommen ist - oft offenbart sich so was gerade bei einem Umbau. :)

  • Hi

    Hier mal ein Codeschnipsel von mir.

    Eigentlich gibt es keine Standartroutine für sowas. Die Routine muß immer angepasst werden so wie man es haben möchte.

    Der Codeschnipsel stand aus ein eines kleinen Demo von mir. Darin war die Animation von Gangam Tanz, mit wechselnde Hintergrundsbilder, sowie die Musik dazu


    So vielleicht kann das dir auf die Sprünge helfen bei deinen Code

    Gruß Drachen

  • Vercoden ist ein schönes Wort ;-)

    Du kannst den Code denke ich dennoch posten oder als PM einmal schicken, einfach zum rüberschauen.


    Mich wundert dass das Programm crasht wenn beides "an ist". Bzw. wie äussert sich der crash?


    gruß

    Thomas

  • Bei dem Crash stand einfach Ready oben und man konnte etwas eingeben. Ich habe eben mal einen neuen Code geschrieben, der auch nicht funktioniert.. :-(( Ich denke, ich muss in einer Schleife den Strahl losjagen ?!



  • Hallo.


    Bei dem Crash stand einfach Ready oben und man konnte etwas eingeben. Ich habe eben mal einen neuen Code geschrieben, der auch nicht funktioniert.. :-(( Ich denke, ich muss in einer Schleife den Strahl losjagen ?

    Vielleicht kann einer mal drüber schauen ?! Vielleicht ist es ja nur eine Kleinigkeit ?


    In der IRQ Subroutine könnte ich dann später bei jsr zusätzliche Laufschriftroutinen etc. einfügen, oder ?


    EDIT: Sorry für den Doppelpost !! Ich weiß nicht, wie ich den Post oben löschen kann...



    Vielen Dank !


    Gruß Jan

  • Leider enthält der Code einige Fehler.

    1.) Das CLI sollte erst erfolgen, nachdem der Interrupt komplett eingerichtet worden ist (Sprungvektor, Rasterzeile, Interruptregister).

    2.) Es ist nicht klar, was "loop" eigentlich bewirken/sein soll. Ein Unterprogramm? Zu welchem Zweck?

    Was passiert, ist Folgendes:

    In Zeile 27 wird per JSR nach loop verzweigt. Nachdem das Programm auf die Zeile 2 gewartet hat (Achtung! Das Highbit von $d011 wird hierbei nicht überprüft!), folgt kein RTS, sondern es geht direkt weiter mit der Unterroutine "main_irq_init", die aber oben bereits aufgerufen wurde. Diese wird dann per RTS beendet, so daß zurückgesprungen wird nach Zeile 28, also zum Aufruf von loop. Jetzt wird als Nächstes erneut "main_init" durchlaufen. Da dieses ebenfalls per RTS beendet wird, kehrt daraufhin das ganze Programm nach Basic zurück.

    Es gibt also in dem Programm mehrere Fehler bezüglich der Unterprogrammaufrufe. Zudem existiert auch kein richtiges Hauptprogramm. Hierfür wäre es wenigstens nötig, nach Initialisierung des Interrupts eine Endlosschleife auszuführen.


    Tip:

    Zu Beginn benötigst Du zum Austesten keine Interrupts. Sowohl die Musikroutine als auch den Scroller kannst Du aus einer Hauptprogrammschleife aus aufrufen. Wenn das dann läuft, kannst Du Musik und Scroller in einen Interrupt verfrachten.

    Ein Testprogramm könnte so aussehen:

  • MJ hat die Fehlerkette schon gut erklärt :)


    Wen man davon ausgeht, das Du alles im IRQ erledigen willst (was Deine JSR im IRQ ja vermuten lassen), ändere den "Loop-Part" einfach so ab:

    Code
    1. jsr musik_init
    2. jsr main_irq_init
    3. jsr main_init
    4. cli
    5. loop
    6. jmp loop

    und den alten Loop löscht Du einfach weg.


    Gruß

    Thomas

  • Hallo.


    Ich sitze jetzt wieder dran und irgendwie stehe ich auf dem Schlauch. Seit einer Stunde probiere ich rum und ich dachte, ich frage einfach mal die Kollegen, die es schon können... Irgendwie bin ich gerade zu blöd dazu, den Fehler zu finden.. :-)


    Irgendwie habe ich bei dem ganzen IRQ Gedöhns anscheinend etwas grundfundamental falsch oder gar nicht verstanden. Wenn ich diesen Code laufen lasse, sehe ich am Außenrand nur Geflimmer. Was ist der Fehler an dem Code ?



    Vielen Dank !


    Gruß Jan

  • Wenn ich diesen Code laufen lasse, sehe ich am Außenrand nur Geflimmer. Was ist der Fehler an dem Code ?

    Im Interrupt wird 147 per $ffd2 ausgegeben und somit der Bildschirm gelöscht. Nimm den Teil mal raus, das kann nicht gehen.

    Und solche Sachen wie "Bildschirm komplett schwarz färben" und "Zeichensatz-Pointer ändern" würde ich erst einbauen, wenn der Rest läuft.

  • Hallo Jan,


    da sind gleich mehrere Fehler drin.


    1.) Dur rufst die Laufschrift mehrmals auf (Zeile 26 und 36) - überflüssig

    2.) Im Loop manipulierst Du u.a. auch die Borderfarbe - Zeilen 32 - 40 überflüssig

    3.) In der Laufschrift setzt Du den Border noch einmal auf schwarz

    4.) In Zeile 125 löscht Du quasi den Bildschirm wieder - löscht also Deinen Scroller

    5.) In der Laufschrift springst Du immer wieder an den Anfang der Routine, statt diese per RTS zu beenden (Zeile 149, 158, 162)


    Wenn das korrigiert ist hast Du quasi einen Scroller der aus im IRQ aufgerufen wird. Du wirst aber feststellen das der "ruckelt", das hängt etwas mit Deinem Timing zusammen - sprich wann Du den "Hardscroll" machst.

    Ändere den Wert #200 noch in #255 der Zeile 138 ab, dann passt es auch.


    Schau mal, ob Du mit den Hinweisen oben was anfangen kannst und ob wir so Schritt für Schritt zum ersten Ergebnis kommen - wenn dann noch mehr Sachen hinzulommen, werden beim Scroller noch ein paar mehr Sachen auffallen (z.B. das Rücksetzen von $d016). Aber wie gesagt Schritt für Schritt ;)


    Gruß

    Thomas

  • Ahh !!! :-) Ok.. Jetzt läuft die Laufschrift auf schwarzem Hintergrund im IRQ. Ich hatte mich mit der Subroutine an $ffd2 nicht auseinandergesetzt. Ich dachte, dat Dingen löscht nur den Bildschirm.... :-) Vielen Dank !


    Hier nochmal der aktuelle Code:




    Jetzt versuche ich noch die Musik rein zu kriegen.



    Gruß Jan

  • So, hier nochmal etwas verfeinert. Aber die Schrift ruckelt schon immer noch. Vielleicht sieht es am C64 direkt besser aus als im Emulator ?!


    Vielen Dank !!


    Gruß Jan

  • Hab gestern Abend noch etwas rumgefriemelt. Mir scheint, die Laufschrift läuft doch nicht im IRQ ?! Er springt oben einfach mit jsr laufschrift in die Routine und das wars. Selbst wenn ich in der subroutine irq alles rauslösche läuft das Programm noch immer. Also wie bekomme ich jetzt das Gedöhns in einen Interrupt ? Vielleicht kann ja nochmal jemand drüber schauen ?


    EDIT : Nach fast einem jahr Assembler-Bücher etc lesen, hab ich jetzt mal die Codebase64 Seite entdeckt.. :-D Da sollte ich fündig werden..


    Danke !


    Gruß Jan

  • Er springt oben einfach mit jsr laufschrift in die Routine und das wars. Selbst wenn ich in der subroutine irq alles rauslösche läuft das Programm noch immer.

    Ja, weil die Routine "laufschrift" bereits eine Endlosschleife enthält und daher niemals ins Hauptprogramm zurückkehrt. Der "loop jmp loop"-Teil wird also niemals erreicht.

    Also wie bekomme ich jetzt das Gedöhns in einen Interrupt ?

    Den Laufschrift-Teil kann man gedanklich in zwei Teile teilen: Der äußere Teil besteht aus Kontrollstrukturen und Warteschleifen, der innere Teil macht die eigentliche Arbeit wie Daten umkopieren und Scrollregister setzen.

    Interrupts ersetzen den äußeren Teil, also änder den Laufschrift-Code so, dass man den "inneren" Teil separat aufrufen kann.


  • Hab gestern Abend noch etwas rumgefriemelt. Mir scheint, die Laufschrift läuft doch nicht im IRQ ?! Er springt oben einfach mit jsr laufschrift in die Routine und das wars. Selbst wenn ich in der subroutine irq alles rauslösche läuft das Programm noch immer. Also wie bekomme ich jetzt das Gedöhns in einen Interrupt ? Vielleicht kann ja nochmal jemand drüber schauen ?

    Ja, weil ein Teil der gemachten Anmerkungen noch nicht umgesetzt sind ;-)

    Du hast z.B. immer noch JMP's in der Laufschrift, so das die zum IRQ nicht mehr zurückkehrt.


    Und aus dem IRQ rufst Du den Scroller jetzt auch nicht mehr auf.


    Ich habe Deinen Code mal etwas modifiziert, so das er lauffähig ist und auch Musik abspielt, wenn:

    a) eine Musik ab $1000 liegt

    b) diese Musik ab $1000 den Initjump hat und ab $1003 der eigentliche Playteil aufgerufen wird

    c) die Kommentare in Zeile 47 und 85 entfernt werden


    Vergleich den Code mal mit Deinem und den Hinweisen von weiter oben (ja, neben den Hinweisen habe ich noch eine Kleinigkeit geändert) und versuch das mal nachzuvollziehen. ;)


    Gruß

    Thomas

  • Hi Jan


    So auch ich möcht noch einen kleinen Beitrag leisten.

    hier eine andere Routine nicht die von dir.

    Die Routine enthält den Scroller mit Musik. Am besten vergleiche mal diese Routine mit der deinen. Ist ist nicht viel anderst.

    So viel Spass damit.

    Noch was ...... ich habe das C64Studio für den Code verwendet.