Schöne Einführung in Assembler. Hatte mich vorher nie mit Assembler/Maschinensprache beschäftigt. Dein Video ist meine allererste ernstzunehmende Berührung mit der Thematik. Gut und einfach erklärt, werde mich damit in Zukunft mehr beschäftigen, um deutlich schnellere Programme als Basicprogramme auf dem C64 zu schreiben. Danke für dein Video👍👍👍
Super erklärt. Hab meinen C64c erst wieder ausgepackt & endlich aufgemotzt - so wie ich es "damals" aus Geldgebermangel nicht hinbekommen hab. Dein Video ist sowohl Auffrischung als auch Neues lernen sowie neu lernen - einiges hat die Zeit in meinem Kopf nicht so gut überstanden wie auf den Disketten. Danke für die tollen IT Stunden!
Mir ist gerade ein SMON-Modul in die Hände gefallen, das habe ich gleich mal ausprobiert. Vielen Dank für den tollen Einstieg. 👍 Ich hatte mir deinen Assemblerkurs schonmal angesehen, aber jetzt werde ich ihn nochmal richtig mitmachen. Das ist deutlich besser. 😊
Klasse gemacht! Besonders gut gefällt mir, dass du deinen eigenen Lernprozess in den Videos zeigst. Ich sitze an meinem eigenen Vice-Emulator bzw. dem C64Maxi und probiere mit. :)
Schön das es Dir gefällt. Ich hab tatsächlich zum Zeitpunkt der Aufnahme gerade mit Assembler begonnen... Leider ist das schon länger her und ich hab viel wieder vergessen. Aber ich kann ja das Video schauen. 😂😅
Genau, das wird (meiner schon immer Meinung nach) das eigentlich schwierige dann für Ottonormalleute - die ganze / eine Spiellogik u. mehr in Assembler hinzubekommen. Deswegen sind manche v.a. "billig gemachte" Spiele und Spieleengines wie dieses Revenge Of The Tomato Ballerspielchen aus der RGCD auch so simpel und "digital" und repetitive. Aber bis hierhin auch schonmal alles sehr gut gemacht, gut zuzuhören, alles gut erklärt. So lerne ich endlich 'mal die Bedienung und Befehle von Smon besser kennen. Auch wenn ich das vom im Nordic Power Modul integrierten Maschinensprache Monitor samt meinem org. manual dazu.. schon so ganz ähnlich kenne.
Hallo Michael, vielen Dank für Dein Abo. 😊 Bis ich kleinere Spiele etc. machen kann ist es wahrscheinlich noch ein weiterer Weg. Ich lerne Assembler ja gerade selbst erst. Aber ich bin da schon recht zuversichtlich. 😉 Wahrscheinlich werde ich mit Hybriden aus Basic und Maschinensprache anfangen, also im Basic Code mit SYS Unterprogramme aufrufen, die dann Zeitkritische aufgaben erledigen. Mal sehen... Als nächstes wird wohl bald ein Video mit Memory Monitoring folgen, also den Speicher auslesen, bearbeiten und Programme darin verschieben und kopieren mit SMON. Die Assembler Befehle kommen dann später in dem Kurs der 64er...
Hallo Cannyfocus, ich denke auch das es eine Herausforderung wird die in Logischen Programmiersprachen sonst "recht simplen" Abläufe in Assembler zu implementieren, aber ich glaube... es könnte Spaß machen. 😅🙈 RGCD kannte ich bis eben garnicht... Asche auf mein Haupt, das werd ich mir erstmal ansehen. 😮
@@C64Die 16k Kompetition der RGCD ist's halt 'nur': www.c64-wiki.de/wiki/RGCD. 2016 war aber leider die vorerst letzte echte "competition". Da sind alle Releases, quasi so noch etwas übersichtlicher als sich selbiges aus der csdb zu ersehen, nach Jahr aufgelistet.
Danke für die gute Erklärung! Habe den 64er-Kurs vor mir liegen und bin doch manchmal über einige Sachen gestolpert. Ist schon das ein oder andere Mal sehr merkwürdig geschrieben. Aber in Kombi mit deinen Erläuterungen bin ich endlich schlauer geworden (= Dr. Brain) und habe zum ersten Mal verstanden was ich mich schon vor 40 Jahren gefragt habe :-)
Hallo Frank, ich musste mir das auch alles erstmal anlesen. 😅 Diese Kurse aus der 64er sind schon stellenweise etwas anstrengend finde ich. Mit diesen ganzen "Agenten"-Vergleichen und so... ist eben in den 80ern geschrieben und dementsprechende Vergleiche werden angestellt. Das zu der Zeit kaum Fachbegriffe benutzt werden (weil es sie noch nicht gab, oder niemand sie verstanden hätte) macht es nicht leichter die Artikel aus der Zeit zu lesen... 🙂
mnemonics heissen übrigens die Assembler Kurzbefehle wie zb 'LDA'. Klasse Serie! werde die Tage auch wieder meinen C64 'anwerfen'.. erstmal smon testen, aber vermutlich werde ich dann zügig das actioncardridge nutzen :-)
@@C64 Der kann im Prinzip das Selbe wie der Smon, aber muss natürlich nicht ständig in den Speicher geladen werden und man hat dann in der Badic Eingabeaufforderung grundsätzlich die Disktools auf den YfTasten, das bietet schon Vorteile..
Die App "RealCalc" auf Android, und in den settings "Radix Modes" einschalten. Sehr unkompliziert und praktisch. PS: und bei "long click shift" auch einen Haken machen - das erspart die Shift-Taste.
Ich find es totaaal cool, dass hier 8bit Systeme am C64 in Basic und Assembler vorgestellt werden! Und ich will auch nicht, dass Du damit aufhörst! Einzig der Channelname impliziert vollkommenes Wissen. Und das sehe ich hier nicht! Eher wildes rumprobieren. Es ist aber cool, dass Du versuchst, den Küken zu zeigen, wie man Hardware-nahe programmiert, und was der C64 noch leisten kann. (Ohne irgend nen klicki-bunti Frontend von Windows)
Ich vermisse es so, dass man mit dem Cursor zu einer Zeile wandert und dort einen Befehl ausführen kann, der dort schon vorhanden ist und der beim Drücken von Eingabetaste übernommen und ausgeführt werden kann. In DOS am x86-PC kann ich mit dem Cursor auch in jede Zeile springen, doch was dort bereits geschrieben steht wird einfach ignoriert und ist für den Eingabe-Interpreter nicht vorhanden. So muss man neu tippen, oder wie in DOSBOX mit den Coursor-Tasten (die nicht den Cursor bewegen) nach oben scrollen um die vorher eingetippten Befehlszeilen erneut zu bekommen, scrollt auf der Stelle alle Namen durch. Das geht dann auch noch, wenn dort ASCII- Reste stehen und dazwischen unser neuer Befehl. Sieht dann entsprechend unsauber aus.
Es hat aber auch nicht immer Vorteile... Hab mir schon oft ganze Zeilen in Basic dadurch zerschossen... 😅 Aber hast recht: Es ist natürlich die coolste Art ein Eingabeinterface zu designen. 😉
moin und danke für die coolen videos !! ich habe folgende frage .. ich verwende den ccs64 und habe probleme beim speichern ( 27:43 ) nachdem ich gespeichert habe und den smon verlasse, bekomme ich mit LOAD"$",8 die fehlermeldung ?OUT OF MEMORY EROOR ich habe den emulator neu gestartet und ein diskimage mit hilfe von Dirmaster erstellt und geladen woran kann das liegen ?
Hallo Excess 1972, das liegt sicher daran, das Du nach dem Laden von SMON die Pointer nicht mit dem NEW Befehl resettet hast. Wie das alles zusammenhängt kann ich nicht genau sagen, aber nach dem Laden von einem Maschinensprachprogramm mit ,8,1 kommt es zu einem OUT OF MEMORY ERROR, sobald ein BASIC Befehl, in dem Fall LOAD, ausgeführt werden soll. Der Befehl NEW resettet alle Pointer, löscht aber nicht das Maschinenprogramm. Also einfach nach dem Laden von SMON einmal NEW eingeben und abschicken, danach sollte das Laden kein Problem mehr sein. 🙂
In 0400 Bildschirm-Speicher und in D800 Farbspeicher In Y-Register FF Startwert Geschrieben wird nach Adresse+Y dann wird Y verringert und gesprungen solange Y noch nicht Null ist, sonst Ende der Schleife und geschrieben wird der "Wert" im Akku-Register, der mit dem Inhalt vom X-Register zwischen den beiden Schreib-Befehlen ausgetauscht und am Schleifen-Anfang neu geladen wird siehe Sprungadresse
@@C64 Ich habe doch noch nicht alles vergessen. So können Bild- und Farb-Speicher beide gleichzeitig mit Y adressiert werden. Hier wird mit der höchsten Adresse angefangen und dann byte weise verringert. Anders herum würde es auch gehen, den Wert in Y erhöhen.
16 Bit Werte im Speicher sind bei CPUs mit "little endian" erst das low byte und dann das high byte. Ganz im Gegensatz zu big endian, dort ist es genau umgekehrt.
@@C64 Ja genau. de.m.wikipedia.org/wiki/Byte-Reihenfolge Bei 32 bit und 64 bit Werten im Speicher mit little endian ist es genauso. Erst low word 16 bit, dann high word 16 bit, oder erst low double word 32 bit, dann high double word 32 bit immer angefangen mit dem low byte vom low word vom low double word.
das überschreiben geht nur mit save "@0:programmname",8 ich denke das wird wohl in smon genau so gehn (habs nicht geteste), gibt auch dokumentation dazu im c64-wiki :) kannsts jedoch gern mal probiern mit s"@0:test" 7000 7005
Irgendwo im forum hab ich gelesen dass save"@0:name",8 corrupted ist und manchmal die Daten korrumpiert. Keine ahnung was da dran ist und obs vllt. Nur ältere c64 (oder 1541) betrifft...(?)
Ich kriege den SMON einfach nicht zum Laufen. Fehlermeldung beim Start des Basic-Loaders "Fehler in Block 7"; bin die Data-Zeilen alle durchgegangen....... Please help !
Hallo Sven, bekommst Du SMON nicht zum laufen, oder einen Basic Loader? "Fehler in Block 7" klingt nicht nach einer Fehlermeldung die der C64 so schmeißen würde. Versuch am besten mal diese Version von SMON: www.cbmhardware.de/dlmanager/index.php?id=162 Das ist das Image das auch im C64 Wiki verlinkt ist und die ich im Video benutze... 🙂
Beim Dissamblieren sollte man bestenfalls nicht mitten innerhalb eines Befehls z.B. bei 7001 anfangen, wenn in 7000 kein Ein-Byte-Befehl enthalten ist und dort wie im Beispiel ein zwei Byte langer Befehl steht und der nächste Befehl in 7002 beginnt.
Ich hab's noch nicht getestet, aber wenn man beim Disassemblieren bei einem Parameter anfängt, also im Beispiel $7001, wird dann überhaupt etwas gültiges angezeigt, bzw. ist SMON so schlau dann in der Speicherstelle davor einen gültigen Befehlscode zu suchen? 🤔
@@C64 Das kommt ganz darauf an, ob der Operand des 2 Byte Befehls von 7000 in 7001 einen Wert hat, der ein Opcode ergibt, oder nicht. Ist es ein Opcode wird der dazu gehörende Befehl angezeigt, wenn nicht kommen nur Sternchen, oder bei Debug in DOS Fragezeichen. So kann ein Operand fälschlich als Opcode angezeigt werden, der auch entsprechend ausgeführt werden würde, wenn man dorthin bei der Programmausführung springt, oder dort startet. Bei Intel 80386 können die Befehle bis zu 15 Bytes lang sein. Da kann man schnell mal etwas falsch anzeigen lassen, wenn man wahllos durch den Speicher dissambliert. Der richtige Startpunkt hat somit eine wichtige Bedeutung.
@@C64 Beim x86 macht es Sinn auf Daten- und Code-Ausrichtung(alignment) zu achten. Das bedeutet 16 bit Werte an einer durch 16 teilbaren Adresse stehen zu haben, weil die CPU den Speicher nicht Byteweise läd, sondern in Blöcken. Bei Werten die in zwei verschiedenen Blöcken liegen hat die CPU entsprechend mehr zu laden, auch Bytes die oberhalb und unterhalb unseres 16 bit Wertes stehen und gar nicht benutzt werden, wenn die Adresse nicht durch 16 teilbar ist z.B. bei 000f. Bei 0010 wäre es durch 16 teilbar. Das selbe gilt für den Code der unterschiedlich viele Bytes je Befehl haben kann. So macht es Sinn eine Ziel-Adresse für einen Sprung-Befehl zu haben die durch 16 teilbar ist, auch wenn dabei eine Lücke im Code entsteht die übersprungen wird. vereinfachtes Beispiel.... Anfang: Befehl Befehl bedingter jump nach VORNE wie z.B. BNE/BEQ Adresse bedingungsloser jump zum Anfang Adresse: 000E leer byte Adresse: 000f leer byte VORNE: Adresse: 0010 nächster Befehl Damit wird der Code schneller ausgeführt, wenn nicht nach 000e, sondern nach 0010 gesprungen wird. Für Routinen die nicht so zeitkritisch sind hat das jedoch nur wenig Bedeutung, wenn man danach eh nur auf einen Tastendruck wartet. Das macht zweifellos das Dissamblieren des Codes schwieriger. So muss dann in mehreren Schritten dissambliert werden, damit der richtige Code auch angezeigt wird.
Beim Makro-Assembler MASM gibt es einen org-Befehl womit die aktuelle Adresse($) verändert werden und eine Ausrichtung erzeugt werden kann. So braucht man sich nicht weiter darum zu kümmern welche Adressen es sind, wenn wir nur mit Adress-Marken/Labels arbeiten, egal welche Adresse dabei ensteht. START: Befehl Befehl bedingter Sprung nach VORNE bedingungsloser Sprung zum START org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung VORNE: Befehl
@@C64 lustig wäre es, zwei unterschiedliche programme im (fast) gleichen speicher zu haben - um 1 byte verschoben. Je nachdem ob ich z.B. sys7000 oder sys7001 mache, wird derselbe inhalt einmal als op code und einmal als daten-parameter interpretiert, und umgekehrt.... Ob man damit was praktisch sinnvolles machen kann weiß ich nicht, aber für didaktische demo-zwecke ließe sich bestimmt etwas kurioses erzeugen... :)
Hallo Micha, nicht alles. In diesem Video geht es um die Bedienung von SMON, im ersten Video um eine Einführung in Assembler. Das sich da natürlich ein paar Inhalte überschneiden ist klar. Aber ich hätte sie hier auch nicht einfach weglassen dürfen...
Schöne Einführung in Assembler. Hatte mich vorher nie mit Assembler/Maschinensprache beschäftigt. Dein Video ist meine allererste ernstzunehmende Berührung mit der Thematik. Gut und einfach erklärt, werde mich damit in Zukunft mehr beschäftigen, um deutlich schnellere Programme als Basicprogramme auf dem C64 zu schreiben. Danke für dein Video👍👍👍
Super erklärt. Hab meinen C64c erst wieder ausgepackt & endlich aufgemotzt - so wie ich es "damals" aus Geldgebermangel nicht hinbekommen hab. Dein Video ist sowohl Auffrischung als auch Neues lernen sowie neu lernen - einiges hat die Zeit in meinem Kopf nicht so gut überstanden wie auf den Disketten. Danke für die tollen IT Stunden!
Oh ja, das mit dem im Kopf nicht so gut überstanden kenne ich... Ich hangel mich von Woche zu Woche... 😅
Mir ist gerade ein SMON-Modul in die Hände gefallen, das habe ich gleich mal ausprobiert. Vielen Dank für den tollen Einstieg. 👍 Ich hatte mir deinen Assemblerkurs schonmal angesehen, aber jetzt werde ich ihn nochmal richtig mitmachen. Das ist deutlich besser. 😊
Da wünsche ich Dir auf jeden Fall viel Spaß und Erfolg. 🙂
Hervorragend gut gemacht. Alles sehr gut erklärt.
Ja, wirklich klasse!
Hervorragende Diktion !
Ich habe eine gute zeit mit C64 Basic Programmen
Wirklich toll gemacht.
Klasse gemacht! Besonders gut gefällt mir, dass du deinen eigenen Lernprozess in den Videos zeigst. Ich sitze an meinem eigenen Vice-Emulator bzw. dem C64Maxi und probiere mit. :)
Schön das es Dir gefällt. Ich hab tatsächlich zum Zeitpunkt der Aufnahme gerade mit Assembler begonnen... Leider ist das schon länger her und ich hab viel wieder vergessen. Aber ich kann ja das Video schauen. 😂😅
Weltklasse, Vielen Dank. Wäre schön wenn da echt noch mehr kommt. Kleine Spiele, oder Sprites Bewegungen usw. Abo hast du👍🏻
Genau, das wird (meiner schon immer Meinung nach) das eigentlich schwierige dann für Ottonormalleute - die ganze / eine Spiellogik u. mehr in Assembler hinzubekommen. Deswegen sind manche v.a. "billig gemachte" Spiele und Spieleengines wie dieses Revenge Of The Tomato Ballerspielchen aus der RGCD auch so simpel und "digital" und repetitive.
Aber bis hierhin auch schonmal alles sehr gut gemacht, gut zuzuhören, alles gut erklärt. So lerne ich endlich 'mal die Bedienung und Befehle von Smon besser kennen.
Auch wenn ich das vom im Nordic Power Modul integrierten Maschinensprache Monitor samt meinem org. manual dazu.. schon so ganz ähnlich kenne.
Hallo Michael, vielen Dank für Dein Abo. 😊
Bis ich kleinere Spiele etc. machen kann ist es wahrscheinlich noch ein weiterer Weg. Ich lerne Assembler ja gerade selbst erst. Aber ich bin da schon recht zuversichtlich. 😉
Wahrscheinlich werde ich mit Hybriden aus Basic und Maschinensprache anfangen, also im Basic Code mit SYS Unterprogramme aufrufen, die dann Zeitkritische aufgaben erledigen. Mal sehen... Als nächstes wird wohl bald ein Video mit Memory Monitoring folgen, also den Speicher auslesen, bearbeiten und Programme darin verschieben und kopieren mit SMON. Die Assembler Befehle kommen dann später in dem Kurs der 64er...
Hallo Cannyfocus, ich denke auch das es eine Herausforderung wird die in Logischen Programmiersprachen sonst "recht simplen" Abläufe in Assembler zu implementieren, aber ich glaube... es könnte Spaß machen. 😅🙈
RGCD kannte ich bis eben garnicht... Asche auf mein Haupt, das werd ich mir erstmal ansehen. 😮
@@C64Die 16k Kompetition der RGCD ist's halt 'nur': www.c64-wiki.de/wiki/RGCD. 2016 war aber leider die vorerst letzte echte "competition".
Da sind alle Releases, quasi so noch etwas übersichtlicher als sich selbiges aus der csdb zu ersehen, nach Jahr aufgelistet.
Wirklich sehr gut gemacht, dieses Video! Vielen Dank.
Danke für das Lob! 😉
Danke für die gute Erklärung! Habe den 64er-Kurs vor mir liegen und bin doch manchmal über einige Sachen gestolpert. Ist schon das ein oder andere Mal sehr merkwürdig geschrieben. Aber in Kombi mit deinen Erläuterungen bin ich endlich schlauer geworden (= Dr. Brain) und habe zum ersten Mal verstanden was ich mich schon vor 40 Jahren gefragt habe :-)
Hallo Frank, ich musste mir das auch alles erstmal anlesen. 😅 Diese Kurse aus der 64er sind schon stellenweise etwas anstrengend finde ich. Mit diesen ganzen "Agenten"-Vergleichen und so... ist eben in den 80ern geschrieben und dementsprechende Vergleiche werden angestellt. Das zu der Zeit kaum Fachbegriffe benutzt werden (weil es sie noch nicht gab, oder niemand sie verstanden hätte) macht es nicht leichter die Artikel aus der Zeit zu lesen... 🙂
Super erklärt, danke!
Schön das es Dir gefallen hat. 😊
mnemonics heissen übrigens die Assembler Kurzbefehle wie zb 'LDA'. Klasse Serie! werde die Tage auch wieder meinen C64 'anwerfen'.. erstmal smon testen, aber vermutlich werde ich dann zügig das actioncardridge nutzen :-)
Das Action Replay hab ich auch, aber den Monitor den noch nie getestet... 😅
@@C64 Der kann im Prinzip das Selbe wie der Smon, aber muss natürlich nicht ständig in den Speicher geladen werden und man hat dann in der Badic Eingabeaufforderung grundsätzlich die Disktools auf den YfTasten, das bietet schon Vorteile..
Dankeschön!
Wirklich tolles Video 🔥 🔥 Am Besten, man nimmt sich noch einen Binär-Calculator zur Seite 😁😎👍🏻
Naja, man kann ja alles auch mit SMON umrechnen... 😅
Die App "RealCalc" auf Android, und in den settings "Radix Modes" einschalten. Sehr unkompliziert und praktisch.
PS: und bei "long click shift" auch einen Haken machen - das erspart die Shift-Taste.
@@MiccaPhone Guter Tip, gleich mal installieren... 🧐
Im Windowstaschenrechner klappt die Umrechnung auch gut im "Programmierer" Modus. 😅
Danke!
Awwww, vielen herzlichen Dank für Deinen Support! 🥰
Ich find es totaaal cool, dass hier 8bit Systeme am C64 in Basic und Assembler vorgestellt werden!
Und ich will auch nicht, dass Du damit aufhörst!
Einzig der Channelname impliziert vollkommenes Wissen. Und das sehe ich hier nicht! Eher wildes rumprobieren.
Es ist aber cool, dass Du versuchst, den Küken zu zeigen, wie man Hardware-nahe programmiert, und was der C64 noch leisten kann. (Ohne irgend nen klicki-bunti Frontend von Windows)
Das kannst du dir gleich für den weiteren Kurs merken, dass man die Endadresse meistens auf das Byte danach setzt, weil dies die Abbruchbedingung ist.
Ok, ich habs ja jetzt auf die "harte" Tour gelernt... ^^
Ich vermisse es so, dass man mit dem Cursor zu einer Zeile wandert und dort einen Befehl ausführen kann, der dort schon vorhanden ist und der beim Drücken von Eingabetaste übernommen und ausgeführt werden kann. In DOS am x86-PC kann ich mit dem Cursor auch in jede Zeile springen, doch was dort bereits geschrieben steht wird einfach ignoriert und ist für den Eingabe-Interpreter nicht vorhanden. So muss man neu tippen, oder wie in DOSBOX mit den Coursor-Tasten (die nicht den Cursor bewegen) nach oben scrollen um die vorher eingetippten Befehlszeilen erneut zu bekommen, scrollt auf der Stelle alle Namen durch. Das geht dann auch noch, wenn dort ASCII- Reste stehen und dazwischen unser neuer Befehl. Sieht dann entsprechend unsauber aus.
Es hat aber auch nicht immer Vorteile... Hab mir schon oft ganze Zeilen in Basic dadurch zerschossen... 😅
Aber hast recht: Es ist natürlich die coolste Art ein Eingabeinterface zu designen. 😉
woher kriege ich smon fuer den c64 emulator?
Hallo Gerhard, auf der C64-Wiki Seite über SMON ganz unten ist ein Link zu einer Downloadseite: www.c64-wiki.de/wiki/SMON 🙂
moin und danke für die coolen videos !!
ich habe folgende frage .. ich verwende den ccs64 und habe probleme beim speichern ( 27:43 )
nachdem ich gespeichert habe und den smon verlasse, bekomme ich mit LOAD"$",8 die fehlermeldung ?OUT OF MEMORY EROOR
ich habe den emulator neu gestartet und ein diskimage mit hilfe von Dirmaster erstellt und geladen
woran kann das liegen ?
Hallo Excess 1972, das liegt sicher daran, das Du nach dem Laden von SMON die Pointer nicht mit dem NEW Befehl resettet hast. Wie das alles zusammenhängt kann ich nicht genau sagen, aber nach dem Laden von einem Maschinensprachprogramm mit ,8,1 kommt es zu einem OUT OF MEMORY ERROR, sobald ein BASIC Befehl, in dem Fall LOAD, ausgeführt werden soll. Der Befehl NEW resettet alle Pointer, löscht aber nicht das Maschinenprogramm.
Also einfach nach dem Laden von SMON einmal NEW eingeben und abschicken, danach sollte das Laden kein Problem mehr sein. 🙂
@@C64 perfekt, das war es. danke für die schnelle hilfe !!
Argumente/Parameter werden auch als Operanden bezeichnet. Mit Wertangabe ist es dann ein immediate operand.
In 0400 Bildschirm-Speicher und in D800 Farbspeicher
In Y-Register FF Startwert
Geschrieben wird nach Adresse+Y
dann wird Y verringert und gesprungen solange Y noch nicht Null ist,
sonst Ende der Schleife
und geschrieben wird der "Wert" im Akku-Register, der mit dem Inhalt vom X-Register zwischen den beiden Schreib-Befehlen ausgetauscht und am Schleifen-Anfang neu geladen wird siehe Sprungadresse
Danke für die Aufschlüsselung. :-)
@@C64 Ich habe doch noch nicht alles vergessen. So können Bild- und Farb-Speicher beide gleichzeitig mit Y adressiert werden. Hier wird mit der höchsten Adresse angefangen und dann byte weise verringert. Anders herum würde es auch gehen, den Wert in Y erhöhen.
16 Bit Werte im Speicher sind bei CPUs mit "little endian" erst das low byte und dann das high byte. Ganz im Gegensatz zu big endian, dort ist es genau umgekehrt.
Also ist es Prozessortypabhängig, in welcher Reihenfolge die beiden Bytes im Speicher abgelegt werden?
@@C64 Ja genau. de.m.wikipedia.org/wiki/Byte-Reihenfolge
Bei 32 bit und 64 bit Werten im Speicher mit little endian ist es genauso. Erst low word 16 bit, dann high word 16 bit, oder erst low double word 32 bit, dann high double word 32 bit immer angefangen mit dem low byte vom low word vom low double word.
das überschreiben geht nur mit save "@0:programmname",8 ich denke das wird wohl in smon genau so gehn (habs nicht geteste), gibt auch dokumentation dazu im c64-wiki :)
kannsts jedoch gern mal probiern mit s"@0:test" 7000 7005
Ja, das Überschreiben geht einfach mit "@:name"... Habe es eben nochmal getestet.
Der Fehler saß wohl mal wieder 30 cm vor der Tastatur... 😉
Irgendwo im forum hab ich gelesen dass save"@0:name",8 corrupted ist und manchmal die Daten korrumpiert.
Keine ahnung was da dran ist und obs vllt. Nur ältere c64 (oder 1541) betrifft...(?)
Ich kriege den SMON einfach nicht zum Laufen. Fehlermeldung beim Start des Basic-Loaders "Fehler in Block 7"; bin die Data-Zeilen alle durchgegangen.......
Please help !
Hallo Sven, bekommst Du SMON nicht zum laufen, oder einen Basic Loader? "Fehler in Block 7" klingt nicht nach einer Fehlermeldung die der C64 so schmeißen würde. Versuch am besten mal diese Version von SMON: www.cbmhardware.de/dlmanager/index.php?id=162
Das ist das Image das auch im C64 Wiki verlinkt ist und die ich im Video benutze... 🙂
@@C64 Es ist der Basic-Loader, den ich eingetippt habe. Angeregt durch deine Videos möchte ich mich bißchen mit Assembler beschäftigen.
@@fiddlersgreen11 Aber welcher Basicloader? 🤔
@@C64 Sorry, ich meinte das Programm SMON Teil 1 von N.Mann & D Weineck aus der 64er Ausgabe 11/November 1984
@@C64 Hi ! Läuft jetzt alles super !
Beim Dissamblieren sollte man bestenfalls nicht mitten innerhalb eines Befehls z.B. bei 7001 anfangen, wenn in 7000 kein Ein-Byte-Befehl enthalten ist und dort wie im Beispiel ein zwei Byte langer Befehl steht und der nächste Befehl in 7002 beginnt.
Ich hab's noch nicht getestet, aber wenn man beim Disassemblieren bei einem Parameter anfängt, also im Beispiel $7001, wird dann überhaupt etwas gültiges angezeigt, bzw. ist SMON so schlau dann in der Speicherstelle davor einen gültigen Befehlscode zu suchen? 🤔
@@C64 Das kommt ganz darauf an, ob der Operand des 2 Byte Befehls von 7000 in 7001 einen Wert hat, der ein Opcode ergibt, oder nicht. Ist es ein Opcode wird der dazu gehörende Befehl angezeigt, wenn nicht kommen nur Sternchen, oder bei Debug in DOS Fragezeichen. So kann ein Operand fälschlich als Opcode angezeigt werden, der auch entsprechend ausgeführt werden würde, wenn man dorthin bei der Programmausführung springt, oder dort startet. Bei Intel 80386 können die Befehle bis zu 15 Bytes lang sein. Da kann man schnell mal etwas falsch anzeigen lassen, wenn man wahllos durch den Speicher dissambliert. Der richtige Startpunkt hat somit eine wichtige Bedeutung.
@@C64 Beim x86 macht es Sinn auf Daten- und Code-Ausrichtung(alignment) zu achten. Das bedeutet 16 bit Werte an einer durch 16 teilbaren Adresse stehen zu haben, weil die CPU den Speicher nicht Byteweise läd, sondern in Blöcken. Bei Werten die in zwei verschiedenen Blöcken liegen hat die CPU entsprechend mehr zu laden, auch Bytes die oberhalb und unterhalb unseres 16 bit Wertes stehen und gar nicht benutzt werden, wenn die Adresse nicht durch 16 teilbar ist z.B. bei 000f. Bei 0010 wäre es durch 16 teilbar.
Das selbe gilt für den Code der unterschiedlich viele Bytes je Befehl haben kann. So macht es Sinn eine Ziel-Adresse für einen Sprung-Befehl zu haben die durch 16 teilbar ist, auch wenn dabei eine Lücke im Code entsteht die übersprungen wird.
vereinfachtes Beispiel....
Anfang:
Befehl
Befehl
bedingter jump nach VORNE wie z.B. BNE/BEQ Adresse
bedingungsloser jump zum Anfang
Adresse: 000E leer byte
Adresse: 000f leer byte
VORNE:
Adresse: 0010 nächster Befehl
Damit wird der Code schneller ausgeführt, wenn nicht nach 000e, sondern nach 0010 gesprungen wird. Für Routinen die nicht so zeitkritisch sind hat das jedoch nur wenig Bedeutung, wenn man danach eh nur auf einen Tastendruck wartet.
Das macht zweifellos das Dissamblieren des Codes schwieriger. So muss dann in mehreren Schritten dissambliert werden, damit der richtige Code auch angezeigt wird.
Beim Makro-Assembler MASM gibt es einen org-Befehl womit die aktuelle Adresse($) verändert werden und eine Ausrichtung erzeugt werden kann. So braucht man sich nicht weiter darum zu kümmern welche Adressen es sind, wenn wir nur mit Adress-Marken/Labels arbeiten, egal welche Adresse dabei ensteht.
START:
Befehl
Befehl
bedingter Sprung nach VORNE
bedingungsloser Sprung zum START
org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
VORNE:
Befehl
@@C64 lustig wäre es, zwei unterschiedliche programme im (fast) gleichen speicher zu haben - um 1 byte verschoben. Je nachdem ob ich z.B. sys7000 oder sys7001 mache, wird derselbe inhalt einmal als op code und einmal als daten-parameter interpretiert, und umgekehrt.... Ob man damit was praktisch sinnvolles machen kann weiß ich nicht, aber für didaktische demo-zwecke ließe sich bestimmt etwas kurioses erzeugen... :)
Das hast du doch alles schon mal im ersten Video erklärt.
Hallo Micha, nicht alles. In diesem Video geht es um die Bedienung von SMON, im ersten Video um eine Einführung in Assembler. Das sich da natürlich ein paar Inhalte überschneiden ist klar. Aber ich hätte sie hier auch nicht einfach weglassen dürfen...