Meine Einführung in C64 Maschinensprache / Assembler

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

  • Du kannst ja einfach auch POKEn ohne LISTING. Bleibt alles im Speicher und kann aufeinander aufbauen (Sofern man die Kiste nicht abschiesst wg Tippfehler)

    Ich verstehe jetzt immer noch nicht das Problem. markusk2020 fängt erstmal mit dem Direktmodus auf S.5 an. Dann macht er das in ein Listing. Das finde ich aber auch nicht falsch. Ein Listung hat den Vorteil, dass ich es abspeichern kann. Außerdem kann ich Änderungen vornehmen, falls ich etwas falsch gemacht habe. Klar kann man auch direkt mit einem Listung anfangen. Aber das erste Beispiel ist noch so einfach und kurz, da finde ich das schon OK. Markus arbeitet sich Stück für Stück vor. Zu große Schritte wären für einen Anfänger vielleicht schon zu viel.

    Aus meiner Sicht eins nach dem anderen: Direktmodus -> Listing und nicht Listing -> Direktmodus -> Listing. (Später ist das nicht wichtig nur am Beginn)

    Problem gibt's keins, kann man alles machen. Stichwort Anfänger, wie oben diskutiert und Zielgruppe.

  • Nach diesem Kapitel lege ich jetzt mal einen Stopp ein um Korrekturen vorzunehmen bzw. den einen oder anderen Verbesserungsvorschlag einfließen zu lassen.

    Ich finde das alles ganz prima und freue mich schon auf das Gesamtwerk, würde aber auch sehr dafür plädieren, da nochmal gefühlt in jedem Satz ein oder zwei Kommas aka Kommata einzufügen, die scheinst Du nicht so sehr zu mögen. :) Mich macht das beim Lesen immer latent nervös, aber ich bin da vielleicht ein bisschen zu retro. Bitte nicht übelnehmen, ein Leben ohne Kommas ist auch möglich. :)

  • Direktmodus -> Listing und nicht Listing -> Direktmodus -> Listing.

    Wofür ein mehrfaches hin und her? Das verwirrt ja noch mehr.

    Zielgruppe sollten ja nach Aussage Leute sein, die schon Basic-Erfahrung haben. Die sollten das also bereits unterscheiden können.

  • Für mich ist ein großes Problem, daß man in Assembler nicht ohne weiteres Text ausgeben kann.

    Ich dachte das gerade das beim 64er besonders einfach wäre. 8|

    Selbst beim CPC mit Z80 reicht ein...

    Code
    ld a,65
    call &bb5a
    ret

    ...und es erscheint der Buchstabe A auf dem Bildschirm. Den Minicode weiß ich sogar auswendig, weil genau das mein erstes Assemblerprogramm gewesen war. Eine simple Textausgabe gehörte bei mir in allen Sprachen und Systemen zum ersten was ich ausprobiert hatte.

    Bitte melde dich an, um diesen Anhang zu sehen. :verehr: .: Mit Bitte melde dich an, um dieses Bild zu sehen.wäre das nicht passiert! :. :prof:  Bitte melde dich an, um diesen Anhang zu sehen.

    :syshack: .: Meine 3D-Drucker Teile auf :. Bitte melde dich an, um diesen Link zu sehen. :strom:

  • Für mich ist ein großes Problem, daß man in Assembler nicht ohne weiteres Text ausgeben kann.

    Ich dachte das gerade das beim 64er besonders einfach wäre. 8|

    Selbst beim CPC mit Z80 reicht ein...

    Code
    ld a,65
    call &bb5a
    ret

    ...und es erscheint der Buchstabe A auf dem Bildschirm.

    Ehm... am C64 geht auch das problemlos mit CHROUT

    Code
    LDA txt
    JSR $ffd2
    
    txt: !byte "A",0
  • Ehm... am C64 geht auch das problemlos mit CHROUT

    War direkt in den Bildschirmspeicher poken nicht der einfachste Weg?

    Bitte melde dich an, um diesen Anhang zu sehen. :verehr: .: Mit Bitte melde dich an, um dieses Bild zu sehen.wäre das nicht passiert! :. :prof:  Bitte melde dich an, um diesen Anhang zu sehen.

    :syshack: .: Meine 3D-Drucker Teile auf :. Bitte melde dich an, um diesen Link zu sehen. :strom:

  • "Hello World" in C64 Assembler sieht so aus, und das ist eben nicht einfach:

    Bitte melde dich an, um diesen Link zu sehen.

    Noch dazu ist es "geschummelt", da noch weit komplexere ROM-Routinen dazu aufgerufen werden (gut, würde eine Bibliothek oder ein Interpreter intern auch machen).

    Ich will aber z.B. auch zum Debuggen Registerinhalte als Text ausgeben, und das ist noch komplizierter, da sich durch die PRINT-Routinen selber die Register ändern.

    (Dann muß man das alles also zuerst irgendwo in den Speicher kopieren und von dort auslesen, wird alles nur noch komplizierter).

    Ich sag' ja nicht, daß Text ausgeben technisch gar nicht möglich ist (natürlich ist das technisch möglich), nur es ist eben extrem unkomfortabel, vor allem in Anbetracht dessen, daß man das andauernd während des Programmierens braucht, um Variablen usw. zu überprüfen.

    Gibt es z.B. eine Routine "print", der man beliebige Strings "zuwerfen" kann, wie woanders einer Funktion; so daß man das dafür benutzen könnte? Ist mir so nicht bekannt (aber ich kenne in der Hinsicht auch nicht viel).

  • Reine Assemblerprogrammierung (hier 6502) lässt sich relativ schnell erlernen. Die "paar Befehle" hat man "in einem Wochenende" durch.

    Was dann viel, viel zeitaufwendiger ist, ist die Assemblerprogrammierung für ein konkretes System, hier den C64.

  • Ehm... am C64 geht auch das problemlos mit CHROUT

    Aber nicht so. ;)

    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..

  • Ehm... am C64 geht auch das problemlos mit CHROUT

    War direkt in den Bildschirmspeicher poken nicht der einfachste Weg?

    Viele Wege führen nach Rom.

  • "Hello World" in C64 Assembler sieht so aus, und das ist eben nicht einfach:

    Naja, so schlimm ist das doch gar nicht. Allerdings kommen hier schon fertige Systemfunktionen zum Einsatz, wo man sich wieder mit denen beschäftigen muss.

    Aber wenn man das so um baut, dass es erstmal direkt in den Bildschirmspeicher schreibt, ist das doch sehr übersichtlich.

  • Direktmodus -> Listing und nicht Listing -> Direktmodus -> Listing.

    Wofür ein mehrfaches hin und her? Das verwirrt ja noch mehr.

    Zielgruppe sollten ja nach Aussage Leute sein, die schon Basic-Erfahrung haben. Die sollten das also bereits unterscheiden können.

    Hätte ich jetzt auch so gesehen, wie ich nachträglich angemerkt habe richtet sich der Kurs an Nutzer die bereits in BASIC programmiert haben und den Unterschied zwischen Direkt- und Programm-Modus im Normalfall kennen sollten.

    Klar, wenn ich beispielsweise nur drei POKE Befehle habe, dann macht das nicht wirklich Unterschied ob ich die nun im Direktmodus eingebe oder in Form eines Programms auf Diskette speichere und dieses dann mit RUN starte.

    Wenn's dann mehr Befehle werden bringe ich die natürlich immer in einem Programm unter das man speichern und jederzeit wieder laden kann.

    lg, Markus

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

  • Ehm... am C64 geht auch das problemlos mit CHROUT

    War direkt in den Bildschirmspeicher poken nicht der einfachste Weg?

    Wenn man weiß, wo er ist. Der lässt sich ja verschieben.

    Kürzestes Hello world mit ROM-Routine:

    Code
    lda #<hello
    ldy #>hello
    jmp $ab1e
    
    hello
    !text "HELLO, WORLD!"
    !byte 0

    Vom Text abgesehen also 7 Bytes.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Ich finde es ok, wenn man ein paar wichtige Systemroutinen etwas später vorstellen will, aber doch nicht in den ersten Kapiteln.

    Aber sowas zu Beginn in einem Kurs zu verwenden, ist das IMHO nicht zielführend für die Grundlagen und es wirft nur weitere Fragen und Komplexität auf.

    Ein Anfänger, ob mit rudimentärer BASIC Erfahrung oder nicht, wird da recht schnell überfordert sein.

    Direkt in den Bildschirmspeicher schreiben ist da viel besser und man sieht gleich "aha, da passiert was" um das Erfolgsgefühl und Motivation zu erhalten, um weiterzumachen.

    Ausserdem kann man dann in einem zweiten Schritt erklären, was diese komische Zahl $400 bedeutet.

    ___________________________________________________________
    Meine Kreationen: 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.
    Avatar: Copyright 2017 by Saiki

  • Wenn man nicht nach den undurchsichtigen POKE-Orgien im ersten Teil schon ausgestiegen ist.

    Für mich, als jemand der quasi mit Assembler angefangen hat und das auch viele Jahre beruflich programmiert hat, wirkt das leider sehr verwirrend.

    Aber wenn die Einsteiger schlauer sind und das alles verstehen, dann ist es ja gut. ;)

  • Wenn man nicht nach den undurchsichtigen POKE-Orgien im ersten Teil schon ausgestiegen ist.

    Für mich, als jemand der quasi mit Assembler angefangen hat und das auch viele Jahre beruflich programmiert hat, wirkt das leider sehr verwirrend.

    Aber wenn die Einsteiger schlauer sind und das alles verstehen, dann ist es ja gut. ;)

    Vom Prinzip bin ich am Anfang des Lesens auch darüber gestolpert. Ich kenne die Einführung von der oben angegebenen Fernsehserie und finde die dortige Erklärung wirklich super. Ich finde es auch essenziell wichtig, vor dem Assembler erstmal das grundsätzliche Prinzip der Maschinensprache zu erklären. Man kann das natürlich erstmal rein theoretisch machen, Praxis ist aber immer etwas besseres, um zu lernen. Allerdings ist mir keine andere Lösung eingefallen, wie man das mit dem C64 anstellen kann. Wie zeigt man praktisch das Prinzip der Maschinensprache auf dem C64?

  • Hallo!

    Da hier nun immer die Rede von einem Hello World Programm in Assembler war, hab ich mal versucht das selber im SMON zu lösen.

    Hier meine Lösung:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Ab Adresse $1500 hab ich die Zeichencodes des Strings "HELLO WORLD IN ASSEMBLER!" abgelegt und von Adresse $151A (im Screenshot ganz oben) bis Adresse $1528 befindet sich der Assembler-Code welcher den String dann zeichenweise in einer Schleife unter Verwendung der Kernal-Funktion CHROUT ausgibt.

    Ausgabe:

    Bitte melde dich an, um diesen Anhang zu sehen.

    lg, Markus

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

    Einmal editiert, zuletzt von markusk2020 (24. Februar 2024 um 10:17)

  • Hier meine Lösung:

    Wenn du das JMP durch ein BNE ersetzt, sparst du ein Byte und vermeidest außerdem eine Endlosschleife, falls an der gegebenen Stelle kein Nullbyte kommt. :)

    P.S. Das soll nicht heißen, dass du das in deinem Kurs so machen sollst (da mische ich mich nicht ein), ich plaudere hier nur so vor mich hin!

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Daran war damals, 1982, aber gar nicht zu denken. Vermutlich hatten das professionelle Entwickler aber schon auf ihren Workstations. Aber halt nicht der "gemeine Harry"

    Die GEOS-Emtwickler benutzten einen "In Circuit Emulator" (ICE), Kostenpunkt 5000 Dollar.

    docbobo berichtete: Bitte melde dich an, um diesen Anhang zu sehen.

    Gibt es eigentlich in Verbindung mit aktuellen C64-Entwicklungsumgebungen eine ähnliche Lösung, um einen PC mit dem C64 zu verbinden und Code zu starten?

    Das wäre eine tolle Sache.

  • Ganymed77 Bitte melde dich an, um diesen Link zu sehen.

    Zumindest eine modernere Lösung.