Assembler programmieren für Anfänger - Stand der Dinge...

  • Hallo.


    Nachdem wir jetzt seit einiger Zeit hier fleissig Assembler am lernen sind, wollte ich in diesem Thread etwas über meine Erfahrungen bzw. jetzigen Wissensstand und meine Vorgehensweise schreiben und außerdem interessieren mich natürlich eure Erfahrungen sehr !!

    Thoralf macht sich da ja sehr viel Arbeit und ist unermüdlich lehrreiche und sehr verständliche Threads am schreiben. Nochmals ein Dankeschön an dieser Stelle !! Aber ich vermisse ein Feedback bzw. Fragestellungen anderer Mitglieder. Dass man hier als Einsteiger nicht direkt Turrican 7 oder so programmieren will, ist klar. Aber ich denke, jeder, der sich mit Assembler beschäftigt, hat da ein kleines Progrämmchen im Hinterkopf, das er verwirklichen will. Ich vermisse Fragen, wie zB:


    Ich schreibe ein Programm X, das soll das und das können, soweit bin ich jetzt, aber es funktioniert nicht. Woran liegt das ?


    Dann könnte man sich über das Listing gemeinsam unterhalten und eine Lösung suchen. Das hätte einen noch größeren Lerneffekt. Außerdem wäre es dann auch ein Feedback für Thoralf, dass er sieht, dass man sich wirklich ernsthaft damit beschäftigt und er seine ganzen Threads nicht "für die Katz" schreibt. In seinen Threads bin ich persönlich eher zurückhaltend mit schreiben, um die Übersichtlichkeit zu erhalten.



    Mein Lernprogramm sieht momentan so aus:


    Die Lektüre:


    - Thoralfs Assemblerkurs

    - Einführung in die Mikrocomputertechnik

    - 6502 programmieren von Lance Leventhal

    - Der 64er Assemblerkurs in Buchform

    - Machine Language for C64 and other Commodore computers von Jim Butterfield



    -Über Thoralfs Assemblerkurs gibt es nur positives zu berichten. Leicht verständlich und einfach klasse geschrieben.


    -Das Buch "Einführung in die Mikrocomputertechnik" ist wirklich super dazu geeignet, um zu verstehen, wie ein Computer funktioniert und garantiert den ein oder anderen "aha"-Effekt. Es ist schön unterteilt und man kann sich aussuchen, was man lernen will. Den ein oder anderen mögen aufsteigende oder abfallende Flanken am Oszi nicht so interessieren ?! Von Anfang an werden Zahlensysteme, boolsche Algebra und das Rechnen mit verschiedenen Zahlensystemen erklärt. Mit dem Zweier Komplement hatte ich persönlich im Leben noch nie zu tun, aber es ist interessant, wie der Rechner mit Addition subtrahiert. Alles in allem eine klare Kaufempfehlung !!


    -Das Buch "6502 programmieren" von Lance Leventhal ist grundsätzlich nicht verkehrt. Natürlich ist es fachlich korrekt und übersichtlich. Was mich an dem Buch nervt (nein, es geht mir richtig auf den Sack) ist dieser ständige Verweis auf das Buch "Einführung in die Mikrocomputertechnik". Immer dann, wenn es gerade interessant wird, kommt dieser Verweis. Oder es wird ein Thema aus der Luft gegriffen, mit der Begründung, dass man es in dem Buch "Einführung in die Mikrocomputertechnik" bereits gelernt hat. Also ich würde dieses Buch eher jemandem empfehlen, der mal irgendwann mit Assembler gearbeitet hat und seine Kenntnisse auffrischen möchte. Oder aber ergänzend zu anderen Lektüren.


    -Das Buch "Der 64er Assemblerkurs - Assembler ist keine Alchemie" fängt klein an und springt dann voll in die Materie. Grundsätzlich ist es lesbar. Aber ich finde, zumindest für mich als Anfänger, ist es noch zu grob gestrickt. Ok, wie in jedem anderen Buch auch, lernt man die Befehle und wie sie zu handhaben sind und was sie machen. Aber das wars dann auch schon. Auf den Akku, die Register, die Alu und die Statusflags wird nur kurz eingegangen. Verschiedene Passagen muss man (zumindest ich) mehrmals lesen, um sie zu verstehen,was aber nicht unbedingt schlimm ist. Fazit: Es schadet sicherlich nicht, das Buch ergänzend zu anderen Büchern in der kleinen Retrocomputer Privatbibliothek zu haben. Aber für einen Anfänger, der bei null anfängt, finde ich es (zumindest in meinem Fall) nicht geeignet.


    -Das Buch "Machine language for C64 and other Commodore computers" von Jim Butterfield hab ich bis jetzt nur angefangen zu lesen. Aber so langsam wird mir bewusst, warum es bei ebay und Amazon für mindestens 105 Euro in einigermaßen passablen Zustand zu haben ist. Ich habe das Buch nur als englische PDF Version da. Normalerweise bin ich eher ein Freund von Print-Versionen. Aber um 105 Euro zu sparen, liest man auch gerne mal am Ipad. Dieses Buch ist sehr schön geschrieben ! Es ist sehr verständlich und bestens für Einsteiger geeignet ! Da es sich speziell auf Commodore bezieht, geht man von Anfang an nicht nur auf die Mnemonics und den Speicher ein, nein, man geht speziell auf die Speicheradressierung von Commodore Rechnern ein und was für mich persönlich noch viel interessanter ist, den Umgang mit der Anwendung von Kernal Routinen. Was bei den anderen Büchern sehr oft sachlich und fachlich trocken ist, liest man in diesem Buch mit Freude. Jim Butterfield hat anscheinend die Gabe, auch für Anfänger sehr gut erklären zu können ! Bei den anderen Büchern macht es eher den Eindruck, dass diese zwar von Vollprofis geschrieben wurden, allerdings vergisst man als Vollprofi oft die Kleinigkeiten, die das Ganze verständlich und logisch, auch für Anfänger, erscheinen lassen. Ich freue mich sehr darauf, das Buch vollends zu lesen ! Also klare Kauf- bzw. Herunterladempfehlung !!!



    Die Rechner:


    Ich lerne Assembler am C64 und am CBM 8032. Am CBM 8032 habe ich bis dato noch keinen Assembler gefunden, der mir zusagt. Da programmiere ich (staubtrocken) im erweiterten Maschinensprachemonitor. Stürzt das Programm ab, bleibt mir nur ein und ausschalten. Ich habe mir mittlerweile angewöhnt, jedes Mal das Programm vor dem Starten ab zu speichern. Ich habe noch keinen Reset-Taster montiert. Reset auf GND zu legen bewirkt bei diesem Rechner einen Kaltstart, der Speicher ist als gelöscht. Gleicher Effekt wie aus und einschalten. Das ist für mich momentan ein Problem. Ich hätte nie gedacht, dass ein Warmstart-Reset-Taster mal einen so hohen Stellenwert in meiner Computerei hat.


    Am C64 habe ich das Retroreplay und arbeite mit Turboassembler. Hier steht selbstverständlich der geliebte Warmstart-Reset-Taster zur Verfügung *freu*. Somit kann ich ein Programm schreiben, wenn es abstürzt, mache ich einen Reset und das Programm steht immer noch im Speicher. Außerdem kann ich resetten und mir das Programm im Maschinensprachemonitor anschauen, was mir auch schon geholfen hat, die Einsprungadresse zu finden.



    Meine Programme:


    Bis jetzt habe ich nur "Hello world"-Programme mit flackernden Hintergrundbildschirmen geschrieben und ich versuche das einfach zu erweitern. zB, dass man mit einem Tastendruck via Kernalroutine aus der Schleife aus dem Programm aussteigen kann.


    Außerdem hatte ich mir mal irgendwann eine LED Platine für den Userport gebastelt. Da dann ein Lauflicht programmieren etc.


    Ich hab zwar schon sehr viel gelesen, aber noch nicht sehr viel gemacht, einfach aus Zeitgründen. Aber ich habe jetzt Urlaub und werde dann doch die ein oder andere Stunde am C64 mit TurboAss verbringen.



    Meine aktuellen Ziele:


    Als erstes sämtliche Mnemonics lernen und das nutzen von Kernalroutinen. Wenn das sitzt, möchte ich mich mit Sprites beschäftigen. Es wäre ja schon super, ein Sprite mit dem Joystick über den Bildschirm steuern zu können..



    Vorgehensweise:


    ich muss aufpassen, dass ich nicht versuche, zu große Schritte zu gehen. ich denke, dass ich es hin bekäme, jetzt aktuell Sprites mit dem Joystick auf dem Bildschirm bewegen zu können. Allerdings dann nur mit Ach und Krach, zusammengeklauten Routinen etc. Mir ist es wichtig, dass ich weiß wie es bis ins Detail funktioniert. Und nicht nur zu wissen, dass es funktioniert. Ich, als ungeduldiger Mensch, muss also lernen diesbezüglich geduldig zu sein...


    Zudem ist es wichtig, vor dem Programmieren ein Ziel zu definieren. Bei Assembler (und auch bei anderen Sprachen) arbeitet man ja viel mit Subroutinen, also Nebenprogrammen. Bevor man sich also an den Rechner setzt, sollte man sich Blatt und Stift nehmen und ein Flussdiagramm zum Programm zeichnen. Letzten Endes macht das die Sache einfacher. Ich weiß, welche Nebenprogramme ich programmieren muss, welche Variablen ich setzen muss und komme nicht (so schnell) durcheinander.



    Was ich vermisse:


    Ich erinnere mich gerne an die Zeit Anfang der 90er, als ich GFA Basic am Atari ST gelernt hatte. Ich hatte ein Buch, das Ziel war ein Kalenderprogramm. Schritt für Schritt hatte ich das Buch durchgearbeitet, hatte am Schluss ein Ergebnis (das Kalenderprogramm) und wusste auch noch wie es funktioniert. Daraus konnte ich dann viel ableiten und war nach einiger Zeit richtig fit in GFA-Basic. Ich habe damals viel damit gearbeitet.


    Ein solches Buch vermisse ich im Bezug auf Assembler. Sagen wir mal, am Ende soll ein kleines Demo oder ein kleines Spielchen rauskommen und man arbeitet sich dann Stück für Stück zum Ziel.



    Ich bin auf eure Antworten und euren Stand der Dinge gespannt.




    Gruss Jan

  • Ich habe noch keinen Reset-Taster montiert. Reset auf GND zu legen bewirkt bei diesem Rechner einen Kaltstart, der Speicher ist als gelöscht. Gleicher Effekt wie aus und einschalten. Das ist für mich momentan ein Problem. Ich hätte nie gedacht, dass ein Warmstart-Reset-Taster mal einen so hohen Stellenwert in meiner Computerei hat.

    Beim CBM 3032 hatte ich immer einen Schalter am Diagnose-Pin (Userport). Wenn man den wärend des Reset auf Masse zieht, springt der Rechner in den eingebauten Monitor und der Speicher wird nicht gelöscht.

    Ich weiss nicht, ob das beim 8032 noch funktioniert. Wäre aber sch.... wenn nicht.


    Nostalgie hin oder her, ich programmiere Assembler nur noch mal PC mit einem Crossassembler und einem guten Editor (Notepad++) und teste in Vice.

    Wenn das Endergebnis dann auf der realen Hardware läuft, bin ich zufrieden.

    Ich habe einfach nicht mehr die Zeit und den Nerv das wie früher direkt am PET zu machen.

    Ausserdem hat Vice einen eingebauten Monitor, mit dem man die Assemblerprogramm super debuggen kann.

  • Hallo erstmal,


    angeregt durch den Assembler-Kurs von Thoralf hatte ich zunächst die Beispiele anhand der hier vorgestellten Listings bzw. Monitorauszüge nachvollzogen. Dies aus Ermangelung geeigneter Hardware, aber einem echtem Interesse an der Thematik.


    Um das Nachvollziehen etwas leichter zu machen, habe ich mir einen Disassembler in PHP geschrieben. Das ist wirklich sehr einfach und geht sehr schnell, da die Mnemonics in Anzahl und Struktur sehr übersichtlich sind. Das hat sich über einen Tag erstreckt, bei sehr entspanntem Umsetzen.


    Nun blieb noch das doch recht umständliche Erzeugen der zu disassemblierenden Binärdateien. Diese hatte ich durch eintippen der Hexcodes in ein Monitorprogramm erzeugt und abgespeichert. Diese liessen sich dann disassemblieren, so dass zumindest die Mnemonics und somit auch das Programm besser lesbar wurden.


    Da Thoralfs Kurs noch immer am wachsen war, hatte ich dann angefangen - und inzwischen auch fertiggestellt -, einen sehr einfachen Assembler in PHP zu schreiben. Damit lässt sich entweder direkt ein Program erstellen, oder auch die disassemblierten Dateien editieren, um z. B. Labels hinzuzufügen und so den Programmablauf noch besser verständlich werden zu lassen.


    Zur Verdeutlichung, wie das momentan im Einzelnen aussieht, habe ich mal einige Bilder angehängt.


    Mir ist natürlich klar, dass die verfügbaren Emulatoren all das mit sehr viel mehr und auch sehr vielen nützlichen Tools und Funktionen um ein Vielfaches besser machen. Aber:

    So habe ich den Disassembler und den Assembler mal selbst geschrieben, was mir schon Spass gemacht hat.


    Und ein grosses Danke an Thoralf für den Kurs und die Motivation!

  • Also so ganz fertig ist's ja noch nicht ... ich würd' schon noch bißchen was "erzählen". Und vielleicht kommen ja noch ein paar Ergänzungen von anderer Seite dazu. (der fertige "Stack No 2" ... z.B. ;) )

    Zumindest ein Timer Demo kommt noch und wie Jan oben schon angemahnt hat, mindestens so ein klein bißchen was zu Kernelrotuinen soll auch noch kommen.

    Und außerdem : Es darf jederzeit gerne (!) ergänzt, korrigiert, erweitert werden !


    Vielleicht wäre ja ein extra "Bastel-Thread" noch gut, wo man Routinen vorstellt und mal zerpflücken läßt, und andere ihre Ideen dazuschreiben können. (So bißchen wie der HardwareRate Thread, jemand stellt vor, dann wird durchdiskutiert, wenn das Problem diskutiert ist, darf der Nächste.)


    Die Idee mit dem Programm, was man dann stückweise zusammenbaut, ist eigentlich wirklich ganz gut für ein Buch. Da hat man dann das Erfolgserlebnis gleich mit dabei.

    Keine Ahnung, ob sowas als Thread funktionieren kann. Müßte halt probiert werden und das Projekt dafür darf nicht überambitioniert sein und müßte schön in Einzelteile zerlegbar sein. Gut ist sowas auch für eigene Sachen - vornehmen, bauen, dabei lernen.



    Die PHP Assembler Geschichte find ich ja nun gleich wieder ganz schön "knallig". Nur um Assembler zu lernen sich erstmal seinen eigenen Assembler/Disassembler zu schreiben ... - da muß man erstmal draufkommen. :)

    Respekt.


    Davon abgesehen ist das aber, wenn das einen gut benutzbaren Zustand erreicht, sicher was sehr Feines - insbesondere auch, weil man damit auch Leute erreicht, die man mit staubiger Hardware nicht abgeholt bekommt, weil ihnen das viel zu kompliziert ist, die aber auf einer Webseite evtl. genau so einen Kurs mal mitmachen würden, wenn das im Browser läuft. Und dann kann man mit sowas auch einen virtuellen Rechner bauen, wo man stückweise Sachen dazubaut. Bevor man sich die ganze Mühe macht, wäre es sicher gut, mal zu schauen, ob es sowas nicht schon gibt.


    Das Buch oben sieht übrigens gut aus. Aber: Es macht halt genau das, was alle diese Bücher m.E. tun - sie bewerfen den absoluten Neuling erstmal mit komplettem Theoriekram, wodurch so jemand dann einfach in Kapitel 1 1/2 aufhört.

    Ich habe davon aber durchaus viel weggelassen, und auch Sachen, die wirklich relevant sind, sind nur mal nebenbei erwähnt worden, weil ich dachte, das erklärt sich hinterher viel einfacher oder "von selbst". Wenn also jemand z.B. den Begriff Programmcounter vermißt hat, dann hat das bißchen was damit zu tun.

    Für den C16/+4 speziell kann ich noch das Buch "C16 C116 Plus/4 Maschinensprache" von Vüllers bei DataBecker empfehlen. Klein, kurz (manchmal sehr), übersichtlich.

  • Meine aktuellen Ziele:


    Als erstes sämtliche Mnemonics lernen und das nutzen von Kernalroutinen. Wenn das sitzt, möchte ich mich mit Sprites beschäftigen. Es wäre ja schon super, ein Sprite mit dem Joystick über den Bildschirm steuern zu können..


    Hier würde ich ja vorschlagen, das genau anders herum zu machen.

    Alle (!) Mnemonics zu "lernen" hat nur dann Sinn, wenn man sie benutzt, und das passiert automatisch, wenn mans macht. Einige davon wird man evtl. gar nicht, bis nie, brauchen (BIT, RTI, BVC, CLD). Die Kernelroutinen sind nett, aber eher für Anwendungen oder BSausgaben, oder für Dateien lesen/schreiben. Sonst kommt man auch erstmal gut ohne aus.

    Bleibt das mit den Sprites. Eine Joystickabfrage solltest Du hinbekommen. Und Sprites verschieben ist auf dem C64 auch eher eine Sache, wo man mal lesen muß, wie man den VIC bedient. Am Ende läuft es auf Variable X,Y hinaus, die man dem VIC übergibt. Und X,Y ändern sich je nach Joystick. Probier doch das erstmal.

    Das ist auch viel dankbarer als die anderen Sachen, weil man ziemlich schnell sieht, was geht.


    Und es gibt viele schöne Seiten - gerade für den C64 (bei +4 wird das schon schwierig, bei PET sicher auch)

    https://www.retro-programming.…/nachschlagewerk/sprites/ - !!!

    https://www.c64-wiki.de/wiki/VIC - Überblick und v.a. die Links unten

    https://riff.2ix.at/c64/?dok=man-vic - die technische Referenz (, aber eher nix für den Anfang)


    Für viele Standarsachen gibt es für den C64 das dicke Buch "Commodore 64 intern", da sind solche Sachen auch schon schön erklärt mit drin. Einfach mal nachbauen.

  • Ich arbeite jetzt mit dem Buch von Jim Butterfield. Und da wird es anders gehandhabt. Man lernt nicht zuerst trocken die Befehle, sondern arbeitet mit Übungsprogrammen und so wird ein Befehl nach dem anderen ergänzt.


    Ich habe heute das erste mal ernsthaft im Maschinensprachemonitor am C64, anstatt im Turboassembler ein Programm geschrieben. Nach einem Reset war es weg. Also auch beim C64 wird der Speicher gelöscht. Wenn ich allerdings im Turboassembler arbeite, bleibt das Programm erhalten. Das Problem besteht nur im Maschinensprachemonitor...


    Das dicke Buch habe ich. Das ist als Nachschlagewerk nicht schlecht. Ich habe hier so einige Lektüren. Die langen Winterabende sind gerettet... :-)


    Gruss Jan

  • Wie wäre es, wenn ihr euch z.B. einmal die Woche in einer Teamviewer Sitzung trefft, und dann auf dem Rechner eines eurer Mitstreiter im Emulator ein kleines Programm schreibt, es diskutiert und zum Laufen bringt? Das Thema vielleicht vorher vorgeben (z.B. aktivieren des C= Demo Sprite aus dem Handbuch mit Assembler).


    Das würde euch vielleicht zumindest motiveren, ein bischen voran zu kommen?

  • Also ich für meinen Teil bin gerade an dem Franzis Lerncomputer zugange

    Also dem Gakken GMC-4


    https://hc-ddr.hucki.net/wiki/doku.php/homecomputer/gmc-4


    ....und um ehrlich zu sein sprengt dieses "Kinderspielzeug" des öfteren meinen Horizont. Eine Segment Anzeige und ein paar LED's..dazu noch ein Lautsprecher..wie schwer kann das schon sein?!... ist ja immerhin für"Kinder" gemacht...

    ALSO das Kind, dass dieses Buch von vorne bis hinten durch ackert würde mir wirklich Angst machen!


    Aber unterm Strich muss ich sagen, dass ich mich hier wohl richtig entschieden habe. vieles kommt mir wieder vom CNC Maschinen programmieren bekannt vor. Und da ich jemand bin der bei der "Neuzeit" Programmierung Sprungbefehle ganz doll vermisst... Kann ich mich da mit durchaus anfreunden... Der nächste Schritt für mich wird der DDR Lerncomputer LC-80 sein. Eine Sammlung habe ich mir zugelegt und die letzten Bücher die mir noch gefehlt haben werden im Laufe der nächsten Woche kommen.


    Im Gegensatz zu meinen Vorrednern muss ich allerdings anmerken, dass mir das "kleine Programm" welches man verwirklichten will im Grunde noch fehlt. Vermutlich wird es aber die Anzeige eines PT100 Temperaturfühler über einen Analog-Digital-Wandler IC auf der Segmentanzeige des LC-80....wollte eigentlich eine Neopixel LED zum leuchten bringen... Wenn ich das aber richtig verstanden habe reichen die Megaherz und Bit's nicht aus (?)

    https://youtu.be/ii2EgrplbYKA

    Ab 2:25min

  • Ich denke mal, das von Hand assemblieren und dann auf dem Mäusekino eingeben kann einem den Spaß irgendwie nehmen ?! So würde es mir gehen. Die Fehlerdiagnose gestaltet sich doch da viel schwerer, als wenn man den code auf dem Bildschirm hat. Ich denke, solche Geräte sind gut, um irgendwas aus einem Buch ab zu tippen um die Zusammenhänge zu verstehen. Aber um selber was zu entwickeln...ich weiß nicht..


    Du hast doch einen PET und einen Kim-1. Da könntest du zB mit dem PET üben und wenn du fitter bist, was am KIM-1 machen.


    Gruss Jan

  • Du hast doch einen PET und einen Kim-1. Da könntest du zB mit dem PET üben und wenn du fitter bist, was am KIM-1 machen.

    Meine Rede. Je mehr Komfort man beim Coden hat, um so einfacher wird es.


    Das Eintippen von Hexcodes erzeugt zusätzlich zu den anfänglichen Verständnisproblemen auch noch Flüchtigkeitsfehler.

    Ich habe damals (mangels Assembler-Software) so angefangen und schon mal die ganzen Osterferien (3 Wochen!) damit zugebracht, ein 100 Byte langes Programm zum Laufen zu bringen. Der Durchbruch kam dann mit dem ersten Assembler (MAE).

  • Ja, aber wenn man vor lauter Meißeln und Feilen gar nicht erst bis zum Drehen und Fräsen kommt, fände ich das schade. ;)


    Wie gesagt, ich habs ja damals zeitaufwändig auch mit Meißeln und Feilen gelernt (schöner Vergleich übrigens).


    Heute lerne ich beruflich bei fast jedem Softwareprojekt neu. Mit Meißeln und Feilen wäre ich da ziemlich schnell raus.

    Dewegen favorisiere ich den geänderte Ansatz. Auch im Hobby.