Meine Einführung in C64 Maschinensprache / Assembler

Es gibt 719 Antworten in diesem Thema, welches 94.517 mal aufgerufen wurde. Der letzte Beitrag (19. November 2025 um 17:56) ist von 64erGrufti.

  • Wie wäre es mit allen Ansätzen?

    Genau so ist es.

    • Erwähnen, was man im Endeffekt damit z.B. anfängt. Also bei Adressen, wo mehrere Bits zum Schalten sind (z.B. $01 mit dem Datasettenmotor), wo aber nur 1 Bit geändert werden soll, der Rest in seinem derzeitigen Zustand bleiben soll.
    • Erklärung mit einzelnen Bits (z.B. so wie meine Lampenerklärung)
    • Darstellung und einzelnes Bit in einem komplletten Byte (in Binärdarstellung) ändern
    • Zum Schluss kann man auf die (Hexa)Dezimaldarstellung gehen.
  • Hallo

    Ich bin auch schon lange auf der Suche nach einem guten Assembler Einsieg.

    Ich habe viele "Kurse" ausprobiert, bin aber immer wieder hängen geblieben.

    Dann werde ich jetzt mal Dein Dokument versuchen, ich freue mich!

  • markusk2020

    Ich probiere gerade dein Programm ab Seite 111 aus (movechar).

    Sollte in der Adresse 1531 auf Seite 112 nicht LDX $fd anstatt LDX #$fd stehen.

    Bei mir springt das A nämlich sonst von $0400 auf $04ff und es soll ja bei $0400 (linke ecke) stehen bleiben.

    :)

    La vida es hoy !

    Schöne Grüße vom größten Kanalknotenpunkt der Welt.

  • Hallo

    Ich bin auch schon lange auf der Suche nach einem guten Assembler Einsieg.

    Ich habe viele "Kurse" ausprobiert, bin aber immer wieder hängen geblieben.

    Dann werde ich jetzt mal Dein Dokument versuchen, ich freue mich!

    Hallo!

    Freut mich, bin schon gespannt auf Deinen Eindruck!

    lg, Markus

    Hier der Link zum Github - Repo des Assembler-Kurses: Bitte melde dich an, um diesen Link zu sehen.

  • markusk2020

    Ich probiere gerade dein Programm ab Seite 111 aus (movechar).

    Sollte in der Adresse 1531 auf Seite 112 nicht LDX $fd anstatt LDX #$fd stehen.

    Bei mir springt das A nämlich sonst von $0400 auf $04ff und es soll ja bei $0400 (linke ecke) stehen bleiben.

    :)

    Hallo, danke für den Hinweis, ist ein Tippfehler, das "'#" gehört in diesem Fall natürlich weg weil ich ja die Adresse $FD meine und nicht den Zahlenwert.

    Korrigiere ich sofort im Dokument :)

    Hier der Link zum Github - Repo des Assembler-Kurses: Bitte melde dich an, um diesen Link zu sehen.

  • Was vielleich auch nicht schlecht wäre

    das was man zeigen will einmal im Assemblercode

    z.B LAD #$01

    STA $0400

    und dann als Basic-Code POKE 1024,1

    Solche Beispiele fand ich immer interressant wie der Assembler-Code in Basic ausehen wird.

    Das fand ich bei der Schleifenprogrammierung dann sehr verständlich

  • Hallo Jörg!

    Hab mir das nochmal angeschaut und die Werte sind tatsächlich nicht mehr da, was ich mir allerdings nicht erklären kann.

    Hat da jemand eine Erklärung dafür? Oder ist meine Aussage falsch, dass die Werte nach Ausführung von PLA trotzdem noch im Speicherbereich des Stack erhalten bleiben?

    Oder ist der SMON selbst eventuell die Ursache für die Veränderungen am Stack?

    Vom PC kenn ich es zumindest so, POP verändert ja nur den Stackpointer, aber "löscht" die Werte nicht physikalisch irgendwie vom Stack.

    lg, Markus

    Hier der Link zum Github - Repo des Assembler-Kurses: Bitte melde dich an, um diesen Link zu sehen.

  • Oder ist meine Aussage falsch, dass die Werte nach Ausführung von PLA trotzdem noch im Speicherbereich des Stack erhalten bleiben?

    Theoretisch ist die Aussage richtig. PLA liest ein Byte vom Stack und erhöht den Stackpointer, der gelesene Wert steht also immer noch im Speicher und wird nicht durch das PLA gelöscht.

    Praktisch befindet sich das gelesene Byte jetzt aber im freien Bereich des Stacks, d.h. wenn der nächste Interrupt auftritt und die Rücksprungadresse auf dem Stack sichert, wird das fragliche Byte natürlich gnadenlos überschrieben.

    Oder ist der SMON selbst eventuell die Ursache für die Veränderungen am Stack?

    Das auch. Wenn man ein Programm per BRK beendet, um gleich in den Monitor zu springen, geschieht das am Anfang über den gleichen Mechanismus wie ein Interrupt, d.h. es werden Daten auf den Stack geschrieben.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Ah ok, alles klar, danke! Dann passe ich das im Dokument entsprechend an :)

    lg, Markus

    Hier der Link zum Github - Repo des Assembler-Kurses: Bitte melde dich an, um diesen Link zu sehen.

  • Ich habe mir das gerade mal angesehen. Das ist extrem seltsam.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Die Ausgabe von SMON und vom Vice-Monitor unterscheiden sich grundlegend.

    Mir sind 2 Dinge aufgefallen:

    1. Die Bytes VOR dem SP unterscheiden sich zwischen Vice und dem Monitor im C64, die Bytes NACH dem SP sind identisch
    2. Wenn man das PLA mal weg lässt, sieht man, dass sich alle Bytes VOR dem SP um eine Stelle nach vorne bewegen, und zwar in beiden Monitoren

    Ich habe das auch mal mit einem anderen Monitor probiert. Der Effekt ist der gleiche.

    Ergänzung: Das PLA schiebt die ganzen Bytes wieder um eines nach hinten. Deshalb ist das dort abgelegte Byte nicht mehr zu sehen

  • Der Bereich ab $0100 wird auch von den Systemroutinen für die Umwandlung von Float nach Integer (aus Variablenwerten Ziffern machen) verwendet, allerdings nur die allerersten Bytes.

    Arndt

    GoDot C64 Image Processing
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Der Bereich ab $0100 wird auch von den Systemroutinen für die Umwandlung von Float nach Integer (aus Variablenwerten Ziffern machen) verwendet, allerdings nur die allerersten Bytes.

    Wie man an meinem Beispiel sehen kann, bewege ich mich aber hinten im Stack. Diese Bytes dürften dann nicht beeinflusst werden. Außerdem habe ich nichts anderes gemacht, als das Assemblerprogramm zu editieren, aufzurufen (mit G) und den Speicher anzuzeigen. Da dürfte also vermutlich keine Umwandlung im Spiel sein, oder?

    Und was hat es mit den mysteriösen Schiebereien auf sich? Und dass sich die Anzeige des Monitors von Vice und der Emulation unterscheiden, finde ich auch seltsam.

  • Ich habe mir das gerade mal angesehen. Das ist extrem seltsam.

    Die Ausgabe von SMON und vom Vice-Monitor unterscheiden sich grundlegend.

    Und dass sich die Anzeige des Monitors von Vice und der Emulation unterscheiden, finde ich auch seltsam.

    Was ist daran seltsam? Der SMON läuft auf dem C64 und benutzt den Stack selbst - es geht ja nicht anders. Der Monitor in VICE ist von der emulierten Maschine komplett unabhängig, der speichert seine Rücksprungadressen auf dem Stack des Host-Computers.

    EDIT: Und PLA holt ein Byte vom Stack - natürlich wird alles, was danach auf dem Stack abgelegt wird, dann um ein Byte höher gespeichert, was denn sonst?

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Bezüglich der Bit-Operationen, am besten fängt man mit einem Grundlagen-Beispiel an. Einfaches BASIC nach Assembler, ein Sprite einschalten. LDA, STA fettich.

    Danach ein zweites Sprite dazu nehmen, LDA, STA, auch fettich.

    Jetzt das erste Sprite ausschalten, oh. Bit-Op, LDA, AND, STA, etc.

    Also ein Beispiel erstmal ohne, danach darauf aufbauen, um so sanft wie möglich in die Abgründe geschubst zu werden. Und ehe man sich versieht, baut man das nächste Uridium.

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Was ist daran seltsam? Der SMON läuft auf dem C64 und benutzt den Stack selbst - es geht ja nicht anders. Der Monitor in VICE ist von der emulierten Maschine komplett unabhängig, der speichert seine Rücksprungadressen auf dem Stack des Host-Computers.

    Gut, das könnte natürlich eine Erklärung sein.

    Edit: Ich habe das gerade mal mit einem Monitor eines Cartridges probiert. Das ist eine Sache von SMON. Der andere Monitor zeigt exakt das gleiche wie Vice. Der unten beschriebene Effekt des "einfügen" tritt aber generell auf.

    EDIT: Und PLA holt ein Byte vom Stack - natürlich wird alles, was danach auf dem Stack abgelegt wird, dann um ein Byte höher gespeichert, was denn sonst?

    Es geht darum, dass alle Bytes von 1F00-SP verschoben werden. Bei PHA wird das Byte also an der Stelle des SP eingefügt, nicht das Byte dort überschieben.

  • Hallo Markus,

    bisher ist alles gut nachvollziehbar und der Schwierigkeitsgrad/Komplexitätsgrad einsteigergerecht gemächlich ansteigend.

    Am Ende ein schönes Subroutine-Beispiel mit dem steuerbaren Zeichen, wie ich finde.

    Damit wäre das Grundgerüst für ein „PETSCII-Vertikal-PONG“ aufgestellt :thumbsup:


    Weiter so! :thumbup:

  • Hallo!

    Danke für das super Feedback!

    Ich arbeite gerade am nächsten Kapitel. Eigentlich ist es jenes, welches in anderen Assembler-Büchern bereits ganz am Anfang kommt, nämlich das Kapitel über Zahlensysteme.

    In letzter Zeit waren die logischen Verknüpfungen hier ein großes Thema und da dachte ich, dass das ganz gut passt, wenn ich das alles nun nachhole. Vor allem weil es in den folgenden Kapiteln sowieso gebraucht wird.

    Ich werde zunächst mal beschreiben, was es mit den Zahlensystemen an und für sich auf sich hat und klarerweise auch zeigen, wie man von einem Zahlensystem ins andere umrechnet.

    Dann wie gesagt die logischen Verknüpfungen und wie man damit gezielt Bits setzen bzw. löschen kann.

    Was ich auch berücksichtigen werde, ist der Vorschlag, Assembler-Code und BASIC-Code gegenüberzustellen.

    Das sollte für dieses Kapitel dann reichen. Was ich mir in diesem Kapitel absichtlich sparen oder nur streifen werde, ist diese ganze Rechnerei mit ADC, SBC usw.

    Ich finde einfach, dass es besser ist, das erst zu bringen, wenn es in einem Programmbeispiel einen konkreten Anlass dazu gibt. Da sieht man gleich auch die Anwendung und vergisst das nicht mehr so leicht.

    Und die Idee mit dem PONG finde ich echt gut, da gibt's dann genug zu rechnen und somit bessere Demonstrationsmöglichkeiten für die Rechenbefehle.

    lg, Markus

    Hier der Link zum Github - Repo des Assembler-Kurses: Bitte melde dich an, um diesen Link zu sehen.

  • Noch eine Anmerkung zum Unterprogramm 1 aus der Sicht eines interessierten Laien:

    Du nutzt ja das Y-Register als Flag oder „Steuerungselement“ für die Ausführungssteuerung der Subroutine.

    Es handelt sich also nicht um eine Datenübergabe im Sinne von Welches Zeichen? oder Welche Farbe?als Datum, sondern als so eine Art CASE-Bedingungsauswertung.

    Ich vermute mal, dass dies eine übliche Programmiermethode ist, um den Ablauf von Subroutinen zu steuern (habe kein Fachwissen).

    Fand ich als Außenstehender sehr erhellend, so als Konstruktionsprinzip.

    Das würde ich nochmal in einem Satz hervorheben, da das m.M.n. eine grundlegende Geschichte ist, die sich universell anbietet für alle möglichen Problemstellungen, ganz analog zu Schleifen.