Vernunftmensch: Ohne es zu verstehen einfach zusammen kopieren ist aber keine besonders gute Art Programme zu schreiben. Insbesondere keine um gute Programme zu schreiben. Dann weiss man ja nie ob das Programm nicht nur zufällig funktioniert.
Die Unterbrechungsbehandlung würde ich wie gesagt gar nicht in C schreiben, sondern direkt in Assembler.
Man kann auch aus dem 30. Stock springen und sich bei jedem Stockwerk an dem man vorbei fällt sagen „Hey, bis jetzt ist alles gut gegangen”.
Aber vielleicht sollte man Sachen, die absehbar früher oder später Probleme bereiten werden, besser nicht machen. Zumal wenn sie überhaupt nichts zur Problemlösung beitragen. Das Bitmuster für den Rahmen hat ja nichts mit dem Abspielen von Musik zu tun, sondern ist Teil des Grafikeffektes von dem IRQ-Demoprogramm von odg. Dazu wäre es jetzt wieder hilfreich wenn Du kein Programmieren über Kopieren und Einfügen betreiben würdest, sondern auch verstehen würdest was der Code bewirkt.
Das ganz hinten im Verzeichnis nicht SID steht ist überhaupt nicht seltsam, weil das keine beliebigen Dateiendungen sein können, sondern immer einer der Dateitypen ist, die das Commodore-DOS kennt. Es werden auf Diskette keine drei Buchstaben gespeichert, sondern ein Zahlenwert, der für den Typ steht. Da gibt es im wesentlichen die Typen DEL, SEQ, PRG, USR, REL, und CBM, die am Ende von der Verzeichnisauflistung stehen können. Das hängt vom DOS im Diskettenlaufwerk ab.
Eine Dateiendung im Sinne von Dateinamen auf dem PC müsste man also, wenn schon, in den 16 Zeichen unterbringen, die das CBM-DOS für den Dateinamen vorsieht.
So eine Dateiendung bestimmt aber nicht den Dateityp. Weder auf dem PC noch auf dem C64. Eine Datei im PSID-Format ist nicht weniger eine Datei im PSID-Format, wenn der Dateiname nicht mit ”.sid” endet. Man kann aus so einer Datei durch umbenennen von name.sid nach name.wav ja auch nicht einfach eine WAV-Datei machen. Es bleibt eine PSID-Datei.
PSID-Dateien haben, wie viele andere binäre Dateiformate auch, ganz am Anfang eine Kennung. Meistens sind das vier Bytes, die lesbare Zeichen enthalten. Im Falle von PSID ist es die Buchstabenfolge "psid", beziehungsweise ''rsid'' bei RSIDs. Das lässt sich bei der Sidplay-Diskette leicht überprüfen:
3 "bogymen " prg
11 "beginning " prg
19 "cuthb " prg
28 "knucklebusters " prg
30 "dying high " prg
67 "rambo first bloo" prg
32 "yie ar kung fu" prg
33 "yie ar kung fu i" prg
20 "hollywood or bus" prg
20 blocks free.
ready.
list
10 open2,8,2,"rambo*,p,r"
20 for i=1 to 4
30 get#2,a$:b$=b$+a$
40 next
50 close2
60 print">"b$"<"
ready.
run
>psid<
ready.
Alles anzeigen
Grundsätzlich sollte man davon ausgehen, dass alle PSIDs Speicher ausserhalb des Bereichs in den sie geladen wurden, benutzen. Denn es wird kaum Playroutinen geben, die keine Adressen in der Zeropage verwenden. Da muss man also auch auf Konflikte zwischen der Musikroutine und der cc65-Laufzeitumgebung achten.
Ab Flags befinden sich auch Informationen, die zum Abspielen wichtig sein können.
Zum Beispiel ob der Code PlaySID-spezifische Erweiterungen verwendet, die auf einem echten C64 nicht existieren (PSID), oder ob das BASIC-ROM benötigt wird und die mit "RUN" gestartet werden (RSID). Dann steckt da noch die Information drin welcher Video-Standard für Songs angenommen werden soll, die einmal pro Frame gespielt werden. Falls der nicht mit dem von dem Rechner überein stimmt, auf dem der Song abgespielt werden soll, wird er entweder etwas schneller oder langsamer abgespielt, oder man muss doch auf einen Timer-Interrupt zum Abspielen ausweichen.
Die Information welcher grösste, zusammenhängende Speicherbereich nicht von der Playerroutine verwendet wird, ist sicher auch eine nützliche Information für Dein Programm. Dort kann dann Deine Abspielroutine liegen. Und wenn der Bereich gross genug für das Hauptprogramm ist, könnte man das auch dort hin verschieben und am Ende wieder zurück verschieben, statt es neu zu laden.
Bei dem Fire-Demo hast Du ”oben” und ”unten” verwechselt. Das Kleiner-als-Zeichen, macht für ”unten” doch auch mehr Sinn. Das ist aber nicht die Startadresse des Programms, sondern die Adresse von der `main()`-Funktion. Bevor die nach einem Programmstart mit RUN aufgerufen wird, müssen noch einige Initialisierungsaufgaben durchgeführt werden.
Überleg doch mal ein bisschen. Wie startest Du das Programm denn? Doch wohl mit RUN. Und was passiert dann? Liste das Programm mal auf und schau nach.