{"id":322,"date":"2025-10-13T16:19:13","date_gmt":"2025-10-13T16:19:13","guid":{"rendered":"http:\/\/techblog.auchmonoabspielbar.de\/?p=322"},"modified":"2025-10-13T16:19:13","modified_gmt":"2025-10-13T16:19:13","slug":"4-bit-prozessor-teil-4-erweiterungen","status":"publish","type":"post","link":"http:\/\/techblog.auchmonoabspielbar.de\/?p=322","title":{"rendered":"4 Bit Prozessor, Teil 4 \u2013 Erweiterungen"},"content":{"rendered":"\n<p>Ich habe einen Simulator in Java geschrieben damit man den Instruktionssatz der 4 Bit CPU einen Praxistest unterziehen kann, ohne dass man Hardware aufbauen und ver\u00e4ndern muss. Und erste Gehversuche haben gleich ein paar Schw\u00e4chen aufgedeckt.<\/p>\n\n\n\n<p>Als ich den Entwurf gestartet habe, hatte ich die Register R1 bis R4 als general purpose Register angesehen und darum den Befehlssatz gebaut. Allerdings h\u00e4tte eine 2-Adress-Maschine zu viele Bits f\u00fcr die Quell- und Zielregister verbraucht. Deshalb habe ich einen Akkumulator eingef\u00fchrt, welcher bei Operationen mit zwei Operanden  implizit den ersten Operanden enth\u00e4lt und somit zwei Bit spart. Dabei habe ich aber nicht ausreichend darauf geachtet, dass der Akku nun auch ein general purpose Register sein sollte, so fehlte z.B. ein Indexregister indirect load. Wenn der Akku aus der Indexregister Adresse geladen werden sollte, wurde ein tempor\u00e4res Register ben\u00f6tigt und die beiden Befehle ld R1 [IX1] und ld A R1. Das ist jetzt nach der Erweiterung nicht mehr notwendig, man kann direkt ld A [IX1] ausf\u00fchren.<\/p>\n\n\n\n<p>Weiterhin waren die Indexregister f\u00fcr streaming Aufgaben gedacht &#8211; man kann sie hoch- oder runterz\u00e4hlen. Wenn man sie aber f\u00fcr einen Zugriff innerhalb einer Struktur verwenden will, dann muss man auf eine Basisadresse einen Offset aufaddieren. Das war nur mit Umwegen \u00fcber den Speicher m\u00f6glich. Nach der Erweiterung k\u00f6nnen die drei Digits des Indexregisters einzeln in den Akku \u00fcbernommen werden und nach der Berechnung wieder eingef\u00fcgt werden.<\/p>\n\n\n\n<p>Noch eine &#8211; hoffentlich nicht fehlgeleitete &#8211; Optimierung hat sich aus den ersten Programmierversuchen ergeben. Das Carry\/ Borrow Flag wurde von allen ALU Funktionen aktualisiert, auch von einem einfachen Increment oder Decrement. Das ist aber bei Berechnungen, die in einer Schleife laufen, unpraktisch.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"474\" height=\"405\" src=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/image.png\" alt=\"\" class=\"wp-image-323\" srcset=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/image.png 474w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/image-300x256.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\"><\/div><\/div>\n\n\n\n<p>F\u00fcr eine 32 Bit Addition wird in einer Schleife mit acht Runden jeweils das n\u00e4chste Digit aufaddiert und dabei der \u00dcberlauf &#8211; das Carry Flag &#8211; in der n\u00e4chsten Runde mit einbezogen. Allerdings finden nach der Addition noch inc und dec Aktionen statt zur Kontrolle der Schleife und zum Weiterz\u00e4hlen der Wertezeiger. Diese hatten in der urspr\u00fcnglichen Version das Carry Flag ver\u00e4ndert, es h\u00e4tte also irgendwo geeignet zwischengespeichert und wieder abgefragt werden m\u00fcssen. Dadurch, dass inc\/ dec das Carry Flag nicht mehr ver\u00e4ndern, spart man diesen Aufwand. Ich hoffe nicht, dass mir diese Entscheidung sp\u00e4ter auf die F\u00fc\u00dfe f\u00e4llt, aktuell sehe ich aber keine Probleme.<\/p>\n\n\n\n<p>Im User Interface gibt es auch ein paar Erweiterungen. Zeilen mit einer besonderen Bedeutung werden nun farblich hervorgehoben.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"642\" height=\"553\" src=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/image-1.png\" alt=\"\" class=\"wp-image-324\" srcset=\"http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/image-1.png 642w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/image-1-300x258.png 300w, http:\/\/techblog.auchmonoabspielbar.de\/wp-content\/uploads\/2025\/10\/image-1-624x537.png 624w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><\/figure>\n\n\n\n<p>Sprungziele werden T\u00fcrkis markiert, lokale Spr\u00fcnge Orange und Subroutine Aufrufe Gr\u00fcn. Fehlerhafte Zeilen werden Rot eingef\u00e4rbt. Somit kann man im Assembler-Code schneller bestimmte Stellen auffinden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe einen Simulator in Java geschrieben damit man den Instruktionssatz der 4 Bit CPU einen Praxistest unterziehen kann, ohne dass man Hardware aufbauen und ver\u00e4ndern muss. Und erste Gehversuche haben gleich ein paar Schw\u00e4chen aufgedeckt. Als ich den Entwurf gestartet habe, hatte ich die Register R1 bis R4 als general purpose Register angesehen und [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-322","post","type-post","status-publish","format-standard","hentry","category-software"],"_links":{"self":[{"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/322","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=322"}],"version-history":[{"count":1,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/322\/revisions"}],"predecessor-version":[{"id":325,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/322\/revisions\/325"}],"wp:attachment":[{"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=322"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}