{"id":297,"date":"2025-10-03T16:04:15","date_gmt":"2025-10-03T16:04:15","guid":{"rendered":"http:\/\/techblog.auchmonoabspielbar.de\/?p=297"},"modified":"2025-10-03T18:28:04","modified_gmt":"2025-10-03T18:28:04","slug":"4-bit-prozessor-teil-1-projektbeschreibung","status":"publish","type":"post","link":"http:\/\/techblog.auchmonoabspielbar.de\/?p=297","title":{"rendered":"4-Bit Prozessor, Teil 1 &#8211; Projektbeschreibung"},"content":{"rendered":"\n<p>Wie viele aus meiner Generation habe ich oft dar\u00fcber nachgedacht einen eigenen Prozessor zu implementieren. Das hat keinen praktischen Nutzen, es geht lediglich darum eine Vielzahl von Techniken zu erlernen. Man muss sich einen sinnvollen Befehlssatz \u00fcberlegen, die notwendigen Entwicklungswerkzeuge implementieren, eine Prozessorarchitektur entwerfen und letztendlich das Teil auch tats\u00e4chlich realisieren. Die ersten Schritte sind f\u00fcr mich als Softwareentwickler relativ einfach. Der letzte Teil ist f\u00fcr mich die gr\u00f6\u00dfte Herausforderung. Ich kann im Augenblick noch nicht absehen, wie weit ich tats\u00e4chlich komme und das Projekt wird sicherlich eine Weile dauern.<\/p>\n\n\n\n<p>Ich habe mich f\u00fcr einen 4-Bit Prozessor entschieden damit die Hardware m\u00f6glichst \u00fcberschaubar bleibt. Da er am Ende ohnehin keinen sinnvollen Nutzen hat, ist es auch egal wie leistungsf\u00e4hig er ist. Hauptsache ist, dass er l\u00e4uft.<\/p>\n\n\n\n<p>Der Befehlssatz ist an eine RISC Architektur angelehnt. Das hei\u00dft, es gibt logische und arithmetische Funktionen nur auf den Registern, keine direkte Speichermanipulation. Es ist aber kein echter RISC Befehlssatz, da ich variable lange Befehlssequenzen habe. Um die Codew\u00f6rter m\u00f6glichst kurz zu halten, habe ich zwei Beschr\u00e4nkungen gew\u00e4hlt. Zum einen gibt es nur vier Register (zwei Bit f\u00fcr die Registercodierung) und zum anderen wird mit einem Akkumulator gearbeitet, der bei Zwei-Operanden Befehlen implizit verwendet wird. Die meisten (alle?) Ein-Operanden Befehle k\u00f6nnen aber auch auf den Registern ausgef\u00fchrt werden.<\/p>\n\n\n\n<p>Im \u00dcberblick eine bullet point Liste mit den geplanten Eigenschaften:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>4 Bit Operationen (im Wesentlichen)<\/li>\n\n\n\n<li>Von Neumann Architektur<\/li>\n\n\n\n<li>4 Register plus Akkumulator<\/li>\n\n\n\n<li>2 Indexregister<\/li>\n\n\n\n<li>1 Stackpointer<\/li>\n\n\n\n<li>12 Bit Adressen f\u00fcr PC, SP, Indexregister<\/li>\n\n\n\n<li>1 8 Bit Zero Page Register, analog zum Direct Page Register im 6809, 4 Bit Offset bei Verwendung<\/li>\n\n\n\n<li>Befehlsl\u00e4nge 2 bis 5 Digits, jeweils 4 Bit<\/li>\n\n\n\n<li>&#8230;<\/li>\n<\/ul>\n\n\n\n<p>Die Anzahl der Adressierungsarten ist aus Gr\u00fcnden der einfachen Hardware beschr\u00e4nkt.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Immediate &#8211; nur f\u00fcr Ladevorg\u00e4nge<\/li>\n\n\n\n<li>Absolute &#8211; Laden, Speichern und Spr\u00fcnge (Jump und Call)<\/li>\n\n\n\n<li>PC Relative &#8211; nur f\u00fcr Branch, mit Condition Code, 8 Bit signed offset<\/li>\n\n\n\n<li>ZP Relative &#8211; Laden und Speichern, 4 Bit lower digit (ZP liefert die oberen 8 Bit)<\/li>\n\n\n\n<li>Indexregister &#8211; nur Laden und Speichern<\/li>\n\n\n\n<li>Register &#8211; Register Transfer<\/li>\n<\/ul>\n\n\n\n<p>In einem ersten Schritt wird ein Assembler f\u00fcr den geplanten Befehlssatz und ein Simulator zur Ausf\u00fchrung entwickelt. Die Ausf\u00fchrung im Simulator hat den Vorteil, dass man viel schneller pr\u00fcfen kann, ob der Befehlssatz sinnvoll eingesetzt werden kann. Zudem sind Testdurchl\u00e4ufe viel schneller auszuf\u00fchren und ein debugging des Verhaltens wesentlich einfacher.<\/p>\n\n\n\n<p>Der Befehlssatz sieht vorl\u00e4ufig so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n00rr 0000 o1        ld R1..4 zero page 4 bit offset\n00ix 0001 o1        ld IX1 IX2 A ZP 4 bit offset\n00rr 0010           ld A from R1..4\n0000 0011 v1 v2     ld ZP imme 8 bit value\n0001 0011 v1        ld A imme 4 bit\n0010 0011           ld ZP low digit from accu\n0011 0011           ld ZP high digit from accu\n00rr 0100 v1 v2 v3  ld R1..4 from abs address\n00ix 0101 v1 v2 v3  ld IX1 IX2 A SP from abs address\n00rr 0110 v1        ld R1..4 imme 4 bit value\n00ix 0111 v1 v2 v3  ld IX1 IX2 SP ZP 12 \/ 8 bit imme value\n00rr 1000           ld R1..4 from &#91;IX1]\n00rr 1001           ld R1..4 from &#91;Ix2]\n00rr 1010\n00rr 1011\n\n01rr 0000 o1        st R1..4 zero page 4 bit offset\n01ix 0001 o1        st SP IX1 IX2 zero page 4 bit offset\n01rr 0010           st A to R1..4\n01?? 0011\n01rr 0100 v1 v2 v3  st R1..4 to abs address\n01ix 0101 v1 v2 v3  st IX1 IX2 A SP to abs address\n01?? 0010\n01?? 0011\n01rr 1000           st R1..4 to &#91;IX1]\n01rr 1001           st R1..4 to &#91;Ix2]\n01rr 1010\n01rr 1011\n\n1000 d1 d2 d3       jmp 12 bit address\n1001 d1 d2 d3       call 12 bit address\n1010 cc d1 d2       bra 8 bit signed offset\n1011 ????\n\n11rr 0000           add\n11rr 0001           sub\n11rr 0010           addc\n11rr 0011           subb\n11rr 0100           and\n11rr 0101           or\n11rr 0110           xor\n11rr 0111           inc R1..4\n11rr 1000           dec R1..4\n11ix 1001           inc IX1 IX2 A ZP\n11ix 1010           dec IX1 IX2 A ZP\n1100 1011           not A\n1101 1011           neg A\n1110 1011           stc set carry\n1111 1011           clc clear carry\n11rr 1100           cmp\n11?? 1101\n1100 1110 m1 m2     push m1 mask R1..4, m2 mask IX1 IX2 A ZP\n1101 1110 m1 m2     pull\n1100 1111           clr A\n1101 1111           \n1110 1111           ret\n1111 1111           nop\n<\/code><\/pre>\n\n\n\n<p>Im Augenblick sind ca. 200 von den 256 m\u00f6glichen Codew\u00f6rtern belegt. Aber es werden vermutlich noch ein paar Befehle hinzu kommen. Da geplant ist, die Ausf\u00fchrung \u00fcber einen Microcode Sequenzer zu steuern, ist es aus technischen Gr\u00fcnden nicht besonders wichtig, dass der Code m\u00f6glichst symmetrisch ist &#8211; das ist eher eine Frage der \u00c4sthetik. Die Befehle werden alle durch die beiden ersten Digits bestimmt, die nachfolgenden 0 bis 3 Digits sind dann nur noch Parameter, wie z.B. Adressen oder Offset Werte. Das Microcode ROM wird einfach 256 Einsprungpunkte erhalten. Die beiden letzten Aktionen einer Sequenz bestehen darin, die beiden Codeteile f\u00fcr den n\u00e4chsten Befehl in das Code Register zu laden.<\/p>\n\n\n\n<p>Nach einem Reset wird das Code Register mit dem jmp Befehl (1000 1101) und der Program Counter mit ffe initialisiert. Der Microcode dazu l\u00e4dt dadurch den Startpunkt f\u00fcr das Programm aus der Adresse ffd aus (die letzten drei Digits) und springt an diese Adresse.<\/p>\n\n\n\n<p>Vermutlich wird es im Laufe des Projekts hier noch die eine oder andere \u00c4nderung geben. Es ist halt ein Lern- und Forschungsprojekt welches nicht vorab vollst\u00e4ndig geplant werden kann.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie viele aus meiner Generation habe ich oft dar\u00fcber nachgedacht einen eigenen Prozessor zu implementieren. Das hat keinen praktischen Nutzen, es geht lediglich darum eine Vielzahl von Techniken zu erlernen. Man muss sich einen sinnvollen Befehlssatz \u00fcberlegen, die notwendigen Entwicklungswerkzeuge implementieren, eine Prozessorarchitektur entwerfen und letztendlich das Teil auch tats\u00e4chlich realisieren. Die ersten Schritte sind [&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-297","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\/297","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=297"}],"version-history":[{"count":6,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/297\/revisions"}],"predecessor-version":[{"id":310,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=\/wp\/v2\/posts\/297\/revisions\/310"}],"wp:attachment":[{"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=297"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/techblog.auchmonoabspielbar.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}