{"id":303,"date":"2025-10-03T17:07:19","date_gmt":"2025-10-03T17:07:19","guid":{"rendered":"http:\/\/techblog.auchmonoabspielbar.de\/?p=303"},"modified":"2025-10-03T17:07:19","modified_gmt":"2025-10-03T17:07:19","slug":"4-bit-prozessor-teil-2-assembler-und-simulator","status":"publish","type":"post","link":"http:\/\/techblog.auchmonoabspielbar.de\/?p=303","title":{"rendered":"4-Bit Prozessor, Teil 2 &#8211; Assembler und Simulator"},"content":{"rendered":"\n<p>Wenn man sofort anf\u00e4ngt seine Ideen in Hardware zu realisieren, hat man gro\u00dfe Probleme, wenn sich Teile der Gedanken als nicht realisierbar oder unpraktisch erweisen. Deshalb habe ich als allererstes einen Simulator mit eingebauten Assembler geschrieben.<\/p>\n\n\n\n<p>Mein Assembler ist offensichtlich stark vom Z80 beeinflusst. Das ist die CPU mit der ich als Jugendlicher zuerst in Ber\u00fchrung gekommen bin. Allerdings gibt es ein paar Vorgehensweisen die erheblich von normaler Assemblerprogrammierung abweichen.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ein Label f\u00fcr ein Sprungziel steht immer alleine (abgesehen von Kommentaren) und wird durch ein Doppelpunkt abgeschlossen. Funktionen, die per Call aufgerufen werden, haben ein Label welches durch ein fn (f\u00fcr function) eingeleitet werden. Nur solche Labels k\u00f6nnen von beliebiger Stelle aufgerufen werden. Normale Label werden automatisch &#8222;Funktions-lokal&#8220;. Das hei\u00dft, dass man nicht darauf achten muss, dass alle internen Sprungziele unterschiedliche Namen bekommen. Es ist also erlaubt, dass das Label &#8222;loop:&#8220; in mehreren Funktionen verwendet wird und der Assembler verwendet dann jeweils die lokale Version.<\/li>\n\n\n\n<li>Da Label eindeutig durch einen Doppelpunkt gekennzeichnet werden, k\u00f6nnen OpCodes direkt in der ersten Spalte beginnen. Es ist nicht notwendig mit einem TAB anzufangen &#8211; aber es ist erlaubt.<\/li>\n\n\n\n<li>Alle Werte sind Hexadezimal.<\/li>\n\n\n\n<li>Da es keinen Linker gibt, wird auch unterschiedliche Code- und Datenbereiche verzichtet. Es gibt den Pseudobefehl org zur Festlegung des Startpunkts der nachfolgenden Befehle und eine data Anweisung welche nachfolgende Speicherinhalte kennzeichnet.<\/li>\n\n\n\n<li>Push und Pull Befehle gibt es nicht pro Register, sondern es gibt jeweils einen Befehl und dazu eine Registerliste mit den betroffenen Registern.<\/li>\n<\/ol>\n\n\n\n<p>Der Simulator ist als JavaFX Anwendung realisiert. Er l\u00e4dt direkt die Assemblerdatei und erzeugt daraus den Maschinencode, l\u00f6st alle absoluten und relativen Sprungadressen auf und initialisiert den Speicher und die internen Register.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1305\" height=\"831\" src=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-21-56.png\" alt=\"\" class=\"wp-image-304\" srcset=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-21-56.png 1305w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-21-56-300x191.png 300w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-21-56-768x489.png 768w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-21-56-624x397.png 624w\" sizes=\"auto, (max-width: 1305px) 100vw, 1305px\" \/><\/figure>\n\n\n\n<p>Load: \u00f6ffnet einen Dateiauswahl Dialog welcher auf die Extension .zw4 voreingestellt ist. Es wird jeweils das zuletzt verwendete Verzeichnis voreingestellt. Falls es eine Funktion mit dem Label main: gibt, wird der PC im Simulator so voreingestellt, dass diese direkt ausgef\u00fchrt wird.<\/p>\n\n\n\n<p>Reload: l\u00e4dt die aktuelle Datei neu. Es gibt keinen eingebauten Editor, zum Bearbeiten der Assemblerdatei muss ein externer Editor verwendet werden. Es reicht dann, nach einer \u00c4nderung, ein Speichern im Editor (er muss nicht geschlossen werden) und ein Klick auf Reload aus um den Simulator zu aktualisieren.<\/p>\n\n\n\n<p>Quit: beendet den Simulator.<\/p>\n\n\n\n<p>Step: liest den aktuellen PC und f\u00fchrt den n\u00e4chsten Befehl aus. Der PC kann im User Interface zu beliebigen Zeiten ge\u00e4ndert werden und der neue Wert wird beim n\u00e4chsten Step verwendet. Das ist hilfreich, wenn man im Programm ein paar Schritte zur\u00fcckspringen m\u00f6chte, oder um sich aus einer toten Schleife zu befreien. Auch die \u00fcbrigen Eingabefelder werden beim weiteren Programmablauf verwendet wenn sie manuell ver\u00e4ndert wurden. W\u00e4hrend des Programmablaufs wird das Textfenster mit dem Assemblercode automatisch aktualisiert, so dass der aktuelle Code sichtbar bleibt.<\/p>\n\n\n\n<p>Run und Stop: f\u00fchrt das Programm aus bis es auf einen Breakpoint trifft oder mit Stop angehalten wurde. Einen Breakpoint kann man setzen indem man in der Programmliste auf die Adresse der jeweiligen Zeile klickt. Das Addressfeld wird dann in Folge rot angezeigt. Durch einen weiteren Klick wird der Breakpoint wieder gel\u00f6scht.<\/p>\n\n\n\n<p>Funktions: diese Drop Down Box enth\u00e4lt eine Liste aller definierten Funktionen. Durch Anklicken wird der PC mit der jeweiligen Adresse initialisiert und die Assembleranzeige so gescrollt das diese Stelle sichtbar ist.<\/p>\n\n\n\n<p>Registerliste: hier werden alle internen Registerwerte angezeigt. Die Registerwerte k\u00f6nnen auch manuell ge\u00e4ndert werden und diese Werte werden dann beim n\u00e4chsten Step verwendet. Umgekehrt werden die ge\u00e4nderten Werte nach dem Step angezeigt. Diese Liste wird auch im Run Modus aktualisiert, eine manuelle \u00c4nderung w\u00e4hrend des Programmlaufs ist deshalb praktisch unm\u00f6glich, da die Liste im Millisekunden Rahmen aktualisiert wird.<\/p>\n\n\n\n<p>Speicheranzeige: der Simulator zeigt ein Speicherfenster von 256 Digits an. Die Startadresse kann frei eingestellt werden. Diese Anzeige wird auch w\u00e4hrend des Programmlaufs aktualisiert. Eine manuelle \u00c4nderung ist nicht vorgesehen.<\/p>\n\n\n\n<p>Assembleranzeige: hier wird der Programmcode angezeigt. Die Stelle des aktuellen PCs wird markiert und bei Bedarf das Fenster so gescrollt, dass sie sichtbar ist. Die Anzeige wird auch w\u00e4hrend eines Programmlaufs mit Run aktualisiert. Falls der Assemblercode Fehler enth\u00e4lt, werden diese ebenfalls hier in der jeweiligen Codezeile angezeigt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"668\" height=\"259\" src=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-45-40.png\" alt=\"\" class=\"wp-image-306\" srcset=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-45-40.png 668w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-45-40-300x116.png 300w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-vom-2025-10-03-18-45-40-624x242.png 624w\" sizes=\"auto, (max-width: 668px) 100vw, 668px\" \/><\/figure>\n\n\n\n<p>In einem ersten Schritt wird der Simulator dazu verwendet sich selber zu debuggen. Hierzu habe ich verschiedene kleine Assemblerfunktionen geschrieben, die die einzelnen Befehle aufrufen und pr\u00fcfen, ob das gew\u00fcnschte Ergebnis erzielt wurde. Im Augenblick habe ich ca. ein Viertel der Befehle getestet und dabei mehrere Abweichungen zwischen dem generierten Maschinencode und der simulierten CPU gefunden. An dieser Stelle sind Korrekturen jedoch viel einfacher als wenn sie erst auffallen nachdem die Hardware zusammengel\u00f6tet wurde.<\/p>\n\n\n\n<p>Aktuell umfasst der Simulator ca. 65 kB Programmcode. Es sind aber noch ein paar Erweiterungen geplant, wie z.B. die Unterst\u00fctzung von Makros. Zudem wird der Assemblercode nur rudiment\u00e4r auf Fehler gepr\u00fcft. Hier muss auch noch weiterer Aufwand getrieben werden.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/Bildschirmaufzeichnung-vom-2025-10-03-18-52-51.mp4\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man sofort anf\u00e4ngt seine Ideen in Hardware zu realisieren, hat man gro\u00dfe Probleme, wenn sich Teile der Gedanken als nicht realisierbar oder unpraktisch erweisen. Deshalb habe ich als allererstes einen Simulator mit eingebauten Assembler geschrieben. Mein Assembler ist offensichtlich stark vom Z80 beeinflusst. Das ist die CPU mit der ich als Jugendlicher zuerst in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,2],"tags":[],"class_list":["post-303","post","type-post","status-publish","format-standard","hentry","category-hardware","category-software"],"_links":{"self":[{"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=303"}],"version-history":[{"count":3,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/303\/revisions"}],"predecessor-version":[{"id":309,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/303\/revisions\/309"}],"wp:attachment":[{"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=303"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}