SID Files in ein Assemblerprogramm einbetten

  • SID Files in ein Assemblerprogramm einbetten

    Hallo Leute,

    ich bin dabei ein kleines Demo auf dem C64 zu coden und das wichtigste fehlt mir noch. Nähmlich die Musik.
    Ich habe mir bereits ein paar SID Dateien zurecht gebastellt, die ich in der Demo verwenden würde. Diese habe ich bereits als DAT bzw. PRG Dateien vorliegen.

    Meine Frage ist wie bekomme ich den Code der SID in mein ASM File rein?
    - NO CARRIER -
  • Ist in den Dateien nur noch der reine SID-Player drin?

    Wenn ja, ist es in der Regel ein binäres Inkludieren in den Code mit ggf. Skippen der beiden Lade-Adress-Bytes (!bin für ACME/C64Studio, !incbin ... bei anderen, etc.)

    Dann ist wichtig, dass die Adresse, an der du das File inkludest, der korrekten Adresse entspricht. Und dann musst du natürlich wissen, wie du den Player aufrufen musst.

    Die meisten haben eine Adresse für Song-Init und eine für Song-Update, das einmal pro Frame aufgerufen wird.
  • Hi

    Ich bin zwar nicht der beste Proger hier, aber bei meinen Demos habe ich das immer so geregelt

    Brainfuck-Quellcode

    1. ;------------------------------------------------------------
    2. ; variabeln -SID legt bei $1000
    3. ;------------------------------------------------------------
    4. sync = $50
    5. raster = $d012 ; rasterstrahl-pos
    6. yscroll = $d011 ; y-scroll-register
    7. scrollreg = $d016 ; scrollregister
    8. charset = $d018 ; zeichens. definieren
    9. vic_irr = $d019
    10. imr = $d01a ; irq mask register
    11. sid_musik = $1000
    12. sid_init = $1000
    13. sid_play = $1003
    14. ;------------------------------------------------------------
    15. ; daten in den speicher laden
    16. ;------------------------------------------------------------
    17. ;--------- musik einbinden
    18. *= sid_musik
    19. !bin "e:\relaunch64\sample\--- sid1000 ---\SID.prg",,2 ;sid player einfügen, startadresse und psid header überspringen
    20. ; startadresse
    21. * =$8000 ;startadress als Beispiel
    22. ;------------------------------------------------------------
    23. ; programm-anfang
    24. ;------------------------------------------------------------
    25. ;------------------------------------------------------------
    26. ; irq vorbereiten für gangnam style - hauptdemo
    27. ;------------------------------------------------------------
    28. demo sei
    29. lda #<irq01 ; lowbyte laden
    30. sta $0314 ; und speichern
    31. lda #>irq01 ; highbyte laden
    32. sta $0315 ; und speichern
    33. lda #$00
    34. sta raster ; Register $d012
    35. lda #$3b
    36. ldx #$01
    37. sta yscroll ; Register $d011
    38. stx imr ; Register $d01a
    39. lda #$7f
    40. sta timer1 ; Register $dc0d
    41. lda #$01 ; soundnummer
    42. tax
    43. tay
    44. jsr sid_init ; initialisieren
    45. cli
    46. ;------------------------------------------------------------
    47. ;---- multiple loops auserhalb der irq-routine
    48. ;------------------------------------------------------------
    49. mainloop1
    50. lda sync
    51. and #$00
    52. sta sync
    53. syncwait1
    54. cmp sync
    55. beq syncwait1
    56. jsr ........
    57. jsr .......
    58. jmp mainloop1
    59. ;------------------------------------------------------------
    60. ; hauptroutine irq1
    61. ;------------------------------------------------------------
    62. irq01
    63. lda #$86
    64. sta raster
    65. jsr sid_play
    66. .
    67. .
    68. usw.
    Alles anzeigen
    So hat es bei mir fast immer funktioniert. Aber an der Routine musste ich aber immer wieder herum bastelen, denn je mehr der C64´er erledigen muss, desto mehr musste ich mich mit der verbleibende Zeit zurecht kommen.

    Gruss Drachen
    :D :D Ich liebe den Sound vom C64ér :thumbsup: :thumbsup: :thumbsup:
  • Danke für Infos, aber die bringen mich leider nicht richtig weiter.

    Ich habe ein SID File, das ich mit SIDTracker64 erstellt habe und ob da der Player mit drin ist, kann ich so nicht sagen. Ich kann aber wenn gewünscht auch gerne die SID Datei mal hier hoch laden.

    Ich möchte die Demo so fertig machen, dass sie aus nur einer Datei besteht und ich nicht aus zwei (Demo+SID File). Die Musik soll sich zusammen mit dem Democode in einer Datei befinden.
    - NO CARRIER -
  • Genau das gleiche Problem habe ich auch gerade und da die Meisten Code-Beispiele für Cross-Compiler sind („!bin c:\ ... bla bla) und ich aber ganz nativ mit Turbo Assembler direkt am C64 arbeite, bin ich gerade dabei mir eine IDE mit ACME und VICE unter Windows einzurichten.

    Ich habe eine wirklich ganz einfache Farbwechsel/Scrolltext-Demo und eine nackte SID-Datei und möchte beides verheiraten.

    Ich muss jetzt also (.... wenn ich richtig verstanden habe...):
    - Zeilen IRQ einfügen
    - SiD laden
    - SID innerhalb des Zeilensprungs aktualisieren
    >> 2 x ATARI Falcon 030 14MB * Atari 1040 STE TOS 2.06 4MB UltraSatan * C64 mit 1541-Ultimate-II * C64II * C64 RetroPi Umbau * Gameboy classic * PSP 1000 <<
  • So wuerde das zB mit dem XA assembler funktionieren:

    Quellcode

    1. .word $0801
    2. *=$0801
    3. .word basend
    4. .word 0
    5. .byte $9e
    6. .asc "2061"
    7. .byte 0
    8. basend
    9. .word 0
    10. *=$080d
    11. ;init SID
    12. lda #0 ;jaja, LAX
    13. tax
    14. tay
    15. jsr $1000
    16. main
    17. wait1
    18. lda $d011
    19. bmi wait1
    20. wait2
    21. lda $d011
    22. bpl wait2
    23. inc $d020
    24. jsr $1003
    25. dec $d020
    26. jmp main
    27. .dsb $1000-*,0
    28. .bin 126,0,"SAFTS_Music.sid"
    Alles anzeigen
  • @t0m3000:
    So wie ich das eben bei dem SIDTracker64 gesehen habe, kann man die Musikstücke in verschiedenen Formaten exportieren.
    Jetzt aus dem Bauch heraus würde ich sagen exportier das als *.prg.

    Entweder ist das denn ein ausführbares Programm oder es enthält nur den Tune und einen Player.
    Wenn es ausführbar ist, würde ich das starten und "klassisch" mit einem Monitor den Speicherbereich speichern.
    Zum Testen kannst Du das dann ja immer an die passende Position laden - für den späteren Onefile gibt es Packer/Cruncher die die einzelnen Files dann zusammenführen.

    Du kannst den Tune auch gerne hochladen oder PM und ich schaue mir das an und extrahiere die den Tune.
    Ggf. kann ich den auch die gewünschte Zieladresse relokieren - ich weiß ja nicht wo Du den eingeplant hast.

    Mit welcher Umgebung programmierst Du denn?

    @'RetroKid:
    Hier gilt wie ich oben schon sagte: das was benötigt wird in den Speicher laden (zum Testen/programmieren) und später alles mit einem Packer/Cruncher verheiraten.
    Je nachdem was Du vorhast:
    - Musik Init im Hauptprogramm
    - IRQ Startrasterzeile setzen und ggf. Raster stabilisieren
    - Effekt (Scroll/Rasterbar)
    - Musikplayer anspringen
    Ggf. vor dem Effekt die Musikabspielen - je nachdem wo du den Effekt haben willst.

    Turboasscode sollte nicht das Problem sein - sag ggf. Bescheid wo's genau hakt-
  • t0m3000 schrieb:

    Ich habe ein SID File, das ich mit SIDTracker64 erstellt habe und ob da der Player mit drin ist, kann ich so nicht sagen.
    Und ich würde jetzt mal spontan behaupten: Ohne "Player" ergibt es gar keinen Sinn, da gibt es einfach zu viele Möglichkeiten, wie die Daten organisiert sein könnten. Es muss also immer Code enthalten sein, der aus den Musikdaten die SID Register regelmäßig aktualisiert.
  • Ich habe das ganze mit dem C64 Studio umsetzen können, da dort der Import von SID Files sehr einfach ist. Man benötigt nur die Abspielroutine im Assembler und FERTIG. Mit Turbo Assembler müsste man die ganzen DATA Zeilen von Hand eingeben, das ist beim Studio mit einem einfachem !import möglich. Dann einfach den Header rausrechnen lassen und gut ist.
    - NO CARRIER -
  • HOLY MOSES/ROLE schrieb:

    Also beinhaltet eine .sid Datei nur die Noten?

    Schon merkwürdig das da so ein großes Geheimnis drum gemacht wird und dies mit Sicherheit nicht förderlich ist für zukünftige Softwareentwicklungen.
    Noten werden es nicht sein, aber Daten in der bestimmten Reihenfolge und den Header (der muss weg).
    Ich habe auch etwas länger als gedacht für das Importieren des SID Files in mein Intro gebraucht.
    Schaue dir mein Intro mal an und disassembliere es mit C64 Studio dann siehst du den Quellcode.

    ibex-crew.org/93intro.prg

    Ich hoffe, dass es dir weiter hilft.

    Ich habe auch erst gedacht, dass das ein Top-Secret Code sein muss, der dort benötigt wird. Ich denke, dass die, die kein Plan davon haben ständig nur von der $1000hex Adresse reden, weil es das Wenige ist was sie über SIDs wissen und die, die es drauf haben es nicht so richtig aus sich rausbekommen.

    Schade eigentlich, ist aber so ;)
    - NO CARRIER -

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von t0m3000 ()

  • HOLY MOSES/ROLE schrieb:

    Also beinhaltet eine .sid Datei nur die Noten?
    Eben gerade nicht, wie ich nur wenige Postings darüber schon angemerkt habe ... ich würde mich sehr wundern, wenn es "SID Files" ohne Player-Code gäbe.

    HOLY MOSES/ROLE schrieb:

    Schon merkwürdig das da so ein großes Geheimnis drum gemacht wird und dies mit Sicherheit nicht förderlich ist für zukünftige Softwareentwicklungen.
    Was für ein Geheimnis? Hier ist z.B. das Format dokumentiert.
  • zrs1 schrieb:

    Eben gerade nicht, wie ich nur wenige Postings darüber schon angemerkt habe ... ich würde mich sehr wundern, wenn es "SID Files" ohne Player-Code gäbe. Was für ein Geheimnis? Hier ist z.B. das Format dokumentiert.
    Es geht ihm nicht um das Format SID, sondern um das Einbinden eines Files in Assembler.

    Dein Kommentar ist ein gutes Beispiel dafür was Moses und ich meinen.
    - NO CARRIER -
  • t0m3000 schrieb:

    Es geht ihm nicht um das Format SID, sondern um das Einbinden eines Files in Assembler.

    Dein Kommentar ist ein gutes Beispiel dafür was Moses und ich meinen.
    Was soll der Dummfug? Nix für ungut, aber es ist schon ärgerlich, so eine Reaktion zu bekommen, wenn man einfach die relevante Dokumentation verlinkt!
    1. Dass in einem SID "nur Noten" gespeichert sind ist nunmal falsch, zumindest in dem Format das ich kenne
    2. Mit der Dokumentation des Formats weiß man, wieviel Header man "wegschneiden" muss und wie der Rest der Daten zu nutzen ist für etwas hörbares.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von zrs1 ()

  • t0m3000 schrieb:

    Noten werden es nicht sein, aber Daten in der bestimmten Reihenfolge und den Header
    Der Player ist Teil des SID-Files, da es ja keine standardisierte Abspielroutine und keine standardisierten Daten auf dem C64 gibt. Die Spec ist hier zu finden, der Header enthält die Positionen der benötigten Routinen. Ein Player, der nicht auf dem C64 läuft, muss daher eine entsprechende 6502-Emulation enthalten.

    EDIT: huch, von einem halben Dutzend Postings überholt worden, während ich das getippt habe... :sleeping:
    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────
  • ***** Vorsicht! Dieser Post soll kein persönlicher Angriff sein!!! ******

    Aua Aua aua, vielen Dank für die Hilfe wenn es denn eine gewesen sein soll.

    Da bekommt man auf eine in einem deutschen Forum gestellte, offene Frage einfach einen Link zu einer englischsprachigen Internetseite von einem Author, der Zuhause höchstwahrscheinlich statt "Halt die Klappe" ersatzweise "lda#$00; sta $ d418" zu seinen Kindern sagt.

    Nicht sehr hilfreich für alle nicht-SID-Profis.

    Wenn ich Zeit dafür habe werde ich mir das alles mal durchlesen und am c64 durchkaspern.

    Falls mich z.B. mal jemand nach einer Telefonnummer fragt, schicke ich ihm einfach den Link vom "oertlichen", falls es diesen Unfug noch gibt. (Scherz)
    Gruß & Kuss zum Wochenschluss,
    Holy Moses/Role

    m.youtube.com/watch?v=iMtYBzMCYhQ