SID-Routine in C

There are 5 replies in this Thread which has previously been viewed 1,565 times. The latest Post (October 6, 2025 at 10:05 PM) was by kdl64.

  • Hallo Leute,

    ich möchte euch heute meine noch nicht fertiggestellte Arbeit zeigen. Ob ich sie irgendwann abschließe, liegt zwar an mir – aber eben auch am Mega65.

    Wie man schon an der Überschrift erkennen kann, handelt es sich um eine SID-Routine für sechs Stimmen. Das Problem an der Routine ist, dass ich es einfach nicht hinbekomme, sie in eine funktionierende IRQ-Routine zu überführen.

    An diesem Problem sitze ich schon sehr lange. Egal was ich versucht habe – allein oder mit KI – am Ende funktioniert es einfach nicht. Der einzige Bereich, in dem die IRQ-Routine zuverlässig läuft, liegt zwischen $1600 und $1EFF. Das ist der Bereich, in dem das ROM ständig sichtbar ist. Verlässt man diesen Bereich, beginnen die Probleme. Man muss dafür sorgen, dass das ROM eingeblendet wird. Im Handbuch ist genau beschrieben, wie man das macht – und trotzdem scheitere ich kläglich daran.

    Egal was ich unternommen habe: Der IRQ ließ sich einfach nicht umbiegen. Für ein paar Millisekunden wurde der IRQ vermutlich mit der neuen Adresse beschrieben, aber das System hat ihn sofort wieder auf den Standard zurückgesetzt. Ich habe es mit den Vektoren $0314 und $0315 sowie mit $FFFE und $FFFF versucht – nichts hat funktioniert. Das ist verdammt frustrierend.

    Ich habe jede Möglichkeit ausprobiert, die ich im Netz finden konnte. Sogar die Routine aus dem Giana Sisters-Demo habe ich verwendet. Aber der liebe Mega65 hat alles abgeschmettert. Man glaubt es kaum, dass einen so eine simple IRQ-Routine in den Wahnsinn treiben kann.

    Deshalb mache ich hier Schluss mit der Musikroutine. Ich stelle sie hier zur Verfügung – vielleicht findet ja jemand von euch eine Möglichkeit, eine einfache IRQ-Routine einzubinden. Und wenn ihr Erfolg habt, teilt es bitte mit allen – mich würde brennend interessieren, woran ich immer gescheitert bin.

    Nun zur Musikroutine selbst:

    Zunächst möchte ich sagen, dass diese Routine mit verschiedenen KIs geschrieben wurde – hauptsächlich mit ChatGPT.

    Aber auch das lief nicht reibungslos. Als Grundlage habe ich einen Assemblercode von der Codebase-Seite verwendet, der von RANT Please login to see this link. stammt. Mehr steht im Kommentar-Kopf leider nicht.

    Ganz am Anfang wollte ich die Routine in Assembler schreiben lassen – aber die KI hat sich ständig im Kreis gedreht, sobald ein Fehler auftrat. Irgendwann kam ich zu dem Schluss, es mal mit C zu versuchen. Da bin ich allerdings komplett auf die KI angewiesen, denn von C habe ich null Ahnung. In Assembler kenne ich mich wenigstens ein bisschen aus.

    Nach kurzer Suche habe ich den Compiler „llvm-mos“ gewählt. Der läuft auch sehr gut, obwohl ich eine Weile gebraucht habe, um ihn zum Laufen zu bringen. Hätte ich halt vorher die README-Datei genau gelesen – da steht nämlich alles drin. Aber egal, ich habe es ja hinbekommen.

    Auch in C hat die KI nicht immer alles richtig gemacht – auch hier drehte sie sich manchmal im Kreis. Aber mit viel Geduld habe ich schließlich eine lauffähige Musikroutine erhalten – nur eben nicht im IRQ. Momentan läuft sie in einer Schleife. Das ist für andere Anwendungen, bei denen man Musik braucht, leider völlig ungeeignet.

    Das Problem mit dem IRQ hat mir den Spaß an der Mega65-Entwicklung momentan komplett verdorben.

    Geplant war eigentlich, wenn die Musikroutine funktioniert hätte, noch einen Tracker zu entwickeln – in der Art von GoatTracker. Und später vielleicht sogar eine Art Musikshop. Aber wenn man schon an einem simplen IRQ beim Mega65 scheitert, mache ich mir für die anderen Projekte keine großen Hoffnungen.

    Vielleicht liefern die Architekten des Mega65 ja irgendwann ein paar Beispiele, wie man eine eigene IRQ-Routine installiert. Ganz am Anfang wollte ich meine Musikroutine in Bank 4 platzieren – hat nie geklappt. Am Ende wollte ich sie in Bank 0 unterbringen – hat auch nicht funktioniert. Daher mein Frust.

    Hier beende ich meinen Bericht. Ich wollte mir das einfach mal von der Seele schreiben. Ich hoffe, der eine oder andere kann damit etwas anfangen. Es gibt hier und da noch Dinge, die geändert werden müssten – aber im Großen und Ganzen läuft die Routine.

    In der ZIP-Datei sind folgenden Daten enthalten:

    SID_Soundbank_Spickzettel.pdf (hier werden alle Parameter der Soundbank erklärt)

    musik.c (SID-Routine in C geschrieben)

    song-01.h ( nicht fertig eingetipptes Lied - Gravity Falls es sind nur 2 Stimmen)

    Musik_Disk.D81 ( entält das fertige Musikprogramm)

    Ach noch was, was ich bis jetzt auch nicht korrieren konnnte, waren die Frequenz in der 6 Oktave.

    Vielleicht weis da auch jemand einen Rat. Kann es zwar nicht verstehen, weil ich die Frequenzen auf dem Handbuch vom C64´er genommen habe.

    Dann bis bald

  • Hi! Das Einrichten von IRQ Wedges ist keine Zauberei, sofern man weiß was man tut. Nachdem du gesagt hast, dass du dich in Assembler etwas auskennst, hab ich dir schnell etwas aus meinen Assembler-Programmen herauskopiert, das immer funktioniert. Und überall im RAM, natürlich nicht nur beschränkt auf $1600-$1EFF. Die meisten Anfänger-Fehler ergeben sich wenn die Wedge nicht "sauber" ein- oder ausgeschalten wird, daher folgendes Bsp:

  • Hi! Das Einrichten von IRQ Wedges ist keine Zauberei, sofern man weiß was man tut. Nachdem du gesagt hast, dass du dich in Assembler etwas auskennst, hab ich dir schnell etwas aus meinen Assembler-Programmen herauskopiert, das immer funktioniert. Und überall im RAM, natürlich nicht nur beschränkt auf $1600-$1EFF. Die meisten Anfänger-Fehler ergeben sich wenn die Wedge nicht "sauber" ein- oder ausgeschalten wird, daher folgendes Bsp:

    Hi,

    OK,

    wenn ich jetzt meine Musikroutine in Bank 4 haben möchte wie stelle ich das dann an?

    Denn ich muß ja wohl erst auf Bank 4 umschalten bvor ich mit einen JSR meine Routine anspringe.

    Aber das werde ich mal in laufe der Woche mal testen, belasse deine Routine und meine Routine in der selben Bank.

    In diesen Fall jetzt bei mir Bank 0.

    Danke für diesen Code, bin gespannt ob das endlich mir hilft.

    Ich muß da aber nocht den Raster bearbeiten, damit die Routine immer zur selben Zeit angesprungen wird. Wir wereden sehen.

    Danke :thumbup:

  • wenn ich jetzt meine Musikroutine in Bank 4 haben möchte wie stelle ich das dann an?

    Denn ich muß ja wohl erst auf Bank 4 umschalten bvor ich mit einen JSR meine Routine anspringe.

    Das weiß ich leider auch nicht. An dem Punkt war ich auch schon vor etwa 2 Jahren, da war das vergleichsweise kompliziert, jedenfalls nicht so easy wie eine Wedge. Das liegt auch daran, wie du dann mit dem VIC kommunizierst, du löst ein Problem und machst ein weiteres auf. Mittlerweilen hat sich da aber viel getan, z.B. passt auch bei den Kernal-Routinen jetzt das SETBNK. Ich bin aber nicht am letzten Stand, vielleicht kann dir jemand anderer weiter helfen.

    Die Alternative ist aber natürlich, in der gleichen Bank zu bleiben. Und da gibt es viele praktische Workarounds: Du könntest dir zB mittels DMA immer einen Block an Musikdaten für die nächsten paar Sekunden Musik aus der Bank 4 oder aus dem ATTIC holen und in die Bank 0 kopieren, z.B. an den von dir angesprochenen Bereich ab $1600, der ist super dafür geeignet, dann bleibst du in der Bank 0 sparsam an Memory und alles funktioniert.

  • Ich werde es erst mal mit nur eine Bank probieren.

    In meinen Fall jetzt Bank 0. Die Musikroutine werde ich nach C000 mit Bload an die Adresse laden.

    Ja und deine Routine werde ich sicherheitshalber in $1600 unterbringen.

    Denn ich weis aus guter Erfahrung, das ich außerhalb von $1600 die Vektoren $0314 und $0315 nicht einfach so verbiegen kann.

    Das ist ja das ganze Dilemma warum mein Frustpegel so gestiegen ist. ;(

  • Heijo Drachen, ich fände einen Tracker für den Mega mal richtig toll. Zeig dem Mega die Zähne und dann den berühmten Finger.

    Foren Anfänger seit mindestens 2005. Und dann immer mal wieder.